すべてのプロダクト
Search
ドキュメントセンター

Platform For AI:トレーニングジョブの作成

最終更新日:Aug 12, 2026

PAI-DLC を使用すると、シングルノードまたは分散トレーニングジョブを迅速に作成できます。Kubernetes がバックグラウンドでコンピューティングノードを自動的にプロビジョニングするため、手動でマシンを購入したり、ランタイム環境を構成したりする必要がなくなります。TensorFlow や PyTorch などの一般的なディープラーニングフレームワークをサポートし、柔軟なリソース構成オプションを提供します。

クイックスタート

MNIST 手書き数字認識を例に、このガイドでは Deep Learning Containers (DLC) を使用したシングルノード・シングル GPU のトレーニングと、マルチノード・マルチ GPU の分散トレーニングを順を追って説明します。詳細については、「Deep Learning Containers (DLC) を使い始める」をご参照ください。

コンソールのパラメーターリファレンス

基本情報

パラメーター

説明

[タスク名]

ジョブを識別しやすい名前を設定します。

[タグ]

ジョブに標準化されたタグを設定します。タグは、ラベルによるジョブのアーカイブ、ジョブの分布分析、リソース消費の追跡の基盤となります。以下の制約があります:

  • キーの制約aliyun または acs: で始めることはできません。http:// または https:// を含めることはできません。最大長: 128 文字。キーには文字、数字、ハイフン (-)、アンダースコア (_)、ピリオド (.) のみ使用できます。

  • 値の制約http:// または https:// を含めることはできません。最大長: 256 文字。複数の値はコンマで区切ります。

タグ付けの標準化に関するガイダンスについては、「DLC、DSW、および EAS のタグ付けを標準化する」をご参照ください。

[タスクの説明]

このフィールドには、ジョブの目的、背景、またはその他のコンテキスト情報を記述します。

環境情報

パラメーター

説明

[イメージの構成]

[Alibaba Cloud イメージ]に加えて、次のイメージタイプもサポートしています:

  • [非公開イメージ]:PAI に追加されたカスタムイメージを使用します。イメージリポジトリをパブリックに設定するか、イメージを Alibaba Cloud Container Registry (ACR) に保存する必要があります。詳細については、「カスタムイメージ」をご参照ください。

    説明

    Lingjun リソースでカスタムイメージを使用する場合、高性能な RDMA ネットワークを最大限に活用するには、手動で RDMA ドライバーをインストールする必要があります。詳細については、「RDMA:分散トレーニングのための高性能ネットワーキング」をご参照ください。

  • [イメージアドレス]:パブリックにアクセス可能なカスタムイメージまたは公式イメージのアドレスを設定できます。

    • プライベートイメージアドレスの場合は、 [Enter credentials] をクリックし、イメージリポジトリのユーザー名とパスワードを設定します。

    • イメージのプル速度を向上させるには、「イメージアクセラレーション」をご参照ください。

[データセットのマウント]

データセットは、モデルのトレーニングに必要なデータファイルを提供します。次の 2 種類のデータセットをサポートしています:

  • [カスタムデータセット]:カスタムデータセットを作成して、トレーニングに必要なデータファイルを保存できます。[Read-only] モードを有効にし、バージョンリストからデータセットのバージョンを選択できます。

  • [パブリックデータセット]:PAI は組み込みのパブリックデータセットを提供しており、読み取り専用のマウントのみをサポートしています。

[マウントパス]:データセットが DLC コンテナにマウントされるパスです (例:/mnt/data)。コード内でこのパスを通じてデータセットにアクセスできます。マウント設定の詳細については、「クラウドストレージの使用」をご参照ください。

重要

CPFS データセットを使用する場合、CPFS VPC と一致する VPC を DLC に設定する必要があります。そうしないと、送信されたジョブが「環境準備中」の状態が長時間続く可能性があります。

[ストレージのマウント]

