1 异构计算架构CANN
- Mindspore是华为自研开源的计算框架
CANN架构包括算子库、张良编译器、计算执行引擎、计算基础服务器等
1.1 AI异构计算架构CANN的定义
CANN是华为针对A场景推出的异构计算架构。通过提供多层次的编程接口,支持用户快速构建基于Ascend平台的AI应用和业务。
包含:
- 统一APP编程语言:提供一套标准的AscendCL编程接口,对应用程序开发者屏蔽底员多种芯片差异,提升用户APP编程易用性
- 统一网络构图接口:提供了松的界腾计算AIR。支持多框架,支持用户在昇腾芯片上快速部署神经网络业务
- 高性能计算引擎以及算子库:通过高性能编译引擎/执行引擎/调优引擎和预鲨高性能算子库,支撑客户快速部窑神经网络业务、降低部署成本并最大程度发挥昇腾计算能力
- 基础服务:驱动、虚报化、媒休、集合通信等能力
TF Adapter,是TensodFlow匪架与CANN软件找之间的活配层,帮勐TF训塔胖本慢康地迁移到NPU上
1.2 CANN AI模型开发流程
1.3 整体流程
- 迁移TF脚本到npu上的目的是利用npu的高性能计算能力,提升TF模型的训练和推理效率.
- 迁移TF脚本到npu上的前提是安装了Ascend Al Software Stack(ALS),包括Ascend Base Software(ABS)。提升工具包、升级运行时等组件。
- 迁移TF脚本到npu上的步骤主要分为以下几个方面:
- 准备环境:配置环境变量,安装依赖包,检查硬件连接等.
- 调整代码:根据npu的特性和限制,修改tf脚本中睽数据类型、数据格式、运算符、优化器等内容.
2 tf模型开发第一步:环境搭建
2.1 申请环境
选择华北-北京四、按需计费、随机分配、X86、AI加速型、ai1s
2.2 用户登录
密码是: HwHiAiUser
3 手动与自动迁移
总体流程:
3.1 组件交互流程
- 用户执行训练代码后,TensorFlow前端生成训练模型并初始化权重
- TensorFlow 前端通过TF Adapter调用GE初始化接口,完成设备打开、计算引擎初始化等操作
- TensorFlow 前端将训练模型转换为IR格式,并启动模型编译和执行
- GE完成图优化、算子拆分、子图编译等操作
- GE调用Runtime接口分配运行资源,并交由Runtime管理
3.2 自动迁移
通过迁移工具对原始脚本进行AST语法树扫描,可自动分析原生的TensorFlow API在异腾Al处理器上的支持度,并将原始的TensorFlow训练脚本自动迁移成异腾AI处理器支持的脚本,对于无法自动迁移的APl,可以参考工具输出的迁移报告,对训练脚本进行相应的适配修改。
【使用限制】
1.要求原始脚本在GPU/CPU上跑通,精度收敛。
2.要求原始脚本仅使用TensorFlow 1.15官方APl和Horovod官方API,若用户
脚本使用了其他第三方API,当前工具暂不支持迁移。
例如:
- 不支持原生Keras APl,但由于Tensorflow官方API中包括了
Tensorflow的Keras API,因此支持Tensorflow的Keras APl。 - 不支持CuPy APl,即便原始脚本能在GPU上遗行成功,但不能保证在
原始脚本中的TensorFlow模块和Horovod模块最好按照如下方式引用,否则工具迁移后,无法生成准确的迁移报告(但并不影响脚本迁移)。
!!!可记下来
import tensorflow as tf
import tensorflow.compatv1 as tf
import horovod.tensorflow as hvd
- 当前版本不支持float64/complex64/complex128/DT_VARIANT数据类型。
- 当前不支持tf.keras和原生Keras的Loss Scale功能迁移。
- 当前不支持动态shape网络迁移。
具体步骤:
3.2.1 安装依赖
pip3 install pandas
pip3 install xlrd==1.2.0
pip3 install openpyxl
pip3 install tkintertable
pip3 install google_pasta
3.2.2 训练脚本扫描和自动迁移
该工具支持在Linux或Windows环境进行脚本迁移。
Linux环境操作步骤;
进入迁移工具所在目录,例如“tfplugin安装目录/tfplugin/latest/python/site-
packages/npu_bridge/convert_tf2npur”,执行命令可同时完成脚本扫描和自动迁移,
例如:
python3 main.py -i /root/models/official/resnet
https://gitee.com/ascend/tensorflow/tree/master/convert_tf2npu
3.3手动迁移
算法工程师需要人工分析TensorFlow训练脚本中的APl支持度情况,并且参照文档逐一手工修改不支持的API,以便在异腾Al处理器上训练,该种方式较为复杂,我们建议大家优先使用自动迁移方式。
手工迁移点包含:
1、导入NPU库文件
2、将部分TensorFlow接口迁移成NPU接位
3、通过配置关闭TensorFlow与NPU冲突的功能
4、配置NPU相关参数
3.3.1 手工迁移Estimator
使用Estimator进行训练脚本开发的流程为:
- 数据预处理,创建输入函数input_fn。模型构建,构建模型函数model_fn。
- 运行配置,实例化Estimator,并传入Runconfig类对象作为运行参数。
- 执行训练,在Estimator上调用训练方法Estimator.train何,利用指定输入对模型进行固定步数的训练。
数据预处理
1、头文件增加
from npu_bridge.npu_init import *
2、数据预处理
dataset = dataset.batch(batch_size,drop_remainder=True)
assert num_written_lines ==num_actual_predict_examples
3、如果存在tf.nn.dropout,建议修改为
layers = npu_ops.dropout()
4、如果存在tf.layers.dropout/tf.layers.Dropout/tf.keras.layers.Dropout/tf.keras.layers.SpatialDropout1D/tf.keras.layers.SpatialDropout2D/tf.keras.layers.SpatialDropout3D,建议增加头文件引用:
from npu_bridge.estimator.npu import npu_convert_dropout
5、对于原始网络中的gelu,建议替换为CANN对应的API实现,以获得更优性能。
layers = npu_unary_ops.gelu(x)
6、
mnist_classifier=NPUEstimator(
model_fn=cnn_model_fn,
config=npu_config,
model_dir="/tmp/mnist_convnet_model"
)
3.3.2 手工迁移Estimator
- CPU上
#构造迭代器
iterator=lterator.from_structure(train_dataset.output_types,train_dataset.output_shapes)
#取batch数据
next_batch=iterator.get_next0
- NPU上
#构造迭代器
iterator=lterator.from_structure(train_dataset.output_types,train_dataset.output_shapes)
#取batch数据
next_batch=iterator.get_next0
#迭代器初始化
training_init_op=iterator.make_initializer(train_dataset)
3.3.3 手工迁移keras
import tensorflow as tf
import tensorflow.python.keras as keras
from tensorflow.python.keras import backend as Kfrom npu_bridge.npu_init import *
引入相关头文件
import tensorflow as tf
import tensorflow.python.keras as keras
from tensorflow.python.keras import backend as Kfrom npu_bridge.npu_init import *