Skip to content

Latest commit

 

History

History
727 lines (552 loc) · 43.9 KB

trainer.md

File metadata and controls

727 lines (552 loc) · 43.9 KB

Trainer

[Trainer] クラスは、ほずんどの暙準的なナヌスケヌスに察しお、PyTorch で機胜を完党にトレヌニングするための API を提䟛したす。これは、サンプル スクリプト のほずんどで䜿甚されおいたす。

[Trainer] をむンスタンス化する前に、トレヌニング䞭にカスタマむズのすべおのポむントにアクセスするために [TrainingArguments] を䜜成したす。

この API は、耇数の GPU/TPU での分散トレヌニング、NVIDIA Apex および PyTorch のネむティブ AMP による混合粟床をサポヌトしたす。

[Trainer] には、䞊蚘の機胜をサポヌトする基本的なトレヌニング ルヌプが含たれおいたす。カスタム動䜜を挿入するには、それらをサブクラス化し、次のメ゜ッドをオヌバヌラむドしたす。

  • get_train_dataloader -- トレヌニング デヌタロヌダヌを䜜成したす。
  • get_eval_dataloader -- 評䟡甚デヌタロヌダヌを䜜成したす。
  • get_test_dataloader -- テスト デヌタロヌダヌを䜜成したす。
  • log -- トレヌニングを監芖しおいるさたざたなオブゞェクトに関する情報をログに蚘録したす。
  • create_optimizer_and_scheduler -- オプティマむザず孊習率スケゞュヌラが枡されなかった堎合にセットアップしたす。 初期化。 create_optimizerメ゜ッドずcreate_schedulerメ゜ッドをサブクラス化たたはオヌバヌラむドするこずもできるこずに泚意しおください。 別々に。
  • create_optimizer -- init で枡されなかった堎合にオプティマむザヌをセットアップしたす。
  • create_scheduler -- init で枡されなかった堎合、孊習率スケゞュヌラを蚭定したす。
  • compute_loss - トレヌニング入力のバッチの損倱を蚈算したす。
  • training_step -- トレヌニング ステップを実行したす。
  • prediction_step -- 評䟡/テスト ステップを実行したす。
  • evaluate -- 評䟡ルヌプを実行し、メトリクスを返したす。
  • predict -- テスト セットの予枬 (ラベルが䜿甚可胜な堎合はメトリクスも含む) を返したす。

[Trainer] クラスは 🀗 Transformers モデル甚に最適化されおおり、驚くべき動䜜をする可胜性がありたす 他の機皮で䜿甚する堎合。独自のモデルで䜿甚する堎合は、次の点を確認しおください。

  • モデルは垞に [~utils.ModelOutput] のタプルたたはサブクラスを返したす。
  • labels 匕数が指定され、その損倱が最初の倀ずしお返される堎合、モデルは損倱を蚈算できたす。 タプルの芁玠 (モデルがタプルを返す堎合)
  • モデルは耇数のラベル匕数を受け入れるこずができたす ([TrainingArguments] で label_names を䜿甚しお、その名前を [Trainer] に瀺したす) が、それらのいずれにも "label" ずいう名前を付ける必芁はありたせん。

以䞋は、加重損倱を䜿甚するように [Trainer] をカスタマむズする方法の䟋です (䞍均衡なトレヌニング セットがある堎合に圹立ちたす)。

from torch import nn
from transformers import Trainer


class CustomTrainer(Trainer):
    def compute_loss(self, model, inputs, return_outputs=False):
        labels = inputs.pop("labels")
        # forward pass
        outputs = model(**inputs)
        logits = outputs.get("logits")
        # compute custom loss (suppose one has 3 labels with different weights)
        loss_fct = nn.CrossEntropyLoss(weight=torch.tensor([1.0, 2.0, 3.0], device=model.device))
        loss = loss_fct(logits.view(-1, self.model.config.num_labels), labels.view(-1))
        return (loss, outputs) if return_outputs else loss

PyTorch [Trainer] のトレヌニング ルヌプの動䜜をカスタマむズするもう 1 ぀の方法は、トレヌニング ルヌプの状態を怜査できる callbacks を䜿甚するこずです (進行状況レポヌト、TensorBoard たたは他の ML プラットフォヌムでのログ蚘録など)。決定早期停止など。

Trainer

[[autodoc]] Trainer - all

Seq2SeqTrainer

[[autodoc]] Seq2SeqTrainer - evaluate - predict

TrainingArguments

[[autodoc]] TrainingArguments - all

Seq2SeqTrainingArguments

[[autodoc]] Seq2SeqTrainingArguments - all

Checkpoints

デフォルトでは、[Trainer] はすべおのチェックポむントを、 [TrainingArguments] を䜿甚しおいたす。これらは、xxx を含むcheckpoint-xxxずいう名前のサブフォルダヌに保存されたす。 それはトレヌニングの段階でした。

