掘金 人工智能 前天 11:50
在本地部署Qwen大语言模型全过程总结
index_new5.html
../../../zaker_core/zaker_tpl_static/wap/tpl_guoji1.html

 

本文详细介绍了如何在本地部署大语言模型Qwen1.5-7B-Chat。首先,讲解了理论计算模型所需的存储空间,并提出了通过量化技术(如8-bit或4-bit)来降低显存占用的方法。接着,指导用户如何从Hugging Face镜像站下载模型,并推荐使用官方命令行工具。在环境配置部分,重点阐述了显卡驱动安装、CUDA版本管理(通过软链接切换)以及使用Anaconda创建Python虚拟环境来解决依赖冲突。最后,提供了一个完整的Python脚本示例,展示了如何加载量化后的模型、进行分词、构建对话输入并生成响应,帮助读者掌握大模型本地部署的全流程。

💡 **模型存储与量化**:部署大语言模型首先需计算存储需求,以7B参数模型为例,全精度FP32约需28GB显存。为适应消费级显卡,可通过“量化”技术压缩精度,如将FP32映射到INT8,显著降低显存占用。8-bit量化理论上可使7B模型运行在8GB显存,但实际运行还需考虑中间缓存等因素,因此4-bit量化更为推荐。

🚀 **模型下载与管理**:开源大模型通常托管在Hugging Face,国内用户可使用HF-Mirror镜像站。下载模型推荐使用Hugging Face官方提供的命令行工具`huggingface-cli`,并需配合`pip install huggingface_hub`安装依赖及设置环境变量`HF_ENDPOINT`。

🖥️ **环境配置的关键步骤**:本地部署需要细致的环境配置。包括安装与操作系统适配的显卡驱动(如Ubuntu的`sudo ubuntu-drivers autoinstall`),以及灵活管理CUDA版本。通过修改`~/.bashrc`文件中的`PATH`和`LD_LIBRARY_PATH`,并利用软链接(如`/usr/local/cuda`指向具体CUDA版本目录)可以方便地切换不同CUDA版本以解决依赖冲突。同时,使用Anaconda创建独立的Python虚拟环境(如`conda create --name llm python=3.11`)是管理复杂依赖关系的有效手段。

🔧 **PyTorch及依赖安装**:在激活的Python虚拟环境中,安装与特定CUDA版本匹配的PyTorch版本至关重要,建议从PyTorch官网获取安装指令(如`pip install torch==2.7.1 torchvision==0.22.1 torchaudio==2.7.1 --index-url https://download.pytorch.org/whl/cu126`)。此外,还需要安装`bitsandbytes`、`transformers`和`accelerate`等库,其中`bitsandbytes`是实现4-bit量化的关键工具。

💬 **实现模型对话**:最终通过Python脚本实现模型对话。脚本加载本地模型和分词器,配置量化参数(`BitsAndBytesConfig`),设置`pad_token`,构建对话消息(如使用`apply_chat_template`),生成输入并将其送入模型进行推理,最后解码并打印模型输出。此过程揭示了大模型本地运行的底层逻辑。

1. 理论计算

大语言模型要进行本地部署,先得选择一个与本地环境适配的模型。比如笔者这里选择的是Qwen1.5-7B-Chat,那么可以计算一下需要的存储空间大小:

    这里的7B代表7-billion,也就是7×10⁹参数。每个参数是4字节浮点型。一次性加载所有参数需要7×10⁹×4 Bytes的存储空间7×10⁹×4 Bytes约等于28GB

入门消费级的显卡的显存是很少能满足这个存储要求的,比如笔者这里用的Nvidia GeForce RTX 4060 laptop只有8GB显存。为了能在这台机器上使用Qwen1.5-7B-Chat,就要进行量化。“量化”是个很专业的词汇,但其实没那么难理解,简单来说就是“压缩精度”,或者“降低分辨率”的意思。比如全精度的模型参数是4字节浮点型,将其重新映射到8位整型:

原始值(FP32)量化后(INT8)
0.12315
-0.456-58
0.999127

实现原理很简单,就是把一个浮点范围(比如-1.0到+1.0)划分成256个离散的等级(因为 8-bit可以表示2⁸=256个值),然后每个原始值“四舍五入”到最近的那个等级。这种处理办法在信号处理或者数字图形处理中也非常常见。

如果使用8-bit量化,那么7B模型大概只需要7GB显存,理论是可以在8GB显存的机器上部署的。不过实际上大模型运行不是只有模型权重参数这么简单,实际的显存占用=模型权重+中间缓存+ 优化器状态+输入输出等,所以最好还是使用4-bit量化。

