Le traduzioni sono generate tramite traduzione automatica. In caso di conflitto tra il contenuto di una traduzione e la versione originale in Inglese, quest'ultima prevarrà.
Ottimizzazione
La messa a punto è un processo di formazione continua di modelli pre-addestrati per migliorare le prestazioni per casi d'uso specifici.
La messa a punto di piccoli modelli che si adattano perfettamente a un singolo GPU modello o quelli che si adattano completamente a 8 copie del modello è semplice. CPUs Non richiede particolari modifiche alla formazione regolare. FSDP Nel campo dei modelli più grandi di questo, è necessario prendere in considerazione l'utilizzo della funzionalità di inizializzazione ritardata dei parametri, che può essere complicata.
Per risolvere questo problema, la SMP libreria carica il modello completo su uno dei ranghi, mentre il resto dei ranghi crea modelli con pesi vuoti su un meta-dispositivo. Quindi, PyTorch FSDP inizializza i pesi su livelli diversi da zero utilizzando la init_weights
funzione e sincronizza i pesi di tutti i ranghi con i pesi di grado 0 con impostato su. sync_module_states
True
Il seguente frammento di codice mostra come configurarlo nello script di allenamento.
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 )
Ottimizzazione di un modello Hugging Face Transformer pre-addestrato con parallelismo tensoriale SMP
Questa sezione illustra il caricamento dei modelli Transformer per due casi d'uso: la messa a punto di piccoli modelli Transformer e la messa a punto di modelli Transformer di grandi dimensioni. Per i modelli più piccoli senza ritardi nell'inizializzazione dei parametri, avvolgi il modello con il prima di avvolgerlo. 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, )
Per i modelli più grandi, l'approccio precedente causa l'esaurimento della memoria. CPU Si consiglia di utilizzare l'inizializzazione ritardata dei parametri per evitare tali CPU problemi di memoria. In questo caso, è possibile applicare l'torch.sagemaker.transform
APIand the torch.sagemaker.delayed_param.DelayedParamIniter
API come illustrato nel seguente esempio di codice.
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 )