查看原文
其他

资源 | 微软开源MMdnn:实现多个框架之间的模型转换

2018-02-28 机器之心

选自GitHub

作者:Kit CHEN等

机器之心编译

参与:路雪、思源


近日,微软开源 MMdnn,可用于转换、可视化和诊断深度神经网络模型的全面、跨框架解决方案,目前支持 Caffe、Keras、MXNet、CNTK 等框架。


项目地址:https://github.com/Microsoft/MMdnn


MMdnn 是一个用于转换、可视化和诊断深度神经网络模型的综合性、跨框架的解决方案。MMdnn 中的「MM」代表模型管理,「dnn」是「deep neural network」(深度神经网络)的缩写。


MMdnn 可将一个框架训练的 DNN 模型转换到其他框架可用。其主要特征包括:


  • 模型文件转换器,转换 DNN 模型使之适合不同框架;

  • 模型代码块生成器,生成适合不同框架的训练或推断代码块;

  • 模型可视化,针对不同框架可视化 DNN 网络架构和参数;

  • 模型兼容性测试(正在进行)。


安装


通过以下命令行获取稳定版的 MMdnn:


pip install https://github.com/Microsoft/MMdnn/releases/download/0.1.3/mmdnn-0.1.3-py2.py3-none-any.whl


或者通过以下命令尝试最新版本:


pip install -U git+https://github.com/Microsoft/MMdnn.git@master


模型转换


业界和学界存在大量现有框架,适合开发者和研究者来设计模型,每个框架具备自己的网络结构定义和模型保存格式。框架之间的差距阻碍了模型的交互操作。



我们提供一个模型转换器,帮助开发者通过中间表征格式转换模型,以适合不同框架。


支持框架


每个支持的框架都有详细的 README 文档,它们可以在以下conversion件夹找到。


地址:https://github.com/Microsoft/MMdnn/tree/master/mmdnn/conversion


  • Caffe

  • Keras

  • MXNet

  • TensorFlow(实验阶段,强烈建议先阅读 README)

  • Microsoft Cognitive Toolkit (CNTK) 

  • PyTorch

  • CoreML(实验阶段)


测试模型


我们在部分 ImageNet 模型上对当前支持的框架间模型转换功能进行了测试。



正在测试的框架:


  • PyTorch

  • CNTK

  • Caffe2

  • ONNX


正在测试的模型:


  • RNN

  • 图像风格迁移

  • 目标检测


模型可视化


