自从百度2018年推出飞桨(PaddlePaddle)的第一个0.14版本后,不少开发者感兴趣并参与贡献其中,但一直存在代码转移的问题。比如,你有一项工作使用TensorFlow完成,简答粗暴地切换到PaddlePaddle平台几乎相当于把之前的代码重写一遍,等于做一次没什么意义的二次开发。而笔者的工作中就遇到了这个问题,直到我发现了X2Paddle。
X2Paddle是一个用于支持将除Paddle以外的其他框架训练的模型转换至PaddlePaddle模型的工具,深度学习的应用分为训练和预测两部分。由于项目需求,需要将TensorFlow模型转到Paddle上跑,查阅资料中发现了这个工具。
1/ 快速上手
首先安装和配置好X2Paddle。这个过程非常简单,我把它放在文末,你仍然可以在文末的系统兼容性板块找到配置方法。
注意,使用conda的小伙伴可能找不到conda,这时候你应该去.bashrc添加一下,使用类似的命令:
echo 'export PATH="XXXX:$PATH" >> ~/.bashrc
source ~/.bashrc
配置好以后,不说废话。TensorFlow用户可以这样转换模型:
x2paddle --framework=tensorflow --model=你的TensorFlow模型.pb --save_dir=你转换后的PaddlePaddle模型目录
但是在转换语义分割模型时目前还不支持其他框架训练出来的模型,官方给的建议是直接用官方的模型跑:PaddlePaddle/PaddleSeg
同样的代码适用于Caffe:
x2paddle --framework=caffe --prototxt=deploy.prototxt --weight=deploy.caffemodel --save_dir=pd_model
传统ONNX规范也是被支持的:
x2paddle --framework=onnx --model=onnx_model.onnx --save_dir=pd_model
转换后的模型包括model_with_code
和inference_model
两个目录,前者是转换后的Python源代码,后者就是可以直接用存储预测模型save_inference_model和加载预测模型load_inference_model两个接口处理的目标。
目前官方还在不断更新ops,如果发现一些比较新的还没支持,建议随时更新一下X2Paddle可能有帮助。
偶尔会遇到Unknown shape for input tensor[tensor name: "input"], Please define shape of input here的提示,手动给出即可,问题不大,不慌。
2/ 作为托底方案的API对照表
在探索的过程中,我发现一个API对应的表格。PaddlePaddle目前把常用的,绝大多数的TensorFlow API全部做了转换文档,可以用来对着改。
在这个表格里,如果两者的功能没有差异,则会标注功能一致,如果功能、参数有差异,后面就会跟着比较详细的注明。(如图)
PaddlePaddle/X2Paddle
3/ 兼容性和总结
我在X86的Ubuntu 18.04@Python 3.7.1上运行了X2Paddle转换我的TensorFlow分类模型,损失精度在可接受范围内。感觉非常方便,省了好多时间。主要是 调试的精力 。
但是X2Paddle尚未支持Torch?(我也想不用torch,但实习的组全套的torch)Torch有许多用户,甚至有媒体统计CVPR论文Torch数量是TF四倍。貌似这段时间大火的TensorFlow 2.0也还没有被支持,由于2.0比1.0易用性有较大提升。很多同学朋友一开始只学了2.0。而未来2.0是趋势(万一反压torch一头呢?)。
总结一句,希望这样的工具越来越多。目前的开源框架开发者主要关注的还是社区,社区的敏捷和贡献度直接决定了新手友好程度。而X2Paddle解决了最后1km的问题,即便开发者使用其他框架也可以被支持。同时Paddle2ONNX的给出也解决了从国产到国际的第二步,传统的界限将被打破,未来优势将越来越明显。
引用
- PaddlePaddle/X2Paddle
- 工具组件 模型转换工具X2Paddle操作大全
- 如何理解百度飞桨paddleX的产品定位?
- 飞桨PaddlePaddle:模型转换工具X2Paddle操作大全