AIMaster は、大規模な分散ディープラーニングジョブの安定性と継続性を向上させます。ソフトウェアおよびハードウェアの例外、ジョブハング、インスタンス障害などの問題に対処するために、ジョブモニタリング、フォールトトレランスの判断、リソース制御を提供します。
背景情報
ディープラーニングは広く使用されています。モデルとデータの規模が拡大するにつれて、分散トレーニングが一般的な手法となっています。ジョブインスタンスの数が増えると、ソフトウェアやハードウェアの例外によってジョブが失敗する可能性があります。
大規模な分散ディープラーニングジョブの安定した運用を確保するために、DLC は AIMaster ベースのフォールトトレランスモニタリング機能を提供します。AIMaster はジョブレベルのコンポーネントです。この機能を有効にすると、AIMaster インスタンスがジョブの他のインスタンスと並行して実行され、ジョブモニタリング、フォールトトレランスの判断、リソース制御を提供します。
制限事項
AIMaster は現在、PyTorch、MPI、TensorFlow、ElasticBatch のフレームワークをサポートしています。
ステップ1:フォールトトレランスモニタリングを有効にする
DLC トレーニングジョブを送信する際に、コンソールまたは SDK を使用してフォールトトレランスモニタリング機能を有効にできます。
コンソールでの設定
コンソールで DLC トレーニングジョブを送信するときは、フォールトトレランスと診断 セクションに移動し、自動フォールトトレランス スイッチをオンにして、追加のパラメーターを設定します。詳細については、「トレーニングジョブの作成」をご参照ください。これにより、DLC は追加の AIMaster ロールを開始して、ジョブのライフサイクル全体を監視し、エラー発生時にフォールトトレランスを実行します。

