787 lines
24 KiB
Markdown
787 lines
24 KiB
Markdown
# LWS Based PD Deploy
|
||
|
||
## 0. Prerequisites
|
||
|
||
1. k8s >=1.26
|
||
2. lws installed on k8s.
|
||
|
||
## 1. Image Preparation
|
||
|
||
`lmsysorg/sglang:deepep`
|
||
|
||
## 2. Deployment Manifest Files
|
||
|
||
***Notice: We will package all deployment files into Helm Chart format in the near future. Interested community members can contact us to contribute***
|
||
|
||
### Prefill
|
||
|
||
Prefill manifest file [prefill.yaml](lws-examples/p.yaml)
|
||
|
||
*Note: The NodeSelector section, model location section, and taint toleration section can be adjusted according to your actual deployment environment*
|
||
|
||
```yaml
|
||
apiVersion: leaderworkerset.x-k8s.io/v1
|
||
kind: LeaderWorkerSet
|
||
metadata:
|
||
name: deepseekr10528-prefill-main
|
||
spec:
|
||
leaderWorkerTemplate:
|
||
leaderTemplate:
|
||
metadata:
|
||
labels:
|
||
role: leader
|
||
spec:
|
||
containers:
|
||
- command:
|
||
- python3
|
||
- -m
|
||
- sglang.launch_server
|
||
- --port
|
||
- "30000"
|
||
- --host
|
||
- "0.0.0.0"
|
||
- --model-path
|
||
- /work/models
|
||
- --disaggregation-ib-device
|
||
# should modify according your rdma env
|
||
- mlx5_bond_0,mlx5_bond_1,mlx5_bond_2,mlx5_bond_3
|
||
- --chunked-prefill-size
|
||
- "524288"
|
||
- --max-prefill-tokens
|
||
- "32768"
|
||
- --page-size
|
||
- "64"
|
||
# - --init-expert-location
|
||
# - /home/aiges/tuned/attachment_ep_statistics/prefill_in1024.json
|
||
- --ep-dispatch-algorithm
|
||
- dynamic
|
||
- --eplb-algorithm
|
||
- deepseek
|
||
# - --deepep-config
|
||
# - /home/aiges/tuned/tuned_8sms.json
|
||
- --enable-dp-lm-head
|
||
- --enable-dp-attention
|
||
- --dp-size
|
||
- "16"
|
||
- --disable-radix-cache
|
||
- --enable-deepep-moe
|
||
- --deepep-mode
|
||
- normal
|
||
- --disaggregation-mode
|
||
- prefill
|
||
- --mem-fraction-static
|
||
- "0.7"
|
||
- --context-length
|
||
- "32768"
|
||
- --tp
|
||
- "16"
|
||
- --dist-init-addr
|
||
- $(LWS_LEADER_ADDRESS):20102
|
||
- --nnodes
|
||
- $(LWS_GROUP_SIZE)
|
||
- --node-rank
|
||
- $(LWS_WORKER_INDEX)
|
||
- --trust-remote-code
|
||
- --ep-num-redundant-experts
|
||
- "32"
|
||
- --moe-dense-tp-size
|
||
- "1"
|
||
- --max-running-requests
|
||
- "1024"
|
||
env:
|
||
# - name: NVSHMEM_HCA_PE_MAPPING
|
||
# value: "mlx5_bond_0:1:2,mlx5_bond_1:1:2,mlx5_bond_2:1:2,mlx5_bond_3:1:2"
|
||
# - name: NVSHMEM_HCA_LIST
|
||
# value: "mlx5_bond_0:1,mlx5_bond_1:1,mlx5_bond_2:1,mlx5_bond_3:1"
|
||
- name: NVSHMEM_IB_GID_INDEX
|
||
value: "3"
|
||
- name: NVSHMEM_ENABLE_NIC_PE_MAPPING
|
||
value: "1"
|
||
- name: SGLANG_SET_CPU_AFFINITY
|
||
value: "true"
|
||
- name: SGL_ENABLE_JIT_DEEPGEMM
|
||
value: "1"
|
||
- name: NCCL_IB_QPS_PER_CONNECTION
|
||
value: "8"
|
||
- name: NCCL_IB_SPLIT_DATA_ON_QPS
|
||
value: "1"
|
||
- name: NCCL_NET_PLUGIN
|
||
value: none
|
||
- name: NCCL_IB_TC
|
||
value: "136"
|
||
- name: NCCL_MIN_NCHANNELS
|
||
value: "4"
|
||
- name: MC_TE_METRIC
|
||
value: "false"
|
||
- name: NCCL_IB_SL
|
||
value: "5"
|
||
- name: NCCL_IB_HCA
|
||
value: ^=mlx5_0,mlx5_5,mlx5_6
|
||
- name: LWS_WORKER_INDEX
|
||
valueFrom:
|
||
fieldRef:
|
||
fieldPath: metadata.labels['leaderworkerset.sigs.k8s.io/worker-index']
|
||
image: lmsysorg/sglang:deepep
|
||
name: sglang-leader
|
||
ports:
|
||
- containerPort: 30000
|
||
protocol: TCP
|
||
readinessProbe:
|
||
periodSeconds: 30
|
||
tcpSocket:
|
||
port: 30000
|
||
resources:
|
||
limits:
|
||
nvidia.com/gpu: "8"
|
||
securityContext:
|
||
capabilities:
|
||
add:
|
||
- IPC_LOCK
|
||
privileged: true
|
||
volumeMounts:
|
||
- mountPath: /dev/shm
|
||
name: dshm
|
||
- mountPath: /work/models
|
||
name: model
|
||
- mountPath: /dev/infiniband
|
||
name: ib
|
||
- mountPath: /sgl-workspace/sglang/python/sglang/srt/layers/moe/fused_moe_triton/configs
|
||
name: cf
|
||
- mountPath: /root/.cache
|
||
name: sgl-cache
|
||
dnsPolicy: ClusterFirstWithHostNet
|
||
hostIPC: true
|
||
hostNetwork: true
|
||
nodeSelector:
|
||
pd: "yes"
|
||
tolerations:
|
||
- key: pd
|
||
operator: Exists
|
||
- key: node-role
|
||
operator: Exists
|
||
volumes:
|
||
- emptyDir:
|
||
medium: Memory
|
||
name: dshm
|
||
- hostPath:
|
||
# modify according to you deployment env
|
||
path: /data1/maas_hosted_models/models/DeepSeek-R1-0528/deepseek_r1_0528
|
||
name: model
|
||
- hostPath:
|
||
path: /dev/infiniband
|
||
name: ib
|
||
- hostPath:
|
||
# modify according to you deployment env
|
||
path: /data1/maas_hosted_models/models/fused_moe_triton/configs
|
||
name: cf
|
||
- hostPath:
|
||
# modify according to you deployment env
|
||
path: /data1/sgl_cache
|
||
type: DirectoryOrCreate
|
||
name: sgl-cache
|
||
restartPolicy: RecreateGroupOnPodRestart
|
||
size: 2
|
||
workerTemplate:
|
||
metadata: {}
|
||
spec:
|
||
containers:
|
||
- command:
|
||
- python3
|
||
- -m
|
||
- sglang.launch_server
|
||
- --model-path
|
||
- /work/models
|
||
- --disaggregation-ib-device
|
||
- mlx5_bond_0,mlx5_bond_1,mlx5_bond_2,mlx5_bond_3
|
||
- --chunked-prefill-size
|
||
- "524288"
|
||
- --max-prefill-tokens
|
||
- "32768"
|
||
- --page-size
|
||
- "64"
|
||
#- --init-expert-location
|
||
#- /home/aiges/tuned/attachment_ep_statistics/prefill_in1024.json
|
||
- --ep-dispatch-algorithm
|
||
- dynamic
|
||
- --eplb-algorithm
|
||
- deepseek
|
||
# - --deepep-config
|
||
# - /home/aiges/tuned/tuned_8sms.json
|
||
- --enable-dp-lm-head
|
||
- --enable-dp-attention
|
||
- --dp-size
|
||
- "16"
|
||
- --disable-radix-cache
|
||
- --enable-deepep-moe
|
||
- --deepep-mode
|
||
- normal
|
||
- --disaggregation-mode
|
||
- prefill
|
||
- --mem-fraction-static
|
||
- "0.7"
|
||
- --context-length
|
||
- "32768"
|
||
- --tp
|
||
- "16"
|
||
- --dist-init-addr
|
||
- $(LWS_LEADER_ADDRESS):20102
|
||
- --nnodes
|
||
- $(LWS_GROUP_SIZE)
|
||
- --node-rank
|
||
- $(LWS_WORKER_INDEX)
|
||
- --trust-remote-code
|
||
- --ep-num-redundant-experts
|
||
- "32"
|
||
- --moe-dense-tp-size
|
||
- "1"
|
||
- --max-running-requests
|
||
- "1024"
|
||
env:
|
||
- name: SGLANG_SET_CPU_AFFINITY
|
||
value: "true"
|
||
- name: SGLANG_HACK_DEEPEP_NUM_SMS
|
||
value: "8"
|
||
- name: SGLANG_HACK_DEEPEP_NEW_MODE
|
||
value: "0"
|
||
# - name: NVSHMEM_HCA_PE_MAPPING
|
||
# value: "mlx5_bond_0:1:2,mlx5_bond_1:1:2,mlx5_bond_2:1:2,mlx5_bond_3:1:2"
|
||
# - name: NVSHMEM_HCA_LIST
|
||
# value: "mlx5_bond_0:1,mlx5_bond_1:1,mlx5_bond_2:1,mlx5_bond_3:1"
|
||
- name: NCCL_IB_HCA
|
||
value: ^=mlx5_0,mlx5_5,mlx5_6
|
||
- name: NVSHMEM_IB_TRAFFIC_CLASS
|
||
value: "16"
|
||
- name: NVSHMEM_IB_GID_INDEX
|
||
value: "3"
|
||
- name: NVSHMEM_ENABLE_NIC_PE_MAPPING
|
||
value: "1"
|
||
- name: CUDA_LAUNCH_BLOCKING
|
||
value: "0"
|
||
- name: SGLANG_MOONCAKE_TRANS_THREAD
|
||
value: "8"
|
||
- name: SGL_ENABLE_JIT_DEEPGEMM
|
||
value: "1"
|
||
- name: SGL_CHUNKED_PREFIX_CACHE_THRESHOLD
|
||
value: "0"
|
||
- name: NCCL_IB_QPS_PER_CONNECTION
|
||
value: "8"
|
||
- name: NCCL_IB_SPLIT_DATA_ON_QPS
|
||
value: "1"
|
||
- name: NCCL_NET_PLUGIN
|
||
value: none
|
||
- name: NCCL_IB_TC
|
||
value: "136"
|
||
- name: NCCL_MIN_NCHANNELS
|
||
value: "4"
|
||
- name: MC_TE_METRIC
|
||
value: "true"
|
||
- name: NCCL_IB_SL
|
||
value: "5"
|
||
- name: LWS_WORKER_INDEX
|
||
valueFrom:
|
||
fieldRef:
|
||
fieldPath: metadata.labels['leaderworkerset.sigs.k8s.io/worker-index']
|
||
image: lmsysorg/sglang:deepep
|
||
name: sglang-worker
|
||
ports:
|
||
- containerPort: 30001
|
||
protocol: TCP
|
||
resources:
|
||
limits:
|
||
nvidia.com/gpu: "8"
|
||
securityContext:
|
||
capabilities:
|
||
add:
|
||
- IPC_LOCK
|
||
privileged: true
|
||
volumeMounts:
|
||
|
||
- mountPath: /root/.cache
|
||
name: sgl-cache
|
||
- mountPath: /dev/shm
|
||
name: dshm
|
||
- mountPath: /work/models
|
||
name: model
|
||
- mountPath: /dev/infiniband
|
||
name: ib
|
||
- mountPath: /sgl-workspace/sglang/python/sglang/srt/layers/moe/fused_moe_triton/configs
|
||
name: cf
|
||
dnsPolicy: ClusterFirstWithHostNet
|
||
hostIPC: true
|
||
hostNetwork: true
|
||
nodeSelector:
|
||
pd: "yes"
|
||
tolerations:
|
||
- key: pd
|
||
operator: Exists
|
||
- key: node-role
|
||
operator: Exists
|
||
volumes:
|
||
- emptyDir:
|
||
medium: Memory
|
||
name: dshm
|
||
- hostPath:
|
||
path: /dev/infiniband
|
||
name: ib
|
||
- hostPath:
|
||
path: /data1/maas_hosted_models/models/DeepSeek-R1-0528/deepseek_r1_0528
|
||
name: model
|
||
- hostPath:
|
||
path: /data1/maas_hosted_models/models/fused_moe_triton/configs
|
||
name: cf
|
||
- hostPath:
|
||
path: /data1/sgl_cache
|
||
type: DirectoryOrCreate
|
||
name: sgl-cache
|
||
|
||
```
|
||
|
||
### Decode
|
||
|
||
Decode node deployment manifest file [decode.yaml](lws-examples/d.yaml)
|
||
|
||
*Note: The NodeSelector section, model location section, and taint toleration section can be adjusted according to your actual deployment environment*
|
||
|
||
```yaml
|
||
apiVersion: leaderworkerset.x-k8s.io/v1
|
||
kind: LeaderWorkerSet
|
||
metadata:
|
||
name: deepseekr10528-decode-main
|
||
spec:
|
||
leaderWorkerTemplate:
|
||
leaderTemplate:
|
||
metadata:
|
||
labels:
|
||
role: leader
|
||
spec:
|
||
containers:
|
||
- command:
|
||
- python3
|
||
- -m
|
||
- sglang.launch_server
|
||
- --port
|
||
- "30000"
|
||
- --host
|
||
- "0.0.0.0"
|
||
- --model-path
|
||
- /work/models
|
||
- --chunked-prefill-size
|
||
- "262144"
|
||
- --page-size
|
||
- "64"
|
||
- --enable-dp-attention
|
||
- --enable-dp-lm-head
|
||
- --dp-size
|
||
- "16"
|
||
- --enable-deepep-moe
|
||
- --deepep-mode
|
||
- low_latency
|
||
- --disaggregation-mode
|
||
- decode
|
||
- --mem-fraction-static
|
||
- "0.849"
|
||
- --context-length
|
||
- "32768"
|
||
- --disaggregation-ib-device
|
||
- "mlx5_bond_0,mlx5_bond_1,mlx5_bond_2,mlx5_bond_3"
|
||
- --cuda-graph-max-bs
|
||
- "64"
|
||
- --max-running-requests
|
||
- "2048"
|
||
- --tp-size
|
||
- "16" # Size of Tensor Parallelism
|
||
- --dist-init-addr
|
||
- $(LWS_LEADER_ADDRESS):20102
|
||
- --nnodes
|
||
- $(LWS_GROUP_SIZE)
|
||
- --node-rank
|
||
- $(LWS_WORKER_INDEX)
|
||
- --trust-remote-code
|
||
- --ep-num-redundant-experts
|
||
- "32"
|
||
- --moe-dense-tp-size
|
||
- "1"
|
||
env:
|
||
- name: CUDA_LAUNCH_BLOCKING
|
||
value: "0"
|
||
- name: NVSHMEM_IB_GID_INDEX
|
||
value: "3"
|
||
- name: NVSHMEM_ENABLE_NIC_PE_MAPPING
|
||
value: "1"
|
||
- name: NCCL_IB_QPS_PER_CONNECTION
|
||
value: "8"
|
||
- name: NCCL_IB_SPLIT_DATA_ON_QPS
|
||
value: "1"
|
||
- name: NCCL_NET_PLUGIN
|
||
value: "none"
|
||
- name: NCCL_IB_TC
|
||
value: "136"
|
||
- name: NCCL_MIN_NCHANNELS
|
||
value: "4"
|
||
- name: NCCL_IB_SL
|
||
value: "5"
|
||
- name: MC_TE_METRIC
|
||
value: "true"
|
||
- name: SGLANG_MOONCAKE_TRANS_THREAD
|
||
value: "16"
|
||
- name: SGL_ENABLE_JIT_DEEPGEMM
|
||
value: "1"
|
||
- name: NCCL_IB_HCA
|
||
value: ^=mlx5_0,mlx5_5,mlx5_6
|
||
- name: LWS_WORKER_INDEX
|
||
valueFrom:
|
||
fieldRef:
|
||
fieldPath: metadata.labels['leaderworkerset.sigs.k8s.io/worker-index']
|
||
image: lmsysorg/sglang:deepep
|
||
name: sglang-leader
|
||
ports:
|
||
- containerPort: 30000
|
||
protocol: TCP
|
||
readinessProbe:
|
||
periodSeconds: 30
|
||
tcpSocket:
|
||
port: 30000
|
||
resources:
|
||
limits:
|
||
nvidia.com/gpu: "8"
|
||
securityContext:
|
||
capabilities:
|
||
add:
|
||
- IPC_LOCK
|
||
privileged: true
|
||
volumeMounts:
|
||
- mountPath: /root/.cache
|
||
name: sgl-cache
|
||
- mountPath: /dev/shm
|
||
name: dshm
|
||
- mountPath: /work/models
|
||
name: model
|
||
- mountPath: /dev/infiniband
|
||
name: ib
|
||
- mountPath: /sgl-workspace/sglang/python/sglang/srt/layers/moe/fused_moe_triton/configs
|
||
name: cf
|
||
dnsPolicy: ClusterFirstWithHostNet
|
||
hostIPC: true
|
||
hostNetwork: true
|
||
nodeSelector:
|
||
pd: "yes"
|
||
tolerations:
|
||
- key: pd
|
||
operator: Exists
|
||
- key: node-role
|
||
operator: Exists
|
||
volumes:
|
||
- hostPath:
|
||
path: /data1/sgl_cache1
|
||
type: DirectoryOrCreate
|
||
name: sgl-cache
|
||
- emptyDir:
|
||
medium: Memory
|
||
name: dshm
|
||
- hostPath:
|
||
path: /data1/maas_hosted_models/models/DeepSeek-R1-0528/deepseek_r1_0528
|
||
name: model
|
||
- hostPath:
|
||
path: /dev/infiniband
|
||
name: ib
|
||
- hostPath:
|
||
path: /data1/maas_hosted_models/models/fused_moe_triton/configs
|
||
name: cf
|
||
restartPolicy: RecreateGroupOnPodRestart
|
||
size: 2
|
||
workerTemplate:
|
||
metadata: {}
|
||
spec:
|
||
containers:
|
||
- command:
|
||
- python3
|
||
- -m
|
||
- sglang.launch_server
|
||
- --model-path
|
||
- /work/models
|
||
- --chunked-prefill-size
|
||
- "262144"
|
||
- --page-size
|
||
- "64"
|
||
- --enable-dp-attention
|
||
- --enable-dp-lm-head
|
||
#- --enable-two-batch-overlap
|
||
- --dp-size
|
||
- "16"
|
||
- --enable-deepep-moe
|
||
- --deepep-mode
|
||
- low_latency
|
||
- --disaggregation-mode
|
||
- decode
|
||
- --mem-fraction-static
|
||
- "0.849"
|
||
- --context-length
|
||
- "32768"
|
||
- --disaggregation-ib-device
|
||
# should modify according your rdma env
|
||
- "mlx5_bond_0,mlx5_bond_1,mlx5_bond_2,mlx5_bond_3"
|
||
- --cuda-graph-max-bs
|
||
- "64"
|
||
- --max-running-requests
|
||
- "2048"
|
||
- --tp-size
|
||
- "16" # Size of Tensor Parallelism
|
||
- --dist-init-addr
|
||
- $(LWS_LEADER_ADDRESS):20102
|
||
- --nnodes
|
||
- $(LWS_GROUP_SIZE)
|
||
- --node-rank
|
||
- $(LWS_WORKER_INDEX)
|
||
- --trust-remote-code
|
||
- --ep-num-redundant-experts
|
||
- "32"
|
||
- --moe-dense-tp-size
|
||
- "1"
|
||
env:
|
||
- name: SGLANG_HACK_DEEPEP_NUM_SMS
|
||
value: "24"
|
||
- name: SGLANG_HACK_DEEPEP_NEW_MODE
|
||
value: "0"
|
||
- name: NVSHMEM_IB_TRAFFIC_CLASS
|
||
value: "16"
|
||
- name: NVSHMEM_IB_GID_INDEX
|
||
value: "3"
|
||
- name: NVSHMEM_ENABLE_NIC_PE_MAPPING
|
||
value: "1"
|
||
- name: NCCL_IB_QPS_PER_CONNECTION
|
||
value: "8"
|
||
- name: NCCL_IB_SPLIT_DATA_ON_QPS
|
||
value: "1"
|
||
- name: NCCL_NET_PLUGIN
|
||
value: "none"
|
||
- name: NCCL_IB_TC
|
||
value: "136"
|
||
- name: NCCL_MIN_NCHANNELS
|
||
value: "4"
|
||
- name: MC_TE_METRIC
|
||
value: "true"
|
||
- name: NCCL_IB_SL
|
||
value: "5"
|
||
- name: SGLANG_MOONCAKE_TRANS_THREAD
|
||
value: "16"
|
||
- name: SGL_ENABLE_JIT_DEEPGEMM
|
||
value: "1"
|
||
- name: NCCL_IB_HCA
|
||
value: ^=mlx5_0,mlx5_5,mlx5_6
|
||
- name: LWS_WORKER_INDEX
|
||
valueFrom:
|
||
fieldRef:
|
||
fieldPath: metadata.labels['leaderworkerset.sigs.k8s.io/worker-index']
|
||
image: lmsysorg/sglang:deepep
|
||
name: sglang-worker
|
||
ports:
|
||
- containerPort: 30001
|
||
resources:
|
||
limits:
|
||
nvidia.com/gpu: "8"
|
||
securityContext:
|
||
capabilities:
|
||
add:
|
||
- IPC_LOCK
|
||
privileged: true
|
||
volumeMounts:
|
||
- mountPath: /root/.cache
|
||
name: sgl-cache
|
||
- mountPath: /dev/shm
|
||
name: dshm
|
||
- mountPath: /work/models
|
||
name: model
|
||
- mountPath: /dev/infiniband
|
||
name: ib
|
||
- mountPath: /sgl-workspace/sglang/python/sglang/srt/layers/moe/fused_moe_triton/configs
|
||
name: cf
|
||
dnsPolicy: ClusterFirstWithHostNet
|
||
hostIPC: true
|
||
hostNetwork: true
|
||
nodeSelector:
|
||
pd: "yes"
|
||
tolerations:
|
||
- key: pd
|
||
operator: Exists
|
||
- key: node-role
|
||
operator: Exists
|
||
volumes:
|
||
- hostPath:
|
||
path: /data1/sgl_cache1
|
||
type: DirectoryOrCreate
|
||
name: sgl-cache
|
||
- emptyDir:
|
||
medium: Memory
|
||
name: dshm
|
||
- hostPath:
|
||
path: /dev/infiniband
|
||
name: ib
|
||
- hostPath:
|
||
# modify according to you deployment env
|
||
path: /data1/maas_hosted_models/models/DeepSeek-R1-0528/deepseek_r1_0528
|
||
name: model
|
||
- hostPath:
|
||
# modify according to you deployment env
|
||
path: /data1/maas_hosted_models/models/fused_moe_triton/configs
|
||
name: cf
|
||
networkConfig:
|
||
subdomainPolicy: Shared
|
||
replicas: 1
|
||
rolloutStrategy:
|
||
rollingUpdateConfiguration:
|
||
maxSurge: 0
|
||
maxUnavailable: 1
|
||
type: RollingUpdate
|
||
startupPolicy: LeaderCreated
|
||
```
|
||
|
||
Execute separately:
|
||
|
||
```bash
|
||
kubectl apply -f p.yaml
|
||
kubectl apply -f d.yaml
|
||
```
|
||
|
||
At this point, we have completed the deployment of the 1P1D SGlang engine part.
|
||
|
||
To allow our users to directly experience the model API, we still need a load balancer to handle sequential calls between prefill and decode. Different companies implement LBs differently, and the community will also officially release a new LB component written in Rust in the near future.
|
||
|
||
Currently, we use a static K8S service + minilb approach to implement model API calls.
|
||
|
||
### Creating Service for Prefill and Decode
|
||
|
||
#### Create prefill k8s service
|
||
[p-svc.yaml](lws-examples/p-svc.yaml)
|
||
```yaml
|
||
apiVersion: v1
|
||
kind: Service
|
||
metadata:
|
||
name: deepseekr10528-prefill-main
|
||
spec:
|
||
selector:
|
||
leaderworkerset.sigs.k8s.io/name: deepseekr10528-prefill-main
|
||
role: leader
|
||
ports:
|
||
- protocol: TCP
|
||
port: 30000
|
||
targetPort: 30000
|
||
```
|
||
Execute `kubectl apply -f p-svc.yaml`
|
||
|
||
#### Create decode k8s service
|
||
[d-svc.yaml](lws-examples/d-svc.yaml)
|
||
```yaml
|
||
apiVersion: v1
|
||
kind: Service
|
||
metadata:
|
||
name: deepseekr10528-decode-main
|
||
spec:
|
||
selector:
|
||
leaderworkerset.sigs.k8s.io/name: deepseekr10528-decode-main
|
||
role: leader
|
||
ports:
|
||
- protocol: TCP
|
||
port: 30000
|
||
targetPort: 30000
|
||
```
|
||
Execute `kubectl apply -f d-svc.yaml`
|
||
|
||
#### Deploy minilb and lb service
|
||
[lb.yaml](lws-examples/lb.yaml)
|
||
```yaml
|
||
apiVersion: apps/v1
|
||
kind: Deployment
|
||
metadata:
|
||
name: deepseekr10528-lb-main
|
||
labels:
|
||
app: deepseekr10528-lb
|
||
spec:
|
||
replicas: 1
|
||
selector:
|
||
matchLabels:
|
||
app: deepseekr10528-lb
|
||
template:
|
||
metadata:
|
||
labels:
|
||
app: deepseekr10528-lb
|
||
spec:
|
||
nodeSelector:
|
||
pd: "yes"
|
||
tolerations:
|
||
- key: pd
|
||
operator: Exists
|
||
- key: node-role
|
||
operator: Exists
|
||
containers:
|
||
- name: sgl-minilb
|
||
image: lmsysorg/sglang:deepep
|
||
command:
|
||
- python
|
||
- -m
|
||
- sglang.srt.disaggregation.mini_lb
|
||
- --prefill
|
||
- http://deepseekr10528-prefill-main:30000
|
||
- --decode
|
||
- http://deepseekr10528-decode-main:30000
|
||
- --host
|
||
- 0.0.0.0
|
||
- --port
|
||
- "8000"
|
||
ports:
|
||
- containerPort: 8000
|
||
---
|
||
apiVersion: v1
|
||
kind: Service
|
||
metadata:
|
||
name: deepseekr10528-lb-service
|
||
spec:
|
||
type: NodePort
|
||
selector:
|
||
app: deepseekr10528-lb
|
||
ports:
|
||
- protocol: TCP
|
||
port: 8000 # Service Port(In-Cluster)
|
||
targetPort: 8000 # Exposed Container
|
||
nodePort: 30800
|
||
```
|
||
Execute `kubectl apply -f lb.yaml`
|
||
|
||
After waiting for all model deployments to succeed, you will get the following output:
|
||
|
||
```bash
|
||
[root@ecs-001]# kubectl get po
|
||
deepseekr10528-decode-main-0 1/1 Running 0 74m
|
||
deepseekr10528-decode-main-0-1 1/1 Running 0 74m
|
||
deepseekr10528-lb-main-9c5dbfc57-6lcbd 1/1 Running 0 22m
|
||
deepseekr10528-prefill-main-0 1/1 Running 0 74m
|
||
deepseekr10528-prefill-main-0-1 1/1 Running 0 74m
|
||
[root@ecs-cbm-x1-pd-cpu-001 main_doc]# kubectl get svc |grep dee
|
||
deepseekr10528-decode-main ClusterIP None <none> <none> 97m
|
||
deepseekr10528-lb-service NodePort 172.16.242.169 <none> 8000:30800/TCP 22m
|
||
deepseekr10528-prefill-main ClusterIP None <none> <none> 97m
|
||
```
|
||
|
||
At this point, select a nodePort:30800 to access:
|
||
|
||
```bash
|
||
[root@ecs-001]# curl -X POST "http://{nodePort}:30800/v1/chat/completions" \
|
||
> -H "Content-Type: application/json" \
|
||
> -H "Authorization: Bearer None" \
|
||
> -d '{
|
||
> "rid":"ccccdd",
|
||
> "model": "r1",
|
||
> "messages": [
|
||
> {"role": "system", "content": "0: You are a helpful AI assistant"},
|
||
> {"role": "user", "content": "你是谁?."}
|
||
> ],
|
||
> "max_tokens":221
|
||
> }'
|
||
{"id":"ccccdd","object":"chat.completion","created":1750252498,"model":"qwen2","choices":[{"index":0,"message":{"role":"assistant","content":"<think>\n嗯,用户问了一个很基础的自我介绍问题"你是谁?"。这可能是第一次互动时的常规开场白,也可能是想确认我的身份和功能范围。\n\n用户没有提供任何背景信息,语气简洁中性。这种场景下新用户的可能性较高,需要给出清晰友好的自我介绍,同时突出实用价值来降低陌生感。\n\n考虑到中文用户,应该用简体中文回复。重点要说明三点:身份归属(深度求索)、功能定位(AI助手)、服务范围(学习/工作/生活)。结尾用开放性问题引导对话很关键——既能了解需求,又能避免让用户面对空白输入框时不知所措。\n\n用波浪线结尾可以软化语气,那个笑脸表情😊刚好能中和AI的机械感。不过要控制表情符号数量,避免显得轻浮。\n</think>\n你好呀!我是你的AI助手,由深度求索公司(DeepSeek)开发的语言模型,名字叫 **DeepSeek-R1**。你可以把我当成一个知识丰富、随叫随到的小帮手~😊\n\n我的任务就是陪你聊天、解答问题、","reasoning_content":null,"tool_calls":null},"logprobs":null,"finish_reason":"length","matched_stop":null}],"usage":{"prompt_tokens":14,"total_tokens":235,"completion_tokens":221,"prompt_tokens_details":null}}
|
||
|
||
```
|
||
## FAQ
|
||
|
||
1. The current deployment startup parameters may not be fully compatible with all RDMA scenarios. Different RDMA NCCL-related environment configurations may be needed in different network environments.
|
||
|
||
2. Some preset, optimized configurations for EPLB are not used here. You can adjust them according to [6017](https://github.com/sgl-project/sglang/issues/6017) as needed.
|