EasyCkpt を Megatron または DeepSpeed と併用することで、PyTorch のトレーニングチェックポイントをほぼゼロのオーバーヘッドで保存し、失われたイテレーションを再計算することなく障害から復旧します。
大規模な GPU クラスターでの基盤モデルのトレーニングは、ハードウェア障害、システム障害、ネットワークエラーによって頻繁に中断されます。従来のチェックポイント作成では、数百億から数千億のパラメータを持つモデルの場合、完了までに数分かかり、各保存中にトレーニングが一時停止します。トレーニングが中断されると、最後のチェックポイント以降のすべてのイテレーションを再計算する必要があります。
EasyCkpt は、非同期階層チェックポイント処理を使用して、トレーニングを一時停止することなくモデルの状態を保存します。GPU 全体に保存されているデータレプリカを使用して障害から復旧するため、再計算が不要になります。
アーキテクチャ
EasyCkpt は、3 つの技術を使用して、トレーニングを一時停止することなくモデルの状態を保存します。
非同期階層チェックポイント処理により、まず状態をメモリにコピーし、その後バックグラウンドでディスクに書き込みます
チェックポイントと計算のオーバーラップにより、チェックポイント作成が非同期で実行されている間もトレーニングを継続します
ネットワークを考慮した非同期チェックポイント処理により、部分的な障害が発生しても利用可能なネットワークインターフェースを使用します
この設計は、障害発生時の3つの特性を活用しています。
障害は特定のワーカーに影響を与えます。障害は通常、1 台または 2 台のマシンから発生し、分散トレーニングジョブ全体ではなく、一部のワーカーにのみ影響します。
障害は特定のコンポーネントに影響を与えます。GPU エラーは CPU およびメモリ操作に影響を与えません。エラーは特定のネットワークインターフェースでのみ発生するため、ノードは部分的な障害があっても通信を継続できます。
障害は特定のモデルレプリカに影響を与えます。基盤モデルのトレーニングでは、3D 並列処理 (データ、テンソル、パイプライン) または Zero Redundancy Optimizer (ZeRO) を使用し、GPU 全体で複数のデータレプリカを維持します。1 つの GPU に障害が発生した場合、トレーニングは他のマシン上のレプリカから復旧します。
前提条件
Python 3.6、3.8、または 3.10
PyTorch (Megatron または DeepSpeed を使用)
AIMaster SDK (「AIMaster SDK のインストール」をご参照ください)
AIMaster SDK のインストール
お使いの Python のバージョンに応じて pip install を実行してください:
# 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.whlMegatron との統合
EasyCkpt を統合するには、トレーニングループファイル (例: training.py) を修正し、モデルファイル (例: pretrain_gpt.py) にフックをインポートします。
トレーニングループの変更
Megatron ネイティブの load_checkpoint インポートを EasyCkpt のバージョンに置き換え、トレーニングループに initialize_easyckpt と save_checkpoint_if_needed の呼び出しを追加します。
from megatron.core.utils import get_model_config
from megatron import print_rank_0
from megatron import print_rank_last
# Megatron ネイティブの load_checkpoint を EasyCkpt のものに置き換えます
# from megatron.checkpointing import load_checkpoint
from megatron.checkpointing import save_checkpoint
from megatron.model import Float16Module
from megatron.model import GPTModel
from megatron.utils import report_memory
from megatron.model.vision.knn_monitor import compute_feature_bank
# EasyCkpt の関数をインポートします
from aimaster.python.torch.easyckpt.megatron import (load_checkpoint,
initialize_easyckpt,
save_checkpoint_if_needed)
def print_datetime(string):
"""この呼び出しはすべてのランクで同期されることに注意してください。"""
timers('interval-time', log_level=0).start(barrier=True)
print_datetime('before the start of training step')
report_memory_flag = True
# トレーニングループの前に EasyCkpt を初期化します。
# save_mem_interval=1: イテレーションごとにメモリにコピー
# save_storage_interval=5: 5 イテレーションごとにストレージに書き込み
# max_ckpt_num=5: ディスクに最大 5 つのチェックポイントを保持
initialize_easyckpt(save_mem_interval=1,
save_storage_interval=5,
max_ckpt_num=5,
log_file_path='./test.log')
while iteration < args.train_iters:
if args.profile and \
iteration == args.profile_step_start and \
args.micro_batch_size * \
get_num_microbatches()
# 条件が満たされた場合にインメモリチェックポイントを作成します
save_checkpoint_if_needed(iteration, model, optimizer, opt_param_scheduler)
# ログ記録
loss_scale = optimizer.get_loss_scale().item()
params_norm = NoneEasyCkpt フックのインポート
モデルトレーニングファイル (例: pretrain_gpt.py) で、EasyCkpt Megatron フックをインポートします:
from megatron.utils import average_losses_across_data_parallel_group
from megatron.arguments import core_transformer_config_from_args
# 非同期チェックポイント処理を有効にするために EasyCkpt フックをインポートします
import aimaster.python.torch.easyckpt.megatron.hook
def model_provider(pre_process=True, post_process=True):
"""モデルをビルドします。"""関連 API
EasyCkpt は、Megatron との統合用に 3 つの関数を提供します。
initialize_easyckpt
EasyCkpt を初期化します。トレーニングループの前にこの関数を呼び出してください。
initialize_easyckpt(save_mem_interval, save_storage_interval, max_ckpt_num, log_file_path=None)パラメータ | 型 | デフォルト | 説明 |
| int |
| モデルの状態をメモリにコピーする頻度 (イテレーション単位) |
| int |
| チェックポイントを永続ストレージに非同期で書き込む頻度 (イテレーション単位) |
| int |
| ディスクに保持するチェックポイントの最大数。古いチェックポイントは自動的に削除されます |
| str |
| チェックポイント作成ログファイルのパス |
load_checkpoint
ネイティブの Megatron load_checkpoint() 関数を、分散オプティマイザーのサポートのため concat パラメーターで拡張します。
load_checkpoint(model, optimizer, opt_param_scheduler, load_arg='load', strict=True, concat=False)パラメータ | 型 | デフォルト | 説明 |
| Model | 必須 | Megatron モデルのインスタンス |
| Optimizer | 必須 | オプティマイザーのインスタンス |
| Scheduler | 必須 | オプティマイザーパラメータのスケジューラ |
| str |
| ロードディレクトリの引数名 |
| bool |
| ステート辞書の一致を厳密に強制するかどうか |
| bool |
| インスタンス数の変更時、または分散オプティマイザーのパラメーターのマージ時に |
分散オプティマイザーが有効になっている Megatron 2305 または 2306 では、分散オプティマイザーのパラメーターの読み込みまたはマージ中にインスタンス数を変更する場合は、load_checkpoint() で concat=True を設定します。
Megatron 2304 では、ネイティブの load_checkpoint を EasyCkpt 版に置き換えます。
save_checkpoint_if_needed
インメモリチェックポイントを作成します。トレーニングループ内でこの関数を呼び出してください。
save_checkpoint_if_needed(iteration, model, optimizer, opt_param_scheduler)パラメータ | 型 | デフォルト | 説明 |
| int | 必須 | 現在のトレーニングのイテレーション番号 |
| Model | 必須 | Megatron モデルのインスタンス |
| Optimizer | 必須 | オプティマイザーのインスタンス |
| Scheduler | 必須 | オプティマイザーパラメータのスケジューラ |
すべてのパラメータは、トレーニングループ内にある Megatron の変数です。
DeepSpeed との統合
Transformers Trainer を使用する DeepSpeed タスクでは、EasyCkpt は TrainerWrapper クラスを介して統合されます。
チェックポイントパラメータの設定
EasyCkpt は、標準の Transformers のチェックポイントパラメータを再利用します。これらを起動スクリプトに追加します。
--max_steps=10 \
--block_size=2048 \
--num_train_examples=100000 \
--gradient_checkpointing=false \
--save_strategy="steps" \
--save_steps="2" \
--save_total_limit="2"この例では、2 ステップごとにチェックポイントを保存し、最大 2 つのチェックポイントを保持します。
Trainer のラップ
EasyCkpt の Transformers モジュールから TrainerWrapper をインポートし、お使いの Trainer インスタンスをラップしてチェックポイントの再開を有効にします:
import datasets
import transformers
# Transformers Trainer 用の EasyCkpt ラッパーをインポートします
from aimaster.python.torch.easyckpt.transformers import TrainerWrapper
logger = logging.getLogger(__name__)
tokenizer=tokenizer,
data_collator=transformers.default_data_collator,
)
# 非同期チェックポイント処理を有効にするために Trainer を EasyCkpt でラップします
trainer = TrainerWrapper(trainer)
# 最新のチェックポイントから自動的に再開します
trainer.train(resume_from_checkpoint=True)
if __name__ == "__main__":
main()関連 API
TrainerWrapper
Transformers の Trainer インスタンスをラップして、非同期チェックポイント機能を提供します。
from aimaster.python.torch.easyckpt.transformers import TrainerWrapper
trainer = TrainerWrapper(trainer)
trainer.train(resume_from_checkpoint=True)チェックポイントパラメータ
これらのパラメーターは、標準の Transformers TrainingArguments の定義に準拠しています:
パラメータ | 型 | 有効な値 | 説明 |
| str |
| チェックポイントを保存するタイミング。 |
| int | 正の整数 | チェックポイントを保存するステップ間隔。 |
| int | 正の整数 | 保持されるチェックポイントの最大数。この制限に達すると、古いチェックポイントは自動的に削除されます |
save_total_limit を有効にすると、古いチェックポイントが自動的に削除されます。 それらのフォルダーに保存されているデータは、削除される前にバックアップしてください。 詳細については、「Transformers の公式ドキュメント」をご参照ください。
データセキュリティ
EasyCkpt は、お客様が指定したストレージディレクトリ内でのみデータの読み書きを行います。チェックポイントの最大数を維持するために、古いチェックポイントを削除することがあります。
Platform for AI (PAI) は、以下の動作を保証します。
すべての操作は、設定された保存およびロードディレクトリに限定されます。
すべての保存および削除操作はログに記録されます。
モデルの保存またはロードディレクトリに他のデータを保存しないでください。EasyCkpt が正しく機能しない可能性があり、結果として生じるデータ損失についてはお客様の責任となります。