チェックポむントからトレヌニングを再開するには、次のいずれかを䜿甚しお [Trainer.train] を呌び出したす。

  • resume_from_checkpoint=True は最新のチェックポむントからトレヌニングを再開したす
  • resume_from_checkpoint=checkpoint_dir ディレクトリ内の特定のチェックポむントからトレヌニングを再開したす 合栌した。

さらに、push_to_hub=True を䜿甚するず、モデル ハブにチェックポむントを簡単に保存できたす。デフォルトでは、すべお 䞭間チェックポむントに保存されたモデルは別のコミットに保存されたすが、オプティマむザヌの状態は保存されたせん。適応できたす [TrainingArguments] の hub-strategy 倀を次のいずれかにしたす。

  • "checkpoint": 最新のチェックポむントも last-checkpoint ずいう名前のサブフォルダヌにプッシュされたす。 trainer.train(resume_from_checkpoint="output_dir/last-checkpoint") を䜿甚しおトレヌニングを簡単に再開したす。
  • "all_checkpoints": すべおのチェックポむントは、出力フォルダヌに衚瀺されるようにプッシュされたす (したがっお、1 ぀のチェックポむントが埗られたす) 最終リポゞトリ内のフォルダヌごずのチェックポむント フォルダヌ)

Logging

デフォルトでは、[Trainer] はメむンプロセスに logging.INFO を䜿甚し、レプリカがある堎合には logging.WARNING を䜿甚したす。

これらのデフォルトは、[TrainingArguments] の 5 ぀の logging レベルのいずれかを䜿甚するようにオヌバヌラむドできたす。 匕数:

  • log_level - メむンプロセス甚
  • log_level_replica - レプリカ甚

さらに、[TrainingArguments] の log_on_each_node が False に蚭定されおいる堎合、メむン ノヌドのみが メむン プロセスのログ レベル蚭定を䜿甚するず、他のすべおのノヌドはレプリカのログ レベル蚭定を䜿甚したす。

[Trainer] は、transformers のログ レベルをノヌドごずに個別に蚭定するこずに泚意しおください。 [Trainer.__init__]。したがっお、他の機胜を利甚する堎合は、これをより早く蚭定するこずをお勧めしたす (次の䟋を参照)。 [Trainer] オブゞェクトを䜜成する前の transformers 機胜。

これをアプリケヌションで䜿甚する方法の䟋を次に瀺したす。

[...]
logger = logging.getLogger(__name__)

# Setup logging
logging.basicConfig(
    format="%(asctime)s - %(levelname)s - %(name)s - %(message)s",
    datefmt="%m/%d/%Y %H:%M:%S",
    handlers=[logging.StreamHandler(sys.stdout)],
)

# set the main code and the modules it uses to the same log-level according to the node
log_level = training_args.get_process_log_level()
logger.setLevel(log_level)
datasets.utils.logging.set_verbosity(log_level)
transformers.utils.logging.set_verbosity(log_level)

trainer = Trainer(...)

そしお、メむン ノヌドず他のすべおのノヌドで重耇する可胜性が高いものを出力しないように譊告するだけを衚瀺したい堎合は、 è­Šå‘Š: 次のように実行できたす。

my_app.py ... --log_level warning --log_level_replica error

マルチノヌド環境で、各ノヌドのメむンプロセスのログを繰り返したくない堎合は、次のようにしたす。 䞊蚘を次のように倉曎したす。

my_app.py ... --log_level warning --log_level_replica error --log_on_each_node 0

その埌、最初のノヌドのメむン プロセスのみが「譊告」レベルでログに蚘録され、メむン ノヌド䞊の他のすべおのプロセスはログに蚘録されたす。 ノヌドず他のノヌド䞊のすべおのプロセスは「゚ラヌ」レベルでログに蚘録されたす。

アプリケヌションをできるだけ静かにする必芁がある堎合は、次のようにしたす。

my_app.py ... --log_level error --log_level_replica error --log_on_each_node 0

(マルチノヌド環境の堎合は --log_on_each_node 0 を远加したす)

Randomness

[Trainer] によっお生成されたチェックポむントから再開する堎合、すべおの努力がその状態を埩元するために行われたす。 python、numpy、および pytorch の RNG 状態は、そのチェックポむントを保存した時点ず同じ状態になりたす。 これにより、「停止しお再開」ずいうスタむルのトレヌニングが、ノンストップトレヌニングに可胜な限り近づけられるはずです。

ただし、さたざたなデフォルトの非決定的な pytorch 蚭定により、これは完党に機胜しない可胜性がありたす。フルをご垌望の堎合は 決定論に぀いおは、ランダム性の゜ヌスの制埡 を参照しおください。ドキュメントで説明されおいるように、これらの蚭定の䞀郚は 物事を決定論的にするもの (䟋: torch.backends.cudnn.deterministic) は物事を遅くする可胜性があるため、これは デフォルトでは実行できたせんが、必芁に応じお自分で有効にするこずができたす。

Specific GPUs Selection

どの GPU をどのような順序で䜿甚するかをプログラムに指瀺する方法に぀いお説明したす。

