当前位置: 首页 > news >正文

vllm部署LLM(qwen2.5,llama,deepseek)

目录

环境

qwen2.5-1.5b-instruct

模型下载

vllm 安装

验证安装

vllm 启动

查看当前模型列表

OpenAI Completions API(文本生成)

OpenAI Chat Completions API(chat 对话)

vllm 进程查看,kill

llama3

deepseek-蒸馏版 qwen


环境

Name: vllm
Version: 0.7.3

Name: torch
Version: 2.5.1

Name: transformers
Version: 4.49.0

cuda:V100-32GB

Version:12.1

qwen2.5-1.5b-instruct

模型下载

from modelscope import snapshot_download
model_dir = snapshot_download('Qwen/Qwen2.5-1.5B-Instruct', cache_dir='/root/autodl-tmp/')

 cache_dir 保存路径

vllm 安装

直接 pip 即可

pip install vllm

验证安装

安装好 vllm,下载好模型后,可以用以下代码试下 vllm 推理,如果正常会有运行结果

import os
import warnings
os.environ['CUDA_VISIBLE_DEVICES'] = '0'
warnings.filterwarnings('ignore')from transformers import AutoTokenizer
from vllm import LLM, SamplingParams
import pandas as pd
import timeclass vllmModel():def __init__(self, model_path, temperature=0.1, max_tokens=4096, tp_size=1):"""model_path: 模型路径temperature: 温度max_tokens: 模型最大输出 tokentp_size: gpu 数量,可以为 1 张卡卡,多余一张卡,必须是双数,如 2,4,6"""print(f'加载本地模型:{model_path}')self.tokenizer = AutoTokenizer.from_pretrained(model_path, trust_remote_code=True)self.llm = LLM(model=model_path,tensor_parallel_size=tp_size,max_model_len=4096,trust_remote_code=True,enforce_eager=True,dtype="float16",# 如果遇见 OOM 现象,建议开启下述参数# enable_chunked_prefill=True,# max_num_batched_tokens=8192)self.sampling_params = SamplingParams(temperature=temperature, max_tokens=max_tokens)print("模型加载完毕")def infer(self, prompts):"""prompts: prompt 列表"""prompts = [{"role": "user", "content": prompt} for prompt in prompts]inputs = []for prompt in prompts:_input = self.tokenizer.apply_chat_template([prompt], tokenize=False, add_generation_prompt=True)inputs.append(_input)outputs = self.llm.generate(prompts=inputs, sampling_params=self.sampling_params)result = []for output in outputs:text = output.outputs[0].textresult.append(text)return result# 加载模型
model_path = "/root/autodl-tmp/Qwen/Qwen2___5-1___5B-Instruct/"
llm = vllmModel(model_path)# infer
print(llm.infer(['你好', '你能做什么?']))

vllm 启动

qwen2.5 兼容 openai 的 api 服务,可以用一下命令启动:

VLLM_WORKER_MULTIPROC_METHOD=spawn \
vllm serve /root/autodl-tmp/Qwen/Qwen2___5-1___5B-Instruct \
--trust-remote-code \
--served-model-name qwen2_5_1_5 \
--gpu-memory-utilization 0.2 \
--tensor-parallel-size 1 \
--port 8000 \
--dtype=half

--dtype=half 跟 gpu 有关,因为我报错了,提示加这参数,是精度

--port 8000 开启端口为 8000

--trust-remote-code  允许执行远程代码

--served-model-name qwen2_5_1_5  模型名称定义,不是模型路径

--gpu-memory-utilization 0.2  gpu 显存占用,如果太高,我最开始 0.98,调用会崩掉

--tensor-parallel-size 1 使用 gpu 的数量

serve /root/autodl-tmp/Qwen/Qwen2___5-1___5B-Instruct 模型加载路径

--quantization awq 如果部署量化模型,即模型后缀为 AWQ,需要加上

vllm_use_v1=1 写在最开头,代表境变量为 1,表示你希望使用 vLLM 的 V1 API 版本。这通常涉及到API的设计,这个参数加上了,我这里不仅掉不通,一调就挂了,或者没多久也会自己挂,所以去掉

VLLM_WORKER_MULTIPROC_METHOD=spawn  写在最开头

这个变量指定在多进程模式下,worker(工作进程)启动的方法。在这个例子中,值被设置为 spawn。在Python的multiprocessing模块中有多种方法可以创建新进程,其中包括forkspawnforkserverspawn方法意味着每个新的进程都是通过启动一个全新的Python解释器实例来创建的。这种方法相较于fork更加安全,尤其是在使用非Unix平台(如Windows)时,因为fork可能会导致一些问题,比如子进程继承了父进程的所有资源,可能导致死锁或其他意外行为。

--max_model_len 4096 模型能够处理的最大序列长度(以token为单位),显存不够报错了,可以调小

CUDA_VISIBLE_DEVICES=0,2 写在最开头,指定使用哪张 gpu,这里是第 1,3 卡

启动成功会显示如下:

查看当前模型列表

curl http://localhost:8000/v1/models

{"object": "list","data": [{"id": "qwen2_5_1_5","object": "model","created": 1740235117,"owned_by": "vllm","root": "/root/autodl-tmp/Qwen/Qwen2___5-1___5B-Instruct","parent": null,"max_model_len": 32768,"permission": [{"id": "modelperm-514811fdf7464bc9bbd72db39850ef49","object": "model_permission","created": 1740235117,"allow_create_engine": false,"allow_sampling": true,"allow_logprobs": true,"allow_search_indices": false,"allow_view": true,"allow_fine_tuning": false,"organization": "*","group": null,"is_blocking": false}]}]
}

OpenAI Completions API(文本生成)

一般指文本生成类的使用,非 chat,即非对话的使用方式

curl http://localhost:8000/v1/completions \-H "Content-Type: application/json" \-d '{"model": "qwen2_5_1_5","prompt": "你好,你是?","max_tokens": 2048,"temperature": 0.7,"top_p": 0.8,"repetition_penalty": 1.05}'

加 repetition_penalty 之前,会有很多重复: 

加之后:

"max_tokens": 2048, 生成文本的最大长度(以token为单位)
"temperature": 0.7, 生成文本的随机性,值越小,创造能力越强,输出更加多样,适合创造场景
"top_p": 0.8, 核采样,类似温度,
"repetition_penalty": 1.05 用来减少重复词语出现的一个调节器。当其值大于1时(例如这里的 repetition_penalty: 1.05),会降低之前已经出现在生成文本中的词语被再次选中的概率。这有助于提高生成文本的新颖性,避免不必要的重复

{"id": "cmpl-adb0ffa50a1142a1880620126e341a70","object": "text_completion","created": 1740236869,"model": "qwen2_5_1_5","choices": [{"index": 0,"text": " 答案:我是小明。 A. 错误 B. 正确\nA. 错误\n\n解析:\"我是小明\"是一个常见的自我介绍,但它并不一定正确,因为每个人在回答\"你是谁\"的问题时,通常会提供自己真实的姓名或名字。\"小明\"可能是一个昵称或别名,这取决。。。。。。。。。。。。。。。。。。。","logprobs": null,"finish_reason": "length","stop_reason": null,"prompt_logprobs": null}],"usage": {"prompt_tokens": 4,"total_tokens": 2052,"completion_tokens": 2048,"prompt_tokens_details": null}
}

 python openai 接口:

from openai import OpenAI# 设置 OpenAI 的 API key 和 API base 来使用 vLLM 的 API server.
openai_api_key = "EMPTY"  # 如果不需要 API key,可以留空或设置为 "EMPTY"
openai_api_base = "http://localhost:8000/v1"client = OpenAI(api_key=openai_api_key,base_url=openai_api_base,
)# 创建 Completion 请求
completion_response = client.completions.create(model="qwen2_5_1_5",prompt="你好,你是?",max_tokens=2048,temperature=0.7,top_p=0.8,# 注意:OpenAI Python 客户端可能不直接支持 repetition_penalty,需要确认服务是否接受额外参数extra_body={"repetition_penalty": 1.05},
)# 检查响应并打印结果
if hasattr(completion_response, 'choices') and len(completion_response.choices) > 0:print("成功获取数据:")print(completion_response.choices[0].text)
else:print(f"请求失败,响应内容:{completion_response}")

python vllm 接口

import requests
import json# 设置请求的URL
url = "http://localhost:8000/v1/completions"# 设置请求头部
headers = {"Content-Type": "application/json"
}# 准备请求数据
data = {"model": "qwen2_5_1_5","prompt": "你好,你是?","max_tokens": 2048,"temperature": 0.7,"top_p": 0.8,"repetition_penalty": 1.05
}# 发送POST请求
response = requests.post(url, headers=headers, data=json.dumps(data))# 检查响应状态并打印结果
if response.status_code == 200:try:# 尝试解析响应中的 'choices' 字段,并获取生成的文本choices = response.json().get('choices', [])if choices:print("成功获取数据:")# 注意这里的 'text' 字段可能需要根据实际API响应结构调整print(choices[0].get('text', ''))else:print("没有获取到任何选择结果")except json.JSONDecodeError:print("无法解析JSON响应")
else:print(f"请求失败,状态码:{response.status_code}, 响应内容:{response.text}")

OpenAI Chat Completions API(chat 对话)

curl http://localhost:8000/v1/chat/completions \
-H "Content-Type: application/json" \
-d '{"model": "qwen2_5_1_5","messages": [{"role": "system", "content": "You are Qwen, created by Alibaba Cloud. You are a helpful assistant."},{"role": "user", "content": "你好,你是?"}],"temperature": 0.7,"top_p": 0.8,"repetition_penalty": 1.05,"max_tokens": 2048
}'

