vLLM&cuda安装笔记

1. 引言

最近在部署Qwen模型时,文档上有提到强烈建议用vLLM来部署模型,按照公开的性能测试数据,用vLLM部署Qwen模型的文本推理速度要比transformers部署快3~4倍。带着这个好奇就开始安装尝试,但试下来这个安装过程并没有那么顺利,便有了此文来记录整个环境搭建的过程。

vLLM是伯克利大学LMSYS组织开源的大语言模型高速推理框架,利用了全新的注意力算法「PagedAttention」,有效地管理Attention中的K和V。在吞吐量方面,vLLM的性能比HuggingFace Transformers(HF)高出 24 倍,文本生成推理(TGI)高出3.5倍。

2. vLLM环境要求

vLLM的安装指导说明上对python和cuda有着明确的版本要求,如下面截图所示:

vLLM安装指导地址:https://docs.vllm.ai/en/latest/getting_started/installation.html

在这里插入图片描述
首先是python,由于前面在不知情的情况下,已经安装了最新的python3.12版本,那就只能新创建一个3.10的虚拟环境。

conda及虚拟环境的创建请参考:conda环境搭建笔记

其次是cuda,vLLM是拿12.1版本编译的,但本地机器装的cuda为12.0,尝试过向下兼容的方式后无果,最终选择按照官方建议的cuda-12.1来重新安装,这意味着不仅仅是vLLM,机器上已经安装的pytorch、cuda都需要重新安装。

安装说明上有提供cuda-11.8的版本,正好之前pytorch安装时选择的也是cuda-11.8,所以尝试过取巧直接安装11.8,但最终没有成功,报一些cuda.C的一些.so动态库找不到(具体信息未能保留下来),就放弃了。
在这里插入图片描述

由于cuda是pytorch和vLLM的基础依赖,首先需要重装cuda。

3. CUDA安装

3.1 下载安装包

下载网址:https://developer.nvidia.com/cuda-toolkit-archive

首先选择自己要安装的版本(12.1):
在这里插入图片描述
逐个勾选自己的环境信息,勾选完后下面会自动出现与所选环境匹配的安装指令:
在这里插入图片描述
在这里插入图片描述
先复制上面的wget指令,下载文件(文件有4G,需要下一段时间)。
在这里插入图片描述

3.2 安装

下载完后执行如下命令开始安装。

sudo sh cuda_12.1.0_530.30.02_linux.run

安装程序正式开始复制文件之前,可能会有两个小插曲(具体与本地环境有关):旧环境兼容性检测和GPU是否在使用的检查。

3.2.1 旧环境兼容性检测

刚启动安装时会执行对本地旧环境的兼容性检测,如果发现本地机器的nvidia驱动与要安装的cuda版本不一致,安装程序会强烈建议你将已经存在的nvidia驱动卸载(命令如下面所示)。

apt-get remove --purge nvidia-driver-530
apt-get autoremove

需要注意的是此命令的用途,它会将机器上已经存在的nvidia驱动删除,个人猜测目的可能是为了保持cuda与的nvidia驱动的版本一致。

这里尝试过不卸载,但没有成功,cuda与nvidia版本不一致可能会导致驱动无法工作,运行nvidia-smi命令报如下截图中错误,最后还是乖乖按照指示进行了删除操作。
在这里插入图片描述

3.2.2 GPU是否在使用的检查

安装程序会检测GPU是否在使用中,如果在使用中,会提示退出所有GPU之后才能继续安装。

如果此时nvidia-smi命令可用,可以从命令输出结果中看到哪个进程在使用GPU:
在这里插入图片描述
查到被占用的GPU序号(上面截图中是0),则可以用如下命令来释放GPU:

sudo nvidia-smi --gpu-reset -i 0
GPU 00000000:3E:00.0 was successfully reset.
All done.

上面的方法是基于nvidia-smi存在的情况下,但是如果前面已经卸载了nvidia驱动程序(nvidia-smi命令也会被删除),那用什么方法查看GPU的状态呢?

用fuser命令能够列出哪些进程在使用GPU,然后使用kill命令将这些进程结束就行。

# 查找所有使用GPU的进程
sudo fuser -v /dev/nvidia*
sudo kill -9 <PID>

在这里插入图片描述

3.2.3 主流程安装

之后会提示你去勾选要安装的功能清单,用默认就好。
在这里插入图片描述
安装过程中,如果前面卸载了nvidia驱动程序,此时会自动安装与cuda版本配套的nvidia驱动程序,而cuda则会被安装到/usr/local/cuda-12.1目录下,安装完后的磁盘位置如下图所示:
在这里插入图片描述

3.3 配置环境变量

将cuda的库和命令添加到环境变量中。

echo 'export PATH=/usr/local/cuda-12.1/bin:$PATH' >> ~/.bashrc
echo 'export LD_LIBRARY_PATH=/usr/local/cuda-12.1/lib64:$LD_LIBRARY_PATH' >> ~/.bashrc
source ~/.bashrc

验证cuda安装结果:

nvcc --version
nvcc: NVIDIA (R) Cuda compiler driver
Copyright (c) 2005-2023 NVIDIA Corporation
Built on Tue_Feb__7_19:32:13_PST_2023
Cuda compilation tools, release 12.1, V12.1.66
Build cuda_12.1.r12.1/compiler.32415258_0

验证nvidia驱动程序安装结果:

可以看到,这里显示的cuda version和上面nvcc命令显示的版本是一致的。

在这里插入图片描述

4. 重装pytorch

之前pytorch是基于cuda-11.8安装的,当上面cuda版本变更后,需要重新选择能适配cuda-12.1的pytorch版本重新安装。