データソースパスを直接マウントして、必要なデータを読み取ったり、中間ファイルや結果ファイルを保存したりすることもできます。

  • サポートされているデータソースタイプ:OSS、汎用 NAS、エクストリーム NAS、CPFS、および BMCPFS (Lingjun リソースでのみ利用可能)。

  • [詳細設定]:データソースタイプごとに、詳細設定を通じて固有の機能をサポートしています。例:

    • OSS:詳細設定で {"mountType":"ossfs"} を設定して、ossfs を使用して OSS ストレージをマウントします。

    • 汎用 NAS および CPFS:詳細設定で nconnect パラメーターを設定して、DLC コンテナからの NAS スループットを向上させることができます。詳細については、「Linux で NAS のパフォーマンスを向上させるにはどうすればよいですか?」をご参照ください。例:{"nconnect":"<sample value>"}。ここで <sample value> は特定の正の整数に置き換えます。

詳細については、「クラウドストレージの使用」をご参照ください。

[開始コマンド]

ジョブの起動コマンドを設定します。シェルコマンドがサポートされています。DLC は、MASTER_ADDRWORLD_SIZE などの一般的な PyTorch および TensorFlow の環境変数を自動的に挿入します。これらは $VARIABLE_NAME を使用して参照できます。起動コマンドの例:

  • 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

重要

コード用に設定されたマウントパス (例:/mnt/data) は、DLC コンテナ内のコードファイルの場所です。起動コマンドは、このパスを使用してコードファイルを参照する必要があります。

例えば、コードのマウントパスが /mnt/data で、コードファイルが train.py の場合、起動コマンドは次のようになります: python /mnt/data/train.py

詳細設定を展開:環境変数、サードパーティライブラリ、コード設定

[環境変数]

自動的に挿入される一般的な PyTorch および TensorFlow の環境変数に加えて、 Key:Value 形式でカスタム環境変数を指定できます。最大 20 個の環境変数がサポートされています。

[サードパーティライブラリ設定]

コンテナイメージにサードパーティライブラリが不足している場合、[サードパーティライブラリ設定]機能で追加できます。次の2つの方法があります:

  • [サードパーティーライブラリ一覧]:テキストボックスにライブラリ名を直接入力します。複数のライブラリ名はスペースで区切ります。例:griffon numpy pandas

  • [requirements.txt ファイルのディレクトリ]:ライブラリを requirements.txt ファイルに追加し、コード設定、データセット、または直接マウントを通じて DLC コンテナにアップロードし、テキストボックスにコンテナ内のファイルパスを指定します。

[コード設定]

トレーニングに必要なコードファイルを DLC コンテナにアップロードします。2つの設定方法があります:

  • [オンライン設定]:既存の Git リポジトリがあり、アクセス権限を持っている場合、「コード設定の作成」を使用してリポジトリをリンクすると、DLC がジョブコードを取得できるようになります。

  • [ローカルアップロード]:image.png ボタンをクリックして、ローカルのコードファイルをアップロードします。アップロード後、[マウントパス]をコンテナ内の特定のパス (例:/mnt/data) に設定します。

リソース情報

パラメーター

説明

[リソースタイプ]

デフォルトは[汎用コンピューティング]です。[Lingjun AI 計算]は、中国 (ウランチャブ)、シンガポール、中国 (深圳)、中国 (北京)、中国 (上海)、中国 (杭州)、中国 (広州)、中国 (香港)、マレーシア、ドイツ、アトランタの各リージョンで利用可能です。

[リソースソース]

  • [パブリックリソース]:

    • 課金モデル:従量課金。

    • ジョブが頻繁でなく、厳密な時間要件がないワークロードに適しています。パブリックリソースはキューで待機する場合があります。

    • リソース制限:最大 2 GPU および 8 CPU コア。これらの制限を超えるには、アカウントマネージャーに連絡してクォータの引き上げを依頼してください。

  • [リソースクォータ]:汎用コンピューティングリソースまたは Lingjun リソースが含まれます。

    • 課金モデル:サブスクリプション。

    • 安定したリソースの保証が必要な、大量のジョブを伴うシナリオに適しています。

    • 特別なパラメーター:

      • [リソースクォータ]:GPU、CPU、およびその他のリソースの量を設定します。リソースクォータの作成方法については、「リソースクォータの作成」をご参照ください。

      • 優先度:同時に実行されているジョブの実行優先度を設定します。値の範囲: [1, 9]。1 が最も低い優先度です。

    • 事前チェック:ジョブ送信前に GPU モデルとイメージの互換性を自動的に検証し、設定エラーを早期に検出し、ジョブの失敗を防ぎます。

  • [プリエンプティブルリソース]:

    • 課金モデル:従量課金。

    • コスト重視のシナリオに適しています。スポットリソースの価格は従量課金よりも低くなっています。

    • 可用性の保証はありません。リソースがすぐに利用できない場合や、回収される場合があります。詳細については、「プリエンプティブルジョブの使用」をご参照ください。