{"id": "chatcmpl-189df22813aa4b358e795596f0e2c420","object": "chat.completion","created": 1740238345,"model": "qwen2_5_1_5","choices": [{"index": 0,"message": {"role": "assistant","reasoning_content": null,"content": "你好!我是阿里云开发的一款语言模型,我叫通义千问。","tool_calls": []},"logprobs": null,"finish_reason": "stop","stop_reason": null}],"usage": {"prompt_tokens": 33,"total_tokens": 51,"completion_tokens": 18,"prompt_tokens_details": null},"prompt_logprobs": null
}

 python 代码 openai 接口

from openai import OpenAI# 设置 OpenAI 的 API key 和 API base 来使用 vLLM 的 API server.
openai_api_key = "EMPTY"
openai_api_base = "http://localhost:8000/v1"client = OpenAI(api_key=openai_api_key,base_url=openai_api_base,
)chat_response = client.chat.completions.create(model="qwen2_5_1_5",messages=[{"role": "system", "content": "You are Qwen, created by Alibaba Cloud. You are a helpful assistant."},{"role": "user", "content": "你是谁?"},],temperature=0.7,top_p=0.8,max_tokens=512,extra_body={"repetition_penalty": 1.05,},
)# 直接访问响应对象的属性,而不是尝试调用 .json()
print("Chat response:", chat_response.choices[0].message.content)