2. 下载模型

一般开源的大模型都是托管在Hugging Face上,这里使用的Qwen1.5-7B-Chat也不例外。不过Hugging Face在国内因为网络问题连接不上,因此可以使用镜像站HF-Mirror。Hugging Face上的大模型数据可以使用git工具来下载,不过大模型的单个文件可能比较大,需要开启git lfs,使用起来还是有点麻烦。感觉git还是不太适合管理非代码项目,因此还是推荐使用Hugging Face 官方提供的命令行工具huggingface-cli来下载大模型。

首先是安装依赖:

pip install -U huggingface_hub

然后设置环境变量:

export HF_ENDPOINT=https://hf-mirror.com

最后下载模型:

huggingface-cli download --resume-download Qwen/Qwen1.5-7B-Chat --local-dir Qwen1.5-7B-Chat

3. 环境配置

需要说明的是因为部署大模型需要安装非常多的依赖包,它们之间的依赖关系可能不一致,所以有的时候会因为版本冲突安装不上。而且依赖库的源也一直在更新,现在不行说不定以后就可以了,只能讲讲大概的配置思路。

笔者这里使用的操作系统是Ubuntu Desktop 24.04 LTS,其实版本有点太新了,会导致低版本的CUDA或者PyTorch安装找不到相应的安装包。Linux的兼容性不像Windows那么强,有时候安装不上就只能重编译了。推荐使用Ubuntu 22.04版本可能会更好。

3.1 显卡驱动

安装显卡驱动:

sudo ubuntu-drivers autoinstall

笔者使用的是笔记本电脑,为了避免切换显卡的麻烦就在Ubuntu桌面的显卡设置中设置成独立显卡独占的模式。输入如下指令:

nvidia-smi

就会输出NVIDIA GPU的详细信息,包括使用的驱动版本、GPU温度、显存使用情况、功率消耗以及正在运行的进程等:

+-----------------------------------------------------------------------------------------+| NVIDIA-SMI 550.163.01             Driver Version: 550.163.01     CUDA Version: 12.4     ||-----------------------------------------+------------------------+----------------------+| GPU  Name                 Persistence-M | Bus-Id          Disp.A | Volatile Uncorr. ECC || Fan  Temp   Perf          Pwr:Usage/Cap |           Memory-Usage | GPU-Util  Compute M. ||                                         |                        |               MIG M. ||=========================================+========================+======================||   0  NVIDIA GeForce RTX 4060 ...    Off |   00000000:01:00.0 Off |                  N/A || N/A   37C    P8              3W /   55W |     189MiB /   8188MiB |      0%      Default ||                                         |                        |                  N/A |+-----------------------------------------+------------------------+----------------------++-----------------------------------------------------------------------------------------+| Processes:                                                                              ||  GPU   GI   CI        PID   Type   Process name                              GPU Memory ||        ID   ID                                                               Usage      ||=========================================================================================||    0   N/A  N/A      2699      G   /usr/lib/xorg/Xorg                            138MiB ||    0   N/A  N/A      3043      G   /usr/bin/gnome-shell                           40MiB ||    0   N/A  N/A      3227      G   /opt/freedownloadmanager/fdm                    2MiB |+-----------------------------------------------------------------------------------------+

3.2 CUDA

安装CUDA除了要跟操作系统适配,还有个麻烦的地方就是不同的依赖包对CUDA版本的要求不一致。依赖包的冲突可以通过虚拟环境解决,但是CUDA版本冲突就有点麻烦;这里就介绍一下笔者的办法。

首先正常安装CUDA的某个版本,比如笔者先安装的是12.9。这时输入指令:

nvcc --version

可以检查是否安装好12.9的版本。然后输入指令:

which nvcc

这个指令是用来查询cuda在操作系统的具体路径。笔者显示的是:

/usr/local/cuda-12.9/bin/nvcc

那么操作系统是怎么找到这个路径地址的呢,一般是在安装CUDA的时候添加到~/.bashrc这个文件来实现的。~/.bashrc是Linux中一个非常重要的用户级shell配置文件,会在每次打开一个新的Bash终端时自动执行。打开这个文件夹,找到:

export PATH=/usr/local/cuda-12.9/bin:$PATHexport LD_LIBRARY_PATH=/usr/local/cuda-12.9/lib64:$LD_LIBRARY_PATH

这部分配置,将其修改成:

export PATH=/usr/local/cuda/bin:$PATHexport LD_LIBRARY_PATH=/usr/local/cuda/lib64:$LD_LIBRARY_PATH

/usr/local/cuda是个软链接,会指向/usr/local/cuda-12.9这个文件夹。我们的目标就是根据需要修改这个软链接,达到切换CUDA版本的目的。

