RegisterCallBackFunc 一次讲透:GE 回调注册机制解析与接入指南
2026/9/5 20:54:09 网站建设 项目流程

RegisterCallBackFunc 一次讲透:GE 回调注册机制解析与接入指南

【免费下载链接】awesome-design-systems💅🏻 ⚒ A collection of awesome design systems项目地址: https://gitcode.com/GitHub_Trending/aw/awesome-design-systems

RegisterCallBackFunc 是 GE 的回调注册接口:你提交给 GE 的计算图里如果带有 Summary 或 Checkpoint 算子,就需要靠这次 GE 回调函数注册来告诉引擎“执行完该调我哪个函数”。做模型断点续训的 checkpoint 保存、执行完导出 Summary 文件,都会碰到它。

先搞懂它解决什么问题

GE(图执行引擎,负责跑你提交的计算图)执行图时会遇到一类特殊节点:它们本身不算数,而是要“把图里的张量状态交给外部程序处理”,比如 Checkpoint 要把状态写盘。这类文件 IO 与业务逻辑,放在你自己的程序里比放在引擎里合理得多。所以 GE 的设计是:图执行过程中出现这类节点后,引擎按你预先注册的关键字找到回调函数,把张量数据传过去,由你完成动作。

整条链路三步走:先调 RegisterCallBackFunc 按 key 注册 → 提交带 Summary/Checkpoint 算子的图 → 图执行完后,GE 回调你的函数并传入张量集合。

接入准备:头文件与链接

  • 头文件:#include <ge/ge_api.h>
  • 动态库:libge_runner.so,CMake 里加 include 目录后链接-lge_runner即可
  • 版本兼容:接口在各版本 GE 中均可用,但std::string版 key 的重载后续会废弃,新代码建议直接用AscendString版(见后文迁移部分)

函数签名与核心类型

下面这段原型展示了两个重载,区别只在 key 的类型(string 与字符数组),key 决定这类回调被哪种算子触发,只有 "Summary" 和 "Save" 两个合法值:

Status RegisterCallBackFunc(const std::string &key, const pCallBackFunc &callback); Status RegisterCallBackFunc(const char *key, const session::pCallBackFunc &callback);

回调函数是一个函数指针,两种 key 类型对应的参数容器不同:

// key 为 std::string 时的参数容器 typedef uint32_t (*pCallBackFunc)(uint32_t graph_id, const std::map<std::string, ge::Tensor> &params_list); // key 为 AscendString 时的参数容器(非 string,推荐使用) typedef uint32_t (*pCallBackFunc)(uint32_t graph_id, const std::map<AscendString, ge::Tensor> &params_list);

人话版:graph_id(标识当前执行的是哪张图)让你在多图场景下区分这次回调属于哪张图;params_list是 GE 回传的张量集,"Save" 场景下就是等待写入 checkpoint 的状态数据;返回值uint32_t是回调函数自己的状态码。

一行典型调用长这样:

ge::RegisterCallBackFunc("Save", MyCheckpointCb); // MyCheckpointCb 签名符合 pCallBackFunc

参数与返回值速查

pCallBackFunc 的参数含义与整接口返回值合并在这一张表里:

名称类型方向说明常见取值
keystd::string / const char *输入回调类型关键字,对应哪类算子触发哪类回调"Summary"(摘要导出)、"Save"(断点保存)
callbackpCallBackFunc输入回调函数指针,签名须与 typedef 完全一致你自己实现的函数

返回值Status三种情况:

  • SUCCESS:注册成功
  • GE_SESSION_MANAGER_NOT_INIT:Session 管理未初始化,先完成 Session 初始化再注册
  • FAILED:注册失败,检查 key 是否合法、函数指针是否有效

容易踩的坑

[!WARNING] 这几条限制在报错信息里体现得不直接,注册前先过一遍。

⚠️不注册就下发图会直接报错。图里带了 Summary 或 Checkpoint 算子却没注册对应回调,执行会失败。正确做法:引擎初始化阶段就注册好,再提交图。

⚠️目前只支持图执行完后一次性回调。不是每走到一个节点就触发一次,"每经过一个 Checkpoint 就增量写一次盘"的思路行不通。正确做法:把保存逻辑整体放进回调函数里一次做完。

key 只支持 "Summary" 和 "Save"。传别的字符串不会注册成功。正确做法:只按这两个字面量传参。

回调函数内部出错时把状态码非 0 返回,让 GE 能感知这次回调没执行成功。

版本演进与替代建议

[!NOTE] 数据类型为 string 的接口后续版本会废弃,建议直接用非 string 类型的接口。

两个重载当前都能用,但std::string &key版已在废弃路线上,AscendString版(昇腾自研字符串类型,减少拷贝)才是长期方向。存量代码迁移就改一行:ge::RegisterCallBackFunc(AscendString("Save"), MyCheckpointCb);

【免费下载链接】awesome-design-systems💅🏻 ⚒ A collection of awesome design systems项目地址: https://gitcode.com/GitHub_Trending/aw/awesome-design-systems

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询