【2023 · CANN训练营第一季】新手笔记2
1.AscendCL接口支持的编程语言有C&C++、Python。
2.PyTorch框架在线对接昇腾AI处理器的适配方案的特性和优点:
最大程度的继承PyTorch框架动态图的特性
最大限度的继承原生PyTorch上的使用方法,用户迁移过程中在代码开发和代码重用时做到最小的改动
最大限度的继承PyTorch原生的体系结构
扩展性好。在打通流程的通路之上,对于新增的网络模型或结构,只需涉及相关计算类算子的开发与实现
3.apex的功能和特点:
[功能]opt_level: O1 [描述]精度模式,Conv, Matmul等使用float16计算,其他如Softmax、BN使用float32
[功能]opt_level: O2 [描述]性能模式,除了BN使用float32外,其他绝大部分使用float16
[功能]静态Loss Scale [描述]静态设置参数确保混合精度训练收敛
[功能]动态Loss Scale [描述]动态计算Loss Scale值并判断是否溢出
4. 当迁移出现报错时,查看底层日志是一种常见的DEBUG手段,可以通过设置环境变量ASCEND_GLOBAL_LOG_LEVEL的方式收集不同等级的日志。关于该变量取值与对应日志级别的关系:
0对应DEBUG级别
1对应INFO级别
2对应WARNING级别
3对应ERROR级别
5.使用手工方法进行PyTorch模型迁移时,由于NPU上的一些限制,PyTorch需要使用DistributedDataParallel(DDP),若原始代码使用的是DataParallel(DP)则需要修改为DDP。
6.关于模型迁移中单卡模型迁移代码的主要修改点举例:
[原生代码]CALCULATE_DEVICE = "cuda:0"
[NPU代码]CALCULATE_DEVICE = "npu:0"
[原生代码]model = model.cuda()
[NPU代码]model = model.npu()
[原生代码]torch.cuda.set_device(CALCULATE_DEVICE)
[NPU代码]torch.npu.set_device(CALCULATE_DEVICE)
7.手工迁移多卡场景下不同的启动方式会对训练性能造成影响,以下选项中性能最高的启动方式是:
for i in $(seq 0 8)
do
taskset -c 0-24 python3.7 xxx
done
8.使用脚本转换工具进行PyTorch模型迁移,脚本转换工具根据适配规则,对用户脚本给出修改建议并提升转换功能,大幅度提高了脚本迁移速度,降低开发者的工作量
9.安装PyTorch-Ascend(1.8)的前提条件有
需确保CMake >= 3.12.0, gcc >= 7.3.0
已完成CANN开发或运行环境的安装,确保相应OS依赖(如python, numpy等)已安装完成
用户直接在安装环境中进行编译
10.关于apex的功能:
[功能]opt_level: O1 [描述]精度模式,Conv, Matmul等使用float16计算,其他如Softmax、BN使用float32
[功能]opt_level: O2 [描述]性能模式,除了BN使用float32外,其他绝大部分使用float16
[功能]静态Loss Scale [描述]静态设置参数确保混合精度训练收敛
11.达芬奇架构中的计算单元:
Cube计算单元负责矩阵运算,每次执行可以完成一个fp16的16*16与16*16的矩阵乘
Vector计算单元负责执行向量运算,覆盖各种基本的计算类型
Scalar计算单元负责各类型的标量数据运算和程序的流程控制
12.PyTorch-Ascend(1.8)的安装步骤为:
安装依赖 pyyaml和wheel -> 安装官方torch包 -> 编译生成PyTorch插件的二进制安装包 -> 安装插件torch_npu包
13.PyTorch模型迁移有:
手工迁移、使用transfer_to_npu自动迁移、脚本转换工具迁移
14.AscendCL应用开发流程:
使用AscendCL接口开发应用时,必须先调用aclInit接口进行AscendCL初始化,否则可能会导致后续系统内部资源初始化出错,进而导致其它业务异常
模型推理场景下,必须要有适配昇腾AI处理器的om离线模型,可提前使用ATC工具将第三方框架的模型转换为om模型
模型推理场景下,加载模型,执行模型推理,推理结束后,需及时卸载模型
有初始化就有去初始化,在确定完成了AscendCL的所有调用之后,或者进程退出之前,需调用aclFinalize接口实现AscendCL去初始化
15.当模型迁移发生报错时,可以通过DEBUG手段进行错误排查:
由于PyTorch是异步执行框架,直接print可能无法准确定位到错误的地方,需使用流通步接口辅助打点
打点时可以使用print(torch.npu.synchronize(), "打点")
可以通过hook对model中的每个module对应注册上hook,看看运行到什么地方断了
可以通过详细的NPU底层报错日志来帮助定位问题
16.AscendCL知识点:
用户可以调用AscendCL提供的接口进行图片分类、目标识别等应用的开发
用户可以通过第三方框架调用AscendCL,以便使用昇腾AI处理器的计算能力
用户可以使用AscendCL封装实现第三方lib库,以便提供昇腾AI处理器的运行管理、资源管理等能力
用户可以使用AscendCL进行图开发并部署到昇腾AI处理器运行
17.模型迁移中单卡模型迁移代码的主要修改点有:
接口从cuda切换至npu
torch.cuda更改为torch.npu
18.apex是混合精度模块,由于NPU的天然混合精度属性,迁移后需要使能apex混合精度
model = model.cuda( )
optimizer = torch.optim.SGD(modle.parameters( ), lr=0.1)
model, optimizer = amp.initialize(model, optimizer, opt_level="O2", loss_scale=128.0)
- 点赞
- 收藏
- 关注作者
评论(0)