赞
踩
1.最大限度的继承PyTorch框架动态图的特性。
2.最大限度的继承原生PyTorch上的使用方式,能够使用户在移植时做到代码修改少等优点。
3.最大限度的继承PyTorch原生的体系结构,像pytorch的自动微分等功能都是保留了的。
4.扩展性好。对于新增的网络类型或结构,只需涉及相关计算类算子的开发和实现。框架类算子,反向图建立和实现机制等结构可保持复用。
1.Cube:
负责矩阵运算的单元,每次运算可以计算一个fp16(16位浮点数)的两个16*16矩阵乘。
2.Vector:
向量运算单元,可以运算多种计算类型,如fp32,int32等
3.Scalar:
Scalar,负责各类型的标量数据运算和程序的流程控制,功能上可以看做一个小CPU。
原始代码中,如果使用了DP(DataParallel):使用一个进程来进行参数计算,把每个批处理的数据分发到每个GPU,然后每个GPU计算各自的梯度,然后汇总到GPU0中进行求平均,由GPU0进行反向传播更新参数,然后再把模型的参数由GPU0传播给其他的GPU,GPU利用率通常很低。如下图:
那么需要把DP改为DDP进行使用。DDP(DistributedDataParallel):数据并行的分布式,是同时使用多个进程,每个GPU上一个进程,数据也是被进程数等分,相当于每个GPU上都跑了一份代码,前向之后再经过allreduce的处理,再经过梯度反向传播,更新参数。如下图:
由于NPU天然的混合精度的属性,需要使用apex对代码进行修改
eg:
model = model.cuda()
optimizer = torch.optim.SGD(model.parameters(), Ir=0.1)
#新增部分
model, optimizer =amp.initialize(model, optimizer,opt level="O2",loss_scale=128.0)
#把loss.backward()修改为
with ampscale loss(loss, optimizer) as scaled loss:
scaled loss.backward()
部分参数解释:
因为我们模型主要是在GPU上运行的,也就是cuda,而昇腾310是在的npu上运行的。因此,我们需要将设备由cuda(gpu)切换到npu,torch.cuda->torch.npu
eg:
#####转换前的原生代码
CALCULATE DEVICE = "cuda:0"
torch.cuda.set_device(CALCULATE DEVICE)
model = model.cuda()
#####转换后的代码
CALCULATE DEVICE = "npu:0"
torch.npu.set_device(CALCULATE DEVICE)
model = model.npu()
多卡迁移和单卡迁移的理念是一样的,都是从GPU(英伟达显卡)->NPU(华为昇腾)
因此,多卡主要是将backend(使用的通信库)参数
从
nccl(英伟达集合通信库NVIDIA Collective Communication Library)
转换成
hccl(华为集合通信库Huawei Collective Communication Library)
eg:
#转换前
dist.init_process_group(backend='nccl',init_method=“tcp://127.0.0.1:29688",world_size=args.world_size, rank=args.rank)
#转换后
dist.init_process_group(backend='hccl',init_method=“tcp://127.0.0.1:29688",world_size=args.world_size, rank=args.rank)
这里老师讲解了几个多卡启动的方式:
这里的高性能的启动模式用到了taskset命令
其用于在SMP场景下(一个计算机集成多个CPU)。
使用
yum install util-linux -y
命令可以安装此功能,其用法为:
语法格式:taskset [options] -p [mask] pid
参数选项:
-a, --all-tasks 操作所有的任务线程
-p, --pid 操作已存在的pid
-c, --cpu-list 通过列表显示方式设置CPU(逗号相隔)
-V, --version 输出版本信息
1.使用流同步打点
print(torch.npu.synchronize(),“打点”)
2.使用hook(网络拓扑)
使用hook对每个model上的每个module进行hook注册,看运行断在哪里
3.查看Host日志
note:
转换方式:
note:仅可以在pytorch1.8.1版本及以上使用。
只需要在训练脚本中引入代码库并且只需要增加一行:
import torch
import torch_npu
......
from torch_npu.contrib import transfer_to_npu
在https://gitee.com/ascend/ModelZoo-PyTorch
网址下可以获得昇腾的许多样例进行学习
ps:该文仅是为了记录CANN训练营的学习过程所用,不参与任何商业用途
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。