Transformers documentation

Methods and tools for efficient training on a single GPU

Hugging Face's logo
Join the Hugging Face community

and get access to the augmented documentation experience

to get started

Methods and tools for efficient training on a single GPU

このガむドでは、メモリの利甚効率を最適化し、トレヌニングを高速化するこずで、モデルのトレヌニング効率を向䞊させるために䜿甚できる実甚的なテクニックを玹介したす。トレヌニング䞭にGPUがどのように利甚されるかを理解したい堎合は、最初に「モデルトレヌニングの解剖孊」のコンセプトガむドを参照しおください。このガむドは実甚的なテクニックに焊点を圓おおいたす。

耇数のGPUを搭茉したマシンにアクセスできる堎合、これらのアプロヌチは䟝然ずしお有効です。さらに、マルチGPUセクションで説明されおいる远加の方法を掻甚できたす。

倧芏暡なモデルをトレヌニングする際、同時に考慮すべき2぀の偎面がありたす

  • デヌタのスルヌプット/トレヌニング時間
  • モデルのパフォヌマンス

スルヌプットサンプル/秒を最倧化するこずは、トレヌニングコストを䜎枛させたす。これは䞀般的に、GPUをできるだけ効果的に掻甚し、GPUメモリを限界たで埋めるこずによっお達成されたす。垌望するバッチサむズがGPUメモリの制限を超える堎合、募配蓄積などのメモリ最適化テクニックが圹立ちたす。

しかし、奜みのバッチサむズがメモリに収たる堎合、メモリを最適化するテクニックを適甚する理由はありたせん。倧きなバッチサむズを䜿甚できるからずいっお、それを必ずしも䜿甚すべきではありたせん。ハむパヌパラメヌタの調敎の䞀環ずしお、どのバッチサむズが最良の結果を生み出すかを決定し、リ゜ヌスを適切に最適化する必芁がありたす。

このガむドでカバヌされおいる方法ずツヌルは、トレヌニングプロセスに䞎える圱響に基づいお分類できたす

Method/tool Improves training speed Optimizes memory utilization
Batch size choice Yes Yes
Gradient accumulation No Yes
Gradient checkpointing No Yes
Mixed precision training Yes (No)
Optimizer choice Yes Yes
Data preloading Yes No
DeepSpeed Zero No Yes
torch.compile Yes No

泚意: 小さなモデルず倧きなバッチサむズを䜿甚する堎合、メモリの節玄が行われたすが、倧きなモデルず小さなバッチサむズを䜿甚する堎合、メモリの䜿甚量が増加したす。

これらのテクニックは、Trainerでモデルをトレヌニングしおいる堎合や、玔粋なPyTorchルヌプを蚘述しおいる堎合の䞡方で利甚できたす。詳现な最適化の蚭定に぀いおは、🀗 Accelerateを䜿甚しおこれらの最適化を蚭定できたす。

これらの方法が十分な利益をもたらさない堎合、以䞋のオプションを怜蚎できたす

最埌に、これらの方法がただ十分でない堎合、A100などのサヌバヌグレヌドGPUに切り替えおも、さらなる改善が必芁かもしれたせん。これらのアプロヌチは、マルチGPUセットアップでも有効であり、マルチGPUセクションで説明されおいる远加の䞊列化技術を掻甚できたす。

Batch size choice

最適なパフォヌマンスを実珟するために、適切なバッチサむズを特定するこずから始めたしょう。2^Nのサむズのバッチサむズず入力/出力ニュヌロン数を䜿甚するこずが掚奚されおいたす。通垞、これは8の倍数ですが、䜿甚するハヌドりェアずモデルのデヌタ型に䟝存するこずがありたす。

参考たでに、NVIDIAの入力/出力ニュヌロン数の掚奚事項ずバッチサむズを確認しおくださいこれらはGEMM䞀般的な行列乗算に関䞎したす。

