Linuxword Global
当前位置: 建站相关 > 今天手把手教大家从搭建环境开始实现本地部署ChatGLM2 6B 大模型

前言

自己日常工作中几乎天天都在使用ChatGPT,觉得这些工具很大程度提升了工作效率 ,节约了很多上搜索和测试时间,十分期待它将来演化的路程。

自己也了解过很多的相关的知识,最近想着最近的AIGC大模型这么火,怎么不自己部署试一下试试呢?想着后面能自己做微调训练出更有意思更有价值的东西出来。

所以把自己的主力PC 做了一个双系统,然后挑一个开源大模型本地部署 首先挑一个能运行的开源模型,选中了ChatGLM2-6B 模型 ,由清华大学开源的中英双语对话模型 。部署门槛比较低,性能不错。

项目地址:github.com/THUDM/ChatG…

硬件环境:
CPU:i7-9700F
内存:DDR4 32G
显卡:2070S 8G

软件环境(新装):
Ubuntu 22.04 TLS

开始

安装环境

简要说明要安装哪些东西
主要分为三大块: 1.英伟达显卡驱动,Linux系统默认不会安装相关显卡驱动,需要自己安装。
2.CUDA(Compute Unified Device Architecture) ,是NVIDIA公司开发的一组编程语言扩展、库和工具,让开发者能够编写内核函数,可以在GPU上并行计算。
3.CuDNN(CUDA Deep Neural Network library),是NVIDIA公司开发的深度学习开发者提供的加速库,帮助开发者更快实现深度神经网络训练推理过程。

先看下自己的显卡到底有没有驱动:nvidia-smi

454d9934bfdb4ced95d247c130c4a828tplv-k3u1fbpfcp-jj-mark3024000q75.awebp_ 报错就是没有的,刚装的系统当然没有

再看下有没有cuda 驱动:nvcc -V 

af4c6f49b01e40bd906e0cce9fb5d003tplv-k3u1fbpfcp-jj-mark3024000q75.awebp_

也是没有安装相关驱动,当然也没有

那么开始安装

NVIDIA驱动

先更新一下软件源: sudo apt-get update

查看显卡硬件支持的驱动类型:ubuntu-drivers devices

16a9f0eecc984a899baddc9bbd1e5f0etplv-k3u1fbpfcp-jj-mark3024000q75.awebp_

安装一个最推荐的驱动:

615ed6a26de64e24804e1dfc767c0a77tplv-k3u1fbpfcp-jj-mark3024000q75.awebp_

可以自动安装推荐版本: sudo ubuntu-drivers autoinstall 

df30b6613ded42f8a87d328ca79e3807tplv-k3u1fbpfcp-jj-mark3024000q75.awebp_

报错了。 修改DNS:

 

bash

代码解读
复制代码
sudo vim /etc/systemd/resolved.conf

5e521ca6cb35401b9a3fb856cd732d7ftplv-k3u1fbpfcp-jj-mark3024000q75.awebp_

重启服务生效:

 

bash

代码解读
复制代码
systemctl restart systemd-resolved 
systemctl enable systemd-resolved

又出现报错: 

338b3dd39d6b47bfa12a96c9dd62e4detplv-k3u1fbpfcp-jj-mark3024000q75.awebp_ 按照推荐apt-get update 试一下再安装 可以了,安装成功: 

30c0eae0bd4b458db78b08ee1ffc7037tplv-k3u1fbpfcp-jj-mark3024000q75.awebp_

重启( sudo reboot)之后再查看驱动:

7bdbcb6f8fac43ed9d7a249e8ce6d381tplv-k3u1fbpfcp-jj-mark3024000q75.awebp_

成功了,提示CUDA Version: 12.2 表示这个显卡最高可以支持CUDA12.2版本

CUDA

先安装CUDA Toolkit 下载地址:developer.nvidia.com/cuda-toolki…

