物理のバス停 by salt22g

とある物理学見習いの備忘録。

VS Code + Docker + GPUサーバーによる開発環境の設定 (Tiny ImageNetを題材に)

目的

学生ゼミの課題を題材にVS Codeを用いたサーバーへのログインDockerでの作業手順のチュートリアルを作成する。

Tiny imagenetについてはスタンフォード大の以下のページを参照してください。
cs231n.stanford.edu

Tiny ImageNet https://medium.com/@lokeshpara17/tiny-imagenet-using-pytorch-42a3f2ee3c9d

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


hub.docker.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やコードをいくつか置いてみました。

github.com

$ 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については以下のように記載します。

  • --gpus all: 全てのGPUを使用
  • --gpus '"device=0"': 特定の番号の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を使って管理することができます。
以下のような記事が参考になります。

weseek.co.jp
buzz-server.com

Visual studio codeのインストール

code.visualstudio.com
上記のリンクからダウンロード・解凍することでアプリケーションとして使用できます。
(ここからの説明はMacの場合の例です。)

VS Codeを起動したら画面左の四つの四角が並んだボタンをクリックして検索欄に"ssh"と入力
拡張機能のRemote SSHをインストールします。

拡張機能のRemote SSHをインストール

ターミナルからsshでサーバーに接続できている前提なので".ssh/config内の設定については省略します。
左下の青い><のボタンを押すと"Connect to Host"という表記が出てくるのでこちらをクリック。

左下の青い> <マークを押した時の画面

ターミナル側での設定が完了していれば、接続したいサーバーが候補として表示されると思います。

Connect to Hostで表示される接続先候補
接続先での拡張機能インストール

ターミナルでの設定がうまくいっていればここまでの手順でVS Codeでサーバーに接続できます。
続いて作業のために先ほど作ったdockerコンテナに接続しましょう。

拡張機能の検索欄に"docker"と入力します。一番上に出てくる拡張機能をインストールします。

接続先サーバーでの拡張機能インストール

ここで自分のマシンとサーバーのどちらに拡張機能を入れたか混乱することもありますが検索欄に何も書いていない状態であれば現在どの拡張機能がインストールされているか確認できます。

インストールされた拡張機能の確認

Dockerの拡張機能をクリックすると先ほど作成したDockerコンテナを見つけることができるはずです。
右クリックすると"Attach Visual Studio Code"という表示が見つかるのでこれをクリックします。
すると新しいWindowが立ち上がります。(再度パスワードなどを求められることもあるかもしれません。)

拡張機能Dockerでコンテナに接続

Macであれば⌘ + Oで開く作業ディレクトリを指定できます。
上部のメニューバーのFile/Open folder...でも同じく作業ディレクトリを探して開くことができます。

ディレクトリを開く際、別windowが立ち上がり再度パスワードを求められる場合がありますが、最近使った項目に保存されれば次回以降は一回で接続できると思います。
この画面までこればコードの編集・実行検索をVS CodeGUIベースで行うことができます。

VS Codeの編集画面

(ファイル名が黄色くなってるのは目をつむってください...)

"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を押すと以下のような画面(コマンドパレット)が出てきます。

コマンドパレットからtensorboardを実行

ここでは一番上に出てきている"Python: Launch TensorBoard"をクリックすると学習のパラメータや結果を保存しているディレクトリを指定することができます。

logディレクトリーの指定画面

このリポジトリで作成したコードでは"logs/fit"がlogを保存するディレクトリになっているので、Select another folderをクリックした後、該当のパスを指定します。

Tensorboardでは学習の様子やモデルの構造を可視化・比較することができます。

LossやAccuracyを監視・比較
モデル構造の可視化

まとめ

長くなりましたが、Dockerコンテナの構築、サーバーへの接続、コーディング、学習の監視までの手順を記載してみました。
経験上、ネットの記事通りにやってもうまくいかないことがよくあります。
その度に複数のサイトを調べたり、ドキュメントやコードを読んだり、先輩やChat GPTに聞くことで自分の理解が深まると思います。
使えるGPUサーバーがある人はこれを機にGoogle colabから脱却してみましょう。

改めて、間違いの指摘などお待ちしております。