关于在Windows环境下编译CUDA版本出现的问题和一些应该去标明环境的细节
花了大概两天的时间,终于把ChatGLM.cpp的CUDA环境编译成功了,我觉得应该要指出一些问题来 系统环境: Windows 11 Pro Python 3.10 CMake 3.30 CUDA 12.3 ->12.6
过程: 首先直接编译,注意到第一个问题就是在cmd下直接使用set CMAKE_ARGS="-DGGML_METAL=ON" 在cmd中的得到的是'"-DGGML_METAL=ON"'的str值 在setup.py 60line中并没有直接对item进行strip操作,导致传进cmake_args的参数是一个带有引号的参数,导致编译的时候不是按照cuda的版本编译的,应该修改
修改之后,注意到第二个问题是版本问题。README中没有提及,但是要编译CUDA版本,对CUDA要求至少是要12.4以上,所以我才从12.3版本升级到了12.6版本 这里插一个小插曲,应该是NVIDIA的锅。CUDA Toolkit没有正确处理MSBuildExtensions,导致出现No CUDA toolset found的错误。不知道这是个例问题还是版本问题。解决方法可以看https://stackoverflow.com/a/77085810
升级之后,注意到nvcc不支持flag -Wno-expansion-to-defined。这个是在CMakeList 11line出现的。作者标明了# suppress ggml warnings。具体我没怎么了解这个flag是否是版本差异还是OS差异,但至少在Windows下的CUDA 12.6版本是没有这个flag的。
在踩了这些坑之后总算是编译出来了,当然后面注意到GGML在疯狂的显示warning,应该和前面去除的flag有关,但至少能跑。还是希望作者能够出cuda的whl,不然整编译环境实在是不方便我们这些没有学习C++。
打错了 是-DGGML_CUDA=ON
一样的过程,历经千辛万苦,但到编译chatglm.cpp的步骤时出现报错,实在不知道如何解决:
一样的过程,历经千辛万苦,但到编译chatglm.cpp的步骤时出现报错,实在不知道如何解决:
![]()
将编译GPU生成的build文件夹拷贝到临时文件夹后重新编译在CPU上的main.exe,能够正常运行,随后替换为译GPU生成的build文件夹重新拷贝到chatglm.cpp文件夹中并替换掉原先用于CPU的build文件夹后执行cmake -B build -DGGML_CUDA=ON && cmake --build build -j --config Release命令即可正常输出用于cuda的main.exe,但速度相比于CPU快不了多少。
除夕夜终于搞定了,Windows 11 Pro Python 3.12 CMake 3.31 CUDA 12.2 ->12.6 ->12.4
前面都按说明该装的环境装好,版本对应好,vs2022只装C++那个
1、之前win10的命令行下的set是可以有引号的,文档中没有特别说明,也没说用啥版本的windows,让人很是困惑。
反正win11用这个就对了:set CMAKE_ARGS=-DGGML_CUBLAS=ON -DCUDA_ARCHITECTURES='89'
2、前面确实看到报错中有一个CUDA需要>=12.4的,我也是看了你这个升级到了12.6,但后面还是一直报错,不确定是不是版本高了,又降回了12.4,但还是没解决。反正CUDA>=12.4就可以了
3、关于** -Wno-expansion-to-defined **报错,我之前一直以为是我环境问题,改完了这个之后让我茅塞顿开,顺便又改好了下一个问题。这个只需要修改chatglm.cpp下的CMakeLists.txt就可以,把有-Wno-expansion-to-defined的这一行注释掉,就能解决这个报错。
4、CUDA编译的main.exe运行时候会有类似:
ggml_gallocr_needs_realloc: graph has different number of nodes
ggml_gallocr_alloc_graph: reallocating buffers automatically
ggml_gallocr_reserve_n: reallocating CUDA0 buffer from size 0.00 MiB to 5.03 MiB
这样的报错,受到前面一点的启发,直接去修改chatglm.cpp\third_party\ggml\src\ggml-alloc.c,把会报错的所有输出注释掉,类似:
#ifndef NDEBUG
fprintf(stderr, "%s: graph has different number of nodes\n", __func__);
#endif
可能在哪里定义NDEBUG也可以,但是我用chatgpt告诉我的方法没成功,干脆直接注释代码,改完代码再编译就没有上述报错了。 5、其他问题,我这个win11的区域开始设置的是中国,然后出来的报错有中文的地方全是乱码,区域改成英文就好了。还有个目录不能超过260字符的报错,改区域之后能一眼看懂具体的报错网上搜索一下就解决了。