[フレーム]

次のディープラーニングトレーニングフレームワークとツールをサポートしています: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 ジョブを実行するノードの数。

    • [リソース仕様]:インスタンスタイプを選択します。コンソールに価格が表示されます。課金の詳細については、「DLC の課金」をご参照ください。

  • リソースクォータの使用:各ノードタイプのノード数、CPU コア、GPU、メモリ (GiB)、および共有メモリ (GiB) を設定できます。次の特別なパラメーターも利用できます:

    • [ノードスケジューリングの指定]:特定のコンピューティングノードでジョブを実行します。

    • [スポットリソース]:アイドルタイムリソースを使用すると、ジョブは他のクォータのアイドルリソースで実行でき、リソース利用率が向上します。ただし、元のクォータがこれらのリソースを必要とすると、アイドルタイムジョブは自動的に終了し、リソースが返却されます。詳細については、「アイドルタイムリソースの使用」をご参照ください。

    • [CPU アフィニティ]:CPU アフィニティを有効にすると、プロセスを特定の CPU コアにバインドし、キャッシュミスとコンテキストスイッチを削減してパフォーマンスを向上させます。高いパフォーマンスとリアルタイム性が求められるシナリオに適しています。

  • スポットリソースの使用:ノード数とインスタンスタイプに加えて、[入札]パラメーターを設定できます。このパラメーターで、スポットリソースの最大入札額を設定します。image ボタンをクリックして、入札方法を選択します:

    • 割引率による:インスタンスタイプの市場価格に対し、10%から90%までの段階的な割引率で上限価格を設定します。最大入札額が市場価格以上で、十分なリソースがある場合にスポットリソースが割り当てられます。

    • 価格による:最大入札額は市場価格の範囲内で設定します。

[スケジューリングポリシー]

ビジネスシナリオとジョブの特性に基づいて、コンテナリソースのスケジューリング戦略をカスタマイズできます:

  • [インテリジェント]:GPU ジョブは最小限の GPU ノードに集約され、CPU ジョブは CPU ノードに分散されます。これがデフォルトの戦略です。

  • [集中]:ジョブは最小限のノードに集約されます。この戦略はリソースの断片化を減らすのに役立ち、GPU モデルのトレーニングに最適です。

  • [分散]:ジョブはノード間に分散されます。この戦略はジョブのデキュー成功率を向上させ、分散 CPU ジョブに最適です。

説明

DLC は、送信済みジョブのインスタンスタイプを直接変更することをサポートしていません。インスタンスタイプを変更する (たとえば、ecs.ebmgn8v.48xlarge のような eRDMA 高性能ネットワーキングをサポートするインスタンスに切り替える) には、 [Clone Job] 機能を使用して新しいジョブを作成し、ターゲットのインスタンスタイプを選択して送信してください。プラットフォームは自動的に高性能ネットワーキングを有効にし、NCCL 関連のパラメーターを設定します。インスタンスの NVIDIA ドライバーと CUDA バージョンを変更するには、インスタンス設定機能を使用してドライバーのバージョン (たとえば、バージョン 580) を変更してください。プラットフォームは、新しい設定に基づいて対応する DLC イメージを自動的にプルし、ランタイム環境を更新して、ドライバーの変更、CUDA のアップグレード、または GPU ドライバーの置換を完了します。

詳細設定を展開:最大実行期間、保持期間、フレームワークの詳細設定

[最大ランタイム時間]