DistributedDataParallel を䜿甚しお GPU のサブセットのみを䜿甚する堎合、䜿甚する GPU の数を指定するだけです。 。たずえば、GPU が 4 ぀あるが、最初の 2 ぀を䜿甚したい堎合は、次のようにしたす。

torchrun --nproc_per_node=2  trainer-program.py ...

accelerate たたは deepspeed がむンストヌルされおいる堎合は、次を䜿甚しお同じこずを達成するこずもできたす。の䞀぀

accelerate launch --num_processes 2 trainer-program.py ...
deepspeed --num_gpus 2 trainer-program.py ...

これらのランチャヌを䜿甚するために、Accelerate たたは Deepspeed 統合 機胜を䜿甚する必芁はありたせん。

これたでは、プログラムに䜿甚する GPU の数を指瀺できたした。次に、特定の GPU を遞択し、その順序を制埡する方法に぀いお説明したす。

次の環境倉数は、䜿甚する GPU ずその順序を制埡するのに圹立ちたす。

CUDA_VISIBLE_DEVICES

耇数の GPU があり、そのうちの 1 ぀たたはいく぀かの GPU だけを䜿甚したい堎合は、環境倉数 CUDA_VISIBLE_DEVICES を䜿甚する GPU のリストに蚭定したす。

たずえば、4 ぀の GPU (0、1、2、3) があるずしたす。物理 GPU 0 ず 2 のみで実行するには、次のようにしたす。

CUDA_VISIBLE_DEVICES=0,2 torchrun trainer-program.py ...

したがっお、pytorch は 2 ぀の GPU のみを認識し、物理 GPU 0 ず 2 はそれぞれ cuda:0 ず cuda:1 にマッピングされたす。

順序を倉曎するこずもできたす。

CUDA_VISIBLE_DEVICES=2,0 torchrun trainer-program.py ...

ここでは、物理 GPU 0 ず 2 がそれぞれcuda:1ずcuda:0にマッピングされおいたす。

䞊蚘の䟋はすべお DistributedDataParallel 䜿甚パタヌンのものですが、同じ方法が DataParallel でも機胜したす。

CUDA_VISIBLE_DEVICES=2,0 python trainer-program.py ...

GPU のない環境を゚ミュレヌトするには、次のようにこの環境倉数を空の倀に蚭定するだけです。

CUDA_VISIBLE_DEVICES= python trainer-program.py ...

他の環境倉数ず同様に、これらをコマンド ラむンに远加する代わりに、次のように゚クスポヌトするこずもできたす。

export CUDA_VISIBLE_DEVICES=0,2
torchrun trainer-program.py ...

ただし、この方法では、以前に環境倉数を蚭定したこずを忘れお、なぜ間違った GPU が䜿甚されおいるのか理解できない可胜性があるため、混乱を招く可胜性がありたす。したがっお、このセクションのほずんどの䟋で瀺されおいるように、同じコマンド ラむンで特定の実行に察しおのみ環境倉数を蚭定するのが䞀般的です。

CUDA_DEVICE_ORDER

物理デバむスの順序を制埡する远加の環境倉数 CUDA_DEVICE_ORDER がありたす。遞択肢は次の 2 ぀です。

  1. PCIe バス ID 順 (nvidia-smi の順序ず䞀臎) - これがデフォルトです。
export CUDA_DEVICE_ORDER=PCI_BUS_ID
  1. GPU コンピュヌティング胜力順に䞊べる
export CUDA_DEVICE_ORDER=FASTEST_FIRST

ほずんどの堎合、この環境倉数を気にする必芁はありたせんが、叀い GPU ず新しい GPU が物理的に挿入されおいるため、遅い叀いカヌドが遅くなっおいるように芋えるような偏ったセットアップを行っおいる堎合には、非垞に圹立ちたす。初め。これを解決する 1 ぀の方法は、カヌドを亀換するこずです。ただし、カヌドを亀換できない堎合 (デバむスの冷华が圱響を受けた堎合など)、CUDA_DEVICE_ORDER=FASTEST_FIRSTを蚭定するず、垞に新しい高速カヌドが最初に配眮されたす。ただし、nvidia-smiは䟝然ずしお PCIe の順序でレポヌトするため、倚少混乱するでしょう。

順序を入れ替えるもう 1 ぀の解決策は、以䞋を䜿甚するこずです。

export CUDA_VISIBLE_DEVICES=1,0

この䟋では 2 ぀の GPU だけを䜿甚しおいたすが、もちろん、コンピュヌタヌに搭茉されおいる数の GPU にも同じこずが圓おはたりたす。

たた、この環境倉数を蚭定する堎合は、~/.bashrc ファむルたたはその他の起動蚭定ファむルに蚭定しお、忘れるのが最善です。

Trainer Integrations

[Trainer] は、トレヌニングを劇的に改善する可胜性のあるラむブラリをサポヌトするように拡匵されたした。 時間ずはるかに倧きなモデルに適合したす。

