项目简介
本项目聚焦于在Windows系统的小显存机器(如LAPTOP RTX 3060)上,实现InternLM2-Chat-7B模型的4bit量化并本地搭建运行。通过解决bitsandbytes与triton只能在Linux上运行的限制,以及利用共享GPU显存等方法,让低配置机器也能体验大语言模型的对话功能。
项目的主要特性和功能
- 低显存运行:借助4bit量化技术,降低模型运行时的显存需求,使小显存机器可运行7B大语言模型。
- Windows系统适配:解决了bitsandbytes与triton在Windows系统下无法直接使用的问题,实现量化运行。
- 共享GPU利用:通过更新显卡驱动和创建张量的方式,利用共享GPU显存,缓解显存不足问题。
- 本地网页端对话:搭建完成后,可在本地网页端与模型进行对话交互。
安装使用步骤
环境准备
- 确保GPU为LAPTOP RTX 3060 ,系统为Windows 11,CUDA版本为11.7.64,显卡驱动版本为551.23,Python版本为3.10.13。
- 安装以下依赖库:
- pytorch: 2.0.1
- transformers:4.37.2
- streamlit:1.30.0
- bitsandbytes: 0.41.1
- triton: 2.0.0
下载InternLM
- 创建项目目录如下(命名仅供参考):
InternLM_Try │ └── ... └── InternLM2-Chat-7B └── ...
- 访问 InternLM2 HuggingFace 项目地址,下载项目文件至目录
InternLM_Try/InternLM2-Chat-7B
。 - 创建环境,假设虚拟环境名为 InternLM-env,执行以下命令安装依赖库:
pip install modelscope pip install transformers pip install streamlit pip install sentencepiece pip install accelerate
修改配置并运行
python
@st.cache_resource
def load_model():
model = (AutoModelForCausalLM.from_pretrained('internlm/internlm2-chat-7b',
trust_remote_code=True).to(
torch.bfloat16).cuda())
tokenizer = AutoTokenizer.from_pretrained('internlm/internlm2-chat-7b',
trust_remote_code=True)
return model, tokenizer
调用命令:
activate InternLM-env
streamlit run web_demo.py --server.address 127.0.0.1 --server.port 6006
打开 https://127.0.0.1:6006 即可进行本地网页端对话。
4-bit量化
如果显存不够,需要进行4-bit量化:
1. 执行pip install -U bitsandbytes
,并在函数加载时指定load_in_4bit=True
。
2. Windows系统下量化大模型:
- 确保bitsandbytes不报错:参考官方issues和一些有用的issue和comment进行相关修改,如修改site-packages\bitsandbytes\cuda_setup\main.py
中函数返回值为.dll,修改编码问题等。
- 下载libbitsandbytes_cuda117.dll,并放到site-packages\bitsandbytes
内。
- 在下载bitsandbytes前手动在环境变量LD_LIBRARY_PATH中添加CUDA的lib路径,可使用 set
在 cmd 内临时设置环境变量。
- 拷贝 CUDA 的 bin 内的文件至site-packages\bitsandbytes
。
- 遇到No module
报错直接pip
安装(除非是linux专属)。
3. 下载triton:如果报错No Module 'triton'
,根据相关教程下载triton的.whl文件triton-2.0.0-cp310-cp310-win_amd64.whl。
使用共享GPU
如果LAPTOP3060显存不足,可使用共享GPU:
1. 更新Nvidia显卡驱动至536.40+,可通过打开 GeForce Experience 软件直接下载。
2. 创建张量:
activate InternLM-env
python
import torch
a = torch.zeros((1000, 1000, 1000, 2), dtype = torch.int32, device = "cuda")
使用完后,释放张量和清理缓存:
python
del a
torch.cuda.empty_cache()
import gc
gc.collect()
下载地址
点击下载 【提取码: 4003】【解压密码: www.makuang.net】