官方文档:https://tensorflow.google.cn/lite/performance/gpu?hl=zh_cn
TF LITE支持移动端GPU加速,特别对android端的支持比较丰富。相对android来说,对IOS的支持就有点差了。从给出的文档也能看出,android的文档也比IOS的丰富。
TF LITE明确只支持android和ios端,而且在不同的系统上会有不同表现。即便是可以用GPU,也有可能是部分操作可以应用GPU加速,部分依旧在CPU上,这要看具体系统对GPU操作的支持。TF LITE在运行时会给出log
引用官方的解释:
不支持的模型和 ops
如果一些 ops 并不支持 GPU 代理,框架只会在 GPU 上运行图形的一部分,剩下的部分会在 CPU 上运行。因为这会导致 CPU/GPU 同时出现很高的使用率,像这样的分开执行模式会导致运行起来比整个网络在 CPU 上运行要慢。在这种情况下,用户会收到一个像这样的警告:
WARNING: op code #42 cannot be handled by this delegate.
警告:此代理无法处理#42操作码
我们没有为这种失败提供回调,因为这不是真的运行错误,但是这个错误是开发者可以注意到的,他们可以尝试将整个网络在代理上运行。
TF LITE采用代理的方法为个平台提供GPU的支持,而且在android和IOS上使用的是不同的delegate。
下面的代码帮助屏蔽了不同平台对GPU代理的使用方法:
std::unique_ptr<tflite::FlatBufferModel> model_ = tflite::FlatBufferModel::BuildFromFile(modelPath.c_str());
if (!model_) {
throw "build model error!";
}
tflite::ops::builtin::BuiltinOpResolver resolver;
tflite::InterpreterBuilder(*model_, resolver)(&interpreter_);
if (gpuMode)
{
#if defined(__APPLE__) && TARGET_OS_IPHONE
auto option = TFLGpuDelegateOptionsDefault();
option.allow_precision_loss = true;
option.enable_quantization = true;
option.wait_type = TFLGpuDelegateWaitTypeAggressive;
delegate_ = TFLGpuDelegateCreate(&option);
#endif
#if defined(__ANDROID__)
auto option = TfLiteGpuDelegateOptionsV2Default();
option.inference_priority1 = TfLiteGpuInferencePriority::TFLITE_GPU_INFERENCE_PRIORITY_MIN_LATENCY;
delegate_ = TfLiteGpuDelegateV2Create(&option);
#endif
if (delegate_)
{
if (kTfLiteOk != interpreter_->ModifyGraphWithDelegate(delegate_))
{
throw ("set gpu delegate failed, tensor create failed!");
}
}
else
{
std::cout << "GPU acceleration is unsupported on this platform, use CPU mode.";
}
}
if (!delegate_)
{
if (kTfLiteOk != interpreter_->AllocateTensors())
{
throw ("tensor create failed!");
}
}
代理使用完之后需要手动删除:
#if defined(__ANDROID__)
TfLiteGpuDelegateV2Delete(delegate_);
#endif
#if defined(__APPLE__) && TARGET_OS_IPHONE
TFLGpuDelegateDelete(delegate_);
#endif
其他调用与不使用代理相同
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)