# esb_sample **Repository Path**: ni100die/esb_sample ## Basic Information - **Project Name**: esb_sample - **Description**: esb_sample - **Primary Language**: Unknown - **License**: Apache-2.0 - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 1 - **Forks**: 9 - **Created**: 2025-05-22 - **Last Updated**: 2025-12-22 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # esb_sample ## 简介 ## 使用方法 ### 准备工作 **下载代码** ``` git clone git@gitee.com:ni100die/esb_sample.git ``` **下载submodule** ``` 1. cd esb_sample #进入代码目录 2. git submodule init && git submodule update ``` **准备cann包** ``` bash prepare_dev_env.sh ``` ### 编译和执行 #### es接口所在的文件生成部分 ```bash $ bash run_sample.sh --target gen_esb ``` 应该看到如下信息,代表执行成功: ```bash [Success] gen_esb 执行成功,产物位于 generated/esb目录下 ``` 执行成功后,会在generated/esb/目录下生成以下文件: ```bash generated/esb/ ├─ es_all_ops.h # C++ 聚合头文件 ├─ es_all_ops_c.h # C 聚合头文件 ├─ es_all_ops.py # Python 聚合文件 ├─ es__c.h # 每个算子的 C 接口声明 ├─ es_.cpp # 每个算子的 C 接口实现 ├─ es_.h # 每个算子的 C++ 接口声明 ├─ es_.py # 每个算子的 python 接口 ``` #### 生成 es 接口与构建图进行DUMP 只需运行下述命令即可完成清理、生成接口、构图和DUMP图: ```bash $ bash run_sample.sh ``` 当前 run_sample.sh 的行为是:在执行 sample 目标前,会自动清理旧的 build 与 generated/esb(防止残留旧源码被编译),然后执行gen_esb。应该看到如下信息,代表执行成功: ```bash [Success] gen_esb 执行成功,产物位于 generated/esb目录下 [Success] sample 执行成功,pbtxt dump 已生成在当前目录。该文件以 ge_onnx_ 开头,可以在 netron 中打开显示 ``` **输出文件说明** 执行成功后会在当前目录生成以下文件: - `ge_onnx_*.pbtxt` - 图结构的protobuf文本格式,可用netron查看 #### 构建图并执行 除了基本的图构建和dump功能外,esb_sample还支持构建图并实际执行计算。 ```bash $ bash run_sample.sh -t sample_and_run ``` 该命令会: 1. 自动生成ES接口 2. 编译sample程序 3. 运行图并输出计算结果 执行成功后会看到: ```bash [Success] sample_and_run 执行成功,pbtxt和data输出dump 已生成在当前目录 ``` **图执行示例** 项目中的`MakeAddSubMulDivGraphByEsAndRun()`函数展示了如何构建并执行一个包含加法、减法、乘法、除法的计算图: ```cpp // 创建图构建器 auto graph_builder = std::make_unique("MakeAddSubMulDivGraph"); // 创建输入张量 auto input1 = graph_builder->CreateInput(0, "input1", ge::DT_FLOAT, ge::FORMAT_ND, {2, 2}); auto input2 = graph_builder->CreateInput(1, "input2", ge::DT_FLOAT, ge::FORMAT_ND, {2, 2}); // 使用语法糖构建计算图 auto add_result = input1 + input2; auto sub_result = input1 - input2; auto mul_result = input1 * input2; auto div_result = input1 / input2; auto final_result = add_result + sub_result + mul_result + div_result; // 设置输出 graph_builder->SetOutput(final_result, 0); auto graph = graph_builder->Build(); // 准备输入数据并执行 std::vector inputs; inputs.push_back(*ge::Utils::StubTensor({1.0, 2.0, 3.0, 4.0}, {2, 2})); inputs.push_back(*ge::Utils::StubTensor({1.0, 2.0, 3.0, 4.0}, {2, 2})); // 执行图并获取结果 RunGraph(*graph, inputs); ``` 执行过程中会输出: - 输入张量的详细信息 - 计算结果会保存到文件中 **输出文件说明** 执行成功后会在当前目录生成以下文件: - `ge_onnx_*.pbtxt` - 图结构的protobuf文本格式,可用netron查看 - `*.data` - 计算结果数据文件 #### 日志打印 可执行程序执行过程中如果需要日志打印来辅助定位,可以在bash run_sample.sh之前设置如下环境变量来让日志打印到屏幕 ```bash export ASCEND_SLOG_PRINT_TO_STDOUT=1 #日志打印到屏幕 export ASCEND_GLOBAL_LOG_LEVEL=0 #日志级别为debug级别 ``` #### 图编译流程中DUMP图 可执行程序执行过程中,如果需要DUMP图来辅助定位图编译流程,可以在bash run_sample.sh之前设置如下环境变量来DUMP图到执行路径下 ```bash export DUMP_GE_GRAPH=2 ``` ## 主要代码介绍 ```angular2html esb_sample ├── base # metadef的submodel目录 ├── eager_style_graph_buidler # es构图接口工程目录 ├── es_showcase # 使用es动态构建计算图 ├── ir_showcase # 传统ge ir构图 ├── dump.cpp # dump图接口 ├── run_graph.cpp # 图编译执行接口 ├── main.cpp # 程序主入口 ```