e175ea124f87407db1548e312f2b0f55tplv-k3u1fbpfcp-jj-mark3024000q75.awebp_

d0d4379897b247d2af474d92abefc8d1tplv-k3u1fbpfcp-jj-mark3024000q75.awebp_

根据官网提示在线安装试试:

 

arduino

代码解读
复制代码
wget https://developer.download.nvidia.com/compute/cuda/12.2.0/local_installers/cuda_12.2.0_535.54.03_linux.run
sudo sh cuda_12.2.0_535.54.03_linux.run

bc3979a3b025445184903a53727656a3tplv-k3u1fbpfcp-jj-mark3024000q75.awebp_ Continue 

236e4ecdb7b64504ab78defbe7632c3ftplv-k3u1fbpfcp-jj-mark3024000q75.awebp_

提示报错: Failed to verify gcc version. See log at /var/log/cuda-installer.log for details.

先加忽略试试看:

 

arduino

代码解读
复制代码
sudo sh cuda_12.2.0_535.54.03_linux.run --override

输入:accept 

31e6f95c317f48bb872c8004603c49bdtplv-k3u1fbpfcp-jj-mark3024000q75.awebp_ 安装 CUDA相关的就行,选择Install 回车

b7985113a4834200be1c9c7c9bbd21b1tplv-k3u1fbpfcp-jj-mark3024000q75.awebp_ 安装完成: 

0ea82a244fe84c469b6c057737d16b9ftplv-k3u1fbpfcp-jj-mark3024000q75.awebp_

还没完,需要根据提示 添加环境变量

 

bash

代码解读
复制代码
===========
= Summary =
===========
Driver:   Not Selected
Toolkit:  Installed in /usr/local/cuda-12.2/
Please make sure that
 -   PATH includes /usr/local/cuda-12.2/bin
 -   LD_LIBRARY_PATH includes /usr/local/cuda-12.2/lib64, or, add /usr/local/cuda-12.2/lib64 to /etc/ld.so.conf and run ldconfig as root
To uninstall the CUDA Toolkit, run cuda-uninstaller in /usr/local/cuda-12.2/bin
***WARNING: Incomplete installation! This installation did not install the CUDA Driver. A driver of version at least 535.00 is required for CUDA 12.2 functionality to work.
To install the driver using this installer, run the following command, replacing <CudaInstaller> with the name of this run file:
    sudo <CudaInstaller>.run --silent --driver
Logfile is /var/log/cuda-installer.log
 

bash

代码解读
复制代码
vim ~/.bashrc

文件末尾添加以下几行: 

476a111e8a00428eaae546cf3dcdcbd5tplv-k3u1fbpfcp-jj-mark3024000q75.awebp_ 退保保存 使环境变量生效:

 

bash

代码解读
复制代码
source ~/.bashrc

最后验证一下:nvcc -V

8270cbf83e504e098cda366f1eada4b6tplv-k3u1fbpfcp-jj-mark3024000q75.awebp_

cuDNN

接下来安装cuDNN 项目的pytorch 版本是>2.0 

5a276351f99e45089e20f0b4a49e9954tplv-k3u1fbpfcp-jj-mark3024000q75.awebp_

进官网看看cudnn 和cuda的版本对应关系:
developer.nvidia.com/rdp/cudnn-a…
CUDA 12.2 对应的是一下几个版本的cudnn

cudnn 官方下载地址:developer.nvidia.com/rdp/cudnn-a…

d9e5f040d7b34938a6d07fa5c85baa5ctplv-k3u1fbpfcp-jj-mark3024000q75.awebp_ 这里下载需要验证NVIDIA 的账号权限,我这里是win11 用SSH链接用ftp 传了上去 

24487c629b4b4b0f9dbed7f62e160ad2tplv-k3u1fbpfcp-jj-mark3024000q75.awebp_ 直接安装:sudo dpkg -i cudnn-local-repo-ubuntu2204-8.9.5.30_1.0-1_amd64.deb 

