每一个Op的属性应该如何检查与表示?
Created by: reyoung
在神经网络框架中,每一个Op
都有可能设置一些属性信息。譬如对于cosine_similarity
来说,可以设置的属性为"scale",默认值是1.0,类型是float型。
这些信息,首先用户可以进行配置,其次神经网络框架需要进行检查。
背景
用户配置属性信息
在Caffe2/Tensorflow中,由于这二者用户配置信息都使用了protobuf
,而protobuf
并没有variant
类型,于是二者均使用下面这种逻辑实现。
message Attribute {
required string name = 1;
optional int i_val = 2;
optional float f_val = 3;
...
repeated float floats = 10;
repeated int64 ints = 12;
}
message Operation {
...
repeated Attribute attrs = 10;
};
Caffe2与Tensorflow的实现与上述代码类似。Tensorflow相交于Caffe2,使用了Protobuf3的map与oneof语法,使其在C++端访问attrs的效率变高,但是参考protobuf文档,使用oneof与map的Tensorflow与Caffe2的optional
消息wire-format
一致。
而MXNet是在C++端实现的属性信息,实现方式为:
map<string, string> attrs_;
在MXNet中,使用Set(void* attr, string val);
进行字符串的解析。
框架检查用户的配置:
- Caffe2中没有检查用户配置每一个Op属性的合法性。
- Tensorflow中,Attr的约束使用字符串配置(Example)。使用C++端解析这个字符串,并且检查用户的配置信息。
- MXNet中,因为MXNet使用C++记录用户配置信息和每一个Op的属性约束。直接将属性约束记录成了
std::function
。所以检查用户配置就是执行这些函数即可。