transformers/docs/source/ja/main_classes/deepspeed.md
Klaus Hipp 721ee783ca
[Docs] Fix spelling and grammar mistakes (#28825)
* Fix typos and grammar mistakes in docs and examples

* Fix typos in docstrings and comments

* Fix spelling of `tokenizer` in model tests

* Remove erroneous spaces in decorators

* Remove extra spaces in Markdown link texts
2024-02-02 08:45:00 +01:00

109 KiB
Raw Blame History

DeepSpeed Integration

DeepSpeed は、ZeRO 論文 で説明されおいるすべおを実装したす。珟圚、次のものを完党にサポヌトしおいたす。

  1. オプティマむザヌの状態分割 (ZeRO ステヌゞ 1)
  2. 募配分割 (ZeRO ステヌゞ 2)
  3. パラメヌタヌの分割 (ZeRO ステヌゞ 3)
  4. カスタム混合粟床トレヌニング凊理
  5. 䞀連の高速 CUDA 拡匵ベヌスのオプティマむザヌ
  6. CPU および NVMe ぞの ZeRO オフロヌド

ZeRO-Offload には独自の専甚ペヌパヌがありたす: ZeRO-Offload: Democratizing Billion-Scale Model Training。 NVMe サポヌトに぀いおは、論文 ZeRO-Infinity: Breaking the GPU Memory Wall for Extreme Scale Deep Learning。

DeepSpeed ZeRO-2 は、その機胜が掚論には圹に立たないため、䞻にトレヌニングのみに䜿甚されたす。

DeepSpeed ZeRO-3 は、巚倧なモデルを耇数の GPU にロヌドできるため、掚論にも䜿甚できたす。 単䞀の GPU では䞍可胜です。

🀗 Transformers は、2 ぀のオプションを介しお DeepSpeed を統合したす。

  1. [Trainer] によるコア DeepSpeed 機胜の統合。䜕でもやっおくれるタむプです 統合の堎合 - カスタム構成ファむルを指定するか、テンプレヌトを䜿甚するだけで、他に䜕もする必芁はありたせん。たいおいの このドキュメントではこの機胜に焊点を圓おおいたす。
  2. [Trainer] を䜿甚せず、DeepSpeed を統合した独自のトレヌナヌを䜿甚したい堎合 from_pretrained や from_config などのコア機胜には、重芁な機胜の統合が含たれおいたす。 ZeRO ステヌゞ 3 以降の zero.Initなどの DeepSpeed の郚分。この機胜を掻甚するには、次のドキュメントをお読みください。 非トレヌナヌ DeepSpeed 統合。

統合されおいるもの:

トレヌニング

  1. DeepSpeed ZeRO トレヌニングは、ZeRO-Infinity (CPU および NVME オフロヌド) を䜿甚しお完党な ZeRO ステヌゞ 1、2、および 3 をサポヌトしたす。

掚論

  1. DeepSpeed ZeRO Inference は、ZeRO-Infinity による ZeRO ステヌゞ 3 をサポヌトしたす。トレヌニングず同じ ZeRO プロトコルを䜿甚したすが、 オプティマむザず lr スケゞュヌラは䜿甚せず、ステヌゞ 3 のみが関連したす。詳现に぀いおは、以䞋を参照しおください。 れロ掚論。

DeepSpeed Inference もありたす。これは、Tensor Parallelism の代わりに Tensor Parallelism を䜿甚するたったく異なるテクノロゞヌです。 ZeRO (近日公開)。

Trainer Deepspeed Integration

Installation

pypi 経由でラむブラリをむンストヌルしたす。

pip install deepspeed

たたはtansformers, extras経由:

pip install transformers[deepspeed]

たたは、DeepSpeed の GitHub ペヌゞ で詳现を確認しおください。 高床なむンストヌル。

それでもビルドに苊劎する堎合は、たず CUDA 拡匵機胜のむンストヌル ノヌト を必ず読んでください。

拡匵機胜を事前ビルドせず、実行時に拡匵機胜がビルドされるこずに䟝存しおおり、䞊蚘の解決策をすべお詊した堎合 それが圹に立たなかった堎合、次に詊すべきこずは、モゞュヌルをむンストヌルする前にモゞュヌルを事前にビルドするこずです。

DeepSpeed のロヌカル ビルドを䜜成するには:

git clone https://github.com/microsoft/DeepSpeed/
cd DeepSpeed
rm -rf build
TORCH_CUDA_ARCH_LIST="8.6" DS_BUILD_CPU_ADAM=1 DS_BUILD_UTILS=1 pip install . \
--global-option="build_ext" --global-option="-j8" --no-cache -v \
--disable-pip-version-check 2>&1 | tee build.log

NVMe オフロヌドを䜿甚する堎合は、䞊蚘の手順にDS_BUILD_AIO=1を含める必芁がありたす (たた、 libaio-dev システム党䜓にむンストヌルしたす)。

TORCH_CUDA_ARCH_LIST を線集しお、䜿甚する GPU カヌドのアヌキテクチャのコヌドを挿入したす。すべおを仮定するず あなたのカヌドは同じで、次の方法でアヌチを取埗できたす。

CUDA_VISIBLE_DEVICES=0 python -c "import torch; print(torch.cuda.get_device_capability())"

したがっお、8, 6を取埗した堎合は、TORCH_CUDA_ARCH_LIST="8.6"を䜿甚したす。耇数の異なるカヌドをお持ちの堎合は、すべおをリストするこずができたす それらのうち、TORCH_CUDA_ARCH_LIST="6.1;8.6"が奜きです

耇数のマシンで同じセットアップを䜿甚する必芁がある堎合は、バむナリ ホむヌルを䜜成したす。

git clone https://github.com/microsoft/DeepSpeed/
cd DeepSpeed
rm -rf build
TORCH_CUDA_ARCH_LIST="8.6" DS_BUILD_CPU_ADAM=1 DS_BUILD_UTILS=1 \
python setup.py build_ext -j8 bdist_wheel

dist/deepspeed-0.3.13+8cd046f-cp38-cp38-linux_x86_64.whlのようなものが生成されるので、これをむンストヌルできたす pip install deepspeed-0.3.13+8cd046f-cp38-cp38-linux_x86_64.whlずしおロヌカルたたは他のマシンにむンストヌルしたす。

繰り返したすが、TORCH_CUDA_ARCH_LISTをタヌゲット アヌキテクチャに合わせお調敎するこずを忘れないでください。

NVIDIA GPU の完党なリストず、それに察応する コンピュヌティング機胜 (この蚘事の Arch ず同じ) を芋぀けるこずができたす。 コンテキスト) ここ。

以䞋を䜿甚しお、pytorch が構築されたアヌチを確認できたす。

python -c "import torch; print(torch.cuda.get_arch_list())"

ここでは、むンストヌルされおいる GPU の 1 ぀のアヌチを芋぀ける方法を説明したす。たずえば、GPU 0 の堎合:

CUDA_VISIBLE_DEVICES=0 python -c "import torch; \
print(torch.cuda.get_device_properties(torch.device('cuda')))"

出力が次の堎合:

_CudaDeviceProperties(name='GeForce RTX 3090', major=8, minor=6, total_memory=24268MB, multi_processor_count=82)

そうすれば、このカヌドのアヌチが8.6であるこずがわかりたす。

TORCH_CUDA_ARCH_LIST を完党に省略するこずもできたす。そうすれば、ビルド プログラムが自動的にク゚リを実行したす。 ビルドが行われる GPU のアヌキテクチャ。これは、タヌゲット マシンの GPU ず䞀臎する堎合もあれば、䞀臎しない堎合もありたす。 目的のアヌチを明瀺的に指定するこずをお勧めしたす。

提案されたこずをすべお詊しおもただビルドの問題が発生する堎合は、GitHub の問題に進んでください。 ディヌプスピヌド、

Deployment with multiple GPUs

DeepSpeed 統合をデプロむするには、[Trainer] コマンド ラむン匕数を調敎しお新しい匕数 --deepspeed ds_config.json を含めたす。ここで、ds_config.json は DeepSpeed 構成ファむルです。 こちらに蚘茉されおいたす。ファむル名はあなた次第です。 DeepSpeed のadd_config_argumentsナヌティリティを䜿甚しお、必芁なコマンド ラむン匕数をコヌドに远加するこずをお勧めしたす。 詳现に぀いおは、DeepSpeed の匕数解析 ドキュメントを参照しおください。

ここで遞択したランチャヌを䜿甚できたす。 pytorch ランチャヌを匕き続き䜿甚できたす。

torch.distributed.run --nproc_per_node=2 your_program.py <normal cl args> --deepspeed ds_config.json

たたは、deepspeedによっお提䟛されるランチャヌを䜿甚したす。

deepspeed --num_gpus=2 your_program.py <normal cl args> --deepspeed ds_config.json

ご芧のずおり、匕数は同じではありたせんが、ほずんどのニヌズではどちらでも機胜したす。の さたざたなノヌドず GPU を構成する方法の詳现に぀いおは、こちら を参照しおください。

deepspeedランチャヌを䜿甚し、利甚可胜なすべおの GPU を䜿甚したい堎合は、--num_gpusフラグを省略するだけです。

以䞋は、利甚可胜なすべおの GPU をデプロむする DeepSpeed でrun_translation.pyを実行する䟋です。

deepspeed examples/pytorch/translation/run_translation.py \
--deepspeed tests/deepspeed/ds_config_zero3.json \
--model_name_or_path t5-small --per_device_train_batch_size 1 \
--output_dir output_dir --overwrite_output_dir --fp16 \
--do_train --max_train_samples 500 --num_train_epochs 1 \
--dataset_name wmt16 --dataset_config "ro-en" \
--source_lang en --target_lang ro

DeepSpeed のドキュメントには、--deepspeed --deepspeed_config ds_config.jsonが衚瀺される可胜性が高いこずに泚意しおください。 DeepSpeed 関連の匕数が 2 ぀ありたすが、簡単にするためであり、凊理すべき匕数がすでに非垞に倚いためです。 この 2 ぀を 1 ぀の匕数に結合したした。

実際の䜿甚䟋に぀いおは、この 投皿 を参照しおください。

Deployment with one GPU

1 ぀の GPU で DeepSpeed をデプロむするには、[Trainer] コマンド ラむン匕数を次のように調敎したす。

deepspeed --num_gpus=1 examples/pytorch/translation/run_translation.py \
--deepspeed tests/deepspeed/ds_config_zero2.json \
--model_name_or_path t5-small --per_device_train_batch_size 1 \
--output_dir output_dir --overwrite_output_dir --fp16 \
--do_train --max_train_samples 500 --num_train_epochs 1 \
--dataset_name wmt16 --dataset_config "ro-en" \
--source_lang en --target_lang ro

これは耇数の GPU の堎合ずほが同じですが、ここでは、DeepSpeed に 1 ぀の GPU だけを䜿甚するように明瀺的に指瀺したす。 --num_gpus=1。デフォルトでは、DeepSpeed は指定されたノヌド䞊で認識できるすべおの GPU をデプロむしたす。起動する GPU が 1 ぀だけの堎合 の堎合、この匕数は必芁ありたせん。次の ドキュメント では、ランチャヌ オプションに぀いお説明しおいたす。

1 ぀の GPU だけで DeepSpeed を䜿甚したいのはなぜですか?

  1. 䞀郚の蚈算ずメモリをホストの CPU ず RAM に委任できる ZeRO オフロヌド機胜を備えおいるため、 モデルのニヌズに合わせおより倚くの GPU リ゜ヌスを残しおおきたす。より倧きなバッチ サむズ、たたは非垞に倧きなモデルのフィッティングを可胜にする 普通は合わないでしょう。
  2. スマヌトな GPU メモリ管理システムを提䟛し、メモリの断片化を最小限に抑えたす。 より倧きなモデルずデヌタ バッチ。

次に構成に぀いお詳しく説明したすが、単䞀の GPU で倧幅な改善を実珟するための鍵は次のずおりです。 DeepSpeed を䜿甚するには、構成ファむルに少なくずも次の構成が必芁です。

{
  "zero_optimization": {
     "stage": 2,
     "offload_optimizer": {
         "device": "cpu",
         "pin_memory": true
     },
     "allgather_partitions": true,
     "allgather_bucket_size": 2e8,
     "reduce_scatter": true,
     "reduce_bucket_size": 2e8,
     "overlap_comm": true,
     "contiguous_gradients": true
  }
}

これにより、オプティマむザヌのオフロヌドやその他の重芁な機胜が有効になりたす。バッファ サむズを詊しおみるずよいでしょう。 詳现に぀いおは、以䞋のディスカッションを参照しおください。

このタむプのデプロむメントの実際的な䜿甚䟋に぀いおは、この 投皿 を参照しおください。

このドキュメントで詳しく説明されおいるように、CPU および NVMe オフロヌドを備えた ZeRO-3 を詊すこずもできたす。

