A biblioteca de paralelismo de modelos do SageMaker v2 de referência
Veja a seguir as referências à biblioteca de paralelismo de modelos do SageMaker v2 (SMP v2).
Tópicos
Parâmetros de configuração do atributo principal do SMP v2
A seguir encontra-se uma lista completa de parâmetros para ativar e configurar o Principais atributos da biblioteca de paralelismo de modelos do SageMaker v2. Eles devem ser gravados no formato JSON e passadas para o estimador do PyTorch no SageMaker Python SDK ou salvas como um arquivo JSON para o SageMaker HyperPod.
{ "hybrid_shard_degree":
Integer
, "sm_activation_offloading":Boolean
, "activation_loading_horizon":Integer
, "fsdp_cache_flush_warnings":Boolean
, "allow_empty_shards":Boolean
, "tensor_parallel_degree":Integer
, "context_parallel_degree":Integer
, "expert_parallel_degree":Integer
, "random_seed":Integer
}
-
hybrid_shard_degree
(inteiro): determina um grau de paralelismo fragmentado. O valor deve ser um número inteiro entre0
eworld_size
. O valor padrão é0
.-
Se definido como
0
, ele volta para a implementação nativa do PyTorch e para a API no script quandotensor_parallel_degree
é 1. Caso contrário, ele calcula o maiorhybrid_shard_degree
possível com base emtensor_parallel_degree
eworld_size
. Ao recorrer aos casos de uso nativos do FSDP do PyTorch, seFULL_SHARD
for a estratégia usada, ela fragmenta-se em todo o cluster de GPUs. SeHYBRID_SHARD
ou_HYBRID_SHARD_ZERO2
foi a estratégia, é equivalentehybrid_shard_degree
de 8. Quando o paralelismo de tensores está ativado, ele fragmenta-se com base na versão revisada dehybrid_shard_degree
. -
Se definido como
1
, ele volta para a implementação nativa do PyTorch e para a APINO_SHARD
no script quandotensor_parallel_degree
é 1. Caso contrário, é equivalente aNO_SHARD
em qualquer grupo de paralelismo de tensores. -
Se definido como um número inteiro entre 2 e
world_size
, a fragmentação ocorre no número definido de GPUs. Se você não configurarsharding_strategy
no script do FSDP, ele será substituído porHYBRID_SHARD
. Se você definir_HYBRID_SHARD_ZERO2
, será usado osharding_strategy
que você definir.
-
-
sm_activation_offloading
(booleano): define se deve ser ativada a implementação de descarregamento de ativação do SMP. SeFalse
, o descarregamento usa a implementação nativa do PyTorch. SeTrue
, ele usa a implementação de descarregamento de ativação do SMP. Você também precisa usar o wrapper de descarregamento de ativação (torch.distributed.algorithms._checkpoint.checkpoint_wrapper.offload_wrapper
) do PyTorch no script. Para saber mais, consulte Ativação e descarregamento. O valor padrão éTrue
. -
activation_loading_horizon
(inteiro): um número inteiro que especifica o tipo de horizonte de descarga de ativação para o FSDP. Esse é o número máximo de camadas com pontos de verificação ou descarregadas cujas entradas podem estar na memória da GPU simultaneamente. Para saber mais, consulte Ativação e descarregamento. O valor da entrada deve ser um inteiro positivo. O valor padrão é2
. -
fsdp_cache_flush_warnings
(booleano): detecta e avisa se as liberações de cache ocorrem no gerenciador de memória PyTorch, pois elas podem prejudicar o desempenho computacional. O valor padrão éTrue
. -
allow_empty_shards
(booleano): se deve permitir fragmentos vazios ao fragmentar tensores, se o tensor não for divisível. Essa é uma correção experimental para falhas durante o checkpoint em determinados cenários. Desabilitá-la retorna ao comportamento original do PyTorch. O valor padrão éFalse
. -
tensor_parallel_degree
(inteiro): determina um grau de paralelismo de tensores. O valor deve estar entre1
eworld_size
. O valor padrão é1
. Observe que passar um valor maior que 1 não ativa automaticamente o paralelismo de contexto. Você também precisa usar a API torch.sagemaker.transform para incluir o modelo no script de treinamento. Para saber mais, consulte Paralelismo de tensores. -
context_parallel_degree
(inteiro): determina o grau de paralelismo do contexto. O valor deve estar entre1
eworld_size
, e deve ser<= hybrid_shard_degree
. O valor padrão é1
. Observe que passar um valor maior que 1 não ativa automaticamente o paralelismo de contexto. Você também precisa usar a API torch.sagemaker.transform para incluir o modelo no script de treinamento. Para saber mais, consulte Paralelismo de contexto. -
expert_parallel_degree
(inteiro): determina um grau de paralelismo especializado. O valor deve estar entre 1 eworld_size
. O valor padrão é1
. Observe que passar um valor maior que 1 não ativa automaticamente o paralelismo de contexto. Você também precisa usar a API torch.sagemaker.transform para incluir o modelo no script de treinamento. Para saber mais, consulte Paralelismo especializado. -
random_seed
(inteiro): um número inicial para as operações randomizadas em módulos distribuídos por paralelismo de tensores ou paralelismo especializado do SMP. Esse número inicial é adicionado às classificações de paralelismo de tensores ou de paralelismo especializado para definir o número inicial real para cada classificação. É exclusivo para cada classificação de paralelismo de tensores ou de paralelismo especializado. O SMP v2 garante que o número aleatório gerado nas classificações de paralelismo de tensores ou de paralelismo especializado corresponda aos casos de paralelismo sem tensor e casos de paralelismo não especializado, respectivamente.
Referência ao pacote SMP v2 torch.sagemaker
Esta seção é uma referência ao pacote torch.sagemaker
fornecido pelo SMP v2.
Tópicos
- torch.sagemaker.delayed_param.DelayedParamIniter
- torch.sagemaker.distributed.checkpoint.state_dict_saver.async_save
- torch.sagemaker.distributed.checkpoint.state_dict_saver.maybe_finalize_async_calls
- torch.sagemaker.distributed.checkpoint.state_dict_saver.save
- torch.sagemaker.distributed.checkpoint.state_dict_loader.load
- torch.sagemaker.moe.moe_config.MoEConfig
- torch.sagemaker.nn.attn.FlashSelfAttention
- torch.sagemaker.nn.attn.FlashGroupedQueryAttention
- torch.sagemaker.nn.huggingface.llama_flashattn.LlamaFlashAttention
- torch.sagemaker.transform
- torch.sagemaker funções e propriedades do utilitário
torch.sagemaker.delayed_param.DelayedParamIniter
Uma API para aplicação de Inicialização do parâmetro atrasada em um modelo PyTorch.
class torch.sagemaker.delayed_param.DelayedParamIniter( model: nn.Module, init_method_using_config : Callable = None, verbose: bool = False, )
Parâmetros
-
model
(nn.Module
): um modelo PyTorch para envolver e aplicar a funcionalidade de inicialização atrasada de parâmetros do SMP v2. -
init_method_using_config
(chamável): se você usar a implementação de paralelismo de tensores do SMP v2 ou Modelos tipo transformador da Hugging Face compatíveis com o paralelismo de tensores no SMP compatível, mantenha esse parâmetro no valor padrão, que é deNone
. Por padrão, a APIDelayedParamIniter
descobre como inicializar o modelo fornecido corretamente. Para qualquer outro modelo, você precisa criar uma função de inicialização de parâmetros personalizada e adicioná-la ao script. O trecho de código a seguir é a funçãoinit_method_using_config
padrão que o SMP v2 implementou para o Modelos tipo transformador da Hugging Face compatíveis com o paralelismo de tensores no SMP. Use o seguinte trecho de código como referência para criar sua própria função de configuração de inicialização, adicioná-la ao script e passá-la para o parâmetroinit_method_using_config
da APIDelayedParamIniter
do SMP:from torch.sagemaker.utils.module_utils import empty_module_params, move_buffers_to_device # Define a custom init config function. def
custom_init_method_using_config
(module): d = torch.cuda.current_device() empty_module_params(module, device=d) if isinstance(module, (nn.Linear, Conv1D)): module.weight.data.normal_(mean=0.0, std=config.initializer_range) if module.bias is not None: module.bias.data.zero_() elif isinstance(module, nn.Embedding): module.weight.data.normal_(mean=0.0, std=config.initializer_range) if module.padding_idx is not None: module.weight.data[module.padding_idx].zero_() elif isinstance(module, nn.LayerNorm): module.weight.data.fill_(1.0) module.bias.data.zero_() elif isinstance(module, LlamaRMSNorm): module.weight.data.fill_(1.0) move_buffers_to_device(module, device=d) delayed_initer = DelayedParamIniter(model, init_method_using_config=custom_init_method_using_config
)Para obter mais informações sobre as funções
torch.sagemaker.module_util
no trecho de código anterior, consulte torch.sagemaker funções e propriedades do utilitário. -
verbose
(booleano): se for necessário ativar um registro mais detalhado durante a inicialização e a validação. O valor padrão éFalse
.
Métodos
-
get_param_init_fn()
: retorna à função de inicialização do parâmetro que você pode passar para o argumentoparam_init_fn
da função wrapper do FSDP do PyTorch. -
get_post_param_init_fn()
: retorna à função de inicialização do parâmetro que você pode passar para o argumentopost_param_init_fn
da função wrapper do FSDP do PyTorch. Isso é necessário quando você iguala pesos no modelo. O modelo deve implementar o métodotie_weights
. Para obter mais informações, consulte as Notas sobre pesos iguais em Inicialização do parâmetro atrasada. -
count_num_params
(module: nn.Module, *args: Tuple[nn.Parameter]
): rastreia quantos parâmetros estão sendo inicializados pela função de inicialização de parâmetros. Isso ajuda a implementar o métodovalidate_params_and_buffers_inited
a seguir. Normalmente, não é necessário chamar essa função explicitamente, porque o métodovalidate_params_and_buffers_inited
chama implicitamente esse método no backend. -
validate_params_and_buffers_inited
(enabled: bool=True
): este é um gerenciador de contexto que ajuda a validar se o número de parâmetros inicializados corresponde ao número total de parâmetros no modelo. Ele também valida para que todos os parâmetros e buffers agora estejam em dispositivos de GPU, em vez de dispositivos meta. Isso aumentaAssertionErrors
, se essas condições não forem atendidas. Esse gerenciador de contexto é apenas opcional e não é necessário o usar para inicializar parâmetros.
torch.sagemaker.distributed.checkpoint.state_dict_saver.async_save
API de entrada para salvamento assíncrono. Use esse método para salvar um state_dict
de forma assíncrona em um checkpoint_id
definido.
def async_save( state_dict: STATE_DICT_TYPE, *, checkpoint_id: Union[str, os.PathLike, None] = None, storage_writer: Optional[StorageWriter] = None, planner: Optional[SavePlanner] = None, process_group: Optional[dist.ProcessGroup] = None, coordinator_rank: int = 0, queue : AsyncCallsQueue = None, sharded_strategy: Union[SaveShardedStrategy, Tuple[str, int], None] = None, wait_error_handling: bool = True, force_check_all_plans: bool = True, s3_region: Optional[str] = None, s3client_config: Optional[S3ClientConfig] = None ) -> None:
Parâmetros
-
state_dict
(dict): obrigatório. O dicionário de estado para salvar. -
checkpoint_id
(str): obrigatório. O caminho de armazenamento onde salvar os pontos de verificação. -
storage_writer
(StorageWriter): opcional. Uma instância doStorageWriter
, no PyTorch, para realizar operações de gravação. Se ela não for definida, será usada a configuração padrão do StorageWriter
. -
planner
(SavePlanner): opcional. Uma instância doSavePlanner
no PyTorch. Se ela não for definida, será usada a configuração padrão do SavePlanner
. -
process_group
(ProcessGroup): opcional. O grupo de processos no qual trabalhar. SeNone
, será usado o grupo de processos padrão (global). -
coordinator_rank
(int): opcional. A classificação do coordenador ao realizar operadores de comunicação coletiva, comoAllReduce
. -
queue
(AsyncRequestQueue): opcional. O programador assíncrono a ser usado. Por padrão, ele usa o parâmetro globalDEFAULT_ASYNC_REQUEST_QUEUE
. -
sharded_strategy
(PyTorchDistSaveShardedStrategy): opcional. A estratégia fragmentada a ser usada para salvar pontos de verificação. Se não for especificado,torch.sagemaker.distributed.checkpoint.state_dict_saver.PyTorchDistSaveShardedStrategy
é usado como padrão. -
wait_error_handling
(bool): opcional. Um sinalizador que especifica se deve esperar que todas as classificações concluam o tratamento de erros. O valor padrão éTrue
. -
force_check_all_plans
(bool): opcional. Um sinalizador que determina se os planos devem ser sincronizados à força em todos os níveis, mesmo no caso de uma falha no cache. O valor padrão éTrue
. -
s3_region
(str): opcional. A região em que o bucket do S3 está localizado. Se não for especificada, a região será inferida docheckpoint_id
. -
s3client_config
(S3ClientConfig): opcional. A classe de dados que expõe parâmetros configuráveis para o cliente S3. Se não for fornecida, será usada a configuração padrão do S3ClientConfig. O parâmetro part_size
é definido como 64 MB por padrão.
torch.sagemaker.distributed.checkpoint.state_dict_saver.maybe_finalize_async_calls
Essa função permite que um processo de treinamento monitore várias solicitações assíncronas a serem feitas.
def maybe_finalize_async_calls( blocking=True, process_group=None ) -> List[int]:
Parâmetros
-
blocking
(bool): opcional. SeTrue
, será esperado até que sejam concluídas todas as solicitações ativas. Caso contrário, ele finaliza somente as solicitações assíncronas que já foram concluídas. O valor padrão éTrue
. -
process_group
(ProcessGroup): opcional. O grupo de processos no qual operar. Se definido comoNone
, será utilizado o grupo de processos padrão (global).
Devoluções
-
Uma lista contendo os índices de chamadas assíncronas foi finalizada com sucesso.
torch.sagemaker.distributed.checkpoint.state_dict_saver.save
Use esse método para salvar um state_dict
de forma síncrona em um checkpoint_id
definido.
def save( state_dict: STATE_DICT_TYPE, *, checkpoint_id: Union[str, os.PathLike, None] = None, storage_writer: Optional[StorageWriter] = None, planner: Optional[SavePlanner] = None, process_group: Optional[dist.ProcessGroup] = None, coordinator_rank: int = 0, wait_error_handling: bool = True, force_check_all_plans: bool = True, s3_region: Optional[str] = None, s3client_config: Optional[S3ClientConfig] = None ) -> None:
Parâmetros
-
state_dict
(dict): obrigatório. O dicionário de estado para salvar. -
checkpoint_id
(str): obrigatório. O caminho de armazenamento onde salvar os pontos de verificação. -
storage_writer
(StorageWriter): opcional. Uma instância doStorageWriter
, no PyTorch, para realizar operações de gravação. Se ela não for definida, será usada a configuração padrão do StorageWriter
. -
planner
(SavePlanner): opcional. Uma instância doSavePlanner
no PyTorch. Se ela não for definida, será usada a configuração padrão do SavePlanner
. -
process_group
(ProcessGroup): opcional. O grupo de processos no qual trabalhar. SeNone
, será usado o grupo de processos padrão (global). -
coordinator_rank
(int): opcional. A classificação do coordenador ao realizar operadores de comunicação coletiva, comoAllReduce
. -
wait_error_handling
(bool): opcional. Um sinalizador que especifica se deve esperar que todas as classificações concluam o tratamento de erros. O valor padrão éTrue
. -
force_check_all_plans
(bool): opcional. Um sinalizador que determina se os planos devem ser sincronizados à força em todos os níveis, mesmo no caso de uma falha no cache. O valor padrão éTrue
. -
s3_region
(str): opcional. A região em que o bucket do S3 está localizado. Se não for especificada, a região será inferida docheckpoint_id
. -
s3client_config
(S3ClientConfig): opcional. A classe de dados que expõe parâmetros configuráveis para o cliente S3. Se não for fornecida, será usada a configuração padrão do S3ClientConfig. O parâmetro part_size
é definido como 64 MB por padrão.
torch.sagemaker.distributed.checkpoint.state_dict_loader.load
Carregue o dicionário de estado de um modelo distribuído (state_dict
).
def load( state_dict: Dict[str, Any], *, checkpoint_id: Union[str, os.PathLike, None] = None, storage_reader: Optional[StorageReader] = None, planner: Optional[LoadPlanner] = None, process_group: Optional[dist.ProcessGroup] = None, check_keys_matched: bool = True, coordinator_rank: int = 0, s3_region: Optional[str] = None, s3client_config: Optional[S3ClientConfig] = None ) -> None:
Parâmetros
-
state_dict
(dict): obrigatório. Ostate_dict
para carregar. -
checkpoint_id
(str): obrigatório. O ID de um ponto de verificação. O significado docheckpoint_id
depende do armazenamento. Pode ser um caminho para uma pasta ou para um arquivo. Também pode ser uma chave, se o armazenamento for um armazenamento de valores-chave. -
storage_reader
(StorageReader): opcional. Uma instância doStorageReader
, no PyTorch, para realizar operações de leitura. Se não for especificado, o ponto de verificação distribuído inferirá automaticamente o leitor com base no checkpoint_id
. Se ocheckpoint_id
também forNone
, será gerado um erro de exceção. -
planner
(StorageReader): opcional. Uma instância doLoadPlanner
no PyTorch. Se não for especificada, será usada a configuração padrão de LoadPlanner
. -
check_keys_matched
(bool): opcional. Se ativado, verifica se as chavesstate_dict
de todas as classificações são combinadas usandoAllGather
. -
s3_region
(str): opcional. A região em que o bucket do S3 está localizado. Se não for especificada, a região será inferida docheckpoint_id
. -
s3client_config
(S3ClientConfig): opcional. A classe de dados que expõe parâmetros configuráveis para o cliente S3. Se não for fornecida, será usada a configuração padrão do S3ClientConfig. O parâmetro part_size
é definido como 64 MB por padrão.
torch.sagemaker.moe.moe_config.MoEConfig
Uma função de configuração para configurar a implementação de Mixture of Experts (MoE) do SMP. Você pode especificar os valores de configuração da MoE por meio dessa função e passá-los para a chamada de API do torch.sagemaker.transform
. Para saber mais sobre o uso dessa função para treinar modelos da MoE, consulte Paralelismo especializado.
class torch.sagemaker.moe.moe_config.MoEConfig( smp_moe=True, random_seed=12345, moe_load_balancing="sinkhorn", global_token_shuffle=False, moe_all_to_all_dispatcher=True, moe_aux_loss_coeff=0.001, moe_z_loss_coeff=0.001 )
Parâmetros
-
smp_moe
(booleano): se deve usar a implementação do SMP da MoE. O valor padrão éTrue
. -
random_seed
(inteiro): um número inicial para as operações randomizadas em módulos distribuídos de paralelismo especializado. Esse número inicial é adicionado à classificação de paralelismo especializado para definir o número inicial real para cada classificação. É exclusivo para cada classificação de paralelismo especializado. O valor padrão é12345
. -
moe_load_balancing
(String): especifica o tipo de balanceador de carga do roteador da MoE. As opções válidas são:aux_loss
,sinkhorn
,balanced
enone
. O valor padrão ésinkhorn
. -
global_token_shuffle
(booleano): se os tokens devem ser misturados entre as classificações de EP dentro do mesmo grupo de EP. O valor padrão éFalse
. -
moe_all_to_all_dispatcher
(booleano): se deve usar o dispatcher completo para as comunicações na MoE. O valor padrão éTrue
. -
moe_aux_loss_coeff
(float): um coeficiente para perda de balanceador de carga auxiliar. O valor padrão é0.001
. -
moe_z_loss_coeff
(float): coeficiente de perda z. O valor padrão é0.001
.
torch.sagemaker.nn.attn.FlashSelfAttention
Uma API para usar FlashAttention com o SMP v2.
class torch.sagemaker.nn.attn.FlashSelfAttention( attention_dropout_prob: float = 0.0, scale: Optional[float] = None, triton_flash_attention: bool = False, use_alibi: bool = False, )
Parâmetros
-
attention_dropout_prob
(float): a probabilidade de dropout a ser aplicada à atenção. O valor padrão é0.0
. -
scale
(float): se aprovado, esse fator de escala é aplicado para softmax. Se definido comoNone
(que também é o valor padrão), o fator de escala é1 / sqrt(attention_head_size)
. O valor padrão éNone
. -
triton_flash_attention
(bool): se aprovada, é usada a implementação de atenção instantânea do Triton. Isso é necessário para apoiar a atenção com vieses lineares (ALiBi) (consulte o parâmetrouse_alibi
a seguir). Essa versão do kernel não é compatível com o dropout. O valor padrão éFalse
. -
use_alibi
(bool): se aprovado, ele ativa a atenção com vieses lineares (ALiBi) usando a máscara fornecida. Ao usar a ALiBi, ela precisa de uma máscara de atenção preparada da seguinte forma: O valor padrão éFalse
.def generate_alibi_attn_mask(attention_mask, batch_size, seq_length, num_attention_heads, alibi_bias_max=8): device, dtype = attention_mask.device, attention_mask.dtype alibi_attention_mask = torch.zeros( 1, num_attention_heads, 1, seq_length, dtype=dtype, device=device ) alibi_bias = torch.arange(1 - seq_length, 1, dtype=dtype, device=device).view( 1, 1, 1, seq_length ) m = torch.arange(1, num_attention_heads + 1, dtype=dtype, device=device) m.mul_(alibi_bias_max / num_attention_heads) alibi_bias = alibi_bias * (1.0 / (2 ** m.view(1, num_attention_heads, 1, 1))) alibi_attention_mask.add_(alibi_bias) alibi_attention_mask = alibi_attention_mask[..., :seq_length, :seq_length] if attention_mask is not None and attention_mask.bool().any(): alibi_attention_mask.masked_fill( attention_mask.bool().view(batch_size, 1, 1, seq_length), float("-inf") ) return alibi_attention_mask
Métodos
-
forward(self, qkv, attn_mask=None, causal=False, cast_dtype=None, layout="b h s d")
: uma função normal do módulo PyTorch. Quando omodule(x)
é chamado, o SMP executa essa função automaticamente.-
qkv
:torch.Tensor
da seguinte forma:(batch_size x seqlen x (3 x num_heads) x head_size)
ou(batch_size, (3 x num_heads) x seqlen x head_size)
, uma tupla detorch.Tensors
, cada uma podendo ter a forma(batch_size x seqlen x num_heads x head_size)
ou(batch_size x num_heads x seqlen x head_size)
. Um argumento de layout apropriado deve ser passado com base na forma. -
attn_mask
:torch.Tensor
da seguinte forma(batch_size x 1 x 1 x seqlen)
. Para ativar esse parâmetro de máscara de atenção, é necessáriotriton_flash_attention=True
euse_alibi=True
. Para saber como gerar uma máscara de atenção com esse método, consulte os exemplos de código em FlashAttention. O valor padrão éNone
. -
causal
: quando definido comoFalse
, que é o valor padrão do argumento, nenhuma máscara é aplicada. Quando definido comoTrue
, o métodoforward
usa a máscara triangular inferior padrão. O valor padrão éFalse
. -
cast_dtype
: quando configurado para um determinadodtype
, ele converte os tensoresqkv
para odtype
antes deattn
. É útil para implementações como o modelo Hugging Face Transformer GPT-NeoX, que temq
ek
comfp32
após as incorporações rotativas. Se definido comoNone
, nenhum molde será aplicado. O valor padrão éNone
. -
layout
(string): os valores disponíveis sãob h s d
oub s h d
. Deve ser definido para o layout dos tensoresqkv
passados, para que as transformações apropriadas possam ser aplicadas noattn
. O valor padrão éb h s d
.
-
Devoluções
Um único torch.Tensor
com a forma (batch_size x num_heads x
seq_len x head_size)
.
torch.sagemaker.nn.attn.FlashGroupedQueryAttention
Uma API para usar FlashGroupedQueryAttention
com o SMP v2. Para saber mais sobre o uso dessa API, consulte Use os kernels FlashAttention para atenção de consulta agrupada.
class torch.sagemaker.nn.attn.FlashGroupedQueryAttention( attention_dropout_prob: float = 0.0, scale: Optional[float] = None, )
Parâmetros
-
attention_dropout_prob
(float): a probabilidade de dropout a ser aplicada à atenção. O valor padrão é0.0
. -
scale
(float): se aprovado, esse fator de escala é aplicado para softmax. Se definido comoNone
, é usado1 / sqrt(attention_head_size)
como fator de escala. O valor padrão éNone
.
Métodos
-
forward(self, q, kv, causal=False, cast_dtype=None, layout="b s h d")
: uma função normal do módulo PyTorch. Quando omodule(x)
é chamado, o SMP executa essa função automaticamente.-
q
:torch.Tensor
da seguinte forma(batch_size x seqlen x num_heads x head_size)
ou(batch_size x num_heads x seqlen x head_size)
. Argumento de layout apropriado deve ser passado com base na forma. -
kv
:torch.Tensor
da seguinte forma:(batch_size x seqlen x (2 x num_heads) x head_size)
ou(batch_size, (2 x num_heads) x seqlen x head_size)
, ou uma tupla de doistorch.Tensor
, cada uma podendo ter a forma(batch_size x seqlen x num_heads x head_size)
ou(batch_size x num_heads x seqlen x head_size)
. O argumentolayout
apropriado deve ser passado com base na forma. -
causal
: quando definido comoFalse
, que é o valor padrão do argumento, nenhuma máscara é aplicada. Quando definido comoTrue
, o métodoforward
usa a máscara triangular inferior padrão. O valor padrão éFalse
. -
cast_dtype
: quando configurado para um determinado dtype, ele converte os tensoresqkv
para o dtype antes deattn
. É útil para implementações como o modelo Hugging Face Transformers GPT-NeoX, que temq,k
comfp32
após as incorporações rotativas. Se definido comoNone
, nenhum molde será aplicado. O valor padrão éNone
. -
layout (string): os valores disponíveis são
"b h s d"
ou"b s h d"
. Deve ser definido para o layout dos tensoresqkv
passados, para que as transformações apropriadas possam ser aplicadas noattn
. O valor padrão é"b h s d"
.
-
Devoluções
Retorna um único torch.Tensor (batch_size x num_heads x seq_len x
head_size)
, que representa a saída do cálculo da atenção.
torch.sagemaker.nn.huggingface.llama_flashattn.LlamaFlashAttention
Uma API que aceita FlashAttention para o modelo Llama. Essa API usa a API torch.sagemaker.nn.attn.FlashGroupedQueryAttention em baixo nível. Para saber como usá-la, consulte Use os kernels FlashAttention para atenção de consulta agrupada.
class torch.sagemaker.nn.huggingface.llama_flashattn.LlamaFlashAttention( config: LlamaConfig )
Parâmetros
-
config
: uma configuração FlashAttention para o modelo Llama.
Métodos
-
forward(self, hidden_states, attention_mask, position_ids, past_key_value, output_attentions, use_cache)
-
hidden_states
(torch.Tensor
): estados ocultos de um tensor na forma de(batch_size x seq_len x num_heads x head_size)
. -
attention_mask
(torch.LongTensor
): máscara para evitar executar a atenção no preenchimento de índices de tokens na forma de(batch_size x seqlen)
. O valor padrão éNone
. -
position_ids
(torch.LongTensor
): quando não estáNone
, está na forma de(batch_size x seqlen)
, indicando os índices das posições de cada token de sequência de entrada nas incorporações da posição. O valor padrão éNone
. -
past_key_value
(Cache): estados ocultos pré-computados (chave e valores nos blocos de autoatenção e nos blocos de atenção cruzada). O valor padrão éNone
. -
output_attentions
(bool): indica se devem ser retornados os tensores de atenção de todas as camadas de atenção. O valor padrão éFalse
. -
use_cache
(bool): indica se devem ser retornados os estados do valor chavepast_key_values
. O valor padrão éFalse
.
-
Devoluções
Retorna um único torch.Tensor (batch_size x num_heads x seq_len x
head_size)
, que representa a saída do cálculo da atenção.
torch.sagemaker.transform
O SMP v2 fornece essa API torch.sagemaker.transform()
para transformar modelos tipo transformador do Hugging Face em implementações de modelos de SMP e habilitar o paralelismo de tensores do SMP.
torch.sagemaker.transform( model: nn.Module, device: Optional[torch.device] = None, dtype: Optional[torch.dtype] = None, config: Optional[Dict] = None, load_state_dict_from_rank0: bool = False, cp_comm_type: str = "p2p" )
O SMP v2 mantém as políticas de transformação para o Modelos tipo transformador da Hugging Face compatíveis com o paralelismo de tensores no SMP, ao converter a configuração dos modelos Hugging Face Transformer na configuração do modelo tipo transformador do SMP.
Parâmetros
-
model
(torch.nn.Module
): um modelo de Modelos tipo transformador da Hugging Face compatíveis com o paralelismo de tensores no SMP para transformar e aplicar o atributo de paralelismo de tensores da biblioteca de SMP. -
device
(torch.device
): se aprovado, é criado um novo modelo neste dispositivo. Se o módulo original tiver algum parâmetro no dispositivo meta (consulte Inicialização do parâmetro atrasada), o módulo transformado também será criado no dispositivo meta, ignorando o argumento passado aqui. O valor padrão éNone
. -
dtype
(torch.dtype
): se aprovado, o define como o gerenciador de contexto dtype para a criação do modelo e cria um modelo com esse dtype. Normalmente, é desnecessário, pois queremos criar o modelo comfp32
ao usarMixedPrecision
, efp32
é o dtype padrão no PyTorch. O valor padrão éNone
. -
config
(dict): este é um dicionário para configurar o transformador do SMP. O valor padrão éNone
. -
load_state_dict_from_rank0
(booleano): por padrão, esse módulo cria uma nova instância do modelo com novos pesos. Quando esse argumento é definido comoTrue
, o SMP tenta carregar o dicionário de estado do modelo PyTorch original da 0ª classificação em um modelo tipo transformador para o grupo paralelo de tensores do qual a 0ª classificação faz parte. Quando definido comoTrue
, a 0ª classificação não pode ter nenhum parâmetro no dispositivo meta. Somente o primeiro grupo paralelo de tensores preenche os pesos da 0ª classificação após essa chamada de transformador. Você precisa definirsync_module_states
paraTrue
, no wrapper do FSDP, para obter esses pesos do primeiro grupo de paralelismo de tensores para todos os outros processos. Com essa ativação, a biblioteca de SMP carrega o dicionário de estado do modelo original. A biblioteca de SMP pega ostate_dict
do modelo antes da transformação, o converte para corresponder à estrutura do modelo tipo transformador, o fragmenta para cada classificação de paralelismo de tensores, comunica esse estado da 0ª classificação para outras classificações no grupo de paralelismo de tensores do qual a 0ª classificação faz parte e o carrega. O valor padrão éFalse
. cp_comm_type
(str): determina a implementação do paralelismo de contexto e é aplicável apenas quandocontext_parallel_degree
for maior que 1. Os valores disponíveis para esse parâmetro sãop2p
eall_gather
. A implementação dep2p
utiliza chamadas de envio e recebimento ponto a ponto para acúmulo de tensores de chave e valor (KV) durante o cálculo da atenção, funcionando de forma assíncrona e permitindo que a comunicação se sobreponha à computação. Por outro lado, a implementação deall_gather
utiliza a operação coletiva de comunicaçãoAllGather
para o acúmulo de tensores de KV. O valor padrão é"p2p"
.
Devoluções
Devolve um modelo tipo transformador que você pode envolver no FSDP do PyTorch. Quando load_state_dict_from_rank0
for definido como True
, o grupo de paralelismo de tensores que envolve a 0ª classificação tem pesos carregados do dicionário de estado original na 0ª classificação. Ao usar Inicialização do parâmetro atrasada no modelo original, somente essas classificações têm os tensores efetivos nas CPUs para os parâmetros e buffers do modelo tipo transformador. O restante das classificações continua com os parâmetros e buffers no dispositivo meta para economizar memória.
torch.sagemaker
funções e propriedades do utilitário
funções do utilitário torch.sagemaker
-
torch.sagemaker.init(config: Optional[Union[str, Dict[str, Any]]] = None) -> None
: inicializa o trabalho de treinamento do PyTorch com o SMP. -
torch.sagemaker.is_initialized() -> bool
: verifica se o trabalho de treinamento foi inicializado com o SMP. Ao retornar ao PyTorch nativo enquanto o trabalho é inicializado com o SMP, algumas propriedades não são relevantes e viramNone
, conforme indicado na lista de Propriedades a seguir. -
torch.sagemaker.utils.module_utils.empty_module_params(module: nn.Module, device: Optional[torch.device] = None, recurse: bool = False) -> nn.Module
: cria parâmetros vazios em um determinadodevice
, se houver, e pode ser recursivo para todos os módulos aninhados, se especificado. -
torch.sagemaker.utils.module_utils.move_buffers_to_device(module: nn.Module, device: torch.device, recurse: bool = False) -> nn.Module
: move os buffers do módulo para o determinadodevice
e pode ser recursivo para todos os módulos aninhados, se especificado.
Propriedades
torch.sagemaker.state
contém várias propriedades úteis após a inicialização do SMP com torch.sagemaker.init
.
-
torch.sagemaker.state.hybrid_shard_degree
(int): o grau de paralelismo de dados fragmentados, uma cópia da entrada do usuário na configuração do SMP passada paratorch.sagemaker.init()
. Para saber mais, consulte Utilize a biblioteca de paralelismo de modelos do SageMaker v2. -
torch.sagemaker.state.rank
(int): a classificação global do dispositivo, na faixa de[0, world_size)
. -
torch.sagemaker.state.rep_rank_process_group
(torch.distributed.ProcessGroup
): o grupo de processos que inclui todos os dispositivos com a mesma classificação de replicação. Observe a diferença sutil, porém fundamental, comtorch.sagemaker.state.tp_process_group
. Ao retornar ao PyTorch nativo, ele volta comoNone
. -
torch.sagemaker.state.tensor_parallel_degree
(int): o grau de paralelismo de tensores, uma cópia da entrada do usuário na configuração do SMP passada paratorch.sagemaker.init()
. Para saber mais, consulte Utilize a biblioteca de paralelismo de modelos do SageMaker v2. -
torch.sagemaker.state.tp_size
(int): um alias paratorch.sagemaker.state.tensor_parallel_degree
. -
torch.sagemaker.state.tp_rank
(int): a classificação do paralelismo do tensor para o dispositivo na faixa de[0, tp_size)
, determinada pelo grau do paralelismo de tensores e pelo mecanismo de classificação. -
torch.sagemaker.state.tp_process_group
(torch.distributed.ProcessGroup
): o grupo de processos de paralelismo de tensores, incluindo todos os dispositivos com a mesma classificação em outras dimensões (por exemplo, paralelismo e replicação de dados fragmentados), mas classificações de paralelismo de tensores exclusivos. Ao retornar ao PyTorch nativo, ele volta comoNone
. -
torch.sagemaker.state.world_size
(int): o número total de dispositivos usados no treinamento.
Atualização do SMP v1 para o SMP v2
Para migrar do SMP v1 para o SMP v2, você deve fazer alterações no script para remover as APIs do SMP v1 e inserir as APIs do SMP v2. Em vez de começar com o script SMP v1, recomendamos que comece com um script do FSDP do PyTorch e siga as instruções em Utilize a biblioteca de paralelismo de modelos do SageMaker v2.
Para trazer modelos do SMP v1 para o SMP v2, no SMP v1, você deve coletar o dicionário de estado do modelo completo e aplicar as funções de conversão no dicionário de estado do modelo para convertê-lo no formato de ponto de verificação do modelo Hugging Face Transformers. Em seguida, no SMP v2, conforme apresentado em Ponto de verificação com uso do SMP, você pode carregar os pontos de verificação do modelo Hugging Face Transformers e continuar usando as APIs de ponto de verificação do PyTorch com o SMP v2. Para usar o SMP com seu modelo de FSDP do PyTorch, certifique-se de migrar para o SMP v2 e fazer as alterações no script de treinamento para usar o FSDP do PyTorch e outros atributos mais recentes.
import smdistributed.modelparallel.torch as smp # Create model model = ... model = smp.DistributedModel(model) # Run training ... # Save v1 full checkpoint if smp.rdp_rank() == 0: model_dict = model.state_dict(gather_to_rank0=True) # save the full model # Get the corresponding translation function in smp v1 and translate if model_type == "gpt_neox": from smdistributed.modelparallel.torch.nn.huggingface.gptneox import translate_state_dict_to_hf_gptneox translated_state_dict = translate_state_dict_to_hf_gptneox(state_dict, max_seq_len=None) # Save the checkpoint checkpoint_path = "checkpoint.pt" if smp.rank() == 0: smp.save( {"model_state_dict": translated_state_dict}, checkpoint_path, partial=False, )
Para encontrar as funções de conversão disponíveis no SMP v1, consulte Ajuda para modelos tipo transformador Hugging Face.
Para obter instruções sobre como salvar e carregar pontos de verificação de modelos no SMP v2, consulte Ponto de verificação com uso do SMP.