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

詳細:
Other Cofiguration テキストボックスで追加パラメーターを設定できます。パラメーターの詳細については、「付録: フォールトトレランスパラメーター」をご参照ください。
Hanging Detection を有効化した後、C4D Detection 機能を有効化できます。C4D (Calibrating Collective Communication over Converged ethernet - Diagnosis) は、大規模モデルトレーニングにおける遅延またはハングしたジョブを診断するために Alibaba Cloud が開発した診断ツールです。詳細については、「C4D の使用」をご参照ください。
説明C4D は ACCL (Alibaba Cloud パフォーマンス専有型コレクティブ通信ライブラリ) に依存しています。ACCL がインストールされていることを確認してください。詳細については、「ACCL: Alibaba Cloud パフォーマンス専有型コレクティブ通信ライブラリ」をご参照ください。
現在、C4D 検出は Lingjun AI Computing Service を使用する DLC job で利用可能です。
Hanging Detection を有効化した後、関数呼び出しスタックスナップショット分析ツールを使用して、ジョブのハングが発生している正確なコード行を特定できます。このツールを正しく動作させるには、ハング検出しきい値を設定する必要があります。詳細については、「関数呼び出しスタックスナップショット分析ツールの使用」をご参照ください。
DLC SDK 経由
ステップ 2: 高度な機能の構成
モニタリングのニーズに応じて、以下の高度な機能から選択してください。
フォールトトレランス通知の構成
ジョブのフォールトトレランスモニタリングを有効化した後、フォールトトレランスイベントの通知を構成できます。Workspace Details ページで、Configure Workspace > Configure Event Notification を選択します。次に、Create Event Rule をクリックし、イベントタイプを DLC task > Automatic Fault Tolerance に設定します。詳細については、「ワークスペースイベントセンター」をご参照ください。
トレーニングジョブが NaN 損失などの例外に遭遇した場合、コード内で AIMaster SDK を使用してカスタム通知メッセージを送信できます。
この機能を使用するには、AIMaster WHL パッケージをインストールする必要があります。詳細については、「よくある質問」をご参照ください。
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('failed to send message, error %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')
...
# impl these two funcs in aimaster sdk
# user just need to add annotations to their func
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 job で Lingjun AI Computing Service を選択した場合に C4D 検出機能を使用できます。
機能概要
C4D は、ジョブ内のすべてのノードからステータス情報を集約し、ノードが通信レイヤーまたはその他の場所で問題を抱えているかどうかを判断します。
すべてのパラメーター
C4D 検出機能を有効化した後、Other Configurations テキストボックスで以下のパラメーターを構成できます。
パラメーター | 説明 | 例となる値 |
--c4d-log-level | C4D 出力ログレベルを設定します。有効値:
デフォルト値は Warning で、Warning レベルおよび Error レベルのログが出力されます。通常の運用ではデフォルト値を使用することを推奨します。パフォーマンスの問題をトラブルシューティングする場合は、レベルを Info に設定できます。 |
|
--c4d-common-envs | C4D 実行時の環境変数を設定します。形式は
|
|
Error レベルのログの場合、AIMaster は対応するノードを自動的に隔離し、ジョブを再起動します。各ログレベルの処理ロジックは以下のとおりです。
エラーレベル | 説明 | アクション |
Error | デフォルトでは、通信レイヤーでの 3 分を超えるジョブハングによりジョブが失敗します。このデフォルト値は、C4D_HANG_TIMEOUT および C4D_HANG_TIMES パラメーターを構成することで変更できます。 | AIMaster はログに報告されたノードを自動的に隔離します。 |
Warning | デフォルトでは、通信レイヤーでの 10 秒を超えるジョブハングはパフォーマンスに影響を与えますが、ジョブは失敗しません。このデフォルト値は、C4D_HANG_TIMEOUT パラメーターを構成することで変更できます。 | 自動ノード隔離は行われません。手動での確認が必要です。 |
非通信レイヤーでの 10 秒を超えるジョブハングは、ジョブが失敗する可能性があります。 | 自動ノード隔離は行われません。手動での確認が必要です。 | |
Info | 通信レイヤーおよび非通信レイヤーでの低速化。 | これらの診断ログは主にパフォーマンスの問題用であり、手動での確認が必要です。 |
DLC job の実行が遅くなっている、またはハングしていると感じた場合は、DLC ジョブリストに移動してジョブ名をクリックし、ジョブ概要ページを開きます。[インスタンス] セクションで、AIMaster ノードログを確認して C4D 診断結果を参照してください。診断結果の詳細については、「診断結果の例」をご参照ください。
診断結果の例
RankCommHang: ノードが通信レイヤーでハングしていることを示します。

RankNonCommHang: ノードが通信レイヤー以外(たとえば、計算プロセス)でハングしていることを示します。

RankCommSlow: ノードが通信レイヤーで低速であることを示します。

RankNonCommSlow: ノードが通信レイヤー以外で低速であることを示します。

呼び出しスタックスナップショットの分析
大規模モデルトレーニングにおける一般的な失敗は、ジョブのハングです。その中でも特に多いのは 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: 再起動理由の確認
再起動ラウンドの確認: ジョブ再起動情報はラウンドごとに整理されています。ジョブ詳細ページで、ラウンドの詳細を展開すると、各ステージで費やされた時間などの情報が表示されます。これにより、ジョブの実行状況をより正確に把握できます。

再起動履歴の確認: 再起動回数 または Restart records タブをクリックして、再起動理由、結果、所要時間などの関連情報を確認できます。

手順:
Restart records リストで、Description をクリックして、特定の再起動に関する詳細情報(Restarts、Restart Time、Node Name、Instance Name、Error Code、Error Message、Error Source)を確認します。
View Aggregation Fault Details をクリックして、すべての再起動レコードの詳細リストを展開します。

付録: フォールトトレランスパラメーター
このセクションでは、フォールトトレランスモニタリング機能のすべてのパラメーターについて説明します。共通パラメーター構成例を参考に、設定を計画できます。フォールトトレランスモニタリングを有効化する際は、必要に応じて Other Cofiguration セクションでこれらのパラメーターを構成できます。
すべてのパラメーター
一般構成
機能 | パラメーター | 説明 | デフォルト |
ジョブ実行モード | --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 バージョンに対応するコマンドを使用して、WHL パッケージをインストールします。
# Python 3.6
pip install -U http://odps-release.cn-hangzhou.oss.aliyun-inc.com/aimaster/pai_aimaster-1.2.1-cp36-cp36m-linux_x86_64.whl
# Python 3.8
pip install -U http://odps-release.cn-hangzhou.oss.aliyun-inc.com/aimaster/pai_aimaster-1.2.1-cp38-cp38-linux_x86_64.whl
# Python 3.10
pip install -U http://odps-release.cn-hangzhou.oss.aliyun-inc.com/aimaster/pai_aimaster-1.2.1-cp310-cp310-linux_x86_64.whl