ノヌト

  • GPU 0 ずは異なる特定の GPU で実行する必芁がある堎合、CUDA_VISIBLE_DEVICES を䜿甚しお制限するこずはできたせん。 利甚可胜な GPU の衚瀺範囲。代わりに、次の構文を䜿甚する必芁がありたす。

    deepspeed --include localhost:1 examples/pytorch/translation/run_translation.py ...
    

    この䟋では、DeepSpeed に GPU 1 (2 番目の GPU) を䜿甚するように指瀺したす。

耇数のノヌドを䜿甚したデプロむメント

このセクションの情報は DeepSpeed 統合に固有のものではなく、あらゆるマルチノヌド プログラムに適甚できたす。ただし、DeepSpeed は、SLURM 環境でない限り、他のランチャヌよりも䜿いやすいdeepspeedランチャヌを提䟛したす。

このセクションでは、それぞれ 8 GPU を備えた 2 ぀のノヌドがあるず仮定したす。たた、最初のノヌドには ssh hostname1 を䜿甚しお、2 番目のノヌドには ssh hostname2 を䜿甚しお接続できたす。䞡方ずもパスワヌドなしでロヌカルの ssh 経由で盞互に接続できる必芁がありたす。もちろん、これらのホスト (ノヌド) 名を、䜜業しおいる実際のホスト名に倉曎する必芁がありたす。

The torch.distributed.run launcher

たずえば、torch.distributed.run を䜿甚するには、次のようにしたす。

python -m torch.distributed.run --nproc_per_node=8 --nnode=2 --node_rank=0 --master_addr=hostname1 \
--master_port=9901 your_program.py <normal cl args> --deepspeed ds_config.json

各ノヌドに SSH で接続し、それぞれのノヌドで同じコマンドを実行する必芁がありたす。急ぐ必芁はありたせん。ランチャヌは䞡方のノヌドが同期するたで埅機したす。

詳现に぀いおは、torchrun を参照しおください。ちなみに、これは pytorch の数バヌゞョン前のtorch.distributed.launchを眮き換えたランチャヌでもありたす。

ディヌプスピヌド ランチャヌ

代わりにdeepspeedランチャヌを䜿甚するには、たずhostfileファむルを䜜成する必芁がありたす。

hostname1 slots=8
hostname2 slots=8

そしお、次のように起動できたす。

deepspeed --num_gpus 8 --num_nodes 2 --hostfile hostfile --master_addr hostname1 --master_port=9901 \
your_program.py <normal cl args> --deepspeed ds_config.json

torch.distributed.runランチャヌずは異なり、deepspeedは䞡方のノヌドでこのコマンドを自動的に起動したす。

詳现に぀いおは、リ゜ヌス構成 (マルチノヌド) を参照しおください。

Launching in a SLURM environment

SLURM 環境では、次のアプロヌチを䜿甚できたす。以䞋は、特定の SLURM 環境に適合させるために必芁な slurm スクリプト launch.slurm です。

#SBATCH --job-name=test-nodes        # name
#SBATCH --nodes=2                    # nodes
#SBATCH --ntasks-per-node=1          # crucial - only 1 task per dist per node!
#SBATCH --cpus-per-task=10           # number of cores per tasks
#SBATCH --gres=gpu:8                 # number of gpus
#SBATCH --time 20:00:00              # maximum execution time (HH:MM:SS)
#SBATCH --output=%x-%j.out           # output file name

export GPUS_PER_NODE=8
export MASTER_ADDR=$(scontrol show hostnames $SLURM_JOB_NODELIST | head -n 1)
export MASTER_PORT=9901

srun --jobid $SLURM_JOBID bash -c 'python -m torch.distributed.run \
 --nproc_per_node $GPUS_PER_NODE --nnodes $SLURM_NNODES --node_rank $SLURM_PROCID \
 --master_addr $MASTER_ADDR --master_port $MASTER_PORT \
your_program.py <normal cl args> --deepspeed ds_config.json'

あずは実行をスケゞュヌルするだけです。

sbatch launch.slurm

Use of Non-shared filesystem

デフォルトでは、DeepSpeed はマルチノヌド環境が共有ストレヌゞを䜿甚するこずを想定しおいたす。これが圓おはたらず、各ノヌドがロヌカル ファむルシステムしか参照できない堎合は、蚭定ファむルを調敎しお checkpoint_section を含める必芁がありたす。チェックポむント オプション) を次の蚭定で指定したす。

{
  "checkpoint": {
    "use_node_local_storage": true
  }
}

あるいは、[Trainer] の --save_on_each_node 匕数を䜿甚するこずもでき、䞊蚘の蚭定は自動的に远加されたす。

Deployment in Notebooks

ノヌトブックのセルをスクリプトずしお実行する堎合の問題は、䟝存する通垞のdeepspeedランチャヌがないこずです。 特定の蚭定では、それを゚ミュレヌトする必芁がありたす。

GPU を 1 ぀だけ䜿甚しおいる堎合、DeepSpeed を䜿甚するためにノヌトブック内のトレヌニング コヌドを調敎する必芁がある方法は次のずおりです。

# DeepSpeed requires a distributed environment even when only one process is used.
# This emulates a launcher in the notebook
import os

os.environ["MASTER_ADDR"] = "localhost"
os.environ["MASTER_PORT"] = "9994"  # modify if RuntimeError: Address already in use
os.environ["RANK"] = "0"
os.environ["LOCAL_RANK"] = "0"
os.environ["WORLD_SIZE"] = "1"

# Now proceed as normal, plus pass the deepspeed config file
training_args = TrainingArguments(..., deepspeed="ds_config_zero3.json")
trainer = Trainer(...)
trainer.train()

泚: ... は、関数に枡す通垞の匕数を衚したす。

耇数の GPU を䜿甚する堎合、DeepSpeed が動䜜するにはマルチプロセス環境を䜿甚する必芁がありたす。぀たり、あなたは持っおいたす その目的でランチャヌを䜿甚するこずはできたせんが、これは、提瀺された分散環境を゚ミュレヌトするこずによっおは実珟できたせん。 このセクションの冒頭で。

珟圚のディレクトリのノヌトブックにその堎で構成ファむルを䜜成したい堎合は、専甚の セルの内容:

%%bash
cat <<'EOT' > ds_config_zero3.json
{
    "fp16": {
        "enabled": "auto",
        "loss_scale": 0,
        "loss_scale_window": 1000,
        "initial_scale_power": 16,
        "hysteresis": 2,
        "min_loss_scale": 1
    },

    "optimizer": {
        "type": "AdamW",
        "params": {
            "lr": "auto",
            "betas": "auto",
            "eps": "auto",
            "weight_decay": "auto"
        }
    },

    "scheduler": {
        "type": "WarmupLR",
        "params": {
            "warmup_min_lr": "auto",
            "warmup_max_lr": "auto",
            "warmup_num_steps": "auto"
        }
    },

    "zero_optimization": {
        "stage": 3,
        "offload_optimizer": {
            "device": "cpu",
            "pin_memory": true
        },
        "offload_param": {
            "device": "cpu",
            "pin_memory": true
        },
        "overlap_comm": true,
        "contiguous_gradients": true,
        "sub_group_size": 1e9,
        "reduce_bucket_size": "auto",
        "stage3_prefetch_bucket_size": "auto",
        "stage3_param_persistence_threshold": "auto",
        "stage3_max_live_parameters": 1e9,
        "stage3_max_reuse_distance": 1e9,
        "stage3_gather_16bit_weights_on_model_save": true
    },

    "gradient_accumulation_steps": "auto",
    "gradient_clipping": "auto",
    "steps_per_print": 2000,
    "train_batch_size": "auto",
    "train_micro_batch_size_per_gpu": "auto",
    "wall_clock_breakdown": false
}
EOT

トレヌニング スクリプトがノヌトブックのセルではなく通垞のファむルにある堎合は、次のようにしおdeepspeedを通垞どおり起動できたす。 现胞からのシェル。たずえば、run_translation.py を䜿甚するには、次のように起動したす。

!git clone https://github.com/huggingface/transformers
!cd transformers; deepspeed examples/pytorch/translation/run_translation.py ...

たたは、%%bash マゞックを䜿甚するず、シェル プログラムを実行するための耇数行のコヌドを蚘述するこずができたす。

%%bash

git clone https://github.com/huggingface/transformers
cd transformers
deepspeed examples/pytorch/translation/run_translation.py ...

そのような堎合、このセクションの最初に瀺したコヌドは必芁ありたせん。

泚: %%bash マゞックは優れおいたすが、珟時点では出力をバッファリングするため、プロセスが終了するたでログは衚瀺されたせん。 完了したす。

Configuration

蚭定ファむルで䜿甚できる DeepSpeed 蚭定オプションの完党なガむドに぀いおは、次を参照しおください。 次のドキュメント にアクセスしおください。

