使用protobuf的message还是使用C++结构体描述神经网络?
Created by: reyoung
在Caffe2,Tensorflow,MXNet与DyNet这四个神经网络框架中,Caffe2与Tensorflow使用protobuf
描述用户的配置信息,MXNet
与DyNet
使用C++数据结构描述用户的配置信息。
Protobuf与C++描述用户配置的优缺点
使用Protobuf描述用户配置的优缺点
- 优点:
- 天然支持多编程语言的序列化。
- 缺点:
- Python与C++ 核心的网络配置需要经历一次序列化与反序列化过程,运行时速度较慢。
- 不支持
Variant
类型,对于Attribute的表示方式比较复杂。 See #2499 (closed)
使用C++描述用户配置的优缺点
- 优点:
- 因为没有序列化过程,运行速度快。
- 有Variant类型(boost::variant或者boost::any)
- 缺点:
- 需要手写序列化过程。
用户配置信息描述的要求
快速的、轻量级的用户配置
参考DyNet的论文中的描述。如果实现动态神经网络,需要用户配置信息是轻量的,快速的。参考该论文23-24页与tensorflow的对比可见,DyNet实现RNN language model的速度明显快于Tensorflow(2440 vs 636
),且DyNet
实现用户配置,仅从代码量上看也远小于Tensorflow
。
即,使用C++描述神经网络配置,实现简单,速度快。
模型序列化与保存
- DyNet不支持拓扑结构的序列化,在预测时要求用户在C++端重新配置一下网络。
- MXNet在C++端手写了将用户配置的C++结构序列化到JSON的过程。
即,使用C++描述神经完了过配置,序列化复杂。