ジョブが実行できる最大期間を設定します。この期間を超えたジョブは自動的に停止されます。デフォルト: 30 日。

[保持期間]

完了または失敗したジョブを保持する期間を設定します。保持中もリソースを消費し続けることに注意してください。この期間を超えたジョブは削除されます。

重要

削除された DLC ジョブは復元できません。操作には注意してください。

[開発者マシンの起動]

リソースソースがリソースクォータの場合、オンラインデバッグ用に DSW インスタンスを起動できます。ジョブ概要ページのインスタンスリスト領域で、 [操作] 列の [DSW] をクリックしてインスタンスにアクセスします。

[フレームの詳細設定]

設定可能なパラメーターとその値のリストについては、「詳細パラメーターリスト」をご参照ください。

  • パラメーター ReleaseResourcePolicyEnableNvidiaIBGDAEnableNvidiaGDRCopyEnablePaiNUMACoreBinding、および EnableResourcePreCheck は、すべてのフレームワークでサポートされています。

  • フレームワークPyTorch の場合、サポートされているパラメーターは createSvcForAllWorkerscustomPortList、および customPortNumPerWorker です。

    重要

    Lingjun リソースはカスタムポート機能を提供していないため、Lingjun リソースを使用して DLC ジョブを送信する場合、customPortNumPerWorker パラメーターはサポートされていません。

  • フレームワークRay の場合、サポートされているパラメーターは RayRuntimeEnvRayRedisAddressRayRedisUsernameRayRedisPasswordRaySubmitterBackoffLimit、および RayObjectStoreMemoryBytes です。環境変数とサードパーティライブラリの設定は RayRuntimeEnv の設定によって上書きされることにご注意ください。

以下の設定形式をサポートしています:

  • プレーンテキスト:各エントリを key=value 形式で記述し、コンマ (,) で区切った文字列として設定します。キーにはサポートされている詳細パラメーターを、値には対応するパラメーター値を指定します。

  • JSON

典型的な設定シナリオ:

  • シナリオ 1:PyTorch の詳細設定

    詳細設定パラメーターにより、Worker 間のネットワーク接続が可能になり、より柔軟なトレーニングアプローチが実現します。たとえば、追加で公開されたポートを使用して DLC コンテナ内で Ray のようなフレームワークを起動し、PyTorch と組み合わせて高度な分散トレーニングを行うことができます。設定例:

    createSvcForAllWorkers=true,customPortNumPerWorker=100

    その後、[開始コマンド]で $JOB_NAME および $CUSTOM_PORTS 環境変数を参照してドメイン名と利用可能なポート番号を取得し、Ray のようなフレームワークを起動して接続できます。

  • シナリオ 2:Ray フレームワークの RayRuntimeEnv を手動で設定する (依存関係と環境変数を含む)

    設定例:

    {"RayRuntimeEnv": "{pip: requirements.txt, env_vars: {key: value}}"}
  • シナリオ 3:カスタムリソース解放ポリシー

    現在サポートされている解放ポリシーは pod-exit のみです。このポリシーでは、Pod が終了すると自動的にリソースが解放されます。設定例:

    {
      "ReleaseResourcePolicy": "pod-exit"
    }

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 インスタンスのリソース使用量の詳細:

  • リソースクォータ: 1 CPU コアと 1 GiB メモリ。

  • パブリックリソース: ecs.c6.large インスタンスタイプを使用します。

[ヘルスチェック]

[ヘルスチェック]機能を有効にすると、ヘルスチェックがトレーニングに関連するリソースを徹底的に検査し、障害のあるノードを自動的に隔離し、バックグラウンドで自動化された操作をトリガーします。これにより、トレーニングの初期段階での問題の発生確率を効果的に低減し、トレーニングの成功率を向上させます。詳細については、「SanityCheck:コンピューティングヘルスチェック」をご参照ください。

説明

ヘルスチェック機能は、Lingjun リソースクォータで送信され、GPU 数が 0 より大きい PyTorch トレーニングジョブでのみサポートされています。

ロールと権限

