部署vllm的要求
- 仅支持在linuxc操作系统
- pyhon版本要求在3.8~3.12之间
部署操作流程
- 检查conda版本,若出现conda not found ,需要先安装conda环境
conda --version
2. 创建虚拟环境
conda create --name vllm python==3.12
3.激活虚拟环境
conda activate vllm
3.1. 无法激活原因分析及解决办法
AutoDL环境基于容器,初次使用或重置后,Shell可能没有加载Conda的初始化脚本。
conda init bash 初始化Bash Shell
source ~/.bashrc 重新加载shell
- 安装vllm框架
pip install vllm 安装vllm框架
pip show vllm 查看安装的版本号
- 下载大模型权重(一定要安装到数据盘,系统盘会被下满)
下载模型权重会从Hugging face 上下载大模型权重,但是国内服务器没有办法访问Hugging Face网站;所以国内用户需要使用国内镜像源ModelScope来执行模型权重的本地化存储
5.1. 安装ModelScope
pip install modelscope
5.2. 魔塔社区选择Deepseek-R1-Distill-Qwen-7b
5.3. SDK形式下载模型
5.4. 在数据盘创建安装文件夹(先进入 /root/autodl-tmp 数据盘所在位置)
5.5. SDK安装
需要指定好cache_dir
- 虚拟环境安装ipykernel和jupyter包
pip install ipykernel jupyter
7. 将虚拟环境的kernel写入到jupyter lab。创建一个ipykernel内核
python -m ipykernel install --user --name vllm --display-name "vllm"
根据命令,在
Jupyter kernel中就会出现选择vllm内核的选项,如下图所示:
7.1. 验证是否加载到了vllm的虚拟环境
pip show vllm
调用离线推理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,
)
- LLM重要参数
LLM类是运行离线推理的主要类,当使用LLM类进行模型初始化的加载时,有如下几个重要参数
- device: 该参数会指定模型加载的设备,vllm 支持在
cuda, neuron, cpu, tpu, xpu, hpu,默认是auto, 即初始化时会自动识别当前系统中可用的设备。 - tensor_parallel_size:该参数会指定模型可以通过
GPU的Tensor并行运行,默认是1,即不使用GPU的Tensor并行.可以指定多块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,
)
text内容回答较短,因为推理模型包含思考过程,所以需要对generate接口要求输出的token数更大,这里引入SimplingParams概念。默认情况下,vllm离线推理API会使用原生定义的采样参数,也就是本地存储权重中的generation_config.json文件中的配置
如果某些开源的模型权重中没有提供该文件,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")