珟圚、サヌドパヌティの゜リュヌション DeepSpeed および PyTorch FSDP をサポヌトしおいたす。論文 ZeRO: メモリの最適化兆パラメヌタ モデルのトレヌニングに向けお、Samyam Rajbhandari、Jeff Rasley、Olatunji Ruwase、Yuxiong He 著。

この提䟛されるサポヌトは、この蚘事の執筆時点では新しくお実隓的なものです。 DeepSpeed ず PyTorch FSDP のサポヌトはアクティブであり、それに関する問題は歓迎したすが、FairScale 統合は PyTorch メむンに統合されおいるため、もうサポヌトしおいたせん (PyTorch FSDP 統合)

CUDA Extension Installation Notes

この蚘事の執筆時点では、Deepspeed を䜿甚するには、CUDA C++ コヌドをコンパむルする必芁がありたす。

すべおのむンストヌルの問題は、Deepspeed の察応する GitHub の問題を通じお察凊する必芁がありたすが、ビルド䞭に発生する可胜性のある䞀般的な問題がいく぀かありたす。 CUDA 拡匵機胜を構築する必芁がある PyTorch 拡匵機胜。

したがっお、次の操䜜を実行䞭に CUDA 関連のビルドの問題が発生した堎合は、次のずおりです。

pip install deepspeed

たず次の泚意事項をお読みください。

これらのノヌトでは、pytorch が CUDA 10.2 でビルドされた堎合に䜕をすべきかの䟋を瀺したす。あなたの状況が次のような堎合 異なる堎合は、バヌゞョン番号を目的のバヌゞョンに調敎するこずを忘れないでください。

Possible problem #1

Pytorch には独自の CUDA ツヌルキットが付属しおいたすが、これら 2 ぀のプロゞェクトをビルドするには、同䞀バヌゞョンの CUDA が必芁です。 システム党䜓にむンストヌルされたす。

たずえば、Python 環境に cudatoolkit==10.2 を指定しお pytorch をむンストヌルした堎合は、次のものも必芁です。 CUDA 10.2 がシステム党䜓にむンストヌルされたした。

正確な堎所はシステムによっお異なる堎合がありたすが、倚くのシステムでは/usr/local/cuda-10.2が最も䞀般的な堎所です。 Unix システム。 CUDA が正しく蚭定され、PATH環境倉数に远加されるず、 次のようにしおむンストヌル堎所を指定したす。

which nvcc

CUDA がシステム党䜓にむンストヌルされおいない堎合は、最初にむンストヌルしおください。お気に入りを䜿甚しお手順を芋぀けるこずができたす 怜玢゚ンゞン。たずえば、Ubuntu を䜿甚しおいる堎合は、ubuntu cuda 10.2 install を怜玢するずよいでしょう。

Possible problem #2

もう 1 ぀の考えられる䞀般的な問題は、システム党䜓に耇数の CUDA ツヌルキットがむンストヌルされおいる可胜性があるこずです。たずえばあなた がある可胜性があり

/usr/local/cuda-10.2
/usr/local/cuda-11.0

この状況では、PATH および LD_LIBRARY_PATH 環境倉数に以䞋が含たれおいるこずを確認する必芁がありたす。 目的の CUDA バヌゞョンぞの正しいパス。通垞、パッケヌゞ むンストヌラヌは、これらに、 最埌のバヌゞョンがむンストヌルされたした。適切なパッケヌゞが芋぀からないためにパッケヌゞのビルドが倱敗するずいう問題が発生した堎合は、 CUDA バヌゞョンがシステム党䜓にむンストヌルされおいるにもかかわらず、前述の 2 ぀を調敎する必芁があるこずを意味したす 環境倉数。

たず、その内容を芋おみたしょう。

echo $PATH
echo $LD_LIBRARY_PATH

それで、䞭に䜕が入っおいるかがわかりたす。

LD_LIBRARY_PATH が空である可胜性がありたす。

PATH は実行可胜ファむルが存圚する堎所をリストし、LD_LIBRARY_PATH は共有ラむブラリの堎所を瀺したす。 探すこずです。どちらの堎合も、前の゚ントリが埌の゚ントリより優先されたす。 : は耇数を区切るために䜿甚されたす ゚ントリ。

ここで、ビルド プログラムに特定の CUDA ツヌルキットの堎所を指瀺するには、最初にリストされる垌望のパスを挿入したす。 やっおいるこず

export PATH=/usr/local/cuda-10.2/bin:$PATH
export LD_LIBRARY_PATH=/usr/local/cuda-10.2/lib64:$LD_LIBRARY_PATH

既存の倀を䞊曞きするのではなく、先頭に远加するこずに泚意しおください。

もちろん、必芁に応じおバヌゞョン番号やフルパスを調敎したす。割り圓おたディレクトリが実際に機胜するこずを確認しおください 存圚する。 lib64 サブディレクトリは、libcudart.so などのさたざたな CUDA .so オブゞェクトが存圚する堎所です。 システムでは別の名前が付けられたすが、珟実を反映するように調敎しおください。

Possible problem #3

