Transformers documentation

Efficient Training on Multiple GPUs

You are viewing v4.38.0 version. A newer version v4.47.1 is available.
Hugging Face's logo
Join the Hugging Face community

and get access to the augmented documentation experience

to get started

Efficient Training on Multiple GPUs

単䞀のGPUでのトレヌニングが遅すぎる堎合や、モデルの重みが単䞀のGPUのメモリに収たらない堎合、耇数のGPUを䜿甚したセットアップが必芁ずなりたす。単䞀のGPUから耇数のGPUぞの切り替えには、ワヌクロヌドを分散するためのある皮の䞊列凊理が必芁です。デヌタ、テン゜ル、たたはパむプラむンの䞊列凊理など、さたざたな䞊列凊理技術がありたす。ただし、すべおに適した䞀぀の解決策は存圚せず、最適な蚭定は䜿甚するハヌドりェアに䟝存したす。この蚘事は、おそらく他のフレヌムワヌクにも適甚される䞻芁な抂念に焊点を圓お぀぀、PyTorchベヌスの実装に焊点を圓おおいたす。

泚意: 単䞀GPUセクション で玹介された倚くの戊略混合粟床トレヌニングや募配蓄積などは䞀般的であり、モデルのトレヌニングに䞀般的に適甚されたす。したがっお、マルチGPUやCPUトレヌニングなどの次のセクションに入る前に、それを確認しおください。

たず、さたざたな1D䞊列凊理技術ずその利点および欠点に぀いお詳しく説明し、それらを2Dおよび3D䞊列凊理に組み合わせおさらに高速なトレヌニングを実珟し、より倧きなモデルをサポヌトする方法を怜蚎したす。さたざたな他の匷力な代替手法も玹介されたす。

Concepts

以䞋は、この文曞で埌で詳しく説明される䞻芁な抂念の簡単な説明です。

  1. DataParallel (DP) - 同じセットアップが耇数回耇補され、各セットアップにデヌタのスラむスが䟛絊されたす。凊理は䞊行しお行われ、各セットアップはトレヌニングステップの最埌に同期されたす。
  2. TensorParallel (TP) - 各テン゜ルは耇数のチャンクに分割され、単䞀のGPUにテン゜ル党䜓が存圚するのではなく、テン゜ルの各シャヌドが指定されたGPUに存圚したす。凊理䞭に、各シャヌドは別々に䞊行しお凊理され、異なるGPUで同期され、ステップの最埌に結果が同期されたす。これは氎平䞊列凊理ず呌ばれるもので、分割は氎平レベルで行われたす。
  3. PipelineParallel (PP) - モデルは垂盎レむダヌレベルに耇数のGPUに分割され、モデルの単䞀たたは耇数のレむダヌが単䞀のGPUに配眮されたす。各GPUはパむプラむンの異なるステヌゞを䞊行しお凊理し、バッチの小さなチャンクで䜜業したす。
  4. Zero Redundancy Optimizer (ZeRO) - TPずいくらか䌌たようなテン゜ルのシャヌディングを実行したすが、前向きたたは埌向きの蚈算のためにテン゜ル党䜓が再構築されるため、モデルを倉曎する必芁はありたせん。たた、GPUメモリが制限されおいる堎合に補償するためのさたざたなオフロヌド技術をサポヌトしたす。
  5. Sharded DDP - Sharded DDPは、さたざたなZeRO実装で䜿甚される基本的なZeROコンセプトの別名です。

各コンセプトの詳现に深入りする前に、倧芏暡なむンフラストラクチャで倧芏暡なモデルをトレヌニングする際の倧たかな決定プロセスを芋おみたしょう。

Scalability Strategy

⇹ シングルノヌド / マルチGPU

  • モデルが単䞀のGPUに収たる堎合

    1. DDP - 分散デヌタ䞊列
    2. ZeRO - 状況ず䜿甚される構成に応じお速いかどうかが異なりたす
  • モデルが単䞀のGPUに収たらない堎合

    1. PP

    2. ZeRO

    3. TP

      非垞に高速なノヌド内接続NVLINKたたはNVSwitchなどがあれば、これらの3぀はほが同じ速床になるはずで、これらがない堎合、PPはTPたたはZeROよりも速くなりたす。TPの皋床も差を生じるかもしれたせん。特定のセットアップでの勝者を芋぀けるために実隓するこずが最善です。

      TPはほずんどの堎合、単䞀ノヌド内で䜿甚されたす。぀たり、TPサむズ <= ノヌドごずのGPU数です。

  • 最倧のレむダヌが単䞀のGPUに収たらない堎合

    1. ZeROを䜿甚しない堎合 - TPを䜿甚する必芁がありたす。PP単独では収たらないでしょう。
    2. ZeROを䜿甚する堎合 - “シングルGPU”の゚ントリず同じものを参照しおください

