[大模型]Qwen2-7B-Instruct vLLM 部署调用

2024-06-15 08:04

本文主要是介绍[大模型]Qwen2-7B-Instruct vLLM 部署调用,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

vLLM 简介

vLLM 框架是一个高效的大语言模型推理和部署服务系统,具备以下特性:

  • 高效的内存管理:通过 PagedAttention 算法,vLLM 实现了对 KV 缓存的高效管理,减少了内存浪费,优化了模型的运行效率。
  • 高吞吐量vLLM 支持异步处理和连续批处理请求,显著提高了模型推理的吞吐量,加速了文本生成和处理速度。
  • 易用性vLLMHuggingFace 模型无缝集成,支持多种流行的大型语言模型,简化了模型部署和推理的过程。兼容 OpenAIAPI 服务器。
  • 分布式推理:框架支持在多 GPU 环境中进行分布式推理,通过模型并行策略和高效的数据通信,提升了处理大型模型的能力。
  • 开源共享vLLM 由于其开源的属性,拥有活跃的社区支持,这也便于开发者贡献和改进,共同推动技术发展。

环境准备

AutoDL 平台中租赁一个 3090 等 24G 显存大小的容器实例,镜像选择如下 PyTorch2.1.03.10(ubuntu22.04)12.1

在这里插入图片描述

接下来打开本地设备终端使用 ssh 的方式访问,在终端中依次复制登录指令和密码完成登录

在这里插入图片描述

ssh 登录成功后的界面如图所示👇

在这里插入图片描述

或者也可以直接打开 AutoDL 网页端的快捷工具中选择 JupyterLab 并在其中点击终端打开(这种方式不需要验证🫠)

在这里插入图片描述

接下来开始环境配置、模型下载和运行演示 ~

pip 换源加速下载并安装依赖包

# 升级pip
python -m pip install --upgrade pip
# 更换 pypi 源加速库的安装
pip config set global.index-url https://pypi.tuna.tsinghua.edu.cn/simplepip install modelscope==1.11.0
pip install openai==1.17.1
pip install torch==2.1.2+cu121
pip install tqdm==4.64.1
pip install transformers==4.39.3
# 下载flash-attn 请等待大约10分钟左右~
MAX_JOBS=8 pip install flash-attn --no-build-isolation
pip install vllm==0.4.0.post1

直接安装 vLLM 会安装 CUDA 12.1 版本。

pip install vllm

考虑到部分同学配置环境可能会遇到一些问题,我们在AutoDL平台准备了Qwen2的环境镜像,该镜像适用于该仓库除Qwen-GPTQ和vllm外的所有部署环境。点击下方链接并直接创建Autodl示例即可。
https://www.codewithgpu.com/i/datawhalechina/self-llm/Qwen2

模型下载

使用 modelscope 中的 snapshot_download 函数下载模型,第一个参数为模型名称,参数 cache_dir为模型的下载路径。

先切换到 autodl-tmp 目录,cd /root/autodl-tmp

然后新建名为 model_download.pypython 脚本,并在其中输入以下内容并保存

# model_download.py
import os
import torch
from modelscope import snapshot_download, AutoModel, AutoTokenizer
model_dir = snapshot_download('qwen/Qwen2-7B-Instruct', cache_dir='/root/autodl-tmp', revision='master')

然后在终端中输入 python model_download.py 执行下载,这里需要耐心等待一段时间直到模型下载完成。

代码准备

Python脚本

/root/autodl-tmp 路径下新建 vllm_model.py 文件并在其中输入以下内容,粘贴代码后请及时保存文件。下面的代码有很详细的注释,如有不理解的地方,欢迎大家提 issue

首先从 vLLM 库中导入 LLMSamplingParams 类。LLM 类是使用 vLLM 引擎运行离线推理的主要类。SamplingParams 类指定采样过程的参数,用于控制和调整生成文本的随机性和多样性。

