Linux上でDockerを使用して機械学習の環境構築を行ったので、備忘録を兼ねて書きました。
とりあえずLinuxで機械学習したいけど上手く動かなくて困っているという方におすすめの記事です!
Dockerとは
Dockerは、アプリケーションを開発、配布、実行するためのプラットフォームです。細かい説明は省きますが、Dockerを使用することで、アプリケーションを簡単に他の環境に移したり、一貫性のある環境で開発やテストを行うことが可能になります。
この記事ではDockerというサービスを利用して、Linux上に自分でカスタムした仮想環境のLinuxを置く、すなわち環境構築を行う方法が説明されています。
LinuxにDockerをインストールする方法
以下の公式サイトの「リポジトリを利用したインストール」通りに入れればokです
更に、Dockerのコマンドをsudo権限なしで使えるようにするために以下のコマンドを実行します。
sudo usermod -aG docker <your-username>
このコマンドの実行によって、your-usernameというユーザーをdockerグループに追加し、そのユーザーがsudoを使わずにDockerの機能を使えるようになります。
また、自分のyour-usernameが分からない場合はwhoami
コマンドをシェルに入力すれば確認できます。
機械学習の環境構築をする時にチェックすべき所
Dockerの話に詳しく入る前の知識として、機械学習の環境構築をする時にチェックすべき所があります。
それは自分が入れるべきCUDAとPytorchのバージョンをしっかりと特定することです。
ここの互換性がなければ機械学習モデルは上手く動きませんし、逆にここさえ上手く合っていれば修正は簡単です。
もう少し詳しくお話しすると、GPUとCUDAの互換性とCUDAとPytorchの互換性の2つがクリアしていればOKです。バージョンの探し方については以下の記事で詳しく書きましたので参考にして下さい。
機械学習の環境構築ガイド!CUDAとPyTorchのバージョンが合わないエラーからの脱出
実例を通したDockerでの環境構築
さて前節まででDockerのインストールが完了し、自分が入れたいCUDAとPytorchのバージョンが特定できたはずです。
ここからは実際にDocker上で環境構築を行なっていきます。まず、以下のDocker Hubのサイトから自分がインストールしたいLinuxを探します。
このページには様々なバージョンのCUDAとPytorchが搭載されたLinuxファイルが配布されています。
今回はCUDA=11.1, pytorh==1.8.0のバージョンをダウンロードしたいとして話を進めます。
先ほどのサイトからCUDA=11.1, pytorh==1.8.0に合うtagを発見し、そのフォルダを自分のローカルフォルダにダウンロードします。
これを行うためには、上の写真の右側にあるdocker pull pytorch/pytorch:1.8.0-cuda11.1-cudnn8-runtime
をshellに入力してあげれば大丈夫です。
これによってローカルにダウンロードが完了しました。ここでダウンロードされたものはDockerイメージと呼ばれるものなのですが、ここから更にDockerコンテナを作成します。
用語の解説として、Dockerイメージは家の設計図、Dockerコンテナは実際に建てられた家みたいなものです。
実際のプログラムを実行する環境はDockerコンテナで、それを作るための設計書がDockerイメージです。Dockerイメージからは複数のDockerコンテナを作ったり、逆に作ったDockerコンテナを少し改造してDockerイメージとして保存することもできます。
話を戻して、次のステップとしてDockerイメージからDockerコンテナを作成します。
基本的には次のコマンドで作成できます。
docker run -it <イメージ名:タグ名> bash
コンテナ名は自分で自由に付けられる名前です。
しかし実際にDockerコンテナを作成する場合は以下のようなコマンドになります。
docker run --gpus all --shm-size <size> -it --name <コンテナ名> --mount type=bind,source=<place-of-model>.,target=/workspace pytorch/pytorch:1.8.0-cuda11.1-cudnn8-runtime bash
これを実行することで、contena_youという名前のDockerコンテナが完成します。
それぞれの意味を以下に解説します。
--gpus all
: このオプションは、Dockerがホストマシンの全てのGPUにアクセスできるようにします。これは、コンテナ内でGPUを利用するために必要です。
--shm-size <size>
: コンテナの共有メモリ(SHM)のサイズをsizeに設定します。例えば--shm-size 20g
ならば20GBが共有メモリとなります。共有メモリは、プロセス間通信(IPC)に使われるメモリのことで、データサイエンスや機械学習のタスクで大きなデータセットを扱う場合に重要になることがよくあります。
--name <コンテナ名>
: このオプションでコンテナに名前を割り当てます。<コンテナ名>には、コンテナを識別するための任意の名前を入れます。
--mount type=bind,source=<place-of-model>,target=/workspace
: これは、ホストマシンの特定のディレクトリ(今回はplace-of-modelに指定)をコンテナ内の/workspaceディレクトリにマウント(バインド)します。この方法で、ホストマシン上のファイルやディレクトリをコンテナ内で直接使うことができます。
以上で、環境構築は完成しました。後はこのDockerコンテナ内で通常通りpythonファイルなどを実行することで機械学習モデルを動かすことができます。