vLLM vs TGI 部署大模型以及注意点

LLM 高并发部署是个难题,具备高吞吐量的服务,能够让用户有更好的体验(比如模型生成文字速度提升,用户排队时间缩短)。

vllm github 仓库

1 vLLM

1.1 启动模型服务
# cd /workspace/vllm
python3 -m vllm.entrypoints.api_server \--model /models/Llama-2-7b-chat-hf --swap-space 16 \--disable-log-requests --host 0.0.0.0 --port 8080 --max-num-seqs 256

更多参数可以在 vllm/engine/arg_utils.py 找到,其中比较重要的有:

  • max-num-seqs:默认 256,当 max-num-seqs 比较小时,较迟接收到的 request 会进入 waiting_list,直到前面有request 结束后再被添加进生成队列。当 max-num-seqs 太大时,会出现一部分 request 在生成了 3-4 个 tokens 之后,被加入到 waiting_list(有些用户出现生成到一半卡住的情况)。过大或过小的 max-num-seqs 都会影响用户体验。
  • max-num-batched-tokens:很重要的配置,比如你配置了 max-num-batched-tokens=1000 那么你大概能在一个 batch 里面处理 10 条平均长度约为 100 tokens 的 inputs。max-num-batched-tokens 应尽可能大,来充分发挥 continuous batching 的优势。不过似乎(对于 TGI 是这样,vllm 不太确定),在提供 HF 模型时,该 max-num-batched-tokens 能够被自动推导出来。

部署后,发送 post 请求到 http://{host}:{port}/generate ,body 为 :

{"prompt": "Once a upon time,","max_tokens": output_len,"stream": false,"top_p": 1.0// 其他参数
}

vllm 也提供了 OpenAI-compatible API server,vllm 调用了 fastchat 的 conversation template 来构建对话输入的 prompt,但 v0.1.2 的 vllm 与最新版的 fastchat 有冲突,为了保证使用 llama v2 时用上对应的 prompt template,可以手动修改以下entrypoints.openai.api_server 中对 get_conversation_template 的引入方式(link)。修改后执行以下代码启动:

python3 -m vllm.entrypoints.openai.api_server \--model /models/Llama-2-7b-chat-hf \--disable-log-requests --host 0.0.0.0 --port 5001 --max-num-seqs 20 --served-model-name llama-2
1.2 坑点
  • 采用 stream: true 进行 steaming 请求时,vllm 提供的默认 API 每次的回复并不是新预测的单词,而是目前所有已预测的全部文本内容(history_tokens + new_tokens),这导致回复的内容中包含很多冗余的信息。
  • 当前 vllm 版本(v0.1.2)加载 *.safetensor 模型时存在问题,请尽量加载 *.bin 格式的模型。对于文件夹下同时存放 bin 和 safetensor 权重时,vllm 优先加载 .bin 权重。
  • vllm 的 OpenAI-compatible API server 依赖 fschat 提供 prompt template,由于 LLM 更新进度快,如果遇到模型 prompt template 在 fschat 中未找到的情况(通常报错为 keyError),可以重新安装下 fschat 和 transformers。

从接收 request,到返回回复,大致的过程如下:

  • 1 vllm 接收到 request 之后,会发放 request_uuid,并将 request 分配到 running, swap, waiting 三个队列当中。(参考 vllm.core.scheduler.Scheduler._schedule )
  • 2 根据用户等待的时间进行 request 优先级排序。从 running 和 swap队列中选择优先级高的 request 来生成对应的回复,由于 decoding 阶段,每次前项传播只预测一个 token,因此 vllm 在进行完一次前项传播(即 one decoding iteration)之后,会返回所有新生成的 tokens 保存在每个 request_uuid 下。(参考 vllm.engine.llm_engine.LLMEngine.step)
  • 3 如果 request 完成了所有的 decoding 步骤,那么将其移除,并返回结果给用户。
  • 4 更新 running, swap 和 waiting 的 request。
  • 5 循环执行 2,3,4。

2 TGI(Text Generation Inference)

TGI github 仓库

