有些设备不支持内存池,但仍会将内存池数组元素从 nullptr 覆盖为某些垃圾值。我从设备属性中添加了额外检查。包括多 GPU 池访问支持和内存池访问检查。
[ggerganov/llama.cpp]检查 CUDA 内存池支持
回答
@cebtenzzre 请您检查最新的更改,因为设备属性不在 CUDA 17 中,并且它仅适用于 12+。
这确实有效,但是构建未修改的 llama.cpp 所需的命令行越来越长:
cmake -B build \
-DLLAMA_CUBLAS=ON \
-DCMAKE_CUDA_HOST_COMPILER=gcc-12 -DCMAKE_C_COMPILER=gcc-12 -DCMAKE_CXX_COMPILER=g++-12 \
-DLLAMA_CUDA_FORCE_MMQ=ON \
-DCMAKE_CUDA_FLAGS='-DGGML_CUDA_FORCE_CUSTOM_MEMORY_POOL' \
&& make -C build
- 强制使用 gcc 12,因为最近的 CUDA 更新不再支持 gcc 13
- LLAMA_CUDA_FORCE_MMQ 可以避免由于没有张量核心而造成巨大的性能损失
- GGML_CUDA_FORCE_CUSTOM_MEMORY_POOL,因为我的一个 GPU 不支持内存池
如果内置内存池有任何好处,我希望在使用 CUDA_VISIBLE_DEVICES 禁用 GTX 970 时启用它。我还想避免额外的编译时选项,特别是如果我们没有明确记录旧卡需要此选项(MMQ 也没有记录)。我们可以检查 CUDART_VERSION 并使用 prop.memoryPoolsSupported(如果可用)吗?
@cebtenzzre 尝试不使用 GGML_CUDA_FORCE_CUSTOM_MEMORY_POOL
如果没有该标志,我会得到与最初类似的错误:
CUDA error 801 at /home/cebtenzzre/src/forks/llama.cpp/ggml-cuda.cu:6807: operation not supported
current device: 0
因此它以某种方式加载了内存池,但分配失败。我可以根据您提到的 CUDA 版本添加一个选项。
当我尝试这个时,我得到了 cuda 缓冲池已满的错误。不再崩溃,但反复输出一个字符。
双 3090 和双 P40 的行为相同。
@cebtenzzre @Ph0rk0z 我在初始化阶段添加了不同的检查(设备属性、分配/释放测试)。如果其中一个检查失败,则使用自定义池实现。请使用新更改重新测试。
检查成功了。现在,无论是否带有 GGML_CUDA_FORCE_CUSTOM_MEMORY_POOL,都会向我滚动 INCREASE_MAX_CUDA_BUFFERS 并反复返回一个字符。
顺便说一句,我在 Python 环境中使用的是 cuda 11.8。它已经运行了几个月。12.1 是否在某个时候成为一项要求?如果是,为什么?
@Ph0rk0z 因此,如果它反复显示相同的字符,则看起来它与另一个错误有关(与 cuda 内存池无关)。尝试使用不同的版本并跟踪它何时停止工作。
合并 yarn 的 PR 给我带来了这个问题。
提交 56e516240a923224613b132ec7062834c6485334 在我的 GTX 970 和 Tesla P40 上单独运行良好,但多 GPU 上会出现“遇到非法内存访问”的情况。
在 81931b2ea7729e812b3fd8cc5ff60932b0fabdb1 上,我使用多 GPU 获得了此信息:
main: build = 1487 (81931b2e)
main: built with gcc-12 (GCC) 12.3.0 for x86_64-pc-linux-gnu
main: seed = 1699115827
ggml_init_cublas: GGML_CUDA_FORCE_MMQ: yes
ggml_init_cublas: CUDA_USE_TENSOR_CORES: no
ggml_init_cublas: found 2 CUDA devices:
Device 0: Tesla P40, compute capability 6.1, CUDA memory pool is supported
Device 1: NVIDIA GeForce GTX 970, compute capability 5.2Warning: Device 1 doesnt support CUDA memory pool, skipping pool access config
Cant give access for main device memory pool to device 1
CUDA error 801 at /home/jared/src/forks/llama.cpp/ggml-cuda.cu:5929: operation not supported
current device: 0
合并 yarn 的 PR 给我带来了这个问题。
如果您可以在最新的 master 上重现该问题,那么您应该打开一个新问题。我合并 YaRN 时出现了一些错误,但在修复 PR 之后,CUDA 和 Metal 对大多数人来说似乎运行良好。
编辑:我看到您已经打开了一个问题。我认为您看到的内容与 YaRN PR 没有直接关系。
请再重新测试一次。
请再重新测试一次。
最新提交似乎适用于任一 GPU 或两者。谢谢!
@cebtenzzre 嗯,所以一个使用 CUDA 池,另一个使用自定义池,嗯,有趣。我只有一个 GPU,所以这是盲目修复 :)
对我来说仍然破碎
RTX 2070 加 p106-100
@ 4ff1046d75e64f0e556d8dcd930ea25c23eb8b18
works
@ d6069051de7165a4e06662c89257f5d2905bb156
CUDA error 1 at ggml-cuda.cu:7036: invalid argument
此 PR @ 863166b4c39662b9e86406c7ee23014fb4e2d6bf
CUDA error 217 at ggml-cuda.cu:6881: peer access is not supported between these two devices
实际上,我刚刚测试了多 GPU 和完全 GPU 卸载(而不是部分卸载),并收到了此控制台垃圾邮件:
WARNING: cuda buffer pool full, increase MAX_CUDA_BUFFERS
WARNING: cuda buffer pool full, increase MAX_CUDA_BUFFERS
WARNING: cuda buffer pool full, increase MAX_CUDA_BUFFERS
...
因此,尚未修复。
@年轻开发者
我只有一个 GPU,所以是盲目修复:)
我的虚拟机里有 RTX2070 和 p106,如果你把你的 ssh 公钥和 IP 地址发给我,我就允许你进行测试,staviq at gmail.com
我想我会将 CUDA 内存池改为可选的,因为可以使用不同的多个 GPU,并且大多数情况下需要花一些时间来检查。
@cebtenzzre @staviq 我添加了LLAMA_CUDA_USE_CUDA_POOL
,以便您可以重新编译,如果您想使用 CUDA 池测试多个 GPU。一旦它稳定,我们就可以默认启用它。
对于一个临时解决方案来说,这变得比我想要的更复杂,所以如果我们不得不默认禁用它,我宁愿恢复原始 PR。
我添加了
LLAMA_CUDA_USE_CUDA_POOL
,因此如果您想使用 CUDA 池测试多个 GPU,您可以重新编译。一旦它稳定下来,我们就可以默认启用它。
使用 2b0303a 我回到了多 GPU 状态(LLAMA_CUDA_USE_CUDA_POOL 处于关闭状态):
CUDA error 700 at /home/jared/src/forks/llama.cpp/ggml-cuda.cu:7178: an illegal memory access was encountered
current device: 1
对于一个临时解决方案来说,这变得比我想要的更复杂,所以如果我们不得不默认禁用它,我宁愿恢复原始 PR。
是的。绝对是一个选择。然后我会关闭这个 PR。
这就是我说的错误。它是否也输出了无意义的内容?
在 yarn 之后,我遇到了我提到的分配错误,模型永远无法加载。后续提交使它达到了这一点。我只是引用它,因为那是我停止能够将模型跨越多个 GPU 的点。
这就是我说的错误。它是否也输出了无意义的内容?
如果 #3944 对你有用,那么 YaRN 就不再是问题了。我现在无法检查,因为我的 GPU 很忙,但我基本上已经在我的本地分支上恢复了相同的提交,没有任何问题。
现在终于可以正常工作了。此外,pascal 提示处理也已修复,无需:https://github.com/ggerganov/llama.cpp/pull/3816
速度基本相同,只有 0.10 的差异。虽然不是更好,但没关系。