fbe39c0427974c6b8b39c2122c6e51c2tplv-k3u1fbpfcp-jj-mark3024000q75.awebp_

安装示例复制软件源的key:

 

bash

代码解读
复制代码
sudo cp /var/cudnn-local-repo-ubuntu2204-8.9.5.30/cudnn-local-FB167084-keyring.gpg /usr/share/keyrings/

更新软件源: sudo apt-get update 接下来还要安装运行时库,开发者库,代码示例:

7b3fad70cd5e4d6598f5b84f472b6aectplv-k3u1fbpfcp-jj-mark3024000q75.awebp_

这里需要指定具体的CUDA版本和cuDNN版本,上面的CUDA和cuDNN版本分别为:12.2.0 和 8.9.5.30 所以:

 

ini

代码解读
复制代码
sudo apt-get install libcudnn8=8.9.5.30-1+cuda12.2
sudo apt-get install libcudnn8-dev=8.9.5.30-1+cuda12.2
sudo apt-get install libcudnn8-samples=8.9.5.30-1+cuda12.2

执行完成验证安装:

 

bash

代码解读
复制代码
cp -r /usr/src/cudnn_samples_v8/ $HOME
cd $HOME/cudnn_samples_v8/mnistCUDNN
make clean && make
./mnistCUDNN

make 命令时 提示 找不到命令 “make” 那么就安装 apt install make

然后又报错:

 

bash

代码解读
复制代码
rm -rf *o
rm -rf mnistCUDNN
CUDA_VERSION is 12020
Linking agains cublasLt = true
CUDA VERSION: 12020
TARGET ARCH: x86_64
HOST_ARCH: x86_64
TARGET OS: linux
SMS: 50 53 60 61 62 70 72 75 80 86 87 90
g++: No such file or directory
nvcc fatal   : Failed to preprocess host compiler properties.
>>> WARNING - FreeImage is not set up correctly. Please ensure FreeImage is set up correctly. <<<
[@] /usr/local/cuda/bin/nvcc -I/usr/local/cuda/include -I/usr/local/cuda/include -IFreeImage/include -ccbin g++ -m64 -gencode arch=compute_50,code=sm_50 -gencode arch=compute_53,code=sm_53 -gencode arch=compute_60,code=sm_60 -gencode arch=compute_61,code=sm_61 -gencode arch=compute_62,code=sm_62 -gencode arch=compute_70,code=sm_70 -gencode arch=compute_72,code=sm_72 -gencode arch=compute_75,code=sm_75 -gencode arch=compute_80,code=sm_80 -gencode arch=compute_86,code=sm_86 -gencode arch=compute_87,code=sm_87 -gencode arch=compute_90,code=sm_90 -gencode arch=compute_90,code=compute_90 -o fp16_dev.o -c fp16_dev.cu
[@] g++ -I/usr/local/cuda/include -I/usr/local/cuda/include -IFreeImage/include -o fp16_emu.o -c fp16_emu.cpp
[@] g++ -I/usr/local/cuda/include -I/usr/local/cuda/include -IFreeImage/include -o mnistCUDNN.o -c mnistCUDNN.cpp
[@] /usr/local/cuda/bin/nvcc -ccbin g++ -m64 -gencode arch=compute_50,code=sm_50 -gencode arch=compute_53,code=sm_53 -gencode arch=compute_60,code=sm_60 -gencode arch=compute_61,code=sm_61 -gencode arch=compute_62,code=sm_62 -gencode arch=compute_70,code=sm_70 -gencode arch=compute_72,code=sm_72 -gencode arch=compute_75,code=sm_75 -gencode arch=compute_80,code=sm_80 -gencode arch=compute_86,code=sm_86 -gencode arch=compute_87,code=sm_87 -gencode arch=compute_90,code=sm_90 -gencode arch=compute_90,code=compute_90 -o mnistCUDNN fp16_dev.o fp16_emu.o mnistCUDNN.o -I/usr/local/cuda/include -I/usr/local/cuda/include -IFreeImage/include -L/usr/local/cuda/lib64 -L/usr/local/cuda/lib64 -L/usr/local/cuda/lib64 -lcublasLt -LFreeImage/lib/linux/x86_64 -LFreeImage/lib/linux -lcudart -lcublas -lcudnn -lfreeimage -lstdc++ -lm