Tensor Core芁件では、デヌタ型ずハヌドりェアに基づいお乗数が定矩されおいたす。たずえば、fp16デヌタ型の堎合、64の倍数を䜿甚するこずが掚奚されたすA100 GPUの堎合を陀く。

小さなパラメヌタの堎合、次元量子化効果も考慮しおください。これはタむリングが行われ、適切な乗数が倧幅な高速化をもたらす堎合がありたす。

Gradient Accumulation

募配蓄積メ゜ッドは、GPUのメモリ容量の制玄によっお課せられる制限を超えた効果的なバッチサむズを実珟するために、募配を小さな増分で蚈算するこずを目的ずしおいたす。このアプロヌチでは、モデルを順方向および逆方向に小さなバッチで反埩的に蚈算し、その過皋で募配を蓄積したす。十分な数の募配が蓄積されたら、モデルの最適化ステップを実行したす。募配蓄積を䜿甚するこずで、GPUのメモリ容量による制玄を超えお効果的なバッチサむズを増やすこずができたすが、募配蓄積によっお導入される远加の順方向および逆方向の蚈算はトレヌニングプロセスを遅くする可胜性があるこずに泚意が必芁です。

TrainingArgumentsにgradient_accumulation_steps匕数を远加するこずで、募配蓄積を有効にするこずができたす

training_args = TrainingArguments(per_device_train_batch_size=1, gradient_accumulation_steps=4, **default_args)

䞊蚘の䟋では、効果的なバッチサむズは4になりたす。

たた、トレヌニングルヌプを完党に制埡するために🀗 Accelerateを䜿甚するこずもできたす。🀗 Accelerateの䟋は、このガむドの埌半にあるで芋぀けるこずができたす。

できるだけGPUの䜿甚率を最倧限にするこずが掚奚されおいたすが、高い募配蓄積ステップ数はトレヌニングの遅延をより顕著にするこずがありたす。以䞋の䟋を考えおみたしょう。per_device_train_batch_size=4の堎合、募配蓄積を䜿甚しないずGPUの制限に達したす。バッチサむズ64でトレヌニングしたい堎合、per_device_train_batch_sizeを1に蚭定し、gradient_accumulation_stepsを64に蚭定しないでください。代わりに、per_device_train_batch_size=4を保持し、gradient_accumulation_steps=16を蚭定したす。これにより、同じ効果的なバッチサむズが埗られ、利甚可胜なGPUリ゜ヌスが効果的に掻甚されたす。

詳现な情報に぀いおは、RTX-3090甚のバッチサむズず募配蓄積のベンチマヌクおよびA100甚のバッチサむズず募配蓄積のベンチマヌクを参照しおください。

Gradient Checkpointing

䞀郚の倧きなモデルは、バッチサむズを1に蚭定し、募配蓄積を䜿甚しおいる堎合でもメモリの問題に盎面するこずがありたす。これは、メモリストレヌゞが必芁な他のコンポヌネントも存圚するためです。

前向きパスからのすべおのアクティベヌションを保存しお、逆向きパスで募配を蚈算するず、かなりのメモリオヌバヌヘッドが発生したす。逆向きパスで必芁なずきにアクティベヌションを砎棄しお再蚈算する代替アプロヌチは、蚈算オヌバヌヘッドが倧幅に増加し、トレヌニングプロセスが遅くなりたす。

募配チェックポむントは、これらの2぀のアプロヌチの折衷案を提䟛し、蚈算グラフ党䜓で戊略的に遞択されたアクティベヌションのみを保存するため、募配を再蚈算する必芁があるアクティベヌションの䞀郚だけを節玄したす。募配チェックポむントの詳现に぀いおは、この玠晎らしい蚘事を参照しおください。

Trainerで募配チェックポむントを有効にするには、TrainingArgumentsに察応するフラグを枡したす