䞀郚の叀い CUDA バヌゞョンは、新しいコンパむラでのビルドを拒吊する堎合がありたす。たずえば、あなたはgcc-9を持っおいたすが、それが必芁です gcc-7。

それにはさたざたな方法がありたす。

最新の CUDA ツヌルキットをむンストヌルできる堎合は、通垞、新しいコンパむラがサポヌトされおいるはずです。

あるいは、既に所有しおいるコンパむラに加えお、䞋䜍バヌゞョンのコンパむラをむンストヌルするこずもできたす。 すでに存圚したすが、デフォルトではないため、ビルドシステムはそれを認識できたせん。 「gcc-7」がむンストヌルされおいるが、 ビルドシステムが芋぀からないずいうメッセヌゞを衚瀺する堎合は、次の方法で解決できる可胜性がありたす。

sudo ln -s /usr/bin/gcc-7  /usr/local/cuda-10.2/bin/gcc
sudo ln -s /usr/bin/g++-7  /usr/local/cuda-10.2/bin/g++

ここでは、/usr/local/cuda-10.2/bin/gcc から gcc-7 ぞのシンボリックリンクを䜜成しおいたす。 /usr/local/cuda-10.2/bin/ は PATH 環境倉数内にある必芁がありたす (前の問題の解決策を参照)。 gcc-7 (および g++7) が芋぀かるはずで、ビルドは成功したす。

い぀ものように、状況に合わせお䟋のパスを線集しおください。

PyTorch Fully Sharded Data parallel

より倧きなバッチ サむズで巚倧なモデルのトレヌニングを高速化するには、完党にシャヌド化されたデヌタ䞊列モデルを䜿甚できたす。 このタむプのデヌタ䞊列パラダむムでは、オプティマむザヌの状態、募配、パラメヌタヌをシャヌディングするこずで、より倚くのデヌタず倧芏暡なモデルをフィッティングできたす。 この機胜ずその利点の詳现に぀いおは、完党シャヌディング デヌタ䞊列ブログ をご芧ください。 最新の PyTorch の Fully Sharded Data Parallel (FSDP) トレヌニング機胜を統合したした。 必芁なのは、蚭定を通じお有効にするこずだけです。

FSDP サポヌトに必芁な PyTorch バヌゞョン: PyTorch Nightly (リリヌス埌にこれを読んだ堎合は 1.12.0) FSDP を有効にしたモデルの保存は、最近の修正でのみ利甚できるためです。

䜿甚法

  • 配垃されたランチャヌが远加されおいるこずを確認しおください ただ䜿甚しおいない堎合は、-m torch.distributed.launch --nproc_per_node=NUMBER_OF_GPUS_YOU_HAVEを䜿甚したす。

  • シャヌディング戊略:

    • FULL_SHARD : デヌタ䞊列ワヌカヌ/GPU にわたるシャヌド オプティマむザヌの状態 + 募配 + モデル パラメヌタヌ。 このためには、コマンドラむン匕数に--fsdp full_shardを远加したす。
    • SHARD_GRAD_OP : シャヌド オプティマむザヌの状態 + デヌタ䞊列ワヌカヌ/GPU 党䜓の募配。 このためには、コマンドラむン匕数に--fsdp shard_grad_opを远加したす。
    • NO_SHARD : シャヌディングなし。このためには、コマンドラむン匕数に--fsdp no_shardを远加したす。
  • パラメヌタず募配を CPU にオフロヌドするには、 コマンドラむン匕数に--fsdp "full_shard offload"たたは--fsdp "shard_grad_op offload"を远加したす。

  • default_auto_wrap_policy を䜿甚しお FSDP でレむダヌを自動的に再垰的にラップするには、 コマンドラむン匕数に--fsdp "full_shard auto_wrap"たたは--fsdp "shard_grad_op auto_wrap"を远加したす。

  • CPU オフロヌドず自動ラッピングの䞡方を有効にするには、 コマンドラむン匕数に--fsdp "full_shard offload auto_wrap"たたは--fsdp "shard_grad_op offload auto_wrap"を远加したす。

  • 残りの FSDP 構成は、--fsdp_config <path_to_fsdp_config.json>を介しお枡されたす。それは、次のいずれかの堎所です。 FSDP json 構成ファむル (䟋: fsdp_config.json)、たたはすでにロヌドされおいる json ファむルを dict ずしお䜿甚したす。

    • 自動ラッピングが有効な堎合は、トランスベヌスの自動ラップ ポリシヌたたはサむズ ベヌスの自動ラップ ポリシヌを䜿甚できたす。
      • トランスフォヌマヌベヌスの自動ラップポリシヌの堎合、構成ファむルで fsdp_transformer_layer_cls_to_wrap を指定するこずをお勧めしたす。指定しない堎合、䜿甚可胜な堎合、デフォルト倀は model._no_split_modules になりたす。 これは、ラップするトランスフォヌマヌ局クラス名のリスト (倧文字ず小文字を区別) を指定したす (䟋: [BertLayer]、[GPTJBlock]、[T5Block] ...)。 重みを共有するサブモゞュヌル (埋め蟌み局など) が異なる FSDP ラップされたナニットにならないようにする必芁があるため、これは重芁です。 このポリシヌを䜿甚するず、マルチヘッド アテンションずそれに続くいく぀かの MLP レむダヌを含むブロックごずにラッピングが発生したす。 共有埋め蟌みを含む残りの局は、同じ最も倖偎の FSDP ナニットにラップされるのが䟿利です。 したがっお、トランスベヌスのモデルにはこれを䜿甚しおください。
      • サむズベヌスの自動ラップポリシヌの堎合は、蚭定ファむルにfsdp_min_num_paramsを远加しおください。 自動ラッピングのための FSDP のパラメヌタの最小数を指定したす。
    • 蚭定ファむルで fsdp_backward_prefetch を指定できるようになりたした。次のパラメヌタのセットをい぀プリフェッチするかを制埡したす。 backward_pre ず backward_pos が利甚可胜なオプションです。 詳现に぀いおは、torch.distributed.fsdp.full_sharded_data_Parallel.BackwardPrefetchを参照しおください。
    • 蚭定ファむルで fsdp_forward_prefetch を指定できるようになりたした。次のパラメヌタのセットをい぀プリフェッチするかを制埡したす。 Trueの堎合、FSDP はフォワヌド パスでの実行䞭に、次に来るオヌルギャザヌを明瀺的にプリフェッチしたす。
    • 蚭定ファむルで limit_all_gathers を指定できるようになりたした。 Trueの堎合、FSDP は CPU スレッドを明瀺的に同期しお、実行䞭のオヌルギャザが倚すぎるのを防ぎたす。
    • activation_checkpointingを蚭定ファむルで指定できるようになりたした。 Trueの堎合、FSDP アクティベヌション チェックポむントは、FSDP のアクティベヌションをクリアするこずでメモリ䜿甚量を削枛する手法です。 特定のレむダヌを凊理し、バックワヌド パス䞭にそれらを再蚈算したす。事実䞊、これは䜙分な蚈算時間を犠牲にしたす メモリ䜿甚量を削枛したす。

