Platform for AI (PAI) では、特定のユースケース向けにカスタムコンポーネントを作成できます。これらのカスタムコンポーネントを Designer で公式の PAI コンポーネントと接続することで、より柔軟なパイプラインを構築できます。この記事では、カスタムコンポーネントの作成方法について説明します。
背景情報
カスタムコンポーネントは、Kubernetes をベースとした Alibaba Cloud のオープンソース AI ワークロード管理フレームワークである KubeDL 上に構築されています。
カスタムコンポーネントを作成する際、TensorFlow、PyTorch、XGBoost、ElasticBatch などのジョブタイプを選択し、入力および出力パイプラインを作成し、ハイパーパラメータを設定できます。カスタムコンポーネントを作成すると、Designer はその設定を視覚的な設定パネルに変換します。詳細については、「手順」をご参照ください。
-
KubeDL は、各ジョブタイプに対して同期された環境変数のセットを提供します。これらの変数を使用して、インスタンス数やトポロジ情報を取得できます。詳細については、「付録1:ジョブタイプ」をご参照ください。
-
コマンドで環境変数を設定することで、入力および出力パイプラインからデータを読み取り、ハイパーパラメータデータにアクセスできます。詳細については、「パイプラインとハイパーパラメータデータの読み取り」をご参照ください。
-
実行コードでは、環境変数を通じて、またはコンテナ内のマウントパスを直接使用して、入力または出力パイプラインにアクセスできます。詳細については、「入出力ディレクトリ構造」をご参照ください。
前提条件
ワークスペースが必要です。作成するすべてのカスタムコンポーネントは、このワークスペースに関連付けられます。詳細については、「ワークスペースの作成と管理」をご参照ください。
手順
-
コンポーネント管理ページに移動します。
-
PAI コンソールにログインします。
-
左側のナビゲーションウィンドウで、 ワークスペースの一覧 をクリックします。[Workspaces] ページで、対象のワークスペースの名前をクリックします。
-
左側のナビゲーションウィンドウで、 AI アセット管理 > カスタムコンポーネント を選択します。
-
-
コンポーネントリストページで、 [New Component] をクリックします。[New Component] ページで、次のパラメータを設定します。
-
基本情報
パラメータ
説明
[コンポーネント名]
カスタムコンポーネントの名前。名前は、同一リージョン内の Alibaba Cloud アカウントで一意である必要があります。
[コンポーネントの説明]
カスタムコンポーネントを他と区別するための簡単な説明。
[コンポーネントバージョン]
作成するカスタムコンポーネントのバージョン番号。
説明バージョンの管理には、
x.y.zバージョニング形式を使用することをお勧めします。たとえば、最初のメジャーバージョンを 1.0.0 に設定できます。マイナーなバグ修正の場合、バージョン番号を 1.0.1 に更新できます。マイナーな機能アップグレードの場合、バージョン番号を 1.1.0 に更新できます。このバージョニング方法は明確でわかりやすく、バージョン間の違いと更新を理解するのに役立ちます。[バージョン説明]
カスタムコンポーネントの現在のバージョンの説明。例: Initial version。
-
実行設定
パラメータ
説明
[タスクの種類]
カスタムコンポーネントを作成する際には、ジョブタイプを選択する必要があります。PAI は TensorFlow、 PyTorch、 XGBoost、および ElasticBatch をサポートしており、これらは KubeDL の TFJob、 PyTorchJob、 XGBoostJob、および ElasticBatchJob タイプに対応しています。各ジョブタイプの詳細については、「付録1:ジョブタイプ」をご参照ください。
[イメージ]
[コミュニティイメージ]、 [Alibaba Cloud イメージ]、または [カスタムイメージ] を選択できます。また、 イメージアドレス タブでこれらのいずれかのイメージタイプのアドレスを設定することもできます。
説明-
ジョブの安定性を確保するために、ワークスペースと同じリージョンにある Container Registry (ACR) のイメージを使用してください。パブリックネットワークの帯域幅には制限があります。
-
現在、ACR は個人版のみサポートされており、エンタープライズ版はサポートされていません。イメージアドレスは、
registry-vpc.${region}.aliyuncs.com形式の VPC アドレスである必要があります。 -
頻繁な更新はイメージキャッシュの更新を遅らせ、ジョブの起動時間を増加させる可能性があります。
-
イメージが正常に実行されるように、イメージには
sh シェルコマンドが含まれている必要があります。さらに、イメージ内のコマンドはsh -cを使用して実行されます。 -
カスタムイメージを使用する場合、Python 実行環境と pip コマンドが含まれていることを確認してください。含まれていない場合、ジョブが失敗する可能性があります。
[コード]
カスタムコンポーネントのコードは、OSS ディレクトリまたは Git リポジトリから取得できます:
-
OSS マウント: コンポーネントが実行されると、マウントされた OSS ディレクトリ内のすべてのファイルが
/ml/usercode/ディレクトリにダウンロードされます。その後、コマンドを使用してこれらのファイルを実行できます。説明-
このディレクトリには、現在のアルゴリズムに不可欠なファイルのみを保存することを推奨します。不要なファイルを含めると、コンポーネントの起動時間が長くなったり、タイムアウトが発生したりする可能性があります。
-
コードディレクトリに requirements.txt ファイルが存在する場合、アルゴリズムランタイムは自動的に
pip install -r requirements.txtを実行して、必要な依存関係をインストールします。
-
-
PAI コード設定:Git リポジトリを設定します。
[コマンドの実行]
コンポーネントのイメージで実行するコマンド。環境変数を使用して、実行時に実際の値を取得できます。設定形式は次のとおりです:
python main.py $PAI_USER_ARGS --{CHANNEL_NAME} $PAI_INPUT_{CHANNEL_NAME} --{CHANNEL_NAME} $PAI_OUTPUT_{CHANNEL_NAME} && sleep 150 && echo "job finished"コマンドでは、 PAI_USER_ARGS、 PAI_INPUT_{CHANNEL_NAME}、および PAI_OUTPUT_{CHANNEL_NAME} 環境変数を使用して、ハイパーパラメータ、入力パイプライン、および出力パイプラインのデータを読み取ることができます。このデータの読み取り方法の詳細については、「パイプラインとハイパーパラメータデータの読み取り」をご参照ください。
たとえば、入力パイプラインの名前が test と train で、出力パイプラインの名前が model と checkpoints の場合、コマンドは次のようになります:
python main.py $PAI_USER_ARGS --train $PAI_INPUT_TRAIN --test $PAI_INPUT_TEST --model $PAI_OUTPUT_MODEL --checkpoints $PAI_OUTPUT_CHECKPOINTS && sleep 150 && echo "job finished"付属のエントリポイントファイル main.py には、引数をパースするロジックの例が記述されています。このファイルに独自のアルゴリズムロジックを統合できます。以下はその内容の例です:
import os import argparse import json def parse_args(): """スクリプトに渡された引数をパースします。""" parser = argparse.ArgumentParser(description="PythonV2 コンポーネントスクリプトの例。") # 入力および出力チャネル parser.add_argument("--train", type=str, default=None, help="入力チャネル train。") parser.add_argument("--test", type=str, default=None, help="入力チャネル test。") parser.add_argument("--model", type=str, default=None, help="出力チャネル model。") parser.add_argument("--checkpoints", type=str, default=None, help="出力チャネル checkpoints。") # パラメータ parser.add_argument("--param1", type=int, default=None, help="パラメータ1") parser.add_argument("--param2", type=float, default=None, help="パラメータ2") parser.add_argument("--param3", type=str, default=None, help="パラメータ3") parser.add_argument("--param4", type=bool, default=None, help="パラメータ4") parser.add_argument("--param5", type=int, default=None, help="パラメータ5") args, _ = parser.parse_known_args() return args if __name__ == "__main__": args = parse_args() print("Input channel train={}".format(args.train)) print("Input channel test={}".format(args.test)) print("Output channel model={}".format(args.model)) print("Output channel checkpoints={}".format(args.checkpoints)) print("Parameters param1={}".format(args.param1)) print("Parameters param2={}".format(args.param2)) print("Parameters param3={}".format(args.param3)) print("Parameters param4={}".format(args.param4)) print("Parameters param5={}".format(args.param5))サンプルコードが実行されると、次のログが出力されます。この方法で、ジョブのパラメータ情報にアクセスできます:
Input channel train=/ml/input/data/train Input channel test=/ml/input/data/test/easyrec_config.config Output channel model=/ml/output/model/ Output channel checkpoints=/ml/output/checkpoints/ Parameters param1=6 Parameters param2=0.3 Parameters param3=test1 Parameters param4=True Parameters param5=2 job finished -
-
パイプラインとパラメータ
をクリックして、カスタムコンポーネントの入力パイプライン、出力パイプライン、およびパラメータを設定します。以下の命名規則に従ってください:-
名前はグローバルに一意である必要があります。
-
名前には、数字、英字、アンダースコア (_)、ハイフン (-) を含めることができますが、アンダースコアで始めることはできません。
説明名前に環境変数でサポートされていない文字 (使用できるのは英字、数字、アンダースコアのみです) が含まれている場合、環境変数が生成される際にこれらの文字はアンダースコアに置き換えられます。さらに、小文字はすべて大文字に変換されます。この変換後に同一になる可能性のある名前は使用しないでください。たとえば、test_model と test-model のようなパラメータ名は、両方とも
PAI_HPS_TEST_MODELとなり、競合を引き起こします。
次の表にパラメータを示します。
パラメータ
説明
[入力]
入力パイプラインは、カスタムコンポーネントに入力データまたはファインチューニング用のモデルを提供します。次のパラメータを設定できます:
-
[Input Name]: 入力パイプラインの名前。命名要件については UI をご参照ください。
-
[入力ソース]: 入力パイプラインがデータを読み込むソースとして、OSS、NAS、または MaxCompute のパスを指定します。入力データは、トレーニングコンテナ内の
/ml/input/data/{channel_name}/ディレクトリにマウントされます。これにより、コンポーネントはローカルファイルを読み込むことで、OSS、NAS、または MaxCompute のデータを読み込むことができます。
[出力]
出力パイプラインは、トレーニング済みモデルやチェックポイントなどの結果を保存します。次のパラメータを設定できます:
-
[出力名]: 出力パイプラインの名前。命名要件については UI をご参照ください。
-
[ストレージクラス]: 出力パイプラインごとに、OSS または MaxCompute のディレクトリを指定する必要があります。このディレクトリは、トレーニングコンテナ内の
/ml/output/{channel_name}/パスにマウントされます。
[パラメータ]
次のハイパーパラメータを設定します:
-
[パラメーター名]: パラメータの名前。命名要件については UI をご参照ください。
-
[パラメータタイプ]: サポートされている型は Int、Float、String、および Bool です。
-
Constraint: Bool 以外の型 (Int、Float、または String) を選択した後、 デフォルト値 列の 制約 をクリックしてパラメータの制約を設定します。制約タイプは次のとおりです:
-
[範囲]: 最大値と最小値を設定して値の範囲を指定します。
-
[列挙]: パラメータの列挙値のリストを定義します。
-
-
-
トレーニング制約
トレーニング制約は、トレーニングジョブのコンピューティングリソースを定義します。 [Enable Training Constraints] スイッチをオンにして設定します。
これらの制約は、パイプラインでこのコンポーネントを使用する際に [Execution Tuning] パネルで利用可能なオプション ( [Instance Type]、 [Specification]、 [Number of Instances]、 [Max Running Time (sec)] など) を制限します。
次の表にパラメータを示します。
パラメータ
説明
[Machine Type]
カスタムコンポーネントが CPU インスタンスまたは GPU インスタンスのどちらで実行されるかを指定します。
[Support Multi-machine]
コンポーネントが複数マシンでの分散実行をサポートするかどうかを設定します:
-
[サポート]: コンポーネントの実行時に、ノード数を設定できます。
-
[非対応]: コンポーネントの実行時に、ノード数は 1 に固定され、変更できません。
[Support Multi-GPU]
このパラメータは、 [Machine Type] に GPU を選択した場合にのみ使用できます。
カスタムコンポーネントが複数の GPU をサポートするかどうかを設定します:
-
[サポート]: [Instance Type] にシングル GPU またはマルチ GPU のインスタンスを選択できます。
-
[非対応]: [Instance Type] にはシングル GPU インスタンスのみ選択できます。
-
-
-
コミット をクリックします。
新しく作成されたカスタムコンポーネントがコンポーネントリストページに表示されます。
コンポーネントが作成された後、 Designer で使用できます。詳細については、「カスタムコンポーネントの使用」をご参照ください。
付録1:ジョブタイプ
TensorFlow (TFJob)
カスタムコンポーネントのジョブタイプが TensorFlow (TFJob) の場合、ジョブのノードトポロジ情報は TF_CONFIG 環境変数を介して渡されます。次の例は、環境変数の値の形式を示しています:
{
"cluster": {
"chief": [
"dlc17****iui3e94-chief-0.t104140334615****.svc:2222"
],
"evaluator": [
"dlc17****iui3e94-evaluator-0.t104140334615****.svc:2222"
],
"ps": [
"dlc17****iui3e94-ps-0.t104140334615****.svc:2222"
],
"worker": [
"dlc17****iui3e94-worker-0.t104140334615****.svc:2222",
"dlc17****iui3e94-worker-1.t104140334615****.svc:2222",
"dlc17****iui3e94-worker-2.t104140334615****.svc:2222",
"dlc17****iui3e94-worker-3.t104140334615****.svc:2222"
]
},
"task": {
"type": "chief",
"index": 0
}
}
主要なパラメータは次のとおりです:
|
パラメータ |
説明 |
|
cluster |
TensorFlow クラスターの説明。これはマップ型です:
|
|
task |
|
PyTorch (PyTorchJob)
カスタムコンポーネントのジョブタイプが PyTorch (PyTorchJob) の場合、次の環境変数が設定されます:
-
RANK: 値が 0 の場合は現在のノードがマスターノードであることを示します。0 以外の値はワーカーノードを示します。
-
WORLD_SIZE: ジョブ内のマシンの総数。
-
MASTER_ADDR: マスターノードのアドレス。
-
MASTER_PORT: マスターノードのポート。
XGBoost (XGBoostJob)
カスタムコンポーネントのジョブタイプが XGBoost (XGBoostJob) の場合、次の環境変数が設定されます:
-
RANK: 値が 0 の場合は現在のノードがマスターノードであることを示します。0 以外の値はワーカーノードを示します。
-
WORLD_SIZE: ジョブ内のマシンの総数。
-
MASTER_ADDR: マスターノードのアドレス。
-
MASTER_PORT: マスターノードのポート。
-
WORKER_ADDRS: RANK 順にソートされたワーカーノードのアドレス。
-
WORKER_PORT: ワーカーノードのポート。
以下に例を示します:
-
分散ジョブ (1 ノード以上)
WORLD_SIZE=6 WORKER_ADDRS=train1pt84cj****-worker-0,train1pt84cj****-worker-1,train1pt84cj****-worker-2,train1pt84cj****-worker-3,train1pt84cj****-worker-4 MASTER_PORT=9999 MASTER_ADDR=train1pt84cj****-master-0 RANK=0 WORKER_PORT=9999 -
単一ノードジョブ
説明ノードが 1 つしかない場合、それがマスターノードとして機能します。この場合、
WORKER_ADDRSおよびWORKER_PORT環境変数は設定されません。WORLD_SIZE=1 MASTER_PORT=9999 MASTER_ADDR=train1pt84cj****-master-0 RANK=0
ElasticBatch (ElasticBatchJob)
ElasticBatch は、分散型、弾力的、オフラインのバッチ推論用に設計されたジョブタイプです。ElasticBatch ジョブには次の特徴があります:
-
スループット向上のための簡単な並列化。
-
ジョブの待機時間を大幅に短縮。一部のワーカーノードにリソースがあれば、すぐにジョブを開始できます。
-
遅いマシンを自動的に検出し、バックアップワーカーを起動して置き換えることで、ロングテールレイテンシやジョブのハングを防ぎます。
-
データシャードをグローバルかつ動的に分散し、より高速なノードがより多くのデータを処理できるようにします。
-
早期停止をサポート。すべてのデータが処理された後、未起動のワーカーは起動されず、ジョブの総実行時間の増加を防ぎます。
-
フォールトトレランスを提供。単一のワーカーが失敗した場合、自動的に再起動されます。
ElasticBatch ジョブは、AIMaster と Worker の 2 種類のノードで構成されます。
-
AIMaster: データシャードの動的分散、各ワーカーのデータスループットの監視、フォールトトレランスなど、ジョブのグローバルな管理を担当します。
-
Worker: ワーカーノードは AIMaster からデータシャードを取得し、データを処理し、結果を書き戻してから次のシャードを取得します。この動的なプロセスにより、高速なノードはより多くのデータを処理し、低速なノードはより少ないデータを処理できます。
ElasticBatch ジョブが開始されると、AIMaster ノードとワーカーノードが起動します。コードはワーカーノードで実行されます。 ELASTICBATCH_CONFIG 環境変数がワーカーノードに設定されます。以下はその値の形式の例です:
{
"task": {
"type": "worker",
"index": 0
},
"environment": "cloud"
}
パラメータは次のとおりです:
-
task.type: 現在のノードのタスクタイプを示します。
-
task.index: そのロールのネットワークアドレスのリスト内での現在のノードのインデックス。
付録2:カスタムコンポーネントの仕組み
パイプラインとハイパーパラメータデータの読み取り
入力パイプラインデータの読み取り
各入力パイプラインのパスは、 PAI_INPUT_{CHANNEL_NAME} 環境変数を介してジョブのコンテナに渡されます。
例えば、カスタムコンポーネントに train と test の 2 つの入力パイプラインがあり、それぞれの値が oss://<YourOssBucket>.<OssEndpoint>/path-to-data/ と oss://<YourOssBucket>.<OssEndpoint>/path-to-data/test.csv である場合、注入される環境変数は以下の通りです。
PAI_INPUT_TRAIN=/ml/input/data/train/
PAI_INPUT_TEST=/ml/input/data/test/test.csv
出力パイプラインデータの読み取り
コンポーネントは、 PAI_OUTPUT_{CHANNEL_NAME} 環境変数から出力パイプラインのパスを取得します。
たとえば、カスタムコンポーネントに model と checkpoints という名前の 2 つの出力パイプラインがある場合、次の環境変数が設定されます:
PAI_OUTPUT_MODEL=/ml/output/model/
PAI_OUTPUT_CHECKPOINTS=/ml/output/checkpoints/
ハイパーパラメータデータの読み取り
次の環境変数を使用して、ハイパーパラメータデータを読み取ることができます:
-
PAI_USER_ARGS
コンポーネントが実行されると、ジョブのすべてのハイパーパラメーターは、PAI_USER_ARGS 環境変数として、
--{hyperparameter_name} {hyperparameter_value}という形式でトレーニングジョブのコンテナーに挿入されます。たとえば、トレーニングジョブがハイパーパラメーター
{"epochs": 10, "batch-size": 32, "learning-rate": 0.001}を指定する場合、PAI_USER_ARGS 環境変数の値は次のようになります。PAI_USER_ARGS="--epochs 10 --batch-size 32 --learning-rate 0.001" -
PAI_HPS_{HYPERPARAMETER_NAME}
各ハイパーパラメータの値は、個別の環境変数としてもジョブのコンテナに設定されます。ハイパーパラメータ名において、環境変数でサポートされていない文字 (使用できるのは英字、数字、アンダースコアのみです) はアンダースコアに置き換えられます。
例えば、トレーニングジョブがハイパーパラメータ
{"epochs": 10, "batch-size": 32, "train.learning_rate": 0.001}を指定する場合、対応する環境変数は以下のとおりです。PAI_HPS_EPOCHS=10 PAI_HPS_BATCH_SIZE=32 PAI_HPS_TRAIN_LEARNING_RATE=0.001 -
PAI_HPS
すべてのハイパーパラメータは、JSON 形式で PAI_HPS 環境変数としてジョブのコンテナに設定されます。
たとえば、トレーニングジョブがハイパーパラメータ
{"epochs": 10, "batch-size": 32}を渡した場合、PAI_HPS 環境変数の値は次のようになります。PAI_HPS={"epochs": 10, "batch-size": 32}
入出力ディレクトリ構造
実行コードでは、環境変数を使用する以外に、マウントパスを介して直接入力および出力パイプラインにアクセスすることもできます。コンポーネントのジョブがコンテナで実行されると、システムは次のディレクトリ構造を作成します:
-
コードパス:
/ml/usercode/。 -
ハイパーパラメーター設定ファイル:
/ml/input/config/hyperparameters.json。 -
トレーニングジョブの完全な設定ファイルは
/ml/input/config/training_job.jsonです。 -
入力パイプラインのディレクトリパス:
/ml/input/data/{channel_name}/。 -
出力パイプラインのディレクトリパス:
/ml/output/{channel_name}/。
以下は、カスタムコンポーネントによって実行されるジョブの入出力ディレクトリ構造の完全な例です:
/ml
|-- usercode # ユーザーコードは `/ml/usercode` ディレクトリにロードされます。これはユーザーコードの作業ディレクトリでもあります。このパスは `PAI_WORKING_DIR` 環境変数から取得できます。
| |-- requirements.txt
| |-- main.py
|-- input # ジョブの入力データと設定。
| |-- config # `config` ディレクトリにはジョブの設定情報が含まれます。このパスは `PAI_CONFIG_DIR` 環境変数から取得できます。
| |-- training_job.json # 完全なジョブ設定。
| |-- hyperparameters.json # トレーニングジョブのハイパーパラメータ。
| |-- data # ジョブの `InputChannels`:次のディレクトリには `train_data` と `test_data` の 2 つのチャネルが含まれます。
| |-- test_data
| | |-- test.csv
| |-- train_data
| |-- train.csv
|-- output # ジョブの `OutputChannels`:この例には `model` と `checkpoints` の 2 つの出力チャネルがあります。
|-- model # 出力パスは `PAI_OUTPUT_{OUTPUT_CHANNEL_NAME}` 環境変数から取得できます。
|-- checkpoints
GPU 数の特定
タスクが開始されると、環境変数 NVIDIA_VISIBLE_DEVICES を使用して、現在のマシンに GPU があるかどうか、および GPU カードの数を確認できます。たとえば、NVIDIA_VISIBLE_DEVICES=0,1,2,3 は、現在のマシンに 4 つの GPU カードがあることを示します。