
add_es_library 使用指南【免費下載鏈接】geGEGraph Engine是面向昇騰的圖編譯器和執(zhí)行器提供了計算圖優(yōu)化、多流并行、內存復用和模型下沉等技術手段加速模型執(zhí)行效率減少模型內存占用。 GE 提供對 PyTorch、TensorFlow 前端的友好接入能力并同時支持 onnx、pb 等主流模型格式的解析與編譯。項目地址: https://gitcode.com/cann/ge概述提供如下 CMake 函數用于生成 Eager Style (ES)產物add_es_library_and_whl: 生成 C/C 動態(tài)庫 Python wheel 包完整產物add_es_library: 只生成 C/C 動態(tài)庫純 C/C 項目使用快速開始前置要求通過安裝指導正確安裝toolkit包并按照指導正確配置環(huán)境變量定義原型動態(tài)庫add_library(opgraph_math SHARED #要求是so的形式 )1. 引入函數使用 find_package# 在你的 CMakeLists.txt 中添加模塊路徑(ASCEND_HOME_PATH來自前置要求中的配置環(huán)境變量) list(APPEND CMAKE_MODULE_PATH ${ASCEND_HOME_PATH}/include/ge/cmake) # 查找模塊 find_package(GenerateEsPackage REQUIRED)說明當前版本需要在 CMakeLists.txt 中手動添加CMAKE_MODULE_PATH計劃支持未來版本將支持只source set_env.sh后直接find_package無需手動添加路徑2. 生成 ES API生成完整產物add_es_library_and_whl( ES_LINKABLE_AND_ALL_TARGET es_math OPP_PROTO_TARGET opgraph_math #前置要求中的原型庫target OUTPUT_PATH ${CMAKE_BINARY_DIR}/output )只生成 C/C 庫add_es_library( ES_LINKABLE_AND_ALL_TARGET es_math OPP_PROTO_TARGET opgraph_math OUTPUT_PATH ${CMAKE_BINARY_DIR}/output )3. 使用生成的產物# 在你的應用中鏈接 add_executable(my_app main.cpp) target_link_libraries(my_app PRIVATE es_math)4. 構建# 直接構建你的應用即可 make my_app # → 會自動觸發(fā) ES 包的構建參數說明函數參數兩個函數參數完全相同參數必需性說明示例ES_LINKABLE_AND_ALL_TARGET? 必需對外暴露的庫 target 名稱es_math,es_nn,es_cvOPP_PROTO_TARGET? 必需算子原型庫的 CMake target 名稱支持 SHARED/STATIC/INTERFACE/OBJECT 類型opgraph_math,opgraph_nnOUTPUT_PATH?? 可選產物輸出的根目錄。如果不指定產物將保留在構建目錄中${CMAKE_BINARY_DIR}/outputEXCLUDE_OPS?? 可選需要排除生成的算子Add,Conv2D區(qū)別add_es_library_and_whl: 生成庫 wheel 包add_es_library: 只生成庫跳過 wheel 包生成重要因為 ES 產物是函數內部動態(tài)生成而 cmake 整體又是配置和構建分階段處理所以我們的函數內部會有重配置和構建的操作這也是我們目前直接提供一個 interface 類型的ES_LINKABLE_AND_ALL_TARGET的原因函數會自動從OPP_PROTO_TARGET的LIBRARY_OUTPUT_DIRECTORY推導原型庫路徑這是生成原型庫對應的 ES 產物的基本條件歷史原型庫相關 CMake 變量以下變量在調用函數前通過set()設置用于控制歷史原型庫功能變量類型說明示例GE_ES_EXTRACT_HISTORYbool可選ON 時向 gen_esb 傳入--es_modeextract_history啟用歷史原型庫生成模式歸檔當前原型為 JSON供后續(xù)版本代碼生成時使用不設置或 OFF 則 gen_esb 默認codegen僅生成 C APIset(GE_ES_EXTRACT_HISTORY ON)GE_ES_RELEASE_VERSION可選當前新版本號歸檔步驟將當前原型歸檔為此版本歷史原型庫生成模式下必須設置set(GE_ES_RELEASE_VERSION 8.0.RC1)GE_ES_RELEASE_DATE可選歷史原型庫生成模式下指定發(fā)布日期格式YYYY-MM-DD不設置則由 gen_esb 使用當前日期set(GE_ES_RELEASE_DATE 2026-02-28)GE_ES_BRANCH_NAME可選歷史原型庫生成模式下指定發(fā)布分支名。注意當設為master時函數會忽略所有歸檔相關變量GE_ES_EXTRACT_HISTORY/GE_ES_RELEASE_VERSION/GE_ES_RELEASE_DATE僅走純代碼生成模式set(GE_ES_BRANCH_NAME release/8.0)歷史原型庫路徑自動推導函數內部根據 cmake 文件安裝位置自動推導${CANN_INSTALL_PATH}/cann/opp/history_registry/module路徑路徑存在且非空時自動向 gen_esb 傳入--history_registry調用方無需顯式設置歷史原型庫路徑。完整商發(fā)模式GE_ES_EXTRACT_HISTORYON且 ops 包中存在歷史原型庫時add_es_library內部自動串行執(zhí)行兩次 gen_esb代碼生成 歷史原型庫歸檔合并調用方無需額外處理一次add_es_library調用即可完成完整商發(fā)所需的全部操作參見示例 11。輸出產物add_es_library_and_whl 生成的產物OUTPUT_PATH/ ├── include/ │ └── es_math/ # 頭文件目錄 │ ├── es_math_ops.h # C 接口聚合頭文件 │ ├── es_math_ops_c.h # C 接口聚合頭文件 │ └── es_add.h ... # 單個算子頭文件(一般是有多個文件) ├── lib64/ │ ├── libes_math.so # 動態(tài)庫 │ └── libes_math.a # 靜態(tài)庫 └── whl/ └── es_math-1.0.0-py3-none-any.whl # Python 包add_es_library 生成的產物OUTPUT_PATH/ ├── include/ │ └── es_math/ # 頭文件目錄 │ ├── es_math_ops.h # C 接口聚合頭文件 │ ├── es_math_ops_c.h # C 接口聚合頭文件 │ └── es_add.h ... # 單個算子頭文件(一般是有多個文件) └── lib64/ ├── libes_math.so # 動態(tài)庫 └── libes_math.a # 靜態(tài)庫說明聚合的含義包含 es_math 下所有算子的構圖 API動態(tài)庫與靜態(tài)庫每次生成會同時產出libname.so與libname.a。對外接口 target如es_math默認鏈接動態(tài)庫若需靜態(tài)鏈接可手動指定lib64/libname.a或通過target_link_libraries(your_target PRIVATE ${OUTPUT_PATH}/lib64/libes_math.a)等方式鏈接靜態(tài)庫。啟用歷史原型庫相關模式后的額外產物歷史原型庫生成模式GE_ES_EXTRACT_HISTORYONgen_esb 直接輸出到OUTPUT_PATH生成以下 JSON 結構OUTPUT_PATH/ ├── index.json # 版本索引所有已歸檔版本的列表 └── registry/ └── GE_ES_RELEASE_VERSION/ ├── metadata.json # 版本元信息版本號、發(fā)布日期、分支名等 └── operators.json # 算子原型數據IR 結構化描述代碼生成模式含歷史兼容自動檢測到歷史原型庫時C 頭文件中同一算子會出現(xiàn)多版本重載簽名歷史版本簽名 當前版本簽名.so同時包含所有版本的實現(xiàn)向前兼容舊版本調用方式。產物目錄結構與標準模式相同僅頭文件內容有差異。生成的 Target對外使用的 TargetTarget 名稱用途說明es_math鏈接依賴使用方通過此 target 鏈接自動觸發(fā)構建默認鏈接動態(tài)庫.so靜態(tài)庫.a也會同時生成。若指定了OUTPUT_PATH可直接從lib64/獲取靜態(tài)庫文件未指定時則保留在 CMake 默認輸出目錄中。使用示例示例 1基本用法# 1. 定義原型動態(tài)庫(前置要求) add_library(opgraph_math SHARED ) # 2. 生成 ES API 包庫 wheel 包 add_es_library_and_whl( ES_LINKABLE_AND_ALL_TARGET es_math OPP_PROTO_TARGET opgraph_math OUTPUT_PATH ${CMAKE_BINARY_DIR}/output ) # 3. 在應用中使用 add_executable(my_app main.cpp) target_link_libraries(my_app PRIVATE es_math)提示如果工程中還有在編譯階段就需要 ES 頭文件的 OBJECT/STATIC 中間目標可額外添加add_dependencies(中間目標 build_es_math)build_es_***名稱會隨包名變化以確保在編譯該 目標前已完成代碼生成。最終的可執(zhí)行或共享庫只需target_link_libraries(... es_math)即可自動觸發(fā) 相關依賴。補充示例包含對象庫add_library(my_obj OBJECT foo.cc bar.cc) # 保證編譯對象前先生成 es_math 頭文件(推薦顯示添加) add_dependencies(my_obj build_es_math) # 傳遞頭文件搜索路徑的作用 target_link_libraries(my_obj PRIVATE es_math) add_executable(my_app $TARGET_OBJECTS:my_obj) target_link_libraries(my_app PRIVATE es_math )示例 2只生成 C/C 庫# 只生成 C/C 庫跳過 Python wheel 包 add_es_library( ES_LINKABLE_AND_ALL_TARGET es_math OPP_PROTO_TARGET opgraph_math OUTPUT_PATH ${CMAKE_BINARY_DIR}/output )示例 3排除部分算子生成# 生成 math TARGET # 生成產物不會包含 es_Add_c.h; es_Add.h, es_Add.cpp, es_Add.py add_es_library( ES_LINKABLE_AND_ALL_TARGET es_math OPP_PROTO_TARGET opgraph_math OUTPUT_PATH ${CMAKE_BINARY_DIR}/output EXCLUDE_OPS Add )示例 4使用 OBJECT 類型的原型庫# 定義 OBJECT 類型的原型庫 add_library(opgraph_math OBJECT src/math_op1.cpp src/math_op2.cpp ) # 生成 ES API函數內部自動創(chuàng)建臨時 SHARED 庫包裝 add_es_library_and_whl( ES_LINKABLE_AND_ALL_TARGET es_math OPP_PROTO_TARGET opgraph_math # OBJECT 類型 OUTPUT_PATH ${CMAKE_BINARY_DIR}/output )示例 5不指定 OUTPUT_PATH# 不指定 OUTPUT_PATH產物將保留在構建目錄中 add_es_library_and_whl( ES_LINKABLE_AND_ALL_TARGET es_math OPP_PROTO_TARGET opgraph_math # OUTPUT_PATH 未指定 )產物展示構建產物保留在構建目錄與 CMake 默認目標輸出目錄中不會額外整理到統(tǒng)一的include/、lib64/、whl/目錄。build_dir/es_math_build/ ├── generated_code/ # gen_esb 與 wrapper 輸出 │ ├── es_math_ops.h # C 接口聚合頭文件 │ ├── es_math_ops_c.h # C 接口聚合頭文件 │ ├── es_add.h ... # 單個算子頭文件(一般是有多個文件) │ ├── es_add.cpp ... # 單個算子實現(xiàn)文件(一般是有多個文件) │ └── es_math_all_in_one.cpp # 聚合 wrapper ├── python_package/ │ └── dist/ │ └── es_math-1.0.0-py3-none-any.whl # Python 包 ├── libes_math.so # 動態(tài)庫CMake 默認庫輸出目錄 └── libes_math.a # 靜態(tài)庫示例 6多個 TARGET# 生成 math TARGET add_es_library_and_whl( ES_LINKABLE_AND_ALL_TARGET es_math OPP_PROTO_TARGET opgraph_math OUTPUT_PATH ${CMAKE_BINARY_DIR}/output ) # 生成 nn TARGET add_es_library_and_whl( ES_LINKABLE_AND_ALL_TARGET es_nn OPP_PROTO_TARGET opgraph_nn OUTPUT_PATH ${CMAKE_BINARY_DIR}/output ) # 使用多個TARGET add_executable(my_inference_app main.cpp) target_link_libraries(my_inference_app PRIVATE es_math es_nn )示例 7C 代碼中使用#include es_math/es_math_ops.h #include ge/es/graph_builder.h using namespace ge::es; int main() { EsGraphBuilder builder(my_graph); // 創(chuàng)建輸入 auto input1 builder.CreateConstFloat(1.0f); auto input2 builder.CreateConstFloat(2.0f); // 使用生成的 ES API auto result Add(input1, input2); auto graph builder.build_and_reset(); return 0; }示例 8Python 中使用# 安裝 wheel 包 pip install output/whl/es_math-1.0.0-py3-none-any.whl# 通過 entry_point 機制自動加載的插件使用統(tǒng)一的導入方式 from ge.es.math import Add from ge.es import GraphBuilder builder GraphBuilder(my_graph) input1 builder.create_const_float(1.0) input2 builder.create_const_float(2.0) result Add(input1, input2) graph builder.build_and_reset()說明插件通過 entry_point 機制自動加載導入路徑為ge.es.module_namemodule_name是從ES_LINKABLE_AND_ALL_TARGET去掉es_前綴得到的如es_math→math可以使用ge.es.list_plugins()查看所有已加載的插件名稱可以使用ge.es.get_plugin(math)檢查插件是否存在返回模塊對象或 None。示例 9歷史原型庫生成模式商發(fā)首次構建歸檔當前版本原型# 從已安裝的算子原型 .so 中提取 IR 原型歸檔為 JSON 供下次商發(fā)使用 set(GE_ES_EXTRACT_HISTORY ON) set(GE_ES_RELEASE_VERSION 8.0.RC1) set(GE_ES_RELEASE_DATE 2026-02-28) # 可選不設置則使用當前日期 set(GE_ES_BRANCH_NAME release/8.0) # 可選若設為 master 則不會執(zhí)行歸檔僅走代碼生成 add_es_library( ES_LINKABLE_AND_ALL_TARGET es_math OPP_PROTO_TARGET opgraph_math OUTPUT_PATH ${CMAKE_BINARY_DIR}/output ) # 產物output/index.json, output/registry/8.0.RC1/metadata.json, output/registry/8.0.RC1/operators.json示例 10代碼生成模式含歷史兼容自動消費已有歷史數據生成帶重載的 C API# 函數內部自動檢測 ${CANN_INSTALL_PATH}/cann/opp/history_registry/math # 路徑存在且非空時自動生成帶歷史兼容重載簽名的 C 接口無需手動設置路徑 set(GE_ES_RELEASE_VERSION 8.0.RC2) add_es_library( ES_LINKABLE_AND_ALL_TARGET es_math OPP_PROTO_TARGET opgraph_math OUTPUT_PATH ${CMAKE_BINARY_DIR}/output ) # 產物頭文件中同一算子出現(xiàn)多版本重載舊簽名 新簽名向前兼容舊版本調用示例 11完整商發(fā)模式單次調用函數內部自動完成代碼生成 歷史原型庫歸檔合并# GE_ES_EXTRACT_HISTORYON ops 包中存在歷史原型庫自動檢測 完整商發(fā)模式 # add_es_library 內部自動串行執(zhí)行兩次 gen_esb調用方無需額外處理 # gen_esb 調用1默認 codegen 模式以當前日期為錨點自動選取窗口內歷史版本 → 對比當前原型 → 生成帶重載 C API # gen_esb 調用2--es_modeextract_history將已有歷史庫從 _AUTO_HISTORY_REGISTRY 復制至 OUTPUT_PATH在 OUTPUT_PATH 追加當前版本原型 → OUTPUT_PATH 包含完整歷史原型庫 set(GE_ES_EXTRACT_HISTORY ON) set(GE_ES_RELEASE_VERSION 8.0.RC2) # 當前新版本號用于歸檔步驟 set(GE_ES_RELEASE_DATE 2026-02-28) # 可選 set(GE_ES_BRANCH_NAME develop) # 可選若設為 master 則不會歸檔僅走代碼生成 add_es_library( ES_LINKABLE_AND_ALL_TARGET es_math OPP_PROTO_TARGET opgraph_math OUTPUT_PATH ${CMAKE_BINARY_DIR}/output )命名規(guī)則產物命名產物類型命名規(guī)則示例 (ES_LINKABLE_AND_ALL_TARGETes_math)動態(tài)庫libES_LINKABLE_AND_ALL_TARGET.solibes_math.so靜態(tài)庫libES_LINKABLE_AND_ALL_TARGET.alibes_math.aPython 包ES_LINKABLE_AND_ALL_TARGET-1.0.0-py3-none-any.whles_math-1.0.0-py3-none-any.whl聚合頭文件es_name_ops.hes_math_ops.hTarget 命名Target 類型命名規(guī)則示例 (ES_LINKABLE_AND_ALL_TARGETes_math)對外庫ES_LINKABLE_AND_ALL_TARGETes_math注意事項ES_LINKABLE_AND_ALL_TARGET 命名建議使用es_前綴如es_math,es_nn使用小寫字母和下劃線避免使用特殊字符和 C 關鍵字歷史原型庫相關變量歷史原型庫路徑由函數自動推導${CANN_INSTALL_PATH}/cann/opp/history_registry/module路徑存在且非空時自動啟用調用方無需傳參master 分支當GE_ES_BRANCH_NAME為master時會忽略GE_ES_EXTRACT_HISTORY/GE_ES_RELEASE_VERSION/GE_ES_RELEASE_DATE僅走純代碼生成模式歷史原型庫路徑仍會傳遞用于生成帶重載的 C APIGE_ES_EXTRACT_HISTORYON且 ops 包中存在歷史原型庫自動檢測到即為完整商發(fā)模式函數內部自動執(zhí)行兩次 gen_esb代碼生成 歷史原型庫歸檔合并調用方無需任何額外處理參見示例 11版本去重若歷史原型庫的index.json中已存在與GE_ES_RELEASE_VERSION相同的版本號則跳過歸檔步驟僅執(zhí)行代碼生成避免重復歸檔同時將 CANN 安裝路徑中的歷史原型庫完整復制到OUTPUT_PATH方便后續(xù)換路徑安裝純歷史歸檔模式僅設置GE_ES_EXTRACT_HISTORYONops 包中無歷史原型庫gen_esb 輸出到OUTPUT_PATH只生成 JSON不生成 C API完整商發(fā)模式下代碼生成步驟 gen_esb 不傳--release_version以當前日期為錨點自動選取窗口內歷史版本對比歸檔步驟使用GE_ES_RELEASE_VERSION作為新版本號寫入歷史庫完整商發(fā)模式下歸檔步驟將已有歷史庫從_AUTO_HISTORY_REGISTRYCANN 安裝路徑只讀復制到OUTPUT_PATH構建目錄可寫gen_esb 在OUTPUT_PATH追加當前版本條目首次構建CANN 路徑中無已有歷史庫時直接輸出至OUTPUT_PATH最終OUTPUT_PATH包含所有歷史版本 當前版本的完整合并結果GE_ES_RELEASE_VERSION歸檔時必須設置否則歸檔版本無法識別歷史原型庫數據JSON 文件通常隨 ops 包安裝默認位于${CANN_INSTALL_PATH}/cann/opp/history_registry/package_name/依賴要求CMake 版本: 3.16CANN run 包: 已安裝并設置環(huán)境變量或手動指定路徑gen_esb: 此為內部es api的代碼生成二進制工具已在run包中集成可以通過gen_esb--help信息查看使用說明OPP_PROTO_TARGET: 必須存在Python3: 3.7僅add_es_library_and_whl需要Python 包: setuptools, wheel僅add_es_library_and_whl需要,推薦使用setuptools59.6.0、wheel0.37. 1的配套版本或更高版本常見問題Q多個 TARGET 如何共享輸出目錄A: 所有TARGET可以使用同一個OUTPUT_PATH頭文件會按包名組織在子目錄中add_es_library_and_whl( ES_LINKABLE_AND_ALL_TARGET es_math OPP_PROTO_TARGET opgraph_math OUTPUT_PATH ${CMAKE_BINARY_DIR}/output # 共享路徑 ) add_es_library_and_whl( ES_LINKABLE_AND_ALL_TARGET es_nn OPP_PROTO_TARGET opgraph_nn OUTPUT_PATH ${CMAKE_BINARY_DIR}/output # 共享路徑 ) # 輸出結構 # output/ # ├── include/ # │ ├── es_math/ # │ └── es_nn/ # ├── lib64/ # │ ├── libes_math.so, libes_math.a # │ └── libes_nn.so, libes_nn.a # └── whl/ # ├── es_math-1.0.0-py3-none-any.whl # └── es_nn-1.0.0-py3-none-any.whlQgen_esb 找不到怎么辦A: 函數會自動查找 gen_esb如果失敗請檢查確認已安裝 CANN run 包執(zhí)行source ${ASCEND_HOME_PATH}/set_env.sh或者設置了正確的CMAKE_MODULE_PATHgen_esb 會從 PATH 環(huán)境變量或者從 cmake 文件路徑自動推導函數會輸出詳細的檢測信息根據日志排查問題。完整示例# 基礎設置 cmake_minimum_required(VERSION 3.16) project(my_es_project LANGUAGES CXX) # 引入函數推薦使用 find_package list(APPEND CMAKE_MODULE_PATH ${ASCEND_HOME_PATH}/include/ge/cmake) find_package(GenerateEsPackage REQUIRED) # 第一部分: 前置要求定義原型庫 add_library(opgraph_math SHARED ) # 第二部分: 生成 ES API 包 add_es_library_and_whl( ES_LINKABLE_AND_ALL_TARGET es_math OPP_PROTO_TARGET opgraph_math OUTPUT_PATH ${CMAKE_BINARY_DIR}/output ) # 第三部分: 在應用中使用 add_executable(my_app src/main.cpp src/inference.cpp ) # 鏈接ES_LINKABLE_AND_ALL_TARGET target_link_libraries(my_app PRIVATE es_math # 自動獲得依賴、頭文件和庫 )構建命令# 只需一條命令 make my_app【免費下載鏈接】geGEGraph Engine是面向昇騰的圖編譯器和執(zhí)行器提供了計算圖優(yōu)化、多流并行、內存復用和模型下沉等技術手段加速模型執(zhí)行效率減少模型內存占用。 GE 提供對 PyTorch、TensorFlow 前端的友好接入能力并同時支持 onnx、pb 等主流模型格式的解析與編譯。項目地址: https://gitcode.com/cann/ge創(chuàng)作聲明:本文部分內容由AI輔助生成(AIGC),僅供參考