你可以使用 MMdnn 模型可视化工具(http://vis.mmdnn.com/),提交自己的 IR json 文件进行模型可视化。为了运行下面的命令行,你需要使用喜欢的包管理器安装 requests、Keras、TensorFlow。


使用 Keras inception_v3 模型作为示例。


1. 下载预训练模型:


python -m mmdnn.conversion.examples.keras.extract_model -n inception_v3


2. 将预训练模型文件转换成中间表征格式:


python3 -m mmdnn.conversion._script.convertToIR -f keras -d keras_inception_v3 -n imagenet_inception_v3.json


3. 打开 MMdnn 模型可视化工具地址(http://mmdnn.eastasia.cloudapp.azure.com:8080/),选择文件 keras_inception_v3.json。



社区支持


本项目仍在继续开发与探索,它需要各位读者完善中间表征与支持的框架。因此,该项目的作者表示他非常希望有开发者能提供新的运算或扩展。


  • 中间表征:中间表征在 protobuf 二进制文件中储存网络架构,在 NumPynative 格式中储存预训练权重。此外,目前 IR 权重数据使用的是 NHWC 格式。中间表征的细节请查看 ops.txt 和 graph.proto 文件。

  • 框架:我们正在扩展到其它框架版本和可视化工具,例如 Caffe2、PyTorch 和 CoreML 等。此外,本项目也在积极开发 RNN 相关的操作方法。


使用案例


以下是该项目实现框架转换的基本案例,其中包括官方的教程和用户提供的各种案例,机器之心简要介绍了官方 Keras 到 CNTK 的转换教程。


官方教程:


  • Keras "inception_v3" to CNTK


用户案例:


  • MXNet "resnet 152 11k" to PyTorch

  • MXNet "resnext" to Keras

  • Tensorflow "resnet 101" to PyTorch

  • Tensorflow "mnist mlp model" to CNTK

  • Tensorflow "Inception_v3" to MXNet

  • Caffe "AlexNet" to Tensorflow

  • Caffe "inception_v4" to Tensorflow

  • Caffe "VGG16_SOD" to Tensorflow

  • Caffe "Squeezenet v1.1" to CNTK


Keras「inception_v3」模型到 CNTK 的转换


1. 安装 Keras 和 CNTK


pip install keras

pip install https://cntk.ai/PythonWheel/CPU-Only/cntk-2.3-cp27-cp27mu-linux_x86_64.whl
or
pip install
https://cntk.ai/PythonWheel/CPU-Only/cntk-2.3-cp35-cp35m-linux_x86_64.whl


2. 准备 Keras 模型。以下示例将首先下载预训练模型,然后使用简单的模型抽取器从 Keras 应用中获取模型,抽取器将抽取 Keras 模型架构和权重。


$ python -m mmdnn.conversion.examples.keras.extract_model -n inception_v3

Using TensorFlow backend.
Downloading data from https://github.com/fchollet/deep-learning-models/releases/download/v0.5/inception_v3_weights_tf_dim_ordering_tf_kernels.h5
96075776/96112376 [============================>.] - ETA: 0s
.
.
.
Network structure is saved as [imagenet_inception_v3.json].
Network weights are saved as [imagenet_inception_v3.h5].


架构文件 imagenet_inception_v3.json 和权重文件 imagenet_inception_v3.h5 会下载至当前工作目录。


3. 将预训练模型文件转换为中间表征


$ python -m mmdnn.conversion._script.convertToIR -f keras -d converted -n imagenet_inception_v3.json -w imagenet_inception_v3.h5

Using TensorFlow backend.
.
.
.
Network file [imagenet_inception_v3.json] is loaded successfully.
IR network structure is saved as [converted.json].
IR network structure is saved as [converted.pb].
IR weights are saved as [converted.npy].


以上的命令会将 imagenet_inception_v3.json 作为神经网络架构的描述文件,imagenet_inception_v3.h5 作为预训练权重。然后计算出中间表征文件 converted.json 用于可视化,计算出 converted.proto 和 converted.npy 以进一步转换为其它框架。


4. 转换 IR 文件为 CNTK 模型


$ python -m mmdnn.conversion._script.IRToCode -f cntk -d converted_cntk.py -n converted.pb -w converted.npy

Parse file [converted.pb] with binary format successfully.
Target network code snippet is saved as [converted_cntk.py].


你将得到文件 converted_cntk.py,包括构建 Inception V3 网络的原始 CNTK 代码。


经过这三步,你已经将预训练 Keras Inception_v3 模型转换成 CNTK 网络文件 converted_cntk.py 和权重文件 converted.npy。你可以用这两个文件调整训练或推断。


5. 转存原始 CNTK 模型


$ python -m mmdnn.conversion.examples.cntk.imagenet_test -n converted_cntk -w converted.npy --dump cntk_inception_v3.dnn
.
.
.
CNTK model file is saved as [cntk_inception_v3.dnn], generated by [converted_cntk.py] and [converted.npy].


CNTK 可直接加载文件 cntk_inception_v3.dnn。



本文为机器之心编译,转载请联系本公众号获得授权。

✄------------------------------------------------

加入机器之心(全职记者/实习生):hr@jiqizhixin.com

投稿或寻求报道:editor@jiqizhixin.com

广告&商务合作:bd@jiqizhixin.com

您可能也对以下帖子感兴趣

文章有问题?点此查看未经处理的缓存