このトピックでは、SLURM クラスタでコンテナ化されたタスクを実行する必要があるユーザーのために、クラスタ作成からジョブスケジューリングまでのプロセス全体について説明します。
ステップ 1:クラスタを作成する
次の表は、このトピックで使用されているクラスタ構成の例を示しています。必要に応じて他のパラメータを構成します。
パラメータ
構成
クラスタ構成
シリーズ
Standard Edition
デプロイメントモード
パブリッククラウドクラスタ
クラスタタイプ
SLURM
管理ノード
インスタンスタイプ: 4 vCPU と 32 GiB のメモリを搭載した ecs.r7.xlarge インスタンスタイプを使用します。
イメージ: centos_7_6_x64_20G_alibase_20211130.vhd
計算ノードとキュー
キュー計算ノード
初期ノード数:
1。ノード間相互接続
VPC ネットワーク
インスタンスタイプグループ
インスタンスタイプ: 56 vCPU と 346 GiB のメモリを搭載した ecs.gn7i-c56g1.14xlarge インスタンスタイプを使用します。
重要GPU をサポートするインスタンスタイプを使用する必要があります。詳細については、「インスタンスファミリ」をご参照ください。
イメージ: centos_7_6_x64_20G_alibase_20211130.vhd
共有ファイルストレージ
/home クラスタマウントディレクトリ
デフォルトでは、コントロールプレーンノードの
/homeディレクトリと/optディレクトリは、共有ストレージディレクトリとしてファイルシステムにマウントされます。/opt クラスタマウントディレクトリ
ソフトウェアとサービスコンポーネント
インストールするソフトウェア
docker を選択します。
インストール可能なサービスコンポーネント
ログオンノード:
インスタンスタイプ: 4 vCPU と 32 GiB のメモリを搭載した ecs.r7.xlarge インスタンスタイプを使用します。
イメージ: centos_7_6_x64_20G_alibase_20211130.vhd。
このトピックでは、usertest ユーザーを例として使用します。
ステップ 2:基本的なソフトウェア環境をセットアップする
計算ノードに EIP をアタッチします。
CUDA をダウンロードしてインストールします。
CUDA インストールパッケージをダウンロードします。
cd /opt wget https://developer.download.nvidia.com/compute/cuda/12.4.1/local_installers/cuda_12.4.1_550.54.15_linux.runCUDA をインストールします。
yum install -y git sh /opt/cuda_12.4.1_550.54.15_linux.run次の図が表示されたら、CUDA がインストールされています。

環境変数を構成します。
echo 'export PATH=/usr/local/cuda-12.4/bin:$PATH' >> ~/.bashrc echo 'export LD_LIBRARY_PATH=/usr/local/cuda-12.4/lib64:$LD_LIBRARY_PATH' >> ~/.bashrc source ~/.bashrcNVIDIA CUDA ツールキットと GPU ドライバのインストールステータスとバージョン情報を表示します。
# NVIDIA CUDA コンパイラドライバのバージョン情報 nvcc --version # GPU の詳細なステータス情報 nvidia-smi次の図が表示されたら、CUDA と GPU ドライバは正常に動作しています。

