chatGLM-6B 部署记录 Windows

本文详细描述了在Windows系统上为ChatGLM-6B项目进行Python、gcc、mingw64等软件的安装和配置过程,包括Python版本升级、pip源更换、gcc编译器安装、模型文件处理及环境变量设置,解决中文乱码和依赖冲突等问题。
摘要由CSDN通过智能技术生成

准备环境
当前电脑配置:i5-6200u、8g内存、AMD M370(A卡难受)

用的cpu运行的,但配置实在不够,跑是能跑,慢死了。。。


安装 python
https://www.python.org/downloads/windows/ 

之前访问还很流畅,这段时间也学会抽风了

网页中搜索  Download Windows installer ,就能找到 windows 安装包的下载链接,按需下载。

这里安装的是 3.10.11 64位。安装时勾选加入环境变量(已经安装了其他版本的话要注意一下)

> python -V

Python 3.10.11

升级pip

> pip install --upgrade pip

pip换源(清华源,遇到过不好用的情况,可以换阿里源)

> pip config set global.index-url https://pypi.tuna.tsinghua.edu.cn/simple

> pip config set install.trusted-host https://pypi.tuna.tsinghua.edu.cn


安装 gcc

安装  mingw64 ,32位、64位都能编译

其官网好像没有下载地址,托管在 sourceforge:https://sourceforge.net/projects/mingw-w64/files/

在线安装的不好使,总连不上服务器:

MinGW-W64 Online Installer 

|- MinGW-W64-install.exe (exe,但不下载)

下面8.1.0版本里 

MinGW-W64 GCC-8.1.0 选这两个中的一个:

|- x86_64-posix-sjlj 

|- x86_64-posix-seh

posix 的好像是有多线程库的,win32没有

对于 chatGLM-6B 来说 posix 和 win32 的都能运行,但最后有一个 chatglm.cpp 的项目需要用 posix 的才能过,但目前也只到了启动这一步,对话乱码。

找个地方解压进去,然后把 bin 目录配置到 环境变量里去:

bin 目录的例子: X:\[略]\mingw64\bin 

> gcc -v

...一大堆东西

gcc version 8.1.0 (x86_64-win32-sjlj-rev0, Built by MinGW-W64 project)

为什么安装gcc

chatGLM 加载模型时会自动编译两个c文件并加载:quantization_kernels_parallel.c 和 quantization_kernels.c

这两个文件是以base64存在模型文件夹的 quantization.py 中的,加载模型时会解码写出文件。

这里 quantization_kernels_parallel.c 的编译成功,但加载时报错:

FileNotFoundError: Could not find module '[略]\quantization_kernels_parallel.so' (or one of its dependencies). Try using the full path with constructor syntax.

但是并没有影响,因为它会再尝试编译和加载 quantization_kernels ,这次是成功的,他们的目的是一样的,所以有一个成功,就能启动。

不过还是找了一下 quantization_kernels_parallel 加载失败的原因:

https://github.com/THUDM/ChatGLM-6B/issues/967

这是因为ctypes在Windows环境下的bug还没修复,python3.10目前还有问题。

需要对 [模型文件夹]\quantization.py 中的 ctypes.cdll.LoadLibrary相关代码 进行处理:

# 搜索这句
kernels = ctypes.cdll.LoadLibrary(kernel_file)

# 替换为这句,也可以只是注掉上面那句
#kernels = ctypes.cdll.LoadLibrary(kernel_file)
kernels = ctypes.CDLL(kernel_file, winmode = 0)


踩坑

之前 python 安装的64位,gcc 安装的 mingw ,不是mingw64,而是只支持32位的老家伙。

然后就总报 "%1不是有效的Win32应用程序",挠头。

期间把 python 换成了32位的,但因为还会报别的错误懒得搞,最后就直接用wsl走起了,简单粗暴。

这次才知道是因为要动态编译和加载c代码,然后 python 和 gcc 的位数对不上才报错的。

