Solução de problemas de paralelismo do modelo - Amazon SageMaker

As traduções são geradas por tradução automática. Em caso de conflito entre o conteúdo da tradução e da versão original em inglês, a versão em inglês prevalecerá.

Solução de problemas de paralelismo do modelo

Se você encontrar um erro, você pode usar a listagem a seguir para tentar solucionar o problema do seu trabalho de treinamento. Se o problema persistir, entre em contato com o suporte da AWS.

Considerações sobre o uso do SageMaker Debugger com a Model Parallelism Library SageMaker

SageMaker O depurador não está disponível para a biblioteca de paralelismo de SageMaker modelos. O depurador está habilitado por padrão para todos os trabalhos SageMaker TensorFlow e trabalhos de PyTorch treinamento, e você pode ver um erro parecido com o seguinte:

FileNotFoundError: [Errno 2] No such file or directory: '/opt/ml/checkpoints/metadata.json.sagemaker-uploading

Para corrigir esse problema, desabilite o Depurador passando o debugger_hook_config=False ao criar um framework estimator, conforme mostrado no exemplo a seguir.

bucket=sagemaker.Session().default_bucket() base_job_name="sagemaker-checkpoint-test" checkpoint_in_bucket="checkpoints" # The S3 URI to store the checkpoints checkpoint_s3_bucket="s3://{}/{}/{}".format(bucket, base_job_name, checkpoint_in_bucket) estimator = TensorFlow( ... distribution={"smdistributed": {"modelparallel": { "enabled": True }}}, checkpoint_s3_uri=checkpoint_s3_bucket, checkpoint_local_path="/opt/ml/checkpoints", debugger_hook_config=False )

Salvando pontos de verificação

Você pode encontrar o seguinte erro ao salvar pontos de verificação de um modelo grande em SageMaker:

InternalServerError: We encountered an internal error. Please try again

Isso pode ser causado por uma SageMaker limitação durante o upload do ponto de verificação local para o Amazon S3 durante o treinamento. Para desativar o ponto de verificação SageMaker, use o exemplo a seguir para fazer o upload explícito dos pontos de verificação.

Se você se deparar com o erro anterior, não use checkpoint_s3_uri com a SageMaker estimator chamada. Ao salvar pontos de verificação para modelos maiores, recomendamos salvar os pontos de verificação em um diretório personalizado e passá-los para a função auxiliar (como um argumento local_path).

import os def aws_s3_sync(source, destination): """aws s3 sync in quiet mode and time profile""" import time, subprocess cmd = ["aws", "s3", "sync", "--quiet", source, destination] print(f"Syncing files from {source} to {destination}") start_time = time.time() p = subprocess.Popen(cmd, stdout=subprocess.PIPE, stderr=subprocess.PIPE) p.wait() end_time = time.time() print("Time Taken to Sync: ", (end_time-start_time)) return def sync_local_checkpoints_to_s3(local_path="/opt/ml/checkpoints", s3_uri=os.path.dirname(os.path.dirname(os.getenv('SM_MODULE_DIR', '')))+'/checkpoints'): """ sample function to sync checkpoints from local path to s3 """ import boto3 #check if local path exists if not os.path.exists(local_path): raise RuntimeError("Provided local path {local_path} does not exist. Please check") #check if s3 bucket exists s3 = boto3.resource('s3') if not s3_uri.startswith("s3://"): raise ValueError(f"Provided s3 uri {s3_uri} is not valid.") s3_bucket = s3_uri.replace('s3://','').split('/')[0] print(f"S3 Bucket: {s3_bucket}") try: s3.meta.client.head_bucket(Bucket=s3_bucket) except Exception as e: raise e aws_s3_sync(local_path, s3_uri) return def sync_s3_checkpoints_to_local(local_path="/opt/ml/checkpoints", s3_uri=os.path.dirname(os.path.dirname(os.getenv('SM_MODULE_DIR', '')))+'/checkpoints'): """ sample function to sync checkpoints from s3 to local path """ import boto3 #try to create local path if it does not exist if not os.path.exists(local_path): print(f"Provided local path {local_path} does not exist. Creating...") try: os.makedirs(local_path) except Exception as e: raise RuntimeError(f"Failed to create {local_path}") #check if s3 bucket exists s3 = boto3.resource('s3') if not s3_uri.startswith("s3://"): raise ValueError(f"Provided s3 uri {s3_uri} is not valid.") s3_bucket = s3_uri.replace('s3://','').split('/')[0] print(f"S3 Bucket: {s3_bucket}") try: s3.meta.client.head_bucket(Bucket=s3_bucket) except Exception as e: raise e aws_s3_sync(s3_uri, local_path) return

Uso de funções auxiliares:

#base_s3_uri - user input s3 uri or save to model directory (default) #curr_host - to save checkpoints of current host #iteration - current step/epoch during which checkpoint is saved # save checkpoints on every node using local_rank if smp.local_rank() == 0: base_s3_uri = os.path.dirname(os.path.dirname(os.getenv('SM_MODULE_DIR', ''))) curr_host = os.environ['SM_CURRENT_HOST'] full_s3_uri = f'{base_s3_uri}/checkpoints/{curr_host}/{iteration}' sync_local_checkpoints_to_s3(local_path=checkpoint_dir, s3_uri=full_s3_uri)

Convergência usando modelos paralelos e TensorFlow