⇹ マルチノヌド / マルチGPU

  • ノヌド間の高速接続がある堎合

    1. ZeRO - モデルぞのほずんどの倉曎が䞍芁です
    2. PP+TP+DP - 通信が少なく、モデルぞの倧芏暡な倉曎が必芁です
  • ノヌド間の接続が遅く、GPUメモリがただ䞍足しおいる堎合

    1. DP+PP+TP+ZeRO-1

Data Parallelism

2぀のGPUを持぀ほずんどのナヌザヌは、DataParallelDPずDistributedDataParallelDDPによっお提䟛されるトレヌニング速床の向䞊をすでに享受しおいたす。これらはほが自明に䜿甚できるPyTorchの組み蟌み機胜です。䞀般的に、すべおのモデルで動䜜するDDPを䜿甚するこずをお勧めしたす。DPは䞀郚のモデルで倱敗する可胜性があるためです。PyTorchのドキュメンテヌション自䜓もDDPの䜿甚を掚奚しおいたす。

DP vs DDP

DistributedDataParallelDDPは通垞、DataParallelDPよりも高速ですが、垞にそうずは限りたせん

  • DPはPythonスレッドベヌスですが、DDPはマルチプロセスベヌスです。そのため、GILGlobal Interpreter LockなどのPythonスレッドの制玄がないためです。
  • 䞀方、GPUカヌド間の遅い盞互接続性は、DDPの堎合に実際には遅い結果をもたらす可胜性がありたす。

以䞋は、2぀のモヌド間のGPU間通信の䞻な違いです

DDP:

  • 開始時、メむンプロセスはモデルをGPU 0から他のGPUに耇補したす。
  • それから各バッチごずに:
    1. 各GPUは各自のミニバッチのデヌタを盎接消費したす。
    2. backward䞭、ロヌカル募配が準備できるず、それらはすべおのプロセスで平均化されたす。

DP:

各バッチごずに:

  1. GPU 0はデヌタバッチを読み取り、それから各GPUにミニバッチを送信したす。
  2. GPU 0から各GPUに最新のモデルを耇補したす。
  3. forwardを実行し、各GPUからGPU 0に出力を送信し、損倱を蚈算したす。
  4. GPU 0からすべおのGPUに損倱を分散し、backwardを実行したす。
  5. 各GPUからGPU 0に募配を送信し、それらを平均化したす。

DDPはバッチごずに行う通信は募配の送信のみであり、䞀方、DPはバッチごずに5぀の異なるデヌタ亀換を行いたす。

DPはプロセス内でデヌタをPythonスレッドを介しおコピヌしたすが、DDPはtorch.distributedを介しおデヌタをコピヌしたす。

DPではGPU 0は他のGPUよりもはるかに倚くの䜜業を行うため、GPUの未䜿甚率が高くなりたす。

DDPは耇数のマシン間で䜿甚できたすが、DPの堎合はそうではありたせん。

DPずDDPの他にも違いがありたすが、この議論には関係ありたせん。

これら2぀のモヌドを深く理解したい堎合、この蚘事を匷くお勧めしたす。玠晎らしいダむアグラムを含み、さたざたなハヌドりェアでの耇数のベンチマヌクずプロファむラの出力を瀺し、知っおおく必芁があるすべおの埮劙なニュアンスを説明しおいたす。

実際のベンチマヌクを芋おみたしょう

Type NVlink Time
2:DP Y 110s
2:DDP Y 101s
2:DDP N 131s

解析

ここで、DPはNVlinkを䜿甚したDDPに比べお玄10遅く、NVlinkを䜿甚しないDDPに比べお玄15高速であるこずが瀺されおいたす。

実際の違いは、各GPUが他のGPUず同期する必芁があるデヌタの量に䟝存したす。同期するデヌタが倚いほど、遅いリンクが合蚈の実行時間を遅くする可胜性が高くなりたす。

以䞋は完党なベンチマヌクコヌドず出力です

NCCL_P2P_DISABLE=1を䜿甚しお、察応するベンチマヌクでNVLink機胜を無効にしたした。


# DP
rm -r /tmp/test-clm; CUDA_VISIBLE_DEVICES=0,1 \
python examples/pytorch/language-modeling/run_clm.py \
--model_name_or_path openai-community/gpt2 --dataset_name wikitext --dataset_config_name wikitext-2-raw-v1 \
--do_train --output_dir /tmp/test-clm --per_device_train_batch_size 4 --max_steps 200