インスタンス RAM ロールの設定について以下に説明します。詳細については、「DLC の RAM ロールを設定する」をご参照ください。

インスタンス RAM ロール

説明

[PAI デフォルトロール]

サービスロール AliyunPAIDLCDefaultRole に基づいて動作します。このロールは MaxCompute と OSS のみにアクセスでき、よりきめ細かい権限が付与されます。PAI のデフォルトロールに基づいて発行される一時的な認証情報では、以下のようになります:

  • MaxCompute テーブルにアクセスする場合、DLC インスタンスの所有者と同じ権限を持ちます。

  • OSS にアクセスする場合、現在のワークスペースに設定されているデフォルトの OSS バケットにのみアクセスできます。

[カスタムロール]

カスタム 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_IDALIBABA_CLOUD_ACCESS_KEY_SECRET です。

ステップ3:Python SDK のインストール

  • ワークスペース SDK をインストールします。

    pip install alibabacloud_aiworkspace20210204==3.0.1
  • DLC SDK をインストールします。

    pip install alibabacloud_pai_dlc20201203==1.4.17

ステップ4:ジョブの投入

パブリックリソースを使用したジョブの投入

次のサンプルコードは、ジョブを作成して投入する方法を示します。

ジョブの作成と投入のサンプルコード

#!/usr/bin/env python3

from __future__ import print_function

import json
import time

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 (
    ListJobsRequest,
    ListEcsSpecsRequest,
    CreateJobRequest,
    GetJobRequest,
)

from alibabacloud_aiworkspace20210204.client import Client as AIWorkspaceClient
from alibabacloud_aiworkspace20210204.models import (
    ListWorkspacesRequest,
    CreateDatasetRequest,
    ListDatasetsRequest,
    ListImagesRequest,
    ListCodeSourcesRequest
)

def create_nas_dataset(client, region, workspace_id, name,
                       nas_id, nas_path, mount_path):
    '''NAS データセットを作成します。
    '''
    response = client.create_dataset(CreateDatasetRequest(
        workspace_id=workspace_id,
        name=name,
        data_type='COMMON',
        data_source_type='NAS',
        property='DIRECTORY',
        uri=f'nas://{nas_id}.{region}{nas_path}',
        accessibility='PRIVATE',
        source_type='USER',
        options=json.dumps({
            'mountPath': mount_path
        })
    ))
    return response.body.dataset_id

def create_oss_dataset(client, region, workspace_id, name,
                       oss_bucket, oss_endpoint, oss_path, mount_path):
    '''OSS データセットを作成します。
    '''
    response = client.create_dataset(CreateDatasetRequest(
        workspace_id=workspace_id,
        name=name,
        data_type='COMMON',
        data_source_type='OSS',
        property='DIRECTORY',
        uri=f'oss://{oss_bucket}.{oss_endpoint}{oss_path}',
        accessibility='PRIVATE',
        source_type='USER',
        options=json.dumps({
            'mountPath': mount_path
        })
    ))
    return response.body.dataset_id

def wait_for_job_to_terminate(client, job_id):
    while True:
        job = client.get_job(job_id, GetJobRequest()).body
        print('job({}) is {}'.format(job_id, job.status))
        if job.status in ('Succeeded', 'Failed', 'Stopped'):
            return job.status
        time.sleep(5)
    return None