Quando você usa o treinamento de SageMaker vários nós TensorFlow e a biblioteca de paralelismo do modelo, a perda pode não convergir conforme o esperado, pois a ordem dos arquivos de entrada de treinamento pode ser diferente em cada nó. Isso pode fazer com que diferentes classificações no mesmo grupo de paralelismo do modelo funcionem em arquivos de entrada diferentes, causando inconsistências. Para evitar isso, certifique-se de que os arquivos de entrada sejam ordenados da mesma forma em todas as classificações antes de serem convertidos em TensorFlow conjuntos de dados. Uma maneira de fazer isso é classificar os nomes dos arquivos de entrada no script de treinamento.

Trabalhos de treinamento distribuídos parados ou com falhas

Se seu trabalho de treinamento apresentar problemas de parada, falhas ou problemas de resposta, leia os itens de solução de problemas a seguir para identificar a causa do problema. Se precisar de mais suporte, entre em contato com a equipe de treinamento SageMaker distribuída por meio do AWS Support.

  • Se você observar a paralisação de um trabalho de treinamento distribuído na etapa de inicialização da NCCL, considere o seguinte:

    • Se você estiver usando uma das instâncias habilitadas para EFA (instâncias ml.p4d ou ml.p3dn) com uma VPC personalizada e sua sub-rede, certifique-se de que o grupo de segurança usado tenha conexões de entrada e saída para todas as portas de e para o mesmo SG. Geralmente, você também precisa de conexões de saída para qualquer IP como uma regra separada (para acesso à Internet). Para ver instruções sobre como adicionar regras de entrada e saída para comunicação EFA, consulte SageMaker paralisação do trabalho de treinamento distribuído durante a inicialização.

  • Se você observar a paralisação de um trabalho de treinamento distribuído ao verificar pontos de verificação no modelo completo, isso pode ocorrer porque a chamada state_dict() no modelo ou no otimizador não foi feita em todas as classificações com rdp_rank()==0 (ao usar o paralelismo de tensor) ou dp_rank()==0 (ao usar apenas o paralelismo de pipeline). Essas classificações precisam se comunicar para construir o ponto de verificação a ser salvo. Problemas de paralisação semelhantes também podem ocorrer quando o otimizador parcial de ponto de verificação shard_optimizer_state está ativado.

    Para obter mais informações sobre como definir pontos de verificação do paralelismo de um modelo, consulte Instruções gerais para salvar e carregar e Apontando um PyTorch modelo distribuído (para a biblioteca de paralelismo de SageMaker modelos entre v1.6.0 e v1.9.0).

  • Se o trabalho de treinamento falhar com um erro de memória CUDA, isso significa que a configuração de treinamento distribuída precisa ser ajustada para se adequar ao modelo no cluster da GPU. Para obter mais informações e práticas recomendadas, consulte Configuração correta para um determinado modelo.

  • Se o trabalho de treinamento falhar com um erro ECC incorrigível, isso significa que uma das GPUs do cluster está com defeito. Se precisar de suporte técnico, compartilhe o ARN do trabalho com a equipe AWS e reinicie seu trabalho de treinamento a partir de um ponto de verificação, se possível.

  • Em casos raros, uma configuração do trabalho que funcionou anteriormente, mas está próxima dos limites da memória da GPU, pode falhar posteriormente com um cluster diferente devido a um erro de memória do CUDA. Isso pode ocorrer porque algumas GPUs têm menos memória disponível do que o normal devido a erros de ECC.

  • Pode ocorrer uma falha no tempo limite da rede ao executar uma tarefa de multinós que não usa todas as GPUs do nó. Para contornar isso, use todas as GPUs no nó, garantindo que o parâmetro processes_per_host seja definido como o número de GPUs em cada instância. Por exemplo, isso é processes_per_host=8 para instâncias ml.p3.16xlarge, ml.p3dn.24xlarge, e ml.p4d.24xlarge.

  • Se você achar que seu trabalho de treinamento leva muito tempo durante a fase de download de dados, certifique-se de que o caminho do Amazon S3 que você forneceu checkpoint_s3_uri para a SageMaker Estimator aula seja exclusivo para o trabalho de treinamento atual. Se esse caminho for reutilizado em vários trabalhos de treinamento executados simultaneamente, todos esses pontos de verificação serão carregados e baixados para o mesmo caminho do Amazon S3 e poderão aumentar significativamente o tempo de carregamento do ponto de verificação.

  • Use o FSx for Lustre ao lidar com dados e modelos grandes.

    • Se seu conjunto de dados for grande e sua busca levar muito tempo, recomendamos manter seu conjunto de dados no FSx for Lustre.

    • Quando os modelos de treinamento tiverem mais do que 10 bilhões de parâmetros, recomendamos o uso do FSx for Lustre para pontos de verificação.

    • Depois de criar um sistema de arquivos, aguarde até que o status fique disponível antes de iniciar um trabalho de treinamento com ele.

Recebendo erro NCCL para um PyTorch Training Job

Se você encontrou o erro a seguir, ele pode ser devido à uma execução de processamento que está ficando sem memória da GPU.

NCCL error in: ../torch/lib/c10d/ProcessGroupNCCL.cpp:825, unhandled system error, NCCL version 2.7.8 ncclSystemError: System call (socket, malloc, munmap, etc) failed.

Você pode resolver isso reduzindo o tamanho do lote ou active_microbatches. Se o particionamento automático não estiver resultando em um particionamento bem balanceado, talvez seja necessário considerar o particionamento manual. Para ter mais informações, consulte Paralelismo de pipeline entre os nós.

Recebendo RecursionError para um PyTorch Training Job

A biblioteca não suporta chamadas super.forward() dentro da chamada de avanço de um módulo. Se você usa o super.forward(), você poderá receber a seguinte mensagem de erro:

RecursionError: maximum recursion depth exceeded

Para corrigir o erro, em vez de chamar super.forward(), você deve chamar super()._orig_forward().