泚意すべき泚意点がいく぀かありたす

  • これは generate ず互換性がないため、 --predict_with_generate ずも互換性がありたせん すべおの seq2seq/clm スクリプト (翻蚳/芁玄/clm など)。 問題 #21667 を参照しおください。

PyTorch/XLA Fully Sharded Data parallel

TPU ナヌザヌの皆様に朗報です。 PyTorch/XLA は FSDP をサポヌトするようになりたした。 最新の Fully Sharded Data Parallel (FSDP) トレヌニングがすべおサポヌトされおいたす。 詳现に぀いおは、FSDP を䜿甚した Cloud TPU での PyTorch モデルのスケヌリング および PyTorch/XLA 実装 を参照しおください。 FSDP の 必芁なのは、蚭定を通じお有効にするこずだけです。

FSDP サポヌトに必芁な PyTorch/XLA バヌゞョン: >=2.0

䜿甚法

--fsdp "full shard" を、--fsdp_config <path_to_fsdp_config.json> に加えられる次の倉曎ずずもに枡したす。

  • PyTorch/XLA FSDP を有効にするには、xlaをTrueに蚭定する必芁がありたす。
  • xla_fsdp_settings 倀は、XLA FSDP ラッピング パラメヌタを栌玍する蟞曞です。 オプションの完党なリストに぀いおは、こちら。
  • xla_fsdp_grad_ckpt。 Trueの堎合、ネストされた XLA FSDP でラップされた各レむダヌ䞊で募配チェックポむントを䜿甚したす。 この蚭定は、xla フラグが true に蚭定されおおり、自動ラッピング ポリシヌが指定されおいる堎合にのみ䜿甚できたす。 fsdp_min_num_params たたは fsdp_transformer_layer_cls_to_wrap。
  • トランスフォヌマヌ ベヌスの自動ラップ ポリシヌたたはサむズ ベヌスの自動ラップ ポリシヌのいずれかを䜿甚できたす。
    • トランスフォヌマヌベヌスの自動ラップポリシヌの堎合、構成ファむルで fsdp_transformer_layer_cls_to_wrap を指定するこずをお勧めしたす。指定しない堎合、䜿甚可胜な堎合、デフォルト倀は model._no_split_modules になりたす。 これは、ラップするトランスフォヌマヌ局クラス名のリスト (倧文字ず小文字を区別) を指定したす (䟋: [BertLayer]、[GPTJBlock]、[T5Block] ...)。 重みを共有するサブモゞュヌル (埋め蟌み局など) が異なる FSDP ラップされたナニットにならないようにする必芁があるため、これは重芁です。 このポリシヌを䜿甚するず、マルチヘッド アテンションずそれに続くいく぀かの MLP レむダヌを含むブロックごずにラッピングが発生したす。 共有埋め蟌みを含む残りの局は、同じ最も倖偎の FSDP ナニットにラップされるのが䟿利です。 したがっお、トランスベヌスのモデルにはこれを䜿甚しおください。
    • サむズベヌスの自動ラップポリシヌの堎合は、蚭定ファむルにfsdp_min_num_paramsを远加しおください。 自動ラッピングのための FSDP のパラメヌタの最小数を指定したす。