TGI 特点:

  • 支持了和 vllm 类似的 continuous batching
  • 支持了 flash-attention 和 Paged Attention。
  • 支持了 Safetensors 权重加载。(目前版本的 vllm 在加载部分模型的 safetensors 有问题(比如 llama-2-7B-chat)。
  • TGI 支持部署 GPTQ 模型服务,这使得我们可以在单卡上部署拥有 continous batching 功能的,更大的模型。
  • 支持采用 Tensor Parallelism 部署多 GPU 服务,模型水印等其他功能
2.1 安装

如果想直接部署模型的话,建议通过 docker 安装,省去不必要的环境问题。目前 TGI 只提供了 0.9.3 的:

docker pull ghcr.io/huggingface/text-generation-inference:0.9.3

如果要进行本地测试,可以通过源码安装(以下在 ubuntu 上安装):

  • 依赖安装
# 如果没有网络加速的话,建议添加 pip 清华源或其他国内 pip 源
curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh
apt-get install cargo  pkg-config git
  • 下载 protoc
PROTOC_ZIP=protoc-21.12-linux-x86_64.zip
curl -OL https://github.com/protocolbuffers/protobuf/releases/download/v21.12/$PROTOC_ZIP
sudo unzip -o $PROTOC_ZIP -d /usr/local bin/protoc
sudo unzip -o $PROTOC_ZIP -d /usr/local 'include/*'
rm -f $PROTOC_ZIP
  • 如果没有网络加速的话,建议修改 cargo 源。有网络加速可略过。
# vim ~/.cargo/config
[source.crates-io]
registry = "https://github.com/rust-lang/crates.io-index"
​
replace-with = 'tuna'[source.tuna]
registry = "https://mirrors.tuna.tsinghua.edu.cn/git/crates.io-index.git"[net]
git-fetch-with-cli=true
  • TGI 根目录下执行安装
BUILD_EXTENSIONS=True make install # Install repository and HF/transformer fork with CUDA kernels
  • 安装成功,添加环境变量到 .bashrc 中 export PATH=/root/.cargo/bin:$PATH

  • 执行text-generation-launcher --help ,有输出表示安装成功。

2.2 使用

将 Llama-2-7b-chat-hf 部署成服务:

# 建议将模型下载到本地,而后挂载到 docker 中,避免在 docker 中重复下载。
docker run --rm \--name tgi \--runtime=nvidia \--gpus all \-p 5001:5001 \-v /home/kevin/models:/data \ghcr.io/huggingface/text-generation-inference:0.9.3 \--model-id /data/Llama-2-7b-chat-hf \--hostname 0.0.0.0 \--port 5001 \--dtype float16 \--sharded false 

可以通过 text-generation-launcher --help 查看到可配置参数,相对 vllm 来说,TGI 在服务部署上的参数配置更丰富一些,其中比较重要的有:

  • model-id:模型 path 或者 hf.co 的 model_id。
  • revision:模型版本,比如 hf.co 里仓库的 branch名称。
  • quantize:TGI 支持使用 GPTQ 来部署模型。
  • max-concurrent-requests:当服务处于高峰期时,对于更多新的请求,系统会直接返回拒绝请求,(比如返回服务器正忙,请稍后重试),而不是将新请求加入到 waiting list 当中。改配置可以有效环节后台服务压力。默认为 128。
  • max-total-tokens:相当于模型的 max-tokens
  • max-batch-total-tokens:非常重要的参数,他极大影响了服务的吞吐量。该参数与 vllm 中的 max-num-batched-tokens 类似。比如你配置了 max-num-batched-tokens=1000:那么你大概能在一个 batch 里面处理 10 条平均长度约为 100 tokens 的 inputs。对于传入的 HF 模型,TGI 会自动推理该参数的最大上限,如果你加载了一个 7B 的模型到 24GB 显存的显卡当中,你会看到你的显存占用基本上被用满了,而不是只占用了 13GB(7B 模型常见显存占用),那是因为 TGI 根据 max-batch-total-tokens 提前对显存进行规划和占用。但对于量化模型,该参数需要自己设定,设定时可以根据显存占用情况,推测改参数的上限。

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

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

相关文章

springAI初体验 让人人都能跑大模型

springAI初体验 让人人都能跑大模型 Spring AI是一个旨在简化开发包含人工智能功能的应用程序的项目。它受到Python项目如LangChain和Llama Index的启发,但并非这些项目的直接移植。Spring AI的核心理念是为开发AI应用程序提供基础抽象,这些抽象有多个实…

leetcode496-Next Greater Element I

题目&#xff1a; nums1 中数字 x 的 下一个更大元素 是指 x 在 nums2 中对应位置 右侧 的 第一个 比 x 大的元素。 给你两个 没有重复元素 的数组 nums1 和 nums2 &#xff0c;下标从 0 开始计数&#xff0c;其中nums1 是 nums2 的子集。 对于每个 0 < i < nums1.lengt…

MyBatis中的#{}与${}注入问题

MyBatis中的#{}与${}注入问题 MyBatis是一个流行的Java持久层框架,用于将对象与数据库中的数据进行映射。然而,如果不当使用,MyBatis也可能受到诸如SQL注入这类的安全问题的影响。 SQL注入是一种攻击技术,攻击者通过在输入中插入恶意SQL语句片段,企图对数据库执行非预期的…

Everything搭建http服务器

突然发现everything还可以搭建http服务器&#xff0c;给大家分享一下 打开everything&#xff0c;按图示填写或选择内容 在浏览器输入你的本地地址和端口 再输入刚才设置的账户密码&#xff0c;即可使用

接口测试常用代理工具

些代理工具可以帮助我们构造各种测试场景、以及更好的完成测试工作。下面的介绍以 Charles 为主。 Charles Charles 是一款代理服务器&#xff0c;可以截取请求和响应达到分析抓包的目的&#xff0c;且支持多平台&#xff0c;能够在 Windows&#xff0c;Mac&#xff0c;Linux…

【OJ】动规练习七之【模板】01背包

个人主页 &#xff1a; zxctscl 如有转载请先通知 DP41 【模板】01背包 1. DP41 【模板】01背包2. 分析3. 代码4. 优化5. 优化后代码 1. DP41 【模板】01背包 2. 分析 一、题目解析&#xff1a; 来看一下例1&#xff0c;3代表有三个物品&#xff0c;5代表能够容纳的体积。第一…

1970-2021年全国区县级碳排放数据8

1970-2021年全国区县级碳排放数据 1、时间&#xff1a;1970-2021年 2、指标&#xff1a;2877个区县 3、来源&#xff1a;EDGAR 4、指标&#xff1a;二氧化碳排放量 5、样本量&#xff1a;14W 6、指标解释&#xff1a; 二氧化碳排放是一个生态环境专业术语&#xff0c;主…

【Python系列】读取 Excel 第一列数据并赋值到指定列

&#x1f49d;&#x1f49d;&#x1f49d;欢迎来到我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 推荐:kwan 的首页,持续学…

PyCharm远程链接AutoDL

AutoDL使用方法&#xff1a; Step1&#xff1a;确认您安装的PyCharm是社区版还是专业版&#xff0c;只有专业版才支持远程开发功能。 Step2&#xff1a;开机实例 复制自己实例的SSH指令&#xff0c;比如&#xff1a;ssh -p 38076 rootregion-1.autodl.com 在ssh -p 38076 roo…

二、计算机网络体系结构参考模型

一、分层结构 &#xff08;一&#xff09;为什么要分层&#xff1a; 发送文件/数据前要完成的工作&#xff1a; 1&#xff09;发起通信的计算机必须讲数据通信通路进行激活 2&#xff09;要告诉网络如何识别目的主机 3&#xff09;发起通信的计算机要查明目的主机是否开机、并且…

先登杯·14天创作挑战营·第④期~ 等你来战!

文章目录 ⭐️ 活动介绍⭐️ 活动详情⭐️ 活动奖品⭐️ 活动流程​⭐️ 评审规则⭐️ 报名&投稿注意事项⭐️ 活动组织 ​ 活动报名入口&#xff1a;https://bbs.csdn.net/topics/618374514 本次活动与官方活动及其他博主的创作型活动并不冲突&#xff01; ​ ​ ⭐️…

android studio中添加module依赖

android常用的三种依赖 库依赖&#xff08;Library dependency&#xff09;&#xff1a;以访问网址的形式将依赖库相应版本下载到本地; 文件依赖&#xff08;File dependency&#xff09;&#xff1a; 将下载下来的依赖库以.jar文件的形式添加依赖. module依赖&#xff08;Modu…

【力扣】168. Excel表列名称、171. Excel 表列序号

168. Excel表列名称 题目描述 给你一个整数 columnNumber &#xff0c;返回它在 Excel 表中相对应的列名称。 例如&#xff1a; A -> 1 B -> 2 C -> 3 … Z -> 26 AA -> 27 AB -> 28 … 示例 1&#xff1a; 输入&#xff1a;columnNumber 1 输出&#xf…

Go语言hash/fnv应用实战:技巧、示例与最佳实践

Go语言hash/fnv应用实战&#xff1a;技巧、示例与最佳实践 引言hash/fnv概览使用hash/fnv的初步步骤导入hash/fnv库创建哈希器实例 hash/fnv在实际开发中的应用生成唯一标识符数据分片与负载均衡快速查找 高级技巧和最佳实践避免哈希碰撞动态调整哈希表大小利用sync.Pool优化哈…

STM32之HAL开发——不同系列SPI功能对比(附STM32Cube配置)

不同系列STM32——SPI框图 F1系列框图 F4系列框图 TI模式时序图特性 F7系列框图 H7系列框图 注意&#xff1a;F7系列以及H7系列支持Quad-SPI模式&#xff0c;可以连接单&#xff0c;双或者四条数据线的Flash存储介质。 SPI——Cube配置流程 RCC时钟源配置 SYS系统调试模式配…

1.JavaEE进阶篇 - 为什么要学习SpringBoot呢?

文章目录 1.为什么要学框架&#xff1f;2.框架的优点展示(SpringBoot VS Servlet)2.1 Servlet 项⽬开发2.1.1 创建项⽬2.1.2 添加引⽤2.1.3 添加业务代码2.1.4 运⾏项⽬(配置tomcat)2.1.5 Maven配置2.1.5.1修改本地Maven仓库地址2.1.5.2 配置settings.xml文件2.1.5.3项目 本地仓…

通用开发技能系列:Git

云原生学习路线导航页&#xff08;持续更新中&#xff09; 本文是 通用开发技能系列 文章&#xff0c;主要对编程通用技能Git进行学习 1.为什么使用版本控制系统 版本控制系统可以解决的问题 代码备份很重要版本控制很重要协同工作很重要责任追溯很重要 常见的版本控制系统 Gi…

网站建设 之 发布ios

首先将forceDev改为false 然后执行npm run build:ios 然后用xocode安装到手机上进行测试 ##Version&#xff08;应用程序发布版本号&#xff09; 对应的就是CFBundleShortVersionString。该版本的版本号是三个时期分隔的整数组成的字符串&#xff1a; 第一个整数代表重大修…

升级一下电脑,CPU换I5-14600K,主板换华硕B760M

刚给自己电脑升级了一下&#xff0c;CPU从 AMD R5 5600X 换成 Intel I5-14600K&#xff0c;主板换成了华硕的 TUF GAMING B760M-PLUS WIFI D4。 因为我现有的两根内存是DDR4的&#xff0c;所有我选了个支持DDR4内存的主板。 我发现用AMD处理器时将系统从Win10升级到Win11后变…

十四款大型语言模型在《街头霸王III》中一决雌雄

上周在旧金山举办的Mistral AI黑客马拉松上&#xff0c;开发出了一款基于经典街机游戏《街头霸王III》的人工智能&#xff08;AI&#xff09;基准测试。这款名为“AI Street Fighter III”的开源基准测试由Stan Girard和Quivr Brain开发&#xff0c;游戏在模拟器中运行&#xf…