python vllm 接口

import requests
import json# 设置API的基本URL和端点
base_url = "http://localhost:8000/v1"
endpoint = "/chat/completions"url = base_url + endpoint# 设置请求头部
headers = {"Content-Type": "application/json",
}# 准备请求数据
data = {"model": "qwen2_5_1_5","messages": [{"role": "system", "content": "You are Qwen, created by Alibaba Cloud. You are a helpful assistant."},{"role": "user", "content": "你是谁?"},],"temperature": 0.7,"top_p": 0.8,"max_tokens": 512,"repetition_penalty": 1.05,  # 直接包含在请求体中
}# 发送POST请求
response = requests.post(url, headers=headers, data=json.dumps(data))# 检查响应状态并打印结果
if response.status_code == 200:print("Chat response:", response.json()['choices'][0]['message'])
else:print(f"请求失败,状态码:{response.status_code}, 响应内容:{response.text}")

vllm 进程查看,kill

ps aux | grep vllm

kill -9 6947

服务杀死了,但显存没释放

llama3

跟 qwen2.5 一样

deepseek-蒸馏版 qwen

vllm 启动需要加个参数 --enforce-eager

始终使用急切模式PyTorch,如果为False,则在混合模式下使用急切模式和CUDA图以获得最大性能和灵活性

vllm serve /root/autodl-tmp/deepseek-ai/DeepSeek-R1-Distill-Qwen-1___5B/ \
--trust-remote-code \
--served-model-name qwen2_5_1_5 \
--gpu-memory-utilization 0.7 \
--tensor-parallel-size 1 \
--max-model-len 32768 \
--dtype=half \
--enforce-eager