詳細:
追加パラメーターは、その他の設定 テキストボックスで設定できます。 パラメーターの詳細については、「付録: 耐障害性パラメーター」をご参照ください。
ハング検出を有効にすると、C4D 検出 機能を有効にできます。 C4D は、大規模モデルのトレーニングでジョブが低速になったりハングしたりする問題を診断するために、Alibaba Cloud が開発した診断ツールです。 詳細については、「C4D の使用」をご参照ください。
説明C4D は ACCL (Alibaba Cloud 高性能集合通信ライブラリ) に依存します。ACCL がインストールされていることを確認してください。詳細については、「ACCL:Alibaba Cloud 高性能集合通信ライブラリ」をご参照ください。
現在、C4D 検出は Lingjun AI Computing Service を使用する DLC ジョブで利用可能です。
[Hanging Detection] を有効にした後、関数呼び出しスタックスナップショット分析ツールを使用して、ジョブハングが発生したコードの正確な行を特定できます。このツールが正しく動作するには、ハング検出のしきい値を設定する必要があります。詳細については、「関数呼び出しスタックスナップショット分析ツールの使用」をご参照ください。
DLC SDK の使用
ステップ2:高度な機能を設定する
モニタリングのニーズに応じて、以下の高度な機能から選択してください。
フォールトトレランス通知の設定
ジョブのフォールトトレランスモニタリングを有効にすると、フォールトトレランスイベントの通知を設定できます。ワークスペースの詳細 ページで、ワークスペースの詳細 > イベント通知設定 を選択します。次に、通知ルールの新規作成 をクリックし、イベントタイプを DLC ジョブ > タスク自動フォールトトレランス に設定します。詳細については、「ワークスペースイベントセンター」をご参照ください。
トレーニングジョブで NaN 損失などの例外が発生した場合、コード内で AIMaster SDK を使用してカスタム通知メッセージを送信できます。
この機能を使用するには、AIMaster Wheel パッケージをインストールする必要があります。詳細については、「FAQ」をご参照ください。
from aimaster import job_monitor as jm
job_monitor_client = jm.Monitor(config=jm.PyTorchConfig())
...
if loss == Nan and rank == 0:
st = job_monitor_client.send_custom_message(content="The training loss of the job is NaN.")
if not st.ok():
print('メッセージの送信に失敗しました。エラー: %s' % st.to_string())カスタムリトライ可能なエラーキーワードの設定
フォールトトレランスモニタリングには、一般的なリトライ可能なエラーの組み込み検出が含まれています。失敗したインスタンスのログに特定のキーワードが表示されたときに AIMaster がフォールトトレランスを実行するようにするには、コード内でキーワードを設定できます。設定後、モニタリングモジュールは失敗したインスタンスのログの末尾でこれらのキーワードをスキャンします。
フォールトトレランスポリシーは ExitCodeAndErrorMsg に設定する必要があります。
PyTorch ジョブのカスタムリトライ可能なエラーキーワード設定の例
from aimaster import job_monitor as jm jm_config_params = {} jm_config = jm.PyTorchConfig(**jm_config_params) monitor = jm.Monitor(config=jm_config) monitor.set_retryable_errors(["connect timeout", "error_yyy", "error_zzz"])monitor.set_retryable_errors で設定するパラメータが、カスタムリトライ可能なエラーキーワードです。
TensorFlow ジョブのカスタムリトライ可能なエラーキーワード設定の例
from aimaster import job_monitor as jm jm_config_params = {} jm_config = jm.TFConfig(**jm_config_params) monitor = jm.Monitor(config=jm_config) monitor.set_retryable_errors(["connect timeout", "error_yyy", "error_zzz"])
段階的なジョブハング検出の設定
デフォルトでは、ハング検出設定はジョブ全体に適用されます。ただし、ジョブは多くの場合、異なる段階で実行されます。たとえば、初期化中のノード通信はトレーニング段階よりも時間がかかる場合があり、トレーニング段階ではログがより頻繁に更新されます。トレーニングプロセス中のジョブハングを迅速に検出するために、DLC は段階的なハング検出機能を提供します。これにより、ジョブのさまざまな段階に対して異なるハング検出間隔を設定できます。次のように設定します。
monitor.reset_config(jm_config_params)
# 例:
# monitor.reset_config(job_hang_interval=10)
# または
# config_params = {"job_hang_interval": 10, }
# monitor.reset_config(**config_params)以下は、PyTorch ジョブの段階的なハング検出の例です。
import torch
import torch.distributed as dist
from aimaster import job_monitor as jm
jm_config_params = {
"job_hang_interval": 1800 # グローバルな検出間隔は30分
}
jm_config = jm.PyTorchConfig(**jm_config_params)
monitor = jm.Monitor(config=jm_config)
dist.init_process_group('nccl')
...
# aimaster SDKにこれらの2つの関数を実装します
# ユーザーは関数にアノテーションを追加するだけです
def reset_hang_detect(hang_seconds):
jm_config_params = {
"job_hang_interval": hang_seconds
}
monitor.reset_config(**jm_config_params)
def hang_detect(interval):
reset_hang_detect(interval)
...
@hang_detect(180) # ハング検出を3分にリセットします (この関数のスコープのみ)
def train():
...
@hang_detect(-1) # ハング検出を一時的に無効にします (この関数のスコープのみ)
def test():
...
for epoch in range(0, 100):
train(epoch)
test(epoch)
self.scheduler.step()
C4D の使用
C4D (Calibrating Collective Communication over Converged ethernet - Diagnosis) は、大規模モデルトレーニングにおける遅延またはハングしたジョブを診断するために Alibaba Cloud が開発したツールです。C4D は Alibaba Cloud 高性能集合通信ライブラリ (ACCL) に依存します。ACCL がインストールされており、環境変数が正しく設定されていることを確認してください。詳細については、「ACCL:Alibaba Cloud 高性能集合通信ライブラリ」をご参照ください。現在、DLC ジョブで Lingjun AI Computing Service を選択した場合、C4D 検出機能を使用できます。
機能概要
C4D は、ジョブ内のすべてのノードからステータス情報を集約し、ノードに通信レイヤーまたはそれ以外の箇所で問題があるかどうかを判断します。
すべてのパラメータ
C4D 検出機能を有効にすると、その他の設定 テキストボックスで次のパラメーターを設定できます:
パラメータ | 説明 | 値の例 |
--c4d-log-level | C4D 出力ログレベルを設定します。有効な値:
デフォルト値は Warning で、Warning および Error レベルのログを出力します。通常の運用では、デフォルト値の使用を推奨します。パフォーマンスの問題をトラブルシューティングするには、レベルを Info に設定できます。 |
|
--c4d-common-envs | C4D 実行の環境変数を設定します。形式は
|
|
エラーレベルのログの場合、AIMaster は対応するノードを自動的に隔離し、ジョブを再起動します。各ログレベルの処理ロジックは次のとおりです。
エラーレベル | 説明 | アクション |
Error | デフォルトでは、3 分を超える通信レイヤーのジョブハングにより、ジョブが失敗します。C4D_HANG_TIMEOUT および C4D_HANG_TIMES パラメータを設定することで、このデフォルト値を変更できます。 | AIMaster は、ログで報告されたノードを自動的に隔離します。 |
Warning | デフォルトでは、10 秒を超える通信レイヤーのジョブハングはパフォーマンスに影響しますが、ジョブは失敗しません。C4D_HANG_TIMEOUT パラメータを設定することで、このデフォルト値を変更できます。 | 自動ノード隔離は行われません。手動確認が必要です。 |
10 秒を超える非通信レイヤーのジョブハングにより、ジョブが失敗する可能性があります。 | 自動ノード隔離は行われません。手動確認が必要です。 | |
Info | 通信レイヤーおよび非通信レイヤーの遅延。 | これらの診断ログは主にパフォーマンスの問題に関するもので、手動確認が必要です。 |
DLC ジョブの実行が遅い、またはハングしていることがわかった場合は、DLC ジョブリストに移動し、ジョブ名をクリックしてジョブ概要ページを開きます。Instances セクションで、AIMaster ノードログを表示して C4D 診断結果を確認します。診断結果の詳細については、「診断結果の例」をご参照ください。
診断結果の例
RankCommHang:ノードに通信レイヤーでのハングがあることを示します。

