【发布时间】:2021-01-15 01:56:27
【问题描述】:
我将模型从 Keras 转换为 Tensorflow Lite,并尝试在 Ubuntu 18.04 和 Android 11(基于高通的三星 Galaxy S20)上运行该模型,仅 CPU。在这两种情况下,我得到的结果与原始 Keras 模型几乎相同。
但是,当我尝试使用 OpenCL 委托时,我得到了不正确的结果。在 Ubuntu(使用 CUDA SDK 提供的 NVidia GPU 和 OpenCL 库)上,结果呈现出较大的数值错误。例如,我期望得到 [-0.00202503, 0.410477, 0.0156457, 0.937922, -0.00748677, ...],但我得到了 [-0.00182705, 0.36573794, 0.01720826, 0.926801, 7.88331e]。在 Qualcomm Snapdragon 上,我会得到所有的 nan。
我怀疑这个问题可能与 FP16 精度计算有关。我尝试通过以下方式禁用 FP16:
TfLiteGpuDelegateOptionsV2 options;
options.is_precision_loss_allowed = 0;
options.inference_preference = TFLITE_GPU_INFERENCE_PREFERENCE_FAST_SINGLE_ANSWER;
options.inference_priority1 = TFLITE_GPU_INFERENCE_PRIORITY_MIN_LATENCY;
options.inference_priority2 = TFLITE_GPU_INFERENCE_PRIORITY_MAX_PRECISION;
options.inference_priority3 = TFLITE_GPU_INFERENCE_PRIORITY_MIN_MEMORY_USAGE;
options.experimental_flags = TFLITE_GPU_EXPERIMENTAL_FLAGS_CL_ONLY;
auto* delegate = TfLiteGpuDelegateV2Create(&options);
但我没有注意到将is_precision_loss_allowed 设置为零或非零对输出有任何影响。这不是在 GPU 委托中控制计算精度的正确方法吗?
我怀疑的另一件事是,在我的模型末尾有一些 tanh 和 sigmoid 激活(除此之外,我的模型仅包含完全连接、批量规范和元素加法/乘法)。在第一次 tanh 激活之前,我在该层达到峰值,该层的输出仍然非常接近(在数值精度内)我的预期。 GPU 委托中的 tanh 或 sigmoid 激活层是否存在任何已知问题?有什么解决办法吗?
【问题讨论】:
-
我强烈建议在 TensorFlow Github repo 上发布问题。过去,我曾在 Hexagon Delegate 中遇到过数字错误。分享我的问题后:github.com/tensorflow/tensorflow/issues/36927 我的问题在几天内得到解决。
标签: tensorflow opencl tensorflow-lite