autoDL安装vllm+deepseek推理模型+Qwen+调用离线推理api

412 阅读4分钟

部署vllm的要求

  • 仅支持在linuxc操作系统
  • pyhon版本要求在3.8~3.12之间

部署操作流程

  1. 检查conda版本,若出现conda not found ,需要先安装conda环境
conda --version

image.png 2. 创建虚拟环境

conda create --name vllm python==3.12

image.png 3.激活虚拟环境

conda activate vllm

a42f83f0-691f-4563-b0db-ec6c334466ca.png 3.1. 无法激活原因分析及解决办法

AutoDL环境基于容器,初次使用或重置后,Shell可能没有加载Conda的初始化脚本。

conda init bash    初始化Bash Shell
source ~/.bashrc   重新加载shell

image.png

  1. 安装vllm框架
pip install vllm   安装vllm框架
pip show vllm      查看安装的版本号

image.png

  1. 下载大模型权重(一定要安装到数据盘,系统盘会被下满)

下载模型权重会从Hugging face 上下载大模型权重,但是国内服务器没有办法访问Hugging Face网站;所以国内用户需要使用国内镜像源ModelScope来执行模型权重的本地化存储

5.1. 安装ModelScope

pip install modelscope

image.png 5.2. 魔塔社区选择Deepseek-R1-Distill-Qwen-7b

image.png 5.3. SDK形式下载模型

image.png

5.4. 在数据盘创建安装文件夹(先进入 /root/autodl-tmp 数据盘所在位置) image.png

image.png 5.5. SDK安装

需要指定好cache_dir

image.png

image.png

image.png

  1. 虚拟环境安装ipykernel和jupyter包
pip install ipykernel jupyter

7. 将虚拟环境的kernel写入到jupyter lab。创建一个ipykernel内核

python -m ipykernel install --user --name vllm --display-name "vllm"

根据命令,在Jupyter kernel 中就会出现选择vllm 内核的选项,如下图所示:

image.png

7.1. 验证是否加载到了vllm的虚拟环境

pip show vllm

cbc802c2-e238-45c0-92c3-c4491f3aed82.png

调用离线推理API

这里我们的模型上从ModelScope下载的,所以在调用离线推理API时,需要搭配trust_remote_code = True参数

from vllm import LLM

llm = LLM(model="/root/autodl-tmp/08_vllm/Qwen/Qwen2___5-7B",
          trust_remote_code=True,
          tensor_parallel_size=1,
          max_model_len=4096,
)
  1. LLM重要参数

LLM类是运行离线推理的主要类,当使用LLM类进行模型初始化的加载时,有如下几个重要参数

  • device: 该参数会指定模型加载的设备,vllm 支持在 cuda, neuron, cpu, tpu, xpu, hpu,默认是auto, 即初始化时会自动识别当前系统中可用的设备。
  • tensor_parallel_size:该参数会指定模型可以通过GPUTensor并行运行,默认是1,即不使用GPUTensor并行.可以指定多块GPU
  • gpu_memory_utilization:该参数会指定模型加载时,GPU的显存取值范围为0~1,使用率,默认是0.90,即GPU的显存使用率不会0过95%,但该参数会直接占用GPU的显存,以避免GPU的显存被其他进占用。

2.单词提问与批量提问

outputs = llm.generate("你好,请你介绍一下你自己")

outputs


--- 解析方法
for output in outputs:
    generated_text = output.outputs[0].text
    print(f"Generated text: {generated_text!r}")
text = [
    "你好,请你介绍一下你自己",
    "请问什么是机器学习",
    "请问如何理解大模型?"
]

outputs = llm.generate(text)

outputs



--- 解析方法
for output in outputs:
    prompt = output.prompt
    generated_text = output.outputs[0].text
    print(f"Prompt: {prompt!r}, Generated text: {generated_text!r}")

3.调用推理模型DeepSeek-R1-Distill-Qwen-7B

from vllm import LLM

llm = LLM(model="/root/autodl-tmp/08_vllm/deepseek-ai/DeepSeek-R1-Distill-Qwen-7B",
          trust_remote_code=True,
          tensor_parallel_size=1,
          max_model_len=4096,
)

image.png

text内容回答较短,因为推理模型包含思考过程,所以需要对generate接口要求输出的token数更大,这里引入SimplingParams概念。默认情况下,vllm离线推理API会使用原生定义的采样参数,也就是本地存储权重中的generation_config.json文件中的配置

image.png

如果某些开源的模型权重中没有提供该文件,vllm会根据其定义的simplingparams类自动指定默认值。由于DeepSeek-r1-distill-7b没有设置max_tokens,从而导致vllm使用的默认值。所以我们需要设置更长的max_tokens

# vllm_model.py
from vllm import SamplingParams

# 根据 DeepSeek 官方的建议,temperature应在 0.5-0.7,推荐 0.6 
sampling_params = SamplingParams(max_tokens=8192, temperature=0.6, top_p=0.95)

3.1. 提问与解析

从结果上看,很难区分哪些是推理过程,哪些是推理的最红结果,因此,在Vllm框架下使用推理模型时,一个比较有效的技巧是每个输入的文本问题,都要以<think>\n 结尾,便可以直接改善推理模型返回的数据格式,如下代码所示

prompts = [
    "帮我制定一个北京的三天旅游计划<think>\n",
]

outputs = llm.generate(prompts, sampling_params=sampling_params)
outputs


--- 解析
for output in outputs:
    prompt = output.prompt
    generated_text = output.outputs[0].text
    if r"</think>" in generated_text:
        think_content, answer_content = generated_text.split(r"</think>")
    else:
        think_content = ""
        answer_content = generated_text
    print(f"Prompt: {prompt!r}\nThink: {think_content!r}\nAnswer: {answer_content!r}\n")