微调 - Amazon SageMaker
Amazon Web Services 文档中描述的 Amazon Web Services 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅 中国的 Amazon Web Services 服务入门 (PDF)

本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。

微调

Fine-tuning 是一个持续训练预训练模型以提高特定用例性能的过程。

微调完全适合单个 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 Transformer 模型

本节讨论了为两个用例加载变压器模型:微调小型变压器模型和微调大型变压器模型。对于没有延迟参数初始化的较小模型,请先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.transform API 和 AP torch.sagemaker.delayed_param.DelayedParamIniter I,如以下代码示例所示。

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 )