Platform for AI (PAI) では、特定のユースケースに合わせてカスタムコンポーネントを作成できます。これらのカスタムコンポーネントを Designer の公式 PAI コンポーネントと接続することで、より柔軟なパイプラインを構築できます。このドキュメントでは、カスタムコンポーネントの作成方法について説明します。
背景情報
カスタムコンポーネントは、Kubernetes をベースにした Alibaba Cloud のオープンソース AI ワークロード管理フレームワークである KubeDL 上に構築されています。
カスタムコンポーネントを作成する際に、TensorFlow、PyTorch、XGBoost、ElasticBatch などのジョブタイプを選択し、入力および出力パイプラインを作成し、ハイパーパラメーターを設定できます。カスタムコンポーネントを作成すると、Designer はその設定を視覚的な設定パネルに変換します。詳細については、「操作手順」をご参照ください。
KubeDL は、各ジョブタイプに対して同期された環境変数のセットを提供します。これらの変数を使用して、インスタンス数やトポロジー情報を取得できます。詳細については、「付録1:ジョブタイプ」をご参照ください。
コマンドで環境変数を設定することで、入力および出力パイプラインからデータを読み取り、ハイパーパラメーターデータにアクセスできます。詳細については、「パイプラインとハイパーパラメーターデータの読み取り方法」をご参照ください。
実行コードでは、環境変数を通じて、またはコンテナ内のマウントパスを直接使用して、入力または出力パイプラインにアクセスできます。詳細については、「入出力ディレクトリ構造」をご参照ください。
前提条件
ワークスペースが必要です。作成するすべてのカスタムコンポーネントは、このワークスペースにバインドされます。詳細については、「ワークスペースの作成と管理」をご参照ください。
操作手順
コンポーネント管理ページに移動します。
PAI コンソールにログインします。
左側のナビゲーションウィンドウで、Workspaces をクリックします。ワークスペースページで、対象のワークスペース名をクリックします。
左側のナビゲーションウィンドウで、AI Computing Asset Management > Custom Components を選択します。
コンポーネントリストページで、[新しいコンポーネント] をクリックします。[新しいコンポーネント] ページで、次のパラメーターを設定します。
基本情報
パラメーター
説明
Component Name
カスタムコンポーネントの名前。同じリージョン内のご自身の Alibaba Cloud アカウント内で一意である必要があります。
Description
他のコンポーネントと区別するための、カスタムコンポーネントの簡単な説明。
Component Version
作成するカスタムコンポーネントのバージョン番号。
説明x.y.zのバージョン管理フォーマットを使用してバージョンを管理することを推奨します。たとえば、最初のメジャーバージョンを 1.0.0 に設定できます。軽微なバグ修正の場合は、バージョン番号を 1.0.1 に更新できます。軽微な機能のスペックアップの場合は、バージョン番号を 1.1.0 に更新できます。このバージョン管理メソッドは明確でわかりやすく、バージョン間の違いや更新内容を理解するのに役立ちます。Version Description
カスタムコンポーネントの現在のバージョンの説明。例:初期バージョン。
実行設定
パラメーター
説明
Job type
カスタムコンポーネントを作成する際には、ジョブタイプを選択する必要があります。PAI は TensorFlow、PyTorch、XGBoost、ElasticBatch をサポートしており、これらは KubeDL の TFJob、PyTorchJob、XGBoostJob、および ElasticBatchJob タイプに対応しています。各ジョブタイプの詳細については、「付録:ジョブタイプ」をご参照ください。
画像
Community Image、Alibaba Cloud Image、または Custom Image を選択できます。 また、Image URL タブでこれらのイメージのアドレスを設定することもできます。
説明ジョブの安定性を確保するため、ワークスペースと同じリージョンにある Container Registry (ACR) のイメージを使用してください。パブリックネットワークの帯域幅は制限されています。
現在サポートされているのは ACR Personal Edition のみで、Enterprise Edition はサポートされていません。イメージアドレスは、
registry-vpc.${region}.aliyuncs.comのフォーマットの VPC アドレスである必要があります。頻繁な更新はイメージキャッシュの更新を遅らせ、ジョブの起動時間を増加させる可能性があります。
イメージが正しく実行されることを保証するため、イメージには
sh shellコマンドが含まれている必要があります。さらに、イメージ内のコマンドはsh -cを使用して実行されます。カスタムイメージを使用する場合、Python 実行環境と pip コマンドが含まれていることを確認してください。そうでない場合、ジョブが失敗する可能性があります。
[コード]
カスタムコンポーネントのコードは、OSS ディレクトリまたは Git リポジトリから取得できます。
OSS マウント:コンポーネントの実行時に、マウントされた OSS ディレクトリ内のすべてのファイルが
/ml/usercode/ディレクトリにダウンロードされます。その後、コマンドを使用してこれらのファイルを実行できます。説明このディレクトリには、現在のアルゴリズムに不可欠なファイルのみを保存することを推奨します。不要なファイルを含めると、コンポーネントの起動時間が長くなったり、タイムアウトの原因になったりする可能性があります。
コードディレクトリに requirements.txt ファイルが存在する場合、アルゴリズムのランタイムは自動的に
pip install -r requirements.txtを実行して、必要な依存関係をインストールします。
PAI コード設定:Git リポジトリを設定します。
Command
コンポーネントのイメージで実行するコマンド。環境変数を使用して、ランタイム時に実際の値を取得できます。設定フォーマットは次のとおりです。
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(): """Parse arguments passed to the script.""" parser = argparse.ArgumentParser(description="PythonV2 component script example.") # input & output channels parser.add_argument("--train", type=str, default=None, help="input channel train.") parser.add_argument("--test", type=str, default=None, help="input channel test.") parser.add_argument("--model", type=str, default=None, help="output channel model.") parser.add_argument("--checkpoints", type=str, default=None, help="output channel checkpoints.") # parameters parser.add_argument("--param1", type=int, default=None, help="param1") parser.add_argument("--param2", type=float, default=None, help="param2") parser.add_argument("--param3", type=str, default=None, help="param3") parser.add_argument("--param4", type=bool, default=None, help="param4") parser.add_argument("--param5", type=int, default=None, help="param5") 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 となり、競合を引き起こす) は使用しないでください。
次の図は、パイプラインとパラメーターの設定が Designer のコンポーネント UI にどのようにマッピングされるかを示しています。

