<jupyter_start><jupyter_text>NGC Catalogのコンテナを実行する--PyTorch-Singularity---構築したOpenHPC環境でNGC Catalogの[PyTorchコンテナ](https://ngc.nvidia.com/catalog/containers/nvidia:pytorch)を実行します。  前提条件このNotebookを実行するための前提条件を満たしていることを確認します。 以下のことを前提条件とします。* 構築済のOpenHPC環境がある* OpenHPC環境のマスターノードに対してSSHでログインできる* Singularityがロードされる設定になっている* SlurmのGeneric Resource(GRES)としてGPUが登録されていること* GPUがCUDA Compute Capability 5.2以上であること> [AWS P2](https://aws.amazon.com/jp/ec2/instance-types/p2/)などのNVIDIA K80は[Compute Capability](https://developer.nvidia.com/cuda-gpus)が3.7なので、このNotebookで利用しているコンテナイメージを実行することができません。 マスターノードに対して SSH でログインできることを確認します。マスターノードのIPアドレスを指定してください。<jupyter_code># (例)
# master_address = '172.30.XXX.xxx'

master_address =<jupyter_output><empty_output><jupyter_text>SSHでログインするユーザ名を指定してください。<jupyter_code># (例)
# user = 'vcp'
# user = 'user00'

user =<jupyter_output><empty_output><jupyter_text>必要であればSSHの秘密鍵を指定してください。<jupyter_code># (例)
# ssh_identity = '~/.ssh/id_rsa'<jupyter_output><empty_output><jupyter_text>SSHでログインする際の引数を、変数に格納しておきます。<jupyter_code># ユーザ名とホスト名
target = f'{user}@{master_address}'
print(target)

# SSHのコマンドライン引数
ssh_opts = f'-i {ssh_identity}' if 'ssh_identity' in vars() else ''
print(ssh_opts)<jupyter_output><empty_output><jupyter_text>マスターノードに対してSSHでログインしてコマンドを実行してみます。<jupyter_code>!ssh {ssh_opts} {target} hostname<jupyter_output><empty_output><jupyter_text>Singularityがロードされていることを確認します。<jupyter_code>!ssh {ssh_opts} {target} module is-loaded singularity<jupyter_output><empty_output><jupyter_text>上のセルがエラーになった場合は Singularity をロードする設定が行われていません。「061-Singularityのロード.ipynb」を実行して Singularity がロードされるよう設定してください。 SlurmのGeneric Resource(GRES)としてGPUが登録されていることを確認します。<jupyter_code>!ssh {ssh_opts} {target} sinfo -N --Format=NodeHost,Gres | grep -w gpu<jupyter_output><empty_output><jupyter_text>上のセルがエラーになった場合はSlurmにGPUがGRESとして登録されていません。「032-設定ファイルの編集-GRESの登録.ipynb」を実行してGRESの設定をしてください。  PyTorchコンテナの実行PyTorchコンテナでMNISTを実行してみます。  コンテナイメージの取得 OpenHPC環境でコンテナを実行するにはSingularityを利用します。はじめにNGCカタログから[PyTorch](https://ngc.nvidia.com/catalog/containers/nvidia:pytorch)のコンテナイメージを取得します。> 作業領域として `/tmp` に 30GB程度の空き領域が必要となります。他のディレクトリを作業領域として利用する場合は環境変数`SINGULARITY_TMPDIR`を指定してください。詳細についてはSingularityのドキュメント [Build Customization](https://singularity.lbl.gov/build-environmentenvironment-variables) を参照してください。> > またイメージの取得、変換には３０分以上かかります。<jupyter_code>ngc_version = '21.06'
sif_file = f'pytorch_{ngc_version}-py3.sif'
!ssh {ssh_opts} {target} bash -l -c \
    "'test -f {sif_file} || singularity pull docker://nvcr.io/nvidia/pytorch:{ngc_version}-py3'"<jupyter_output><empty_output><jupyter_text>準備MNISTのデータやスクリプトを準備します。 まず、データやスクリプトを配置するディレクトリを作成します。<jupyter_code>work_dir = 'pytorch'
!ssh {ssh_opts} {target} mkdir -p {work_dir}<jupyter_output><empty_output><jupyter_text>データをダウンロードするためのスクリプトを配置します。<jupyter_code>!scp {ssh_opts} template/pytorch/download_mnist.py {target}:{work_dir}<jupyter_output><empty_output><jupyter_text>スクリプトを実行し、データをダウンロードします。> NGCカタログ 21.06 の PyTorch のコンテナに含まれる torchvision では MNIST のデータセットをダウンロードに失敗する可能性があります。そこで、このNotebookでは`venv`で torchvision 0.10.0以降の新しいパッケージをインストールした環境を用意し、そこでデータセットのダウンロードを行います。PyTorchのコンテナとは別環境を `venv` で用意するのは、コンテナへの影響を避けるためです。<jupyter_code>out = !ssh {ssh_opts} {target} mktemp -d
torchvision_work = out[0]
print(torchvision_work)
!ssh {ssh_opts} {target} python3 -m venv {torchvision_work}
!ssh {ssh_opts} {target} {torchvision_work}/bin/pip install torchvision six
!ssh {ssh_opts} {target} bash -l -c \
    "'cd {work_dir} && {torchvision_work}/bin/python download_mnist.py'"<jupyter_output><empty_output><jupyter_text>データが取得できたことを確認します。<jupyter_code>!ssh {ssh_opts} {target} bash -l -c \
    "'cd {work_dir} && ls -lR ../data'"<jupyter_output><empty_output><jupyter_text>`venv` で作った環境は不要なので削除します。<jupyter_code>!rm -rf {torchvision_work}<jupyter_output><empty_output><jupyter_text>GitHubの [pytorch/examples](https://github.com/pytorch/examples) からMNISTの[スクリプト](https://github.com/pytorch/examples/blob/master/mnist/main.py)を取得します。<jupyter_code>mnist_url = 'https://raw.githubusercontent.com/pytorch/examples/master/mnist/main.py'
!ssh {ssh_opts} {target} bash -l -c \
    "'cd {work_dir} && curl -L -o mnist_classify.py {mnist_url}'"<jupyter_output><empty_output><jupyter_text>取得したスクリプトの内容を先頭部分を表示してみます。<jupyter_code>mnist_url = 'https://raw.githubusercontent.com/pytorch/examples/master/mnist/main.py'
!ssh {ssh_opts} {target} head {work_dir}/mnist_classify.py<jupyter_output><empty_output><jupyter_text>コンテナからGPUが利用できることを確認するSingularityで実行したコンテナ環境からGPUを利用できることを確認します。 GPUを利用できるかをチェックするスクリプトを配置します。<jupyter_code>!scp {ssh_opts} template/pytorch/check_gpu.py {target}:{work_dir}<jupyter_output><empty_output><jupyter_text>GPU利用の可否をチェックするスクリプトを実行します。次のセルを実行してエラーとならないことを確認してください。<jupyter_code>!ssh {ssh_opts} {target} bash -l -c \
    "'cd {work_dir} && srun -l -N 1 \
    singularity exec --nv ~/{sif_file} python check_gpu.py'"<jupyter_output><empty_output><jupyter_text>ジョブの実行MNISTのスクリプトをSlurmのジョブとして実行します。 ジョブの実行スクリプトを作成します。<jupyter_code>from tempfile import TemporaryDirectory
from pathlib import Path

with TemporaryDirectory() as workdir:
    batch_file = Path(workdir) / 'pytorch_mnist.job'
    with batch_file.open(mode='w') as f:
        f.write(f'''#!/bin/bash
        
#SBATCH -J pytorch-mnist         # create a short name for your job
#SBATCH -o pytorch-mnist.%j.out  # Name of stdout output file (%j expands to jobId)
#SBATCH -N 1                     # Total number of nodes requested
#SBATCH -n 1                     # Total number of across all nodes
#SBATCH --gres=gpu:1             # number of gpus per node
#SBATCH -t 00:10:00              # Run time (hh:mm:ss)

cd $HOME/{work_dir}
singularity exec --nv $HOME/{sif_file} python3 mnist_classify.py --epochs=3
''')
    !cat {batch_file}
    !scp {ssh_opts} {str(batch_file)} {target}:{work_dir}<jupyter_output><empty_output><jupyter_text>ジョブを実行する前のキューの状態を確認します。<jupyter_code>!ssh {ssh_opts} {target} squeue<jupyter_output><empty_output><jupyter_text>ノードのGPU利用状況を確認します。<jupyter_code>!ssh {ssh_opts} {target} sinfo --Node --Format=NodeHost,Gres,GresUsed<jupyter_output><empty_output><jupyter_text>ジョブを実行します。<jupyter_code>!ssh {ssh_opts} {target} bash -l -c \
    "'cd {work_dir} && sbatch pytorch_mnist.job'"<jupyter_output><empty_output><jupyter_text>ジョブの実行状況を確認します。<jupyter_code>!ssh {ssh_opts} {target} squeue<jupyter_output><empty_output><jupyter_text>ノードのGPU利用状況を確認します。`GRES_USED` の欄でノードのGPU利用状況を確認してください。<jupyter_code>!ssh {ssh_opts} {target} sinfo --Node --Format=NodeHost,Gres,GresUsed<jupyter_output><empty_output><jupyter_text>ジョブが完了するまで数分かかります。ジョブ実行中のCPU, メモリ, GPUなどの利用状況は VCC の Grafana で確認することができます。 ジョブの完了後に次のセルを実行してください。ジョブの出力結果が確認できます。<jupyter_code>!ssh {ssh_opts} {target} bash -l -c \
    "'cd {work_dir} && tail pytorch-mnist*.out'"<jupyter_output><empty_output>
StarcoderdataJupyterStructuredCleanDedup