PyTorch
ここでは、PyTorchをpipで導入して実行する手順を説明します。具体的には、PyTorchを導入して実行する手順と、PyTorchとHorovodを導入して分散学習を実行する手順を示します。
PyTorchの単体実行
前提
grpname
はご自身のABCI利用グループ名に置き換えてください- Python仮想環境はインタラクティブノードと各計算ノードで参照できるよう、ホーム領域またはグループ領域に作成してください
- サンプルプログラムはインタラクティブノードと各計算ノードで参照できるよう、ホーム領域またはグループ領域に保存してください
導入方法
venvモジュールでPython仮想環境を作成し、作成したPython仮想環境へPyTorchをpipで導入する手順です。
[username@es1 ~]$ qrsh -g grpname -l rt_G.small=1 -l h_rt=1:00:00
[username@g0001 ~]$ module load python/3.11 cuda/11.8 cudnn/8.6
[username@g0001 ~]$ python3 -m venv ~/venv/pytorch
[username@g0001 ~]$ source ~/venv/pytorch/bin/activate
(pytorch) [username@g0001 ~]$ pip3 install --upgrade pip setuptools
(pytorch) [username@g0001 ~]$ pip3 install torch==2.0.1 torchvision==0.15.2 torchaudio==2.0.2 --extra-index-url https://download.pytorch.org/whl/cu118
次回以降は、次のようにモジュールの読み込みとPython仮想環境のアクティベートだけでPyTorchを使用できます。
[username@g0001 ~]$ module load python/3.11 cuda/11.8 cudnn/8.6
[username@g0001 ~]$ source ~/venv/pytorch/bin/activate
実行方法
PyTorchサンプルプログラム main.py
実行方法をインタラクティブジョブとバッチジョブそれぞれの場合で示します。
インタラクティブジョブとして実行
[username@es1 ~]$ qrsh -g grpname -l rt_G.small=1 -l h_rt=1:00:00
[username@g0001 ~]$ module load python/3.11 cuda/11.8 cudnn/8.6
[username@g0001 ~]$ source ~/venv/pytorch/bin/activate
(pytorch) [username@g0001 ~]$ git clone https://github.com/pytorch/examples.git
(pytorch) [username@g0001 ~]$ cd examples/mnist
(pytorch) [username@g0001 ~]$ python3 main.py
バッチジョブとして実行
次のジョブスクリプトを run.sh
ファイルとして保存します。
#!/bin/sh
#$ -l rt_G.small=1
#$ -j y
#$ -cwd
source /etc/profile.d/modules.sh
module load python/3.11 cuda/11.8 cudnn/8.6
source ~/venv/pytorch/bin/activate
git clone https://github.com/pytorch/examples.git
cd examples/mnist
python3 main.py
deactivate
バッチジョブ実行のため、ジョブスクリプト run.sh
をqsubコマンドでバッチジョブとして投入します。
[username@es1 ~]$ qsub -g grpname run.sh
Your job 1234567 ('run.sh') has been submitted
PyTorch + Horovod
前提
grpname
はご自身のABCI利用グループ名に置き換えてください- Python仮想環境はインタラクティブノードと各計算ノードで参照できるよう、ホーム領域またはグループ領域に作成してください
- サンプルプログラムはインタラクティブノードと各計算ノードで参照できるよう、ホーム領域またはグループ領域に保存してください
導入方法
venvモジュールでPython仮想環境を作成し、作成したPython仮想環境へPyTorchとHorovodをpipで導入する手順です。
[username@es1 ~]$ qrsh -g grpname -l rt_G.small=1 -l h_rt=1:00:00
[username@g0001 ~]$ module load python/3.11 cuda/11.8 cudnn/8.6 nccl/2.16 hpcx-mt/2.12
[username@g0001 ~]$ python3 -m venv ~/venv/pytorch+horovod
[username@g0001 ~]$ source ~/venv/pytorch+horovod/bin/activate
(pytorch+horovod) [username@g0001 ~]$ pip3 install --upgrade pip setuptools
(pytorch+horovod) [username@g0001 ~]$ pip3 install wheel
(pytorch+horovod) [username@g0001 ~]$ pip3 install torch==2.0.1 torchvision==0.15.2 torchaudio==2.0.2 --extra-index-url https://download.pytorch.org/whl/cu118
(pytorch+horovod) [username@g0001 ~]$ HOROVOD_NCCL_LINK=SHARED HOROVOD_WITH_PYTORCH=1 HOROVOD_GPU_OPERATIONS=NCCL HOROVOD_NCCL_HOME=$NCCL_HOME HOROVOD_WITHOUT_GLOO=1 pip3 install --no-cache-dir horovod==0.27.0
次回以降は、次のようにモジュールの読み込みとPython仮想環境のアクティベートだけでPyTorchとHorovodを使用できます。
[username@g0001 ~]$ module load python/3.11 cuda/11.8 cudnn/8.6 nccl/2.16 hpcx-mt/2.12
[username@g0001 ~]$ source ~/venv/pytorch+horovod/bin/activate
実行方法
Horovodを利用するPyTorchサンプルプログラム pytorch_mnist.py
で分散学習する方法をインタラクティブジョブとバッチジョブそれぞれの場合で示します。
インタラクティブジョブとして実行
この例では、計算ノードの4つのGPUを利用して分散学習します。
[username@es1 ~]$ qrsh -g grpname -l rt_G.large=1 -l h_rt=1:00:00
[username@g0001 ~]$ module load python/3.11 cuda/11.8 cudnn/8.6 nccl/2.16 hpcx-mt/2.12
[username@g0001 ~]$ source ~/venv/pytorch+horovod/bin/activate
(pytorch+horovod) [username@g0001 ~]$ git clone -b v0.27.0 https://github.com/horovod/horovod.git
(pytorch+horovod) [username@g0001 ~]$ mpirun -np 4 -map-by ppr:4:node -mca pml ob1 python3 horovod/examples/pytorch/pytorch_mnist.py
バッチジョブとして実行
この例では、計8つのGPUを利用して分散学習します。計算ノード2台を使用し、計算ノード1台あたり4つのGPUを使用しています。
次のジョブスクリプトを run.sh
ファイルとして保存します。
#!/bin/sh
#$ -l rt_F=2
#$ -j y
#$ -cwd
source /etc/profile.d/modules.sh
module load python/3.11 cuda/11.8 cudnn/8.6 nccl/2.16 hpcx-mt/2.12
source ~/venv/pytorch+horovod/bin/activate
git clone -b v0.27.0 https://github.com/horovod/horovod.git
NUM_GPUS_PER_NODE=4
NUM_PROCS=$(expr ${NHOSTS} \* ${NUM_GPUS_PER_NODE})
MPIOPTS="-hostfile $SGE_JOB_HOSTLIST -np ${NUM_PROCS} -map-by ppr:${NUM_GPUS_PER_NODE}:node -mca pml ob1 -mca btl self,tcp -mca btl_tcp_if_include bond0"
mpirun ${MPIOPTS} python3 horovod/examples/pytorch/pytorch_mnist.py
deactivate
バッチジョブ実行のため、ジョブスクリプト run.sh
をqsubコマンドでバッチジョブとして投入します。
[username@es1 ~]$ qsub -g grpname run.sh
Your job 1234567 ('run.sh') has been submitted