小白视角:vllm 迁移到 SGLang 的体验与收获
智猩猩GenAI 2024年11月21日 12:45 北京
大会预告
12月5-6日,智猩猩共同主办的2024中国生成式AI大会(上海站)将举办。北大(临港)大模型对齐中心执行主任徐骅,腾讯优图实验室天衍研究中心负责人吴贤,银河通用机器人合伙人张直政,西湖心辰CEO醒辰,趣丸科技副总裁贾朔等30+位嘉宾已确认参会演讲。欢迎报名~
导读
作者为Chayenne Zhao
原文来自知乎,地址:https://zhuanlan.zhihu.com/p/714833359
本文只做学术/技术分享,如有侵权,联系删文。
这一周完成了 vllm 迁移到 SGLang 的工作,其实迁移本身非常简单,基本上将之前 vllm 的 serving 指令更换为 SGLang 的 serving 指令即可。不过自己在这个过程学会了很多现代的 serving feature,在知乎简单写写这一过程的体验,完全小白视角,甚至漏洞百出,希望大家能在评论区指正。
Why SGLang
简单来说,SGLang 的吞吐能力比起 vllm 是相当甚至要好一些的(由于我纯小白,所以没法用指标客观描述,见谅),并且 SGLang 支持更多的前端 feature,譬如生成 Structured Generation Language (这也是 SGLang 名字的由来)。由于我最近在写一些 Agents 项目,这个 feature 的潜力相当大。
最简单的迁移
这是我原本的 vllm 指令:
CUDA_VISIBLE_DEVICES=0,1,2,3 vllm serve --model-path 70bins \
--dtype auto --api-key token-abc123 --tensor-parallel-size 4 \
--max-model-len 65536 --enable-chunked-prefill --enforce-eager \
--disable-custom-all-reduce --port 7140 --gpu_memory_utilization 0.95
简单来说,我用 vllm serve 了一个 70b 的 Llama3.1(在我本地起名叫做 70bins),然后部署的端口在 7140,自动选择数据类型,最大输入序列长度是 64k。
这是迁移后的 SGLang 指令:
CUDA_VISIBLE_DEVICES=0,1,2,3 python -m sglang.launch_server \
--model-path 70bins --api-key token-abc123 --context-length 65536 \
--tensor-parallel-size 4 --chunked-prefill-size 8192 \
--enable-p2p-check --host 0.0.0.0 --port 7140 --mem-fraction-static 0.85
基本上参数是接近的,其中有两三个参数不太一样:
-
enable-p2p-check:测试 GPU 直接通讯是否被允许,如果不开启这个测试,则直接进行 GPU P2P(Peer-to-Peer)通讯。
-
chunked-prefill-size:在 vllm 中直接通过 enable-chunked-prefill 开启了 chunked prefill(长序列输入分块并预处理,因为我的序列长度是 64K),而 SGLang 中指定了 chunked-prefill-size 为 8k(老实说我觉得 vllm 应该也有类似的参数,但我没有摸索过)
-
mem-fraction-static:和 vllm 的 gpu_memory_utilization 是类似的,但是一般而言需要开的比 vllm 小一些,并且随着大量的请求,显存内还会占用一部分空间存储 cache,所以建议不要启动 server 后就把 GPU 压满
-
--host 0.0.0.0:这个参数很有意思,简单来说这是允许 server 接收广播的请求。具体来说,当我在某台服务器上启用了 SGLang 服务后,不添加 host 0.0.0.0 参数,则如下这两个 clients,上面的会 fail,下方的才可以 post 成功;反之,添加了 host 0.0.0.0 后就可以广播了,并且同一个区域网内的其他服务器也能 post