vLLM 提供了非常方便的封装,我们直接传入模型名称或模型路径即可,不必手动初始化模型和分词器。

我们可以通过这个代码示例熟悉下 vLLM 引擎的使用方式。被注释的部分内容可以丰富模型的能力,但不是必要的,大家可以按需选择,自己多多动手尝试 ~

# vllm_model.py
from vllm import LLM, SamplingParams
from transformers import AutoTokenizer
import os
import json# 自动下载模型时,指定使用modelscope。不设置的话,会从 huggingface 下载
os.environ['VLLM_USE_MODELSCOPE']='True'def get_completion(prompts, model, tokenizer=None, max_tokens=512, temperature=0.8, top_p=0.95, max_model_len=2048):stop_token_ids = [151329, 151336, 151338]# 创建采样参数。temperature 控制生成文本的多样性,top_p 控制核心采样的概率sampling_params = SamplingParams(temperature=temperature, top_p=top_p, max_tokens=max_tokens, stop_token_ids=stop_token_ids)# 初始化 vLLM 推理引擎llm = LLM(model=model, tokenizer=tokenizer, max_model_len=max_model_len,trust_remote_code=True)outputs = llm.generate(prompts, sampling_params)return outputsif __name__ == "__main__":    # 初始化 vLLM 推理引擎model='/root/autodl-tmp/qwen/Qwen2-7B-Instruct' # 指定模型路径# model="qwen/Qwen2-7B-Instruct" # 指定模型名称,自动下载模型tokenizer = None# 加载分词器后传入vLLM 模型,但不是必要的。# tokenizer = AutoTokenizer.from_pretrained(model, use_fast=False) text = ["你好,帮我介绍一下什么时大语言模型。","可以给我将一个有趣的童话故事吗?"]# messages = [#     {"role": "system", "content": "你是一个有用的助手。"},#     {"role": "user", "content": prompt}# ]# 作为聊天模板的消息,不是必要的。# text = tokenizer.apply_chat_template(#     messages,#     tokenize=False,#     add_generation_prompt=True# )outputs = get_completion(text, model, tokenizer=tokenizer, max_tokens=512, temperature=1, top_p=1, max_model_len=2048)# 输出是一个包含 prompt、生成文本和其他信息的 RequestOutput 对象列表。# 打印输出。for output in outputs:prompt = output.promptgenerated_text = output.outputs[0].textprint(f"Prompt: {prompt!r}, Generated text: {generated_text!r}")

运行代码

cd /root/autodl-tmp && python vllm_model.py

结果如下:

