Platform for AI (PAI) では、ビジネス要件に基づいてカスタムアルゴリズムコンポーネントを作成できます。 Machine Learning Designerでカスタムコンポーネントを組み込みコンポーネントと一緒に使用して、柔軟な方法でパイプラインを構築できます。 このトピックでは、カスタムコンポーネントを作成する方法について説明します。
背景情報
カスタムコンポーネントは、ワークロードを管理するためのKubernetesベースのAIフレームワークであるAlibaba CloudのオープンソースKubeDLを使用します。
カスタムコンポーネントを作成するときに、TensorFlow、PyTorch、XGBoost、ElasticBatchなど、コンポーネントを使用するジョブのタイプを選択できます。 入力および出力パイプラインを作成し、ハイパーパラメータを設定することもできます。 カスタムコンポーネントを作成したら、Machine Learning Designerでコンポーネントを構成できます。 詳細については、「手順」をご参照ください。
KubeDLは、ジョブタイプに基づいて環境変数を割り当てます。 環境変数を使用して、インスタンス数とトポロジ情報を取得できます。 詳細については、「付録1: ジョブの種類」をご参照ください。
環境変数を設定して入力および出力パイプラインのデータとハイパーパラメータを取得する方法については、「パイプラインハイパーパラメータデータの取得」をご参照ください。
コードで環境変数を使用して、入力および出力パイプラインデータを取得できます。 コンテナー内のマウントパスを使用してデータにアクセスすることもできます。 詳細については、「入出力ディレクトリ構造」をご参照ください。
制限事項
カスタムコンポーネントは、中国 (北京) 、中国 (上海) 、中国 (杭州) 、および中国 (深セン) のリージョンでのみ作成できます。
前提条件
ワークスペースが作成済み。 作成したカスタムコンポーネントは、ワークスペースに関連付けられています。 詳細については、「ワークスペースの作成」をご参照ください。
手順
[カスタムコンポーネント] ページに移動します。
最初に PAIコンソール にログインします。
左側のナビゲーションウィンドウで、[ワークスペース] をクリックします。 [ワークスペース] ページで、カスタムコンポーネントを作成するワークスペースの名前をクリックします。
左側のナビゲーションウィンドウで、[AI Computing Asset Management] > [カスタムコンポーネント] を選択します。
[カスタムコンポーネント] ページで、[コンポーネントの作成] をクリックします。 [コンポーネントの作成] ページで、次の表に示すパラメーターを設定します。
基本情報
パラメーター
説明
コンポーネント名
カスタムコンポーネントの名前。 名前は、同じリージョンのAlibaba Cloudアカウントで一意である必要があります。
コンポーネントの説明
カスタムコンポーネントの説明。
コンポーネントバージョン
カスタムコンポーネントのバージョン番号。
説明コンポーネントのバージョンを
x.y.z
形式で管理することを推奨します。 たとえば、最初のメジャーバージョンが1.0.0の場合、マイナーな問題を修正すると1.0.1に、マイナーな機能をアップグレードすると1.1.0にアップグレードできます。 これにより、コンポーネントのバージョンを簡単かつ効果的に管理できます。バージョンの説明
カスタムコンポーネントの現在のバージョンの説明。 例: 初期バージョン。
実行設定
パラメーター
説明
ジョブタイプ
カスタムコンポーネントを使用するジョブの種類。 有効な値: TFJobの場合はTensorflow、PyTorchJobの場合はPyTorch、XGBoostJobの場合はXGBoost、KubeDLのElasticBatchJobの場合はElasticBatch。 ジョブタイプの詳細については、「付録: ジョブタイプ」をご参照ください。
[イメージ]
使用するイメージ。The image that you want to use. 有効な値: コミュニティイメージ、Alibaba Cloudイメージ、カスタムイメージ。 ドロップダウンリストから画像を選択するか、[画像アドレス] を選択して画像アドレスを指定します。
説明ジョブの安定性を確保するため、同じリージョンでAlibaba Cloud Container Registry (ACR) を使用することを推奨します。
Container Registry Personal Editionのみを使用できます。 Container Registry Enterprise Editionはサポートされていません。 イメージアドレスを
registry-vpc.${regio n}.aliyuncs.com
形式で指定します。カスタムイメージを使用する場合は、同じバージョンのカスタムコンポーネントでイメージを頻繁に更新しないことをお勧めします。 イメージを頻繁に更新すると、イメージキャッシュが早い機会に更新されず、ジョブの起動が遅れることがあります。
イメージが期待どおりに実行されるようにするには、イメージに
sh shell
コマンドが含まれている必要があります。 イメージはsh -c
メソッドを使用してコマンドを実行します。カスタムイメージを使用する場合は、イメージに必要な環境とPython用のpipコマンドが含まれていることを確認してください。 それ以外の場合、プロセスが失敗する可能性があります。
コード
有効な値:
OSSパスのマウント: コンポーネントを実行すると、Object Storage Service (OSS) パス内のすべてのファイルが
/ml/usercode/
パスにダウンロードされます。 コマンドを実行して、パス内のファイルを実行できます。説明コンポーネントの起動中に潜在的な遅延やタイムアウトを防ぐために、必要なアルゴリズムファイルのみをこのパスに格納することを推奨します。
requirements.txtファイルがコードディレクトリに存在する場合、アルゴリズムは自動的に
pip install -r requirements.txt
コマンドを実行して関連する依存関係をインストールします。
コード設定: 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} を設定します。 データの取得方法の詳細については、「パイプラインおよびハイパーパラメータデータの取得」をご参照ください。
たとえば、入力パイプラインの名前はテストとトレーニングであり、出力パイプラインの名前はモデルとチェックポイントです。 サンプルコマンド:
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 the arguments.""" 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に変換され、競合が発生する可能性があります。
次の図は、Machine Learning Designerでのパイプラインおよびパラメーター設定とコンポーネントパラメーターの間のマッピングを示しています。
下表に、各パラメーターを説明します。
パラメーター
説明
入力
カスタムコンポーネントが入力データまたはモデルを取得するソース。 次のパラメーターを設定します。
名前: 入力パイプラインの名前を指定します。
ソース: OSS、Apsara File Storage NAS (NAS) 、またはMaxComputeで、入力パイプラインがデータを取得するパスを指定します。 入力データは、トレーニングコンテナの
/ml/input/data/{channel_name}/
ディレクトリにマウントされます。 コンポーネントは、オンプレミスのファイルを読み取ることで、OSS、NAS、またはMaxComputeからデータを読み取ることができます。
出力
出力パイプラインは、トレーニング済みモデルやチェックポイントなどの結果を保存するために使用されます。 次のパラメーターを設定します。
名前: 出力パイプラインの名前。
ストレージ: 出力パイプラインごとにOSSまたはMaxComputeディレクトリを指定します。 指定されたディレクトリは、トレーニングコンテナの
/ml/output/{channel_name}/
ディレクトリにマウントされます。
パラメーター
ハイパーパラメータに関する情報。 次のパラメーターを設定します。
Parameter Name: パラメーターの名前。
Type: パラメータのタイプ。 有効な値: Int、Float、String、およびBool。
Constraint:: パラメーターの制約。 [デフォルト値] 列で、[制約] をクリックしてパラメーターの制約を設定します。 Constraint Typeの有効な値:
Range: 最大値と最小値を指定して、値の範囲を指定します。 このオプションは、TypeパラメーターをInt、Float、またはStringに設定した場合にのみ使用できます。
列挙: パラメーターの列挙値を設定します。 このオプションは、TypeパラメーターをInt、Float、またはStringに設定した場合にのみ使用できます。
制約条件
トレーニングジョブに必要なコンピューティングリソースを指定するために使用されるトレーニング制約。 トレーニング制約を設定するには、[制約の有効化] をオンにします。
次の図は、Machine Learning Designerでのコンポーネントのトレーニング制約とチューニングパラメーターの間のマッピングを示しています。
下表に、各パラメーターを説明します。
パラメーター
説明
[インスタンスタイプ]
有効な値: CPUおよびGPU。
複数のインスタンス
コンポーネントが複数のインスタンスで分散トレーニングをサポートするかどうかを指定します。 有効な値:
サポート: コンポーネントの実行時にインスタンス数を設定できます。
Not Supported: コンポーネントが実行されている場合、インスタンスの数は1のみになり、変更できません。
複数のGPU
このパラメーターは、インスタンスタイプパラメーターをGPUに設定した場合にのみ使用できます。
カスタムコンポーネントが複数のGPUをサポートするかどうかを指定します。
このパラメーターを [サポート] に設定した場合、シングルGPUまたはマルチGPUインスタンスタイプを選択してコンポーネントを実行できます。
このパラメーターをNot Supportedに設定した場合、シングルGPUインスタンスタイプのみを選択してコンポーネントを実行できます。
[送信] をクリックします。
作成したカスタムコンポーネントは、[カスタムコンポーネント] ページに表示されます。
カスタムコンポーネントを作成したら、Machine Learning Designerでそのコンポーネントを使用できます。 詳細については、「カスタムコンポーネントの使用」をご参照ください。
付録1: ジョブの種類
TensorFlow (TFJob)
Job TypeパラメーターをTensorFlowに設定した場合、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
}
}
次の表に、上記のコードのパラメーターを示します。
パラメーター | 説明 |
クラスター | TensorFlowクラスターの説明。
|
タスク |
|
PyTorch (PyTorchJob)
Job TypeパラメーターをPyTorchに設定すると、システムは次の環境変数を挿入します。
RANK: インスタンスのロール。 値0は、インスタンスがマスターノードであることを示します。 0以外の値は、インスタンスがワーカーノードであることを示します。
WORLD_SIZE: ジョブ内のインスタンス数。
MASTER_ADDR: マスターノードのアドレス。
MASTER_PORT: マスターノードのポート。
XGBoost (XGBoostJob)
Job TypeパラメーターをXGBoostに設定すると、システムは次の環境変数を挿入します。
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 マスター_ポート=9999 マスターADDR=train1pt84cj ****-master-0 ランク=0 WORKER_PORT=9999
単一インスタンスジョブ
説明ジョブにインスタンスが1つしかない場合、インスタンスはマスターノードであり、WORKER_ADDRSおよびWORKER_PORT環境変数は使用できません。
WORLD_SIZE=1 マスター_ポート=9999 マスターADDR=train1pt84cj ****-master-0 ランク=0
ElasticBatch (ElasticBatchJob)
ElasticBatchは、分散オフライン推論ジョブの一種です。 ElasticBatchジョブには次の利点があります。
ダブルスループットをサポートする高い並列処理を提供します。
仕事の待ち時間を短縮します。 ワーカーノードは、ノードにリソースが割り当てられた直後に実行できます。
インスタンスのスタートアップの監視をサポートし、スタートアップが遅延したインスタンスをバックアップワーカーノードに自動的に置き換えます。 これにより、ロングテールやジョブのハングを防ぎます。
リソースをより効率的に使用するデータシャードのグローバルな動的分散をサポートします。
ジョブの早期停止をサポートします。 すべてのデータが処理された後、ジョブの稼働時間の増加を回避するために、システムは開始されていないワーカーノードを開始しません。
フォールトトレランスをサポートします。 単一のワーカーノードに障害が発生した場合、システムは自動的にインスタンスを再起動します。
ElasticBatchジョブは、AIMasterとWorkerのタイプのノードで構成されます。
AIMasterノードは、データシャードの動的分散、各ワーカーノードのデータスループットパフォーマンスの監視、フォールトトレランスなど、ジョブのグローバル制御に使用されます。
ワーカーノードは、AIMasterからシャードを取得し、データを読み取り、処理してから書き戻します。 データシャードの動的分散により、効率的なインスタンスは低速インスタンスよりも多くのデータを処理できます。
ElasticBatchジョブを開始すると、AIMasterノードとワーカーノードが開始されます。 コードはワーカーノードで実行されます。 システムは、ELASTICBATCH_CONFIG環境変数をワーカーノードに挿入します。 環境変数の値の形式を次に示します。
{
"task": {
"type": "ワーカー" 、
"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}
単一のハイパーパラメータの値は、環境変数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 # The user code is loaded into the /ml/usercode directory, which is also the working directory of the user code. You can obtain the value by using the PAI_WORKING_DIR environment variable.
| |-- requirements.txt
| |-- main.py
|-- input # The input data and configuration information of the job.
| |-- config # The config directory contains the configuration information of the job. You can obtain the configuration information by using the PAI_CONFIG_DIR environment variable.
| |-- training_job.json # The configuration of the job.
| |-- hyperparameters.json # The hyperparameters of the job.
| |-- data # The input pipelines of the job. In this example, the directory contains the pipelines named train_data and test_data.
| |-- test_data
| | |-- test.csv
| |-- train_data
| |-- train.csv
|-- output # The output pipelines of the job: In this example, the directory contains the pipelines named the model and checkpoints.
|-- model # You can use the PAI_OUTPUT_{OUTPUT_CHANNEL_NAME} environment variable to obtain the output path.
|-- checkpoints
インスタンスがGPUアクセラレーションインスタンスであるかどうか、およびインスタンスに含まれるGPUの数を確認するにはどうすればよいですか。
ジョブの開始後、NVIDIA_VISIBLE_DEVICES環境変数を使用してGPUの数を確認できます。 たとえば、NVIDIA_VISIBLE_DEVICES=0,1、2、3
は、インスタンスに4つのGPUがあることを示します。