首页
/ TensorFlow Lite 如何启用 XNNPack delegate 加速 CPU 推理?

TensorFlow Lite 如何启用 XNNPack delegate 加速 CPU 推理?

2026-09-08 16:23:00作者:晏闻田Solitary

在 TensorFlow Lite 中跑浮点模型时,默认走的是 CPU 内核。如果希望在同一个 TFLite 模型上把 CPU 推理换到 XNNPACK 这个针对 ARM、x86 和 WebAssembly 优化过的推理引擎上执行,就需要按平台选择对应的启用方式:Android 和 iOS 的预构建二进制(nightly AAR、CocoaPods)已经内置 XNNPACK,但默认是关闭的,通过 Interpreter.Options 一行配置即可打开;桌面端则需要通过 Bazel 构建参数或额外链接依赖来启用。本文按平台给出启用步骤,并说明如何用官方 benchmark 工具验证是否生效。

XNNPACK 通过 delegation 机制接入 TensorFlow Lite 解释器,主要面向浮点推理。XNNPACK 官方说明文档列出了全部启用方式,下面按推荐程度组织。

Android:通过 Java API 启用(Android 推荐方式)

前提:使用官方 nightly 预构建的 TensorFlow Lite Android 二进制(AAR),其中已包含 XNNPACK,只是默认不启用。在创建 Interpreter 时,对 Interpreter.Options 调用 setUseXNNPACK

Interpreter.Options interpreterOptions = new Interpreter.Options();
interpreterOptions.setUseXNNPACK(true);
Interpreter interpreter = new Interpreter(model, interpreterOptions);

代码中的 model 是加载好的模型,需替换为你自己的模型对象。启用后,模型中受支持的算子会交给 XNNPACK 执行,不受支持的算子回退到默认 CPU 实现。

iOS:通过 Swift 或 Objective-C API 启用(iOS 推荐方式)

前提:使用官方 nightly 预构建的 TensorFlow Lite CocoaPods,其中已包含 XNNPACK,默认不启用。

Swift:

var options = InterpreterOptions()
options.isXNNPackEnabled = true
var interpreter = try Interpreter(modelPath: "model/path", options: options)

Objective-C:

TFLInterpreterOptions *options = [[TFLInterpreterOptions alloc] init];
options.useXNNPACK = YES;
NSError *error;
TFLInterpreter *interpreter =
    [[TFLInterpreter alloc] initWithModelPath:@"model/path"
                                      options:options
                                        error:&error];

示例中的 model/path 是文档给出的占位路径,需替换为你实际的 .tflite 模型文件路径。

桌面端:通过 Bazel 构建参数启用

如果你在 Linux、Mac 或 Windows 上用 Bazel 从源码构建 TensorFlow Lite,添加 --define tflite_with_xnnpack=true,解释器就会默认使用 XNNPACK 引擎。文档以构建 Android AAR 为例给出的命令是:

bazel build -c opt --fat_apk_cpu=x86,x86_64,arm64-v8a,armeabi-v7a \
  --host_crosstool_top=@bazel_tools//tools/cpp:toolchain \
  --define android_dexmerger_tool=d8_dexmerger \
  --define android_incremental_dexing_tool=d8_dexbuilder \
  --define tflite_with_xnnpack=true \
  //tensorflow/lite/java:tensorflow-lite

其中 --fat_apk_cpu、交叉编译相关参数取决于你的目标平台,可按需调整;核心是 --define tflite_with_xnnpack=true 这一行。

这种方式有一个需要注意的限制:

  • Interpreter::SetNumThreads 对 XNNPACK 引擎使用的线程数不生效。XNNPACK 默认只用单线程做推理,需要多线程时要通过 InterpreterBuilder 构造解释器时手动传入线程数:
// Load model
tflite::Model* model;
...

// Construct the interprepter
tflite::ops::builtin::BuiltinOpResolver resolver;
std::unique_ptr<tflite::Interpreter> interpreter;