RankNonCommHang:ノードに通信レイヤー外でのハング (計算プロセスでのハングなど) があることを示します。

RankCommSlow:ノードが通信レイヤーで遅いことを示します。

RankNonCommSlow:ノードが通信レイヤー外で遅いことを示します。

コールスタックスナップショットの分析
大規模モデルトレーニングにおける一般的な障害は、ジョブハングです。頻繁に発生するタイプの1つは NCCL ハングで、通常、"Watchdog caught collective operation timeout" のようなログエントリが生成されます。ジョブハングの根本原因を迅速に特定できるように、関数呼び出しスタックスナップショット分析ツールを開発しました。使用するには、次の手順に従ってください。
ステップ1:pystack または py-spy をインストールする
まず、コンテナイメージに pystack または py-spy がインストールされているかどうかを確認します。インストールされていない場合は、いずれかをインストールする必要があります。たとえば、次のコマンドを使用して pystack をインストールします。
pip install pystack -i https://mirrors.cloud.aliyuncs.com/pypi/simple/ --trusted-host mirrors.cloud.aliyuncs.comステップ2:ハング検出を有効にする
ハング検出を有効にする方法については、「コンソールでの設定」をご参照ください。関数呼び出しスタックスナップショット分析ツールが正しく動作するには、ハング検出のしきい値に適切な値を設定する必要もあります。まず、モデルジョブのタイムアウト値を決定します。通常、ジョブがハングした後のエラーログでこれを確認できます。次に例を示します。
Watchdog caught collective operation timeout: WorkNCCL(SeqNum=2143, OpType=ALLREDUCE, NumelIn=659, NumelOut=659, Timeout(ms)=600000) ran for 600535 milliseconds before timing outこのエラーログの Timeout フィールドから、ジョブのタイムアウトが 600,000 ミリ秒 (600 秒または 10 分) であることがわかります。この場合、ハング検出のしきい値を 450 秒に設定することを推奨します。ログの Timeout 値が 1,800 秒の場合、しきい値を 1,500 秒に設定することを推奨します。一般的なルールとして、ハング検出のしきい値は、ジョブのタイムアウト値より約 150~200 秒短く設定する必要があります。
ハング検出を正しく設定すると、AIMaster はハングが発生したときにジョブプロセスの関数呼び出しスタックを自動的に収集および分析します。分析結果は AIMaster ノードログで確認できます。以下は、ジョブハング後のツールからのサンプル分析結果です。

分析結果では、stack フィールドに関数呼び出しスタックが表示され、threads フィールドにはこのスタックが発生したスレッドが一覧表示され、count フィールドにこのスタックを持つスレッドの数が示されます。count が 1 のスタックは、ジョブハングの原因である可能性が高く、最初に調査する必要があります。
ステップ3:再起動理由を表示する
再起動ラウンドを表示:ジョブの再起動情報はラウンドごとに整理されます。ジョブの詳細ページで、ラウンドの詳細を展開して、各段階で費やされた時間などの情報を表示できます。これにより、ジョブの実行ステータスをより正確に把握できます。

再起動履歴の表示: [再起動回数] または 再起動レコード タブをクリックすると、再起動理由、結果、期間などの関連する再起動情報を表示できます。

手順:
再起動レコード リストで 詳細 をクリックすると、特定の再起動に関する詳細情報として、再起動回数、再起動時間、ノード名、インスタンス名、エラーコード、エラーメッセージ、および エラーソース を表示できます。
集約エラーの詳細を見る をクリックして、すべての再起動レコードの詳細リスト全体を展開します。

