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

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

并行排查的问题

如果你遇到错误,你可以使用下面的列表来尝试对你的训练作业进行故障排除。如果问题仍然存在,请联系Su Amazonpport 点数

在 SageMaker 模型并行度库中使用 SageMaker调试器的注意事项

SageMaker 调试器不适用于 SageMaker 模型并行度库。默认情况下,所有任务 SageMaker TensorFlow 和 PyTorch 训练作业均启用调试器,您可能会看到如下所示的错误:

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

要修复此问题,请在创建框架debugger_hook_config=False时顺便禁用调试器estimator,如以下示例所示。

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 )

保存检查点数

在保存大型模型的检查点时可能会遇到以下错误 SageMaker:

InternalServerError: We encountered an internal error. Please try again

这可能是由于训练期间将本地检查点上传到 Amazon S3 时出现 SageMaker 限制所致。要禁用检查点 SageMaker,请使用以下示例明确上传检查点。

如果您遇到上述错误,请勿在 SageMaker estimatorcheckpoint_s3_uri用中使用。在为大型模型保存检查点时,我们建议将检查点保存到自定义目录并将其传递给帮助函数(作为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

辅助函数的用法:

#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)

使用模型并行和进行收敛 TensorFlow

当您使用 TensorFlow 和模型并行度库的 SageMaker 多节点训练时,损失可能无法按预期收敛,因为每个节点上训练输入文件的顺序可能不同。这可能会导致同一模型parallel 组中的不同等级处理不同的输入文件,从而导致不一致。为防止出现这种情况,请确保在将输入文件转换为 TensorFlow 数据集之前,所有等级的排序方式都相同。实现此目的的一种方法是在训练脚本中对输入文件名进行排序。

使分布式训练作业停顿或崩溃

如果您的训练作业存在停顿、崩溃或无法响应的问题,请阅读以下故障排除项目以确定问题的原因。如果您需要任何进一步的Support,请通过Amazon支持联系 SageMaker 分布式培训团队。

  • 如果您在 NCCL 初始化步骤看到分布式训练作业停滞,请考虑以下几点:

    • 如果您在自定义 VPC 及其子网中使用启用 EFA 的ml.p3dn实例(ml.p4d或实例),请确保使用的安全组具有与同一 SG 之间的所有端口的入站和出站连接。通常,您还需要将与任何 IP 的出站连接作为单独的规则(用于互联网访问)。要查找有关如何为 EFA 通信添加入站和出站规则的说明,请参阅SageMaker初始化期间分布式培训 Job 停滞

  • 如果您在检查完整模型时看到分布式训练作业停滞,这可能是因为并非所有等级都对模型或优化器进行state_dict()调用rdp_rank()==0(使用张量并行度时)或dp_rank()==0(仅使用流水线并行度时)。这些队伍需要进行沟通才能构造要保存的检查点。如果启用了 checkpointing 部分优化器,也会发生类似的停shard_optimizer_state机问题。

    有关使用模型并行度检查模型的更多信息,请参阅保存和加载的一般说明使用张量并行度进行检查的说明

  • 如果训练作业因出现 CUDA Out of Memory 错误而崩溃,这意味着需要调整分布式训练配置以适合 GPU 集群上的模型。有关更多信息和最佳实践,请参阅为给定模型设置正确的配置

  • 如果训练作业因不可纠正的 ECC 错误而崩溃,这意味着集群中的一个 GPU 已损坏。如果您需要技术支持,请与Amazon团队共享任务 ARN,并尽可能从检查点重新开始训练作业。

  • 在极少数情况下,由于出现 CUDA Out of Memory 错误,以前有效但接近 GPU 内存限制的任务配置可能会在以后使用不同的集群失败。这可能是因为由于 ECC 错误,某些 GPU 的可用内存比平时低。

  • 运行未使用节点中所有 GPU 的多节点作业时可能会发生@@ 网络超时崩溃。要解决这个问题,请确保将processes_per_host参数设置为每个实例中的 GPU 数量,从而使用节点上的所有 GPU。例如,这processes_per_host=8适用于ml.p3.16xlargeml.p3dn.24xlarge、和ml.p4d.24xlarge实例。

  • 如果您发现您的训练作业在数据下载阶段需要很长时间,请确保您checkpoint_s3_uri为该 SageMaker Estimator课程提供的 Amazon S3 路径是当前训练作业的唯一路径。如果在同时运行的多个训练作业中重复使用此路径,则所有这些检查点都会上传并下载到相同的 Amazon S3 路径,这可能会显著增加检查点加载时间。

  • 处理大型数据和模型时,使用 FsX for Lustre。

    • 如果您的数据集很大,提取需要很长时间,我们建议将您的数据集保留在 FsX for Lustre 中。

    • 当训练模型超过 100 亿个参数时,我们建议使用 FsX for Lustre 进行检查点。

    • 创建文件系统后,请务必等待状态变为可用,然后再开始使用该文件系统进行训练作业。

收到 PyTorch 训练Job 的 NCCL 错误

如果您遇到以下错误,则可能是由于进程耗尽 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.

您可以通过减小批量大小或来解决此问题active_microbatches。如果auto 分区无法实现良好的分区平衡,则可能需要考虑手动分区。有关更多信息,请参阅跨节点的流水线并行性

接受RecursionError PyTorch 培训Job

该库不支持在模块的前向调用super.forward()内部调用。如果您使用super.forward(),可能会收到以下错误消息。

RecursionError: maximum recursion depth exceeded

要修复错误,你应该打电话super.forward(),而不是打电话super()._orig_forward()