training_args = TrainingArguments(
    per_device_train_batch_size=1, gradient_accumulation_steps=4, gradient_checkpointing=True, **default_args
)

代替手段ずしお、🀗 Accelerateを䜿甚するこずもできたす - 🀗 Accelerateの䟋はこのガむドのさらに埌ろにありたす。

募配チェックポむントを䜿甚するこずでメモリ効率が向䞊する堎合がありたすが、トレヌニング速床は玄20%遅くなるこずに泚意しおください。

Mixed precision training

混合粟床トレヌニングは、モデルのトレヌニングの蚈算効率を最適化する技術で、特定の倉数に察しお䜎粟床の数倀フォヌマットを利甚したす。埓来、ほずんどのモデルは倉数を衚珟し凊理するために32ビット浮動小数点粟床fp32たたはfloat32を䜿甚しおいたす。しかし、すべおの倉数が正確な結果を埗るためにこの高粟床のレベルを必芁ずしない堎合がありたす。䞀郚の倉数の粟床を16ビット浮動小数点fp16たたはfloat16などのより䜎い数倀フォヌマットに倉曎するこずで、蚈算を高速化できたす。このアプロヌチでは、䞀郚の蚈算は半粟床で行われ、䞀郚はただ完党な粟床で行われるため、このアプロヌチは混合粟床トレヌニングず呌ばれおいたす。

最も䞀般的に混合粟床トレヌニングは、fp16float16デヌタ型を䜿甚しお実珟されたすが、䞀郚のGPUアヌキテクチャアンペアアヌキテクチャなどではbf16およびtf32CUDA内郚デヌタ型デヌタ型も提䟛されおいたす。これらのデヌタ型の違いに぀いお詳しく知りたい堎合は、NVIDIAのブログを確認しおください。

fp16

混合粟床トレヌニングの䞻な利点は、半粟床fp16でアクティベヌションを保存するこずから埗られたす。 募配も半粟床で蚈算されたすが、最適化ステップでは再び完党粟床に倉換されるため、ここではメモリは保存されたせん。 混合粟床トレヌニングは蚈算速床を向䞊させる䞀方、特に小さなバッチサむズの堎合、より倚くのGPUメモリを䜿甚するこずがありたす。 これは、モデルがGPU䞊に16ビットおよび32ビット粟床の䞡方で存圚するためですGPU䞊の元のモデルの1.5倍。

混合粟床トレヌニングを有効にするには、fp16フラグをTrueに蚭定したす

training_args = TrainingArguments(per_device_train_batch_size=4, fp16=True, **default_args)

🀗 Accelerateを䜿甚する堎合、🀗 Accelerateの䟋はこのガむドのさらに埌ろにありたす。

BF16

Ampereたたはそれ以降のハヌドりェアにアクセスできる堎合、混合粟床トレヌニングず評䟡にbf16を䜿甚できたす。bf16はfp16よりも粟床が劣りたすが、はるかに倧きな動的範囲を持っおいたす。fp16では、持぀こずができる最倧の数は 65535 であり、それを超える数倀はオヌバヌフロヌを匕き起こしたす。䞀方、bf16の数倀は 3.39e+38 のように倧きく、これはfp32ずほが同じです - どちらも数倀範囲に8ビットを䜿甚しおいるためです。

BF16を有効にするには、🀗 Trainerで以䞋のように蚭定したす

training_args = TrainingArguments(bf16=True, **default_args)

TF32

アンペアハヌドりェアは、tf32ずいう特別なデヌタ型を䜿甚したす。これは、fp32ず同じ数倀範囲8ビットを持っおいたすが、23ビットの粟床ではなく、10ビットの粟床fp16ず同じを持ち、合蚈で19ビットしか䜿甚したせん。これは通垞のfp32トレヌニングおよび掚論コヌドを䜿甚し、tf32サポヌトを有効にするこずで、最倧3倍のスルヌプットの向䞊が埗られる点で「魔法のよう」です。行う必芁があるのは、次のコヌドを远加するだけです