さたざたな実際のニヌズに察応する数十の DeepSpeed 構成䟋を [DeepSpeedExamples] (https://github.com/microsoft/DeepSpeedExamples)で芋぀けるこずができたす。 リポゞトリ:

git clone https://github.com/microsoft/DeepSpeedExamples
cd DeepSpeedExamples
find . -name '*json'

䞊蚘のコヌドを続けお、Lamb オプティマむザヌを構成しようずしおいるずしたす。したがっお、次の䞭から怜玢できたす .json ファむルの䟋:

grep -i Lamb $(find . -name '*json')

さらにいく぀かの䟋が メむン リポゞトリ にもありたす。

DeepSpeed を䜿甚する堎合は、垞に DeepSpeed 構成ファむルを指定する必芁がありたすが、䞀郚の構成パラメヌタには コマンドラむン経由で蚭定したす。埮劙な違いに぀いおは、このガむドの残りの郚分で説明したす。

DeepSpeed 構成ファむルがどのようなものかを理解するために、ZeRO ステヌゞ 2 機胜を有効にする構成ファむルを次に瀺したす。 オプティマむザヌ状態の CPU オフロヌドを含み、AdamWオプティマむザヌずWarmupLRスケゞュヌラヌを䜿甚し、混合を有効にしたす。 --fp16 が枡された堎合の粟床トレヌニング:

{
    "fp16": {
        "enabled": "auto",
        "loss_scale": 0,
        "loss_scale_window": 1000,
        "initial_scale_power": 16,
        "hysteresis": 2,
        "min_loss_scale": 1
    },

    "optimizer": {
        "type": "AdamW",
        "params": {
            "lr": "auto",
            "betas": "auto",
            "eps": "auto",
            "weight_decay": "auto"
        }
    },

    "scheduler": {
        "type": "WarmupLR",
        "params": {
            "warmup_min_lr": "auto",
            "warmup_max_lr": "auto",
            "warmup_num_steps": "auto"
        }
    },

    "zero_optimization": {
        "stage": 2,
        "offload_optimizer": {
            "device": "cpu",
            "pin_memory": true
        },
        "allgather_partitions": true,
        "allgather_bucket_size": 2e8,
        "overlap_comm": true,
        "reduce_scatter": true,
        "reduce_bucket_size": 2e8,
        "contiguous_gradients": true
    },

    "gradient_accumulation_steps": "auto",
    "gradient_clipping": "auto",
    "train_batch_size": "auto",
    "train_micro_batch_size_per_gpu": "auto",
}

プログラムを実行するず、DeepSpeed は [Trainer] から受け取った蚭定をログに蚘録したす。 コン゜ヌルに枡されるため、最終的にどのような蚭定が枡されたのかを正確に確認できたす。

Passing Configuration

このドキュメントで説明したように、通垞、DeepSpeed 蚭定は json ファむルぞのパスずしお枡されたすが、 トレヌニングの蚭定にコマンド ラむン むンタヌフェむスを䜿甚せず、代わりにむンスタンスを䜜成したす。 [Trainer] via [TrainingArguments] その埌、deepspeed 匕数に぀いおは次のこずができたす ネストされた dict を枡したす。これにより、その堎で構成を䜜成でき、それを曞き蟌む必芁がありたせん。 [TrainingArguments] に枡す前にファむル システムを倉曎したす。

芁玄するず、次のこずができたす。

TrainingArguments(..., deepspeed="/path/to/ds_config.json")

たたは

ds_config_dict = dict(scheduler=scheduler_params, optimizer=optimizer_params)
TrainingArguments(..., deepspeed=ds_config_dict)

Shared Configuration

このセクションは必読です

[Trainer] ず DeepSpeed の䞡方が正しく機胜するには、いく぀かの蚭定倀が必芁です。 したがっお、怜出が困難な゚ラヌに぀ながる可胜性のある定矩の競合を防ぐために、それらを構成するこずにしたした。 [Trainer] コマンドラむン匕数経由。

さらに、䞀郚の構成倀はモデルの構成に基づいお自動的に導出されたす。 耇数の倀を手動で調敎するこずを忘れないでください。[Trainer] に倧郚分を任せるのが最善です の蚭定を行いたす。

したがっお、このガむドの残りの郚分では、特別な蚭定倀 auto が衚瀺されたす。これを蚭定するず、 正しい倀たたは最も効率的な倀に自動的に眮き換えられたす。これを無芖するこずを自由に遞択しおください 掚奚事項を参照し、倀を明瀺的に蚭定したす。この堎合、次の点に十分泚意しおください。 [Trainer] 匕数ず DeepSpeed 蚭定は䞀臎したす。たずえば、同じものを䜿甚しおいたすか 孊習率、バッチサむズ、たたは募配环積蚭定?これらが䞀臎しない堎合、トレヌニングは非垞に倱敗する可胜性がありたす 方法を怜出するのが難しい。あなたは譊告を受けたした。

DeepSpeed のみに固有の倀や、それに合わせお手動で蚭定する必芁がある倀が他にも耇数ありたす。 あなたの芁望。

独自のプログラムで、DeepSpeed 構成をマスタヌずしお倉曎したい堎合は、次のアプロヌチを䜿甚するこずもできたす。 それに基づいお [TrainingArguments] を蚭定したす。手順は次のずおりです。

  1. マスタヌ構成ずしお䜿甚する DeepSpeed 構成を䜜成たたはロヌドしたす
  2. これらの倀に基づいお [TrainingArguments] オブゞェクトを䜜成したす

scheduler.params.total_num_stepsなどの䞀郚の倀は次のように蚈算されるこずに泚意しおください。 train 䞭に [Trainer] を実行したすが、もちろん自分で蚈算するこずもできたす。

ZeRO

Zero Redundancy Optimizer (ZeRO) は、DeepSpeed の䞻力補品です。それ 3 ぀の異なるレベル (段階) の最適化をサポヌトしたす。最初のものは、スケヌラビリティの芳点からはあたり興味深いものではありたせん。 したがっお、このドキュメントではステヌゞ 2 ず 3 に焊点を圓おたす。ステヌゞ 3 は、最新の ZeRO-Infinity の远加によっおさらに改善されおいたす。 詳现に぀いおは、DeepSpeed のドキュメントを参照しおください。

構成ファむルの zero_optimization セクションは最も重芁な郚分です (docs)。ここで定矩したす どの ZeRO ステヌゞを有効にするか、そしおそれらをどのように構成するか。各パラメヌタの説明は、 DeepSpeed のドキュメント。

このセクションは、DeepSpeed 蚭定を介しおのみ蚭定する必芁がありたす - [Trainer] が提䟛したす 同等のコマンドラむン匕数はありたせん。

泚: 珟圚、DeepSpeed はパラメヌタヌ名を怜蚌しないため、スペルを間違えるず、デフォルト蚭定が䜿甚されたす。 スペルが間違っおいるパラメヌタ。 DeepSpeed ゚ンゞンの起動ログ メッセヌゞを芋お、その倀を確認できたす。 䜿甚する぀もりです。

ZeRO-2 Config

以䞋は、ZeRO ステヌゞ 2 の構成䟋です。

{
    "zero_optimization": {
        "stage": 2,
        "offload_optimizer": {
            "device": "cpu",
            "pin_memory": true
        },
        "allgather_partitions": true,
        "allgather_bucket_size": 5e8,
        "overlap_comm": true,
        "reduce_scatter": true,
        "reduce_bucket_size": 5e8,
        "contiguous_gradients": true
    }
}

性胜調敎

  • offload_optimizer を有効にするず、GPU RAM の䜿甚量が削枛されたす ("stage": 2 が必芁です)
  • "overlap_comm": true は、GPU RAM 䜿甚量の増加ずトレヌドオフしお、遅延をすべお削枛したす。 overlap_commは 4.5x を䜿甚したす allgather_bucket_sizeずreduce_bucket_sizeの倀。したがっお、5e8 に蚭定されおいる堎合、9GB が必芁になりたす。 フットプリント (5e8 x 2Bytes x 2 x 4.5)。したがっお、8GB 以䞋の RAM を搭茉した GPU を䜿甚しおいる堎合、 OOM ゚ラヌが発生した堎合は、これらのパラメヌタを2e8皋床に枛らす必芁があり、それには 3.6GB が必芁になりたす。やりたくなるでしょう OOM に達し始めおいる堎合は、より倧容量の GPU でも同様です。
  • これらのバッファを枛らすず、より倚くの GPU RAM を利甚するために通信速床を犠牲にするこずになりたす。バッファサむズが小さいほど、 通信が遅くなり、他のタスクで䜿甚できる GPU RAM が増えたす。したがっお、バッチサむズが倧きい堎合は、 重芁なのは、トレヌニング時間を少し遅らせるこずは良いトレヌドになる可胜性がありたす。

さらに、deepspeed==0.4.4には、次のコマンドで有効にできる新しいオプションround_robin_gradientsが远加されたした。

{
    "zero_optimization": {
        "round_robin_gradients": true
    }
}

これは、きめ现かい募配パヌティショニングによっおランク間の CPU メモリぞの募配コピヌを䞊列化する、CPU オフロヌドのステヌゞ 2 最適化です。パフォヌマンスの利点は、募配环積ステップ (オプティマむザヌ ステップ間のコピヌの増加) たたは GPU 数 (䞊列凊理の増加) に応じお増加したす。

ZeRO-3 Config

以䞋は、ZeRO ステヌゞ 3 の構成䟋です。

{
    "zero_optimization": {
        "stage": 3,
        "offload_optimizer": {
            "device": "cpu",
            "pin_memory": true
        },
        "offload_param": {
            "device": "cpu",
            "pin_memory": true
        },
        "overlap_comm": true,
        "contiguous_gradients": true,
        "sub_group_size": 1e9,
        "reduce_bucket_size": "auto",
        "stage3_prefetch_bucket_size": "auto",
        "stage3_param_persistence_threshold": "auto",
        "stage3_max_live_parameters": 1e9,
        "stage3_max_reuse_distance": 1e9,
        "stage3_gather_16bit_weights_on_model_save": true
    }
}

モデルたたはアクティベヌションが GPU メモリに適合せず、CPU が未䜿甚であるために OOM が発生しおいる堎合 "device": "cpu" を䜿甚しおオプティマむザの状態ずパラメヌタを CPU メモリにメモリオフロヌドするず、この制限が解決される可胜性がありたす。 CPU メモリにオフロヌドしたくない堎合は、device゚ントリにcpuの代わりにnoneを䜿甚したす。オフロヌド先 NVMe に぀いおは埌ほど説明したす。

固定メモリは、pin_memoryをtrueに蚭定するず有効になりたす。この機胜により、次のようなコストをかけおスルヌプットを向䞊させるこずができたす。 他のプロセスが䜿甚できるメモリが少なくなりたす。ピン留めされたメモリは、それを芁求した特定のプロセスのために確保されたす。 通垞、通垞の CPU メモリよりもはるかに高速にアクセスされたす。

性胜調敎

  • stage3_max_live_parameters: 1e9
  • stage3_max_reuse_distance: 1e9

OOM に達した堎合は、「stage3_max_live_parameters」ず「stage3_max_reuse_ distance」を枛らしたす。圱響は最小限に抑えられるはずです アクティブ化チェックポむントを実行しない限り、パフォヌマンスに圱響したす。 1e9は玄 2GB を消費したす。蚘憶を共有しおいるのは、 stage3_max_live_parameters ず stage3_max_reuse_distance なので、加算されるものではなく、合蚈で 2GB になりたす。

stage3_max_live_parameters は、特定の時点で GPU 䞊に保持する完党なパラメヌタの数の䞊限です。 時間。 「再利甚距離」は、パラメヌタが将来い぀再び䜿甚されるかを刀断するために䜿甚する指暙です。 stage3_max_reuse_ distanceを䜿甚しお、パラメヌタを砎棄するか保持するかを決定したす。パラメヌタが 近い将来に再び䜿甚される予定 (stage3_max_reuse_distance未満) なので、通信を枛らすために保持したす。 オヌバヌヘッド。これは、アクティベヌション チェックポむントを有効にしおいる堎合に非垞に圹立ちたす。フォワヌド再蚈算が行われ、 backward は単䞀レむダヌ粒床を枡し、埌方再蚈算たでパラメヌタを前方再蚈算に保持したいず考えおいたす。

次の構成倀は、モデルの非衚瀺サむズによっお異なりたす。

  • reduce_bucket_size: hidden_size*hidden_size
  • stage3_prefetch_bucket_size: 0.9 * hidden_size * hidden_size
  • stage3_param_persistence_threshold: 10 * hidden_size

したがっお、これらの倀を auto に蚭定するず、[Trainer] が掚奚される倀を自動的に割り圓おたす。 䟡倀芳。ただし、もちろん、これらを明瀺的に蚭定するこずもできたす。

stage3_gather_16bit_weights_on_model_save は、モデルの保存時にモデル fp16 の重み統合を有効にしたす。倧きい モデルず耇数の GPU の堎合、これはメモリず速床の䞡方の点で高䟡な操䜜です。珟圚必須ずなっおいるのは、 トレヌニングを再開する予定です。この制限を取り陀き、より䟿利にする今埌のアップデヌトに泚目しおください。 フレキシブル。

ZeRO-2 構成から移行しおいる堎合は、allgather_partitions、allgather_bucket_size、および reduce_scatter蚭定パラメヌタは ZeRO-3 では䜿甚されたせん。これらを蚭定ファむルに保存しおおくず、 無芖される。

  • sub_group_size: 1e9

sub_group_size は、オプティマむザヌのステップ䞭にパラメヌタヌが曎新される粒床を制埡したす。パラメヌタは次のずおりです。 sub_group_size のバケットにグルヌプ化され、各バケットは䞀床に 1 ぀ず぀曎新されたす。 NVMeオフロヌドで䜿甚する堎合 したがっお、ZeRO-Infinity の sub_group_sizeは、モデルの状態が CPU に出入りする粒床を制埡したす。 オプティマむザステップ䞭に NVMe からメモリを取埗したす。これにより、非垞に倧芏暡なモデルの CPU メモリ䞍足が防止されたす。

NVMe オフロヌドを䜿甚しない堎合は、sub_group_sizeをデフォルト倀の 1e9 のたたにするこずができたす。倉曎するこずもできたす 次の堎合のデフォルト倀:

  1. オプティマむザヌ ステップ䞭に OOM が発生する: sub_group_size を枛らしお、䞀時バッファヌのメモリ䜿甚量を削枛したす。
  2. オプティマむザヌ ステップに時間がかかりたす。sub_group_sizeを増やしお、垯域幅の䜿甚率を向䞊させたす。 デヌタバッファの増加。

ZeRO-0 Config

ステヌゞ 0 ず 1 はめったに䜿甚されないため、最埌にリストしおいるこずに泚意しおください。

ステヌゞ 0 では、すべおのタむプのシャヌディングを無効にし、DDP ずしお DeepSpeed のみを䜿甚したす。次のコマンドでオンにできたす。

{
    "zero_optimization": {
        "stage": 0
    }
}

これにより、他に䜕も倉曎する必芁がなく、基本的に ZeRO が無効になりたす。

ZeRO-1 Config

ステヌゞ 1 は、ステヌゞ 2 からグラデヌション シャヌディングを陀いたものです。オプティマむザヌの状態をシャヌド化するだけで、凊理を少し高速化するためにい぀でも詊すこずができたす。

{
    "zero_optimization": {
        "stage": 1
    }
}

NVMe Support

ZeRO-Infinity は、GPU ず CPU メモリを NVMe メモリで拡匵するこずで、非垞に倧芏暡なモデルのトレヌニングを可胜にしたす。おかげで スマヌト パヌティショニングおよびタむリング アルゎリズムでは、各 GPU が非垞に少量のデヌタを送受信する必芁がありたす。 オフロヌドにより、最新の NVMe がトレヌニングに利甚できる合蚈メモリ プヌルをさらに倧きくするのに適しおいるこずが刀明したした。 プロセス。 ZeRO-Infinity には、ZeRO-3 が有効になっおいる必芁がありたす。

次の蚭定䟋では、NVMe がオプティマむザの状態ずパラメヌタの䞡方をオフロヌドできるようにしたす。

{
    "zero_optimization": {
        "stage": 3,
        "offload_optimizer": {
            "device": "nvme",
            "nvme_path": "/local_nvme",
            "pin_memory": true,
            "buffer_count": 4,
            "fast_init": false
        },
        "offload_param": {
            "device": "nvme",
            "nvme_path": "/local_nvme",
            "pin_memory": true,
            "buffer_count": 5,
            "buffer_size": 1e8,
            "max_in_cpu": 1e9
        },
        "aio": {
            "block_size": 262144,
            "queue_depth": 32,
            "thread_count": 1,
            "single_submit": false,
            "overlap_events": true
        },
        "overlap_comm": true,
        "contiguous_gradients": true,
        "sub_group_size": 1e9,
        "reduce_bucket_size": "auto",
        "stage3_prefetch_bucket_size": "auto",
        "stage3_param_persistence_threshold": "auto",
        "stage3_max_live_parameters": 1e9,
        "stage3_max_reuse_distance": 1e9,
        "stage3_gather_16bit_weights_on_model_save": true
    },
}

オプティマむザの状態ずパラメヌタの䞡方を NVMe にオフロヌドするか、どちらか 1 ぀だけをオフロヌドするか、たったくオフロヌドしないかを遞択できたす。たずえば、次の堎合 利甚可胜な CPU メモリが倧量にある堎合は、高速になるため、必ず CPU メモリのみにオフロヌドしおください (ヒント: "device": "CPU")。

オプティマむザヌの状態 ず パラメヌタヌ。

nvme_pathが実際に NVMe であるこずを確認しおください。NVMe は通垞のハヌドドラむブたたは SSD で動䜜したすが、 はるかに遅くなりたす。高速スケヌラブルなトレヌニングは、最新の NVMe 転送速床を念頭に眮いお蚭蚈されたした (この時点では 曞き蟌みでは、読み取り最倧 3.5 GB/秒、曞き蟌み最倧 3 GB/秒のピヌク速床が埗られたす)。

最適なaio構成ブロックを芋぀けるには、タヌゲット蚭定でベンチマヌクを実行する必芁がありたす。 ここで説明。

ZeRO-2 vs ZeRO-3 Performance

ZeRO-3 は、他のすべおが同じように構成されおいる堎合、ZeRO-2 よりも遅くなる可胜性がありたす。前者は収集する必芁があるためです。 ZeRO-2 の機胜に加えおモデルの重み付けを行いたす。 ZeRO-2 がニヌズを満たし、数個の GPU を超えお拡匵する必芁がない堎合 そうすれば、それに固執するこずを遞択するこずもできたす。 ZeRO-3 により、はるかに高いスケヌラビリティ容量が可胜になるこずを理解するこずが重芁です スピヌドを犠牲にしお。

ZeRO-3 の構成を調敎しお、ZeRO-2 に近づけるこずができたす。

  • stage3_param_persistence_threshold を非垞に倧きな数倀に蚭定したす。たずえば、6 * hidden_​​size * hidden_​​size のように、最倧​​パラメヌタよりも倧きくなりたす。これにより、パラメヌタが GPU に保持されたす。
  • ZeRO-2 にはそのオプションがないため、offload_params をオフにしたす。

倉曎しなくおも、offload_paramsをオフにするだけでパフォヌマンスが倧幅に向䞊する可胜性がありたす。 stage3_param_persistence_threshold。もちろん、これらの倉曎はトレヌニングできるモデルのサむズに圱響したす。それで これらは、ニヌズに応じお、スケヌラビリティず匕き換えに速床を向䞊させるのに圹立ちたす。

ZeRO-2 Example

以䞋は、完党な ZeRO-2 自動構成ファむル ds_config_zero2.json です。

{
    "fp16": {
        "enabled": "auto",
        "loss_scale": 0,
        "loss_scale_window": 1000,
        "initial_scale_power": 16,
        "hysteresis": 2,
        "min_loss_scale": 1
    },

    "optimizer": {
        "type": "AdamW",
        "params": {
            "lr": "auto",
            "betas": "auto",
            "eps": "auto",
            "weight_decay": "auto"
        }
    },

    "scheduler": {
        "type": "WarmupLR",
        "params": {
            "warmup_min_lr": "auto",
            "warmup_max_lr": "auto",
            "warmup_num_steps": "auto"
        }
    },

    "zero_optimization": {
        "stage": 2,
        "offload_optimizer": {
            "device": "cpu",
            "pin_memory": true
        },
        "allgather_partitions": true,
        "allgather_bucket_size": 2e8,
        "overlap_comm": true,
        "reduce_scatter": true,
        "reduce_bucket_size": 2e8,
        "contiguous_gradients": true
    },

    "gradient_accumulation_steps": "auto",
    "gradient_clipping": "auto",
    "steps_per_print": 2000,
    "train_batch_size": "auto",
    "train_micro_batch_size_per_gpu": "auto",
    "wall_clock_breakdown": false
}

以䞋は、手動で蚭定された完党な ZeRO-2 のすべおが有効な構成ファむルです。ここでは䞻に、兞型的なものを確認するためのものです。 倀は次のようになりたすが、耇数のauto蚭定が含たれる倀を䜿甚するこずを匷くお勧めしたす。

{
    "fp16": {
        "enabled": true,
        "loss_scale": 0,
        "loss_scale_window": 1000,
        "initial_scale_power": 16,
        "hysteresis": 2,
        "min_loss_scale": 1
    },

    "optimizer": {
        "type": "AdamW",
        "params": {
            "lr": 3e-5,
            "betas": [0.8, 0.999],
            "eps": 1e-8,
            "weight_decay": 3e-7
        }
    },

    "scheduler": {
        "type": "WarmupLR",
        "params": {
            "warmup_min_lr": 0,
            "warmup_max_lr": 3e-5,
            "warmup_num_steps": 500
        }
    },

    "zero_optimization": {
        "stage": 2,
        "offload_optimizer": {
            "device": "cpu",
            "pin_memory": true
        },
        "allgather_partitions": true,
        "allgather_bucket_size": 2e8,
        "overlap_comm": true,
        "reduce_scatter": true,
        "reduce_bucket_size": 2e8,
        "contiguous_gradients": true
    },

    "steps_per_print": 2000,
    "wall_clock_breakdown": false
}

ZeRO-3 Example

以䞋は、完党な ZeRO-3 自動構成ファむルds_config_zero3.jsonです。

{
    "fp16": {
        "enabled": "auto",
        "loss_scale": 0,
        "loss_scale_window": 1000,
        "initial_scale_power": 16,
        "hysteresis": 2,
        "min_loss_scale": 1
    },

    "optimizer": {
        "type": "AdamW",
        "params": {
            "lr": "auto",
            "betas": "auto",
            "eps": "auto",
            "weight_decay": "auto"
        }
    },

    "scheduler": {
        "type": "WarmupLR",
        "params": {
            "warmup_min_lr": "auto",
            "warmup_max_lr": "auto",
            "warmup_num_steps": "auto"
        }
    },

    "zero_optimization": {
        "stage": 3,
        "offload_optimizer": {
            "device": "cpu",
            "pin_memory": true
        },
        "offload_param": {
            "device": "cpu",
            "pin_memory": true
        },
        "overlap_comm": true,
        "contiguous_gradients": true,
        "sub_group_size": 1e9,
        "reduce_bucket_size": "auto",
        "stage3_prefetch_bucket_size": "auto",
        "stage3_param_persistence_threshold": "auto",
        "stage3_max_live_parameters": 1e9,
        "stage3_max_reuse_distance": 1e9,
        "stage3_gather_16bit_weights_on_model_save": true
    },

    "gradient_accumulation_steps": "auto",
    "gradient_clipping": "auto",
    "steps_per_print": 2000,
    "train_batch_size": "auto",
    "train_micro_batch_size_per_gpu": "auto",
    "wall_clock_breakdown": false
}

以䞋は、手動で蚭定された完党な ZeRO-3 のすべおが有効な構成ファむルです。ここでは䞻に、兞型的なものを確認するためのものです。 倀は次のようになりたすが、耇数のauto蚭定が含たれる倀を䜿甚するこずを匷くお勧めしたす。

{
    "fp16": {
        "enabled": true,
        "loss_scale": 0,
        "loss_scale_window": 1000,
        "initial_scale_power": 16,
        "hysteresis": 2,
        "min_loss_scale": 1
    },

    "optimizer": {
        "type": "AdamW",
        "params": {
            "lr": 3e-5,
            "betas": [0.8, 0.999],
            "eps": 1e-8,
            "weight_decay": 3e-7
        }
    },

    "scheduler": {
        "type": "WarmupLR",
        "params": {
            "warmup_min_lr": 0,
            "warmup_max_lr": 3e-5,
            "warmup_num_steps": 500
        }
    },

    "zero_optimization": {
        "stage": 3,
        "offload_optimizer": {
            "device": "cpu",
            "pin_memory": true
        },
        "offload_param": {
            "device": "cpu",
            "pin_memory": true
        },
        "overlap_comm": true,
        "contiguous_gradients": true,
        "sub_group_size": 1e9,
        "reduce_bucket_size": 1e6,
        "stage3_prefetch_bucket_size": 0.94e6,
        "stage3_param_persistence_threshold": 1e4,
        "stage3_max_live_parameters": 1e9,
        "stage3_max_reuse_distance": 1e9,
        "stage3_gather_16bit_weights_on_model_save": true
    },

    "steps_per_print": 2000,
    "wall_clock_breakdown": false
}

How to Choose Which ZeRO Stage and Offloads To Use For Best Performance

これで、さたざたな段階があるこずがわかりたした。どちらを䜿甚するかをどのように決定すればよいでしょうか?このセクションでは、この質問に答えおいきたす。

䞀般に、次のこずが圓おはたりたす。

  • 速床の点巊の方が右より速い

ステヌゞ 0 (DDP) > ステヌゞ 1 > ステヌゞ 2 > ステヌゞ 2 + オフロヌド > ステヌゞ 3 > ステヌゞ 3 + オフロヌド

  • GPU メモリの䜿甚状況 (右は巊よりも GPU メモリ効率が高い)

ステヌゞ 0 (DDP) < ステヌゞ 1 < ステヌゞ 2 < ステヌゞ 2 + オフロヌド < ステヌゞ 3 < ステヌゞ 3 + オフロヌド

したがっお、最小限の数の GPU に収たりながら最速の実行を実珟したい堎合は、次のプロセスに埓うこずができたす。最も速いアプロヌチから開始し、GPU OOM に陥った堎合は、次に遅いアプロヌチに進みたすが、これにより䜿甚される GPU メモリが少なくなりたす。などなど。

たず、バッチ サむズを 1 に蚭定したす (必芁な有効バッチ サむズに察しお、い぀でも募配环積を䜿甚できたす)。

  1. --gradient_checkpointing 1 (HF Trainer) たたは盎接 model.gradient_checkpointing_enable() を有効にしたす - OOM の堎合

  2. 最初に ZeRO ステヌゞ 2 を詊しおください。 OOMの堎合

  3. ZeRO ステヌゞ 2 + offload_optimizer を詊したす - OOM の堎合

  4. ZeRO ステヌゞ 3 に切り替える - OOM の堎合

  5. cpu に察しお offload_param を有効にしたす - OOM の堎合

  6. OOM の堎合は、cpuに察しおoffload_optimizerを有効にしたす。

  7. それでもバッチ サむズ 1 に適合しない堎合は、たずさたざたなデフォルト倀を確認し、可胜であれば倀を䞋げたす。たずえば、generateを䜿甚し、広い怜玢ビヌムを䜿甚しない堎合は、倧量のメモリを消費するため、怜玢ビヌムを狭くしたす。

  8. fp32 では必ず混合半粟床を䜿甚したす。぀たり、Ampere 以䞊の GPU では bf16、叀い GPU アヌキテクチャでは fp16 を䜿甚したす。

  9. それでも OOM を行う堎合は、ハヌドりェアを远加するか、ZeRO-Infinity を有効にするこずができたす。぀たり、オフロヌド offload_param ず offload_optimizer を nvme に切り替えたす。非垞に高速な nvme であるこずを確認する必芁がありたす。逞話ずしお、ZeRO-Infinity を䜿甚しお小さな GPU で BLOOM-176B を掚論するこずができたしたが、非垞に遅かったです。でも、うたくいきたした

もちろん、最も GPU メモリ効率の高い構成から始めお、埌から逆に進むこずで、これらの手順を逆に実行するこずもできたす。あるいは二等分しおみおください。

OOM を匕き起こさないバッチ サむズ 1 を取埗したら、実効スルヌプットを枬定したす。

次に、バッチ サむズをできるだけ倧きくしおみたす。バッチ サむズが倧きいほど、乗算する行列が巚倧な堎合に GPU のパフォヌマンスが最高になるため、GPU の効率が向䞊したす。

ここで、パフォヌマンス最適化ゲヌムが始たりたす。䞀郚のオフロヌド機胜をオフにするか、ZeRO 段階でステップダりンしおバッチ サむズを増枛しお、実効スルヌプットを再床枬定するこずができたす。満足するたで掗い流し、繰り返したす。

氞遠にこれに費やす必芁はありたせんが、3 か月のトレヌニングを開始しようずしおいる堎合は、スルヌプットに関しお最も効果的な蚭定を芋぀けるために数日かけおください。そのため、トレヌニングのコストが最小限になり、トレヌニングをより早く完了できたす。珟圚の目たぐるしく倉化する ML の䞖界では、䜕かをトレヌニングするのにさらに 1 か月かかる堎合、絶奜の機䌚を逃す可胜性がありたす。もちろん、これは私が意芋を共有しおいるだけであり、決しおあなたを急かそうずしおいるわけではありたせん。 BLOOM-176B のトレヌニングを開始する前に、このプロセスに 2 日間費やし、スルヌプットを 90 TFLOP から 150 TFLOP に向䞊させるこずができたした。この取り組みにより、トレヌニング時間を 1 か月以䞊節玄できたした。

これらのメモは䞻にトレヌニング モヌド甚に曞かれたものですが、ほずんどの堎合は掚論にも適甚されるはずです。たずえば、募配チェックポむントはトレヌニング䞭にのみ圹立぀ため、掚論䞭は䜕も行われたせん。さらに、マルチ GPU 掚論を実行しおいお、DeepSpeed-Inference、Accelerate は優れたパフォヌマンスを提䟛するはずです。

その他のパフォヌマンス関連の簡単なメモ:

  • 䜕かを最初からトレヌニングしおいる堎合は、垞に 16 で割り切れる圢状のテン゜ル (隠れたサむズなど) を䜿甚するようにしおください。バッチ サむズに぀いおは、少なくずも 2 で割り切れるようにしおください。 GPU からさらに高いパフォヌマンスを匕き出したい堎合は、ハヌドりェア固有の 波ずタむルの量子化 の可分性がありたす。

Activation Checkpointing or Gradient Checkpointing

アクティベヌション チェックポむントず募配チェックポむントは、同じ方法論を指す 2 ぀の異なる甚語です。ずおもややこしいですが、こんな感じです。

募配チェックポむントを䜿甚するず、速床を GPU メモリず匕き換えにできたす。これにより、GPU OOM を克服したり、バッチ サむズを増やすこずができ、倚くの堎合、パフォヌマンスの向䞊に぀ながりたす。

HF Transformers モデルは、DeepSpeed のアクティベヌション チェックポむントに぀いお䜕も知らないため、DeepSpeed 構成ファむルでその機胜を有効にしようずしおも、䜕も起こりたせん。

したがっお、この非垞に有益な機胜を掻甚するには 2 ぀の方法がありたす。

  1. HF Transformers モデルを䜿甚したい堎合は、model.gradient_checkpointing_enable() を実行するか、HF トレヌナヌで --gradient_checkpointing を䜿甚したす。これにより、これが自動的に有効になりたす。そこで䜿われるのが torch.utils.checkpoint です。
  2. 独自のモデルを䜜成し、DeepSpeed のアクティベヌション チェックポむントを䜿甚したい堎合は、そこで芏定されおいる API を䜿甚できたす。 HF Transformers モデリング コヌドを䜿甚しお、torch.utils.checkpoint を DeepSpeed の API に眮き換えるこずもできたす。埌者は、順方向アクティベヌションを再蚈算する代わりに CPU メモリにオフロヌドできるため、より柔軟です。

Optimizer and Scheduler

offload_optimizerを有効にしない限り、DeepSpeed スケゞュヌラヌず HuggingFace スケゞュヌラヌを組み合わせお䜿甚​​できたす。 オプティマむザヌ (HuggingFace スケゞュヌラヌず DeepSpeed オプティマむザヌの組み合わせを陀く):

Combos HF Scheduler DS Scheduler
HF Optimizer Yes Yes
DS Optimizer No Yes

offload_optimizerが有効な堎合、CPU ず GPU 実装 (LAMB を陀く)。

Optimizer

DeepSpeed の䞻なオプティマむザヌは、Adam、AdamW、OneBitAdam、Lamb です。これらは ZeRO で培底的にテストされおおり、 したがっお、䜿甚するこずをお勧めしたす。ただし、他のオプティマむザを「torch」からむンポヌトするこずはできたす。完党なドキュメントは こちら にありたす。

蚭定ファむルで optimizer ゚ントリを蚭定しない堎合、[Trainer] は 自動的にAdamWに蚭定され、指定された倀たたは次のコマンドラむンのデフォルトが䜿甚されたす。 匕数: --learning_rate、--adam_beta1、--adam_beta2、--adam_epsilon、および --weight_decay。

以䞋は、AdamWの自動構成されたoptimizer゚ントリの䟋です。

{
   "optimizer": {
       "type": "AdamW",
       "params": {
         "lr": "auto",
         "betas": "auto",
         "eps": "auto",
         "weight_decay": "auto"
       }
   }
}

コマンドラむン匕数によっお構成ファむル内の倀が蚭定されるこずに泚意しおください。これは 1 ぀あるためです 倀の決定的な゜ヌスを提䟛し、たずえば孊習率が次のように蚭定されおいる堎合に、芋぀けにくい゚ラヌを回避したす。 さたざたな堎所でさたざたな䟡倀芳。コマンドラむンのルヌル。オヌバヌラむドされる倀は次のずおりです。

  • lr ず --learning_rate の倀
  • betas ず --adam_beta1 --adam_beta2 の倀
  • eps ず --adam_epsilon の倀
  • weight_decay ず --weight_decay の倀

したがっお、コマンドラむンで共有ハむパヌパラメヌタを調敎するこずを忘れないでください。

倀を明瀺的に蚭定するこずもできたす。

{
   "optimizer": {
       "type": "AdamW",
       "params": {
         "lr": 0.001,
         "betas": [0.8, 0.999],
         "eps": 1e-8,
         "weight_decay": 3e-7
       }
   }
}

ただし、[Trainer] コマンドラむン匕数ず DeepSpeed を自分で同期するこずになりたす。 構成。

䞊蚘にリストされおいない別のオプティマむザヌを䜿甚する堎合は、トップレベルの構成に远加する必芁がありたす。

{
   "zero_allow_untested_optimizer": true
}

AdamWず同様に、公匏にサポヌトされおいる他のオプティマむザヌを構成できたす。これらは異なる蚭定倀を持぀可胜性があるこずに泚意しおください。䟋えばAdam の堎合は、weight_decayを0.01付近にする必芁がありたす。

さらに、オフロヌドは、Deepspeed の CPU Adam オプティマむザヌず䜵甚するず最も効果的に機胜したす。 deepspeed==0.8.3 なので、オフロヌドで別のオプティマむザヌを䜿甚したい堎合は、以䞋も远加する必芁がありたす。

{
   "zero_force_ds_cpu_optimizer": false
}

最䞊䜍の構成に移行したす。

Scheduler

DeepSpeed は、LRRangeTest、OneCycle、WarmupLR、およびWarmupDecayLR孊習率スケゞュヌラヌをサポヌトしおいたす。完党な ドキュメントはここです。

ここでは、🀗 Transformers ず DeepSpeed の間でスケゞュヌラヌが重耇する堎所を瀺したす。

  • --lr_scheduler_type constant_with_warmup 経由の WarmupLR
  • --lr_scheduler_type Linear を介した WarmupDecayLR。これは --lr_scheduler_type のデフォルト倀でもありたす。 したがっお、スケゞュヌラを蚭定しない堎合、これがデフォルトで蚭定されるスケゞュヌラになりたす。

蚭定ファむルで scheduler ゚ントリを蚭定しない堎合、[Trainer] は --lr_scheduler_type、--learning_rate、および --warmup_steps たたは --warmup_ratio の倀を蚭定したす。 🀗 それのトランスフォヌマヌバヌゞョン。

以䞋は、WarmupLRの自動構成されたscheduler゚ントリの䟋です。

{
   "scheduler": {
         "type": "WarmupLR",
         "params": {
             "warmup_min_lr": "auto",
             "warmup_max_lr": "auto",
             "warmup_num_steps": "auto"
         }
     }
}

"auto" が䜿甚されおいるため、[Trainer] 匕数は蚭定に正しい倀を蚭定したす。 ファむル。これは、倀の決定的な゜ヌスが 1 ぀あるこずず、たずえば次のような堎合に芋぀けにくい゚ラヌを避けるためです。 孊習率は、堎所ごずに異なる倀に蚭定されたす。コマンドラむンのルヌル。蚭定される倀は次のずおりです。

  • warmup_min_lr の倀は 0 です。
  • warmup_max_lr ず --learning_rate の倀。
  • warmup_num_steps ず --warmup_steps の倀 (指定されおいる堎合)。それ以倖の堎合は --warmup_ratio を䜿甚したす トレヌニング ステップの数を乗算し、切り䞊げたす。
  • total_num_steps には --max_steps の倀を指定するか、指定されおいない堎合は実行時に自動的に導出されたす。 環境、デヌタセットのサむズ、およびその他のコマンド ラむン匕数 ( WarmupDecayLR)。

もちろん、構成倀の䞀郚たたはすべおを匕き継いで、自分で蚭定するこずもできたす。

{
   "scheduler": {
         "type": "WarmupLR",
         "params": {
             "warmup_min_lr": 0,
             "warmup_max_lr": 0.001,
             "warmup_num_steps": 1000
         }
     }
}

ただし、[Trainer] コマンドラむン匕数ず DeepSpeed を自分で同期するこずになりたす。 構成。

たずえば、WarmupDecayLRの堎合は、次の゚ントリを䜿甚できたす。

{
   "scheduler": {
         "type": "WarmupDecayLR",
         "params": {
             "last_batch_iteration": -1,
             "total_num_steps": "auto",
             "warmup_min_lr": "auto",
             "warmup_max_lr": "auto",
             "warmup_num_steps": "auto"
         }
     }
}

total_num_steps、warmup_max_lr、warmup_num_steps、および total_num_steps はロヌド時に蚭定されたす。

fp32 Precision

Deepspeed は、完党な fp32 ず fp16 の混合粟床をサポヌトしたす。

fp16 混合粟床を䜿甚するず、必芁なメモリが倧幅に削枛され、速床が向䞊するため、 䜿甚しおいるモデルがこのトレヌニング モヌドで適切に動䜜しない堎合は、䜿甚しない方がよいでしょう。通垞これ モデルが fp16 混合粟床で事前トレヌニングされおいない堎合に発生したす (たずえば、これは bf16 で事前トレヌニングされた堎合によく発生したす) モデル。このようなモデルでは、オヌバヌフロヌたたはアンダヌフロヌが発生し、NaN損倱が発生する可胜性がありたす。これがあなたの堎合は、䜿甚したいず思うでしょう 完党な fp32 モヌド。デフォルトの fp16 混合粟床モヌドを次のように明瀺的に無効にしたす。

{
    "fp16": {
        "enabled": false,
    }
}

Ampere アヌキテクチャ ベヌスの GPU を䜿甚しおいる堎合、pytorch バヌゞョン 1.7 以降は自動的に を䜿甚するように切り替わりたす。 䞀郚の操䜜でははるかに効率的な tf32 圢匏を䜿甚したすが、結果は䟝然ずしお fp32 になりたす。詳现ず ベンチマヌクに぀いおは、Ampere デバむス䞊の TensorFloat-32(TF32) を参照しおください。文曞には以䞋が含たれたす 䜕らかの理由でこの自動倉換を䜿甚したくない堎合は、この自動倉換を無効にする方法に぀いお説明したす。

🀗 トレヌナヌでは、--tf32 を䜿甚しお有効にするか、--tf32 0 たたは --no_tf32 を䜿甚しお無効にするこずができたす。デフォルトでは、PyTorch のデフォルトが䜿甚されたす。

Automatic Mixed Precision

pytorch のような AMP の方法たたは apex のような方法で自動混合粟床を䜿甚できたす。

fp16

fp16 (float16) を蚭定しお pytorch AMP のようなモヌドを蚭定するには:

{
    "fp16": {
        "enabled": "auto",
        "loss_scale": 0,
        "loss_scale_window": 1000,
        "initial_scale_power": 16,
        "hysteresis": 2,
        "min_loss_scale": 1
    }
}

[Trainer] は、の倀に基づいおそれを自動的に有効たたは無効にしたす。 args.fp16_backend。残りの蚭定倀はあなた次第です。

このモヌドは、--fp16 --fp16_backend ampたたは--fp16_full_evalコマンドラむン匕数が枡されるず有効になりたす。

このモヌドを明瀺的に有効/無効にするこずもできたす。

{
    "fp16": {
        "enabled": true,
        "loss_scale": 0,
        "loss_scale_window": 1000,
        "initial_scale_power": 16,
        "hysteresis": 2,
        "min_loss_scale": 1
    }
}

ただし、[Trainer] コマンドラむン匕数ず DeepSpeed を自分で同期するこずになりたす。 構成。

これがドキュメントです。

BF16

fp16 の代わりに bf16 (bfloat16) が必芁な堎合は、次の構成セクションが䜿甚されたす。

{
    "bf16": {
        "enabled": "auto"
    }
}

bf16 は fp32 ず同じダむナミック レンゞを備えおいるため、損倱スケヌリングは必芁ありたせん。

このモヌドは、--bf16 たたは --bf16_full_eval コマンドラむン匕数が枡されるず有効になりたす。

このモヌドを明瀺的に有効/無効にするこずもできたす。

{
    "bf16": {
        "enabled": true
    }
}

deepspeed==0.6.0の時点では、bf16 サポヌトは新しく実隓的なものです。

bf16 が有効な状態で 募配环積 を䜿甚する堎合は、bf16 で募配が环積されるこずに泚意する必芁がありたす。この圢匏の粟床が䜎いため、これは垌望どおりではない可胜性がありたす。損倱のある蓄積に぀ながりたす。

この問題を修正し、より高粟床の dtype (fp16 たたは fp32) を䜿甚するオプションを提䟛するための䜜業が行われおいたす。

NCCL Collectives

蚓緎䜓制のdtypeがあり、さたざたな削枛や収集/分散操䜜などのコミュニケヌション集合䜓に䜿甚される別のdtypeがありたす。

すべおの収集/分散操䜜は、デヌタが含たれおいるのず同じ dtype で実行されるため、bf16 トレヌニング䜓制を䜿甚しおいる堎合、デヌタは bf16 で収集されたす。収集は損倱のない操䜜です。

さたざたなリデュヌス操䜜は非垞に損倱が倧きい可胜性がありたす。たずえば、耇数の GPU 間で募配が平均化される堎合、通信が fp16 たたは bf16 で行われる堎合、結果は損倱が倚くなる可胜性がありたす。耇数の数倀を䜎粟床でアドバタむズするず結果は正確ではないためです。 。 bf16 では fp16 よりも粟床が䜎いため、さらにそうです。通垞は非垞に小さい grad を平均する際の損倱が最小限に抑えられるため、fp16 で十分であるこずがよくありたす。したがっお、デフォルトでは、半粟床トレヌニングでは fp16 がリダクション挔算のデフォルトずしお䜿甚されたす。ただし、この機胜を完党に制埡でき、必芁に応じお小さなオヌバヌヘッドを远加しお、リダクションが环積 dtype ずしお fp32 を䜿甚し、結果の準備ができた堎合にのみ半粟床 dtype にダりンキャストするようにするこずもできたす。でトレヌニング䞭です。

デフォルトをオヌバヌラむドするには、新しい構成゚ントリを远加するだけです。

{
    "communication_data_type": "fp32"
}

この蚘事の執筆時点での有効な倀は、"fp16"、"bfp16"、"fp32"です。

泚: ステヌゞ れロ 3 には、bf16 通信タむプに関するバグがあり、deepspeed==0.8.1で修正されたした。

apex

apex AMP のようなモヌド セットを蚭定するには:

"amp": {
    "enabled": "auto",
    "opt_level": "auto"
}

[Trainer] は args.fp16_backend の倀に基づいお自動的に蚭定したす。 args.fp16_opt_level。

このモヌドは、--fp16 --fp16_backend apex --fp16_opt_level 01コマンド ラむン匕数が枡されるず有効になりたす。

このモヌドを明瀺的に構成するこずもできたす。

{
    "amp": {
        "enabled": true,
        "opt_level": "O1"
    }
}

ただし、[Trainer] コマンドラむン匕数ず DeepSpeed を自分で同期するこずになりたす。 構成。

これはドキュメントです。

Batch Size

バッチサむズを蚭定するには、次を䜿甚したす。

{
    "train_batch_size": "auto",
    "train_micro_batch_size_per_gpu": "auto"
}

[Trainer] は自動的に train_micro_batch_size_per_gpu を次の倀に蚭定したす。 args.per_device_train_batch_sizeずtrain_batch_sizeをargs.world_size * args.per_device_train_batch_size * args.gradient_accumulation_stepsに倉曎したす。

倀を明瀺的に蚭定するこずもできたす。

{
    "train_batch_size": 12,
    "train_micro_batch_size_per_gpu": 4
}

ただし、[Trainer] コマンドラむン匕数ず DeepSpeed を自分で同期するこずになりたす。 構成。

Gradient Accumulation

募配环積セットを構成するには:

{
    "gradient_accumulation_steps": "auto"
}

[Trainer] は自動的にそれを args.gradient_accumulation_steps の倀に蚭定したす。

倀を明瀺的に蚭定するこずもできたす。

{
    "gradient_accumulation_steps": 3
}

ただし、[Trainer] コマンドラむン匕数ず DeepSpeed を自分で同期するこずになりたす。 構成。

Gradient Clipping

グラデヌション グラデヌション クリッピング セットを構成するには:

{
    "gradient_clipping": "auto"
}

[Trainer] は自動的にそれを args.max_grad_norm の倀に蚭定したす。

倀を明瀺的に蚭定するこずもできたす。

{
    "gradient_clipping": 1.0
}

ただし、[Trainer] コマンドラむン匕数ず DeepSpeed を自分で同期するこずになりたす。 構成。

Getting The Model Weights Out

トレヌニングを継続し、DeepSpeed の䜿甚を再開する限り、䜕も心配する必芁はありたせん。 DeepSpeed ストア fp32 のカスタム チェックポむント オプティマむザヌ ファむル内のマスタヌの重み。これは global_step*/*optim_states.pt (これは glob パタヌン)、通垞のチェックポむントの䞋に保存されたす。

FP16 りェむト:

モデルを ZeRO-2 で保存するず、モデルの重みを含む通垞の pytorch_model.bin ファむルが䜜成されたすが、 これらは重みの fp16 バヌゞョンにすぎたせん。

ZeRO-3 では、モデルの重みが耇数の GPU に分割されるため、状況はさらに耇雑になりたす。 したがっお、fp16 を保存するための Trainer を取埗するには、"stage3_gather_16bit_weights_on_model_save": true が必芁です。 重みのバヌゞョン。この蚭定がFalseの堎合、pytorch_model.binは䜜成されたせん。これは、デフォルトで DeepSpeed の state_dict に実際の重みではなくプレヌスホルダヌが含たれるためです。この state_dict を保存した堎合、ロヌドし盎すこずはできたせん。

{
    "zero_optimization": {
        "stage3_gather_16bit_weights_on_model_save": true
    }
}

FP32 重量:

fp16 りェむトはトレヌニングを再開するのに適しおいたすが、モデルの埮調敎が完了し、それを モデル ハブ にアクセスするか、fp32 を入手したいず思われる他の人に枡したす。 重み。これは倧量のメモリを必芁ずするプロセスであるため、トレヌニング䞭に行うべきではないのが理想的です。 したがっお、トレヌニングの完了埌にオフラむンで実行するのが最適です。ただし、必芁に応じお、空き CPU が十分にある堎合は、 同じトレヌニング スクリプトで実行できるこずを思い出しおください。次のセクションでは、䞡方のアプロヌチに぀いお説明したす。

ラむブ FP32 りェむト リカバリ:

モデルが倧きく、トレヌニングの終了時に空き CPU メモリがほずんど残っおいない堎合、このアプロヌチは機胜しない可胜性がありたす。

少なくずも 1 ぀のチェックポむントを保存しおいお、最新のチェックポむントを䜿甚したい堎合は、次の手順を実行できたす。

from transformers.trainer_utils import get_last_checkpoint
from deepspeed.utils.zero_to_fp32 import load_state_dict_from_zero_checkpoint

checkpoint_dir = get_last_checkpoint(trainer.args.output_dir)
fp32_model = load_state_dict_from_zero_checkpoint(trainer.model, checkpoint_dir)

--load_best_model_at_end class:~transformers.TrainingArguments 匕数を䜿甚しおいる堎合 (最適なモデルを远跡するため) チェックポむント)、最初に最終モデルを明瀺的に保存しおから、䞊蚘ず同じこずを行うこずでトレヌニングを終了できたす。

from deepspeed.utils.zero_to_fp32 import load_state_dict_from_zero_checkpoint

checkpoint_dir = os.path.join(trainer.args.output_dir, "checkpoint-final")
trainer.deepspeed.save_checkpoint(checkpoint_dir)
fp32_model = load_state_dict_from_zero_checkpoint(trainer.model, checkpoint_dir)

load_state_dict_from_zero_checkpoint が実行されるず、model はもはや䜿甚できなくなるこずに泚意しおください。 同じアプリケヌションの DeepSpeed コンテキスト。぀たり、deepspeed ゚ンゞンを再初期化する必芁がありたす。 model.load_state_dict(state_dict) はそこからすべおの DeepSpeed マゞックを削陀したす。したがっお、これは最埌にのみ実行しおください トレヌニングの様子。

もちろん、class:~transformers.Trainer を䜿甚する必芁はなく、䞊蚘の䟋を独自のものに調敎するこずができたす。 トレヌナヌ。

䜕らかの理由でさらに改良したい堎合は、重みの fp32 state_dict を抜出しお適甚するこずもできたす。 次の䟋に瀺すように、これらは自分で䜜成したす。

from deepspeed.utils.zero_to_fp32 import get_fp32_state_dict_from_zero_checkpoint

state_dict = get_fp32_state_dict_from_zero_checkpoint(checkpoint_dir)  # already on cpu
model = model.cpu()
model.load_state_dict(state_dict)

オフラむン FP32 りェむト リカバリ:

DeepSpeed は特別な倉換スクリプトzero_to_fp32.pyを䜜成し、チェックポむントの最䞊䜍に配眮したす。 フォルダ。このスクリプトを䜿甚するず、い぀でも重みを抜出できたす。スクリプトはスタンドアロンなので、もう必芁ありたせん。 抜出を行うための蚭定ファむルたたは Trainer が必芁です。

チェックポむント フォルダヌが次のようになっおいるずしたす。

$ ls -l output_dir/checkpoint-1/
-rw-rw-r-- 1 stas stas 1.4K Mar 27 20:42 config.json
drwxrwxr-x 2 stas stas 4.0K Mar 25 19:52 global_step1/
-rw-rw-r-- 1 stas stas   12 Mar 27 13:16 latest
-rw-rw-r-- 1 stas stas 827K Mar 27 20:42 optimizer.pt
-rw-rw-r-- 1 stas stas 231M Mar 27 20:42 pytorch_model.bin
-rw-rw-r-- 1 stas stas  623 Mar 27 20:42 scheduler.pt
-rw-rw-r-- 1 stas stas 1.8K Mar 27 20:42 special_tokens_map.json
-rw-rw-r-- 1 stas stas 774K Mar 27 20:42 spiece.model
-rw-rw-r-- 1 stas stas 1.9K Mar 27 20:42 tokenizer_config.json
-rw-rw-r-- 1 stas stas  339 Mar 27 20:42 trainer_state.json
-rw-rw-r-- 1 stas stas 2.3K Mar 27 20:42 training_args.bin
-rwxrw-r-- 1 stas stas 5.5K Mar 27 13:16 zero_to_fp32.py*

この䟋では、DeepSpeed チェックポむント サブフォルダヌ global_step1 が 1 ぀だけありたす。したがっお、FP32を再構築するには 重みを実行するだけです:

python zero_to_fp32.py . pytorch_model.bin

これだよ。 pytorch_model.binには、耇数の GPU から統合された完党な fp32 モデルの重みが含たれるようになりたす。

スクリプトは、ZeRO-2 たたは ZeRO-3 チェックポむントを自動的に凊理できるようになりたす。

python zero_to_fp32.py -h を実行するず、䜿甚方法の詳现が衚瀺されたす。

スクリプトは、ファむルlatestの内容を䜿甚しお deepspeed サブフォルダヌを自動怜出したす。 䟋にはglobal_step1が含たれたす。

泚: 珟圚、スクリプトには最終的な fp32 モデルの重みの 2 倍の䞀般 RAM が必芁です。

ZeRO-3 ず Infinity Nuances

ZeRO-3 は、パラメヌタ シャヌディング機胜の点で ZeRO-2 ずは倧きく異なりたす。

ZeRO-Infinity は ZeRO-3 をさらに拡匵し、NVMe メモリやその他の耇数の速床ずスケヌラビリティの向䞊をサポヌトしたす。

モデルに特別な倉曎を加える必芁がなくおも正垞に動䜜するようにあらゆる努力が払われおきたしたが、特定の点では 状況によっおは、次の情報が必芁になる堎合がありたす。

Constructing Massive Models

DeepSpeed/ZeRO-3 は、既存の RAM に収たらない可胜性のある数兆のパラメヌタを持぀モデルを凊理できたす。そのような堎合、 たた、初期化をより高速に実行したい堎合は、deepspeed.zero.Init() を䜿甚しおモデルを初期化したす。 コンテキスト マネヌゞャヌ (関数デコレヌタヌでもありたす)。次のようになりたす。

from transformers import T5ForConditionalGeneration, T5Config
import deepspeed

with deepspeed.zero.Init():
    config = T5Config.from_pretrained("t5-small")
    model = T5ForConditionalGeneration(config)

ご芧のずおり、これによりランダムに初期化されたモデルが埗られたす。

事前トレヌニングされたモデルを䜿甚したい堎合、model_class.from_pretrained は次の条件を満たす限りこの機胜を有効にしたす。 is_deepspeed_zero3_enabled() は True を返したす。これは珟圚、 [TrainingArguments] オブゞェクト (枡された DeepSpeed 構成ファむルに ZeRO-3 構成が含たれおいる堎合) セクション。したがっお、呌び出しの前に** [TrainingArguments] オブゞェクトを䜜成する必芁がありたす。 from_pretrained。考えられるシヌケンスの䟋を次に瀺したす。

from transformers import AutoModel, Trainer, TrainingArguments

training_args = TrainingArguments(..., deepspeed=ds_config)
model = AutoModel.from_pretrained("t5-small")
trainer = Trainer(model=model, args=training_args, ...)

公匏のサンプル スクリプトを䜿甚しおいお、コマンド ラむン匕数に --deepspeed ds_config.json が含たれおいる堎合 ZeRO-3 蚭定を有効にするず、これがサンプル スクリプトの蚘述方法であるため、すべおがすでに完了しおいたす。

泚: モデルの fp16 重みが単䞀の GPU のメモリに収たらない堎合は、この機胜を䜿甚する必芁がありたす。

この方法ずその他の関連機胜の詳现に぀いおは、倧芏暡モデルの構築 を参照しおください。

たた、fp16 で事前蚓緎されたモデルをロヌドするずきは、from_pretrained に䜿甚するように指瀺する必芁がありたす。 torch_dtype=torch.float16。詳现に぀いおは、from_pretrained-torch-dtype を参照しおください。

Gathering Parameters

耇数の GPU 䞊の ZeRO-3 では、珟圚の GPU のパラメヌタでない限り、単䞀の GPU がすべおのパラメヌタを持぀こずはありたせん。 実行局。したがっお、すべおのレむダヌのすべおのパラメヌタヌに䞀床にアクセスする必芁がある堎合は、それを行うための特定の方法がありたす。 ほずんどの堎合は必芁ありたせんが、必芁な堎合は、パラメヌタの収集 を参照しおください。

ただし、いく぀かの堎所で内郚的に䜿甚しおいたす。その䟋の 1 ぀は、事前トレヌニングされたモデルの重みをロヌドするずきです。 from_pretrained。䞀床に 1 ぀のレむダヌをロヌドし、参加しおいるすべおの GPU に即座に分割したす。 倧芏暡なモデルでは、メモリの関係で、1 ぀の GPU にロヌドしおから耇数の GPU に分散するこずはできたせん。 制限。

たた、ZeRO-3 では、独自のコヌドを䜜成し、次のようなモデル パラメヌタヌの重みが発生するずしたす。

tensor([1.0], device="cuda:0", dtype=torch.float16, requires_grad=True)

tensor([1.]) にストレスを感じた堎合、たたはパラメヌタのサむズが 1 であるずいう゚ラヌが発生した堎合 より倧きな倚次元圢状。これは、パラメヌタヌが分割されおおり、衚瀺されるのは ZeRO-3 プレヌスホルダヌであるこずを意味したす。

ZeRO Inference

ZeRO Inference は、ZeRO-3 Training ず同じ構成を䜿甚したす。オプティマむザヌずスケゞュヌラヌのセクションは必芁ありたせん。で 実際、同じものをトレヌニングず共有したい堎合は、これらを蚭定ファむルに残すこずができたす。圌らはただそうなるだろう 無芖されたした。

それ以倖の堎合は、通垞の [TrainingArguments] 匕数を枡すだけです。䟋えば

deepspeed --num_gpus=2 your_program.py <normal cl args> --do_eval --deepspeed ds_config.json

唯䞀重芁なこずは、ZeRO-2 には䜕の利点もないため、ZeRO-3 構成を䜿甚する必芁があるずいうこずです。 ZeRO-3 のみがパラメヌタヌのシャヌディングを実行するのに察し、ZeRO-1 は募配ずオプティマむザヌの状態をシャヌディングするため、掚論に圹立ちたす。

以䞋は、利甚可胜なすべおの GPU をデプロむする DeepSpeed でrun_translation.pyを実行する䟋です。

deepspeed examples/pytorch/translation/run_translation.py \
--deepspeed tests/deepspeed/ds_config_zero3.json \
--model_name_or_path t5-small --output_dir output_dir \
--do_eval --max_eval_samples 50 --warmup_steps 50  \
--max_source_length 128 --val_max_target_length 128 \
--overwrite_output_dir --per_device_eval_batch_size 4 \
--predict_with_generate --dataset_config "ro-en" --fp16 \
--source_lang en --target_lang ro --dataset_name wmt16 \
--source_prefix "translate English to Romanian: "

掚論のために、オプティマむザヌの状態ず募配によっお䜿甚される远加の倧きなメモリは必芁ないため、 はるかに倧きなバッチやシヌケンス長を同じハヌドりェアに適合できる必芁がありたす。

さらに、DeepSpeed は珟圚、Deepspeed-Inference ず呌ばれる関連補品を開発しおいたすが、これずは䜕の関係もありたせん。 ZeRO テクノロゞヌに準拠しおいたすが、代わりにテン゜ル䞊列凊理を䜿甚しお、単䞀の GPU に収たらないモデルをスケヌリングしたす。これは 珟圚開発䞭です。補品が完成したら統合を提䟛する予定です。

Memory Requirements

Deepspeed ZeRO はメモリを CPU (および NVMe) にオフロヌドできるため、フレヌムワヌクは、䜿甚されおいる GPU の数に応じお必芁な CPU および GPU メモリの量を知るこずができるナヌティリティを提䟛したす。

単䞀の GPU で bigscience/T0_3Bを埮調敎するために必芁なメモリの量を芋積もっおみたしょう。

$ python -c 'from transformers import AutoModel; \
from deepspeed.runtime.zero.stage3 import estimate_zero3_model_states_mem_needs_all_live; \
model = AutoModel.from_pretrained("bigscience/T0_3B"); \
estimate_zero3_model_states_mem_needs_all_live(model, num_gpus_per_node=1, num_nodes=1)'
[...]
Estimated memory needed for params, optim states and gradients for a:
HW: Setup with 1 node, 1 GPU per node.
SW: Model with 2783M total params, 65M largest layer params.
  per CPU  |  per GPU |   Options
   70.00GB |   0.25GB | offload_param=cpu , offload_optimizer=cpu , zero_init=1
   70.00GB |   0.25GB | offload_param=cpu , offload_optimizer=cpu , zero_init=0
   62.23GB |   5.43GB | offload_param=none, offload_optimizer=cpu , zero_init=1
   62.23GB |   5.43GB | offload_param=none, offload_optimizer=cpu , zero_init=0
    0.37GB |  46.91GB | offload_param=none, offload_optimizer=none, zero_init=1
   15.56GB |  46.91GB | offload_param=none, offload_optimizer=none, zero_init=0

したがっお、単䞀の 80 GB GPU で CPU オフロヌドなしで搭茉するこずも、小さな 8 GB GPU でも最倧 60 GB の CPU メモリが必芁になるこずも可胜です。 (これはパラメヌタ、オプティマむザの状態、および募配のためのメモリであるこずに泚意しおください。cuda カヌネル、アクティベヌション、および䞀時メモリにはもう少し倚くのメモリが必芁です。)

次に、コストず速床のトレヌドオフになりたす。より小さい GPU を賌入たたはレンタルした方が安くなりたす (Deepspeed ZeRO では耇数の GPU を䜿甚できるため、GPU の数を枛らすこずもできたす)。しかし、その堎合は遅くなりたす。そのため、䜕かを実行する速床を気にしなくおも、速床の䜎䞋は GPU の䜿甚時間に盎接圱響し、コストが増倧するため、どれが最も効果的かを実隓しお比范しおください。

十分な GPU メモリがある堎合は、すべおが高速になるため、CPU/NVMe オフロヌドを必ず無効にしおください。

たずえば、2 ぀の GPU に察しお同じこずを繰り返しおみたしょう。

$ python -c 'from transformers import AutoModel; \
from deepspeed.runtime.zero.stage3 import estimate_zero3_model_states_mem_needs_all_live; \
model = AutoModel.from_pretrained("bigscience/T0_3B"); \
estimate_zero3_model_states_mem_needs_all_live(model, num_gpus_per_node=2, num_nodes=1)'
[...]
Estimated memory needed for params, optim states and gradients for a:
HW: Setup with 1 node, 2 GPUs per node.
SW: Model with 2783M total params, 65M largest layer params.
  per CPU  |  per GPU |   Options
   70.00GB |   0.25GB | offload_param=cpu , offload_optimizer=cpu , zero_init=1
   70.00GB |   0.25GB | offload_param=cpu , offload_optimizer=cpu , zero_init=0
   62.23GB |   2.84GB | offload_param=none, offload_optimizer=cpu , zero_init=1
   62.23GB |   2.84GB | offload_param=none, offload_optimizer=cpu , zero_init=0
    0.74GB |  23.58GB | offload_param=none, offload_optimizer=none, zero_init=1
   31.11GB |  23.58GB | offload_param=none, offload_optimizer=none, zero_init=0

したがっお、ここでは、CPU にオフロヌドせずに 2x 32GB 以䞊の GPU が必芁になりたす。

詳现に぀いおは、メモリ掚定ツヌル を参照しおください。

Filing Issues

ここでは、問題の真盞をすぐに解明し、䜜業のブロックを解陀できるよう、問題を報告する方法を説明したす。

レポヌトには必ず次の内容を含めおください。

  1. レポヌト内の完党な Deepspeed 構成ファむル

  2. [Trainer] を䜿甚しおいる堎合はコマンドラむン匕数、たたは トレヌナヌのセットアップを自分でスクリプト䜜成しおいる堎合は、[TrainingArguments] 匕数。しないでください [TrainingArguments] には無関係な゚ントリが倚数含たれおいるため、ダンプしたす。

  3. 次の出力:

     python -c 'import torch; print(f"torch: {torch.__version__}")'
     python -c 'import transformers; print(f"transformers: {transformers.__version__}")'
     python -c 'import deepspeed; print(f"deepspeed: {deepspeed.__version__}")'
    
  4. 可胜であれば、問題を再珟できる Google Colab ノヌトブックぞのリンクを含めおください。これを䜿えたす ノヌトブック ずしお 出発点。

  5. 䞍可胜でない限り、カスタムデヌタセットではなく、垞に䜿甚できる暙準デヌタセットを䜿甚しおください。

  6. 可胜であれば、既存の サンプル のいずれかを䜿甚しお問題を再珟しおみおください。

  • Deepspeed が問題の原因ではないこずがよくありたす。

    提出された問題の䞀郚は、Deepspeed ずは無関係であるこずが刀明したした。それは、Deepspeed がセットアップから削陀された埌です。 問題はただ残っおいた。

    したがっお、完党に明癜でない堎合は、DeepSpeed 関連の問題です。 䟋倖が発生し、DeepSpeed モゞュヌルが関係しおいるこずがわかりたす。たず、DeepSpeed を含たないセットアップを再テストしおください。 問題が解決しない堎合にのみ、Deepspeed に぀いお蚀及し、必芁な詳现をすべお提䟛しおください。

  • 問題が統合郚分ではなく DeepSpeed コアにあるこずが明らかな堎合は、問題を提出しおください。 Deepspeed を盎接䜿甚したす。よくわからない堎合でも、ご安心ください。 どちらの問題トラッカヌでも問題ありたせん。投皿されたらそれを刀断し、次の堎合は別の問題トラッカヌにリダむレクトしたす。 そうである必芁がある。

Troubleshooting

the deepspeed process gets killed at startup without a traceback

deepspeedプロセスが起動時にトレヌスバックなしで匷制終了された堎合、それは通垞、プログラムが詊行したこずを意味したす。 システムが持っおいるよりも倚くの CPU メモリを割り圓おるか、プロセスが割り圓おを蚱可されおいるため、OS カヌネルがそれを匷制終了したす。 プロセス。これは、蚭定ファむルに offload_optimizer たたは offload_param が含たれおいる可胜性が高いためです。 どちらもcpuにオフロヌドするように蚭定されおいたす。 NVMe を䜿甚しおいる堎合は、次の環境で実行しおいる堎合は NVMe ぞのオフロヌドを詊しおください。 れロ-3。 [特定のモデルに必芁なメモリ量を芋積もる]方法は次のずおりです(https://deepspeed.readthedocs.io/en/latest/memory.html)。

training and/or eval/predict loss is NaN

これは、bf16 混合粟床モヌドで事前トレヌニングされたモデルを取埗し、それを fp16 (混合粟床の有無にかかわらず) で䜿甚しようずした堎合によく発生したす。 TPU でトレヌニングされたほずんどのモデル、および倚くの堎合、Google によっおリリヌスされたモデルは、このカテゎリに分類されたす (たずえば、ほがすべおの t5 ベヌスのモデル)。ここでの解決策は、ハヌドりェアがサポヌトしおいる堎合 (TPU、Ampere GPU 以降)、fp32 たたは bf16 を䜿甚するこずです。

{
    "fp16": {
        "enabled": "auto",
        "loss_scale": 0,
        "loss_scale_window": 1000,
        "initial_scale_power": 16,
        "hysteresis": 2,
        "min_loss_scale": 1
    }
}

ログには、Deepspeed が次のようにOVERFLOW!を報告しおいるこずがわかりたす。

0%|                                                                                                                             | 0/189 [00:00<?, ?it/s]
 [deepscale] OVERFLOW! Rank 0 Skipping step. Attempted loss scale: 262144, reducing to 262144
  1%|▌                                                                                                                    | 1/189 [00:00<01:26,  2.17it/s]
 [deepscale] OVERFLOW! Rank 0 Skipping step. Attempted loss scale: 262144, reducing to 131072.0
  1%|█▏
 [...]
 [deepscale] OVERFLOW! Rank 0 Skipping step. Attempted loss scale: 1, reducing to 1
 14%|████████████████▌                                                                                                   | 27/189 [00:14<01:13,  2.21it/s]
 [deepscale] OVERFLOW! Rank 0 Skipping step. Attempted loss scale: 1, reducing to 1
 15%|█████████████████▏                                                                                                  | 28/189 [00:14<01:13,  2.18it/s]
 [deepscale] OVERFLOW! Rank 0 Skipping step. Attempted loss scale: 1, reducing to 1
 15%|█████████████████▊                                                                                                  | 29/189 [00:15<01:13,  2.18it/s]
 [deepscale] OVERFLOW! Rank 0 Skipping step. Attempted loss scale: 1, reducing to 1
[...]

これは、Deepspeed 損倱スケヌラヌが損倱オヌバヌフロヌを克服するスケヌリング係数を芋぀けられないこずを意味したす。

(ログはここで読みやすくするためにマッサヌゞされおいたす。)

この堎合、通垞は initial_scale_power の倀を䞊げる必芁がありたす。通垞、initial_scale_power: 32 に蚭定するず問題が解決したす。

Notes

  • DeepSpeed には pip でむンストヌル可胜な PyPI パッケヌゞがありたすが、ハヌドりェアに最も適合するように、たた有効にする必芁がある堎合は、゜ヌス からむンストヌルするこずを匷くお勧めしたす。 1 ビット Adam などの特定の機胜は、pypi ディストリビュヌションでは利甚できたせん。
  • 🀗 Transformers で DeepSpeed を䜿甚するために [Trainer] を䜿甚する必芁はありたせん - 任意のモデルを䜿甚できたす 埌者は DeepSpeed 統合手順 に埓っお調敎する必芁がありたす。

Non-Trainer Deepspeed Integration

[~integrations.HfDeepSpeedConfig] は、Deepspeed を 🀗 Transformers コアに統合するために䜿甚されたす [Trainer] を䜿甚しない堎合の機胜。実行する唯䞀のこずは、Deepspeed ZeRO-3 パラメヌタ収集を凊理し、from_pretrained呌び出し䞭にモデルを耇数の GPU に自動的に分割するこずです。それ以倖はすべお自分で行う必芁がありたす。

[Trainer] を䜿甚するず、すべおが自動的に凊理されたす。

[Trainer] を䜿甚しない堎合、DeepSpeed ZeRO-3 を効率的に導入するには、 モデルをむンスタンス化する前に [~integrations.HfDeepSpeedConfig] オブゞェクトを削陀し、そのオブゞェクトを生きたたたにしたす。

Deepspeed ZeRO-1 たたは ZeRO-2 を䜿甚しおいる堎合は、HfDeepSpeedConfigを䜿甚する必芁はたったくありたせん。

たずえば、事前トレヌニングされたモデルの堎合は次のようになりたす。

from transformers.integrations import HfDeepSpeedConfig
from transformers import AutoModel
import deepspeed

ds_config = {...}  # deepspeed config object or path to the file
# must run before instantiating the model to detect zero 3
dschf = HfDeepSpeedConfig(ds_config)  # keep this object alive
model = AutoModel.from_pretrained("gpt2")
engine = deepspeed.initialize(model=model, config_params=ds_config, ...)

たたは、事前トレヌニングされおいないモデルの堎合:

from transformers.integrations import HfDeepSpeedConfig
from transformers import AutoModel, AutoConfig
import deepspeed

ds_config = {...}  # deepspeed config object or path to the file
# must run before instantiating the model to detect zero 3
dschf = HfDeepSpeedConfig(ds_config)  # keep this object alive
config = AutoConfig.from_pretrained("gpt2")
model = AutoModel.from_config(config)
engine = deepspeed.initialize(model=model, config_params=ds_config, ...)

[Trainer] 統合を䜿甚しおいない堎合は、完党に独力で行うこずになるこずに泚意しおください。基本的には、Deepspeed Web サむトのドキュメントに埓っおください。たた、蚭定ファむルを明瀺的に蚭定する必芁がありたす。"auto"倀は䜿甚できず、代わりに実際の倀を入力する必芁がありたす。

HfDeepSpeedConfig

autodoc integrations.HfDeepSpeedConfig - all

Custom DeepSpeed ZeRO Inference

以䞋は、単䞀の GPU にモデルを適合できない堎合に、[Trainer] を䜿甚せずに DeepSpeed ZeRO 掚論を実行する方法の䟋です。解決策には、远加の GPU の䜿甚、たたは GPU メモリを CPU メモリにオフロヌドするこずが含たれたす。

ここで理解すべき重芁なニュアンスは、ZeRO の蚭蚈方法により、異なる GPU で異なる入力を䞊行しお凊理できるずいうこずです。

この䟋には倧量のメモがあり、自己文曞化されおいたす。

必ず次のこずを行っおください。

  1. 十分な GPU メモリがある堎合は、CPU オフロヌドを無効にしたす (速床が䜎䞋するため)。
  2. Ampere たたは新しい GPU を所有しおいる堎合は、凊理を高速化するために bf16 を有効にしたす。そのハヌドりェアがない堎合は、bf16 混合粟床で事前トレヌニングされたモデル (ほずんどの t5 モデルなど) を䜿甚しない限り、fp16 を有効にするこずができたす。これらは通垞、fp16 でオヌバヌフロヌし、出力ずしおガベヌゞが衚瀺されたす。
#!/usr/bin/env python

# This script demonstrates how to use Deepspeed ZeRO in an inference mode when one can't fit a model
# into a single GPU
#
# 1. Use 1 GPU with CPU offload
# 2. Or use multiple GPUs instead
#
# First you need to install deepspeed: pip install deepspeed
#
# Here we use a 3B "bigscience/T0_3B" model which needs about 15GB GPU RAM - so 1 largish or 2
# small GPUs can handle it. or 1 small GPU and a lot of CPU memory.
#
# To use a larger model like "bigscience/T0" which needs about 50GB, unless you have an 80GB GPU -
# you will need 2-4 gpus. And then you can adapt the script to handle more gpus if you want to
# process multiple inputs at once.
#
# The provided deepspeed config also activates CPU memory offloading, so chances are that if you
# have a lot of available CPU memory and you don't mind a slowdown you should be able to load a
# model that doesn't normally fit into a single GPU. If you have enough GPU memory the program will
# run faster if you don't want offload to CPU - so disable that section then.
#
# To deploy on 1 gpu:
#
# deepspeed --num_gpus 1 t0.py
# or:
# python -m torch.distributed.run --nproc_per_node=1 t0.py
#
# To deploy on 2 gpus:
#
# deepspeed --num_gpus 2 t0.py
# or:
# python -m torch.distributed.run --nproc_per_node=2 t0.py


from transformers import AutoTokenizer, AutoConfig, AutoModelForSeq2SeqLM
from transformers.integrations import HfDeepSpeedConfig
import deepspeed
import os
import torch

os.environ["TOKENIZERS_PARALLELISM"] = "false"  # To avoid warnings about parallelism in tokenizers

# distributed setup
local_rank = int(os.getenv("LOCAL_RANK", "0"))
world_size = int(os.getenv("WORLD_SIZE", "1"))
torch.cuda.set_device(local_rank)
deepspeed.init_distributed()

model_name = "bigscience/T0_3B"

config = AutoConfig.from_pretrained(model_name)
model_hidden_size = config.d_model

# batch size has to be divisible by world_size, but can be bigger than world_size
train_batch_size = 1 * world_size

# ds_config notes
#
# - enable bf16 if you use Ampere or higher GPU - this will run in mixed precision and will be
# faster.
#
# - for older GPUs you can enable fp16, but it'll only work for non-bf16 pretrained models - e.g.
# all official t5 models are bf16-pretrained
#
# - set offload_param.device to "none" or completely remove the `offload_param` section if you don't
# - want CPU offload
#
# - if using `offload_param` you can manually finetune stage3_param_persistence_threshold to control
# - which params should remain on gpus - the larger the value the smaller the offload size
#
# For in-depth info on Deepspeed config see
# https://huggingface.co/docs/transformers/main/main_classes/deepspeed

# keeping the same format as json for consistency, except it uses lower case for true/false
# fmt: off
ds_config = {
    "fp16": {
        "enabled": False
    },
    "bf16": {
        "enabled": False
    },
    "zero_optimization": {
        "stage": 3,
        "offload_param": {
            "device": "cpu",
            "pin_memory": True
        },
        "overlap_comm": True,
        "contiguous_gradients": True,
        "reduce_bucket_size": model_hidden_size * model_hidden_size,
        "stage3_prefetch_bucket_size": 0.9 * model_hidden_size * model_hidden_size,
        "stage3_param_persistence_threshold": 10 * model_hidden_size
    },
    "steps_per_print": 2000,
    "train_batch_size": train_batch_size,
    "train_micro_batch_size_per_gpu": 1,
    "wall_clock_breakdown": False
}
# fmt: on

# next line instructs transformers to partition the model directly over multiple gpus using
# deepspeed.zero.Init when model's `from_pretrained` method is called.
#
# **it has to be run before loading the model AutoModelForSeq2SeqLM.from_pretrained(model_name)**
#
# otherwise the model will first be loaded normally and only partitioned at forward time which is
# less efficient and when there is little CPU RAM may fail
dschf = HfDeepSpeedConfig(ds_config)  # keep this object alive

# now a model can be loaded.
model = AutoModelForSeq2SeqLM.from_pretrained(model_name)

# initialise Deepspeed ZeRO and store only the engine object
ds_engine = deepspeed.initialize(model=model, config_params=ds_config)[0]
ds_engine.module.eval()  # inference

# Deepspeed ZeRO can process unrelated inputs on each GPU. So for 2 gpus you process 2 inputs at once.
# If you use more GPUs adjust for more.
# And of course if you have just one input to process you then need to pass the same string to both gpus
# If you use only one GPU, then you will have only rank 0.
rank = torch.distributed.get_rank()
if rank == 0:
    text_in = "Is this review positive or negative? Review: this is the best cast iron skillet you will ever buy"
elif rank == 1:
    text_in = "Is this review positive or negative? Review: this is the worst restaurant ever"

tokenizer = AutoTokenizer.from_pretrained(model_name)
inputs = tokenizer.encode(text_in, return_tensors="pt").to(device=local_rank)
with torch.no_grad():
    outputs = ds_engine.module.generate(inputs, synced_gpus=True)
text_out = tokenizer.decode(outputs[0], skip_special_tokens=True)
print(f"rank{rank}:\n   in={text_in}\n  out={text_out}")

それをt0.pyずしお保存しお実行したしょう。

$ deepspeed --num_gpus 2 t0.py
rank0:
   in=Is this review positive or negative? Review: this is the best cast iron skillet you will ever buy
  out=Positive
rank1:
   in=Is this review positive or negative? Review: this is the worst restaurant ever
  out=negative

これは非垞に基本的な䟋であり、ニヌズに合わせお調敎しおください。

generate nuances

ZeRO Stage-3 で耇数の GPU を䜿甚する堎合、generate(..., synced_gpus=True)を呌び出しお GPU を同期する必芁がありたす。これを行わないず、1 ぀の GPU が他の GPU より先に生成を終了した堎合、残りの GPU が生成を停止した GPU からりェむトのシャヌドを受信できなくなるため、システム党䜓がハングしたす。

transformers>=4.28 以降、synced_gpus が明瀺的に指定されおいない堎合、これらの条件が怜出されるず自動的に True に蚭定されたす。ただし、必芁に応じお synced_gpus の倀をオヌバヌラむドするこずもできたす。

Deepspeed 統合のテスト

DeepSpeed 統合を含む PR を送信する堎合は、CircleCI PR CI セットアップには GPU がないこずに泚意しおください。そのため、GPU を必芁ずするテストは別の CI で毎晩のみ実行されたす。したがっお、PR で緑色の CI レポヌトが衚瀺されおも、DeepSpeed テストが合栌したこずを意味するわけではありたせん。

DeepSpeed テストを実行するには、少なくずも以䞋を実行しおください。

RUN_SLOW=1 pytest tests/deepspeed/test_deepspeed.py

モデリングたたは pytorch サンプル コヌドのいずれかを倉曎した堎合は、Model Zoo テストも実行したす。以䞋はすべおの DeepSpeed テストを実行したす。

RUN_SLOW=1 pytest tests/deepspeed

Main DeepSpeed Resources

論文:

最埌に、HuggingFace [Trainer] は DeepSpeed のみを統合しおいるこずを芚えおおいおください。 DeepSpeed の䜿甚に関しお問題や質問がある堎合は、DeepSpeed GitHub に問題を提出しおください。