tdm-gcc

还有说安装 tdm-gcc 也行,但没去尝试,这就给个地址吧:

https://jmeubank.github.io/tdm-gcc/


git 

https://git-scm.com/download

用来获取项目的,也可以不用下载安装,直接从网站下载项目压缩包就行。


部署 chatGLM2-6B

chatGLM-6B 已经有一段时间没有更新了,建议直接部署 chatGLM2-6B,而且二代速度确实快了一丢丢。

现在2023-07-08,昨天 chatGLM2-6B 还有更新,应该还会更新下去吧。

智谱AI上看到 部署 chatGLM2-6B 的本地私有化定价 30W/年 。

下面都是以 chatGLM2-6B 部署的, chatGLM-6B 的部署过程是一样的。


直接下载 chatGLM2-6B

https://github.com/THUDM/ChatGLM2-6B

页面上有个 [<>Code] 按钮,点击后再点击 [download zip] 下载压缩包,解压出来就行了

这里把 ChatGLM2-6B-main 中的文件都解压到 F:\_AI\ChatGLM2-6B 目录了

下载模型

https://huggingface.co/THUDM/chatglm2-6b-int4/tree/main

这里的文件都下载下来,放到同一个文件夹里,抱脸不像github可以打包下载,只能一个一个下载了

这里都下载到 F:\_AI\ChatGLM2-6B\THUDM\chatglm2-6b-int4 目录了

前面提到要修改的 quantization.py 文件,就在这里。

对于 chatGLM-6B 就是把地址改成 chatGLM-6B 的地址就行。

因为两个项目的地址没什么差异,直接把上面地址中的 chatGLM2-6B 改成 chatGLM-6B 就可以了。


git 获取chatGLM2-6B

> cd /D F:\_AI

> git clone https://github.com/THUDM/ChatGLM2-6B.git

... 略

> mkdir F:\_AI\ChatGLM2-6B\THUDM

> cd F:\_AI\ChatGLM2-6B\THUDM

> git clone https://huggingface.co/THUDM/chatglm2-6b-int4

... 略

同样, chatGLM-6B 就是 chatGLM2-6B 改成 chatGLM-6B 就可以了。


安装依赖

> cd /D F:\_AI\ChatGLM2-6B

> pip install -r requirements.txt

... 略


修改模型路径 以及 使用 cpu 启动

之前用的相对路径出过一些问题,但不记得是什么情况了,这里先保留组织模型绝对路径的处理。

因为还不知道怎么用A卡跑,这里要用cpu跑,而且这个卡。。。

后来找了个2g显存的n卡,根本跑不起来。。。

# 在启动的py文件里添加一段组织模型路径的代码
# 模型位置使用绝对路径并输出一下,可以检查一下对不对
current_path = os.path.abspath(__file__) # 当前脚本文件绝对路径
current_dir = os.path.dirname(current_path) # 当前脚本所在文件夹绝对路径
model_path = os.path.join(current_dir, "THUDM", "chatglm2-6b-int4") # 拼接路径
print("模型路径:", model_path)

# 修改 AutoTokenizer.from_pretrained 和 AutoModel.from_pretrained 的第一个参数为前面的 model_path
# AutoModel.from_pretrained(...).cuda() 改为 .float() 使用cpu运行。
tokenizer = AutoTokenizer.from_pretrained(model_path, trust_remote_code=True)
model = AutoModel.from_pretrained(model_path, trust_remote_code=True).float()

启动 cli_demo.py

> python cli_demo.py

上来就报错缺少 readline

ModuleNotFoundError: No module named 'readline'

> pip install readline 直接装 readline 安装不上,网上说安装 pyreadline

> pip install pyreadline 

确实能安装,但启动 cli_demo.py 又报错

AttributeError: module 'collections' has no attribute 'Callable'

