YOLOv8 在 Mali-G720 Vulkan GPU 上的检测结果(CPU 的结果是正确的)
作者: taiji1985创建于 2026年7月12日更新于 2026年9月15日
Mali-G720 Vulkan GPU 上的 YOLOv8 检测结果不准确(CPU 结果正确)
环境
- 设备: Xiaomi M531DA
- SoC: MediaTek MT6899
- GPU: ARM Mali-G720 MC8
- Vulkan:
ro.hardware.vulkan=mali - GLES: OpenGL ES 3.2(Mali-G720 MC8,驱动
v1.r49p1-...) - 操作系统: Android 16
- 应用程序 ABI: arm64-v8a
- 模型: YOLOv8(ncnn,640 输入)
- 任务: 物体检测(定位)
ncnn GPU 设备信息(来自 logcat)
W/ncnn: [0 Mali-G720 MC8] queueC=0[2] queueG=0[2] queueT=0[2]
W/ncnn: [0 Mali-G720 MC8] bugsbn1=0 bugbilz=0 bugcopc=0 bugihfa=0
W/ncnn: [0 Mali-G720 MC8] fp16-p/s/u/a=1/1/1/1 int8-p/s/u/a=1/1/1/1
W/ncnn: [0 Mali-G720 MC8] subgroup=16(16~16) ops=1/1/1/1/1/1/1/1/1/1
W/ncnn: [0 Mali-G720 MC8] fp16-8x8x16/16x8x8/16x8x16/16x16x16=0/0/0/0
Vulkan 初始化成功。模型加载成功。推理运行没有崩溃。
使用的选项
ncnn::Option opt;
opt.lightmode = true;
opt.num_threads = 4;
opt.use_packing_layout = true;
opt.use_vulkan_compute = true; // 当 useGPU=true 时
没有设置任何自定义 FP16 标志,这些标志超出了 ncnn 默认设置。
症状
使用 use_vulkan_compute = true(GPU)时:YOLOv8 检测框 / 定位不准确(错误的框,漏掉的物体或偏移的结果)。
使用 use_vulkan_compute = false(CPU)时:相同的模型 + 相同的预处理产生正确的结果。
在初始化或推理期间,logcat 中没有硬件 Vulkan / ncnn 错误(没有 VkResult 失败,没有着色器 / 管线错误,没有 E/ncnn)。检测持续被调用(间隔为 0.8–1.1 秒),并正常完成。
因此,这看起来像是 Mali Vulkan 上的一个默默无声的数值 / 精度不匹配(可能与 FP16 有关),而不是失败的 GPU 路径。
我们已经检查过的内容
GPU 实际上已被选择(USE GPU 记录)。
模型在 GPU 路径上初始化成功。
推理持续运行;应用程序不会崩溃。
强制使用 CPU 可恢复准确性。
问题
在 Mali-G720 / MediaTek MT6899 上,不准确的 YOLOv8 输出是否是已知的 Vulkan 问题?
是否有建议的 Mali 相关的 ncnn::Option 设置(例如禁用 FP16 存储 / 算术 / 包装),以提高检测模型的数值稳定性?
我们是否应该为 Mali-G720 强制使用已知的驱动 bug 或 ncnn GPU bug 标志?
工作绕过
禁用 Vulkan 计算并在 CPU 上运行(use_vulkan_compute = false)。准确性得到恢复,但需要牺牲性能。内容来源: Tencent/ncnn