注:pytorch一定要先于vllm来安装,因为vllm安装时会检测本地机器的cuda和pytorch是否满足版本要求,如果没有匹配的依赖,vllm是无法安装的。

在这里插入图片描述
具体过程这里就不细列,详情见: conda&pytorch环境搭建笔记

5. vllm

5.1 安装vllm

前面的cuda和pytorch都使用官方建议的版本后,安装vllm的命令就和正常库的安装命令一样,但是由于下载的软件包很多,这个过程也会比较长。

pip install vllm

安装完成后如下图所示:
在这里插入图片描述
验证vllm的安装结果:

!pip show vllm
WARNING: Ignoring invalid distribution -orch (/data2/anaconda3/envs/python3_10/lib/python3.10/site-packages)
Name: vllm
Version: 0.5.3.post1
Summary: A high-throughput and memory-efficient inference and serving engine for LLMs
Home-page: https://github.com/vllm-project/vllm
Author: vLLM Team
Author-email: 
License: Apache 2.0
Location: /data2/anaconda3/envs/python3_10/lib/python3.10/site-packages
Requires: aiohttp, cmake, fastapi, filelock, lm-format-enforcer, ninja, numpy, nvidia-ml-py, openai, outlines, pillow, prometheus-client, prometheus-fastapi-instrumentator, psutil, py-cpuinfo, pydantic, pyzmq, ray, requests, sentencepiece, tiktoken, tokenizers, torch, torchvision, tqdm, transformers, typing-extensions, uvicorn, vllm-flash-attn, xformers
Required-by: 
5.2 验证vllm功能

在jupyter里贴一段加载模型的代码,尝试将本地下载好的模型Load进来:

from transformers import AutoTokenizer
from vllm import LLM, SamplingParams

model_dir = "/data2/anti_fraud/models/modelscope/hub/Qwen/Qwen2-0___5B-Instruct"
# Initialize the tokenizer
tokenizer = AutoTokenizer.from_pretrained(model_dir)

# max_tokens is for the maximum length for generation.
sampling_params = SamplingParams(temperature=0.7, top_p=0.8, repetition_penalty=1.05, max_tokens=512)

# Input the model name or path. Can be GPTQ or AWQ models.
llm = LLM(model=model_dir)

在这里插入图片描述
再贴一段代码来测试模型是否能正常推理:

# Prepare your prompts
prompt = "Tell me something about large language models."
messages = [
    {"role": "system", "content": "You are a helpful assistant."},
    {"role": "user", "content": prompt}
]
text = tokenizer.apply_chat_template(
    messages,
    tokenize=False,
    add_generation_prompt=True
)

# generate outputs
outputs = llm.generate([text], sampling_params)

# Print the outputs.
for output in outputs:
    prompt = output.prompt
    generated_text = output.outputs[0].text
    print(f"Prompt: {prompt!r}, Generated text: {generated_text!r}")

生成的文本如下:
在这里插入图片描述

参考资料:

### 如何在 Jupyter Notebook 中部署 vLLM 模型 为了在 IPython Notebook 或者更常见的 Jupyter Notebook 中部署 vLLM 模型,可以遵循如下指南: #### 安装依赖库 首先,在环境中安装必要的 Python 库。这可以通过运行以下命令实现: ```bash pip install modelscope ``` 接着克隆特定版本的 `vllm` 项目仓库到本地机器上,并通过开发模式安装此包以便于后续操作。 ```bash git clone https://github.com/zwd003/vllm.git cd vllm pip install -e . ``` #### 下载预训练模型 利用 ModelScope 提供的功能下载所需的预训练模型文件至指定目录内。例如,针对轻量级对话版 DeepSeek V2 Lite Chat 模型执行如下代码片段: ```python from modelscope import snapshot_download model_directory = snapshot_download( 'deepseek-ai/DeepSeek-V2-Lite-Chat', cache_dir='/root/autodl-tmp' ) print(f"Model saved at {model_directory}") ``` #### 加载并初始化模型实例 创建一个新的 notebook 单元格用于加载刚刚获取下来的模型权重参数以及配置信息,从而构建出可供交互使用的 LLM 对象。 假设已经成功完成了上述步骤,则可以直接导入相应的类定义并且传入之前保存下来的位置路径作为参数之一来进行初始化工作。 ```python import os from transformers import AutoTokenizer, AutoModelForCausalLM tokenizer_path = os.path.join(model_directory, "tokenizer") model_weights_path = model_directory tokenizer = AutoTokenizer.from_pretrained(tokenizer_path) model = AutoModelForCausalLM.from_pretrained(model_weights_path) # 如果 GPU 可用的话建议移至此设备加速推理过程 if torch.cuda.is_available(): device = "cuda" else: device = "cpu" model.to(device) ``` #### 构建互动界面 最后一步是在笔记本里设置简单的用户接口让用户能够方便快捷地输入查询语句并与之交流。这里展示了一个基础的例子说明如何接收来自用户的文本消息并通过调用前面准备好的 transformer pipeline 来返回预测结果。 ```python def interact_with_model(prompt_text): inputs = tokenizer(prompt_text, return_tensors="pt").to(device) outputs = model.generate(**inputs, max_length=50) response = tokenizer.decode(outputs[0], skip_special_tokens=True) print(response) # 测试函数效果 test_prompt = "你好啊!今天过得怎么样?" interact_with_model(test_prompt) ``` 以上就是在 Jupyter Notebook 上面搭建起一套完整的基于 vLLM 的大型语言模型服务的方法概述[^1]。
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

沉下心来学鲁班

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值