【ONNX】20250219 日志 - Tensorflow模型适配昇腾
checkpoint 转为 savemodel 的过程中也是存在一些小问题的,tensorflow2中存在延迟构建,在读取 checkpoint 前需进行显示构建(手动调用 build 或者执行一次推理),否则下面的代码会打印为空,无法进行节点之间映射。使用模型训练的同事提供的Tensorflow模型代码,将 checkpoint 中的权重重新读入,将其保存为savemodel格式,再使用 tf2
背景
存在多个模型,分别由Tensorflow1、Tensorflow2编写,分别保存为pb、ckpt格式
pb中既保存了模型权重也保存了模型结构,checkpoint中仅保存了模型权重
都需适配昇腾机器
tensorflow1 转 onnx:tf2onnx (不推荐)
最开始所有的转 onnx 操作都打算使用 tf2onnx 工具,转为 onnx 格式这个过程中本身并不会进行过多优化,所有打算采用这种简单的方法
pb文件中既包含权重也包含模型结构,是支持直接转 onnx 的。但是由于模型比较复杂(保存了大量的数据增强的操作,switch参数也被大量保留(用于指定是推理还是训练))
使用 Netron 观察,虽然导出了 onnx,但是出现了各个节点之间并没有连接的奇怪情况。check Tensorflow1 和 onnx 推理,是正常的,但是由于 onnx 内结构存在问题,无法正常适配昇腾
博主认为可能是 tf.placehold 等一些老的操作在 ONNX 中没有直接的等效节点,尝试了各种方式依然没有解决,实在是不推荐复杂的 Tensorflow1 模型使用这种方案
tensorflow1 转 onnx:tensorflow1->pytorch->onnx (推荐)
根据模型训练的同事提供的Tensorflow模型代码,编写Pytorch模型代码,将pb文件中的权重、偏置等信息读入Pytorch模型中
注意:节点名需做好映射,在编写Pytorch代码时最好采用同名;编写Pytorch代码时,可删减部分参数和模型层,如 switch、BatchNormalization层等,因为该Pytorch代码仅用于导出onnx模型而非训练模型
注意调整shape,
- HWC:
(Height, Width, Channel),常见于 OpenCV 和 TensorFlow - CHW:
(Channel, Height, Width),常见于 PyTorch
pytorch 模型就可以很方便的导出onnx了
tensorflow2 转 onnx:ckpt->savemodel->onnx
checkpoint文件中并没有模型结构信息,无法使用 tf2onnx 将其转换
使用模型训练的同事提供的Tensorflow模型代码,将 checkpoint 中的权重重新读入,将其保存为savemodel格式,再使用 tf2onnx 将其转为 onnx 即可
checkpoint 转为 savemodel 的过程中也是存在一些小问题的,tensorflow2中存在延迟构建,在读取 checkpoint 前需进行显示构建(手动调用 build 或者执行一次推理),否则下面的代码会打印为空,无法进行节点之间映射
for var in model.trainable_variables:
print(f"Trainable variable: {var.name}")
for var in model.non_trainable_variables:
print(f"Non-trainable variable: {var.name}")
onnx 转 mindir
使用 MindSpore 提供的 converter_lite 工具即可,使用参考官网文档
昇腾计算产业是基于昇腾系列(HUAWEI Ascend)处理器和基础软件构建的全栈 AI计算基础设施、行业应用及服务,https://devpress.csdn.net/organization/setting/general/146749包括昇腾系列处理器、系列硬件、CANN、AI计算框架、应用使能、开发工具链、管理运维工具、行业应用及服务等全产业链
更多推荐


所有评论(0)