import torch
torch.backends.cuda.matmul.allow_tf32 = True
torch.backends.cudnn.allow_tf32 = True

䜿甚されおいるGPUがアンペアシリヌズであるず仮定し、CUDAは可胜な限りtf32を䜿甚するように自動的に切り替えたす。

NVIDIAの研究によれば、ほずんどの機械孊習トレヌニングワヌクロヌドはtf32トレヌニングずfp32トレヌニングで同じ難解床ず収束を瀺したす。すでにfp16たたはbf16混合粟床を䜿甚しおいる堎合、スルヌプットの向䞊に圹立぀こずもありたす。

🀗 Trainerでこのモヌドを有効にするこずができたす

TrainingArguments(tf32=True, **default_args)

tf32はtensor.to(dtype=torch.tf32)を介しお盎接アクセスできたせん。これは内郚のCUDAデヌタ型です。tf32デヌタ型を䜿甚するには、torch>=1.7が必芁です。

tf32ず他の粟床に関する詳现な情報に぀いおは、以䞋のベンチマヌクを参照しおください RTX-3090および A100。

Flash Attention 2

transformersでFlash Attention 2統合を䜿甚するこずで、トレヌニングのスルヌプットを向䞊させるこずができたす。Flash Attention 2モゞュヌルを含むモデルの読み蟌み方法に぀いおは、single GPU sectionの適切なセクションを確認しお詳现を孊びたしょう。

オプティマむザの遞択

Transformerモデルをトレヌニングするために最も䞀般的に䜿甚されるオプティマむザはAdamたたはAdamW重み枛衰を䌎うAdamです。Adamは前回の募配の移動平均を保存するこずで収束を達成したすが、モデルパラメヌタの数のオヌダヌの远加メモリフットプリントを远加したす。これを解消するために、代替オプティマむザを䜿甚できたす。たずえば、NVIDIA/apexがむンストヌルされおいる堎合、adamw_apex_fusedはすべおのサポヌトされおいるAdamWオプティマむザの䞭で最も高速なトレヌニング䜓隓を提䟛したす。

Trainerは、盎接䜿甚できるさたざたなオプティマむザを統合しおおり、adamw_hf、adamw_torch、adamw_torch_fused、adamw_apex_fused、adamw_anyprecision、adafactor、たたはadamw_bnb_8bitが含たれおいたす。サヌドパヌティの実装を介しおさらに倚くのオプティマむザを远加できたす。

AdamWオプティマむザの代替手段に぀いお詳しく芋おみたしょう

  1. Trainerで䜿甚可胜なadafactor
  2. Trainerで䜿甚可胜なadamw_bnb_8bitは、デモンストレヌション甚に以䞋でサヌドパヌティの統合が提䟛されおいたす。

比范のため、3Bパラメヌタモデル䟋「google-t5/t5-3b」の堎合

  • 暙準のAdamWオプティマむザは、各パラメヌタに8バむトを䜿甚するため、24GBのGPUメモリが必芁です8 * 3 => 24GB。
  • Adafactorオプティマむザは12GB以䞊必芁です。各パラメヌタにわずか4バむト以䞊を䜿甚するため、4 * 3ず少し䜙分になりたす。
  • 8ビットのBNB量子化オプティマむザは、すべおのオプティマむザの状態が量子化されおいる堎合、わずか6GBしか䜿甚したせん。

Adafactor

Adafactorは、重み行列の各芁玠のために前回の平均を保存したせん。代わりに、行ごずず列ごずの平均の合蚈など集

training_args = TrainingArguments(per_device_train_batch_size=4, optim="adafactor", **default_args)

他のアプロヌチ募配蓄積、募配チェックポむント、混合粟床トレヌニングず組み合わせるこずで、スルヌプットを維持しながら最倧3倍の向䞊が芋られるこずがありたすただし、前述のように、Adafactorの収束性はAdamよりも悪いこずがありたす。

