学科のGPU環境を使う流れ(PyTorch編)
1. 基本的な流れ
CUDAバージョンに適したPython、PyTorchをインストールする必要がある。
またインストールできて、importできたとしてもGPUを利用しているとは限らない。少し時間のかかる適当なコード例を実行し、実行中にGPUが利用されていることを確認しよう。
さらに、torchがGPU使えるとしても「コードの実装が不十分でGPUを使用していない」こともある。
2. 詳細手順。
(step 1) 学科サーバにログイン。
ログインの仕方分からない人は使ってる友人、教職員かシス管に尋ねよう。
(step 2) CUDAのバージョンを確認。
code:shell
nvidia-smi
2024年7月4日時点では以下の通り。
NVIDIA-SMI 470.239.06 Driver Version: 470.239.06 CUDA Version: 11.4
この結果を踏まえ、CUDA 11.4 に合わせて環境構築してくことにする。
(step 3) CUDAバージョンに適したPyTorchのバージョン確認。
なお本来ならPythonのバージョンも確認しておくべき(PyTorchのバージョンに合わせてPythonをインストールするべき)だが、今回は問題なかったのでスキップしている。
(step 4) ベースとなるSIFファイルを作成。
SIFファイルは様々な方法で作成可能。
code:shell
singularity pull docker://huggingface/transformers-pytorch-gpu
(step 5) SIFファイルの環境確認。
SIFファイルに対して shell モードで起動することができる。またGPUを利用するためには --nv オプションも付ける必要がある。
singularity shell --nv {SIFファイル名}
2024年7月4日時点で試した際には、ベースとなるSIFファイルの環境は以下の通りだった。cu121 と表示されていることから cuda 12.1 に対応した PyTorch 2.3.1 がインストールされている。これは現在の環境(CUDA 11.4)と合致しておらず、 torch.cuda.is_available() の結果も False となり、GPUを認識できていないことが分かる。
code:shell
amane:tnal% singularity shell --nv transformers-pytorch-gpu_latest.sif
Apptainer> python3
Python 3.8.10 (default, Nov 22 2023, 10:22:35)
Type "help", "copyright", "credits" or "license" for more information.
>> import torch
>> torch.__version__
'2.3.1+cu121'
>> torch.cuda.is_available()
/usr/local/lib/python3.8/dist-packages/torch/cuda/__init__.py:118: UserWarning: CUDA initialization: The NVIDIA driver on your system is too old (found version 11040). Please update your GPU driver by downloading and installing a new version from the URL: http://www.nvidia.com/Download/index.aspx Alternatively, go to: https://pytorch.org to install a PyTorch version that has been compiled with your version of the CUDA driver. (Triggered internally at ../c10/cuda/CUDAFunctions.cpp:108.) return torch._C._cuda_getDeviceCount() > 0
False
(step 6) SIFファイルの環境構築し直し。
どうやらhuggingfaceが提供するイメージをそのまま利用することはできないようだ。現環境の CUDA 11.4 に合わせて環境を構築し直そう。具体的には step 2の時点でピックアップした Pytorch==2.0.1 をインストールすることにする。
code:cuda11.4-pytorch2.0.1.def
BootStrap: localimage
From: transformers-pytorch-gpu_latest.sif
%post
pip3 uninstall --yes torch torchaudio torchvision
pip3 install torch==2.0.1 torchaudio torchvision
上記は、「既に用意したSIFファイル(BootStrap行とFrom行で指定)をベースに、pip3コマンドで古いtorch関連モジュールを削除する。その後(post行以降)で指定したtorchに合うようにモジュールをインストールする」という設定を書いてある。このdefファイルを使ってSIFファイルを構築し直そう。
code:shell
singularity build --fakeroot huggingface.sif cuda11.4-pytorch2.0.1.def
正常に終了すると「huggingface.sif」が作成されるはずだ。
(step 7) SIFファイルの環境確認(2回目)。
step 5 の通り環境確認すると以下の通りだった。cu117とあるため CUDA 11.7版のPyTorchがインストールされているらしい。これは現環境 CUDA 11.4 と合致していないが、大きな違いはなかったらしく、最後は True と出力されておりGPUを認識できているように見える。
code:shell
amane:tnal% singularity shell --nv huggingface.sif
INFO: underlay of /usr/bin/nvidia-smi required more than 50 (464) bind mounts
WARNING: group: unknown groupid 1000
bash: warning: setlocale: LC_ALL: cannot change locale (ja_JP.UTF-8)
Apptainer> python3
Python 3.8.10 (default, Nov 22 2023, 10:22:35)
Type "help", "copyright", "credits" or "license" for more information.
>> import torch
>> torch.__version__
'2.0.1+cu117'
>> torch.cuda.is_available()
True
(step 8) コード例で動作確認。
本来ならばジョブ投入による実行をすべきだが、今は動作確認なので、コード例を用意した後は直接実行することにしよう。コード例はPyTorchの画像分類チュートリアル Training a Classifier で公開されている cifar10_tutorial.py を使うことにする。 cifar10_tutorial.py を用意したら、以下のようにして実行できる。SIFファイル名の後は「その環境内でプログラムを実行するコマンドライン」を書くことになる。ここでは「python3コマンドを使ってcifar10_tutorial.pyを実行する」ように書いた。
code:shell
singularity exec --nv huggingface.sif python3 cifar10_tutorial.py
(ダウンロード省略)
Extracting ./data/cifar-10-python.tar.gz to ./data
Files already downloaded and verified
deer ship cat car
しばらくするとデータセットのダウンロードが始まるのでしばらく放置しよう。ダウンロードが終わると学習が始まり、lossが出力されるはずだ。このタイミングで別ターミナルから nvidia-smi コマンドを実行し、GPUが使用されているかどうかを確認してみよう。試した様子を以下に示す。以下の結果は「No running processes found=GPUを使用していない」ことを意味する。これは cifar10_tutorial.py がGPUを利用するように書かれていないためだ。(ページ内にGPU使用する場合の注意書きがある)
code:shell
amane:tnal% nvidia-smi
Thu Jul 4 10:56:48 2024
+-----------------------------------------------------------------------------+
| NVIDIA-SMI 470.256.02 Driver Version: 470.256.02 CUDA Version: 11.4 |
|-------------------------------+----------------------+----------------------+
| GPU Name Persistence-M| Bus-Id Disp.A | Volatile Uncorr. ECC |
| Fan Temp Perf Pwr:Usage/Cap| Memory-Usage | GPU-Util Compute M. |
| | | MIG M. |
|===============================+======================+======================|
| 0 Tesla V100S-PCI... Off | 00000000:3B:00.0 Off | 0 |
| N/A 36C P0 37W / 250W | 0MiB / 32510MiB | 2% Default |
| | | N/A |
+-------------------------------+----------------------+----------------------+
+-----------------------------------------------------------------------------+
| Processes: |
| GPU GI CI PID Type Process name GPU Memory |
| ID ID Usage |
|=============================================================================|
| No running processes found |
+-----------------------------------------------------------------------------+
(step 9) コード例を修正して動作確認。
net変数にモデルを保存しているところに、モデル保存後(146行目のnet = Net()した後)に、device変数を設定してnet変数を上書きし直す(2行追加)。
入力(inputs, labels)もGPUに送る(1行修正)。
参考までに差分(diff)は以下の通りだ。
code:shell
amane:tnal% diff cifar10_tutorial.py cifar10_tutorial_gpu.py
146a147,148
device = torch.device('cuda:0' if torch.cuda.is_available() else 'cpu')
net = net.to(device)
171c173
< inputs, labels = data
---
inputs, labels = data0.to(device), data1.to(device) コードを修正したら、改めて実行して実行途中の様子を確認しよう。確認した結果が以下の通りだ。下段の「Processes」にプロセスが出力され、上段の Memory-Usage, GPU-Util あたりが増えているならGPUが使われていることになる。
code:shell
amane:tnal% nvidia-smi
Thu Jul 4 11:07:09 2024
+-----------------------------------------------------------------------------+
| NVIDIA-SMI 470.256.02 Driver Version: 470.256.02 CUDA Version: 11.4 |
|-------------------------------+----------------------+----------------------+
| GPU Name Persistence-M| Bus-Id Disp.A | Volatile Uncorr. ECC |
| Fan Temp Perf Pwr:Usage/Cap| Memory-Usage | GPU-Util Compute M. |
| | | MIG M. |
|===============================+======================+======================|
| 0 Tesla V100S-PCI... Off | 00000000:3B:00.0 Off | 0 |
| N/A 37C P0 38W / 250W | 1165MiB / 32510MiB | 8% Default |
| | | N/A |
+-------------------------------+----------------------+----------------------+
+-----------------------------------------------------------------------------+
| Processes: |
| GPU GI CI PID Type Process name GPU Memory |
| ID ID Usage |
|=============================================================================|
| 0 N/A N/A 1315883 C /usr/bin/python3 1161MiB |
+-----------------------------------------------------------------------------+
最後に
SIFファイル、モデルファイル、データセット等はかなりファイルサイズが大きいです。不要になったら削除するようにしましょう。