vLLMcuda安装笔记

news2024/11/17 5:27:40

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}")

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

参考资料:

  • conda&pytorch环境搭建笔记
  • cuda-tool 官方下载地址
  • vllm部署Qwen说明文档

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1975272.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

最新个人免签约支付系统源码|PHP源码 | 码支付系统 | ThinkPHP6框架 | 开源

源码介绍&#xff1a; 这个最新的个人专用免签约支付系统源码&#xff01;是PHP源码写的哦&#xff0c;而且是用ThinkPHP6框架开发的&#xff0c;完全开源的码支付系统。 这个系统适合个人用户使用&#xff0c;作为收款的免签约解决方案。它还加入了监控端&#xff0c;可以拒…

Linux 调试追踪: trace-cmd 和 kernelshark

文章目录 1. 前言2. 概述3. trace-cmd3.1 下载3.2 交叉编译3.3 安装、运行3.3.1 trace-cmd 示范&#xff1a;抓取系统调度信息 4. kernelshark5. 参考资料 1. 前言 限于作者能力水平&#xff0c;本文可能存在谬误&#xff0c;因此而给读者带来的损失&#xff0c;作者不做任何承…

Java多线程-----定时器(Timer)及其实现

目录 一.定时器简介&#xff1a; 二.定时器的构造方法与常见方法&#xff1a; 三.定时器的模拟实现&#xff1a; 思路分析&#xff1a; 代码实现&#xff1a; 在开发中&#xff0c;我们经常需要一些周期性的操作&#xff0c;例如每隔几分钟就进行某一项操作&#xff0c;这…

【QT】常用控件-上

欢迎来到Cefler的博客&#x1f601; &#x1f54c;博客主页&#xff1a;折纸花满衣 目录 &#x1f449;&#x1f3fb;QWidgetenabledgeometryrect制作上下左右按钮 window frame 的影响window titlewindowIcon代码示例: 通过 qrc 管理图片作为图标 windowOpacitycursor使用qrc自…

Python | Leetcode Python题解之第309题买卖股票的最佳时机含冷冻期

题目&#xff1a; 题解&#xff1a; class Solution:def maxProfit(self, prices: List[int]) -> int:if not prices:return 0n len(prices)f0, f1, f2 -prices[0], 0, 0for i in range(1, n):newf0 max(f0, f2 - prices[i])newf1 f0 prices[i]newf2 max(f1, f2)f0, …

【笔记】《冲击弹性波理论与应用》[2-2] 振动信号分析

1.前级硬件滤波 - 降噪 2.软件降噪 2.1 移动平滑滤波 2.1.1 移动平滑滤波的效果 2.2 经验模态分解法 2.1.1 效果 3 信号分析 除了FFT,最大熵和小波变换现在也很流行。 3.1 最大熵 3.1.1 与FFT的比对 3.2 相关性分析 3.2.1 自相关 3.2.2 互相关 3.3. 小波 非等周期信号 3…

《python语言程序设计》2018第6章第28题 掷骰子 两个色子,分别是1到6

2、3、12 玩家输 7、11玩家赢 4、5、6、8、9、10算1点&#xff0c;之后出7玩家输或者和上一次相同。def rolled(num_t):count 0still_win 0second_win 0still_lose 0second_lose 0while count < num_t:a_1 random.randint(1, 6)b_1 random.randint(1, 6)tTen a_1 b…

力扣-41.缺失的第一个正数

刷力扣热题–第二十五天:41.缺失的第一个正数 新手第二十五天 奋战敲代码&#xff0c;持之以恒&#xff0c;见证成长 1.题目简介 2.题目解答 做这道题有点投机取巧的感觉&#xff0c;要求时间复杂度O(N),且空间复杂度O(1)&#xff0c;那么就是尽可能的去找到更多的可能性&…

C语言程序设计之数组1

程序设计之数组1 问题1_1代码1_1结果1_1 问题1_2代码1_2结果1_2 问题1_3代码1_3结果1_3 问题1_4代码1_4结果1_4 问题1_5代码1_5结果1_5 问题1_1 函数 f u n fun fun 的功能是&#xff1a;移动一位数组中的内容&#xff0c;若数组中有 n n n 个整数&#xff0c;要求把下标从 …

软件测试生命周期、BUG描述与处理策略

