如何解决在 TensorflowLite 中,OpenCL 委托产生较大的数值误差
我将模型从 Keras 转换为 Tensorflow Lite,并尝试在 Ubuntu 18.04 和 Android 11(在基于 Qualcomm 的三星 Galaxy S20 上),仅 CPU 上运行该模型。在这两种情况下,我都得到了与原始 Keras 模型几乎相同的结果。
但是,当我尝试使用 OpenCL 委托时,我得到了错误的结果。在 Ubuntu(使用 CUDA SDK 提供的 NVidia GPU 和 OpenCL 库)上,结果存在较大的数值误差。例如,我期望得到 [-0.00202503,0.410477,0.0156457,0.937922,-0.00748677,...],而我得到的是 [-0.00182705,0.36573706.2,80.96.2,80.96.28.80-80.00.00748677,...]在 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 激活层是否存在任何已知问题?有什么解决办法吗?
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。