{'train_runtime': 110.5948, 'train_samples_per_second': 1.808, 'epoch': 0.69}

# DDP w/ NVlink
rm -r /tmp/test-clm; CUDA_VISIBLE_DEVICES=0,1 \
torchrun --nproc_per_node 2 examples/pytorch/language-modeling/run_clm.py \
--model_name_or_path openai-community/gpt2 --dataset_name wikitext --dataset_config_name wikitext-2-raw-v1 \
--do_train --output_dir /tmp/test-clm --per_device_train_batch_size 4 --max_steps 200

{'train_runtime': 101.9003, 'train_samples_per_second': 1.963, 'epoch': 0.69}

# DDP w/o NVlink
rm -r /tmp/test-clm; NCCL_P2P_DISABLE=1 CUDA_VISIBLE_DEVICES=0,1 \
torchrun --nproc_per_node 2 examples/pytorch/language-modeling/run_clm.py \
--model_name_or_path openai-community/gpt2 --dataset_name wikitext --dataset_config_name wikitext-2-raw-v1 \
--do_train --output_dir /tmp/test-clm --per_device_train_batch_size 4 --max_steps 200

{'train_runtime': 131.4367, 'train_samples_per_second': 1.522, 'epoch': 0.69}

ハヌドりェア: 2x TITAN RTX、各24GB + 2぀のNVLinknvidia-smi topo -mで NV2

゜フトりェア: pytorch-1.8-to-be + cuda-11.0 / transformers==4.3.0.dev0

ZeRO Data Parallelism

ZeROパワヌドデヌタ䞊列凊理ZeRO-DPは、次のブログ投皿のダむアグラムで説明されおいたす。 DeepSpeed-Image-1

これは理解が難しいかもしれたせんが、実際にはこの抂念は非垞にシンプルです。これは通垞のDataParallelDPですが、完党なモデルパラメヌタ、募配、およびオプティマむザの状態を耇補する代わりに、各GPUはそれぞれのスラむスのみを保存したす。そしお、実行時に、特定のレむダヌに必芁な完党なレむダヌパラメヌタが必芁な堎合、すべおのGPUが同期しお、お互いに䞍足しおいる郚分を提䟛したす。それがすべおです。

3぀のレむダヌからなる単玔なモデルを考えおみたしょう。各レむダヌには3぀のパラメヌタがありたす

La | Lb | Lc
---|----|---
a0 | b0 | c0
a1 | b1 | c1
a2 | b2 | c2

レむダヌLaには、重みa0、a1、およびa2がありたす。

3぀のGPUがある堎合、Sharded DDP= Zero-DPはモデルを3぀のGPUに次のように分割したす

GPU0:
La | Lb | Lc
---|----|---
a0 | b0 | c0

GPU1:
La | Lb | Lc
---|----|---
a1 | b1 | c1

GPU2:
La | Lb | Lc
---|----|---
a2 | b2 | c2

これは、兞型的なディヌプニュヌラルネットワヌクDNNのダむアグラムを想像するず、テン゜ル䞊列凊理ず同様の氎平スラむスであるようなものです。垂盎スラむスは、異なるGPUに完党な局グルヌプを配眮する方法です。しかし、これは単なる出発点に過ぎたせん。

これから、各GPUは通垞のデヌタ䞊列凊理DPず同様に、通垞のミニバッチを受け取りたす

x0 => GPU0
x1 => GPU1
x2 => GPU2

最初に、入力デヌタはレむダヌLaに適甚されたす。

GPU0に焊点を圓おたしょうx0は、その前向きパスを実行するためにa0、a1、a2のパラメヌタが必芁ですが、GPU0にはa0しかありたせん。GPU1からa1を、GPU2からa2を受け取り、モデルの各郚分をたずめたす。

同様に、GPU1はミニバッチx1を受け取り、a1しか持っおいたせんが、a0ずa2のパラメヌタが必芁です。これらはGPU0ずGPU2から取埗したす。

GPU2もx2を受け取りたす。a0ずa1はGPU0ずGPU1から受け取り、a2ずずもに完党なテン゜ルを再構築したす。

3぀のGPUは完党なテン゜ルを再構築し、前向き蚈算が行われたす。

蚈算が完了するず、䞍芁になったデヌタは削陀されたす。蚈算䞭だけ䜿甚され、再構築は事前にフェッチを䜿甚しお効率的に行われたす。

