
RegisterCallBackFunc 一次讲透GE 回调注册机制解析与接入指南【免费下载链接】awesome-design-systems ⚒ A collection of awesome design systems项目地址: https://gitcode.com/GitHub_Trending/aw/awesome-design-systemsRegisterCallBackFunc 是 GE 的回调注册接口你提交给 GE 的计算图里如果带有 Summary 或 Checkpoint 算子就需要靠这次 GE 回调函数注册来告诉引擎“执行完该调我哪个函数”。做模型断点续训的 checkpoint 保存、执行完导出 Summary 文件都会碰到它。先搞懂它解决什么问题GE图执行引擎负责跑你提交的计算图执行图时会遇到一类特殊节点它们本身不算数而是要“把图里的张量状态交给外部程序处理”比如 Checkpoint 要把状态写盘。这类文件 IO 与业务逻辑放在你自己的程序里比放在引擎里合理得多。所以 GE 的设计是图执行过程中出现这类节点后引擎按你预先注册的关键字找到回调函数把张量数据传过去由你完成动作。整条链路三步走先调 RegisterCallBackFunc 按 key 注册 → 提交带 Summary/Checkpoint 算子的图 → 图执行完后GE 回调你的函数并传入张量集合。接入准备头文件与链接头文件#include ge/ge_api.h动态库libge_runner.soCMake 里加 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::mapstd::string, ge::Tensor params_list); // key 为 AscendString 时的参数容器非 string推荐使用 typedef uint32_t (*pCallBackFunc)(uint32_t graph_id, const std::mapAscendString, 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_INITSession 管理未初始化先完成 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),仅供参考