def main():

    # メインアカウントが DLC を承認しており、十分な権限を持っていることを確認してください。
    region_id = 'cn-hangzhou'
    # Alibaba Cloud アカウントの AccessKey はすべての API へのアクセス権限を持っているため、RAM ユーザーを使用して API アクセスまたは日常的な運用を行うことを推奨します。
    # AccessKey ID と AccessKey Secret をプロジェクトコードに保存しないことを強く推奨します。そうしないと、AccessKey が漏洩し、アカウント内のすべてのリソースのセキュリティが脅かされる可能性があります。
    # この例では、Credentials SDK がデフォルトで環境変数から AccessKey を読み取り、認証を行います。
    cred = CredClient()

    # 1. クライアントを作成します。
    workspace_client = AIWorkspaceClient(
        config=Config(
            credential=cred,
            region_id=region_id,
            endpoint="aiworkspace.{}.aliyuncs.com".format(region_id),
        )
    )

    dlc_client = DLCClient(
         config=Config(
            credential=cred,
            region_id=region_id,
            endpoint='pai-dlc.{}.aliyuncs.com'.format(region_id),
         )
    )

    print('------- Workspaces -----------')
    # ワークスペースリストを取得します。パラメーター workspace_name に作成したワークスペース名を入力することもできます。
    workspaces = workspace_client.list_workspaces(ListWorkspacesRequest(
        page_number=1, page_size=1, workspace_name='',
        module_list='PAI'
    ))
    for workspace in workspaces.body.workspaces:
        print(workspace.workspace_name, workspace.workspace_id,
              workspace.status, workspace.creator)

    if len(workspaces.body.workspaces) == 0:
        raise RuntimeError('found no workspaces')

    workspace_id = workspaces.body.workspaces[0].workspace_id

    print('------- Images ------------')
    # イメージリストを取得します。
    images = workspace_client.list_images(ListImagesRequest(
        labels=','.join(['system.supported.dlc=true',
                         'system.framework=Tensorflow 1.15',
                         'system.pythonVersion=3.6',
                         'system.chipType=CPU'])))
    for image in images.body.images:
        print(json.dumps(image.to_map(), indent=2))

    image_uri = images.body.images[0].image_uri

    print('------- Datasets ----------')
    # データセットを取得します。
    datasets = workspace_client.list_datasets(ListDatasetsRequest(
        workspace_id=workspace_id,
        name='example-nas-data', properties='DIRECTORY'))
    for dataset in datasets.body.datasets:
        print(dataset.name, dataset.dataset_id, dataset.uri, dataset.options)

    if len(datasets.body.datasets) == 0:
        # 現在のデータセットが存在しない場合、データセットを作成します。
        dataset_id = create_nas_dataset(
            client=workspace_client,
            region=region_id,
            workspace_id=workspace_id,
            name='example-nas-data',
            # NAS ファイルシステム ID。
            # 汎用型 NAS:31a8e4****。
            # Extreme 型 NAS:extreme- で始まる必要があります。例:extreme-0015****。
            # CPFS:cpfs- で始まる必要があります。例:cpfs-125487****。
            nas_id='***',
            nas_path='/',
            mount_path='/mnt/data/nas')
        print('create dataset with id: {}'.format(dataset_id))
    else:
        dataset_id = datasets.body.datasets[0].dataset_id

    print('------- Code Sources ----------')
    # コードソースリストを取得します。
    code_sources = workspace_client.list_code_sources(ListCodeSourcesRequest(
        workspace_id=workspace_id))
    for code_source in code_sources.body.code_sources:
        print(code_source.display_name, code_source.code_source_id, code_source.code_repo)

    print('-------- ECS SPECS ----------')
    # DLC のノード仕様リストを取得します。
    ecs_specs = dlc_client.list_ecs_specs(ListEcsSpecsRequest(page_size=100, sort_by='Memory', order='asc'))
    for spec in ecs_specs.body.ecs_specs:
        print(spec.instance_type, spec.cpu, spec.memory, spec.gpu, spec.gpu_type)

    print('-------- Create Job ----------')
    # DLC ジョブを作成します。
    create_job_resp = dlc_client.create_job(CreateJobRequest().from_map({
        'WorkspaceId': workspace_id,
        'DisplayName': 'sample-dlc-job',
        'JobType': 'TFJob',
        'JobSpecs': [
            {
                "Type": "Worker",
                "Image": image_uri,
                "PodCount": 1,
                "EcsSpec": ecs_specs.body.ecs_specs[0].instance_type,
            },
        ],
        "UserCommand": "echo 'Hello World' && ls -R /mnt/data/ && sleep 30 && echo 'DONE'",
        'DataSources': [
            {
                "DataSourceId": dataset_id,
            },
        ],
    }))
    job_id = create_job_resp.body.job_id

    wait_for_job_to_terminate(dlc_client, job_id)

    print('-------- List Jobs ----------')
    # DLC のジョブリストを取得します。
    jobs = dlc_client.list_jobs(ListJobsRequest(
        workspace_id=workspace_id,
        page_number=1,
        page_size=10,
    ))
    for job in jobs.body.jobs:
        print(job.display_name, job.job_id, job.workspace_name,
              job.status, job.job_type)
    pass