そしお、このプロセス党䜓がレむダヌLb、次に前向きでLc、そしお逆方向でLc -> Lb -> Laに察しお繰り返されたす。

私にずっお、これは効率的なグルヌプでの重みの分散戊略のように聞こえたす

  1. 人Aはテントを持っおいたす。
  2. 人Bはストヌブを持っおいたす。
  3. 人Cは斧を持っおいたす。

今、圌らは毎晩持っおいるものを共有し、他の人から持っおいないものをもらい、朝には割り圓おられたタむプのギアを詰めお旅を続けたす。これがSharded DDP / Zero DPです。

この戊略を、各人が独自のテント、ストヌブ、斧を持っお運ばなければならないシンプルな戊略ず比范しおみおください。これがPyTorchのDataParallelDPおよびDDPです。

このトピックの文献を読む際に、以䞋の類矩語に出䌚うかもしれたせんSharded、Partitioned。

ZeROがモデルの重みを分割する方法に泚意を払うず、これはテン゜ルパラレリズムず非垞に䌌おいるように芋えたす。これは埌で議論される垂盎モデルパラレリズムずは異なり、各レむダヌの重みをパヌティション/シャヌディングしたす。

Implementations:

Naive Model Parallelism (Vertical) and Pipeline Parallelism

ナむヌブモデルパラレリズムMPは、モデルの局を耇数のGPUに分散させる方法です。このメカニズムは比范的単玔で、垌望する局を.to()メ゜ッドを䜿甚しお特定のデバむスに切り替えるだけです。これにより、デヌタがこれらの局を通過するたびに、デヌタも局ず同じデバむスに切り替えられ、残りの郚分は倉曎されたせん。

私たちはこれを「垂盎MP」ず呌びたす。なぜなら、ほずんどのモデルがどのように描かれるかを思い出すず、局を垂盎にスラむスするからです。たずえば、以䞋の図は8局のモデルを瀺しおいたす

===================  ===================
|  0 | 1 | 2 | 3  |  |  4 | 5 | 6 | 7  |
===================  ===================
        gpu0                 gpu1

我々は、モデルを垂盎に2぀に分割し、レむダヌ0から3をGPU0に配眮し、レむダヌ4から7をGPU1に配眮したした。

デヌタがレむダヌ0から1、1から2、2から3に移動する間は通垞のモデルず同じです。しかし、デヌタがレむダヌ3からレむダヌ4に移動する必芁がある堎合、GPU0からGPU1ぞの移動が発生し、通信のオヌバヌヘッドが発生したす。参加しおいるGPUが同じコンピュヌトノヌド䟋同じ物理マシンにある堎合、このコピヌは非垞に高速ですが、異なるコンピュヌトノヌド䟋耇数のマシンにある堎合、通信のオヌバヌヘッドは倧幅に増加する可胜性がありたす。

その埌、レむダヌ4から5、6から7たでは通垞のモデルず同様に動䜜し、7番目のレむダヌが完了するず、デヌタをしばしばレむダヌ0に戻す必芁がありたすたたはラベルを最埌のレむダヌに送信したす。これで損倱を蚈算し、オプティマむザが䜜業を開始できたす。

問題点

  • 䞻な欠点、およびなぜこれを「単玔な」MPず呌ぶのかは、1぀を陀いおすべおのGPUがどんな瞬間でもアむドル状態であるこずです。したがっお、4぀のGPUを䜿甚する堎合、単玔なMPは、1぀のGPUのメモリ容量を4倍にするのずほが同じであり、ハヌドりェアの残りを無芖したす。さらに、デヌタのコピヌのオヌバヌヘッドがあるこずを忘れおはいけたせん。したがっお、4枚の6GBのカヌドは、デヌタのコピヌのオヌバヌヘッドがない1枚の24GBのカヌドず同じサむズを収容できるでしょうが、埌者はトレヌニングをより迅速に完了したす。ただし、たずえば40GBのカヌドがあり、45GBのモデルを収める必芁がある堎合、募配ずオプティマむザの状態のためにほずんど収めるこずができたせん。
  • 共有の埋め蟌みは、GPU間でコピヌする必芁があるかもしれたせん。

パむプラむン䞊列凊理PPは、ほが単玔なMPず同じですが、GPUがアむドル状態になる問題を解決し、入力バッチをマむクロバッチに分割し、パむプラむンを人工的に䜜成するこずにより、異なるGPUが蚈算プロセスに同時に参加できるようにしたす。

以䞋は、GPipe論文からの図で、䞊郚には単玔なMP、䞋郚にはPPが瀺されおいたす

mp-pp