参数说明:VLLM参数解释-中文表格形式-CSDN博客

参考:

https://github.com/datawhalechina/self-llm/blob/master/models/Qwen2.5/03-Qwen2.5-7B-Instruct%20vLLM%20%E9%83%A8%E7%BD%B2%E8%B0%83%E7%94%A8.md

使用vLLM部署Qwen2.5-VL-7B-Instruct模型的详细指南_vllm qwen2.5-vl-CSDN博客

vLLM - Qwen

相关文章:

vllm部署LLM(qwen2.5,llama,deepseek)

目录 环境 qwen2.5-1.5b-instruct 模型下载 vllm 安装 验证安装 vllm 启动 查看当前模型列表 OpenAI Completions API(文本生成) OpenAI Chat Completions API(chat 对话) vllm 进程查看,kill llama3 deep…...

基于SpringBoot的“古城景区管理系统”的设计与实现(源码+数据库+文档+PPT)

基于SpringBoot的“古城景区管理系统”的设计与实现(源码数据库文档PPT) 开发语言:Java 数据库:MySQL 技术:SpringBoot 工具:IDEA/Ecilpse、Navicat、Maven 系统展示 系统整体功能图 系统首页界面 系统注册界面 景…...

如何防止 Docker 注入了恶意脚本

根据您的描述,攻击者通过 CentOS 7 系统中的 Docker 注入了恶意脚本,导致自动启动名为 “masscan” 和 “x86botnigletjsw” 的进程。这些进程可能用于网络扫描或其他恶意活动。为了解决这一问题,建议您采取以下步骤: 1. 停止并删…...

使用python接入腾讯云DeepSeek

本文主要从提供SSE方式接入DeepSeek,并通过fastapi websocket对外提供接入方法。 参考文档: 腾讯云大模型:https://cloud.tencent.com/document/product/1759/109380 fastAPI官网:https://fastapi.tiangolo.com/ WebSocketManager…...

【MySQL】服务正在启动或停止中,请稍候片刻后再试一次【解决方案】

问题呈现 在使用MySQL的过程中我们可能会遇到以上的情况 解决方法 首先以管理员身份打开命令行窗口,注意是管理员身份,不然无权限访问。输入命令tasklist| findstr "mysql",用于查找mysql的残留进程。这个时候我们就会看到一个…...

测试工程师玩转DeepSeek之Prompt

以下是测试工程师使用DeepSeek的必知必会提示词指南,分为核心场景和高效技巧两大维度: 一、基础操作提示模板 1. 测试用例生成 "作为[金融系统/物联网设备/云服务]测试专家,请为[具体功能模块]设计测试用例,要求&#xff1…...

【PyTorch】2024保姆级安装教程-Python-(CPU+GPU详细完整版)-

一、准备工作 pytorch需要python3.6及以上的python版本 我是利用Anaconda来管理我的python。可自行安装Anaconda。 Anaconda官网 Free Download | Anaconda 具体Anaconda安装教程可参考 https://blog.csdn.net/weixin_43412762/article/details/129599741?fromshareblogdet…...

精选案例展 | 智己汽车—全栈可观测驱动智能化运营与成本优化

本案例为“观测先锋 2024 可观测平台创新应用案例大赛”精选案例,同时荣获IT168“2024技术卓越奖评选-年度创新解决方案”奖。 项目背景 近年来,中国汽车行业进入转型升级阶段,智能网联技术成为行业发展的核心。车联网、自动驾驶等技术的加速…...

MySQL 使用 `WHERE` 子句时 `COUNT(*)`、`COUNT(1)` 和 `COUNT(column)` 的区别解析

文章目录 1. COUNT() 函数的基本作用2. COUNT(*)、COUNT(1) 和 COUNT(column) 的详细对比2.1 COUNT(*) —— 统计所有符合条件的行2.2 COUNT(1) —— 统计所有符合条件的行2.3 COUNT(column) —— 统计某一列非 NULL 的记录数 3. 性能对比3.1 EXPLAIN 分析 4. 哪种方式更好&…...

Linux运维——网络管理

Linux网络管理 一、Linux网络应用要点二、命令常见用法2.1、curl2.1.1、发送GET请求2.1.2、发送POST请求2.1.3、设置请求头2.1.4、处理cookies2.1.5、处理重定向2.1.6、调试和详细信息2.1.7、使用代理2.1.8、文件上传2.1.9、其它常用选项2.1.10、综合示例 2.2、wget2.2.1、基本…...