软件测试的生命周期 需求分析&#xff1a;需求是否完整、是否正确 测试计划&#xff1a;确定由谁测试、测试的起止时间、设计哪些模块 测试设计、测试开发&#xff1a;写测试用例&#xff08;手工、自动化测试用例&#xff09;、编写测试工具 执行测试用例 测试评估&…

衢州骨伤科医院为98岁高龄老人做髋关节置换,患者第三天便下地行走

灵活迈步、周身整洁、双手提着两口袋鸡蛋......在清晨的菜市场里&#xff0c;王阿婆&#xff08;化名&#xff09;在人群里穿梭&#xff0c;买一些自己和女儿想吃的菜。如果没有看到她的脸&#xff0c;大家都以为她只有 60 多岁&#xff1b;再定睛一看&#xff0c;她虽然脸上布…

Token的原理及区别,以及与Cookie,Session之间的区别?

Token&#xff0c;特别是JSON Web Token&#xff08;JWT&#xff09;&#xff0c;也是一种用于管理用户状态和身份的机制&#xff0c;但它与Cookie和Session的工作方式有所不同。下面将详细解释Token如何管理用户状态和身份。 Token的工作原理 Token是一种无状态的认证机制&am…

QQ邮箱 + Kafka + Redis + Thymeleaf 模板引擎实现简单的用户注册认证

1. 前提条件 1.1 Redis 1.1.1 拉取 Redis 镜像 docker pull redis:latest 1.1.2 启动 Redis 容器 docker run --name my-redis -d -p 6379:6379 redis:latest1.2 Kafka 1.2.1 docker-compose.yml version: 3.8 services:zookeeper:image: "zookeeper:latest"h…

【C++入门(上)】—— 我与C++的不解之缘(一)

前言&#xff1a; 学完C语言和初阶数据结构&#xff0c;感觉自己又行了&#xff1f; 接下来进入C的学习&#xff0c;准备好接受头脑风暴吧。 一、第一个C程序 C 的第一个程序&#xff0c;梦回出学C语言&#xff0c;第一次使用C语言写代码&#xff1b;这里使用C写第一个C代码。 …

微信文件如何直接打印及打印功能在哪里设置?

在数字化时代&#xff0c;打印需求依旧不可或缺&#xff0c;但传统打印店的高昂价格和不便操作常常让人头疼。幸运的是&#xff0c;琢贝打印作为一款集便捷、经济、高效于一体的网上打印平台&#xff0c;正逐渐成为众多用户的首选。特别是通过微信小程序下单&#xff0c;更是让…

html+css前端作业和平精英2个页面(无js)

htmlcss前端作业和平精英2个页面&#xff08;无js&#xff09;有视频播放器等功能效果 下载地址 https://download.csdn.net/download/qq_42431718/89608232 目录1 目录2 项目视频 和平精英2个页面&#xff08;无js&#xff09;带视频播放 页面1 页面2

MinIO:高性能轻量云存储轻松搭建与springboot应用整合实践

简介 Minio是一款用Golang编写的开源对象存储套件&#xff0c;遵循Apache License v2.0开源协议。它虽然体积小巧&#xff0c;但性能出色。Minio支持亚马逊S3云存储服务接口&#xff0c;可以方便地与其他应用如NodeJS、Redis、MySQL等集成使用。 纠删码技术 Minio纠删码是一…

SpringBoot项目以及相关数据库部署在Linux常用命令

SpringBoot项目部署 1.IDEA打包&#xff0c;在IDEA终端&#xff0c;输入mvn clean install mvn clean package&#xff1a;删除目标文件夹、编译代码并打包mvn clean install&#xff1a;删除目标文件夹、编译代码并打包、将打好的包放置到本地仓库中 2.将项目target中的jar包…

LeetCode 面试经典 150 题 | 位运算

目录 1 什么是位运算&#xff1f;2 67. 二进制求和3 136. 只出现一次的数字4 137. 只出现一次的数字 II5 201. 数字范围按位与 1 什么是位运算&#xff1f; ✒️ 源自&#xff1a;位运算 - 菜鸟教程 在现代计算机中&#xff0c;所有数据都以二进制形式存储&#xff0c;…

【多模态大模型】 BLIP-2 in ICML 2023

一、引言 论文&#xff1a; BLIP-2: Bootstrapping Language-Image Pre-training with Frozen Image Encoders and Large Language Models 作者&#xff1a; Salesforce Research 代码&#xff1a; BLIP-2 特点&#xff1a; 该方法分别使用冻结的图像编码器&#xff08;ViT-L/…