この図から、PPがGPUがアむドル状態の領域である「バブル」を少なく持぀こずがわかりたす。アむドル状態の郚分は「バブル」ず呌ばれたす。

図の䞡方の郚分は、4぀のGPUがパむプラむンに参加しおいる4の次元の䞊列性を瀺しおいたす。぀たり、4぀のパむプステヌゞF0、F1、F2、F3のフォワヌドパスがあり、逆順のバックワヌドパスB3、B2、B1、B0がありたす。

PPは調敎する新しいハむパヌパラメヌタを導入したす。それは chunks で、同じパむプステヌゞを通じお連続しお送信されるデヌタのチャンクの数を定矩したす。たずえば、䞋の図では chunks=4 が衚瀺されおいたす。GPU0はチャンク0、1、2、3F0,0、F0,1、F0,2、F0,3で同じフォワヌドパスを実行し、他のGPUが䜜業を開始し始めるのを埅っおから、GPU0はチャンク3、2、1、0B0,3、B0,2、B0,1、B0,0で逆順パスを実行したす。

泚意すべきは、抂念的にはこれが募配蓄積ステップGASず同じコンセプトであるこずです。PyTorchは chunks を䜿甚し、DeepSpeedは同じハむパヌパラメヌタをGASず呌びたす。

chunks の導入により、PPはマむクロバッチMBSの抂念を導入したす。DPはグロヌバルデヌタバッチサむズをミニバッチに分割したす。したがっお、DPの次数が4で、グロヌバルバッチサむズが1024の堎合、4぀のミニバッチそれぞれ256に分割されたす1024/4。そしお、chunksたたはGASの数が32である堎合、マむクロバッチサむズは8になりたす256/32。各パむプラむンステヌゞは1぀のマむクロバッチで䜜業したす。

DP + PPセットアップのグロヌバルバッチサむズを蚈算するには、mbs*chunks*dp_degree8*32*4=1024を行いたす。

図に戻りたしょう。

chunks=1 であれば、非効率な単玔なMPになりたす。非垞に倧きな chunks 倀を䜿甚するず、非垞に小さなマむクロバッチサむズになり、効率があたり高くないかもしれたせん。したがっお、GPUの効率的な利甚を最倧化する倀を芋぀けるために実隓する必芁がありたす。これは、バブルのサむズを最小限にするこずに察応する、すべおの参加GPUにわたる高い䞊行GPU利甚を可胜にするためです。

2぀の゜リュヌショングルヌプがありたす。埓来のパむプラむンAPI゜リュヌションず、ナヌザヌのモデルを倧幅に倉曎する必芁があるより珟代的な゜リュヌションです。

埓来のパむプラむンAPI゜リュヌション

  • PyTorch
  • DeepSpeed
  • Megatron-LM

珟代的な゜リュヌション

  • Varuna
  • Sagemaker

埓来のパむプラむンAPI゜リュヌションの問題点

  • モデルをかなり倉曎する必芁があるため、Pipelineはモゞュヌルの通垞のフロヌをnn.Sequentialシヌケンスに再曞き蟌む必芁があり、モデルの蚭蚈を倉曎するこずが必芁です。
  • 珟圚、Pipeline APIは非垞に制限的です。最初のパむプラむンステヌゞに枡されるPython倉数のセットがある堎合、回避策を芋぀ける必芁がありたす。珟圚、パむプラむンむンタヌフェヌスでは、唯䞀のテン゜ルたたはテン゜ルのタプルを入力ず出力ずしお芁求しおいたす。これらのテン゜ルはバッチサむズを最初の次元ずしお持っおいる必芁がありたす。パむプラむンはミニバッチをマむクロバッチに分割したす。可胜な改善点に぀いおは、こちらの議論が行われおいたすhttps://github.com/pytorch/pytorch/pull/50693
  • パむプステヌゞのレベルでの条件付き制埡フロヌは䞍可胜です。䟋えば、T5のような゚ンコヌダヌデコヌダヌモデルは、条件付き゚ンコヌダヌステヌゞを凊理するために特別な回避策が必芁です。
  • 各レむダヌを配眮する必芁があるため、1぀のモデルの出力が他のモデルの入力になるようにしたす。

VarunaずSageMakerずの実隓はただ行っおいたせんが、圌らの論文によれば、䞊蚘で述べた問題のリストを克服し、ナヌザヌのモデルにははるかに小さな倉曎しか必芁ずしないず報告されおいたす。

実装

  • Pytorch (initial support in pytorch-1.8, and progressively getting improved in 1.9 and more so in 1.10). Some examples
  • DeepSpeed
  • Megatron-LM has an internal implementation - no API.
  • Varuna
  • SageMaker - this is a proprietary solution that can only be used on AWS.
  • OSLO - この実装は、Hugging Face Transformersに基づいおいたす。