Using Trainer for accelerated PyTorch Training on Mac

PyTorch v1.12 リリヌスにより、開発者ず研究者は Apple シリコン GPU を利甚しおモデル トレヌニングを倧幅に高速化できたす。 これにより、プロトタむピングや埮調敎などの機械孊習ワヌクフロヌを Mac 䞊でロヌカルで実行できるようになりたす。 PyTorch のバック゚ンドずしおの Apple の Metal Performance Shaders (MPS) はこれを可胜にし、新しい "mps" デバむス経由で䜿甚できたす。 これにより、蚈算グラフずプリミティブが MPS Graph フレヌムワヌクず MPS によっお提䟛される調敎されたカヌネルにマッピングされたす。 詳现に぀いおは、公匏ドキュメント Mac での Accelerated PyTorch Training の玹介 を参照しおください。 および MPS バック゚ンド。

MacOS マシンに PyTorch >= 1.13 (執筆時点ではナむトリヌ バヌゞョン) をむンストヌルするこずを匷くお勧めしたす。 トランスベヌスのモデルのモデルの正確性ずパフォヌマンスの向䞊に関連する䞻芁な修正が行われおいたす。 詳现に぀いおは、pytorch/pytorch#82707 を参照しおください。

Apple Silicon チップを䜿甚したトレヌニングず掚論の利点

  1. ナヌザヌがロヌカルで倧芏暡なネットワヌクやバッチ サむズをトレヌニングできるようにしたす
  2. ナニファむド メモリ アヌキテクチャにより、デヌタ取埗の遅延が短瞮され、GPU がメモリ ストア党䜓に盎接アクセスできるようになりたす。 したがっお、゚ンドツヌ゚ンドのパフォヌマンスが向䞊したす。
  3. クラりドベヌスの開発に関連するコストや远加のロヌカル GPU の必芁性を削枛したす。

前提条件: mps サポヌトを備えたトヌチをむンストヌルするには、 この玠晎らしいメディア蚘事 GPU アクセラレヌションが M1 Mac の PyTorch に登堎 に埓っおください。 。

䜿甚法 mps デバむスは、cuda デバむスが䜿甚される方法ず同様に利甚可胜な堎合、デフォルトで䜿甚されたす。 したがっお、ナヌザヌによるアクションは必芁ありたせん。 たずえば、以䞋のコマンドを䜿甚しお、Apple Silicon GPU を䜿甚しお公匏の Glue テキスト分類タスクを (ルヌト フォルダヌから) 実行できたす。

export TASK_NAME=mrpc

python examples/pytorch/text-classification/run_glue.py \
  --model_name_or_path google-bert/bert-base-cased \
  --task_name $TASK_NAME \
  --do_train \
  --do_eval \
  --max_seq_length 128 \
  --per_device_train_batch_size 32 \
  --learning_rate 2e-5 \
  --num_train_epochs 3 \
  --output_dir /tmp/$TASK_NAME/ \
  --overwrite_output_dir

泚意すべきいく぀かの泚意事項

  1. 䞀郚の PyTorch 操䜜は mps に実装されおいないため、゚ラヌがスロヌされたす。 これを回避する 1 ぀の方法は、環境倉数 PYTORCH_ENABLE_MPS_FALLBACK=1 を蚭定するこずです。 これらの操䜜では CPU にフォヌルバックしたす。ただし、それでも UserWarning がスロヌされたす。
  2. 分散セットアップglooおよびncclは、mpsデバむスでは動䜜したせん。 これは、珟圚「mps」デバむス タむプの単䞀 GPU のみを䜿甚できるこずを意味したす。

最埌に、芚えおおいおください。 🀗 Trainer は MPS バック゚ンドのみを統合するため、 MPS バック゚ンドの䜿甚に関しお問題や質問がある堎合は、 PyTorch GitHub に問題を提出しおください。

Using Accelerate Launcher with Trainer

加速しおトレヌナヌにパワヌを䞎えたしょう。ナヌザヌが期埅するこずに関しおは、次のずおりです。

  • トレヌナヌ匕数に察しお FSDP、DeepSpeed などのトレヌナヌ むンテレヌションを倉曎せずに䜿甚し続けるこずができたす。
  • トレヌナヌで Accelerate Launcher を䜿甚できるようになりたした (掚奚)。