继续安装相关的软件:

 

arduino

代码解读
复制代码
sudo apt-get install libfreeimage3 libfreeimage-dev

还是继续一样报错,显然没有安装g++编译库,想找到具体问题,结果在NVIDIA论坛找到的解决方案:

 

arduino

代码解读
复制代码
sudo apt-get install g++ freeglut3-dev build-essential libx11-dev libxmu-dev libxi-dev libglu1-mesa libglu1-mesa-dev

最后成功了!!! 

31994f12993646a5ab285730b5027e39tplv-k3u1fbpfcp-jj-mark3024000q75.awebp_

部署

下载项目

官方Git项目地址:https://github.com/THUDM/ChatGLM2-6B

 

bash

代码解读
复制代码
git clone https://github.com/THUDM/ChatGLM2-6B
cd ChatGLM2-6B

还需要提前安装一些软件

 
代码解读
复制代码
apt install  python3-pip git curl

这里就不使用conda了直接安装相关依赖

 

ruby

代码解读
复制代码
pip install -r requirements.txt -i https://mirrors.aliyun.com/pypi/simple/ 

安装Git lfs(Large File Storage) Git 的扩展,实现大文件的版本管理支持 

1f5ee02c826841f7b39de1d0e51a7df6tplv-k3u1fbpfcp-jj-mark3024000q75.awebp_

原理是通过项目根目录下的.gitattributes文件指定哪些文件用专门的LFS文件服务器里,和Git仓库存储位置分开。

git lfs 官方指南:github.com/git-lfs/git…

 

ruby

代码解读
复制代码
curl -s https://packagecloud.io/install/repositories/github/git-lfs/script.deb.sh | sudo bash
sudo apt-get install git-lfs

切换一个文件夹执行Clone大模型相关的模型:git clone https://huggingface.co/THUDM/chatglm2-6b

45968f6e4888404ebd5fd331baa8b0a6tplv-k3u1fbpfcp-jj-mark3024000q75.awebp_ 命令输入后卡了很久,没有进度下载显示,想着看看源代码有多大: 

bc927087489644d1ae5b5566f8541209tplv-k3u1fbpfcp-jj-mark3024000q75.awebp_

e330bf1f9fb64aa0ba3bfcce5a273e87tplv-k3u1fbpfcp-jj-mark3024000q75.awebp_

然后看下载速度带宽占用,需要下一个软件nethogs

 
代码解读
复制代码
sudo apt install nethogs
nethogs -d 5

7a839ae43f2f439a98c76653c790794dtplv-k3u1fbpfcp-jj-mark3024000q75.awebp_

每秒两三M左右,13G左右,理论上差不多十分钟,实际上不止 

