You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.13 22:02:12