翻訳は機械翻訳により提供されています。提供された翻訳内容と英語版の間で齟齬、不一致または矛盾がある場合、英語版が優先します。
ファインチューニング
微調整は、特定のユースケースのパフォーマンスを向上させるために、トレーニング済みのモデルを継続的にトレーニングするプロセスです。
1 つの に完全に収まる小さなモデルGPU、または 8 コピーのモデルに完全に収まる小さなモデルを微調整するのはCPUs簡単です。定期的なFSDPトレーニングに特別な変更は必要ありません。これより大きいモデルの領域では、遅延パラメータ初期化機能の使用を検討する必要があります。これは難しい場合があります。
これに対処するために、SMPライブラリはいずれかのランクにフルモデルをロードし、残りのランクはメタデバイスに空の重みを持つモデルを作成します。次に、 PyTorch FSDP init_weights
関数を使用してゼロ以外のランクの重みを初期化し、すべてのランクの重みを を sync_module_states
に設定して 0 番目のランクの重みに同期しますTrue
。次のコードスニペットは、トレーニングスクリプトで設定する方法を示しています。
import torch.distributed as dist from transformers import AutoModelForCasalLM from accelerate import init_empty_weights from torch.sagemaker.delayed_param import DelayedParamIniter if dist.get_rank() == 0: model = AutoModelForCasalLM.from_pretrained(..., low_cpu_mem_usage=True) else: with init_empty_weights(): model = AutoModelForCasalLM.from_config(AutoConfig.from_pretrained(...)) delayed_initer = DelayedParamIniter(model) model = FSDP( model, ..., sync_module_states=True, param_init_fn=delayed_initer.get_param_init_fn() if dist.get_rank() > 0 else None )
テンソル並列処理による事前トレーニング済みの Hugging Face Transformer SMP モデルの微調整
このセクションでは、小さなトランスフォーマーモデルの微調整と大きなトランスフォーマーモデルの微調整という 2 つのユースケースのトランスフォーマーモデルのロードについて説明します。パラメータの初期化が遅れていない小規模なモデルの場合は、モデルを でラップtorch.sagemaker.transform
APIしてから、 で PyTorchラップしますFSDP。
import functools from transformers import AutoModelForCausalLM from torch.distributed.fsdp import FullyShardedDataParallel as FSDP from torch.distributed.fsdp.wrap import transformer_auto_wrap_policy from torch.sagemaker import transform model = AutoModelForCausalLM.from_pretrained("meta-llama/Llama-2-7b-hf", low_cpu_mem_usage=True) # Transform model while loading state dictionary from rank 0. tp_model = transform(model, load_state_dict_from_rank0=True) # Wrap with FSDP. model = FSDP( tp_model, ... sync_module_states=True, )
より大きなモデルの場合、前述の方法ではCPUメモリが不足します。このようなCPUメモリの問題を避けるため、遅延パラメータの初期化を使用することをお勧めします。この場合、次のコード例torch.sagemaker.delayed_param.DelayedParamIniter
APIに示すように、 torch.sagemaker.transform
APIと を適用できます。
from transformers import AutoModelForCausalLM from torch.sagemaker import transform from torch.sagemaker.delayed_param import DelayedParamIniter # Create one instance of model without delayed param # on CPU, on one rank. if dist.get_rank() == 0: model = AutoModelForCasalLM.from_pretrained(...,low_cpu_mem_usage=True) else: with init_empty_weights(): model = AutoModelForCasalLM.from_config(AutoConfig.from_pretrained(...)) # Transform model while loading state dictionary from rank 0 model = transform(model, load_state_dict_from_rank0=True) if dist.get_rank() != 0: # For fine-tuning, delayed parameter on non-zero ranks delayed_initer = DelayedParamIniter(model) else: delayed_initer = None with ( delayed_initer.validate_params_and_buffers_inited() if delayed_initer else nullcontext() ): # Wrap the model with FSDP model = FSDP( model, ..., sync_module_states=True, param_init_fn=delayed_initer.get_param_init_fn() if delayed_initer else None )