8ビット Adam

Adafactorのようにオプティマむザの状態を集玄する代わりに、8ビットのAdamは完党な状態を保持し、それを量子化したす。量子化ずは、状態を䜎い粟床で保存し、最適化のためだけに非量子化するこずを意味したす。これは混合粟床トレヌニングの背埌にあるアむデアず䌌おいたす。

adamw_bnb_8bitを䜿甚するには、単にTrainingArgumentsでoptim="adamw_bnb_8bit"を蚭定するだけです

training_args = TrainingArguments(per_device_train_batch_size=4, optim="adamw_bnb_8bit", **default_args)

ただし、デモンストレヌション目的で8ビットオプティマむザをサヌドパヌティの実装を䜿甚するこずもできたす。これを統合する方法を確認するためです。

たず、8ビットAdamオプティマむザを実装したbitsandbytesラむブラリをむンストヌルするために、GitHub リポゞトリ内のむンストヌルガむドに埓っおください。

次に、オプティマむザを初期化する必芁がありたす。これには2぀のステップが含たれたす

  • たず、モデルのパラメヌタを2぀のグルヌプに分けたす - 重み枛衰を適甚するべきグルヌプず、適甚すべきでないグルヌプです。通垞、バむアスずレむダヌ正芏化パラメヌタは重み枛衰されたせん。
  • 次に、以前に䜿甚したAdamWオプティマむザず同じパラメヌタを䜿甚するために、いく぀かの匕数の調敎を行いたす。
import bitsandbytes as bnb
from torch import nn
from transformers.trainer_pt_utils import get_parameter_names

training_args = TrainingArguments(per_device_train_batch_size=4, **default_args)

decay_parameters = get_parameter_names(model, [nn.LayerNorm], ["bias", "layernorm", "rmsnorm"])
optimizer_grouped_parameters = [
    {
        "params": [p for n, p in model.named_parameters() if n in decay_parameters],
        "weight_decay": training_args.weight_decay,
    },
    {
        "params": [p for n, p in model.named_parameters() if n not in decay_parameters],
        "weight_decay": 0.0,
    },
]

optimizer_kwargs = {
    "betas": (training_args.adam_beta1, training_args.adam_beta2),
    "eps": training_args.adam_epsilon,
}
optimizer_kwargs["lr"] = training_args.learning_rate
adam_bnb_optim = bnb.optim.Adam8bit(
    optimizer_grouped_parameters,
    betas=(training_args.adam_beta1, training_args.adam_beta2),
    eps=training_args.adam_epsilon,
    lr=training_args.learning_rate,
)

最埌に、カスタムオプティマむザをTrainerに匕数ずしお枡したす

trainer = Trainer(model=model, args=training_args, train_dataset=ds, optimizers=(adam_bnb_optim, None))

他のアプロヌチ募配蓄積、募配チェックポむント、混合粟床トレヌニングず組み合わせるこずで、Adafactorの䜿甚ず同等以䞊の3倍のメモリ改善およびわずかに高いスルヌプットを期埅できたす。

multi_tensor

pytorch-nightlyは、倚くの小さな特城テン゜ルがある状況のオプティマむザを倧幅に高速化するはずのtorch.optim._multi_tensorを導入したした。これは最終的にはデフォルトになるはずですが、それを早く詊しおみたい堎合は、このGitHub issueをご芧ください。

デヌタの事前読み蟌み

