介于405B模型参数的大小,以及找不到相应的部署过程,因此撰写一篇文章来记录部署的流程以及遇到的问题。
设备条件:k8s集群环境中两个节点,每个节点具有8张80G*A800显卡
注意:将两个节点分为,主节点和工作节点,可任意指定,但需要牢记两者分别为哪个机器
1. 部署流程
1.1. k8s启动容器
使用k8s汲取进行容器启动时需要配置config参数,包括nccl和gloo(后面讲解原因,以及为何需要容器启动时配置) ,本人采用在集群中配置因此两个节点都需要配置NCCL和GLOO以便多机之间的通讯
spec:
containers:
- name: determined-container
resources:
limits:
memory: 128Gi
cpu: 128
requests:
memory: 64Gi
cpu: 64
volumeMounts:
- mountPath: /data
name: data
env:
- name: GLOO_SOCKET_IFNAME
value: "eth0"
- name: NCCL_SOCKET_IFNAME
value: "eth0"
“eth0”是机器用于通信的网卡id,使用“ifconfig”可以查看
1.2. 容器启动
官方也提供直接使用容器启动链接为:分布式推理和服务 — vLLM
官方配置有简易的启动脚本链接如下:vllm/examples/run_cluster.sh at main · vllm-project/vllm (github.com)
###1. clone vllm 官方代码
git clone https://github.com/vllm-project/vllm.git
###2. 进入指定目录
cd /vllm/examples/
进入指定目录之后在主节点中启动:
bash run_cluster.sher.sh \
vllm/vllm-openai \
ip_of_head_node \
--head \
/path/to/the/huggingface/home/in/this/node \
-e 'GLOO_SOCKET_IFNAME=eth0,NCCL_SOCKET_IFNAME=eth0'
在工作节点中启动:
bash run_cluster.sh \
vllm/vllm-openai \
ip_of_head_node \
--worker \
/path/to/the/huggingface/home/in/this/node \
-e 'GLOO_SOCKET_IFNAME=eth0,NCCL_SOCKET_IFNAME=eth0'
之后,将获得一个容器的 ray 群集。请注意,您需要使运行这些命令的 shell 保持活动状态,以保存集群。任何 shell 断开连接都将终止集群。
请注意,参数应该是主节点的 IP 地址,所有工作节点都可以访问该地址。
一个常见的误解是使用工作节点的 IP 地址,这是不正确的。
2. 创建环境
使用conda环境
conda create -n xxx python=3.10
conda activate xxx
pip install vllm
pip install ray
请注意:在主节点和工作节点中尽量选择一个相同环境,以便产生不必要的麻烦
3. 启动ray集群
若采用k8s启动容器,需要在容器中进行ray集群配置
在主节点中启动ray
ray start --head --port=6379
在工作节点链接主节点(主节点启动后会有对应的ip和端口号)
ray start --address='<主节点-ip>:6379'
查看ray节点集群状态
ray status
4. 启动405B模型
在主节点中使用命令
python -m vllm.entrypoints.openai.api_server --model /data/models/Meta-Llama-3.1-405B-Instruct/ --trust-remote-code --tensor-parallel-size 16 --served-model-name llama3.1_405b --dtype bfloat16 --engine-use-ray
部分参数详解见文章:https://blog.csdn.net/baiyipiao/article/details/141930442?spm=1001.2014.3001.5502https://blog.csdn.net/baiyipiao/article/details/141930442?spm=1001.2014.3001.5502 终端实现如下即为部署成功:
5. API调用命令
import openai
client = openai.OpenAI(
base_url="http://主节点ip:8000/v1",
api_key="可以任意指定",
)
def generate_response(user_input):
# print("Generating response for engine: ", engine)
response = client.chat.completions.create(
messages=[
{"role": "system", "content": ''},
{"role": "user", "content": user_input}
],
model="llama3.1_405b",
)
response = response.choices[0].message.content
return response
source_text="你是谁"
generate_response(source_text)
2. 常见问题
1. api调用显示404和500
使用ray集群启动,不能添加pipeline-parallel-size参数,而应在tensor-parallel-size中写入总的GPU数量,如在多级多卡的情况下,应该写--tensor-parallel-size 16。
启动命令必须是“python -m vllm.entrypoints.openai.api_server”,不能是“vllm serve”或者是“python -m vllm.entrypoints.api_server”
修改启动命令即可解决
2. ray假死
具体表现为,卡在此处不动
ray 服务启动添加参数 --num-cpus=16 --num-gpus=8
3. API调用报错
在调用时需要通过主节点的IP调用才会有响应,工作节点ip不行。
4. 多节点问题
与vllm单节点部署不同的一点在于,vllm的多节点配置,具体原因参考Issue:
[其他]:在多节点服务中设置环境变量 ·期刊 #6803 ·vllm-project/vllm (github.com)