修改 PyTorch Lightning 脚本 - Amazon SageMaker
Amazon Web Services 文档中描述的 Amazon Web Services 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅 中国的 Amazon Web Services 服务入门 (PDF)

修改 PyTorch Lightning 脚本

如果您想自带 PyTorch Lightning 训练脚本并在 SageMaker 中运行分布式数据并行训练作业,则只需对训练脚本进行极少更改即可运行训练作业。所需更改包括以下内容:导入 smdistributed.dataparallel 库的 PyTorch 模块,为 PyTorch Lightning 设置环境变量以接受 SageMaker 训练工具包预设的 SageMaker 环境变量,以及通过将流程组后端设置为 "smddp" 来激活 SageMaker 数据并行库。要了解详情,请仔细阅读以下分别介绍了各个步骤并提供代码示例的说明。

注意

SageMaker 数据并行库 v1.5.0 及更高版本中提供了对 PyTorch Lightning 的支持。

  1. 导入 pytorch_lightning 库和 smdistributed.dataparallel.torch 模块。

    import pytorch_lightning as pl import smdistributed.dataparallel.torch.torch_smddp
  2. 设置 LightningEnvironment 类对象的世界大小和秩。在 SageMaker 中启动训练作业时,SageMaker 训练工具包会设置环境变量 "RANK""LOCAL_RANK""WORLD_SIZE"。这些环境变量分别代表进程的全局秩、其局部秩和世界大小。使用这些 SageMaker 环境变量来配置 LightningEnvironment

    import os from pytorch_lightning.plugins.environments.lightning_environment \ import LightningEnvironment env = LightningEnvironment() env.world_size = lambda: int(os.environ["WORLD_SIZE"]) env.global_rank = lambda: int(os.environ["RANK"])
  3. 使用 PyTorch Lightning DDPStrategy 模块设置分布式训练策略,创建 PyTorch Lightning Trainer 对象,然后对其进行调整以使用 SageMaker 数据并行库

    (推荐)适用于 PyTorch Lightning v1.6.0 及更高版本

    创建 DDPStrategy 类的对象(以下代码示例中的 ddp),然后为 process_group_backend 参数指定 "smddp"。配置 PyTorch Lightning Trainer 对象时,请使用 SageMaker 环境变量指定 GPU 集群的规模和用于设置分布式训练策略的 ddp 对象。

    注意

    我们建议您在支持的框架和 Amazon Web Services 区域页面中查看经过测试与 SageMaker 数据并行库兼容的 PyTorch Lightning 版本。

    from pytorch_lightning.strategies import DDPStrategy ddp = DDPStrategy( cluster_environment=env, process_group_backend="smddp", accelerator="gpu" ) world_size = int(os.environ["WORLD_SIZE"]) num_gpus = int(os.environ["SM_NUM_GPUS"]) num_nodes = int(world_size/num_gpus) trainer = pl.Trainer( devices=num_gpus, num_nodes=num_nodes, max_epochs=10, strategy=ddp )

    (可选)适用于 PyTorch Lightning v1.5.10

    如果您使用已弃用的功能 DDPPlugin,请设置分布式策略,如以下代码示例所示。

    from pytorch_lightning.plugins.training_type.ddp import DDPPlugin os.environ["PL_TORCH_DISTRIBUTED_BACKEND"] = "smddp" ddp = DDPPlugin( parallel_devices=[torch.device("cuda", d) for d in range(num_gpus)], cluster_environment=env ) world_size = int(os.environ["WORLD_SIZE"]) num_gpus = int(os.environ["SM_NUM_GPUS"]) num_nodes = int(world_size/num_gpus) trainer = pl.Trainer( gpus=num_gpus, num_nodes=num_nodes, max_epochs=10, strategy=ddp )
  4. 运行 trainer.fit 以启动 PyTorch 模型的训练作业。以下代码示例显示了通过 PyTorch Lightning Trainer 的拟合方法和 PyTorch Lightning MNIST 数据模块包装的 PyTorch 模型对象。

    from pl_bolts.datamodules import MNISTDataModule trainer.fit(model, datamodule=MNISTDataModule(batch_size=32))

调整完训练脚本后,继续到 步骤 2:使用 SageMaker Python SDK 启动 SageMaker 分布式训练作业

注意

当您在步骤 2 中构造 SageMaker PyTorch 估算器并提交训练作业请求时,您需要在 SageMaker PyTorch 训练容器中提供 requirements.txt 以安装 pytorch-lightninglightning-bolts

# requirements.txt pytorch-lightning lightning-bolts

有关指定放置 requirements.txt 文件以及训练脚本和作业提交的源目录的更多信息,请参阅 Amazon SageMaker Python SDK 文档中的使用第三方库