次の表にパラメーターを説明します。
パラメーター
説明
Input
入力パイプラインは、カスタムコンポーネントに入力データまたはファインチューニング用のモデルを提供します。次のパラメーターを設定できます。
[入力名]:入力パイプラインの名前。命名要件については UI をご参照ください。
[入力ソース]:入力パイプラインが OSS、NAS、または MaxCompute のパスからデータを読み取ることを指定します。入力データは、トレーニングコンテナの
/ml/input/data/{channel_name}/ディレクトリにマウントされます。これにより、コンポーネントはローカルファイルを読み取ることで OSS、NAS、または MaxCompute からデータを読み取ることができます。
Output
出力パイプラインは、トレーニング済みモデルやチェックポイントなどの結果を保存します。次のパラメーターを設定できます。
Output Name:出力パイプラインの名前。命名要件については UI をご参照ください。
Storage:各出力パイプラインに対して、OSS または MaxCompute ディレクトリを指定する必要があります。このディレクトリは、トレーニングコンテナの
/ml/output/{channel_name}/パスにマウントされます。
Arguments
次のハイパーパラメーター設定を構成します。
Parameter Name:パラメーターの名前。命名要件については UI をご参照ください。
Type:サポートされているタイプは Int、Float、String、および Bool です。
制約:Bool 以外のタイプ (Int、Float、または String) を選択した後、Default Value 列の Constraints をクリックしてパラメーターの制約を設定します。制約タイプは次のとおりです。
Range:最大値と最小値を設定して値の範囲を指定します。
[列挙]:パラメーターの列挙値のリストを定義します。
トレーニング制約
トレーニング制約は、トレーニングジョブのコンピューティングリソースを定義します。[トレーニング制約を有効にする] スイッチをオンにして設定できます。
これらの制約は、パイプラインでこのコンポーネントを使用する際の [実行チューニング] パネルで利用可能なオプション ([インスタンスタイプ]、[仕様]、[インスタンス数]、[最大実行時間 (秒)] など) を制限します。
次の表にパラメーターを説明します。
パラメーター
説明
[マシンタイプ]
カスタムコンポーネントを CPU インスタンスで実行するか、GPU インスタンスで実行するかを指定します。
[複数マシン対応]
コンポーネントが複数マシンでの分散実行に対応しているかどうかを指定します:
Supported:コンポーネントの実行時に、ノード数を設定できます。
Not Supported:コンポーネントの実行時、ノード数は 1 に固定され、変更できません。
[複数 GPU 対応]
このパラメーターは、[マシンタイプ] で GPU を選択した場合にのみ使用できます。
カスタムコンポーネントが複数 GPU に対応しているかどうかを指定します:
Supported:[インスタンスタイプ] に、シングル GPU インスタンスまたはマルチ GPU インスタンスのいずれかを選択できます。
Not Supported:[インスタンスタイプ] には、シングル GPU インスタンスのみ選択できます。
Submit をクリックします。
新しく作成されたカスタムコンポーネントがコンポーネントリストページに表示されます。
コンポーネントが作成された後、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:ワーカーノードのポート。
以下に例を示します。
分散ジョブ (複数のノード)
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
コンポーネントの実行時に、ジョブのすべてのハイパーパラメーターは、
--{hyperparameter_name} {hyperparameter_value}のフォーマットで PAI_USER_ARGS 環境変数としてトレーニングジョブのコンテナに注入されます。たとえば、トレーニングジョブがハイパーパラメーター
{"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.001PAI_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} 環境変数から取得できます。
|-- checkpointsGPU 数の特定
タスクが開始された後、環境変数 NVIDIA_VISIBLE_DEVICES を使用して、現在のマシンに GPU があるかどうか、および GPU カードの数を確認できます。たとえば、NVIDIA_VISIBLE_DEVICES=0,1,2,3 は、現在のマシンに 4 枚の GPU カードがあることを示します。