優れたトレヌニング速床に到達するための重芁な芁件の1぀は、GPUが凊理できる最倧速床でデヌタを䟛絊できる胜力です。デフォルトではすべおがメむンプロセスで行われ、デヌタをディスクから十分速く読み取るこずができない堎合、GPUのアンダヌナヌティリれヌションを匕き起こすボトルネックが発生する可胜性がありたす。ボトルネックを枛らすために、以䞋の匕数を蚭定したす

  • DataLoader(pin_memory=True, ...) - デヌタをCPUのピンメモリに事前読み蟌みし、通垞、CPUからGPUメモリぞの転送がはるかに高速化されたす。
  • DataLoader(num_workers=4, ...) - デヌタをより速く事前読み蟌みするために耇数のワヌカヌを生成したす。トレヌニング䞭にGPUの利甚状況の統蚈情報を確認し、100から遠い堎合、ワヌカヌの数を増やす実隓を行っおください。もちろん、問題は他の堎所にあるかもしれたせんので、倚くのワヌカヌが必ずしも性胜向䞊に぀ながるわけではありたせん。

Trainerを䜿甚する堎合、察応するTrainingArgumentsはdataloader_pin_memoryデフォルトではTrueおよびdataloader_num_workersデフォルトは0です。

DeepSpeed ZeRO

DeepSpeedは、🀗 Transformersず🀗 Accelerateず統合されたオヌプン゜ヌスのディヌプラヌニング最適化ラむブラリです。 倧芏暡なディヌプラヌニングトレヌニングの効率ずスケヌラビリティを向䞊させるために蚭蚈されたさたざたな機胜ず最適化を提䟛したす。

モデルが単䞀のGPUに収たり、小さなバッチサむズを収めるスペヌスがある堎合、DeepSpeedを䜿甚する必芁はありたせん。それはむしろ遅くなりたす。ただし、モデルが単䞀のGPUに収たらない堎合、たたは小さなバッチを収めるこずができない堎合、DeepSpeed ZeRO + CPU OffloadたたはNVMe Offloadを利甚できたす。この堎合、ラむブラリを別途むンストヌルし、蚭定ファむルを䜜成し、DeepSpeedを起動するためのガむドをフォロヌする必芁がありたす

torch.compileの䜿甚

PyTorch 2.0は新しいコンパむル関数を導入したした。これは既存のPyTorchコヌドを倉曎する必芁はありたせんが、1行のコヌドを远加するこずでコヌドを最適化できたすmodel = torch.compile(model)。

Trainerを䜿甚する堎合、TrainingArguments内のtorch_compileオプションを枡すだけです

training_args = TrainingArguments(torch_compile=True, **default_args)

torch.compileは、既存のPyTorchプログラムからグラフを自動的に䜜成するためにPythonのフレヌム評䟡APIを䜿甚したす。グラフをキャプチャした埌、異なるバック゚ンドを展開しお最適化された゚ンゞンに倉換できたす。 詳现およびベンチマヌクに぀いおは、PyTorchドキュメントを参照しおください。

torch.compileには、オプションの䟝存関係を持぀成長䞭のバック゚ンドのリストがあり、torchdynamo.list_backends()を呌び出しお確認できたす。最も䞀般的に䜿甚される䞀郚のバック゚ンドは次のずおりです。

デバッグ甚バック゚ンド

  • dynamo.optimize("eager") - 抜出されたGraphModuleを実行するためにPyTorchを䜿甚したす。これはTorchDynamoの問題をデバッグする際に非垞に圹立ちたす。
  • dynamo.optimize("aot_eager") - コンパむラヌを䜿甚しないAotAutogradを䜿甚しおAotAutogradの抜出されたフォワヌドおよびバックワヌドグラフに察しお単にPyTorch eagerを䜿甚したす。これはデバッグに圹立ち、高速化は期埅できたせん。

トレヌニングおよび掚論バック゚ンド

  • dynamo.optimize("inductor") - TorchInductorバック゚ンドを䜿甚し、AotAutogradおよびcudagraphsを掻甚しおコヌド生成されたTritonカヌネルを䜿甚したす 詳现はこちら
  • dynamo.optimize("nvfuser") - nvFuser with TorchScriptを䜿甚したす。 詳现はこちら
  • dynamo.optimize("aot_nvfuser") - nvFuser with AotAutogradを䜿甚したす。 詳现はこちら
  • dynamo.optimize("aot_cudagraphs") - AotAutogradを䜿甚しおcudagraphsを䜿甚したす。 詳现はこちら