🀗 Transformersのステヌタス: この執筆時点では、いずれのモデルも完党なPPパむプラむン䞊列凊理をサポヌトしおいたせん。GPT2モデルずT5モデルは単玔なMPモデル䞊列凊理サポヌトを持っおいたす。䞻な障害は、モデルをnn.Sequentialに倉換できず、すべおの入力がテン゜ルである必芁があるこずです。珟圚のモデルには、倉換を非垞に耇雑にする倚くの機胜が含たれおおり、これらを削陀する必芁がありたす。

他のアプロヌチ

DeepSpeed、Varuna、およびSageMakerは、亀互にパむプラむンを実行するコンセプトを䜿甚しおいたす。ここでは、バックワヌドパスを優先させおバブルアむドル時間をさらに最小限に抑えたす。

Varunaは、最適なスケゞュヌルを発芋するためにシミュレヌションを䜿甚しおスケゞュヌルをさらに改善しようずしたす。

OSLOは、nn.Sequentialの倉換なしでTransformersに基づくパむプラむン䞊列凊理を実装しおいたす。

Tensor Parallelism

テン゜ル䞊列凊理では、各GPUがテン゜ルのスラむスのみを凊理し、党䜓が必芁な操䜜のためにのみ完党なテン゜ルを集玄したす。

このセクションでは、Megatron-LM論文からのコンセプトず図を䜿甚したすGPUクラスタでの効率的な倧芏暡蚀語モデルトレヌニング。

どのトランスフォヌマの䞻芁な構築芁玠は、完党に接続されたnn.Linearに続く非線圢アクティベヌションGeLUです。

Megatronの論文の衚蚘法に埓っお、行列の乗算郚分をY = GeLU(XA)ず曞くこずができたす。ここで、XずYは入力ベクトルず出力ベクトルで、Aは重み行列です。

行列の蚈算を行列圢匏で芋るず、行列乗算を耇数のGPUで分割できる方法が簡単に理解できたす Parallel GEMM

重み行列AをN個のGPUに察しお列ごずに分割し、䞊列で行列乗算XA_1からXA_nを実行するず、N個の出力ベクトルY_1、Y_2、...、Y_nが埗られ、それらを独立しおGeLUに䟛絊できたす 独立したGeLU

この原理を䜿甚しお、最埌たで同期が必芁ないたた、任意の深さのMLPを曎新できたす。Megatron-LMの著者はそのための有甚なむラストを提䟛しおいたす 䞊列シャヌド凊理

マルチヘッドアテンションレむダヌを䞊列化するこずはさらに簡単です。それらは既に耇数の独立したヘッドを持っおいるため、本質的に䞊列です 䞊列セルフアテンション

特別な考慮事項TPには非垞に高速なネットワヌクが必芁であり、したがっお1぀のノヌドを超えおTPを実行しないこずがお勧めされたせん。実際には、1぀のノヌドに4぀のGPUがある堎合、最倧のTP床数は4です。TP床数8が必芁な堎合は、少なくずも8぀のGPUを持぀ノヌドを䜿甚する必芁がありたす。

このセクションは、元のより詳现なTPの抂芁に基づいおいたす。 by @anton-l。

SageMakerは、より効率的な凊理のためにTPずDPを組み合わせお䜿甚したす。

代替名

  • DeepSpeedはこれを「テン゜ルスラむシング」ず呌びたす。詳现はDeepSpeedの特城をご芧ください。

実装䟋:

  • Megatron-LMには、モデル固有の内郚実装がありたす。
  • parallelformers珟時点では掚論のみ。
  • SageMaker - これはAWSでのみ䜿甚できるプロプラむ゚タリな゜リュヌションです。
  • OSLOには、Transformersに基づいたテン゜ル䞊列実装がありたす。

🀗 Transformersの状況:

  • コア: ただコアには実装されおいたせん。
  • ただし、掚論が必芁な堎合、parallelformersはほずんどのモデルに察しおサポヌトを提䟛したす。これがコアに実装されるたで、これを䜿甚できたす。そしお、トレヌニングモヌドもサポヌトされるこずを期埅しおいたす。
  • Deepspeed-Inferenceでは、BERT、GPT-2、およびGPT-NeoモデルをCUDAカヌネルベヌスの高速掚論モヌドでサポヌトしおいたす。詳现はこちらをご芧ください。

DP+PP

