PyTorch - Amazon SageMaker

翻訳は機械翻訳により提供されています。提供された翻訳内容と英語版の間で齟齬、不一致または矛盾がある場合、英語版が優先します。

PyTorch

PyTorch 独自のモデルをトレーニングコンパイラーに持ち込み SageMaker、 SageMaker トレーニングジョブを実行します。

PyTorch Hugging Face ストランスフォーマー搭載モデル

PyTorch Hugging Face ストランスフォーマーを搭載したモデルは、 PyTorchのtorch.nn.Module APIに基づいています。Hugging Face Transformers には、自然言語処理 (NLP) PyTorch モデルを設定する手間を省くためのトレーナークラスと事前トレーニング済みモデルクラスも用意されています。トレーニングスクリプトを準備したら、次のトピックに進むときに Training Compiler 設定で HuggingFace or Estimator SageMaker を使用してトレーニングジョブを起動できます。 SageMaker PyTorch SageMaker Training Compiler を有効にする

ヒント

トレーニングスクリプトで Transformers を使用して NLP モデルのトークナイザを作成する場合は、必ず padding='max_length' を指定して静的な入力テンソル形状を使用してください。バッチ内の最長シーケンスにパディングすると、各トレーニングバッチのテンソル形状が変化する可能性があるため、padding='longest' は使用しないでください。動的入力形状は、モデルの再コンパイルをトリガーし、合計トレーニング時間が長くなる可能性があります。Transformer トークナイザのパディングオプションの詳細については、「Hugging Face Transformer ドキュメント」の「Padding and truncation」を参照してください。

Hugging Face Transformers Trainer クラスを使用する大規模言語モデル

トランスフォーマーライブラリの Trainer クラスを使用する場合、トレーニングスクリプトにこれ以上変更を加える必要はありません。 SageMaker Estimator クラスで Trainer モデルを有効にすると、Training Compiler は自動的に Trainer モデルをコンパイルします。次のコードは、Hugging Face Trainer API PyTorch を使用したトレーニングスクリプトの基本的な形式を示しています。

from transformers import Trainer, TrainingArguments training_args=TrainingArguments(**kwargs) trainer=Trainer(args=training_args, **kwargs)

シングル GPU のトレーニングの場合

transformers.Trainer クラスを使用する場合、コードを変更する必要はありません。

分散トレーニングの場合

PyTorch v1.11.0 以降

Training Compiler SageMaker で分散トレーニングを実行するには、_mp_fn()トレーニングスクリプトに次の関数を追加し、その関数をラップする必要があります。main()_mp_fn(index) SageMaker 関数呼び出しを分散ランタイム for PyTorch (pytorchxla) main() からトレーニングスクリプトの関数にリダイレクトします。

def _mp_fn(index): main()

この関数は、分散トレーニング用のクラスター内にある現在の GPU のランクを示す index 引数を受け入れます。サンプルスクリプトをさらに見つけるには、「Hugging Face Transformers language modeling example scripts」を参照してください。

v1.10.2 以前の v4.17 以前のトランスフォーマー用 PyTorch

SageMaker Training Compiler は別のメカニズムを使用して分散型トレーニングジョブを起動するため、トレーニングスクリプトを変更する必要はありません。代わりに、 SageMaker Training Compiler では、 SageMaker entry_point分散型トレーニングランチャースクリプトを引数に渡し、トレーニングスクリプトを SageMaker Hugging Face Estimator hyperparameters の引数に渡す必要があります。

トレーニングコンパイラを併用する場合のベストプラクティス SageMaker Trainer

トレーニングスクリプトの調整が完了したら、 PyTorch Training Compiler で SageMaker トレーニングジョブを実行する に進みます。

PyTorch 直接使用する大規模言語モデル (Hugging Face ストランスフォーマートレーナー API なし)

PyTorch 直接使用するトレーニングスクリプトがある場合は、/XLA PyTorch を実装するためにトレーニングスクリプトにさらに変更を加える必要があります。 PyTorch指示に従ってスクリプトを変更し、/XLA プリマティブを適切に設定してください。 PyTorch