トレヌナヌで Accelerate Launcher を䜿甚する手順:

  1. 🀗 Accelerate がむンストヌルされおいるこずを確認しおください。Accelerate がないず Trainer を䜿甚するこずはできたせん。そうでない堎合は、pip install accelerateしおください。 Accelerate のバヌゞョンを曎新する必芁がある堎合もありたす: pip install activate --upgrade
  2. accelerate configを実行し、アンケヌトに蚘入したす。以䞋は加速蚭定の䟋です。  DDP マルチノヌド マルチ GPU 構成:
    compute_environment: LOCAL_MACHINE                                                                                             
    distributed_type: MULTI_GPU                                                                                                    
    downcast_bf16: 'no'
    gpu_ids: all
    machine_rank: 0 #change rank as per the node
    main_process_ip: 192.168.20.1
    main_process_port: 9898
    main_training_function: main
    mixed_precision: fp16
    num_machines: 2
    num_processes: 8
    rdzv_backend: static
    same_network: true
    tpu_env: []
    tpu_use_cluster: false
    tpu_use_sudo: false
    use_cpu: false

b. FSDP config: yaml compute_environment: LOCAL_MACHINE distributed_type: FSDP downcast_bf16: 'no' fsdp_config: fsdp_auto_wrap_policy: TRANSFORMER_BASED_WRAP fsdp_backward_prefetch_policy: BACKWARD_PRE fsdp_forward_prefetch: true fsdp_offload_params: false fsdp_sharding_strategy: 1 fsdp_state_dict_type: FULL_STATE_DICT fsdp_sync_module_states: true fsdp_transformer_layer_cls_to_wrap: BertLayer fsdp_use_orig_params: true machine_rank: 0 main_training_function: main mixed_precision: bf16 num_machines: 1 num_processes: 2 rdzv_backend: static same_network: true tpu_env: [] tpu_use_cluster: false tpu_use_sudo: false use_cpu: false c.ファむルを指す DeepSpeed 構成: yaml compute_environment: LOCAL_MACHINE deepspeed_config: deepspeed_config_file: /home/user/configs/ds_zero3_config.json zero3_init_flag: true distributed_type: DEEPSPEED downcast_bf16: 'no' machine_rank: 0 main_training_function: main num_machines: 1 num_processes: 4 rdzv_backend: static same_network: true tpu_env: [] tpu_use_cluster: false tpu_use_sudo: false use_cpu: false

d.加速プラグむンを䜿甚した DeepSpeed 構成:

```yaml
compute_environment: LOCAL_MACHINE                                                                                             
deepspeed_config:                                                                                                              
  gradient_accumulation_steps: 1
  gradient_clipping: 0.7
  offload_optimizer_device: cpu
  offload_param_device: cpu
  zero3_init_flag: true
  zero_stage: 2
distributed_type: DEEPSPEED
downcast_bf16: 'no'
machine_rank: 0
main_training_function: main
mixed_precision: bf16
num_machines: 1
num_processes: 4
rdzv_backend: static
same_network: true
tpu_env: []
tpu_use_cluster: false
tpu_use_sudo: false
use_cpu: false
```
  1. 加速蚭定たたはランチャヌ匕数によっお䞊蚘で凊理された匕数以倖の匕数を䜿甚しお、トレヌナヌ スクリプトを実行したす。 以䞋は、䞊蚘の FSDP 構成でaccelerate launcherを䜿甚しおrun_glue.pyを実行する䟋です。
cd transformers

accelerate launch \
./examples/pytorch/text-classification/run_glue.py \
--model_name_or_path google-bert/bert-base-cased \
--task_name $TASK_NAME \
--do_train \
--do_eval \
--max_seq_length 128 \
--per_device_train_batch_size 16 \
--learning_rate 5e-5 \
--num_train_epochs 3 \
--output_dir /tmp/$TASK_NAME/ \
--overwrite_output_dir
  1. accelerate launchするための cmd 匕数を盎接䜿甚するこずもできたす。䞊の䟋は次のようにマッピングされたす。
cd transformers

accelerate launch --num_processes=2 \
--use_fsdp \
--mixed_precision=bf16 \
--fsdp_auto_wrap_policy=TRANSFORMER_BASED_WRAP  \
--fsdp_transformer_layer_cls_to_wrap="BertLayer" \
--fsdp_sharding_strategy=1 \
--fsdp_state_dict_type=FULL_STATE_DICT \
./examples/pytorch/text-classification/run_glue.py
--model_name_or_path google-bert/bert-base-cased \
--task_name $TASK_NAME \
--do_train \
--do_eval \
--max_seq_length 128 \
--per_device_train_batch_size 16 \
--learning_rate 5e-5 \
--num_train_epochs 3 \
--output_dir /tmp/$TASK_NAME/ \
--overwrite_output_dir

詳现に぀いおは、🀗 Accelerate CLI ガむドを参照しおください: 🀗 Accelerate スクリプトの起動。

移動されたセクション:

[ DeepSpeed | Installation | Deployment with multiple GPUs | Deployment with one GPU | Deployment in Notebooks | Configuration | Passing Configuration | Shared Configuration | ZeRO | ZeRO-2 Config | ZeRO-3 Config | NVMe Support | ZeRO-2 vs ZeRO-3 Performance | ZeRO-2 Example | ZeRO-3 Example | Optimizer | Scheduler | fp32 Precision | Automatic Mixed Precision | Batch Size | Gradient Accumulation | Gradient Clipping | Getting The Model Weights Out ]