Prompt: '你好,帮我介绍一下什么时大语言模型。', Generated text: ' 当然!大语言模型是人工智能中的一种模型,特别擅长生成高质量的文本。它们从大量的文本数据中学习,并可以生成类似真实 文本的文本片段。例如,让它们写故事、文章、诗歌,或者在对话中生成连贯的回答。这类模型也被用于许多其他自然语言处理任务,如文本摘要、翻译和代码生成。这是因为它们能够理解和生成复杂的 语法和语义结构,以及捕捉到上下文中的微小细节。大语言模型的核心是采用深度学习技术,尤其是基于Transformer架构的模型,这种架构很好地处理了大量的序列数据,并在最近几年取得了显著的进展,这得益于大规模的训练数据集和计算资源。如今,许多大型语言模型是开源的,并且应用于各种开发和研究环境中。'Prompt: '可以给我将一个有趣的童话故事吗?', Generated text: ' 当然可以。这是一个关于勇敢的小猫头鹰的主题的童话故事:\n\n从前,在一片宁静的森林深处,住着一个聪明而勇敢的小猫头鹰。 它的名字叫迈克。每天,它都会在夜色中穿梭,寻找食物和学习更多的生存之道。它的家是一个它自己制作的巨大鸟巢,挂在一片松树的高枝上。\n\n一天夜里,森林受到了威胁,因为一只贪婪的老母狼 叛领了一队强盗在他的领地打劫。所有动物都陷入了恐慌,胆小的们躲在家里不敢出来,而胆大的动物们则是四处逃难。但是,没有一只动物敢于挑战母狼。\n\n作为勇敢和智慧的象征,小猫头鹰迈克决 定挺身而出。它认识到单靠野兽的力量是无法对抗母狼及其随从的,但是凭借智慧与策略,它或许可以找到一条解决方案。\n\n不日,迈克带着一个大胆的计划回到了森林。它宣布,所有的生物都将暂时 放下彼此之间的争斗,携手合作对抗这场危机。为了做到这一点,迈克将动物们聚集在一起,让迷人的动物学者白鹤教授教授所有生物如何彼此沟通、理解,并动员各具专业能力的动物,如挖掘专家老鼠 、电子设备专家松鼠制作无线电来秘密向森林里的其他动物发送求助信息。\n\n计划逐渐展开,动物们开始有了防范意识,并在夜晚骚动的女狼群不知道任何人计划的时候做出了各种有效的防御。动物中 个个都贡献了他们的力量。兔子与貘堵住了几个重要的入口,灵巧的松鼠们则收集了大量的浆果和营养物质,以供整个森林的动物们补充能量。\n\n最后,在一场夜里的明智逮捕行动之后,迈克的小猫头 鹰巧妙地通过其较好的夜视和听力,联合瞳熊和狮子成功的将贪婪的老母狼及其共犯赶出了森林。\n\n消息遍传,所有动物都对小猫头鹰的智慧,勇敢以及作为团队领袖的力量表示了敬意。他们现在紧紧 团结在了一起,建立了和谐而有尊严的社群。\n\n从此,森林中充满了欢声笑语,动物们和小猫头鹰迈克一起快乐地生活在和平与和谐中,展现出团结与智慧的伟大力量。这则故事教会我们,当我们团结 一致,敢于面对困难,发挥创造力和共同努力时,没有什么不可能克服的。'

在这里插入图片描述

创建兼容 OpenAI API 接口的服务器

Qwen 兼容 OpenAI API 协议,所以我们可以直接使用 vLLM 创建 OpenAI API 服务器。vLLM 部署实现 OpenAI API 协议的服务器非常方便。默认会在 http://localhost:8000 启动服务器。服务器当前一次托管一个模型,并实现列表模型、completionschat completions 端口。

  • completions:是基本的文本生成任务,模型会在给定的提示后生成一段文本。这种类型的任务通常用于生成文章、故事、邮件等。
  • chat completions:是面向对话的任务,模型需要理解和生成对话。这种类型的任务通常用于构建聊天机器人或者对话系统。

在创建服务器时,我们可以指定模型名称、模型路径、聊天模板等参数。

  • --host--port 参数指定地址。
  • --model 参数指定模型名称。
  • --chat-template 参数指定聊天模板。
  • --served-model-name 指定服务模型的名称。
  • --max-model-len 指定模型的最大长度。

这里指定 --max-model-len=2048 是因为 Qwen2-7B-Instruct 模型的最大长度为 128K,防止 vLLM 初始化 KV 缓存时消耗资源过大。

python -m vllm.entrypoints.openai.api_server --model /root/autodl-tmp/qwen/Qwen2-7B-Instruct  --served-model-name Qwen2-7B-Instruct --max-model-len=2048

加载完毕后出现如下信息说明服务成功启动

在这里插入图片描述

  • 通过 curl 命令查看当前的模型列表
curl http://localhost:8000/v1/models

得到的返回值如下所示

