大模型-qwen1.5-本地部署
参照
https://www.modelscope.cn
https://www.modelscope.cn/models/Qwen/Qwen1.5-0.5B-Chat
https://blog.csdn.net/weixin_39797176/article/details/143518284?fromshare=blogdetail&sharetype=blogdetail&sharerId=143518284&sharerefer=PC
Qwen1.5-0.5B-Chat:大模型
前置要求
transformers:自然语言处理
pytorch:机器学习和深度学习框架
TensorFlow:机器学习平台
streamlit:python应用开发库
环境要求
硬件环境
在macos上,安装virtualbox,并新建虚拟机,配置1cpu、8g内存、60g硬盘。
软件环境
包括:python3、pip
ubuntu22 server内置python3,如下所示
pip
curl https://bootstrap.pypa.io/get-pip.py -o get-pip.py
python3 get-pip.py --user
将/root/.local/bin加入到PATH环境变量
按照以上设置,PATH环境变量设置错误(path等号之后,不允许有空格),导致无法执行vi、ls等常见命令。临时更改环境变量,执行vi .profile修改。
安装transformers、torch包
pip install transformers torch -i https://pypi.tuna.tsinghua.edu.cn/simple
安装streamlit包
pip install streamlit -i https://pypi.tuna.tsinghua.edu.cn/simple
部署模型
下载模型、构造函数、启动测试
下载模型
打开模型文件
https://www.modelscope.cn/models/Qwen/Qwen1.5-0.5B-Chat/files
pip install modelscope
pip install modelscope -i https://pypi.tuna.tsinghua.edu.cn/simple
modelscope download --model Qwen/Qwen1.5-0.5B-Chat
默认下载路径:~/.cache/modelscope/hub/models/Qwen
构造函数
构造函数代码如下
modelscope默认下载模型位置如下,照此调整构造函数中模型路径
构造函数最好放入此路径,与模型根文件夹在同一文件夹下,否则肯能无法启动
代码
# 导入所需的库
from transformers import AutoTokenizer, AutoModelForCausalLM, GenerationConfig
import torch
import streamlit as st
import os
torch.classes.__path__ = [os.path.join(torch.__path__[0], torch.classes.__file__)]
# 在侧边栏中创建一个标题和一个链接
with st.sidebar:
st.markdown("## Qwen1.5 LLM")
"[开源大模型使用指南 self-llm](https://github.com/datawhalechina/self-llm.git)"
# 创建一个滑块,用于选择最大长度,范围在0到1024之间,默认值为512
max_length = st.slider("max_length", 0, 1024, 512, step=1)
# 创建一个标题和一个副标题
st.title("Qwen1.5 Chatbot")
st.caption("A streamlit chatbot powered by Self-LLM")
# 定义模型路径
#mode_name_or_path = '~/.cache/modelscope/hub/models/Qwen/Qwen1.5-0.5B-Chat'
mode_name_or_path = './Qwen1.5-0.5B-Chat'
device = "cpu"
# 定义一个函数,用于获取模型和tokenizer
@st.cache_resource
def get_model():
# 从预训练的模型中获取tokenizer
tokenizer = AutoTokenizer.from_pretrained(mode_name_or_path, use_fast=False)
# 从预训练的模型中获取模型,并设置模型参数
model = AutoModelForCausalLM.from_pretrained(mode_name_or_path, torch_dtype=torch.bfloat16, device_map="auto").to(device)
return tokenizer, model
# 加载Qwen1.5-4B-Chat的model和tokenizer
tokenizer, model = get_model()
# 如果session_state中没有"messages",则创建一个包含默认消息的列表
if "messages" not in st.session_state:
st.session_state["messages"] = [{"role": "assistant", "content": "有什么可以帮您的?"}]
# 遍历session_state中的所有消息,并显示在聊天界面上
for msg in st.session_state.messages:
st.chat_message(msg["role"]).write(msg["content"])
# 如果用户在聊天输入框中输入了内容,则执行以下操作
if prompt := st.chat_input():
# 将用户的输入添加到session_state中的messages列表中
st.session_state.messages.append({"role": "user", "content": prompt})
# 在聊天界面上显示用户的输入
st.chat_message("user").write(prompt)
# 构建输入
input_ids = tokenizer.apply_chat_template(st.session_state.messages, tokenize=False, add_generation_prompt=True)
# model_inputs = tokenizer([input_ids], return_tensors="pt").to('cuda')
# model_inputs = tokenizer([input_ids], return_tensors="pt").to('cpu')
model_inputs = tokenizer([input_ids], return_tensors="pt").to(device)
# generated_ids = model.generate(model_inputs.input_ids, max_new_tokens=512)
generated_ids = model.generate(model_inputs.input_ids, max_new_tokens=256)
generated_ids = [
output_ids[len(input_ids):] for input_ids, output_ids in zip(model_inputs.input_ids, generated_ids)
]
response = tokenizer.batch_decode(generated_ids, skip_special_tokens=True)[0]
# 将模型的输出添加到session_state中的messages列表中
st.session_state.messages.append({"role": "assistant", "content": response})
# 在聊天界面上显示模型的输出
st.chat_message("assistant").write(response)
启动测试
启动
streamlit run chatBot.py --server.address 192.168.12.44 --server.port 6006
加入图表
引入依赖包
pandas、numpy
pip install pandas -i https://pypi.tuna.tsinghua.edu.cn/simple
pip install numpy -i https://pypi.tuna.tsinghua.edu.cn/simple
代码处理
聊天界面追加图形,代码调整如下
显示效果如下
问题处理
问题一
报错如下所示
按照提示执行
pip install 'accelerate>=0.26.0'
问题二
pip install --upgrade jinja2 -i https://pypi.tuna.tsinghua.edu.cn/simple
问题三
浏览器打开连接时,服务器控制台会有如下报错,但还可以在浏览器进行交互问答。
第一个错误是
Sliding Window Attention is enabled but not implemented for `sdpa`; unexpected results may be encountered.
出现该警告的原因在于模型启用了滑动窗口注意力(Sliding Window Attention),但当前使用的PyTorchsdpa(Scaled Dot Product Attention)实现尚未支持该功能,可能导致注意力计算不符合预期。
可以通过指定attn_implementation参数,例如
若GPU支持(如Ampere架构及以上),安装flash-attn并指定使用Flash Attention 2:
pip install flash-attn -i https://pypi.tuna.tsinghua.edu.cn/simple
报错无法安装,没有英伟达显卡、CUDA。仍未解决。
第二个错误是冲突
在streamlit应用中,使用torch报了错误:Tried to instantiate class '__path__._path', but it does not exist! Ensure that it is registered via torch::class_
则是二者冲突所致
可在代码中添加