シングル GPU のトレーニングの場合

  1. 最適化ライブラリをインポートします。

    import torch_xla import torch_xla.core.xla_model as xm
  2. ターゲットデバイスを torch.device("cuda") ではなく XLA に変更します。

    device=xm.xla_device()
  3. の自動混合精度 (AMP) PyTorch を使用している場合は、次の操作を行います。

    1. torch.cuda.amp を次のように置き換えます。

      import torch_xla.amp
    2. torch.optim.SGD および torch.optim.Adam を次のように置き換えます。

      import torch_xla.amp.syncfree.Adam as adam import torch_xla.amp.syncfree.SGD as SGD
    3. torch.cuda.amp.GradScaler を次のように置き換えます。

      import torch_xla.amp.GradScaler as grad_scaler
  4. AMP を使用しない場合は、optimizer.step() を次のように置き換えます。

    xm.optimizer_step(optimizer)
  5. 分散型データローダーを使用している場合は、データローダーを /XLA のクラスでラップします。 PyTorch ParallelLoader

    import torch_xla.distributed.parallel_loader as pl parallel_loader=pl.ParallelLoader(dataloader, [device]).per_device_loader(device)
  6. parallel_loader を使用しない場合は、トレーニングループの最後に mark_step を追加します。

    xm.mark_step()
  7. トレーニングをチェックポイントするには、/XLA のモデルチェックポイントメソッドを使用してください。 PyTorch

    xm.save(model.state_dict(), path_to_save)

トレーニングスクリプトの調整が完了したら、 PyTorch Training Compiler で SageMaker トレーニングジョブを実行する に進みます。

分散トレーニングの場合

前記 シングル GPU のトレーニングの場合 のセクションで記載した変更点に加え、GPU 間にワークロードを適切に配分するには、次の変更を追加します。

  1. AMP を使用する場合は、all_reducescaler.scale(loss).backward() の後に追加します。

    gradients=xm._fetch_gradients(optimizer) xm.all_reduce('sum', gradients, scale=1.0/xm.xrt_world_size())
  2. local_ranks および world_size に対して変数を設定する必要がある場合、次と同様のコードを使用します。

    local_rank=xm.get_local_ordinal() world_size=xm.xrt_world_size()
  3. 1 より大きな world_size (num_gpus_per_node*num_nodes) については、トレーニングサンプラーを定義する必要があります。これは次のようなものです。

    import torch_xla.core.xla_model as xm if xm.xrt_world_size() > 1: train_sampler=torch.utils.data.distributed.DistributedSampler( train_dataset, num_replicas=xm.xrt_world_size(), rank=xm.get_ordinal(), shuffle=True ) train_loader=torch.utils.data.DataLoader( train_dataset, batch_size=args.batch_size, sampler=train_sampler, drop_last=args.drop_last, shuffle=False if train_sampler else True, num_workers=args.num_workers )
  4. torch_xla distributed モジュールによって提供される parallel_loader を確実に使用するには、次の変更を加えます。

    import torch_xla.distributed.parallel_loader as pl train_device_loader=pl.MpDeviceLoader(train_loader, device)

    train_device_loader PyTorch以下のように通常のローダーのように機能します。

    for step, (data, target) in enumerate(train_device_loader): optimizer.zero_grad() output=model(data) loss=torch.nn.NLLLoss(output, target) loss.backward()

    これらすべての変更により、Transformer Trainer API PyTorch がなくてもどのモデルでも分散型トレーニングを開始できるはずです。これらの手順は、シングルノードマルチ GPU とマルチノードマルチ GPU の両方に使用できます。

  5. PyTorch v1.11.0 以降用

    Training Compiler SageMaker で分散トレーニングを実行するには、_mp_fn()トレーニングスクリプトに次の関数を追加し、その関数をラップする必要があります。main()_mp_fn(index) SageMaker 関数呼び出しを分散ランタイム for PyTorch (pytorchxla) main() からトレーニングスクリプトの関数にリダイレクトします。

    def _mp_fn(index): main()

    この関数は、分散トレーニング用のクラスター内にある現在の GPU のランクを示す index 引数を受け入れます。サンプルスクリプトをさらに見つけるには、「Hugging Face Transformers language modeling example scripts」を参照してください。

    v1.10.2 以前の v4.17 以前のトランスフォーマー用 PyTorch

    SageMaker Training Compiler は、分散型トレーニングジョブを起動するための代替メカニズムを使用するため、 SageMaker entry_point分散型トレーニングランチャースクリプトを引数に渡し、トレーニングスクリプトを SageMaker Hugging Face Estimator hyperparameters の引数に渡す必要があります。