然后等待下载完成后进行如项目目录测试 (cd chatglm2-6b

命令行测试

试一下命令行启动: python3 进入交互式命令行

 

ini

代码解读
复制代码
from transformers import AutoTokenizer, AutoModel
tokenizer = AutoTokenizer.from_pretrained("THUDM/chatglm2-6b-int4", trust_remote_code=True)
model = AutoModel.from_pretrained("THUDM/chatglm2-6b-int4", trust_remote_code=True, device='cuda')
response, history = model.chat(tokenizer, "你好", history=[])
print(response)

实际上AutoModel.from_pretrained 加载模型加载了很久 

7b7f758936db43b58ba3d09b66849654tplv-k3u1fbpfcp-jj-mark3024000q75.awebp_

然后出现了报错:

 

arduino

代码解读
复制代码
. Make sure to double-check they do not contain any added malicious code. To avoid downloading new versions of the code file, you can pin a revision.
pytorch_model.bin: 100%|█████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████| 3.92G/3.92G [18:36<00:00, 3.51MB/s]
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/usr/local/lib/python3.10/dist-packages/transformers/models/auto/auto_factory.py", line 479, in from_pretrained
    return model_class.from_pretrained(
  File "/usr/local/lib/python3.10/dist-packages/transformers/modeling_utils.py", line 2675, in from_pretrained
    model = cls(config, *model_args, **model_kwargs)
  File "/root/.cache/huggingface/modules/transformers_modules/THUDM/chatglm2-6b-int4/66ecaf1db3a5085714e133357ea4824b69698743/modeling_chatglm.py", line 856, in __init__
    self.transformer = ChatGLMModel(config, empty_init=empty_init, device=device)
  File "/root/.cache/huggingface/modules/transformers_modules/THUDM/chatglm2-6b-int4/66ecaf1db3a5085714e133357ea4824b69698743/modeling_chatglm.py", line 756, in __init__
    self.encoder = init_method(GLMTransformer, config, **init_kwargs)
  File "/usr/local/lib/python3.10/dist-packages/torch/nn/utils/init.py", line 52, in skip_init
    return module_cls(*args, **kwargs).to_empty(device=final_device)
  File "/usr/local/lib/python3.10/dist-packages/torch/nn/modules/module.py", line 1039, in to_empty
    return self._apply(lambda t: torch.empty_like(t, device=device), recurse=recurse)
  File "/usr/local/lib/python3.10/dist-packages/torch/nn/modules/module.py", line 810, in _apply
    module._apply(fn)
  File "/usr/local/lib/python3.10/dist-packages/torch/nn/modules/module.py", line 810, in _apply
    module._apply(fn)
  File "/usr/local/lib/python3.10/dist-packages/torch/nn/modules/module.py", line 810, in _apply
    module._apply(fn)
  [Previous line repeated 1 more time]
  File "/usr/local/lib/python3.10/dist-packages/torch/nn/modules/module.py", line 833, in _apply
    param_applied = fn(param)
  File "/usr/local/lib/python3.10/dist-packages/torch/nn/modules/module.py", line 1039, in <lambda>
    return self._apply(lambda t: torch.empty_like(t, device=device), recurse=recurse)
  File "/usr/local/lib/python3.10/dist-packages/torch/_refs/__init__.py", line 4681, in empty_like
    return torch.empty_permuted(
torch.cuda.OutOfMemoryError: CUDA out of memory. Tried to allocate 108.00 MiB. GPU 0 has a total capacty of 7.75 GiB of which 93.25 MiB is free. Including non-PyTorch memory, this process has 6.98 GiB memory in use. Of the allocated memory 6.87 GiB is allocated by PyTorch, and 1.58 MiB is reserved by PyTorch but unallocated. If reserved but unallocated memory is large try setting max_split_size_mb to avoid fragmentation.  See documentation for Memory Management and PYTORCH_CUDA_ALLOC_CONF

根据issue调整量化命令,我还以为直接改量化模型名称就行:

 

ini

代码解读
复制代码
model = AutoModel.from_pretrained("THUDM/chatglm2-6b-int4", trust_remote_code=True, device='cuda')

调整成:

 

ini

代码解读
复制代码
model = AutoModel.from_pretrained("THUDM/chatglm2-6b-int4", trust_remote_code=True).quantize(4).cuda()

解释是:如果在 from_pretrained 里传入 device='cuda',会把量化前的模型构建在 GPU上。 ,显卡只有8G 跑不了。

所以现在就可以了:

8b34e5e1f2f7491d8889d44a5f037324tplv-k3u1fbpfcp-jj-mark3024000q75.awebp_

02a8636dd8e34fc0af72384b3b3ccb9ftplv-k3u1fbpfcp-jj-mark3024000q75.awebp_

问了两个问题,显存涨了300多M: 

8942b4c049ba48dcac99cae61f26d885tplv-k3u1fbpfcp-jj-mark3024000q75.awebp_

平均一个问题涨了100M显存占用,回答内容还不错,比我想象中要聪明一点点 

0d5a0f5affac477098ae585ef979d4c6tplv-k3u1fbpfcp-jj-mark3024000q75.awebp_

WEB测试

找到官方的项目地址:github.com/THUDM/ChatG…

因为我是从Hugging Face 上下载的没有web测试的代码文件

找到web_demo2.py 根据自己的显卡显存调整一下量化等级代码:

 

ini

代码解读
复制代码
...
@st.cache_resource
def get_model():
    tokenizer = AutoTokenizer.from_pretrained("THUDM/chatglm2-6b-int4", trust_remote_code=True)
    model = AutoModel.from_pretrained("THUDM/chatglm2-6b-int4", trust_remote_code=True).quantize(4).cuda()
    # 多显卡支持,使用下面两行代替上面一行,将num_gpus改为你实际的显卡数量
    # from utils import load_model_on_gpus
    # model = load_model_on_gpus("THUDM/chatglm2-6b", num_gpus=2)
    model = model.eval()
    return tokenizer, model
...

运行命令并访问:

 

arduino

代码解读
复制代码
streamlit run web.py

ed347d84e3224522adc697bbeb4a51a1tplv-k3u1fbpfcp-jj-mark3024000q75.awebp_

e6e85f63c8f34cc59a6e823e8f3a4a56tplv-k3u1fbpfcp-jj-mark3024000q75.awebp_

大模型的生成结果的文件流 可以通过streamlit流式传输 ,不用跟命令行一样等待全部结果生成出来返回,速度非常快,每秒大概四十个中文字符,体验非常棒~

show.gif

总结

整个环境搭建流程还算比较顺利,没有卡很久 ,然后大模型问答的结果内容比我想象中要好很多,感觉比ChatGPT3.5只差了一点点 ,主要是对话回复得非常快,这是在第三方的在线部署的模型是体验不到的,web版自己已经够玩了,后面可以尝试找些数据做微调训练了,然后对接API试试,这次简单的部署教程就到这里,微调训练敬请期待~

作者:土圭垚墝
链接:https://juejin.cn/post/7305473943573233701
来源:稀土掘金
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

「梦想一旦被付诸行动,就会变得神圣,如果觉得我的文章对您有用,请帮助本站成长」

赞(0) 打赏
一分也是爱

支付宝扫一扫打赏

微信扫一扫打赏

上一篇:

下一篇:

相关推荐

博客简介

本站CDN采用VmShell免费提供离中国大陆最近的香港CMI高速网络做支撑,ToToTel打造全球最快速的边沿网络支撑服务,具体详情请见 :https://vmshell.com/ 以及 https://tototel.com/,网站所有的文件和内容禁止大陆网站搬迁复制,谢谢,VPS营销投稿邮箱: admin@linuxxword.com,我们免费帮大家发布,不收取任何费用,请提供完整测试文稿!

精彩评论

友情链接

他们同样是一群网虫,却不是每天泡在网上游走在淘宝和网游之间、刷着本来就快要透支的信用卡。他们或许没有踏出国门一步,但同学却不局限在一国一校,而是遍及全球!申请交换友链

站点统计

  • 文章总数: 2534 篇
  • 草稿数目: 19 篇
  • 分类数目: 6 个
  • 独立页面: 0 个
  • 评论总数: 2 条
  • 链接总数: 0 个
  • 标签总数: 10493 个
  • 注册用户: 139 人
  • 访问总量: 8,654,208 次
  • 最近更新: 2024年9月15日