{"object": "list","data": [{"id": "Qwen2-7B-Instruct","object": "model","created": 1717735884,"owned_by": "vllm","root": "Qwen2-7B-Instruct","parent": null,"permission": [{"id": "modelperm-16bce2371b904132bbfab7c98c35403f","object": "model_permission","created": 1717735884,"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}]}]
}

在这里插入图片描述

  • 使用 curl 命令测试 OpenAI Completions API
curl http://localhost:8000/v1/completions \-H "Content-Type: application/json" \-d '{"model": "Qwen2-7B-Instruct","prompt": "你好","max_tokens": 50,"temperature": 0}'

得到的返回值如下所示

{"id": "cmpl-ddce490833d4442abc26ef58fa3bcfa3","object": "text_completion","created": 1717736213,"model": "Qwen2-7B-Instruct","choices": [{"index": 0,"text": ",我最近感觉很焦虑,有什么 方法可以缓解吗?\n你好!焦虑是一种常见的情绪反应,但可以通过一些方法来缓解。你可以尝试深呼吸、冥想、运动、听音乐、与朋友聊天等方式来放松自己。同时","logprobs": null,"finish_reason": "length","stop_reason": null}],"usage": {"prompt_tokens": 1,"total_tokens": 51,"completion_tokens": 50}
}

在这里插入图片描述

  • Python 脚本请求 OpenAI Completions API
# vllm_openai_completions.py
from openai import OpenAI
client = OpenAI(base_url="http://localhost:8000/v1",api_key="sk-xxx", # 随便填写,只是为了通过接口参数校验
)completion = client.chat.completions.create(model="Qwen2-7B-Instruct",messages=[{"role": "user", "content": "你好"}]
)print(completion.choices[0].message)

得到的返回值如下所示

ChatCompletionMessage(content='你好!很高兴为你提供帮助。有什么我可以为你做的吗?', role='assistant', function_call=None, tool_calls=None)

在这里插入图片描述

  • curl 命令测试 OpenAI Chat Completions API
curl http://localhost:8000/v1/chat/completions \-H "Content-Type: application/json" \-d '{"model": "Qwen2-7B-Instruct","messages": [{"role": "system", "content": "You are a helpful assistant."},{"role": "user", "content": "你好"}]}'

得到的返回值如下所示

{"id": "cmpl-14126e44b7ea4376b715bcc9954faf8a","object": "chat.completion","created": 1717736841,"model": "Qwen2-7B-Instruct","choices": [{"index": 0,"message": {"role": "assistant","content": "你好!很高兴能为你提供帮助。如果你有任何问题或需要信息,请随时告诉我。我会尽力回答你的问题或提供相关信息。"},"logprobs": null,"finish_reason": "stop","stop_reason": null}],"usage": {"prompt_tokens": 20,"total_tokens": 48,"completion_tokens": 28}
}

在这里插入图片描述

  • Python 脚本请求 OpenAI Chat Completions API
# vllm_openai_chat_completions.py
from openai import OpenAI
openai_api_key = "sk-xxx" # 随便填写,只是为了通过接口参数校验
openai_api_base = "http://localhost:8000/v1"client = OpenAI(api_key=openai_api_key,base_url=openai_api_base,
)chat_outputs = client.chat.completions.create(model="Qwen2-7B-Instruct",messages=[{"role": "system", "content": "You are a helpful assistant."},{"role": "user", "content": "你好"},]
)
print(chat_outputs)

得到的返回值如下所示

ChatCompletion(id='cmpl-6f3d64194d1949cca6f7df3e1e36d887', choices=[Choice(finish_reason='stop', index=0, logprobs=None, message=ChatCompletionMessage(content='你好!很高兴能与你交流。有什么问题或需要帮助的吗?', role='assistant', function_call=None, tool_calls=None), stop_reason=None)], created=1717737288, model='Qwen2-7B-Instruct', object='chat.completion', system_fingerprint=None, usage=CompletionUsage(completion_tokens=17, prompt_tokens=20, total_tokens=37))

在这里插入图片描述

另外,在以上所有的在请求处理过程中, API 后端都会打印相对应的日志和统计信息😊
在这里插入图片描述

速度测试

既然 vLLM 是一个高效的大型语言模型推理和部署服务系统,那么我们不妨就测试一下模型的回复生成速度。看看和原始的速度相比有多大的提升。这里直接使用 vLLM 自带的 benchmark_throughput.py 脚本进行测试。可以将当前文件夹 benchmark_throughput.py 脚本放在 /root/autodl-tmp/ 目录下。或者也可以自行下载脚本。

下面是一些 benchmark_throughput.py 脚本的参数说明:

  • --model 参数指定模型路径或名称。
  • --backend 推理后端,可以是 vllmhfmii。分布对应 vLLMHuggingFaceMii 推理后端。
  • --input-len 输入长度
  • --output-len 输出长度
  • --num-prompts 生成的 prompt 数量
  • --seed 随机种子
  • --dtype 数据类型
  • --max-model-len 模型最大长度
  • --hf_max_batch_size transformers 库的最大批处理大小(仅仅对于 hf 推理后端有效且为必填字段)
  • --dataset 数据集路径。(未设置会自动生成数据)

测试 vLLM 推理速度的命令和参数设置

python benchmark_throughput.py \--model /root/autodl-tmp/qwen/Qwen2-7B-Instruct \--backend vllm \  # --input-len 64 \--output-len 128 \--num-prompts 25 \--seed 2024 \--dtype float16 \--max-model-len 512

得到的结果如下所示

Throughput: 7.68 requests/s, 1474.75 tokens/s

在这里插入图片描述

测试原始方式(即使用 HuggingFaceTransformers 库)推理速度的命令和参数设置

python benchmark_throughput.py \--model /root/autodl-tmp/qwen/Qwen2-7B-Instruct \--backend hf \  # --input-len 64 \--output-len 128 \--num-prompts 25 \--seed 2024 \--dtype float16 \--hf-max-batch-size 25

得到的结果如下所示

Throughput: 5.73 requests/s, 1100.57 tokens/s

在这里插入图片描述

对比两者的推理速度,在本次测试中 vLLM 的速度要比原始的速度快 34% 左右 🤗

TIPS:本次测试并非严谨的测试,仅供本 case 参考,读者可以取多个测试用例并多次实验取平均以得到严谨的实验结论。

推理框架requests/stokens/s
vllm7.681474.75
hf5.731100.57
diff34.03%34.00%

这篇关于[大模型]Qwen2-7B-Instruct vLLM 部署调用的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1062875

相关文章

闲置电脑也能活出第二春?鲁大师AiNAS让你动动手指就能轻松部署

对于大多数人而言,在这个“数据爆炸”的时代或多或少都遇到过存储告急的情况,这使得“存储焦虑”不再是个别现象,而将会是随着软件的不断臃肿而越来越普遍的情况。从不少手机厂商都开始将存储上限提升至1TB可以见得,我们似乎正处在互联网信息飞速增长的阶段,对于存储的需求也将会不断扩大。对于苹果用户而言,这一问题愈发严峻,毕竟512GB和1TB版本的iPhone可不是人人都消费得起的,因此成熟的外置存储方案开

大模型研发全揭秘:客服工单数据标注的完整攻略

在人工智能(AI)领域,数据标注是模型训练过程中至关重要的一步。无论你是新手还是有经验的从业者,掌握数据标注的技术细节和常见问题的解决方案都能为你的AI项目增添不少价值。在电信运营商的客服系统中,工单数据是客户问题和解决方案的重要记录。通过对这些工单数据进行有效标注,不仅能够帮助提升客服自动化系统的智能化水平,还能优化客户服务流程,提高客户满意度。本文将详细介绍如何在电信运营商客服工单的背景下进行

Andrej Karpathy最新采访:认知核心模型10亿参数就够了,AI会打破教育不公的僵局

夕小瑶科技说 原创  作者 | 海野 AI圈子的红人,AI大神Andrej Karpathy,曾是OpenAI联合创始人之一,特斯拉AI总监。上一次的动态是官宣创办一家名为 Eureka Labs 的人工智能+教育公司 ,宣布将长期致力于AI原生教育。 近日,Andrej Karpathy接受了No Priors(投资博客)的采访,与硅谷知名投资人 Sara Guo 和 Elad G

阿里开源语音识别SenseVoiceWindows环境部署

SenseVoice介绍 SenseVoice 专注于高精度多语言语音识别、情感辨识和音频事件检测多语言识别: 采用超过 40 万小时数据训练,支持超过 50 种语言,识别效果上优于 Whisper 模型。富文本识别:具备优秀的情感识别,能够在测试数据上达到和超过目前最佳情感识别模型的效果。支持声音事件检测能力,支持音乐、掌声、笑声、哭声、咳嗽、喷嚏等多种常见人机交互事件进行检测。高效推

如何在页面调用utility bar并传递参数至lwc组件

1.在app的utility item中添加lwc组件: 2.调用utility bar api的方式有两种: 方法一,通过lwc调用: import {LightningElement,api ,wire } from 'lwc';import { publish, MessageContext } from 'lightning/messageService';import Ca

Retrieval-based-Voice-Conversion-WebUI模型构建指南

一、模型介绍 Retrieval-based-Voice-Conversion-WebUI(简称 RVC)模型是一个基于 VITS(Variational Inference with adversarial learning for end-to-end Text-to-Speech)的简单易用的语音转换框架。 具有以下特点 简单易用:RVC 模型通过简单易用的网页界面,使得用户无需深入了

透彻!驯服大型语言模型(LLMs)的五种方法,及具体方法选择思路

引言 随着时间的发展,大型语言模型不再停留在演示阶段而是逐步面向生产系统的应用,随着人们期望的不断增加,目标也发生了巨大的变化。在短短的几个月的时间里,人们对大模型的认识已经从对其zero-shot能力感到惊讶,转变为考虑改进模型质量、提高模型可用性。 「大语言模型(LLMs)其实就是利用高容量的模型架构(例如Transformer)对海量的、多种多样的数据分布进行建模得到,它包含了大量的先验

图神经网络模型介绍(1)

我们将图神经网络分为基于谱域的模型和基于空域的模型,并按照发展顺序详解每个类别中的重要模型。 1.1基于谱域的图神经网络         谱域上的图卷积在图学习迈向深度学习的发展历程中起到了关键的作用。本节主要介绍三个具有代表性的谱域图神经网络:谱图卷积网络、切比雪夫网络和图卷积网络。 (1)谱图卷积网络 卷积定理:函数卷积的傅里叶变换是函数傅里叶变换的乘积,即F{f*g}

秋招最新大模型算法面试,熬夜都要肝完它

💥大家在面试大模型LLM这个板块的时候,不知道面试完会不会复盘、总结,做笔记的习惯,这份大模型算法岗面试八股笔记也帮助不少人拿到过offer ✨对于面试大模型算法工程师会有一定的帮助,都附有完整答案,熬夜也要看完,祝大家一臂之力 这份《大模型算法工程师面试题》已经上传CSDN,还有完整版的大模型 AI 学习资料,朋友们如果需要可以微信扫描下方CSDN官方认证二维码免费领取【保证100%免费

【生成模型系列(初级)】嵌入(Embedding)方程——自然语言处理的数学灵魂【通俗理解】

【通俗理解】嵌入(Embedding)方程——自然语言处理的数学灵魂 关键词提炼 #嵌入方程 #自然语言处理 #词向量 #机器学习 #神经网络 #向量空间模型 #Siri #Google翻译 #AlexNet 第一节:嵌入方程的类比与核心概念【尽可能通俗】 嵌入方程可以被看作是自然语言处理中的“翻译机”,它将文本中的单词或短语转换成计算机能够理解的数学形式,即向量。 正如翻译机将一种语言