微調 - Amazon SageMaker

本文為英文版的機器翻譯版本,如內容有任何歧義或不一致之處,概以英文版為準。

微調

微調是持續訓練預先訓練模型的程序,以改善特定使用案例的效能。

微調完全適合單個 GPU 的小型模型,或完全符合 CPU 8 個模型副本的模型非常簡單。它不需要特別更改定期 FSDP 培訓。在大於此範圍的模型中,您需要考慮使用延遲參數初始化功能,這可能很棘手。

為了解決這個問題,SMP 庫將完整模型加載到其中一個級別上,而其餘隊列則在元設備上創建具有空權重的模型。然後, PyTorch FSDP 使用該init_weights函數初始化非零行列的權重,並將所有等級的權重同步到第 0 級上的權重,並將設置為。sync_module_states 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 )

使用 SMP 張量平行度微調預先訓練的 Hugging Face 變壓器模型

本節討論兩種使用案例的載入變壓器模型:微調小型變壓器模型和微調大型變壓器模型。對於沒有延遲參數初始化的較小模型,請在使用 PyTorch FSDP 包裝模型之前使用 torch.sagemaker.transform API 包裝模型。

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.transform API 和 torch.sagemaker.delayed_param.DelayedParamIniter 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 )