[ggerganov/llama.cpp]检查 CUDA 内存池支持

2024-07-05 492 views
2

有些设备不支持内存池,但仍会将内存池数组元素从 nullptr 覆盖为某些垃圾值。我从设备属性中添加了额外检查。包括多 GPU 池访问支持和内存池访问检查。

回答

3

@cebtenzzre 请您检查最新的更改,因为设备属性不在 CUDA 17 中,并且它仅适用于 12+。

9

这确实有效,但是构建未修改的 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(如果可用)吗?

6

@cebtenzzre 尝试不使用 GGML_CUDA_FORCE_CUSTOM_MEMORY_POOL

9

如果没有该标志,我会得到与最初类似的错误:

CUDA error 801 at /home/cebtenzzre/src/forks/llama.cpp/ggml-cuda.cu:6807: operation not supported
current device: 0
4

因此它以某种方式加载了内存池,但分配失败。我可以根据您提到的 CUDA 版本添加一个选项。

2

当我尝试这个时,我得到了 cuda 缓冲池已满的错误。不再崩溃,但反复输出一个字符。

双 3090 和双 P40 的行为相同。

7

@cebtenzzre @Ph0rk0z 我在初始化阶段添加了不同的检查(设备属性、分配/释放测试)。如果其中一个检查失败,则使用自定义池实现。请使用新更改重新测试。

3

检查成功了。现在,无论是否带有 GGML_CUDA_FORCE_CUSTOM_MEMORY_POOL,都会向我滚动 INCREASE_MAX_CUDA_BUFFERS 并反复返回一个字符。

顺便说一句,我在 Python 环境中使用的是 cuda 11.8。它已经运行了几个月。12.1 是否在某个时候成为一项要求?如果是,为什么?

0

@Ph0rk0z 因此,如果它反复显示相同的字符,则看起来它与另一个错误有关(与 cuda 内存池无关)。尝试使用不同的版本并跟踪它何时停止工作。

8

合并 yarn 的 PR 给我带来了这个问题。

3

提交 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
9

合并 yarn 的 PR 给我带来了这个问题。

如果您可以在最新的 master 上重现该问题,那么您应该打开一个新问题。我合并 YaRN 时出现了一些错误,但在修复 PR 之后,CUDA 和 Metal 对大多数人来说似乎运行良好。

编辑:我看到您已经打开了一个问题。我认为您看到的内容与 YaRN PR 没有直接关系。

3

请再重新测试一次。

6

请再重新测试一次。

最新提交似乎适用于任一 GPU 或两者。谢谢!

8

@cebtenzzre 嗯,所以一个使用 CUDA 池,另一个使用自定义池,嗯,有趣。我只有一个 GPU,所以这是盲目修复 :)

7

对我来说仍然破碎

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

0

实际上,我刚刚测试了多 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
...

因此,尚未修复。

7

@年轻开发者

我只有一个 GPU,所以是盲目修复:)

我的虚拟机里有 RTX2070 和 p106,如果你把你的 ssh 公钥和 IP 地址发给我,我就允许你进行测试,staviq at gmail.com

7

我想我会将 CUDA 内存池改为可选的,因为可以使用不同的多个 GPU,并且大多数情况下需要花一些时间来检查。

4

@cebtenzzre @staviq 我添加了LLAMA_CUDA_USE_CUDA_POOL ,以便您可以重新编译,如果您想使用 CUDA 池测试多个 GPU。一旦它稳定,我们就可以默认启用它。

9

对于一个临时解决方案来说,这变得比我想要的更复杂,所以如果我们不得不默认禁用它,我宁愿恢复原始 PR。

3

我添加了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
2

对于一个临时解决方案来说,这变得比我想要的更复杂,所以如果我们不得不默认禁用它,我宁愿恢复原始 PR。

是的。绝对是一个选择。然后我会关闭这个 PR。

7

这就是我说的错误。它是否也输出了无意义的内容?

在 yarn 之后,我遇到了我提到的分配错误,模型永远无法加载。后续提交使它达到了这一点。我只是引用它,因为那是我停止能够将模型跨越多个 GPU 的点。

4

这就是我说的错误。它是否也输出了无意义的内容?

如果 #3944 对你有用,那么 YaRN 就不再是问题了。我现在无法检查,因为我的 GPU 很忙,但我基本上已经在我的本地分支上恢复了相同的提交,没有任何问题。