TfLiteStatus res = tflite::InterpreterBuilder(model, resolver, num_threads);

另一种桌面端方案是“额外依赖”方式:构建并链接 //tensorflow/lite:tflite_with_xnnpack 目标到你的应用中,与 TensorFlow Lite 框架一起编译。此方式适用于支持 POSIX 风格弱符号的平台(Android、iOS、Linux、Mac,不支持 Windows)。

低层 delegate API(一般不推荐)

只有在需要“有 XNNPACK 与无 XNNPACK”两种配置并存(例如做对比基准测试)时,才建议直接使用低层 delegate API。典型调用顺序:

// Build the interpreter
std::unique_ptr<tflite::Interpreter> interpreter;
...

// IMPORTANT: initialize options with TfLiteXNNPackDelegateOptionsDefault() for
// API-compatibility with future extensions of the TfLiteXNNPackDelegateOptions
// structure.
TfLiteXNNPackDelegateOptions xnnpack_options =
    TfLiteXNNPackDelegateOptionsDefault();
xnnpack_options.num_threads = num_threads;

TfLiteDelegate* xnnpack_delegate =
    TfLiteXNNPackDelegateCreate(&xnnpack_options);
if (interpreter->ModifyGraphWithDelegate(xnnpack_delegate) != kTfLiteOk) {
  // Report error and fall back to another delegate, or the default backend
}

// IMPORTANT: AllocateTensors can be called only AFTER ModifyGraphWithDelegate
...
// Run inference using XNNPACK
interpreter->Invoke()
...
// IMPORTANT: release the interpreter before destroying the delegate
interpreter.reset();
TfLiteXNNPackDelegateDelete(xnnpack_delegate);

顺序上有两个硬性约束:AllocateTensors 必须在 ModifyGraphWithDelegate 之后调用;释放解释器之后才能调用 TfLiteXNNPackDelegateDelete 销毁 delegate。

验证 XNNPACK 是否生效以及收益

启用之后,建议用官方 benchmark 工具对比确认。性能测量文档说明 benchmark 工具(Android 上是 benchmark_model app,也提供 Linux/Mac/嵌入式/Android 的原生二进制 benchmark_model)支持 use_xnnpack 参数,bool 类型,默认 false

以 Android app 为例,完整流程是:

adb install -r -d -g android_aarch64_benchmark_model.apk
adb push your_model.tflite /data/local/tmp

这两条命令会向已连接的 Android 设备安装 benchmark app,并把你自己的 .tflite 模型推送到设备 /data/local/tmp 目录。随后启动 app 并传入参数:

adb shell am start -S \
  -n org.tensorflow.lite.benchmark/.BenchmarkModelActivity \
  --es args '"--graph=/data/local/tmp/your_model.tflite \
              --num_threads=4"'

要对比 XNNPACK 效果,在 --graph 参数基础上追加 --use_xnnpack=true(参数列表见 measurement.md)。结果通过 logcat 查看:

adb logcat | grep "Inference timings"

文档给出的示例输出(文档示例,数值仅用于说明格式,不要当作固定预期):

... tflite  : Inference timings in us: Init: 5685, First inference: 18535, Warmup (avg): 14462.3, Inference (avg): 14575.2

判断方式:分别用 --use_xnnpack=false(默认)和 --use_xnnpack=true 各跑一次,比较两次输出中的 Inference (avg)Init 数值,即为开启 XNNPACK 前后的延迟对比。Delegates 文档也提醒:各 delegate 支持的算子集合是预定义的,表现因模型和设备而异,benchmarking 是确认 delegate 是否值得启用的标准做法——同时也解释了引入 delegate 带来的二进制体积增加是否划算。

