gen_esb二进制工具使用
gen_esb是ES API的代码生成二进制工具,根据ASCEND_OPP_PATH环境变量读取CANN软件包包内置的op_proto子目录下的算子原型so,根据so里面存在的原型信息生成对应的ES产物; 如果是自定义的op_proto的原型so,推荐使用generate_es_package.cmake提供的add_es_library来生成ES的产物并编译。生成产物包括:
- 所有支持的算子(ops)的C接口。
- 所有支持的算子的C++接口。
- 所有支持的算子的Python接口。
- 聚合头文件,方便用户一次性包含所有算子。
- 聚合Python文件,方便用户一次性导入所有算子。
使用前提
- 在使用该工具之前,请先安装CANN软件包,安装完成后,该工具安装在“${INSTALL_DIR}/bin”目录。其中,${INSTALL_DIR}请替换为CANN软件安装后文件存储路径。以root用户安装为例,则安装后文件存储路径为:/usr/local/Ascend/cann。
- 设置环境变量(如下环境变量以root用户为例,且CANN软件包安装在默认路径)
1source /usr/local/Ascend/cann/set_env.sh
执行完上述步骤后,在CANN软件包所在服务器任意路径执行gen_esb --help命令,若提示类似如下信息,则说明工具能正常使用:
========================================== ES Graph Builder Code Generator v1.0 Copyright (c) 2025 Huawei Technologies Co., Ltd. ========================================== ES Graph Builder Code Generator v1.0 Usage: ./gen_esb [--output_dir=DIR] [--module_name=NAME] [--h_guard_prefix=PREFIX] [--exclude_ops=OP_TYPE] ... ...
使用样例及参数说明
工具使用命令为:
./gen_esb [--output_dir=DIR] [--module_name=NAME] [--h_guard_prefix=PREFIX] [--exclude_ops=OP_TYPE1,OP_TYPE2]
参数说明如下:
- --output_dir:可选参数,指定代码生成的目标目录,如果不指定,默认输出到当前目录。
- --module_name:可选参数,控制聚合头文件的命名:
- "math" -> es_math_ops_c.h、es_math_ops.h、es_math_ops.py
- "all" -> es_all_ops_c.h、es_all_ops.h、es_all_ops.py
- 不传递 -> 默认为"all"
- --h_guard_prefix:可选参数,控制生成的头文件保护宏前缀,用于可能的内外部算子同名情况的区分:
- 如果不指定,使用默认前缀
- 指定时,拼接默认前缀
- python文件不感知此参数,同名场景通过不同的路径避免冲突
- --exclude_ops:可选参数,控制排除生成的算子。根据','分隔算子名。
使用示例如下:
- 生成到当前目录,使用默认模块名"all",默认保护宏前缀
./gen_esb
- 生成到指定目录,使用默认模块名"all",默认保护宏前缀
./gen_esb --output_dir=./output
- 生成到指定目录,使用"math"模块名,默认保护宏前缀
./gen_esb --output_dir=./output --module_name=math
- 生成到指定目录,使用"all"模块名,默认保护宏前缀
./gen_esb --output_dir=./output --module_name=all
- 生成到指定目录,使用"math"模块名,自定义保护宏前缀"MY_CUSTOM"
./gen_esb --output_dir=./output --module_name=math --h_guard_prefix=MY_CUSTOM
- 生成到指定目录,使用"math"模块名,自定义保护宏前缀"MY_CUSTOM",并排除Add算子生成
./gen_esb --output_dir=./output --module_name=math --h_guard_prefix=MY_CUSTOM --exclude_ops=Add
输出文件
- es_{module_name}_ops_c.h:C接口聚合头文件
- es_{module_name}_ops.h:C++接口聚合头文件
- es_{module_name}_ops.py:Python接口聚合文件
- es_<op_type>_c.h:单个算子的C接口头文件
- es_<op_type>.cpp:单个算子的C接口实现文件
- es_<op_type>.h:单个算子的C++接口头文件
- es_<op_type>.py:单个算子的Python接口文件
推荐使用cmake函数封装的方式,因为Cmake函数内部保持了Python依赖的so的名字和ES产物编译出来的so的名字一致; 否则需要保证自己的Cmake工程中定义的ES的so名字命名为libes_{module_name}.so。
父主题: 附录