付録:フォールトトレランスパラメータ
このセクションでは、フォールトトレランス監視機能のすべてのパラメーターについて説明します。一般的なパラメーター設定例を参照して、設定を計画できます。フォールトトレランス監視を有効にすると、必要に応じて その他の設定 セクションでこれらのパラメーターを設定できます。
すべてのパラメータ
一般設定
機能 | パラメータ | 説明 | デフォルト |
ジョブ実行モード | --job-execution-mode | ジョブの実行モード。有効な値:
リトライ可能なエラーの場合、フォールトトレランスの動作はジョブタイプによって異なります。
| Sync |
ジョブ再起動設定 | --enable-job-restart | フォールトトレランス条件が満たされた場合、またはランタイム例外が検出された場合にジョブの再起動を許可するかどうかを指定します。有効な値:
| False |
--max-num-of-job-restart | ジョブが再起動できる最大回数。この回数を超えると、ジョブは失敗します。 | 3 |
ランタイム設定
失敗したインスタンスがないシナリオに適用されます。
機能 | パラメータ | 説明 | デフォルト |
ジョブハング検出 | --enable-job-hang-detection | ジョブのランタイムハング検出を有効にするかどうかを指定します。この機能は同期ジョブのみをサポートします。有効な値:
| False |
--job-hang-interval | ジョブのハングが許容される期間 (秒単位)。正の整数である必要があります。 ハング期間がこの値を超えると、ジョブは異常と見なされ、再起動されます。 | 1800 | |
--enable-c4d-hang-detection | C4D 検出を有効にして、実行中にジョブハングを引き起こす遅いノードと障害ノードを迅速に診断および特定するかどうかを指定します。 説明 このパラメータは、--enable-job-hang-detection パラメータも有効になっている場合にのみ有効になります。 | False | |
ジョブ終了ハング検出 | --enable-job-exit-hang-detection | ジョブ終了時のハング検出を有効にするかどうかを指定します。この機能は同期ジョブのみをサポートします。有効な値:
| False |
--job-exit-hang-interval | 終了時にジョブのハングが許容される期間 (秒単位)。正の整数である必要があります。 終了期間がこの値を超えると、ジョブは異常と見なされ、再起動されます。 | 600 |
フォールトトレランス設定
少なくとも1つのインスタンスが失敗したシナリオに適用されます。
機能 | パラメータ | 説明 | デフォルト |
フォールトトレランスポリシー | --fault-tolerant-policy | フォールトトレランスポリシー。有効な値:
| ExitCodeAndErrorMsg |
同じエラーの最大発生回数 | --max-num-of-same-error | 単一のインスタンスで同じエラーが発生できる最大回数。 エラー数がこの値を超えると、ジョブは失敗します。 | 10 |
最大許容障害率 | --max-tolerated-failure-rate | 最大許容障害率。失敗したインスタンスの割合がこの値を超えると、ジョブは失敗します。 デフォルト値の -1 は、この機能を無効にします。たとえば、値が 0.3 の場合、30% を超えるワーカーでエラーが発生すると、ジョブは失敗します。 | -1 |
パラメータ設定例
以下の例は、さまざまなトレーニングジョブの一般的なパラメータ設定を示しています。
同期トレーニングジョブ (PyTorch ジョブで一般的)
インスタンスが失敗し、フォールトトレランス条件を満たす場合、ジョブが再起動されます。
--job-execution-mode=Sync --enable-job-restart=True --max-num-of-job-restart=3 --fault-tolerant-policy=ExitCodeAndErrorMsg非同期トレーニングジョブ (TensorFlow ジョブで一般的)
リトライ可能なエラーの場合、失敗した Worker インスタンスが再起動されます。PS または Chief インスタンスが失敗した場合、デフォルトではジョブは再起動されません。ジョブの再起動を有効にするには、--enable-job-restart=True を設定します。
--job-execution-mode=Async --fault-tolerant-policy=OnFailureオフライン推論ジョブ (ElasticBatch ジョブで一般的)
インスタンスは非同期ジョブと同様に独立しています。インスタンスが失敗すると、そのインスタンスのみが再起動されます。
--job-execution-mode=Async --fault-tolerant-policy=OnFailure
よくある質問
Q: AIMaster SDK をインストールするにはどうすればよいですか?
Python バージョンに対応するコマンドを使用して Wheel パッケージをインストールします。
# Python 3.6
pip install -U https://odps-release.oss-cn-hangzhou.aliyuncs.com/aimaster/pai_aimaster-1.2.1-cp36-cp36m-linux_x86_64.whl
# Python 3.8
pip install -U https://odps-release.oss-cn-hangzhou.aliyuncs.com/aimaster/pai_aimaster-1.2.1-cp38-cp38-linux_x86_64.whl
# Python 3.10
pip install -U https://odps-release.oss-cn-hangzhou.aliyuncs.com/aimaster/pai_aimaster-1.2.1-cp310-cp310-linux_x86_64.whl