限制与边界

  • 算子支持有限且会回退:XNNPACK 支持的算子列表见 README 的 “Limitations and supported operators” 一节(FP32 算子、FP16 算子和量化算子分开列出)。不支持的算子回退到默认实现,因此混合模型仍能部分受益。
  • 量化推理默认关闭:XNNPACK 默认只服务浮点模型。要启用量化推理,构建时需额外加 --define tflite_with_xnnpack_qs8=true(符号化量化 schema,适用于 Model Optimization Toolkit 的后训练整数量化或量化感知训练;后训练动态范围量化不受支持)或 --define tflite_with_xnnpack_qu8=true(无符号量化 schema,实验性选项)。
  • FP16 推理自动启用有条件:硬件需原生支持 ARMv8.2 FP16 算术(Pixel 3 及以后、Galaxy S9 Snapdragon SoC、A11 及更新的 iOS 设备等),且模型元数据 reduced_precision_support 声明兼容 FP16(转换模型时通过 tf.lite.TargetSpec_experimental_supported_accumulation_type 属性设置)。条件不满足时按 FP32 执行。
  • Windows 注意:额外依赖方式(链接 tflite_with_xnnpack 目标)不支持 Windows。
  • 权重缓存是可选优化:同一模型创建多个解释器实例时,可把打包后的静态权重写入权重缓存文件(设置 xnnpack_options.weight_cache_file_path),文档说明这可以带来显著的初始化加速和内存节省;缓存不能跨模型或硬件架构共享,模型更新后删除旧缓存文件由用户负责。

下一步

  • 如果 benchmark 显示收益符合预期,再评估是否叠加权重缓存、强制 FP16(TFLITE_XNNPACK_DELEGATE_FLAG_FORCE_FP16,文档标注该选项面向开发工作流和精度测试)等进阶选项,细节都在 XNNPACK README 中。
  • 如果你的目标设备是 Android 8.1+ 或带专用加速器的平台,可对照 Delegates 选择文档中的平台/模型类型对照表,确认 XNNPACK 与 GPU、NNAPI、Core ML 等 delegate 相比是否是当前模型类型下的合理选择。
登录后查看全文
热门项目推荐
相关项目推荐

项目优选

收起
kernelkernel
deepin linux kernel
C
33
18
ops-transformerops-transformer
本项目是CANN提供的transformer类大模型算子库,实现网络在NPU上加速计算。
C++
1.14 K
2.75 K
pytorchpytorch
作为 Ascend for PyTorch 社区的核心组件,TorchNPU 是昇腾专为 PyTorch 打造的深度学习适配插件,使 PyTorch 框架能够直接调用昇腾 NPU,为开发者提供昇腾 AI 处理器的超强算力。
Python
857
1.35 K
docsdocs
暂无描述
Markdown
898
5.82 K
ops-nnops-nn
本项目是CANN提供的神经网络类计算算子库,实现网络在NPU上加速计算。
C++
921
1.84 K
jiuwenswarmjiuwenswarm
JiuwenSwarm 是一款基于openJiuwen开发的智能AI Agent,它能够将大语言模型的强大能力,通过你日常使用的各类通讯应用,直接延伸至你的指尖。
Python
3.8 K
1.02 K
kernelkernel
openEuler内核是openEuler操作系统的核心,既是系统性能与稳定性的基石,也是连接处理器、设备与服务的桥梁。
C
531
596
cann-learning-hubcann-learning-hub
CANN 学习中心仓,支持在线互动运行、边学边练,提供教程、示例与优化方案,一站式助力昇腾开发者快速上手。
Jupyter Notebook
1.02 K
519
ops-mathops-math
本项目是CANN提供的数学类基础计算算子库,实现网络在NPU上加速计算。
C++
1.36 K
1.46 K
AscendNPU-IRAscendNPU-IR
AscendNPU-IR是基于MLIR(Multi-Level Intermediate Representation)构建的,面向昇腾亲和算子编译时使用的中间表示,提供昇腾完备表达能力,通过编译优化提升昇腾AI处理器计算效率,支持通过生态框架使能昇腾AI处理器与深度调优
C++
548
391