if __name__ == '__main__':
    main()

サブスクリプションリソースクォータを使用したジョブの投入

  1. PAI コンソールにログインします。

  2. ワークスペース ID を確認します。左側のナビゲーションペインで [ワークスペースリスト] をクリックします。対象のワークスペースを見つけ、その名前の横にある ⓘ アイコンをクリックし、表示される情報パネルで [ワークスペースID] を確認してコピーします。

  3. 専用リソースグループのリソースクォータ ID を確認します。左側のナビゲーションペインで、[AI コンピューティングリソース] > [リソースクォータ] を選択します。[汎用コンピューティングリソース] タブをクリックし、リソースクォータリストの [名前/ID] 列から対象のリソースクォータのクォータ ID を取得します。

  4. 次のコードを使用してジョブを作成し、投入します。使用できるパブリックイメージのリストについては、「ステップ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

スポット割引を入札方法として使用します。

注:
  • SpotDiscountLimitSpotPriceLimit を同時に設定することはできません。

  • Lingjun スポットリソースの場合、入札タイプとして SpotDiscountLimit のみがサポートされています。

SpotPriceLimit

スポット価格を入札方法として使用します。

UserVpc

Lingjun スポットリソースを使用してジョブを投入する場合は必須です。ジョブが実行されるリージョンの VPC、vSwitch、およびセキュリティグループ ID を設定します。

説明

API を呼び出すか SDK を使用して DLC ジョブを作成する (createJob) 場合、ローカルのコードファイルを直接アップロードすることはできません。まず、次のいずれかの場所にコードをアップロードしてください。

  • Git リポジトリ:AI アセット管理でコード設定を作成し、Git リポジトリの URL にリンクします。

  • OSS ストレージ:コードを OSS にアップロードした後、データセットとしてマウントすることでジョブで使用できるようにします。

  • カスタムイメージ:コードを Docker イメージにパッケージ化します。

コマンドライン

ステップ1:クライアントのダウンロードとユーザー認証の完了

オペレーティングシステムに応じて、Linux 64 ビットまたは Mac クライアントツールをダウンロードし、ユーザー認証を完了します。詳細については、「開始する前に」をご参照ください。

ステップ2:ジョブの投入

  1. PAI コンソールにログインします。

  2. 次の手順に従って、ワークスペースリストページでワークスペース ID (WorkspaceID) を確認します。

    左側のナビゲーションペインで [ワークスペースリスト] をクリックします。対象のワークスペースを見つけ、その名前の右側にある ⓘ アイコンをクリックし、表示される情報パネルで [ワークスペースID] を確認します。

  3. 次の手順に従って、リソースクォータ ID を確認します。

    左側のナビゲーションペインで、[AI コンピューティングリソース] > [リソースクォータ] を選択します。対象のリソースタイプのタブ ([汎用コンピューティングリソース] など) を選択し、リソースクォータリストの [名前/ID] 列からリソースクォータ ID を取得します。

  4. 次の内容に基づいてパラメーターファイル 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>
  5. 次のサンプルコードを使用して params_file パラメーターを渡します。これにより、DLC ジョブが指定されたワークスペースとリソースクォータに投入されます。

    ./dlc submit tfjob --job_file  ./tfjob.params
  6. 次のコマンドを使用して、投入した DLC ジョブを確認します。

    ./dlc get job <jobID>

詳細パラメーターリスト

パラメーター (キー)

サポートされるフレームワークタイプ

説明

パラメーター値

ReleaseResourcePolicy

ALL

カスタムリソース解放ポリシーを設定します。このパラメーターはオプションです。未設定の場合、ジョブ終了時にすべての Pod リソースが解放されます。設定する場合、サポートされる値は pod-exit のみで、Pod が終了するとその Pod のリソースを解放します。

pod-exit

