从官网下载了他们产品试用版,目前手头没有合适的开发板,没法运行实际的例子,但是作为一个程序猿,我比较感兴趣的是其DNNC编译器的实现。看其文档,其可以让用户轻松完成从Caffe框架到DPU的转换。本文基于其软件接口,进行了简单的分析总结,仅供参考。
分析软件包中 /host_x86/pkgs/bin/dnnc文件,可以得到如下的一些发现:
1、集成了Caffe中proto并进行了扩展,用于读取”.prototxt”和”.caffemodel”文件,还增加了如下的参数:
caffe::FixedParameter,猜测这个新增的参数和定点化有关。标准的Caffe里未找到这个参数,可能是深鉴或者其他开发者做了扩展。
主要成员如下,包含了定点化位宽、定点方法等标志位。
caffe::FixedParameter |
---|
caffe::FixedParameter::FixedMethod_MAX |
caffe::FixedParameter::FixedMethod_MIN |
caffe::FixedParameter::kFixInfoFieldNumber |
caffe::FixedParameter::kBitWidthFieldNumber |
caffe::FixedParameter::DIFF_A |
caffe::FixedParameter::DIFF_S |
caffe::FixedParameter::OVER_FLOW |
caffe::TilingParameter, 猜测和数据划分有关,由于查看不到有用信息,这个不列举了。
2、DNNC中会把神经网络模型编译成内部计算图IR,附加控制流和数据流。LayerGraph、SuperGraph等数据结构在其中扮演了重要的角色,其主要接口有:
忽略函数的返回值:
dnnc::LayerGraph |
---|
dnnc::LayerGraph::CreateLayer(dnnc::LayerType, const std::string&) |
dnnc::LayerGraph::CreateLayer(dnnc::LayerType, const std::string&, const dnnc::parameter_t&) |
dnnc::LayerGraph::CreateLayer(dnnc::Layer*) |
dnnc::LayerGraph::RemoveLayer(dnnc::Layer*) |
dnnc::LayerGraph::CopyLayer(const dnnc::Layer*) |
dnnc::LayerGraph::AddControlLayer() |
dnnc::LayerGraph::AddEdge(dnnc::Layer*, int, dnnc::Layer*, int) |
dnnc::LayerGraph::RemoveEdge(const dnnc::LayerEdge*) |
dnnc::LayerGraph::CreateSubgraph(std::set< const dnnc::Layer* >) |