トレーニングスクリプトの調整が完了したら、 PyTorch Training Compiler で SageMaker トレーニングジョブを実行する に進みます。

/XLA SageMaker とトレーニングコンパイラーを併用する場合のベストプラクティス PyTorch

SageMaker PyTorch ネイティブのトレーニングスクリプトでトレーニングコンパイラを活用したい場合は、まず XLA PyTorch デバイスに慣れておくとよいでしょう。以下のセクションでは、XLA を有効にするためのベストプラクティスをいくつか挙げています。 PyTorch

注記

ベストプラクティスに関するこの節では、以下の PyTorch /XLA モジュールを使用することを前提としています。

import torch_xla.core.xla_model as xm import torch_xla.distributed.parallel_loader as pl
/XLA のレイジーモードを理解してください PyTorch

/XLA と native の大きな違いの 1 PyTorch つは、 PyTorch PyTorch /XLA システムがレイジーモードで実行されるのに対し、ネイティブはイージーモードで実行されることです。 PyTorch lazy モードのテンソルは、コンパイルと評価が完了した後それらがマテリアライズされるまで計算グラフを構築するためのプレースホルダーです。 PyTorch/XLA システムは、API PyTorch を呼び出してテンソルと演算子を使用して計算を構築すると、その場で計算グラフを作成します。計算グラフは、xm.mark_step()pl.MpDeviceLoader/pl.ParallelLoader によって明示的または暗黙的に呼び出されたとき、または、loss.item()print(loss) を呼び出すなどテンソルの値が明示的にリクエストされたときに、コンパイルされ、実行されます。

と、の使用回数は最小限に抑えてください。compilation-and-executionspl.MpDeviceLoader/pl.ParallelLoaderxm.step_closure

最高のパフォーマンスを得るには、compilation-and-executions/XLA のレイジーモードを理解してください PyTorchで説明されているように開始できる方法を念頭に置き、 compilation-and-executions使用回数を最小限に抑えるようにしてください。理想的には、1 compilation-and-execution 回のトレーニングの繰り返しで必要なのは 1 回だけで、によって自動的に開始されます。pl.MpDeviceLoader/pl.ParallelLoaderMpDeviceLoader は XLA 用に最適化されており、最高のパフォーマンスを得るために可能な限り常に使用してください。トレーニング中に、損失値などの中間結果をいくつか調べることもできます。このような場合、レイジーテンソルの印刷は、不要にならないようにラップして使ってください。xm.add_step_closure() compilation-and-executions

AMP および syncfree オプティマイザを使用する

自動混合精度 (AMP) モードでのトレーニングは、NVIDIA GPU の Tensor コアを活用することでトレーニング速度を大幅に向上させます。 SageMaker トレーニングコンパイラーには、XLA syncfree 向けに最適化されたオプティマイザーが用意されており、AMP のパフォーマンスを向上できます。現在、以下の 3 つの syncfreeオプティマイザが利用可能で、最高のパフォーマンスを得るために可能な限り使用してください。

torch_xla.amp.syncfree.SGD torch_xla.amp.syncfree.Adam torch_xla.amp.syncfree.AdamW

これら syncfree オプティマイザは、グラデーションのスケーリング/スケーリング解除のために torch_xla.amp.GradScaler と組み合わせます。

ヒント

PyTorch 1.13.1 以降の SageMaker Training Compiler では、 PyTorch /XLA がオプティマイザー (SGD、Adam、AdamW など) を同期フリーバージョン (、、など) torch.optim の同期フリーバージョンで自動的にオーバーライドできるようになり、パフォーマンスが向上しています。transformers.optimization torch_xla.amp.syncfree torch_xla.amp.syncfree.SGD torch_xla.amp.syncfree.Adam torch_xla.amp.syncfree.AdamWトレーニングスクリプト内でオプティマイザを定義しているコード行を変更する必要はありません。