TensorFlow C API如何使用tensorflow_text?加载MuRIL模型遇报错
解决TensorFlow C API加载依赖tensorflow_text模型的问题
你的错误根源是RegexSplitWithOffsets属于tensorflow_text提供的自定义操作,而TensorFlow C API默认仅包含核心TensorFlow操作,官方并未提供预编译的tensorflow_text C库,因此需要自行编译tensorflow_text扩展库并在C代码中加载。
一、编译tensorflow_text共享库
1. 准备依赖
- 安装Bazel构建工具(版本需匹配tensorflow_text对应TensorFlow版本的要求)
- 确保Python环境已安装与TensorFlow C库完全同版本的
tensorflow和tensorflow_text - 安装Git
2. 克隆并切换对应版本的tensorflow_text源码
git clone https://github.com/tensorflow/text.git cd text # 切换到与你的TensorFlow C库版本匹配的分支,例如TensorFlow 2.15对应v2.15.0 git checkout v2.15.0
3. 编译动态链接库
使用Bazel编译生成包含自定义操作的共享库:
# 编译单个RegexSplit相关操作库 bazel build //tensorflow_text/core/kernels:regex_split_ops.so # 或编译全量tensorflow_text操作库 bazel build //tensorflow_text:tensorflow_text.so
编译完成后,可在bazel-bin/tensorflow_text/或对应子目录下找到生成的.so文件。
二、修改C代码加载tensorflow_text库
在加载模型前,需先动态加载编译好的tensorflow_text共享库,注册其中的自定义操作:
#include <stdio.h> #include <tensorflow/c/c_api.h> #include <dlfcn.h> // 用于动态加载共享库 TF_Status* status; TF_SessionOptions* preprocess_opts; TF_Graph* preprocess_graph; TF_Session* preprocess_sess; TF_SessionOptions* muril_opts; TF_Graph* muril_graph; TF_Session* muril_sess; int load_models() { // 加载tensorflow_text共享库 void* tf_text_lib = dlopen("./tensorflow_text.so", RTLD_NOW); if (!tf_text_lib) { printf("Failed to load tensorflow_text library: %s\n", dlerror()); return 1; } // 创建状态对象 status = TF_NewStatus(); // 模型加载标签 const char* tags[] = {"serve"}; // 加载预处理器模型 char* preprocess_model_path = "./preprocess"; preprocess_graph = TF_NewGraph(); preprocess_opts = TF_NewSessionOptions(); preprocess_sess = TF_LoadSessionFromSavedModel(preprocess_opts, NULL, preprocess_model_path, tags, 1, preprocess_graph, NULL, status); if (TF_GetCode(status) != TF_OK) { printf("Error loading preprocess model: %s\n", TF_Message(status)); return 1; } // 加载MuRIL主模型 char* muril_model_path = "./muril"; muril_graph = TF_NewGraph(); muril_opts = TF_NewSessionOptions(); muril_sess = TF_LoadSessionFromSavedModel(muril_opts, NULL, muril_model_path, tags, 1, muril_graph, NULL, status); if (TF_GetCode(status) != TF_OK) { printf("Error loading muril model: %s\n", TF_Message(status)); return 1; } return 0; }
三、编译并运行C程序
编译时需链接TensorFlow库和动态加载库:
gcc -o muril_infer muril_infer.c -ltensorflow -ldl
运行时确保tensorflow_text的.so文件在库搜索路径中,或通过环境变量指定:
LD_LIBRARY_PATH=/path/to/tensorflow_text/lib:$LD_LIBRARY_PATH ./muril_infer
关键注意事项
- 版本严格匹配:tensorflow_text的版本必须与TensorFlow C库版本完全一致,否则会出现兼容性错误。
- 若编译时遇到依赖问题,需根据系统环境调整Bazel配置参数,可参考tensorflow_text源码中的编译说明。
替代方案
若不想编译tensorflow_text库,可在Python中将预处理器模型转换为冻结图,并将tensorflow_text的自定义操作替换为纯TensorFlow核心操作,但此方法需重写预处理逻辑,复杂度较高,仅适合简单场景。
内容的提问来源于stack exchange,提问作者user29961125
相关产品推荐
相关产品推荐

