VS Code + Docker + GPUサーバーによる開発環境の設定 (Tiny ImageNetを題材に)
目的
学生ゼミの課題を題材にVS Codeを用いたサーバーへのログインDockerでの作業手順のチュートリアルを作成する。
Tiny imagenetについてはスタンフォード大の以下のページを参照してください。
cs231n.stanford.edu
Tiny ImageNet using PyTorch. I joined in FreeCodeCamp course where… | by Lokesh Para | Medium
セットアップ、実行の手順を示します。
間違いや非推奨なものがあればコメント等でぜひご指摘・指導ください。
以下の記載ルール&注意事項
- $で始まるのはターミナル(シェル)に打ち込むコマンド。コピぺするときは$の後ろからコピーしてください。
- 今回実行した環境のCUDAは諸事情でバージョンが古いためdocker imageやコードのバージョンも古くなっています。
- ご指摘があった場合、記載内容・推奨方法を変更することがあります。
GPUマシンに接続
$ ssh hogehoge $ cd # <作業するdirectoryに移動>
CUDA Versionの確認
$ nvidia-smi +-----------------------------------------------------------------------------+ | NVIDIA-SMI 440.33.01 Driver Version: 440.33.01 CUDA Version: 10.2 | |-------------------------------+----------------------+----------------------+ | GPU Name Persistence-M| Bus-Id Disp.A | Volatile Uncorr. ECC | | Fan Temp Perf Pwr:Usage/Cap| Memory-Usage | GPU-Util Compute M. | |===============================+======================+======================| | 0 ************... On | 00000000:18:00.0 Off | N/A | | 27% 24C P8 13W / 250W | 0MiB / 11019MiB | 0% Default | +-------------------------------+----------------------+----------------------+
docker imageをpull(ダウンロード)
このマシンでは"CUDA Version: 10.2"とあるので対応するdocker imageを以下のサイトから探す。
tecsingularity.com
$ docker pull tensorflow/tensorflow:2.1.0-gpu-py3
以下のコマンドを実行してpullしたimageが表示されればok
$ docker images REPOSITORY TAG IMAGE ID CREATED SIZE tensorflow/tensorflow 2.1.0-gpu-py3 e2a4af785bdb 3 years ago 4.11GB
docker containerの生成
dockerfileを作成する。以下のリポジトリにDockerfileやコードをいくつか置いてみました。
$ git clone https://github.com/ayumisalt/tiny_imagenet_tutorial.git
$ cd tiny_imagenet/docker
4つのファイルがこのディレクトリに存在しています。
- Dockerfile : build時に実行するコマンドがまとまっている。
- requirements_apt.txt: apt-getで取得するコマンドを入れたリスト
- requirements_pip.txt: pip install で取得するパッケージのリスト
- zshrc: おすすめのzshrcの設定
zshrcはこちらのサイトから拝借
少し凝った zshrc · GitHub
Dockerfileの中身をlessコマンドなどで眺めてみるとrequirements_*.txtやzshrcが読み込まれている部分を確認できると思います。
必要があればrequirements_*.txtに自分が作業に使いたいパッケージを入れてください。
docker buildコマンドでimageを生成
docker build . -t <作成するimageの名前>
docker runコマンドでコンテナを作成
$ docker run --name <コンテナの名前> --gpus all -it --ulimit memlock=-1 --ulimit stack=67108864 -v <作業dirがあるdisk (例:data00)> --workdir=<作業dirのpath> --ipc=host <先ほど作成したimageの名前> /usr/bin/zsh
上記コマンドにて、コンテナ内で使用するGPUについては以下のように記載します。
gpuが使用できることを確認する。
コンテナ内でpythonをインタープリターモードで起動し、次のコマンドを実行。
>>> from tensorflow.python.client import device_lib >>> device_lib.list_local_devices()
以下のような出力が得られればok
$ python Python 3.6.9 (default, Nov 7 2019, 10:44:02) [GCC 8.3.0] on linux Type "help", "copyright", "credits" or "license" for more information. >>> from tensorflow.python.client import device_lib 2023-07-28 07:55:32.779747: I tensorflow/stream_executor/platform/default/dso_loader.cc:44] Successfully opened dynamic library libnvinfer.so.6 2023-07-28 07:55:32.781640: I tensorflow/stream_executor/platform/default/dso_loader.cc:44] Successfully opened dynamic library libnvinfer_plugin.so.6 >>> device_lib.list_local_devices() physical_device_desc: "device: XLA_GPU device" , name: "/device:GPU:0" device_type: "GPU" memory_limit: 10732738970 locality { bus_id: 1 links { } }
VS CodeからGPUマシン->コンテナに接続
サーバーへの接続、dockerコンテナの起動、コーディング、学習の管理などについてVScodeを使って管理することができます。
以下のような記事が参考になります。
Visual studio codeのインストール
code.visualstudio.com
上記のリンクからダウンロード・解凍することでアプリケーションとして使用できます。
(ここからの説明はMacの場合の例です。)
VS Codeを起動したら画面左の四つの四角が並んだボタンをクリックして検索欄に"ssh"と入力
拡張機能のRemote SSHをインストールします。
ターミナルからsshでサーバーに接続できている前提なので".ssh/config内の設定については省略します。
左下の青い><のボタンを押すと"Connect to Host"という表記が出てくるのでこちらをクリック。
ターミナル側での設定が完了していれば、接続したいサーバーが候補として表示されると思います。
接続先での拡張機能インストール
ターミナルでの設定がうまくいっていればここまでの手順でVS Codeでサーバーに接続できます。
続いて作業のために先ほど作ったdockerコンテナに接続しましょう。
拡張機能の検索欄に"docker"と入力します。一番上に出てくる拡張機能をインストールします。
ここで自分のマシンとサーバーのどちらに拡張機能を入れたか混乱することもありますが検索欄に何も書いていない状態であれば現在どの拡張機能がインストールされているか確認できます。
Dockerの拡張機能をクリックすると先ほど作成したDockerコンテナを見つけることができるはずです。
右クリックすると"Attach Visual Studio Code"という表示が見つかるのでこれをクリックします。
すると新しいWindowが立ち上がります。(再度パスワードなどを求められることもあるかもしれません。)
Macであれば⌘ + Oで開く作業ディレクトリを指定できます。
上部のメニューバーのFile/Open folder...でも同じく作業ディレクトリを探して開くことができます。
ディレクトリを開く際、別windowが立ち上がり再度パスワードを求められる場合がありますが、最近使った項目に保存されれば次回以降は一回で接続できると思います。
この画面までこればコードの編集・実行検索をVS CodeのGUIベースで行うことができます。
(ファイル名が黄色くなってるのは目をつむってください...)
"python"や"Pylance"の拡張機能によってコーディング時のコマンド補完も可能です。
いろいろ拡張機能があるらしい...
yurupro.cloud
実行
git clone したディレクトリのsrc以下にchat gptに書いてもらったコードがあります。
序文で述べた通り、少し古いtensorflow 1系での実装になっているところがあるのでご了承ください。
実行の際はメニューバーのTerminalを押すとzsh(もしくはbash)が立ち上がります。
例えばbase_model.pyを一枚目のGPUで実行する場合は
CUDA_VISIBLE_DEVICES=0 python base_model.py
で実行できます。
学習の監視
学習の監視、管理ツールにはいろいろと種類がありますが、可視化についてだけならtensorboardが簡単です。
www.tensorflow.org
VS Code上で⌘ + Shift + Pを押すと以下のような画面(コマンドパレット)が出てきます。
ここでは一番上に出てきている"Python: Launch TensorBoard"をクリックすると学習のパラメータや結果を保存しているディレクトリを指定することができます。
このリポジトリで作成したコードでは"logs/fit"がlogを保存するディレクトリになっているので、Select another folderをクリックした後、該当のパスを指定します。
Tensorboardでは学習の様子やモデルの構造を可視化・比較することができます。