接着安装CUDA的第二个版本,笔者这里安装的是CUDA 12.6。不太确定第二次安装是否会将软链接覆盖了,但是没有关系。安装好两个版本之后,如果要切换12.9版本:

sudo rm -f /usr/local/cudasudo ln -s /usr/local/cuda-12.9 /usr/local/cuda

如果要切换12.6版本:

sudo rm -f /usr/local/cudasudo ln -s /usr/local/cuda-12.6 /usr/local/cuda

切换完成之后可以通过指令nvcc --version查看是否修改成功:

charlee@charlee-pc:~$ nvcc --versionnvcc: NVIDIA (R) Cuda compiler driverCopyright (c) 2005-2024 NVIDIA CorporationBuilt on Fri_Jun_14_16:34:21_PDT_2024Cuda compilation tools, release 12.6, V12.6.20Build cuda_12.6.r12.6/compiler.34431801_0

3.3 库包

安装Anaconda的过程这里就不介绍了,使用Anaconda主要是为了配置Python虚拟环境,解决依赖库地狱的问题。安装完成后使用如下指令安装虚拟环境:

conda create --name llm python=3.11

然后激活虚拟环境:

conda activate llm

接下来就是安装开源深度学习框架PyTorch,这个包非常重要,并且一般不通过Python默认pip地址获取,在其官方网站提供了具体的下载指令。比如笔者使用的基于CUDA12.6的PyTorch 2.7.1版本:

pip install torch==2.7.1 torchvision==0.22.1 torchaudio==2.7.1 --index-url https://download.pytorch.org/whl/cu126

最后安装部署大模型需要的依赖包:

pip install bitsandbytes transformers accelerate

其中bitsandbytes是优化LLM推理和训练的开源工具库,这里用来进行4-bit量化。除了bitsandbytes,auto-gptq也可以4-bit量化,不过笔者第一次的环境中安装auto-gptq总是安装不上,就转成使用bitsandbytes了。应该是Python、显卡驱动或者CUDA的版本太高了不兼容。

4 进行对话

最后一步就是启动大语言模型与其对话了。其实可以使用像Ollama这样的工具来一键部署,或者使用Gradio来实现图形界面。不过这里这里还是简单的实现一轮对话的例子,因为笔者想以此来了解一点底层的东西。毕竟如果为了实现大模型对话,直接使用官方在线部署的大模型就可以了。具体的Python脚本如下所示:

from transformers import AutoModelForCausalLM, AutoTokenizer, BitsAndBytesConfigimport torch# 修改为你的本地模型路径model_id = "/home/charlee/work/Qwen1.5-7B-Chat"# 配置量化(可选)quant_config = BitsAndBytesConfig(    load_in_4bit=True,    bnb_4bit_compute_dtype=torch.float16)# 从本地路径加载模型和分词器model = AutoModelForCausalLM.from_pretrained(    model_id,    quantization_config=quant_config,    device_map="auto",    trust_remote_code=True)tokenizer = AutoTokenizer.from_pretrained(    model_id,    trust_remote_code=True)# 设置 pad_tokenif tokenizer.pad_token is None:    tokenizer.pad_token = tokenizer.eos_token    tokenizer.pad_token_id = tokenizer.eos_token_id# 构造对话输入messages = [{"role": "user", "content": "用 Python 写一个快速排序"}]inputs = tokenizer.apply_chat_template(    messages,    return_tensors="pt",    add_generation_prompt=True).to("cuda")# 生成 attention_maskattention_mask = (inputs != tokenizer.pad_token_id).long()# 生成输出outputs = model.generate(    input_ids=inputs,    attention_mask=attention_mask,    max_new_tokens=512,    temperature=0.6,    top_p=0.9,    do_sample=True,    pad_token_id=tokenizer.eos_token_id,    eos_token_id=tokenizer.eos_token_id)# 只解码生成的部分generated_ids = outputs[0][inputs.shape[-1]:]response = tokenizer.decode(generated_ids, skip_special_tokens=True)print(response)

最终运行的结果如下所示:

Fish AI Reader

Fish AI Reader

AI辅助创作,多种专业模板,深度分析,高质量内容生成。从观点提取到深度思考,FishAI为您提供全方位的创作支持。新版本引入自定义参数,让您的创作更加个性化和精准。

FishAI

FishAI

鱼阅,AI 时代的下一个智能信息助手,助你摆脱信息焦虑

联系邮箱 441953276@qq.com

相关标签

大语言模型 本地部署 Qwen1.5-7B-Chat 量化 CUDA
相关文章