#6818·ncnn

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)。准确性得到恢复,但需要牺牲性能。