Python 3.10 版本 collections 将一些属性放到了 collections.abc 子模块下,Callable 也是其中之一。(为什么是abc。。)所以会出现 collections 没有 xx 属性的错误。

按错误信息找到报错位置,[略]\site-packages\pyreadline\py3k_compat.py

搜索 collections.Callable 改为 collections.abc.Callable (其实错误信息中已经给出在第8行了)

再次启动 cli_demo.py,成功。


启动 web_demo.py

> python web_demo.py

也许是上面都处理过了,直接就启动了


启动 api.py

> python api.py

也成功了。使用 PostMan 试了一下,可以运行。

POST http://127.0.0.1:8000

{

    "prompt": "你好",

    "history": [],

    "max_length": 2048,

    "top_p": 0.8,

    "temperature": 0.95

}

参数的值的类型不能给错,如果数字带引号",程序里使用的时候不会自动转换成数字,于是就报错了。

api 就没法用打字机的效果了,机器慢等半天,还以为卡死了。


chatglm.cpp

安装cmake

此项目需要 cmake 进行编译,下载地址:https://cmake.org/download/

下载的 Windows x64 ZIP ,压缩包的版本,解压出来,把里面的 bin 目录配置到环境变量里。bin 目录的例子: X:\[略]\cmake-3.27.0-rc4-windows-x86_64\bin 

> cmake --version

cmake version 3.27.0-rc4

git 获取chatglm.cpp

> cd /D F:\_AI

> git clone --recursive https://github.com/li-plus/chatglm.cpp.git

... 略

> cd F:\_AI\chatglm.cpp

> git submodule update --init --recursive

模型转换

此项目需要把 chatGLM2-6B 的模型转换成 gglm 的,并提供了转换的代码 convert.py 。

先安装 convert.py 所需要的依赖

> pip install tabulate

这里用 chatGLM2-6B 的模型进行转换,chatGLM2-6B 用上面的步骤部署过了。

因为装过 chatGLM2-6B 的依赖了,所以这里也不知道单独部署 chatglm.cpp 是否需要安装 chatGLM2-6B 的依赖,大概是要的吧。

然后运行转换,把 F:\_AI\ChatGLM2-6B\THUDM\chatglm2-6b-int4 转换为 chatglm2-ggml.bin 文件

> python convert.py -i F:\_AI\ChatGLM2-6B\THUDM\chatglm2-6b-int4 -t q4_0 -o chatglm2-ggml.bin

CMake 编译项目

> cmake -B build

... 似乎成功了,又有点不像,但文件都生成好了

> cmake --build build -j

... 报的错误滚动了半天,人傻了

失败一

网上找了一个设置用 mingw64 的,先设置,再cmake,结果还是不行。

> Set CC=[mingw64目录]\bin\gcc.exe

> Set CXX=[mingw64目录]\bin\g++.exe

失败二

又搜了一下,windows 下 如果装了 vs 会默认用生成 vs 工作区,可以指定使用 gcc 的,如果之前生成过,需要先把 build 文件夹删除 ( -B build )

> cmake CMakeLists.txt -G "MinGW Makefiles" -B build

...确实没有 failed 和 vs 的字样了

> cmake --build build -j4

...又是几屏的内容, 有许多类似警告:warning: ISO C does not support the 'I64' ms_printf length modifier [-Wformat=]

...之前用mingw64的Threads不是posix的,报很多 std::thread 之类的错误,换成 posix 的之后都是警告了

...但是最后 main.exe 生成成功了

启动

> build\bin\main.exe -m chatglm2-ggml.bin -i

启动是成功的,但不出意外的出了意外,它的中文回答是乱码。

重启问它英文好像也不知道我在问什么,估计它看我也是乱码。

不想搞了,先这样吧,反正 wsl 能跑起来。 作者:幽灵跃迁 https://www.bilibili.com/read/cv24874902/ 出处:bilibili

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

被代码搞废的挖掘机

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值