双卡 3080ti 部署 Yi-34B 大模型 - Gradio + vLLM 踩坑全记录

本文详细记录了使用vllm在12G显存的双卡环境中部署Yi-34B模型的过程,涉及显存分配策略、modelscope配置和Gradio的使用问题,包括如何解决Gradio的网络环境限制以获取外网分享链接。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

这里是 B 站【双显卡部署 Yi-34B 大模型 - vLLM + Gradio 踩坑记录】 的详细笔记,请和那边的视频一同食用效果更佳!

引言

上次介绍了怎么用 vllm 去部署 Yi-34B 的 Int4 版本。这次尝试下 12G 显存的双卡部署,因为这个模型即使是 int4 的版本,也差不多需要至少 20G 的显存,所以如果是 12G 显存的话,也至少需要两块显卡。我这里尝试下用两个 3080Ti 跑起来这个模型。

整个过程其实和上个视频的过程是类似的,本来觉得整个过程应该比较顺利,但最后发现还是踩了不少坑,这里我用这个视频把整个过程记录一下供大家参考。

所以请参考 只需 24G 显存,用 vllm 跑起来 Yi-34B 中英双语大模型 以及 视频 一起看。

TL;DR

  1. 12G 双卡部署需要额外的参数,不然会容易出现显存不足的报错,这部分参数在其他显存紧张的场景同样适用
  2. Gradio 所提供的 share link 需要注意网络环境,必须先让它下载 frp,然后关闭网络加速才能看到 share link

一键部署 vllm 处理显存不足的问题

先安装 vllmmodelscope

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

注意这里我们多了三个环境变量:

  1. MODELSCOPE_CACHE=/root/autodl-tmp 是说我们把 modelscope 的缓存目录设置到了 /root/autodl-tmp,这是为了修改 modelscope 默认的下载路径。
  2. VLLM_USE_MODELSCOPE=True 就是说我们要使用 modelscope 的模型,vllm 默认是从 huggingface 下载的。
  3. PYTORCH_CUDA_ALLOC_CONF=max_split_size_mb:64 这是说我们要把显存分配的最大块设置到 64 MB,这样我们就可以在显存比较紧张的情况下让 pytorch 不要白白分配额外的显存。

最后我们多了三个额外的参数

  1. -tp 2 这是说我们要把模型加载到两块显卡上。
  2. --gpu-memory-utilization 1 这是说我们要把显存占用率设置到 1 而不是默认的 0.9,这样我们就可以把两块显卡的显存都用上。
  3. --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 的内网穿透的工具,第一次使用这个功能的时候就需要首先从网上下载这个工具,然而这个工具放在外网,所以下载不下来,需要先想办法把这个文件下载下来。

然后下载成功了之后也依然没办法看到那个外网访问的地址,因为在获得了这个工具之后,第二部就是去申请一个域名,而这个申请域名访所访问的网址如果开了学术加速就访问不到了。所以需要先打开学术加速下载这个工具,然后关闭学术加速再执行代码才能获得这个链接。

参考链接

  1. Welcome to vLLM!
  2. Yi-34B-Chat-4bits
  3. 如何修改 modelscope 的 cache 目录
  4. Optimizing Production PyTorch Models’ Performance with Graph Transformations
  5. frp
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值