这里是 B 站【双显卡部署 Yi-34B 大模型 - vLLM + Gradio 踩坑记录】 的详细笔记,请和那边的视频一同食用效果更佳!
引言
上次介绍了怎么用 vllm 去部署 Yi-34B 的 Int4 版本。这次尝试下 12G 显存的双卡部署,因为这个模型即使是 int4 的版本,也差不多需要至少 20G 的显存,所以如果是 12G 显存的话,也至少需要两块显卡。我这里尝试下用两个 3080Ti 跑起来这个模型。
整个过程其实和上个视频的过程是类似的,本来觉得整个过程应该比较顺利,但最后发现还是踩了不少坑,这里我用这个视频把整个过程记录一下供大家参考。
所以请参考 只需 24G 显存,用 vllm 跑起来 Yi-34B 中英双语大模型 以及 视频 一起看。
TL;DR
- 12G 双卡部署需要额外的参数,不然会容易出现显存不足的报错,这部分参数在其他显存紧张的场景同样适用
- Gradio 所提供的 share link 需要注意网络环境,必须先让它下载 frp,然后关闭网络加速才能看到 share link
一键部署 vllm 处理显存不足的问题
先安装 vllm
和 modelscope
pip install -i https://pypi.tuna.tsinghua.edu.cn/simple vllm modelscope
然后我们从文档这里可以看到 vllm
其实是支持 modelscope
一键部署的,就是说我们没必要自己去下载 modelscope
里的模型,在启动 vllm
的时候它会帮我们进行下载。
export MODELSCOPE_CACHE=/root/autodl-tmp
export VLLM_USE_MODELSCOPE=True
export PYTORCH_CUDA_ALLOC_CONF=max_split_size_mb:64
python -m vllm.entrypoints.openai.api_server \
--model 01ai/Yi-34B-Chat-4bits \
--served-model-name 01ai/Yi-34B-Chat-4bits \
--trust-remote-code \
--max-model-len 2048 -q awq \
-tp 2 \
--gpu-memory-utilization 1 \
--enforce-eager
注意这里我们多了三个环境变量:
MODELSCOPE_CACHE=/root/autodl-tmp
是说我们把modelscope
的缓存目录设置到了/root/autodl-tmp
,这是为了修改modelscope
默认的下载路径。VLLM_USE_MODELSCOPE=True
就是说我们要使用modelscope
的模型,vllm 默认是从huggingface
下载的。PYTORCH_CUDA_ALLOC_CONF=max_split_size_mb:64
这是说我们要把显存分配的最大块设置到 64 MB,这样我们就可以在显存比较紧张的情况下让 pytorch 不要白白分配额外的显存。
最后我们多了三个额外的参数
-tp 2
这是说我们要把模型加载到两块显卡上。--gpu-memory-utilization 1
这是说我们要把显存占用率设置到 1 而不是默认的 0.9,这样我们就可以把两块显卡的显存都用上。--enforce-eager
是让 pytorch 强制使用 eager 模式,这样可以让显存占用更小。
不过这也是有代价的,这样并不会帮我们跳过重复的模型文件,而是会把整个仓库的文件全下载下来。
踩坑 gradio share link
首先还是粘贴 gradio chatbot 的代码。
from openai import OpenAI
import gradio as gr
# Set OpenAI's API key and API base to use vLLM's API server.
openai_api_key = "EMPTY"
openai_api_base = "http://localhost:8000/v1"
# 创建一个 OpenAI 客户端,用于与 API 服务器进行交互
client = OpenAI(
api_key=openai_api_key,
base_url=openai_api_base,
)
def predict(message, history):
# 将聊天历史转换为 OpenAI 格式
history_openai_format = [{"role": "system", "content": "你是个靠谱的 AI 助手,尽量详细的解答用户的提问。"}]
for human, assistant in history:
history_openai_format.append({"role": "user", "content": human })
history_openai_format.append({"role": "assistant", "content":assistant})
history_openai_format.append({"role": "user", "content": message})
# 创建一个聊天完成请求,并将其发送到 API 服务器
stream = client.chat.completions.create(
model='01ai/Yi-34B-Chat-4bits', # 使用的模型名称
messages= history_openai_format, # 聊天历史
temperature=0.8, # 控制生成文本的随机性
stream=True, # 是否以流的形式接收响应
extra_body={
'repetition_penalty': 1,
'stop_token_ids': [7]
}
)
# 从响应流中读取并返回生成的文本
partial_message = ""
for chunk in stream:
partial_message += (chunk.choices[0].delta.content or "")
yield partial_message
# 创建一个聊天界面,并启动它,share=True 让 gradio 为我们提供一个 debug 用的域名
gr.ChatInterface(predict).queue().launch(share=True)
依赖安装
pip install -i https://pypi.tuna.tsinghua.edu.cn/simple gradio==3.41 openai
执行代码,这里依然有一个很烦人的问题。你会发现,gradio
所提供的那个可以外网访问的地址迟迟没有出现。这个问题我查了很久终于发现了原因。
这是因为 gradio
要实现这个功能实际上用到了一个叫做 frp 的内网穿透的工具,第一次使用这个功能的时候就需要首先从网上下载这个工具,然而这个工具放在外网,所以下载不下来,需要先想办法把这个文件下载下来。
然后下载成功了之后也依然没办法看到那个外网访问的地址,因为在获得了这个工具之后,第二部就是去申请一个域名,而这个申请域名访所访问的网址如果开了学术加速就访问不到了。所以需要先打开学术加速下载这个工具,然后关闭学术加速再执行代码才能获得这个链接。