CANN/ge:使用Parser接口解析原始模型
使用Parser接口将原始模型解析为Graph【免费下载链接】geGEGraph Engine是面向昇腾的图编译器和执行器提供了计算图优化、多流并行、内存复用和模型下沉等技术手段加速模型执行效率减少模型内存占用。 GE 提供对 PyTorch、TensorFlow 前端的友好接入能力并同时支持 onnx、pb 等主流模型格式的解析与编译。项目地址: https://gitcode.com/cann/ge除了可以使用算子原型直接构图外CANN还提供了框架解析功能将主流框架的模型格式解析成CANN模型格式。功能介绍目前业界开源的深度学习框架例如TensorFlowPyTorch、Caffe等定义模型的格式各有不同例如TensorFlow通过自定义pb描述静态shape图和模型PyTorch通过ONNX规范描述因此需要通过统一的框架解析功能隔离上层框架差异通过Parser模块完成解析并转换成AI处理器支持的CANN模型格式。涉及的主要接口为解析TensorFlow模型aclgrphParseTensorFlow解析Caffe模型aclgrphParseCaffeAtlas A2 训练系列产品/Atlas A2 推理系列产品不支持Caffe框架Caffe框架在该产品形态已不演进不保证功能可用。Atlas A3 训练系列产品/Atlas A3 推理系列产品不支持Caffe框架Caffe框架在该产品形态已不演进不保证功能可用。Ascend 950PR/Ascend 950DT不支持Caffe框架Caffe框架在该产品形态已不演进不保证功能可用。解析ONNX原始模型aclgrphParseONNX解析加载至内存的ONNX模型aclgrphParseONNXFromMemParser层目前为用户开放了自定义OpParser和自定义TensorFlow Scope融合规则的功能如果用户在Parser解析时需要对框架进行更灵活的适配则可以自定义OpParser或自定义开发TensorFlow Scope融合规则。自定义OpParser如果用户需要将原始框架中算子直接映射到CANN中已实现的Ascend C算子或者已实现的TBE算子可直接进行第三方框架的适配需分别参见《Ascend C算子开发指南》中的“编程指南 附录 AI框架算子适配”章节或者参见《TBEAI CPU算子开发》中的“算子开发过程 算子适配”章节选择其中一种已实现的算子即可。自定义TensorFlow Scope融合规则基于TensorFlow构建的神经网络计算图通常由大量的小算子组成为了实现高性能的计算往往需要对子图中的小算子进行融合使得融合后的大算子可以充分利用硬件加速资源。具体请参见《TensorFlow Parser Scope融合规则开发》。[!NOTE]说明该说明不适用于Ascend 950PR/Ascend 950DT原始模型转换为Graph时如果Tensor的shape维度和format维度数量不一致按照如下表格中的规则理解当前维度 例如shape只有1维为[16]format为4维比如NHWC该场景下可以理解为shape的1维为C轴其他轴需要补维补维后格式为[1,1,1,16] shape为2维[16,16]format为4维比如NHWC该场景下可以理解为shape的2维为HW轴其他轴需要补维补维后格式为[1,16,16,1]。|实际维度数|format|维度理解为| |--|--|--| |1|NCHWNHWCHWCNCHWNNDHWCNCDHWDHWCNDHWNC|C| |2|NCHW|CH| |2|NHWC|HW| |2|HWCN|CN| |2|CHWN|WN| |2|NDHWC|WC| |2|NCDHW|HW| |2|DHWCN|CN| |2|DHWNC|NC| |3|NCHW|CHW| |3|NHWC|HWC| |3|HWCN|WCN| |3|CHWN|HWN| |3|NDHWC|HWC| |3|NCDHW|DHW| |3|DHWCN|WCN| |3|DHWNC|WNC| |4|NDHWC|DHWC| |4|NCDHW|CDHW| |4|DHWCN|HWCN| |4|DHWNC|HWNC|基于TensorFlow模型解析包含的头文件#include tensorflow_parser.h通过aclgrphParseTensorFlow接口将TensorFlow原始模型解析为Graph此时Graph保存在内存缓冲区中。std::string tfPath ../data/tf_test.pb; ge::Graph graph1; auto tfStatus ge::aclgrphParseTensorFlow(tfPath.c_str(),graph1);同时支持用户指定parser_paramsstd::string tfPath ../data/tf_test.pb; std::mapge::AscendString, ge::AscendString parser_params { {ge::AscendString(ge::ir_option::INPUT_FP16_NODES), ge::AscendString(input1;input2)}, {ge::AscendString(ge::ir_option::OUTPUT), ge::AscendString(newIssue)}}; ge::Graph graph1; auto tfStatus ge::aclgrphParseTensorFlow(tfPath.c_str(), parser_params, graph1);基于Caffe模型解析包含的头文件#include caffe_parser.h通过aclgrphParseCaffe接口将Caffe原始模型解析为Graph此时Graph保存在内存缓冲区中。std::string caffePath ../data/caffe_test.prototxt; std::string weight ../data/caffe_test.caffemodel; ge::Graph graph1; auto caffeStatus ge::aclgrphParseCaffe(caffePath.c_str(), weight.c_str(), graph1);同时支持用户指定parser_paramsstd::string caffePath ../data/caffe_test.prototxt; std::string weight ../data/caffe_test.caffemodel; std::mapge::AscendString, ge::AscendString parser_params { {ge::AscendString(ge::ir_option::INPUT_FP16_NODES), ge::AscendString(input1;input2)}, {ge::AscendString(ge::ir_option::OUTPUT), ge::AscendString(newIssue)}}; ge::Graph graph1; auto caffeStatus ge::aclgrphParseCaffe(caffePath.c_str(), weight.c_str(), parser_params, graph1);基于ONNX模型解析包含的头文件#include onnx_parser.h通过aclgrphParseONNXFromMem接口将加载至内存的ONNX模型解析为Graph此时Graph保存在内存缓冲区中。同时支持用户指定parser_params// 以二进制方式打开一个ONNX模型文件 FILE *pFile fopen(./onnx/resnet101.onnx, rb ); if(pFileNULL) { fputs(File error,stderr); exit(1); } // 读取文件大小 fseek(pFile, 0, SEEK_END); long lSize ftell(pFile); rewind(pFile); // 分配足够的内存缓冲区 char *buffer (char*) malloc(sizeof(char)*lSize); if(buffer NULL) { fputs(Memory error, stderr); exit(2); } // 把文件内容读入缓冲区 size_t result fread(buffer, 1, lSize, pFile); if(result ! lSize) { fputs(Reading error, stderr); exit(3); } // 准备ONNX解析时需要的参数 std::mapge::AscendString, ge::AscendString parser_params { {ge::AscendString(ge::ir_option::INPUT_FP16_NODES), ge::AscendString(input1;input2)}, {ge::AscendString(ge::ir_option::OUTPUT), ge::AscendString(newIssue)}}; // 解析ONNX模型 ge::Graph graph1; auto onnxStatus ge::aclgrphParseONNXFromMem(buffer, result, parser_params, graph1);通过aclgrphParseONNX接口将ONNX原始模型解析为Graph此时Graph保存在内存缓冲区中。同时支持用户指定parser_paramsstd::string onnxPath ../data/onnx_test.onnx; std::mapge::AscendString, ge::AscendString parser_params { {ge::AscendString(ge::ir_option::INPUT_FP16_NODES), ge::AscendString(input1;input2)}, {ge::AscendString(ge::ir_option::OUTPUT), ge::AscendString(newIssue)}}; ge::Graph graph1; auto onnxStatus ge::aclgrphParseONNX(onnxPath.c_str(), parser_params, graph1);【免费下载链接】geGEGraph Engine是面向昇腾的图编译器和执行器提供了计算图优化、多流并行、内存复用和模型下沉等技术手段加速模型执行效率减少模型内存占用。 GE 提供对 PyTorch、TensorFlow 前端的友好接入能力并同时支持 onnx、pb 等主流模型格式的解析与编译。项目地址: https://gitcode.com/cann/ge创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考