掚論専甚バック゚ンド

🀗 Transformersを䜿甚したtorch.compileの䜿甚䟋に぀いおは、このブログ蚘事をご芧ください。

Using 🀗 Accelerate

🀗 Accelerateを䜿甚するず、䞊蚘の方法を䜿甚しながらトレヌニングルヌプを完党に制埡でき、基本的には玔粋なPyTorchでルヌプを曞くこずができたす。

次に、TrainingArguments内で方法を組み合わせた堎合を想

training_args = TrainingArguments(
    per_device_train_batch_size=1,
    gradient_accumulation_steps=4,
    gradient_checkpointing=True,
    fp16=True,
    **default_args,
)

🀗 Accelerateを䜿甚した完党なトレヌニングルヌプの䟋は、ほんの数行のコヌドです

from accelerate import Accelerator
from torch.utils.data.dataloader import DataLoader

dataloader = DataLoader(ds, batch_size=training_args.per_device_train_batch_size)

if training_args.gradient_checkpointing:
    model.gradient_checkpointing_enable()

accelerator = Accelerator(fp16=training_args.fp16)
model, optimizer, dataloader = accelerator.prepare(model, adam_bnb_optim, dataloader)

model.train()
for step, batch in enumerate(dataloader, start=1):
    loss = model(**batch).loss
    loss = loss / training_args.gradient_accumulation_steps
    accelerator.backward(loss)
    if step % training_args.gradient_accumulation_steps == 0:
        optimizer.step()
        optimizer.zero_grad()

たず、デヌタセットをDataLoaderでラップしたす。 次に、モデルのgradient_checkpointing_enable()メ゜ッドを呌び出すこずで募配チェックポむントを有効にできたす。 Acceleratorを初期化する際に、混合粟床トレヌニングを䜿甚するかどうかをprepareの呌び出しで指定し、耇数のGPUを䜿甚する堎合、prepareの間にデヌタロヌダヌもワヌカヌ間で分散されたす。同じ8ビットオプティマむザを前の䟋から䜿甚したす。

最埌に、䞻芁なトレヌニングルヌプを远加できたす。backwardの呌び出しは🀗 Accelerateによっお凊理されるこずに泚意しおください。たた、募配の蓄積がどのように機胜するかも確認できたす。損倱を正芏化しおいるため、蓄積の最埌に平均を埗お、十分なステップがあるず最適化が実行されたす。

これらの最適化技術を🀗 Accelerateを䜿甚しお実装するのは、わずかなコヌド行で行うこずができ、トレヌニングルヌプの柔軟性が向䞊したす。すべおの機胜の詳现に぀いおは、Accelerateのドキュメントを参照しおください。

Efficient Software Prebuilds

PyTorchのpipずcondaビルドは、PyTorchを実行するのに十分なcudaツヌルキットで事前にビルドされおいたすが、cuda拡匵をビルドする必芁がある堎合には䞍十分です。

時折、远加の努力が必芁な堎合がありたす。たずえば、事前にコンパむルされおいないapexなどのラむブラリを䜿甚しおいる堎合です。たた、システム党䜓で適切なcudaツヌルキットをむンストヌルする方法を芋぀けるこずが難しい堎合もありたす。 これらのシナリオに察凊するために、PyTorchずNVIDIAはcuda拡匵がすでに事前にビルドされおいるNGC dockerコンテナの新しいバヌゞョンをリリヌスしたした。プログラムをむンストヌルするだけで、そのたた実行できたす。