EnableJumboFrame

ALL

ジャンボフレームを有効にするかどうかを指定します。このパラメーターは、AI コンピューティングリソース - 汎用コンピューティング 2.0 でのみサポートされています。デフォルト値は false で、無効を意味します。

true または false

EnableNvidiaIBGDA

ALL

GPU ドライバーがロードされるときに IBGDA を有効にするかどうかを指定します。

true または false

EnableNvidiaGDRCopy

ALL

GDRCopy カーネルモジュールをインストールするかどうかを指定します。現在インストールされているバージョンは 2.4.4 です。

true または false

EnablePaiNUMACoreBinding

ALL

NUMA を有効にするかどうかを指定します。

true または false

EnableResourcePreCheck

ALL

ジョブを投入する際、このパラメーターは、クォータ内の総リソース (ノード仕様) がジョブ内のすべてのロールの仕様を満たしているかどうかをチェックします。

true または false

createSvcForAllWorkers

PyTorch

ワーカー間のネットワーク接続を許可するかどうかを指定します。

  • true に設定すると、すべての PyTorch ワーカーがネットワーク経由で相互に通信できます。

  • false に設定するか、未設定の場合、デフォルトではマスターのみがアクセス可能です。

これを有効にすると、各ワーカーのドメイン名はワーカー名 (dlcxxxxx-master-0 など) になります。ジョブ名 (dlcxxxxx) は、JOB_NAME 環境変数を通じてワーカーに渡されます。これにより、アクセスしたい特定のワーカーのドメイン名を特定できます。

true または false

customPortList

PyTorch

各ワーカーで公開されるネットワークポートを定義できます。このパラメーターを createSvcForAllWorkers と組み合わせて使用すると、ワーカー間のネットワーク接続を有効にできます。

未設定の場合、デフォルトではマスターでポート 23456 のみが公開されます。このカスタムポートリストにポート 23456 を含めないでください。

重要

このパラメーターは customPortNumPerWorker と相互排他的です。両方を同時に設定しないでください。

セミコロンで区切られた文字列のセット。各文字列は単一のポート番号、またはハイフンで接続されたポート範囲です (10000;10001-10010 など。これは 10000 から 10010 までの 11 個の連続したポート番号に変換されます)。

customPortNumPerWorker

PyTorch

各ワーカーで公開するネットワークポートの数を要求できます。このパラメーターを createSvcForAllWorkers と併用して、ワーカー間のネットワーク接続を有効にできます。

未設定の場合、デフォルトではマスターでポート 23456 のみが公開されます。DLC は、パラメーターで定義されたポート数に基づいて、ワーカーにポートをランダムに割り当てます。割り当てられたポート番号は、CUSTOM_PORTS 環境変数を通じてワーカーに渡され、参照できます。形式は、セミコロンで区切られたポート番号のセットです。

重要
  • このパラメーターは customPortList と同時に設定できません。

  • Lingjun コンピューティングリソースはカスタムポートをサポートしていません。したがって、Lingjun コンピューティングリソースを使用して DLC ジョブを投入する場合、customPortNumPerWorker パラメーターはサポートされません。

整数 (最大:65536)

RayRuntimeEnv

Ray

フレームワークが Ray の場合、RayRuntimeEnv を手動で設定してランタイム環境を定義できます。

重要

環境変数とサードパーティライブラリの設定は、この設定によって上書きされます。

環境変数とサードパーティライブラリを設定します ({pip: requirements.txt, env_vars: {key: value}})

RayRedisAddress

Ray

外部 GCS Redis アドレス。

文字列

RayRedisUsername

Ray

外部 GCS Redis ユーザー名。

文字列

RayRedisPassword

Ray

外部 GCS Redis パスワード。

文字列

RaySubmitterBackoffLimit

Ray

サブミッターの再試行回数。

正の整数 (int)

RayObjectStoreMemoryBytes

Ray

ノードの共有メモリを設定します。例えば、各ノードに 1 GiB の共有メモリを設定するには、次の設定を使用します。

{
  "RayObjectStoreMemoryBytes": "1073741824"
}

正の整数 (int)