ARTICLE DETAIL

资讯详情

深耕网站建设、视觉设计与SEO优化的一线实战洞察。

MediaPipe 图运行报 No registered calculator found 怎么排查?

MediaPipe 图运行报 No registered calculator found 怎么排查? MediaPipe 图运行报 No registered calculator found 怎么排查【免费下载链接】mediapipeCross-platform, customizable ML solutions for live and streaming media.项目地址: https://gitcode.com/GitHub_Trending/med/mediapipe在 MediaPipe 中用 Bazel 或 Python 组装 calculator graph 时如果图配置里引用了一个运行环境中找不到的 calculator图初始化会直接失败日志中出现No registered object with name: OurNewCalculator; Unable to find Calculator OurNewCalculator这是 Troubleshooting 文档中 No registered calculator found 一节描述的错误。它发生在 C 应用链接完、运行期加载CalculatorGraphConfig的阶段意味着图配置里的 calculator 名没有出现在运行时注册表中。排查的核心只有一条主线确认这个 calculator 的库是否真的被链接进了当前应用二进制以及图里写的是否是注册时使用的完整名称。先理解错误从哪里来MediaPipe 的图不直接引用 calculator 的 C 类型而是通过CalculatorGraphConfig::Node的calculator字段按名字查找。calculator 库被链接进应用二进制后会由 REGISTER_CALCULATOR 宏 自动按名字完成注册注册表实现在 registration.h。两个报错片段分别来自框架中的两处代码No registered object with name: ...注册表按名字查不到工厂函数时返回的NotFoundError见 registration.h 中FunctionRegistry::Invoke约第 218-221 行Unable to find Calculator ...图校验阶段调用CalculatorBaseRegistry::CreateByNameInNamespace失败时拼接的前缀见 validated_graph_config.cc。所以这个错误的特征是编译、链接都能通过只有在运行期真正实例化图里的某个节点时才暴露——calculator 的注册代码没有被带进最终二进制是首要怀疑对象。排查路径1. 检查 calculator 的库是否加进了应用目标的依赖按文档说明当你把一个新 calculator 加入 calculator graph 时必须同时把它作为构建依赖加到使用这张图的应用目标上。如果应用cc_binary/cc_test的deps里没有对应 calculator 的 Bazel target或间接依赖不到它链接出来的二进制里就没有它的注册静态变量运行期必然报这个错。对照仓库里现成的写法calculators/core/BUILD 中end_item_loop_calculator这样的cc_library目标图配置引用它之前使用方的目标必须先依赖它。2. 自建 calculator确认 BUILD 目标带 alwayslink True如果你自己写了这个 calculator文档明确要求在其 BUILD target 上加alwayslink True示例如下cc_library( name our_new_calculator, srcs [our_new_calculator.cc], deps [ ... ], alwayslink True, )原因是注册发生在静态初始化代码里这些符号不会被应用代码直接引用链接器在优化时可能把整个翻译单元连同注册裁掉。alwayslink True强制链接器保留整个库。文档同时指出缺了这一项时 calculator including the registration, may get removed by the linker。仓库中mediapipe/calculators/core/BUILD的多处 calculator target如第 273、289 行的begin_item_loop_calculator、end_item_loop_calculator都带有该属性可参照这些 target 的srcs与deps组织方式核对自建目标。3. 核对图里写的名字与注册时的命名空间前缀文档还给了一个容易漏掉的点REGISTER_CALCULATOR可以带命名空间前缀注册 calculator前缀与其 C namespace 相同。这种情况下calculator graph 中calculator字段也必须使用同样的命名空间前缀。核对方式在报错日志里取出No registered object with name:后面的完整名字与 calculator 源码中的 C namespace、以及注册宏里传入的名字比对确保图配置里的calculator字段与注册名完全一致包括前缀。验证方式复现错误并确认修复仓库的 Python 测试 calculator_graph_test.py 展示了如何精确复现这个错误在图配置里引用一个未注册的 calculator 名构造图时就会得到对应报错text_config node { calculator: SomeUnknownCalculator input_stream: in output_stream: out } config_proto calculator_pb2.CalculatorGraphConfig() text_format.Parse(text_config, config_proto) with self.assertRaisesRegex( RuntimeError, Unable to find Calculator \SomeUnknownCalculator\): CalculatorGraph(graph_configconfig_proto)也就是说用测试里同一个未注册的名字可以稳定复现该错误。修复补依赖、加alwayslink True、改正名字后重新构建并运行同一份图配置初始化时不再出现Unable to find Calculator报错即为验证通过。如果问题出现在 iOS SPM 打包场景仓库里的 MediaPipeTasksSPMSmokeTest 正是针对calculator 被裁掉这类问题的冒烟测试它用不存在的模型路径构造任务期望在模型加载阶段报 error code 3InvalidArgumentError或 5NotFoundError——这说明 C calculator 已注册、图初始化走到了加载模型一步而 calculator 被剥离时则报 code 2Unknown或 9FailedPrecondition。可以按同样的思路判断 SPM 产物里注册代码是否完整。需要排除的另一类根因静态注册被整体禁用registration.h 头部注释说明定义MEDIAPIPE_DISABLE_STATIC_REGISTRATION会禁用所有基于REGISTER_FACTORY_FUNCTION_QUALIFIED等宏的静态注册calculator 是受影响对象之一——此时即使依赖和alwayslink都正确运行期同样查不到 calculator。该头文件同时提供了MEDIAPIPE_ENABLE_STATIC_REGISTRATION_DRY_RUN以 Dry-Run 模式构建会打印本应执行的注册语句用于在禁用静态注册时核对需要手动补注册的名字。如果你的构建系统如某些精简打包流程定义过这些宏先确认它们的状态再回到前面的依赖与alwayslink检查。排查顺序建议为先比对错误中的完整名字与注册名第 3 条成本最低再检查应用依赖与alwayslink True最后确认构建没有禁用静态注册。【免费下载链接】mediapipeCross-platform, customizable ML solutions for live and streaming media.项目地址: https://gitcode.com/GitHub_Trending/med/mediapipe创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表