Platform for AI(PAI)コンソールの Deep Learning Containers(DLC)を使用すると、スタンドアロンまたは分散トレーニングジョブをすばやく作成できます。計算ノードは、DLC の基盤となるレイヤーの Kubernetes によって自動的に起動されます。この方法では、インスタンスを手動で購入して環境を構成する必要がなく、使用方法の習慣は変わりません。 DLC は、トレーニングジョブの迅速な起動、さまざまな深層学習フレームワークのサポートを必要とするユーザーに適しており、柔軟なリソース構成を提供します。
前提条件
Alibaba Cloud アカウントを使用してPAI がアクティブ化され、ワークスペースが作成されている。 PAI をアクティブ化するには、PAI コンソールにログインし、上部のナビゲーションバーでリージョンを選択し、承認後に[アクティブ化]をクリックします。
操作を実行するために使用するアカウントには、必要な権限が付与されています。 Alibaba Cloud アカウントを使用する場合、この前提条件は無視できます。 RAM ユーザーを使用する場合は、次のいずれかのロールを RAM ユーザーに割り当てる必要があります。アルゴリズム開発者、アルゴリズム O&M エンジニア、ワークスペース管理者。
PAI コンソールでジョブを送信する
DLC を初めて使用する場合は、PAI コンソールでジョブを送信することをお勧めします。 SDK for Python またはコマンドラインを使用してジョブを送信することもできます。
[ジョブの作成] ページに移動します。
PAI コンソールにログインし、ターゲットリージョンとワークスペースを選択して、[Deep Learning Containers (DLC) に入る] をクリックします。
[Deep Learning Containers (DLC)] ページで、[ジョブの作成] をクリックします。
以下のセクションのパラメーターを構成します。
基本情報
このセクションでは、[ジョブ名] パラメーターと [タグ] パラメーターを構成します。
環境情報
パラメーター
説明
ノードイメージ
[Alibaba Cloud イメージ] を選択できます。 また、次の値のいずれかを選択することもできます。
[カスタムイメージ]: PAI にアップロードした カスタムイメージ。 イメージリポジトリからイメージをプルできること、またはイメージが Container Registry Enterprise Edition インスタンスに保存されていることを確認する必要があります。
説明凌雲リソースとカスタムイメージを使用する場合は、RDMA(Remote Direct Memory Access)をインストールして、凌雲の高性能 RDMA ネットワークを使用します。
[イメージアドレス]: インターネット経由でアクセスできるカスタムイメージまたは Alibaba Cloud イメージのアドレス。
プライベートイメージアドレスを入力する場合は、[ユーザー名とパスワードを入力] をクリックし、[ユーザー名] パラメーターと [パスワード] パラメーターを指定して、プライベートイメージリポジトリに対する権限を付与します。
PAI で高速イメージを使用することもできます。
データセット
モデルのトレーニングに必要なデータファイルを提供するデータセット。 次のデータセットタイプのいずれかを使用できます。
[カスタムデータセット]: カスタムデータセットを作成することで、モデルのトレーニングに必要なデータファイルを保存します。 [バージョン] パネルで、[読み取り/書き込み権限] パラメーターを構成し、必要なバージョンを選択できます。
[パブリックデータセット]: PAI が提供する既存のパブリックデータセットを選択します。 パブリックデータセットは読み取り専用マウントのみをサポートします。
マウントパス: DLC コンテナー内のパス(例:
/mnt/data
)。 指定したマウントパスに基づいて、コマンドを実行してデータセットをクエリできます。 マウント構成の詳細については、「DLC トレーニングジョブにクラウドストレージを使用する」をご参照ください。重要CPFS(Cloud Parallel File Storage)データセットを選択した場合は、DLC ジョブ用に VPC(仮想プライベートクラウド)を構成する必要があります。 VPC は、CPFS データセット用に構成された VPC と同じである必要があります。 そうしないと、ジョブが環境準備状態のまま長時間留まる可能性があります。
直接マウント
データソースを直接マウントしてデータを読み取ったり、プロシージャファイルと結果ファイルを保存したりできます。
前提条件
[詳細設定]: 特定の機能を実装するために、さまざまなデータソースに対してこのパラメーターを構成できます。 例:
OSS: 詳細設定で
{"mountType":"ossfs"}
構成を追加して、ossfs を使用して OSS バケットをマウントできます。汎用 NAS および CPFS: 詳細設定で nconnect パラメーターを指定して、DLC コンテナーでの NAS アクセスのスループットを向上させることができます。 設定例:
{"nconnect":"<サンプル値>"}
。 <サンプル値> を正の整数に置き換えます。
詳細については、「DLC トレーニングジョブにクラウドストレージを使用する」をご参照ください。
起動コマンド
ジョブが実行するコマンド。 シェルコマンドがサポートされています。 DLC は、
MASTER_ADDR
やWORLD_SIZE
など、PyTorch および TensorFlow の一般的な環境変数を自動的に挿入します。 変数は$環境変数名
を使用して取得できます。 コマンド例:Python を実行する:
python -c "print('Hello World')"
PyTorch マルチマシンおよびマルチ GPU 分散トレーニングを開始する:
python -m torch.distributed.launch \ --nproc_per_node=2 \ --master_addr=${MASTER_ADDR} \ --master_port=${MASTER_PORT} \ --nnodes=${WORLD_SIZE} \ --node_rank=${RANK} \ train.py --epochs=100
シェルスクリプトパスを起動コマンドとして設定する:
/ml/input/config/launch.sh
リソース情報
パラメーター
説明
リソースタイプ
リソースタイプ。 デフォルト値: [汎用計算リソース]。 [凌雲リソース] は、中国 (ウランチャブ)、シンガポール、中国 (深セン)、中国 (北京)、中国 (上海)、中国 (杭州) リージョンでのみ選択できます。
ソース
[パブリックリソース]:
課金方法:従量課金制。
シナリオ: パブリックリソースで実行されるトレーニングジョブでは、キューイングの遅延が発生する可能性があります。 少数のジョブを含む時間依存ではないシナリオでは、パブリックリソースを使用することをお勧めします。
制限: パブリックリソースは、最大 2 つの GPU と 8 つの vCPU を提供できます。 リソースクォータを増やすには、営業担当者にお問い合わせください。
[リソースクォータ]: 汎用計算リソースと凌雲リソースが含まれます。
課金方法: サブスクリプション。
シナリオ: リソースクォータは、高い保証が必要で、多数のジョブが関係するシナリオに適しています。
特別なパラメーター:
[リソースクォータ]: GPU、vCPU、およびその他のリソースの数を指定します。 詳細については、「リソースクォータを作成する」をご参照ください。
[優先度]: ジョブを実行するための優先度を指定します。 有効な値: 1 ~ 9。 値が大きいほど、優先度が高くなります。
[プリエンプティブルリソース]:
課金方法:従量課金制。
シナリオ: プリエンプティブルリソースは、コスト削減が必要なシナリオに適しています。 ほとんどの場合、プリエンプティブルリソースは追加の割引を提供します。
制限: プリエンプティブルリソースの高可用性と安定性は保証されていません。 リソースはすぐに使用できない場合や、システムによって解放される場合があります。 詳細については、「プリエンプティブルジョブを使用する」をご参照ください。
フレームワーク
深層学習トレーニングフレームワークとツール。 有効な値: Tensorflow、PyTorch、ElasticBatch、XGBoost、OneFlow、MPIJob、Ray。
説明[リソースクォータ] パラメーターを凌雲リソースに設定した場合、送信できるジョブのタイプは TensorFlow、PyTorch、ElasticBatch、MPIJob、Ray のみです。
ジョブリソース
選択した[フレームワーク] に基づいて、次のノードのリソースを構成します。 ワーカーノード、パラメーターサーバー (PS) ノード、チーフノード、エバリュエーターノード、GraphLearn ノード。 Ray フレームワークを選択した場合は、[ロールの追加] をクリックしてカスタムワーカーロールを作成できます。 これにより、さまざまなタイプの計算リソースをシームレスに連携させることができます。
パブリックリソースを使用する: 次のパラメーターを構成できます。
[ノード数]: DLC ジョブを実行するノードの数。
[リソースタイプ]: インスタンスを選択します。 さまざまなタイプのインスタンスの価格は、[インスタンスタイプ] パネルに表示されます。 課金の詳細については、「DLC の課金」をご参照ください。
リソースクォータを使用する: [ノード数]、[vCPU]、[GPU]、[メモリ (GiB)]、[共有メモリ (GiB)] パラメーターに加えて、次の特別なパラメーターも構成できます。
[ノード固有のスケジューリング]: ジョブを実行する計算ノードを指定できます。
[アイドルリソース]: この機能を有効にすると、他のビジネスジョブに割り当てられたクォータのアイドルリソースでジョブを実行できます。 これにより、リソース使用率が効果的に向上します。 ただし、アイドルリソースを返す必要がある場合、アイドルリソースで実行されているジョブは終了し、アイドルリソースは自動的に返されます。
[CPU アフィニティ]: この機能を有効にすると、コンテナーまたはポッド内のプロセスを実行のために特定の CPU コアにバインドできます。 これにより、CPU キャッシュミスやコンテキストスイッチなどの問題を防ぎ、CPU 使用率とアプリケーションパフォーマンスが向上します。 この機能は、パフォーマンスと適時性に高い要件があるシナリオに適しています。
プリエンプティブルリソースを使用する: [ノード数] パラメーターと [リソースタイプ] パラメーターに加えて、[入札価格] パラメーターを構成して、プリエンプティブルリソースに適用する最大入札価格を指定することもできます。
アイコンをクリックして、入札方法を切り替えることができます。
[入札価格 (割引)]: 最大入札価格は、市場価格の 10% ~ 90% の範囲で、10% 刻みです。 入札が市場価格を満たしているか上回っており、在庫がある場合、プリエンプティブルリソースを取得できます。
[入札価格 ($/分)]: 最大入札価格範囲は、市場価格範囲に基づいています。
VPC
VPC を構成しない場合、インターネット接続とパブリックゲートウェイが使用されます。 パブリックゲートウェイの帯域幅は限られているため、ジョブが停止したり、予期したとおりに実行されない場合があります。
VPC を構成し、vSwitch とセキュリティグループを選択すると、ネットワーク帯域幅が増加し、パフォーマンスの安定性とセキュリティの両方が向上します。 構成が有効になると、ジョブが実行されているクラスターは VPC 内のサービスに直接アクセスします。
重要VPC を使用する場合は、リソースグループ内のインスタンスとデータセットの OSS バケットが同じリージョンの VPC に存在し、VPC がコードリポジトリのネットワークに接続されていることを確認する必要があります。
CPFS データセットを使用する場合は、VPC を構成する必要があります。 VPC は、CPFS データセット用に構成された VPC と同じである必要があります。 そうしないと、ジョブが環境準備状態のまま長時間留まる可能性があります。
凌雲プリエンプティブルリソースを使用して DLC ジョブを送信する場合は、VPC を構成する必要があります。
[インターネットゲートウェイ] パラメーターも構成できます。 有効な値:
[パブリックゲートウェイ]: パブリック帯域幅は制限されています。 高い同時実行性または大きなファイルのダウンロードシナリオでは、ダウンロードレートがビジネス要件を満たさない場合があります。
[プライベートゲートウェイ]: 制限されたパブリック帯域幅を増やすには、プライベートゲートウェイを使用できます。 インターネット NAT ゲートウェイを作成し、Elastic IP アドレス (EIP) を DSW インスタンスに関連付け、DSW インスタンスに関連付けられている VPC で SNAT を構成する必要があります。 詳細については、「プライベートゲートウェイを使用してインターネットアクセスレートを向上させる」をご参照ください。
フォールトトレランスと診断
パラメーター
説明
自動フォールトトレランス
[自動フォールトトレランス] をオンにして関連パラメーターを構成すると、システムはジョブをチェックして、ジョブのアルゴリズムエラーを特定して処理します。 これにより、GPU 使用率が向上します。 詳細については、「AIMaster: エラスティックフォールトトレランスエンジン」をご参照ください。
説明[自動フォールトトレランス] を有効にすると、システムはジョブインスタンスと一緒に実行され、次のリソースを占有する AIMaster インスタンスを起動します。
リソースクォータ: 1 CPU コアと 1 GB のメモリ。
パブリックリソース: ecs.c6.large。
サニティチェック
[サニティチェック] をオンにすると、システムはジョブの実行に使用されるリソースを検出し、障害のあるノードを分離し、バックグラウンドで自動 O&M プロセスをトリガーします。 サニティチェックは、トレーニングの初期段階でのジョブの失敗を効果的に削減し、トレーニングの成功率を向上させます。
説明サニティチェックは、凌雲リソースで実行され、GPU を使用する PyTorch ジョブに対してのみ有効にできます。
ロールと権限
次の表では、[インスタンス RAM ロール] パラメーターの構成方法について説明します。 詳細については、「RAM ロールを DLC ジョブに関連付ける」をご参照ください。
インスタンス RAM ロール
説明
[PAI のデフォルトロール]
PAI のデフォルトロールは AliyunPAIDLCDefaultRole ロールに基づいて開発されており、MaxCompute および OSS にアクセスするための権限のみを持っています。 デフォルトロールを使用して、きめ細かい権限管理を実装できます。 PAI のデフォルトロールによって発行された一時的な認証情報を持っている場合:
MaxCompute テーブルにアクセスすると、DLC ジョブの所有者と同じ権限が付与されます。
OSS にアクセスする場合、現在のワークスペースのデフォルトのストレージパスとして構成されているバケットにのみアクセスできます。
[カスタムロール]
カスタム RAM (Resource Access Management) ロールを選択または作成します。 セキュリティトークンサービス (STS) の一時的な認証情報を使用して他の Alibaba Cloud サービスの API 操作を呼び出す場合、選択したカスタムロールと同じ権限が付与されます。
[ロールを関連付けない]
RAM ロールを DLC ジョブに関連付けないでください。 デフォルトでは、このオプションが選択されています。
パラメーターを構成したら、[確認] をクリックします。
次の手順
トレーニングジョブを送信した後、次の操作を実行できます。
ジョブの基本情報、リソースビュー、ログを表示します。 詳細については、「トレーニングジョブを表示する」をご参照ください。
トレーニングジョブを管理する。 ジョブの複製、停止、または削除。
TensorBoard を使用して、モデルのトレーニング結果の分析レポートを表示します。
トレーニングジョブを監視し、アラートルールを構成します。 詳細については、「トレーニングの監視とアラート」をご参照ください。
ジョブ実行請求書の明細情報を表示します。 詳細については、「料金の詳細」をご参照ください。
カスタム分析のために、ワークスペースから特定の Logstore に DLC ジョブのログを転送します。 詳細については、「ジョブログをサブスクライブする」をご参照ください。
PAI コンソールの [イベント通知の構成] タブでワークスペースの 通知ルールを作成して、DLC ジョブのステータスを追跡および監視します。
DLC ジョブについて他に質問がある場合は、「DLC についてのよくある質問」をご参照ください。
DLC ユースケースを表示します。
付録
SDK for Python またはコマンドラインを使用してジョブを送信する
SDK for Python を使用する
ステップ 1: Alibaba Cloud SDK Credentials ツールをインストールする
Alibaba Cloud SDK を使用してクラウド リソースを管理するために API 操作を呼び出す前に、有効な認証情報を構成する必要があります。 前提条件:
Python 3.7 以降がインストールされている。
Alibaba Cloud SDK V2.0 がインストールされている。
pip install alibabacloud_credentials
ステップ 2: AccessKey ペアを取得する
この例では、AccessKey ペアがアクセス認証情報として使用されます。 アカウント情報の漏洩を防ぐため、AccessKey ペアを環境変数として構成することをお勧めします。 AccessKey ID と AccessKey シークレットの変数名は、ALIBABA_CLOUD_ACCESS_KEY_ID と ALIBABA_CLOUD_ACCESS_KEY_SECRET です。
参考資料:
ステップ 3: SDK for Python をインストールする
ワークスペース SDK をインストールします。
pip install alibabacloud_aiworkspace20210204==3.0.1
DLC SDK をインストールします。
pip install alibabacloud_pai_dlc20201203==1.4.17
ステップ 4: ジョブを送信する
パブリックリソースを使用してジョブを送信する
次のサンプルコードは、ジョブを作成して送信する方法の例を示しています。
サブスクリプションリソースクォータを使用してジョブを送信する
PAI コンソールにログインします。
次の図に示す手順に従って、[ワークスペース] ページでワークスペース ID を取得します。
次の図に示す手順に従って、専用リソースグループのリソースクォータ ID を取得します。
次のコードを実行して、ジョブを作成および送信します。 使用可能なパブリック イメージについては、「手順 2: イメージを準備する」をご参照ください。
from alibabacloud_pai_dlc20201203.client import Client from alibabacloud_credentials.client import Client as CredClient from alibabacloud_tea_openapi.models import Config from alibabacloud_pai_dlc20201203.models import ( CreateJobRequest, JobSpec, ResourceConfig, GetJobRequest ) # DLC API 操作にアクセスするためのクライアントを初期化します。 region = 'cn-hangzhou' # Alibaba Cloud アカウントの AccessKey ペアは、すべての API 操作に対する権限を持っています。これらの資格情報を使用して操作を実行することは、リスクの高い操作です。RAM ユーザーを使用して API 操作を呼び出したり、日常的な O&M を実行することをお勧めします。RAM ユーザーを作成するには、RAM コンソールにログインします。 # AccessKey ID と AccessKey シークレットをプロジェクトコードに保存しないことをお勧めします。保存すると、AccessKey ペアが漏洩し、アカウント内のすべてのリソースのセキュリティが侵害される可能性があります。 # この例では、Credentials SDK は環境変数から AccessKey ペアを読み取って ID 検証を実行します。 cred = CredClient() client = Client( config=Config( credential=cred, region_id=region, endpoint=f'pai-dlc.{region}.aliyuncs.com', ) ) # ジョブのリソース構成を指定します。パブリックイメージを選択するか、イメージアドレスを指定できます。使用可能なパブリックイメージについては、リファレンスドキュメントを参照してください。 spec = JobSpec( type='Worker', image=f'registry-vpc.cn-hangzhou.aliyuncs.com/pai-dlc/tensorflow-training:1.15-cpu-py36-ubuntu18.04', pod_count=1, resource_config=ResourceConfig(cpu='1', memory='2Gi') ) # ジョブの実行情報を指定します。 req = CreateJobRequest( resource_id='<Your resource quota ID>', workspace_id='<Your workspace ID>', display_name='sample-dlc-job', job_type='TFJob', job_specs=[spec], user_command='echo "Hello World"', ) # ジョブを送信します。 response = client.create_job(req) # ジョブ ID を取得します。 job_id = response.body.job_id # ジョブステータスをクエリします。 job = client.get_job(job_id, GetJobRequest()).body print('job status:', job.status) # ジョブが実行するコマンドを表示します。 job.user_command
プリエンプティブルリソースを使用してジョブを送信する
SpotDiscountLimit (スポット割引)
#!/usr/bin/env python3 from alibabacloud_tea_openapi.models import Config from alibabacloud_credentials.client import Client as CredClient from alibabacloud_pai_dlc20201203.client import Client as DLCClient from alibabacloud_pai_dlc20201203.models import CreateJobRequest region_id = '<リージョン ID>' # DLC ジョブが存在するリージョンの ID (例: cn-hangzhou)。 cred = CredClient() workspace_id = '12****' # DLC ジョブが属するワークスペースの ID。 dlc_client = DLCClient( Config(credential=cred, region_id=region_id, endpoint='pai-dlc.{}.aliyuncs.com'.format(region_id), protocol='http')) create_job_resp = dlc_client.create_job(CreateJobRequest().from_map({ 'WorkspaceId': workspace_id, 'DisplayName': 'sample-spot-job', 'JobType': 'PyTorchJob', 'JobSpecs': [ { "Type": "Worker", "Image": "dsw-registry-vpc.<リージョン ID>.cr.aliyuncs.com/pai/pytorch-training:1.12-cpu-py39-ubuntu20.04", "PodCount": 1, "EcsSpec": 'ecs.g7.xlarge', "SpotSpec": { "SpotStrategy": "SpotWithPriceLimit", "SpotDiscountLimit": 0.4, } }, ], 'UserVpc': { "VpcId": "vpc-0jlq8l7qech3m2ta2****", "SwitchId": "vsw-0jlc46eg4k3pivwpz8****", "SecurityGroupId": "sg-0jl4bd9wwh5auei9****", }, "UserCommand": "echo 'Hello World' && ls -R /mnt/data/ && sleep 30 && echo 'DONE'", }))job_id = create_job_resp.body.job_id print(f'jobId is {job_id}')
SpotPriceLimit (スポット価格)
#!/usr/bin/env python3
from alibabacloud_tea_openapi.models import Config
from alibabacloud_credentials.client import Client as CredClient
from alibabacloud_pai_dlc20201203.client import Client as DLCClient
from alibabacloud_pai_dlc20201203.models import CreateJobRequest
region_id = '<リージョン ID>'
cred = CredClient()
workspace_id = '12****'
dlc_client = DLCClient(
Config(credential=cred,
region_id=region_id,
endpoint='pai-dlc.{}.aliyuncs.com'.format(region_id),
protocol='http'))
create_job_resp = dlc_client.create_job(CreateJobRequest().from_map({
'WorkspaceId': workspace_id,
'DisplayName': 'sample-spot-job',
'JobType': 'PyTorchJob',
'JobSpecs': [
{
"Type": "Worker",
"Image": "dsw-registry-vpc.<リージョン ID>.cr.aliyuncs.com/pai/pytorch-training:1.12-cpu-py39-ubuntu20.04",
"PodCount": 1,
"EcsSpec": 'ecs.g7.xlarge',
"SpotSpec": {
"SpotStrategy": "SpotWithPriceLimit",
"SpotPriceLimit": 0.011,
}
},
],
'UserVpc': {
"VpcId": "vpc-0jlq8l7qech3m2ta2****",
"SwitchId": "vsw-0jlc46eg4k3pivwpz8****",
"SecurityGroupId": "sg-0jl4bd9wwh5auei9****",
},
"UserCommand": "echo 'Hello World' && ls -R /mnt/data/ && sleep 30 && echo 'DONE'",
}))
job_id = create_job_resp.body.job_id
print(f'jobId is {job_id}')
次の表では、主要な構成について説明します。
パラメーター | 説明 |
SpotStrategy | 入札ポリシー。 入札タイプのパラメーターは、このパラメーターを SpotWithPriceLimit に設定した場合にのみ有効になります。 |
SpotDiscountLimit | スポット割引入札タイプ。 説明
|
SpotPriceLimit | スポット価格入札タイプ。 |
UserVpc | このパラメーターは、凌雲リソースを使用してジョブを送信する場合に必須です。 ジョブが存在するリージョンの VPC、vSwitch、およびセキュリティグループ ID を構成します。 |
コマンドラインを使用する
ステップ 1: DLC クライアントをダウンロードし、ユーザー認証を実行する
お使いのオペレーティングシステム用の DLC クライアントをダウンロードし、認証情報を検証します。 詳細については、「始める前に」をご参照ください。
ステップ 2: ジョブを送信する
PAI コンソールにログインします。
次の図に示す手順に従って、[ワークスペース] ページでワークスペース ID を取得します。
次の図に示す手順に従って、リソースクォータ ID を取得します。
tfjob.params
という名前のパラメーターファイルを作成し、次のコンテンツをファイルにコピーします。 ジョブの送信に使用するコマンドについては、「ジョブの送信に使用するコマンド」をご参照ください。name=test_cli_tfjob_001 workers=1 worker_cpu=4 worker_gpu=0 worker_memory=4Gi worker_shared_memory=4Gi worker_image=registry-vpc.cn-beijing.aliyuncs.com/pai-dlc/tensorflow-training:1.12.2PAI-cpu-py27-ubuntu16.04 command=echo good && sleep 120 resource_id=<リソースクォータ ID> workspace_id=<ワークスペース ID>
次のコードを実行して、params_file パラメーターを指定し、DLC ジョブを指定されたワークスペースおよびリソースクォータに送信します。
./dlc submit tfjob --job_file ./tfjob.params
次のコードを実行して、送信した DLC ジョブをクエリします。
./dlc get job <jobID>