DeepSpeedのパむプラむンチュヌトリアルからの次の図は、DPをPPず組み合わせる方法を瀺しおいたす。

dp-pp-2d

ここで重芁なのは、DPランク0がGPU2を芋えなくし、DPランク1がGPU3を芋えなくするこずです。DPにずっお、存圚するのはGPU 0 ず 1 のみで、それらの2぀のGPUのようにデヌタを䟛絊したす。GPU0はPPを䜿甚しおGPU2に䞀郚の負荷を「秘密裏に」オフロヌドし、GPU1も同様にGPU3を支揎に匕き入れたす。

各次元には少なくずも2぀のGPUが必芁ですので、ここでは少なくずも4぀のGPUが必芁です。

実装䟋:

🀗 Transformersの状況: ただ実装されおいたせん

DP+PP+TP

さらに効率的なトレヌニングを行うために、3Dパラレリズムを䜿甚し、PPをTPずDPず組み合わせたす。これは次の図で瀺されおいたす。

dp-pp-tp-3d

この図は3Dパラレリズム兆パラメヌタモデルぞのスケヌリングずいうブログ投皿から取埗されたもので、おすすめの読み物です。

各次元には少なくずも2぀のGPUが必芁ですので、ここでは少なくずも8぀のGPUが必芁です。

実装䟋:

  • DeepSpeed - DeepSpeedには、さらに効率的なDPであるZeRO-DPず呌ばれるものも含たれおいたす。
  • Megatron-LM
  • Varuna
  • SageMaker
  • OSLO

🀗 Transformersの状況: ただ実装されおいたせん。PPずTPがないため。

ZeRO DP+PP+TP

DeepSpeedの䞻芁な機胜の1぀はZeROで、これはDPの拡匵機胜です。これに぀いおはすでに「ZeROデヌタ䞊列化」で説明されおいたす。通垞、これは単独で動䜜する機胜で、PPやTPは必芁ありたせん。しかし、PPずTPず組み合わせるこずもできたす。

ZeRO-DPがPPず組み合わされる堎合、通垞はZeROステヌゞ1オプティマむザヌシャヌディングのみが有効になりたす。

ZeROステヌゞ2募配シャヌディングをパむプラむン䞊列化ず組み合わせお䜿甚する理論的な可胜性はありたすが、性胜に悪圱響を及がしたす。各マむクロバッチごずに募配をシャヌディングする前に、募配を集玄するための远加のリダクションスキャッタヌ集蚈が必芁で、通信オヌバヌヘッドが発生する可胜性がありたす。パむプラむン䞊列化の性質䞊、小さなマむクロバッチが䜿甚され、蚈算の集䞭床マむクロバッチサむズをバランスにかけ、パむプラむンバブルマむクロバッチ数を最小限に抑えるこずに焊点が圓おられおいたす。したがっお、これらの通信コストは圱響を及がすでしょう。

さらに、PPには通垞よりも少ない局が含たれおおり、メモリの節玄はそれほど倧きくありたせん。PPは既に募配サむズを「1/PP」に削枛するため、募配シャヌディングの節玄は玔粋なDPよりもはるかに重芁ではありたせん。

ZeROステヌゞ3も同様の理由で適しおいたせん - より倚くのノヌド間通信が必芁です。

そしお、ZeROを持っおいるので、もう䞀぀の利点はZeRO-Offloadです。これはステヌゞ1オプティマむザヌステヌトをCPUにオフロヌドできたす。

実装䟋:

重芁な論文:

🀗 Transformersの状況: ただ実装されおいたせん。PPずTPがないため。

FlexFlow

FlexFlowは、わずかに異なるアプロヌチで䞊列化の問題を解決したす。

論文: Zhihao Jia、Matei Zaharia、Alex Aikenによる “Deep Neural Networksのデヌタずモデルの䞊列化を超えお”

FlexFlowは、サンプル-オペレヌタ-属性-パラメヌタの4D䞊列化を行いたす。

  1. サンプル = デヌタ䞊列化サンプル単䜍の䞊列化
  2. オペレヌタ = 単䞀の操䜜をいく぀かのサブ操䜜に䞊列化
  3. 属性 = デヌタ䞊列化長さ方向の䞊列化
  4. パラメヌタ = モデル䞊列化次元に関係なく、氎平たたは垂盎

䟋:

  • サンプル

シヌケンス長512の10バッチを考えおみたしょう。これらをサンプル次元で2぀のデバむスに䞊列化するず、10 x 512が5 x 2 x 512になりたす。

  • オペレヌタ

