今天看到vLLM的朋友圈发布了DeepSeek R1的PP支持,立刻开始我的捣鼓之旅,假如我训练的超大MoE上线了,也得做好技术准备工作是不嘛。把踩坑经验给大家分享一下,希望能够相比于官方文档更白话一点。
知乎@游凯超 说一定要让整个过程变得丝滑无比,我俩配合做了几个验证,现在应该只需要 Step0 和 Step3 就可以run起来了,如果遇到autoscalar的相关问题可以看Step1可以解决。
Step 0 Prepare weights & Environment
由于权重太大了,即使你网速可以,也不建议直连下载了。大家可以先从HF及或代理弄一份权重回来,直连大概率直接超时或者把公网IP打爆。我们今天展示的多机多卡8xH20 (x2) 部署,对应TP size 8,PP size 2,所以要搞两台这样的机器过来。同时有一个假设:两机的网络互通,不一定需要IB,储存需要共享(NAS或OSS均可),完成准备工作之后便可以做第一步。
Step 1 Setup up Ray & Cluster
官方文档里面简单带过了这一部分,但这个是我被卡时间太久的问题。首先我说一下官方文档的意思,就是让你准备好两个节点,之间用ray start这个CLI去建立好ray集群。因为后面要用,但是比较坑的有两点,第一点是启动的命令似乎有点点问题,我在前几次尝试的时候都遇到了Ray的autoscaler报错的问题:
这看起来就很奇怪,因为vLLM找Ray集群要的Resource是custom resource,'node:33.18.26.153':0.001,这可以理解成vLLM优先要driver节点。但是这个东西我印象中是需要启动ray的时候自己设置的:
像这样才会有这种resource。背后的原因是对于多(虚拟)网卡的机器会有多个网段,vLLM assume使用POD IP来做Ray的master寻址。
解法1:设置 VLLM_HOST_IP
解法2:魔改Ray启动逻辑
其中execute可以这样写,
然后这里我稍微提一下ray的一些基础玩法:大家在使用Ray的时候一般都不是在裸机上面的,大部分深度学习的资源都是k8s结合kubeflow或者volcano这样的插件分发出来的。环境变量里面会有当前是第几个rank,头结点master_addr这样的信息,大家可以根据自己的需要把这些函数实现一下。比较坑的 {resource_spec} 这里我已经替大家把坑给填了。
Step 2 Other small bugs
期间又报了两个错误,花了一点时间修复:
一个opencv封建余孽的问题,pin住opencv的版本来解决
还有一个load之后报TypeError的问题
通过升级 pynvml 解决
Step 3 Run the model
这一步反而是最简单的:
由于有了PP加持,没有IB的同学也可以尝试把sequence length和bsz给稍微拉大一些拉。用gaoce哥哥贡献的Reasoning Output,在同一台机器来试一把,或者换一台机器把localhost改了:
对,你不是卡主了,是你的钱包不够厚。切到后台可以看到,这个prompt里面
INFO 02-02 14:18:52 metrics.py:453] Avg prompt throughput: 1.7 tokens/s, Avg generation throughput: 0.1 tokens/s, Running: 1 reqs, Swapped: 0 reqs, Pending: 0 reqs, GPU KV cache usage: 0.0%, CPU KV cache usage: 0.0%.
INFO 02-02 14:18:57 metrics.py:453] Avg prompt throughput: 0.0 tokens/s, Avg generation throughput: 20.7 tokens/s, Running: 1 reqs, Swapped: 0 reqs, Pending: 0 reqs, GPU KV cacheusage: 0.0%, CPU KV cache usage: 0.0%.
INFO 02-02 14:19:02 metrics.py:453] Avg prompt throughput: 0.0 tokens/s, Avg generation throughput: 20.5 tokens/s, Running: 1 reqs, Swapped: 0 reqs, Pending: 0 reqs, GPU KV cacheusage: 0.0%, CPU KV cache usage: 0.0%.
INFO 02-02 14:19:07 metrics.py:453] Avg prompt throughput: 0.0 tokens/s, Avg generation throughput: 20.5 tokens/s, Running: 1 reqs, Swapped: 0 reqs, Pending: 0 reqs, GPU KV cacheusage: 0.0%, CPU KV cache usage: 0.0%.
INFO 02-02 14:19:12 metrics.py:453] Avg prompt throughput: 0.0 tokens/s, Avg generation throughput: 20.1 tokens/s, Running: 1 reqs, Swapped: 0 reqs, Pending: 0 reqs, GPU KV cacheusage: 0.0%, CPU KV cache usage: 0.0%.
INFO 02-02 14:19:17 metrics.py:453] Avg prompt throughput: 0.0 tokens/s, Avg generation throughput: 19.8 tokens/s, Running: 1 reqs, Swapped: 0 reqs, Pending: 0 reqs, GPU KV cacheusage: 0.1%, CPU KV cache usage: 0.0%.
INFO 02-02 14:19:22 metrics.py:453] Avg prompt throughput: 0.0 tokens/s, Avg generation throughput: 19.4 tokens/s, Running: 1 reqs, Swapped: 0 reqs, Pending: 0 reqs, GPU KV cacheusage: 0.1%, CPU KV cache usage: 0.0%.
INFO 02-02 14:19:27 metrics.py:453] Avg prompt throughput: 0.0 tokens/s, Avg generation throughput: 19.1 tokens/s, Running: 1 reqs, Swapped: 0 reqs, Pending: 0 reqs, GPU KV cacheusage: 0.1%, CPU KV cache usage: 0.0%.
稍等一会他就会告诉你9.8更大了。
祝大家捣鼓顺利,感谢vLLM社区的工作。
凯超真 nb 春节在这做贴身客服,哈哈,RL仔现在不管原来是主修文还是主修理的,都先修infra吧。
本文转载自 NLP工作站,作者: 曹宇