PAI-DLC を使用すると、シングルノードまたは分散トレーニングジョブを迅速に作成できます。Kubernetes がバックグラウンドでコンピューティングノードを自動的にプロビジョニングするため、手動でマシンを購入したり、ランタイム環境を構成したりする必要がなくなります。TensorFlow や PyTorch などの一般的なディープラーニングフレームワークをサポートし、柔軟なリソース構成オプションを提供します。
クイックスタート
MNIST 手書き数字認識を例に、このガイドでは Deep Learning Containers (DLC) を使用したシングルノード・シングル GPU のトレーニングと、マルチノード・マルチ GPU の分散トレーニングを順を追って説明します。詳細については、「Deep Learning Containers (DLC) を使い始める」をご参照ください。
コンソールのパラメーターリファレンス
基本情報
|
パラメーター |
説明 |
|
[タスク名] |
ジョブを識別しやすい名前を設定します。 |
|
[タグ] |
ジョブに標準化されたタグを設定します。タグは、ラベルによるジョブのアーカイブ、ジョブの分布分析、リソース消費の追跡の基盤となります。以下の制約があります:
タグ付けの標準化に関するガイダンスについては、「DLC、DSW、および EAS のタグ付けを標準化する」をご参照ください。 |
|
[タスクの説明] |
このフィールドには、ジョブの目的、背景、またはその他のコンテキスト情報を記述します。 |
環境情報
|
パラメーター |
説明 |
|
[イメージの構成] |
[Alibaba Cloud イメージ]に加えて、次のイメージタイプもサポートしています:
|
|
[データセットのマウント] |
データセットは、モデルのトレーニングに必要なデータファイルを提供します。次の 2 種類のデータセットをサポートしています:
[マウントパス]:データセットが DLC コンテナにマウントされるパスです (例: 重要
CPFS データセットを使用する場合、CPFS VPC と一致する VPC を DLC に設定する必要があります。そうしないと、送信されたジョブが「環境準備中」の状態が長時間続く可能性があります。 |
|
[ストレージのマウント] |
データソースパスを直接マウントして、必要なデータを読み取ったり、中間ファイルや結果ファイルを保存したりすることもできます。
詳細については、「クラウドストレージの使用」をご参照ください。 |
|
[開始コマンド] |
ジョブの起動コマンドを設定します。シェルコマンドがサポートされています。DLC は、
重要
コード用に設定されたマウントパス (例:/mnt/data) は、DLC コンテナ内のコードファイルの場所です。起動コマンドは、このパスを使用してコードファイルを参照する必要があります。 例えば、コードのマウントパスが /mnt/data で、コードファイルが train.py の場合、起動コマンドは次のようになります: python /mnt/data/train.py |
リソース情報
|
パラメーター |
説明 |
|
[リソースタイプ] |
デフォルトは[汎用コンピューティング]です。[Lingjun AI 計算]は、中国 (ウランチャブ)、シンガポール、中国 (深圳)、中国 (北京)、中国 (上海)、中国 (杭州)、中国 (広州)、中国 (香港)、マレーシア、ドイツ、アトランタの各リージョンで利用可能です。 |
|
[リソースソース] |
|
|
[フレーム] |
次のディープラーニングトレーニングフレームワークとツールをサポートしています:TensorFlow、PyTorch、ElasticBatch、XGBoost、OneFlow、MPIJob、Ray、Custom、DataJuicer、および MPI。 説明
[リソースクォータ]が Lingjun リソースに設定されている場合、TensorFlow、PyTorch、ElasticBatch、MPIJob、および Ray ジョブのみサポートされます。 |
|
[タスクリソース] |
選択した[フレーム]に基づいて、Worker、PS、Chief、Evaluator、および GraphLearn ノードタイプのリソースを設定できます。Ray フレームワークを使用する場合、 Role の作成 をクリックして Worker ロールをカスタマイズし、異種リソースの混合実行が可能になります。
|
|
[スケジューリングポリシー] |
ビジネスシナリオとジョブの特性に基づいて、コンテナリソースのスケジューリング戦略をカスタマイズできます:
|
DLC は、送信済みジョブのインスタンスタイプを直接変更することをサポートしていません。インスタンスタイプを変更する (たとえば、ecs.ebmgn8v.48xlarge のような eRDMA 高性能ネットワーキングをサポートするインスタンスに切り替える) には、 [Clone Job] 機能を使用して新しいジョブを作成し、ターゲットのインスタンスタイプを選択して送信してください。プラットフォームは自動的に高性能ネットワーキングを有効にし、NCCL 関連のパラメーターを設定します。インスタンスの NVIDIA ドライバーと CUDA バージョンを変更するには、インスタンス設定機能を使用してドライバーのバージョン (たとえば、バージョン 580) を変更してください。プラットフォームは、新しい設定に基づいて対応する DLC イメージを自動的にプルし、ランタイム環境を更新して、ドライバーの変更、CUDA のアップグレード、または GPU ドライバーの置換を完了します。
VPC 設定
VPC が設定されていない場合、パブリックネットワークとパブリックゲートウェイが使用されます。パブリックゲートウェイは帯域幅が限られているため、ジョブの実行中に速度が低下したり、正常に実行できなくなったりする可能性があります。
-
VPC を設定し、対応する vSwitch とセキュリティグループを選択すると、ネットワーク帯域幅、安定性、セキュリティが向上します。ジョブを実行しているクラスターは、この VPC 内のサービスに直接アクセスすることもできます。
重要VPC を使用する場合、ジョブリソースグループのインスタンス、データセットストレージ (OSS)、およびコードリポジトリがすべて同じリージョンの同じ VPC 内にあり、ネットワーク接続が確立されていることを確認してください。
CPFS データセットを使用する場合、CPFS VPC と一致する VPC を設定する必要があります。そうしないと、送信された DLC トレーニングジョブが「環境準備中」の状態が長時間続く可能性があります。
Lingjun スポットリソースを使用して DLC ジョブを送信する場合、VPC を設定する必要があります。
さらに、[インターネットゲートウェイ]を設定できます。次の2つのオプションがあります:
[パブリックゲートウェイ]:帯域幅が制限されています。高い同時実行性がある期間や大きなファイルをダウンロードする際に、ネットワーク速度が需要を満たさない場合があります。
[専用ゲートウェイ]:パブリックゲートウェイの帯域幅制限に対処するために、DLC VPC に NAT ゲートウェイを作成し、EIP を関連付けて SNAT エントリを設定できます。詳細については、「プライベートゲートウェイでインターネットアクセスを改善する」をご参照ください。
フォールトトレランスと診断
|
パラメーター |
説明 |
|
[フォールトトレランスモニタリング] |
[フォールトトレランスモニタリング]機能を有効にし、関連パラメーターを設定すると、システムはジョブの監視および制御機能を提供します。アルゴリズムレベルのエラーをリアルタイムで検出し、修正措置を講じて GPU の利用率を向上させます。詳細については、「AIMaster:エラスティック自動フォールトトレランスエンジン」をご参照ください。 説明
自動フォールトトレランスを有効にすると、システムはジョブインスタンスと並行して AIMaster インスタンスを起動し、追加のコンピューティングリソースを消費します。AIMaster インスタンスのリソース使用量の詳細:
|
|
[ヘルスチェック] |
[ヘルスチェック]機能を有効にすると、ヘルスチェックがトレーニングに関連するリソースを徹底的に検査し、障害のあるノードを自動的に隔離し、バックグラウンドで自動化された操作をトリガーします。これにより、トレーニングの初期段階での問題の発生確率を効果的に低減し、トレーニングの成功率を向上させます。詳細については、「SanityCheck:コンピューティングヘルスチェック」をご参照ください。 説明
ヘルスチェック機能は、Lingjun リソースクォータで送信され、GPU 数が 0 より大きい PyTorch トレーニングジョブでのみサポートされています。 |
ロールと権限
インスタンス RAM ロールの設定について以下に説明します。詳細については、「DLC の RAM ロールを設定する」をご参照ください。
|
インスタンス RAM ロール |
説明 |
|
[PAI デフォルトロール] |
サービスロール AliyunPAIDLCDefaultRole に基づいて動作します。このロールは MaxCompute と OSS のみにアクセスでき、よりきめ細かい権限が付与されます。PAI のデフォルトロールに基づいて発行される一時的な認証情報では、以下のようになります:
|
|
[カスタムロール] |
カスタム RAM ロールを選択または指定します。インスタンス内から STS 一時認証情報を使用してクラウドサービスにアクセスする場合、権限はカスタムロールの権限と一致します。 |
|
[ロールを関連付けない] |
DLC ジョブに RAM ロールは関連付けられません。これがデフォルトのオプションです。 |
関連ドキュメント
ジョブの基本情報、リソースビュー、操作ログを確認できます。詳細については、「トレーニング詳細」をご参照ください。
ジョブの実行に関する請求明細を確認できます。詳細については、「請求明細」をご参照ください。
一般的な DLC ジョブの問題と解決策については、「DLC に関するよくある質問」をご参照ください。
DLC のユースケースについては、「DLC ユースケース」をご参照ください。
よくある質問
Q:トレーニングジョブの作成時、NAS データソースのマウントターゲットに関する BadRequest エラーが発生した場合はどうすればよいですか?
このエラーは、NAS データソースにマウントターゲットがない場合に発生するため、NAS コンソールで新しいマウントターゲットを作成し、トレーニングジョブの作成時に データセットのマウント または ストレージのマウント 設定でそれをデータソースとして選択してから、ジョブを再送信してください。
Q:DLC トレーニングジョブで、メトリクスを Weights & Biases (W&B) にエクスポートできますか?
はい、DLC はトレーニングメトリクスの W&B へのエクスポートをサポートしていますが、次の前提条件を満たす必要があります。
ネットワーク接続:PAI トレーニングノードがパブリックエンドポイント api.wandb.ai にアクセスできることを確認してください。VPC を使用する場合は、NAT ゲートウェイを設定してください。
キー管理:環境変数で W&B API キーを設定してください。コード内にハードコードしないでください。
コンプライアンス:機密性のないスカラーメトリクスのみをアップロードしてください。生データや機密性の高いモデルの詳細をアップロードしないでください。
Q:失敗した DLC ジョブは、ジョブリストに表示されますか?
表示されるかどうかは、失敗の理由によって異なります。
リソース不足により失敗したジョブは、DLC コンソールのジョブリストに一時的に表示されますが、削除されるとリストからなくなります。
無効なリクエストパラメーターが原因で API が直接エラーを返す場合 (RequestID 付き)、ジョブリストには記録されません。エラーメッセージは操作ページにのみ表示されます。
Q:DLC ジョブの作成時に「アカウントのセキュリティ保護がトリガーされました」または「リソース割り当ての一時停止」というメッセージが表示された場合、どうすればよいですか?
このメッセージは通常、アカウントのリスク管理ポリシーによって作動します。Alibaba Cloud セルフサービス診断ツール (https://smartservice.console.alibabacloud.com/service/self-service-center/search?questionId=27591) を使用して、支払いまたはリソース割り当てができない理由を診断し、申し立てを行ってください。申し立てが承認されたら、ジョブの作成を再試行できます。
付録
SDK または CLI を使用したジョブの作成
Python SDK
ステップ1:Alibaba Cloud 認証情報ツールのインストール
Alibaba Cloud SDK を使用して OpenAPI を呼び出しリソースを管理する場合、認証情報を設定するために認証情報ツールをインストールする必要があります。要件は次のとおりです。
Python バージョンが 3.7 以上であること。
V2.0 Alibaba Cloud SDK を使用すること。
pip install alibabacloud_credentials
ステップ2:アカウントの AccessKey の取得
この例では、AccessKey (AK) 情報を使用してアクセス認証情報を設定します。認証情報の漏洩を防ぐため、AccessKey を環境変数に保存することを推奨します。ID とシークレットの環境変数名は ALIBABA_CLOUD_ACCESS_KEY_ID と ALIBABA_CLOUD_ACCESS_KEY_SECRET です。
AccessKey の取得方法については、「AccessKeyの作成」をご参照ください。
環境変数の設定方法については、「環境変数の設定」をご参照ください。
その他の認証情報設定方法については、「認証情報ツールのインストール」をご参照ください。
ステップ3:Python SDK のインストール
-
ワークスペース SDK をインストールします。
pip install alibabacloud_aiworkspace20210204==3.0.1 -
DLC SDK をインストールします。
pip install alibabacloud_pai_dlc20201203==1.4.17
ステップ4:ジョブの投入
パブリックリソースを使用したジョブの投入
次のサンプルコードは、ジョブを作成して投入する方法を示します。
サブスクリプションリソースクォータを使用したジョブの投入
PAI コンソールにログインします。
ワークスペース ID を確認します。左側のナビゲーションペインで [ワークスペースリスト] をクリックします。対象のワークスペースを見つけ、その名前の横にある ⓘ アイコンをクリックし、表示される情報パネルで [ワークスペースID] を確認してコピーします。
専用リソースグループのリソースクォータ ID を確認します。左側のナビゲーションペインで、[AI コンピューティングリソース] > [リソースクォータ] を選択します。[汎用コンピューティングリソース] タブをクリックし、リソースクォータリストの [名前/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 アクセスまたは日常的な運用を行うことを推奨します。 # AccessKey ID と AccessKey Secret をプロジェクトコードに保存しないことを強く推奨します。そうしないと、AccessKey が漏洩し、アカウント内のすべてのリソースのセキュリティが脅かされる可能性があります。 # この例では、Credentials SDK がデフォルトで環境変数から AccessKey を読み取り、認証を行います。 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 = '<region-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))) 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.<region-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 = '<region-id>' cred = CredClient() workspace_id = '12**' dlc_client = DLCClient( Config(credential=cred, region_id=region_id, endpoint='pai-dlc.{}.aliyuncs.com'.format(region_id))) 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.<region-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 | Lingjun スポットリソースを使用してジョブを投入する場合は必須です。ジョブが実行されるリージョンの VPC、vSwitch、およびセキュリティグループ ID を設定します。 |
API を呼び出すか SDK を使用して DLC ジョブを作成する (createJob) 場合、ローカルのコードファイルを直接アップロードすることはできません。まず、次のいずれかの場所にコードをアップロードしてください。
Git リポジトリ:AI アセット管理でコード設定を作成し、Git リポジトリの URL にリンクします。
OSS ストレージ:コードを OSS にアップロードした後、データセットとしてマウントすることでジョブで使用できるようにします。
カスタムイメージ:コードを Docker イメージにパッケージ化します。
コマンドライン
ステップ1:クライアントのダウンロードとユーザー認証の完了
オペレーティングシステムに応じて、Linux 64 ビットまたは Mac クライアントツールをダウンロードし、ユーザー認証を完了します。詳細については、「開始する前に」をご参照ください。
ステップ2:ジョブの投入
PAI コンソールにログインします。
-
次の手順に従って、ワークスペースリストページでワークスペース ID (WorkspaceID) を確認します。
左側のナビゲーションペインで [ワークスペースリスト] をクリックします。対象のワークスペースを見つけ、その名前の右側にある ⓘ アイコンをクリックし、表示される情報パネルで [ワークスペースID] を確認します。
-
次の手順に従って、リソースクォータ ID を確認します。
左側のナビゲーションペインで、[AI コンピューティングリソース] > [リソースクォータ] を選択します。対象のリソースタイプのタブ ([汎用コンピューティングリソース] など) を選択し、リソースクォータリストの [名前/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=<your_resource_quota_id> workspace_id=<your_workspace_id> -
次のサンプルコードを使用して
params_fileパラメーターを渡します。これにより、DLC ジョブが指定されたワークスペースとリソースクォータに投入されます。./dlc submit tfjob --job_file ./tfjob.params -
次のコマンドを使用して、投入した DLC ジョブを確認します。
./dlc get job <jobID>
詳細パラメーターリスト
|
パラメーター (キー) |
サポートされるフレームワークタイプ |
説明 |
パラメーター値 |
|
|
ALL |
カスタムリソース解放ポリシーを設定します。このパラメーターはオプションです。未設定の場合、ジョブ終了時にすべての Pod リソースが解放されます。設定する場合、サポートされる値は |
pod-exit |
|
|
ALL |
ジャンボフレームを有効にするかどうかを指定します。このパラメーターは、AI コンピューティングリソース - 汎用コンピューティング 2.0 でのみサポートされています。デフォルト値は false で、無効を意味します。 |
|
|
|
ALL |
GPU ドライバーがロードされるときに IBGDA を有効にするかどうかを指定します。 |
|
|
|
ALL |
GDRCopy カーネルモジュールをインストールするかどうかを指定します。現在インストールされているバージョンは 2.4.4 です。 |
|
|
|
ALL |
NUMA を有効にするかどうかを指定します。 |
|
|
|
ALL |
ジョブを投入する際、このパラメーターは、クォータ内の総リソース (ノード仕様) がジョブ内のすべてのロールの仕様を満たしているかどうかをチェックします。 |
|
|
|
PyTorch |
ワーカー間のネットワーク接続を許可するかどうかを指定します。
これを有効にすると、各ワーカーのドメイン名はワーカー名 ( |
|
|
|
PyTorch |
各ワーカーで公開されるネットワークポートを定義できます。このパラメーターを 未設定の場合、デフォルトではマスターでポート 23456 のみが公開されます。このカスタムポートリストにポート 23456 を含めないでください。 重要
このパラメーターは |
セミコロンで区切られた文字列のセット。各文字列は単一のポート番号、またはハイフンで接続されたポート範囲です ( |
|
|
PyTorch |
各ワーカーで公開するネットワークポートの数を要求できます。このパラメーターを 未設定の場合、デフォルトではマスターでポート 23456 のみが公開されます。DLC は、パラメーターで定義されたポート数に基づいて、ワーカーにポートをランダムに割り当てます。割り当てられたポート番号は、 重要
|
整数 (最大:65536) |
|
|
Ray |
フレームワークが Ray の場合、RayRuntimeEnv を手動で設定してランタイム環境を定義できます。 重要
環境変数とサードパーティライブラリの設定は、この設定によって上書きされます。 |
環境変数とサードパーティライブラリを設定します ( |
|
|
Ray |
外部 GCS Redis アドレス。 |
文字列 |
|
|
Ray |
外部 GCS Redis ユーザー名。 |
文字列 |
|
|
Ray |
外部 GCS Redis パスワード。 |
文字列 |
|
|
Ray |
サブミッターの再試行回数。 |
正の整数 (int) |
|
|
Ray |
ノードの共有メモリを設定します。例えば、各ノードに 1 GiB の共有メモリを設定するには、次の設定を使用します。
|
正の整数 (int) |
ボタンをクリックして、入札方法を選択します: