出售本站【域名】【外链】

首页 AI工具 AI视频 Ai智能平台 AI作图 AI知识 AI编程 AI资讯 AI语音 推荐

示例:创建DDP分布式训练(PyTorch+GPU)

2025-01-16

运用PyTorch预置框架罪能,通过mp.spawn号令启动

运用自界说镜像罪能

通过torch.distributed.launch号令启动

通过torch.distributed.run号令启动

创立训练做业

方式一:运用PyTorch预置框架罪能,通过mp.spawn号令启动训练做业。

创立训练做业的要害参数如所示。

表1 创立训练做业(预置框架)

参数称呼

注明


创立方式

 

选择“自界说算法”

 

启动方式

 

选择“预置框架”,引擎选择“PyTorch”,PyTorch版原依据训练要求选择。

 

代码目录

 

选择OBS桶中训练code文件夹所正在途径,譬喻“obs://test-modelarts/code/”

 

启动文件

 

选择代码目录中训练做业的Python启动脚原。譬喻“obs://test-modelarts/code/main.py”

 

超参

 

当资源规格为单机多卡时,须要指定超参world_size和rank。

当资源规格为多机时(即真例数大于 1),无需设置超参world_size和rank,超参会由平台主动注入。

 

方式二:运用自界说镜像罪能,通过torch.distributed.launch号令启动训练做业。

创立训练做业的要害参数如所示。

表2 创立训练做业(自界说镜像+torch.distributed.launch号令)

参数称呼

注明


创立方式

 

选择“自界说算法”

 

启动方式

 

选择“自界说”

 

镜像

 

选择用于训练的PyTorch镜像。

 

代码目录

 

选择OBS桶中训练code文件夹所正在途径,譬喻“obs://test-modelarts/code/”

 

启动号令

 

输入镜像的Python启动号令,譬喻:

bash ${MA_JOB_DIR}/code/torchlaunch.sh
 

方式三:运用自界说镜像罪能,通过torch.distributed.run号令启动训练做业。

创立训练做业的要害参数如所示。

表3 创立训练做业(自界说镜像+torch.distributed.run号令)

参数称呼

注明


创立方式

 

选择“自界说算法”

 

启动方式

 

选择“自界说”

 

镜像

 

选择用于训练的PyTorch镜像。

 

代码目录

 

选择OBS桶中训练code文件夹所正在途径,譬喻“obs://test-modelarts/code/”

 

启动号令

 

输入镜像的Python启动号令,譬喻:

bash ${MA_JOB_DIR}/code/torchrun.sh
 

代码示例

文件目录构造如下所示,将以下文件上传至OBS桶中:

code # 代码根目录 └─torch_ddp.py # PyTorch DDP训练代码文件 └─main.py # 运用PyTorch预置框架罪能,通过mp.spawn号令启动训练的启动文件 └─torchlaunch.sh # 运用自界说镜像罪能,通过torch.distributed.launch号令启动训练的启动文件 └─torchrun.sh # 运用自界说镜像罪能,通过torch.distributed.run号令启动训练的启动文件

torch_ddp.py内容如下:

import os import torch import torch.distributed as dist import torch.nn as nn import torch.optim as optim from torch.nn.parallel import DistributedDataParallel as DDP # 用于通过 mp.spawn 启动 def init_from_arg(local_rank, base_rank, world_size, init_method): rank = base_rank + local_rank dist.init_process_group("nccl", rank=rank, init_method=init_method, world_size=world_size) ddp_train(local_rank) # 用于通过 torch.distributed.launch 或 torch.distributed.run 启动 def init_from_enZZZ(): dist.init_process_group(backend='nccl', init_method='enZZZ://') local_rank=int(os.enZZZiron["LOCAL_RANK"]) ddp_train(local_rank) def cleanup(): dist.destroy_process_group() class ToyModel(nn.Module): def __init__(self): super(ToyModel, self).__init__() self.net1 = nn.Linear(10, 10) self.relu = nn.ReLU() self.net2 = nn.Linear(10, 5) def forward(self, V): return self.net2(self.relu(self.net1(V))) def ddp_train(deZZZice_id): # create model and moZZZe it to GPU with id rank model = ToyModel().to(deZZZice_id) ddp_model = DDP(model, deZZZice_ids=[deZZZice_id]) loss_fn = nn.MSELoss() optimizer = optim.SGD(ddp_model.parameters(), lr=0.001) optimizer.zero_grad() outputs = ddp_model(torch.randn(20, 10)) labels = torch.randn(20, 5).to(deZZZice_id) loss_fn(outputs, labels).backward() optimizer.step() cleanup() if __name__ == "__main__": init_from_enZZZ()

main.py内容如下:

import argparse import torch import torch.multiprocessing as mp parser = argparse.ArgumentParser(description='ddp demo args') parser.add_argument('--world_size', type=int, required=True) parser.add_argument('--rank', type=int, required=True) parser.add_argument('--init_method', type=str, required=True) args, unknown = parser.parse_known_args() if __name__ == "__main__": n_gpus = torch.cuda.deZZZice_count() world_size = n_gpus * args.world_size base_rank = n_gpus * args.rank # 挪用 DDP 示例代码中的启动函数 from torch_ddp import init_from_arg mp.spawn(init_from_arg, args=(base_rank, world_size, args.init_method), nprocs=n_gpus, join=True)

torchlaunch.sh内容如下: #!/bin/bash # 系统默许环境变质,不倡议批改 MASTER_HOST="$xC_WORKER_HOSTS" MASTER_ADDR="${xC_WORKER_HOSTS%%,*}" MASTER_PORT="6060" JOB_ID="1234" NNODES="$MA_NUM_HOSTS" NODE_RANK="$xC_TASK_INDEX" NGPUS_PER_NODE="$MA_NUM_GPUS" # 自界说环境变质,指定python脚原和参数 PYTHON_SCRIPT=${MA_JOB_DIR}/code/torch_ddp.py PYTHON_ARGS="" CMD="python -m torch.distributed.launch \ --nnodes=$NNODES \ --node_rank=$NODE_RANK \ --nproc_per_node=$NGPUS_PER_NODE \ --master_addr $MASTER_ADDR \ --master_port=$MASTER_PORT \ --use_enZZZ \ $PYTHON_SCRIPT \ $PYTHON_ARGS " echo $CMD $CMD

torchrun.sh内容如下:

PyTorch 2.1版原须要将“rdzZZZ_backend”参数设置为“static:--rdzZZZ_backend=static”

#!/bin/bash # 系统默许环境变质,不倡议批改 MASTER_HOST="$xC_WORKER_HOSTS" MASTER_ADDR="${xC_WORKER_HOSTS%%,*}" MASTER_PORT="6060" JOB_ID="1234" NNODES="$MA_NUM_HOSTS" NODE_RANK="$xC_TASK_INDEX" NGPUS_PER_NODE="$MA_NUM_GPUS" # 自界说环境变质,指定python脚原和参数 PYTHON_SCRIPT=${MA_JOB_DIR}/code/torch_ddp.py PYTHON_ARGS="" if [[ $NODE_RANK == 0 ]]; then EXT_ARGS="--rdzZZZ_conf=is_host=1" else EXT_ARGS="" fi CMD="python -m torch.distributed.run \ --nnodes=$NNODES \ --node_rank=$NODE_RANK \ $EXT_ARGS \ --nproc_per_node=$NGPUS_PER_NODE \ --rdzZZZ_id=$JOB_ID \ --rdzZZZ_backend=c10d \ --rdzZZZ_endpoint=$MASTER_ADDR:$MASTER_PORT \ $PYTHON_SCRIPT \ $PYTHON_ARGS " echo $CMD $CMD

热门文章

随机推荐

推荐文章

友情链接: 永康物流网 本站外链出售 义乌物流网 本网站域名出售 手机靓号-号码网 抖音视频制作 AI工具 旅游大全 影视动漫 算命星座 宠物之家 两性关系 学习教育