STM32CUBEIDE FreeRTOS操作教程(十三):task api 任务访问函数

STM32CUBEIDE FreeRTOS操作教程(十三):task api 任务访问函数 STM32CUBE开发环境集成了STM32 HAL库进行FreeRTOS配置和开发的组件,不需要用户自己进行FreeRTOS的移植。这里介绍最简化的用户操作类应用教程。以STM32F401RCT6开发板…...

Jmeter+Jenkins接口压力测试持续集成

项目介绍 接口功能测试应用&#xff1a; http://www.weather.com.cn/data/cityinfo/<city_code>.html 测试功能&#xff1a;获取对应城市的天气预报 请求方法&#xff1a;Get 压测脚本开发工具&#xff1a;jmeter 源码脚本位置&#xff1a; https://github.com/shife…...

深入浅出ES6:现代JavaScript的基石

ES6&#xff08;ECMAScript 2015&#xff09;是JavaScript语言的一次重大更新&#xff0c;引入了许多新特性&#xff0c;使JavaScript更加强大、优雅和易于维护。这些特性已经成为现代JavaScript开发的基石&#xff0c;掌握它们对于任何JavaScript开发者都至关重要。本文将深入…...

实现使用RBF(径向基函数)神经网络模拟二阶电机数学模型中的非线性干扰,以及使用WNN(小波神经网络)预测模型中的非线性函数来抵消迟滞影响的功能

下面将详细介绍如何实现使用RBF&#xff08;径向基函数&#xff09;神经网络模拟二阶电机数学模型中的非线性干扰&#xff0c;以及使用WNN&#xff08;小波神经网络&#xff09;预测模型中的非线性函数来抵消迟滞影响的功能。我们将按照以下步骤进行&#xff1a; 步骤1&#x…...

潜水泵,高效排水,守护城市与农田|深圳鼎跃

洪水是常见的自然灾害&#xff0c;在春夏季节的我国降水多为丰富&#xff0c;容易造成城市内部的洪涝灾害。特别是低洼地区的积水&#xff0c;不仅容易造成城市交通的出行不便&#xff0c;还存在潜在的隐患&#xff0c;严重影响了人们正常生活。 潜水泵作为一种高效、可靠的排水…...

易基因:RNA甲基化修饰和R-loop的交叉调控:从分子机制到临床意义|深度综述

大家好&#xff0c;这里是专注表观组学十余年&#xff0c;领跑多组学科研服务的易基因。 R-loop&#xff08;RNA-DNA杂合结构&#xff09;是转录调控、DNA复制和修复等关键细胞过程的重要组成部分。但R-loop异常积累可能会破坏基因组完整性&#xff0c;从而导致多种疾病的发生…...

115 道 MySQL 面试题,从简单到深入!

1. 什么是数据库事务&#xff1f; 数据库事务是一个作为单个逻辑工作单元执行的一系列操作。事务具有ACID属性&#xff0c;即原子性&#xff08;Atomicity&#xff09;、一致性&#xff08;Consistency&#xff09;、隔离性&#xff08;Isolation&#xff09;和持久性&#xf…...

一周学会Flask3 Python Web开发-flask3上下文全局变量session,g和current_app

锋哥原创的Flask3 Python Web开发 Flask3视频教程&#xff1a; 2025版 Flask3 Python web开发 视频教程(无废话版) 玩命更新中~_哔哩哔哩_bilibili flask3提供了session,g和current_app上下文全局变量来方便我们操作访问数据。 以下是一个表格&#xff0c;用于比较Flask中的…...

MFC学习笔记-1

一、编辑框和按钮 //.h文件private:CString str;//给窗口类加了一个变量&#xff08;定义一个成员变量&#xff09;&#xff0c;关联到IDC_EDIT1中&#xff08;要在实现中关联&#xff0c;源文件文件夹中&#xff09;CString str2;//接收button2&#xff0c;和IDC_EDIT2绑定 p…...

Linux搜索查找类指令