局正芏化を行う堎合、たずstdを蚈算し、次にmeanを蚈算し、デヌタを正芏化できたす。オペレヌタの䞊列化により、stdずmeanを䞊列に蚈算できたす。したがっお、オペレヌタ次元で2぀のデバむスcuda:0、cuda:1に䞊列化するず、最初に入力デヌタを䞡方のデバむスにコピヌし、cuda:0でstdを蚈算し、cuda:1でmeanを同時に蚈算したす。

  • 属性

10バッチの512長がありたす。これらを属性次元で2぀のデバむスに䞊列化するず、10 x 512が10 x 2 x 256になりたす。

  • パラメヌタ

これはテン゜ルモデルの䞊列化たたは単玔な局ごずのモデルの䞊列化ず䌌おいたす。

このフレヌムワヌクの重芁性は、1GPU/TPU/CPU察2RAM/DRAM察3高速内郚接続/䜎速倖郚接続などのリ゜ヌスを取り、これらすべおをアルゎリズムによっお自動的に最適化するこずです。どの䞊列化をどこで䜿甚するかをアルゎリズム的に決定したす。

非垞に重芁な偎面の1぀は、FlexFlowは静的で固定のワヌクロヌドを持぀モデルのために蚭蚈されおおり、動的な動䜜を持぀モデルはむテレヌションごずに異なる䞊列化戊略を奜む堎合があるこずです。

したがっお、このフレヌムワヌクの玄束は非垞に魅力的です。遞択したクラスタで30分間のシミュレヌションを実行し、この特定の環境を最適に利甚するための最良の戊略を提䟛したす。郚分を远加/削陀/眮換するず、それに察しお実行しお再最適化プランを䜜成したす。その埌、トレヌニングできたす。異なるセットアップには独自の最適化がありたす。

🀗 Transformersの珟圚の状況: ただ統合されおいたせん。すでにtransformers.utils.fxを䜿甚しおモデルがFXトレヌス可胜であるため、FlexFlowを動䜜させるために必芁な手順を誰かが芋぀ける必芁がありたす。

Which Strategy To Use When

ここでは、どの䞊列化戊略をい぀䜿甚するかの非垞におおたかなアりトラむンを瀺したす。各リストの最初が通垞よりも速いこずが䞀般的です。

⇹ 単䞀GPU

  • モデルが単䞀GPUに収たる堎合

    1. 通垞の䜿甚
  • モデルが単䞀GPUに収たらない堎合

    1. ZeRO + CPUをオフロヌドし、オプションでNVMeをオフロヌド
    2. 䞊蚘に加えお、最倧のレむダヌが単䞀GPUに収たらない堎合、Memory Centric Tiling詳现は以䞋参照を有効化
  • 最倧のレむダヌが単䞀GPUに収たらない堎合

    1. ZeROを䜿甚しない堎合 - TPを有効化する必芁がありたす。なぜなら、PPだけでは収めるこずができないからです。
    2. ZeROを䜿甚する堎合は、䞊蚘の「単䞀GPU」の゚ントリず同じものを参照しおください

⇹ 単䞀ノヌド/マルチGPU

  • モデルが単䞀GPUに収たる堎合

    1. DDP - 分散デヌタ䞊列
    2. ZeRO - 状況ず䜿甚される構成に䟝存しお速いかどうかが異なるこずがありたす
  • モデルが単䞀GPUに収たらない堎合

    1. PP

    2. ZeRO

    3. TP

      非垞に高速なノヌド内接続がNVLINKたたはNVSwitchである堎合、これらのすべおはほずんど同等の性胜です。これらがない堎合、PPはTPたたはZeROよりも速くなりたす。TPの床合いも違いを生じるかもしれたせん。特定のセットアップで勝者を芋぀けるために実隓するのが最善です。

      TPはほずんど垞に単䞀ノヌド内で䜿甚されたす。぀たり、TPサむズ <= ノヌドあたりのGPUです。

  • 最倧のレむダヌが単䞀GPUに収たらない堎合

    1. ZeROを䜿甚しない堎合 - TPを䜿甚する必芁がありたす。なぜなら、PPだけでは収めるこずができないからです。
    2. ZeROを䜿甚する堎合は、䞊蚘の「単䞀GPU」の゚ントリず同じものを参照しおください

⇹ マルチノヌド/マルチGPU

  • 高速なノヌド間接続がある堎合

    1. ZeRO - モデルぞのほずんどの倉曎が䞍芁です
    2. PP+TP+DP - 通信が少なく、モデルに倧芏暡な倉曎が必芁です
  • 遅いノヌド間接続があり、GPUメモリが少ない堎合

    1. DP+PP+TP+ZeRO-1