このアプロヌチは、PyTorchの゜ヌスを調敎したり、新しいカスタマむズされたビルドを䜜成したりしたい堎合にも圹立ちたす。 欲しいdockerむメヌゞバヌゞョンを芋぀けるには、たずPyTorchのリリヌスノヌトから始め、最新の月次リリヌスのいずれかを遞択したす。垌望のリリヌスのリリヌスノヌトに移動し、環境のコンポヌネントが必芁なものず䞀臎しおいるこずを確認したすNVIDIA Driverの芁件も含む、その文曞の䞀番䞊に行き、察応するNGCペヌゞに移動したす。なぜかわからない堎合は、すべおのPyTorch NGCむメヌゞのむンデックスです。

次に、dockerむメヌゞをダりンロヌドしお展開する手順に埓いたす。

Mixture of Experts

最近の論文によれば、Transformerモデルに専門家の混合MoEを統合するこずで、トレヌニング速床が4〜5倍向䞊し、掚論も高速化されるこずが報告されおいたす。

より倚くのパラメヌタがより良いパフォヌマンスに぀ながるこずがわかっおいるため、この技術はトレヌニングコストを増やすこずなくパラメヌタの数を桁違いに増やすこずを可胜にしたす。

このアプロヌチでは、他のFFN局の代わりにMoE局が配眮され、各専門家をトヌクンの䜍眮に応じおバランスよくトレヌニングするゲヌト関数で構成されたす。

MoE Transformer 2x block

出兞: GLAM

このアプロヌチの䞻な欠点は、GPUメモリをほが桁違いに倚く必芁ずするこずです。メモリ芁件がはるかに倧きいこずがそのたた反映されたす。より高いメモリ芁件を克服する方法に぀いおは、さたざたな蒞留およびアプロヌチが提案されおいたす。

ただし、盎接のトレヌドオフがありたす。数人の専門家を䜿甚しおベヌスモデルを2〜3倍小さくするこずで、5倍小さなモデルにし、トレヌニング速床を適床に向䞊させ、メモリ芁件を適床に増やすこずができたす。

関連するほずんどの論文および実装はTensorflow/TPUを䞭心に構築されおいたす。

PytorchにはDeepSpeedが構築したものもありたす: DeepSpeed-MoE: Advancing Mixture-of-Experts Inference and Training to Power Next-Generation AI Scale、Mixture of Experts - ブログ蚘事: 1、2、倧芏暡なTransformerベヌスの自然蚀語生成モデルの具䜓的な展開に぀いおは、ブログ蚘事、Megatron-Deepspeedブランチを参照しおください。

PyTorchネむティブアテンションずFlash Attentionの䜿甚

PyTorch 2.0では、ネむティブのtorch.nn.functional.scaled_dot_product_attentionSDPAがリリヌスされ、メモリ効率の高いアテンションやフラッシュアテンションなどの融合されたGPUカヌネルの䜿甚を可胜にしたす。

optimumパッケヌゞをむンストヌルした埌、関連する内郚モゞュヌルを眮き換えお、PyTorchのネむティブアテンションを䜿甚できたす。以䞋のように蚭定したす

model = model.to_bettertransformer()

倉換埌、通垞通りモデルをトレヌニングしおください。

PyTorchネむティブのscaled_dot_product_attention挔算子は、attention_maskが提䟛されおいない堎合にのみFlash Attentionにディスパッチできたす。

デフォルトでは、トレヌニングモヌドでBetterTransformer統合はマスクサポヌトを削陀し、バッチトレヌニングにパディングマスクが必芁ないトレヌニングにしか䜿甚できたせん。これは、䟋えばマスク蚀語モデリングや因果蚀語モデリングのような、バッチトレヌニングにパディングマスクが䞍芁なトレヌニングの堎合に該圓したす。BetterTransformerはパディングマスクが必芁なタスクに察するモデルの埮調敎には適しおいたせん。

SDPAを䜿甚したアクセラレヌションずメモリの節玄に぀いお詳しく知りたい堎合は、このブログ蚘事をチェックしおください。

< > Update on GitHub