为什么要支持GPU?
虽然移动设备的处理能力和功率都有限。虽然TensorFlow Lite提供了不少的加速途径,比如将机器学习模型转换成定点模型,但总是会在模型的性能或精度上做出让步。
而将GPU作为加速原始浮点模型的一种选择,不会增加量化的额外复杂性和潜在的精度损失。
随着 TensorFlow Lite GPU 后端开发者预览版的发布,将能够利用移动 GPU 来选择模型训练 (如下所示),对于不支持的部分,将自动使用 CPU 进行推理。
新的后端利用了:
目前 TensorFlow Lite 仍使用 CPU 浮点推断进行人脸轮廓检测 (非人脸识别)。未来会利用新的 GPU 后端,可以将 Pixel 3 和三星 S9 的推理速度提升 4~6 倍。
GPU 与 CPU 性能
在Pixel 3的人像模式(Portrait mode)中,与使用CPU相比,使用GPU的Tensorflow Lite,用于抠图/背景虚化的前景-背景分隔模型加速了4倍以上。新深度估计(depth estimation)模型加速了10倍以上。
在能够为视频增加文字、滤镜等特效的YouTube Stories和谷歌的相机AR功能Playground Stickers中,实时视频分割模型在各种手机上的速度提高了5-10倍。
对于不同的深度神经网络模型,使用新GPU后端,通常比浮点CPU快2-7倍。对4个公开模型和2个谷歌内部模型进行基准测试的效果如下:
公共模型:
Google 专有用例:
在更加复杂的神经网络模型上 GPU 加速效果最显著,这些模型本身更有利于 GPU 的利用,例如密集的预测 / 分割或分类任务。在小型模型中,加速效果效果可能略差,但 CPU 的使用可以降低内存传输固有的延迟成本。
如何使用?
以 Android 为例,谷歌已经准备了一个完整的 Android 存档 ( AAR ),包括带有 GPU 后端的 TensorFlow Lite。编辑 gradle 文件替换当前版本,以包含这个 AAR,并将此代码片段添加到 Java 初始化代码中。
import org.tensorflow.lite.Interpreter;
import org.tensorflow.lite.experimental.GpuDelegate;
// Initialize interpreter with GPU delegate
GpuDelegate delegate = new GpuDelegate();
Interpreter.Options options = (new Interpreter.Options()).addDelegate(delegate);
Interpreter interpreter = new Interpreter(model, options);
// Run inference
while (true) {
writeToInput(input);
interpreter.run(input, output);
readFromOutput(output);
}
// Clean up
delegate.close();
如何加速?
在推断每个输入时:
为了获得最佳体验,我们建议优化输入 / 输出张量复制和 / 或网络架构。有关此类优化的详细信息,可以在 TensorFlow Lite GPU 文档中找到。