1、find指令 基本语法&#xff1a;find [搜索范围] [选项] 功能&#xff1a;将从指定目录向下递归地遍历其各个子目录&#xff0c;将满足条件的文件或目录显示在终端。 常用选项&#xff1a; 操作 命令示例 说明 查找指定路径下的所有文件 find /path/to/dir 查找指定目…...

大话软工笔记—需求分析概述

需求分析&#xff0c;就是要对需求调研收集到的资料信息逐个地进行拆分、研究&#xff0c;从大量的不确定“需求”中确定出哪些需求最终要转换为确定的“功能需求”。 需求分析的作用非常重要&#xff0c;后续设计的依据主要来自于需求分析的成果&#xff0c;包括: 项目的目的…...

使用 Streamlit 构建支持主流大模型与 Ollama 的轻量级统一平台

🎯 使用 Streamlit 构建支持主流大模型与 Ollama 的轻量级统一平台 📌 项目背景 随着大语言模型(LLM)的广泛应用,开发者常面临多个挑战: 各大模型(OpenAI、Claude、Gemini、Ollama)接口风格不统一;缺乏一个统一平台进行模型调用与测试;本地模型 Ollama 的集成与前…...

基于Java+MySQL实现(GUI)客户管理系统

客户资料管理系统的设计与实现 第一章 需求分析 1.1 需求总体介绍 本项目为了方便维护客户信息为了方便维护客户信息&#xff0c;对客户进行统一管理&#xff0c;可以把所有客户信息录入系统&#xff0c;进行维护和统计功能。可通过文件的方式保存相关录入数据&#xff0c;对…...

JavaScript 数据类型详解

JavaScript 数据类型详解 JavaScript 数据类型分为 原始类型&#xff08;Primitive&#xff09; 和 对象类型&#xff08;Object&#xff09; 两大类&#xff0c;共 8 种&#xff08;ES11&#xff09;&#xff1a; 一、原始类型&#xff08;7种&#xff09; 1. undefined 定…...

【Linux】Linux 系统默认的目录及作用说明

博主介绍&#xff1a;✌全网粉丝23W&#xff0c;CSDN博客专家、Java领域优质创作者&#xff0c;掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域✌ 技术范围&#xff1a;SpringBoot、SpringCloud、Vue、SSM、HTML、Nodejs、Python、MySQL、PostgreSQL、大数据、物…...

宇树科技,改名了!

提到国内具身智能和机器人领域的代表企业&#xff0c;那宇树科技&#xff08;Unitree&#xff09;必须名列其榜。 最近&#xff0c;宇树科技的一项新变动消息在业界引发了不少关注和讨论&#xff0c;即&#xff1a; 宇树向其合作伙伴发布了一封公司名称变更函称&#xff0c;因…...

《Docker》架构

文章目录 架构模式单机架构应用数据分离架构应用服务器集群架构读写分离/主从分离架构冷热分离架构垂直分库架构微服务架构容器编排架构什么是容器&#xff0c;docker&#xff0c;镜像&#xff0c;k8s 架构模式 单机架构 单机架构其实就是应用服务器和单机服务器都部署在同一…...

保姆级【快数学会Android端“动画“】+ 实现补间动画和逐帧动画!!!

目录 补间动画 1.创建资源文件夹 2.设置文件夹类型 3.创建.xml文件 4.样式设计 5.动画设置 6.动画的实现 内容拓展 7.在原基础上继续添加.xml文件 8.xml代码编写 (1)rotate_anim (2)scale_anim (3)translate_anim 9.MainActivity.java代码汇总 10.效果展示 逐帧…...

恶补电源:1.电桥

一、元器件的选择 搜索并选择电桥&#xff0c;再multisim中选择FWB&#xff0c;就有各种型号的电桥: 电桥是用来干嘛的呢&#xff1f; 它是一个由四个二极管搭成的“桥梁”形状的电路&#xff0c;用来把交流电&#xff08;AC&#xff09;变成直流电&#xff08;DC&#xff09;。…...

Monorepo架构: Nx Cloud 扩展能力与缓存加速

借助 Nx Cloud 实现项目协同与加速构建 1 &#xff09; 缓存工作原理分析 在了解了本地缓存和远程缓存之后&#xff0c;我们来探究缓存是如何工作的。以计算文件的哈希串为例&#xff0c;若后续运行任务时文件哈希串未变&#xff0c;系统会直接使用对应的输出和制品文件。 2 …...