本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。
模型并行疑难解
如果遇到错误,可以使用以下列表尝试对训练作业进行故障排除。如果问题仍存在,请联系Amazon支持
将 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 中禁用检查点,请使用以下示例显式上传检查点。
如果遇到前面的错误,请不要使用checkpoint_s3_uri使用 SageMakerestimator调用。在为大型模型保存检查点时,我们建议将检查点保存到自定义目录中,然后将检查点传递给助手函数(作为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 进行收敛
当您将 SageMaker 多节点训练与 TensorFlow 和分布式模型并行使用时,由于每个节点上的训练输入文件的顺序可能不同,损失可能不如预期收敛。这可能会导致同一模型并行组中的不同排名处理不同的输入文件,从而导致不一致。为防止这种情况,请确保输入文件在转换为 TensorFlow 数据集之前在所有排列中都以相同的方式排序。实现这一目标的一种方法是对训练脚本中的输入文件名进行排序。
停顿或崩溃分布式培训工作
如果您的培训工作存在停滞、崩溃或没有响应问题,请阅读以下故障排除项目以确定问题的原因。如果您需要任何进一步的支持,请通过联系 SageMaker 分布式培训团队Amazon支持
-
如果你看到分布式培训作业在 NCCL 初始化步骤停滞,请考虑以下事项:
-
如果您使用的是其中一个启用了 EFA 的实例(
ml.p4d要么ml.p3dn实例)具有自定义 VPC 及其子网,请确保所使用的安全组具有往返于同一 SG 的所有端口的入站和出站连接。作为一项单独的规则(对于互联网访问),您通常还需要与任何 IP 的出站连接。要查找有关如何为 EFA 通信添加入站和出站规则的说明,请参阅SageMaker初始化期间分布式培训 Job 停滞.
-
-
如果你看到检查点时分布式培训作业停滞完整的模型,这可能是因为
state_dict()并非所有级别对模型或优化器进行调用rdp_rank()==0(使用张量并行时)或dp_rank()==0(当仅使用管道并行时)。这些队伍需要进行沟通才能构建要保存的检查点。当检查点部分优化程序时,也可能会发生类似的停滞问题shard_optimizer_state已启用。有关检查点具有模型并行性的模型的更多信息,请参阅保存和加载的一般说明
和使用 Tensor 并行度进行检查点的说明. -
如果培训工作因内存不足错误,这意味着需要调整分布式训练配置以适应 GPU 群集上的模型。有关更多信息和最佳实践,请参阅为给定模型设置正确的配置.
-
如果培训工作因不可纠正ECC 错误
,这意味着群集中的一个 GPU 已经坏了。如果你需要技术支持,请与Amazon如果可能的话,然后从检查点重新启动你的训练作业。 -
在极少数情况下,以前工作但接近 GPU 内存限制的作业配置可能会在以后因为内存不足错误. 这可能是因为由于 ECC 错误,某些 GPU 的可用内存低于平时。
-
网络超时崩溃当运行不使用节点中所有 GPU 的多节点作业时,可能会发生这种情况。要解决这个问题,请确保在节点上使用所有 GPU
processes_per_host参数设置为每个实例中 GPU 的数量。例如,这是processes_per_host=8为了ml.p3.16xlarge、ml.p3dn.24xlarge, 和ml.p4d.24xlarge实例。 -
如果您发现您的培训工作在数据下载阶段需要很长时间,请确保向其提供的 Amazon S3 路径
checkpoint_s3_uri对于 SageMakerEstimator课程对于当前的培训工作来说是唯一的。如果在同时运行的多个训练作业中重复使用此路径,则所有这些检查点都将上传并下载到同一个 Amazon S3 路径,这可能会显著增加检查点加载时间。 -
处理大型数据和模型时,使用 FSx for Lustre。
-
如果您的数据集很大且需要很长时间才能获取,我们建议将数据集保存在FSx for Lustre
. -
当训练模型超过 100 亿个参数时,我们建议使用 FSx for Lustre 进行检查点。
-
创建文件系统后,请确保等待状态变为可用然后才开始使用它的培训工作。
-
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. 如果自动分区不能导致均衡的分区,则可能需要考虑手动分区。有关更多信息,请参阅跨节点的管道并行性。