#1557·ggml

在处理 ViT 样式的小 matmul 形状时,CUDA 后端在 SM 8.9 (RTX 4060 笔记本电脑) 上发生"非法内存访问"错误

作者: Raphael620创建于 2026年7月9日更新于 2026年7月9日

环境: GPU: NVIDIA GeForce RTX 4060 笔记本电脑 GPU (SM 8.9, 8GB VRAM) 驱动: 591.74 → 610.62 (均受影响) CUDA: 测试 12.4、12.8、13.3 (均受影响) ggml: v0.15.3、LLaMA.cpp b9914 (均受影响) 操作系统: Windows 10、MSVC 19.44/19.50 重现: 运行深度-任何 V3 BASE 模型 (q4_k、100MB gguf) 使用 CUDA 后端。模型成功将 275 个权重加载到 GPU 并卸载,然后在推理期间崩溃。 追踪到的根原因: 在每个 cublasGemmEx 调用后添加 cudaStreamSynchronize 以隔离问题。崩溃是一个非法内存访问,发生在序列中的第三个 cuBLAS 调用中: #1 OK: (972×768) @ (588×768)^T #2 OK: (972×768) @ (1536×768)^T #3 CRASH: (252×768) @ (6912×768)^T ← 非法内存访问 此非法访问可能来自同一流中的前一个内核(量化 / mmvq / 转换),而不是来自 cuBLAS 本身。 compute-sanitizer --tool memcheck 在 Release 构建中报告 0 个错误(可能已被优化掉)。 LLM 推理正常运行,因为矩阵形状更大且更规范。 关键观察: 此崩溃不会发生在 cuBLAS 对 LLM 工作负载的调用中(这些工作负载使用大型、2 的幂的 matmul 维度,如 4096×4096)。它只在 ViT 样式的形状(252、588、6912、972 等)中触发。这表明在一个 CUDA matmul 帮助内核中存在形状相关的缓冲区溢出或对齐问题。 调试日志: DEBUG cublas #1: ne01=972 ne11=768 ne10=588 s01=588 s11=588 ne0=972 DEBUG cublas #1: OK DEBUG cublas #2: ne01=972 ne11=768 ne10=1536 s01=1536 s11=1536 ne0=972 DEBUG cublas #2: OK ggml_cuda_compute_forward: MUL_MAT failed CUDA 错误: 遇到非法内存访问