一、硬件要求
1. 尝试用2台8卡L40,共16卡,单卡48G显存,无法启动
2. 本次部署由2台H20,共16卡,单卡显存96GB
二、 模型下载
可从魔搭下载,下载链接,也可以直接从huggingface上下载,建议直接通过魔搭下载,速度有保障。
三、 运行方式
官方推荐2种方式,本次使用sglang运行,部署到k8s集群
vLLM:
vllm serve deepseek-ai/DeepSeek-R1 --tensor-parallel-size 2 --max-model-len 32768 --enforce-eager
SGLang:
python3 -m sglang.launch_server --model deepseek-ai/DeepSeek-R1 --trust-remote-code --tp 2
四、部署过程
由于单机8卡无法直接运行满血版Deepseek-R1,使用sglang部署需要2个8卡的pod,只有master节点提供服务,基于服务可快速扩缩容等方面进行考虑,总结2种方式优缺点
1、depleyment方式,master,worker各一个,多实例的话就建多个depleyment,最后用个nginx实现负载
2、使用有状态的sts服务,建立无头svc,用于master和worker之间的通讯。master的服务通过nacos注册中心进行暴露
相对而言,方案2更可靠
3、镜像使用sglang官方镜像,参考链接
4、启动脚本改造
##master启动脚本
python3 -m sglang.launch_server --model-path /data/DeepSeek-R1 --tp 16 --dist-init-addr $POD_NAME.deepseek-r1.app.svc.cluster.local:19999 --nnodes 2 --node-rank 0 --trust-remote-code --host 0.0.0.0
##worker启动脚本
POD_NUM=$(echo $POD_NAME | cut -d '-' -f 3) && python3 -m sglang.launch_server --model-path /data/DeepSeek-R1 --tp 16 --dist-init-addr deepseek-r1-$POD_NUM.deepseek-r1.app.svc.cluster.local:19999 --nnodes 2 --node-rank 1 --trust-remote-code --host 0.0.0.0
五、脚本注解
1、通过k8s自带的环境变量引入POD_NAME变量,用户获取pod的名称,使用svc完整地址作为master的通讯地址,这里之所以使用变量,是因为方便扩缩容,有状态的服务,podname都是有顺序的。
2、worker节点的cut是为了去pod的序号进行master podname拼接。
六、避坑指南
1、不能开启就绪检测,否则worker和master之间通讯会异常,导致服务无法正常启动
2、需要先启动master,然后再启动worker
3、模型加载大概需要5分钟,更新服务的时候不修改rollingupdate的滚动时间的话很容易引起服务中断