NVIDIA Container Toolkit をインストールして構成します。
distribution=$(. /etc/os-release;echo $ID$VERSION_ID) curl -s -L https://nvidia.github.io/libnvidia-container/stable/rpm/nvidia-container-toolkit.repo | sudo tee /etc/yum.repos.d/nvidia-container-toolkit.repo sudo yum install -y nvidia-container-toolkit sudo systemctl restart dockerSingularity をダウンロードしてインストールします。
Singularity は、ユーザー環境を変更せずにコンテナを実行できるコンテナ化ツールです。HPC 環境でよく使用されます。
cd /opt wget https://public-ehs.oss-cn-hangzhou.aliyuncs.com/softwares/packages/CentOS_7.2_64/singularity-3.8.3-1.el7.x86_64.rpm yum install -y /opt/singularity-3.8.3-1.el7.x86_64.rpmジョブ依存データを作成します。
PyTorch コンテナイメージをプルします。以下のコマンドについては何も変更する必要はありません。
docker pull ac2-registry.cn-hangzhou.cr.aliyuncs.com/ac2/pytorch:2.4.0-cuda12.1.1-py310-alinux3.2104usertestユーザーを使用して、main.pyファイルを作成します。vim /home/usertest/main.pymain.pyファイルのスクリプト内容は次のとおりです。# -*- coding: utf-8 -*- import torch import torchvision import torchvision.transforms as transforms from torch import nn from torch.utils.data import DataLoader from torch.optim import SGD class SimpleNet(nn.Module): def __init__(self): super(SimpleNet, self).__init__() self.conv1 = nn.Conv2d(3, 32, kernel_size=3, padding=1) self.conv2 = nn.Conv2d(32, 64, kernel_size=3, padding=1) self.fc1 = nn.Linear(64 * 8 * 8, 128) self.fc2 = nn.Linear(128, 10) self.pool = nn.MaxPool2d(2, 2) self.relu = nn.ReLU() self.dropout = nn.Dropout(0.5) def forward(self, x): x = self.pool(self.relu(self.conv1(x))) x = self.pool(self.relu(self.conv2(x))) x = x.view(-1, 64 * 8 * 8) x = self.relu(self.fc1(x)) x = self.dropout(x) x = self.fc2(x) return x device = torch.device("cuda" if torch.cuda.is_available() else "cpu") print(f"Using device: {device}") transform = transforms.Compose([ transforms.ToTensor(), transforms.Normalize((0.5, 0.5, 0.5), (0.5, 0.5, 0.5)) ]) train_dataset = torchvision.datasets.CIFAR10(root='./data', train=True, download=True, transform=transform) test_dataset = torchvision.datasets.CIFAR10(root='./data', train=False, download=True, transform=transform) train_loader = DataLoader(dataset=train_dataset, batch_size=64, shuffle=True) test_loader = DataLoader(dataset=test_dataset, batch_size=64, shuffle=False) model = SimpleNet().to(device) criterion = nn.CrossEntropyLoss() optimizer = SGD(model.parameters(), lr=0.001, momentum=0.9) num_epochs = 10 for epoch in range(num_epochs): model.train() running_loss = 0.0 for i, data in enumerate(train_loader, 0): inputs, labels = data inputs, labels = inputs.to(device), labels.to(device) optimizer.zero_grad() outputs = model(inputs) loss = criterion(outputs, labels) loss.backward() optimizer.step() running_loss += loss.item() if i % 100 == 99: print(f"[{epoch + 1}, {i + 1}] loss: {running_loss / 100:.3f}") running_loss = 0.0 model.eval() correct = 0 total = 0 with torch.no_grad(): for data in test_loader: images, labels = data images, labels = images.to(device), labels.to(device) outputs = model(images) _, predicted = torch.max(outputs.data, 1) total += labels.size(0) correct += (predicted == labels).sum().item() print(f"Accuracy on test set: {100 * correct / total:.2f}%") print("Training finished.")
ステップ 3:ジョブをスケジュールする
Docker ジョブをスケジュールする
E-HPC ポータルからジョブを送信する
NCCL ジョブを送信します。
上部のナビゲーションバーで、[タスク管理] を選択し、ページ上部の [送信者] をクリックし、[ジョブの作成] ページで、[ノード数] を
1に、[タスク数 (ノードごと)] を2に、[GPU 数] を1に設定します。ジョブスクリプトの内容は次のとおりです。
docker imagesコマンドを使用してイメージ名とバージョン番号を取得し、3 行目のyour_imageを置き換えます。#!/bin/bash image="your_image" run_cmd="python main.py" share_dir="/home/usertest/:/root" # cleanup docker handle function cleanup { echo "Caught signal, stopping Docker container: " $SLURM_JOB_NAME docker ps -q --filter label=$SLURM_JOB_NAME | xargs -r docker stop docker ps -qa --filter label=$SLURM_JOB_NAME | xargs -r docker rm } trap cleanup SIGINT SIGTERM cleanup # start docker # docker pull $image docker run \ --label $SLURM_JOB_NAME \ --gpus "device=0" \ -v $share_dir \ $image \ /bin/bash -c "$run_cmd" & # wait to complete wait cleanup
ジョブをクエリします。
[タスク管理] ページに移動して、ジョブステータスとアクションを含むジョブリストを表示します。詳細については、「ジョブのクエリ」をご参照ください。
コマンドラインからジョブを送信する
コマンドラインからジョブを送信します。詳細については、「SLURM」をご参照ください。
ジョブスクリプトの内容は次のとおりです。
docker imagesコマンドを使用してイメージ名とバージョン番号を取得し、13 行目のyour_imageを置き換えます。#!/bin/bash #SBATCH --job-name=tf_sample_job #SBATCH --nodes=1 #SBATCH --nt #SBATCH --gpus-per-task=1 #SBATCH --time=01:00:00 #SBATCH --partition=comp #SBATCH --output=tf_sample_job_%j.out #SBATCH --error=tf_sample_job_%j.err # Define variables image="your_image" run_cmd="python main.py" share_dir="/home/usertest/:/root" # Clean up Docker processes function cleanup { echo "Caught signal, stopping Docker container: " $SLURM_JOB_NAME docker ps -q --filter label=$SLURM_JOB_NAME | xargs -r docker stop docker ps -qa --filter label=$SLURM_JOB_NAME | xargs -r docker rm } trap cleanup SIGINT SIGTERM cleanup # Start Docker container docker pull $image docker run \ --label $SLURM_JOB_NAME \ --gpus "device=$CUDA_VISIBLE_DEVICES" \ -v $share_dir \ $image \ /bin/bash -c "$run_cmd" & # Wait for task completion wait cleanupSlurm を介してジョブをクエリします。
squeueコマンドを使用して、現在実行中またはキューに入っているジョブリストをクエリします。squeuesacctコマンドを使用して、完了したジョブを含むジョブ履歴をクエリします。sacct
Singularity ジョブをスケジュールする
Docker2Singularity。
Singularity イメージ管理を簡素化するために、クラウド内の Docker イメージリポジトリを再利用できます。次の手順に従って、イメージ形式を変換します。
# 方法 1: ローカル docker パッケージを介して sif イメージに変換する [root@compute006 opt]# docker images REPOSITORY TAG IMAGE ID CREATED SIZE ac2-registry.cn-hangzhou.cr.aliyuncs.com/ac2/pytorch 2.4.0-cuda12.1.1-py310-alinux3.2104 19301a07d7fd 4 months ago 6.33GB [root@compute006 opt]# docker save -o docker.tar 19301a07d7fd [root@compute006 opt]# ll docker.tar -rw------- 1 root root 3021202432 Feb 12 15:03 docker.tar [root@compute006 opt]# singularity build pytorch.sif docker-archive:///opt/docker.tar # 方法 2: docker コンテナリポジトリを介して sif イメージをビルドする singularity build xx.sif docker://ac2-registry.cn-hangzhou.cr.aliyuncs.com/ac2/pytorch:2.4.0-cuda12.1.1-py310-alinux3.2104
E-HPC ポータルからジョブを送信する
NCCL ジョブを送信します。
上部のナビゲーションバーで、[タスク管理] を選択し、ページ上部の [送信者] をクリックし、[ジョブの作成] ページで、[ノード数] を
1に、[タスク数 (ノードごと)] を2に、[GPU 数] を1に設定します。ジョブスクリプトの内容は次のとおりです。
image=/opt/pytorch.sif run_cmd="python main.py" share_dir="/home/usertest/:/root" singularity exec --nv --bind $share_dir $image $run_cmd
ジョブをクエリします。
[タスク管理] ページに移動して、ジョブステータスとアクションを含むジョブリストを表示します。詳細については、「ジョブのクエリ」をご参照ください。
コマンドラインからジョブを送信する
コマンドラインからジョブを送信します。詳細については、「SLURM」をご参照ください。
ジョブスクリプトの内容は次のとおりです。
#!/bin/bash #SBATCH --job-name=singularity_TF #SBATCH --output=output.log #SBATCH --nodes=1 #SBATCH --gres=gpu:1 #SBATCH --partition=container #SBATCH --ntasks=2 image=/opt/pytorch.sif run_cmd="python main.py" share_dir="/home/usertest/:/root" singularity exec --nv --bind $share_dir $image $run_cmdSlurm を介してジョブをクエリします。
squeueコマンドを使用して、現在実行中またはキューに入っているジョブリストをクエリします。squeuesacctコマンドを使用して、完了したジョブを含むジョブ履歴をクエリします。sacct