跳转至正文

在 DigitalOcean Kubernetes Service (DOKS) 上运行 llm-d

本文档涵盖了为使用 llm-d 运行高性能 LLM 推理而配置 DOKS 集群的内容。

先决条件

llm-d 在 DOKS 上已针对以下配置进行了测试

  • GPU 类型:NVIDIA H100, NVIDIA RTX 6000 Ada, NVIDIA RTX 4000 Ada, NVIDIA L40S
  • 版本:DOKS 1.33.1-do.3
  • 网络:VPC 原生集群(必需)

配置架构

DigitalOcean 部署遵循清晰的配置原则

  • 基础配置values.yaml 文件保持原始设计意图,采用高端规格
  • 平台覆盖digitalocean-values.yaml 文件仅包含针对 DigitalOcean 的特定修改
  • 条件加载:通过使用 digitalocean 环境选择性地应用 DigitalOcean 覆盖配置

这种方法可确保:

  • 其他平台的原始配置保持不变
  • DigitalOcean 的优化是隔离且易于维护的
  • 基础架构与平台适配之间界限清晰

集群配置

DOKS 集群应配置以下设置

GPU 驱动管理

DigitalOcean 会在 DOKS 集群上自动安装并管理 GPU 驱动

  • NVIDIA 设备插件:自动安装,用于 GPU 发现和调度
  • 驱动更新:与集群更新同步进行托管
  • GPU 监控:通过 DCGM Exporter 进行内置指标收集

验证 GPU 自动设置

kubectl get pods -n nvidia-device-plugin-system
kubectl get nodes -o custom-columns="NAME:.metadata.name,GPU:.status.allocatable.nvidia\.com/gpu"

快速入门

步骤 1:安装先决条件

在部署 llm-d 工作负载之前,请安装所需的组件

# Navigate to gateway provider prerequisites
cd guides/prereq/gateway-provider

# Install Gateway API and Inference Extension CRDs
./install-gateway-provider-dependencies.sh

# Install Istio control plane
helmfile apply -f istio.helmfile.yaml

步骤 2:集群验证

验证您的集群设置

# Verify cluster access and GPU nodes
kubectl cluster-info
kubectl get nodes -l doks.digitalocean.com/gpu-brand=nvidia

# Verify components are ready
kubectl get pods -n istio-system

步骤 3:部署工作负载

使用 digitalocean 环境自动加载 DigitalOcean 特定的值覆盖

# For inference scheduling (2 decode pods)
cd guides/inference-scheduling
export NAMESPACE=llm-d-inference-scheduling
helmfile apply -e digitalocean -n ${NAMESPACE}

自动应用的 key DigitalOcean 优化点

  • 更小的模型:使用 Qwen3-0.6B (推理调度),不需要 HuggingFace 令牌
  • 稳定镜像:使用生产就绪的 ghcr.io/llm-d/llm-d:v0.2.0 而非开发版本
  • DOKS 优化资源:降低了内存/CPU 需求,适用于 DOKS GPU 节点
  • GPU 容忍度:在带有 nvidia.com/gpu 污点的 DigitalOcean GPU 节点上自动调度
  • 无 RDMA:移除了 DOKS 上不具备的 InfiniBand 需求

架构概览

  • 推理调度:通过 InferencePool 进行智能路由的 2 个解码 Pod

步骤 4:测试

验证部署是否成功

# Check deployment status for inference scheduling
kubectl get pods -n llm-d-inference-scheduling
kubectl get gateway -n llm-d-inference-scheduling

# Test inference endpoint (inference scheduling example)
kubectl port-forward -n llm-d-inference-scheduling svc/infra-inference-scheduling-inference-gateway-istio 8080:80

curl -X POST https://:8080/v1/chat/completions \
-H "Content-Type: application/json" \
-d '`{"model": "Qwen/Qwen3-0.6B", "messages": [{"role": "user", "content": "hello"}`], "max_tokens": 20}'

监控(可选)

部署 Prometheus 和 Grafana 以实现可观测性

cd monitoring
./setup-monitoring.sh

# Access Grafana dashboard
kubectl port-forward -n llm-d-monitoring svc/prometheus-grafana 3000:80

我们建议启用监控栈以跟踪:

  • 每个部署的 GPU 利用率
  • 推理请求的延迟和吞吐量
  • 内存使用情况和 KV 缓存效率
  • 推理 Pod 之间的网络性能

DigitalOcean 特定配置详情

模型选择

DigitalOcean 部署使用更小、经过优化的模型

架构原始模型DigitalOcean 模型优势
推理调度Qwen3-0.6B + HF 令牌Qwen3-0.6B (无需令牌)无需身份验证

资源优化

DigitalOcean 部署自动为 DOKS GPU 节点优化资源分配

  • 降低内存:使用 16Gi 而非 64Gi 以实现更好的节点利用率
  • 优化 CPU:每个 Pod 使用 4 核而非 16 核
  • 单 GPU:每个 Pod 使用 1 个 GPU(最适合 DOKS 节点规格)
  • 无 RDMA:移除了 DOKS 上不具备的 InfiniBand 需求

GPU 节点配置

DigitalOcean DOKS GPU 节点使用污点 (taints) 以防止非 GPU 工作负载被调度

# Automatically applied tolerations
tolerations:
- key: "nvidia.com/gpu"
operator: "Exists"
effect: "NoSchedule"

架构差异

DOKS 上的推理调度

  • 带有 InferencePool 路由的 2 个解码 Pod
  • 每个 Pod 单 GPU(最适合 DOKS 节点规格)
  • 智能请求分发

故障排除

常见问题

1. 部署期间出现 CRD 未找到错误

错误resource mapping not found for name: "..." kind: "Gateway"

原因:部署前未安装所需的 CRD

解决方案:在进行任何 helmfile 部署之前先安装 CRD

cd guides/prereq/gateway-provider
./install-gateway-provider-dependencies.sh
helmfile apply -f istio.helmfile.yaml

2. LoadBalancer 处于 Pending 状态或 API 错误

错误:LoadBalancer 卡在 <pending> 状态并伴有 API 错误

原因:DigitalOcean API 速率限制或并发负载均衡器操作

解决方案:

# Check LoadBalancer status
kubectl describe svc <service-name> -n <namespace>

# Wait for API operations to complete (typically 2-3 minutes)
# Sequential deployments avoid conflicts

3. Pod 无法调度到 GPU 节点

错误untolerated taint {nvidia.com/gpu}

原因:DigitalOcean GPU 节点具有自动污点,以防止非 GPU 工作负载

解决方案:DigitalOcean 的 values 自动包含所需的容忍度 (tolerations)。请验证它们是否已应用

kubectl describe pod <pod-name> -n <namespace> | grep Tolerations

# Should show:
# Tolerations: nvidia.com/gpu:NoSchedule op=Exists

如果缺少容忍度,请确保您使用了会加载 DigitalOcean 覆盖配置的 digitalocean 环境。

4. Gateway 未编程 (Not Programmed)

错误:Gateway 显示 PROGRAMMED: False

解决方案:验证 Istio 是否正在运行且 LoadBalancer IP 是否已分配

kubectl get pods -n istio-system
kubectl get gateway -n <namespace>

清理

# Remove specific deployment
export NAMESPACE=llm-d-inference-scheduling
helmfile destroy -e digitalocean -n ${NAMESPACE}

# Remove prerequisites (affects all deployments)
cd guides/prereq/gateway-provider
helmfile destroy -f istio.helmfile.yaml
./install-gateway-provider-dependencies.sh delete

配置文件参考

基础配置(未修改)

  • guides/inference-scheduling/ms-inference-scheduling/values.yaml

DigitalOcean 覆盖配置(平台特定)

  • guides/inference-scheduling/ms-inference-scheduling/digitalocean-values.yaml

Helmfile 配置

  • 使用 digitalocean 环境有条件地加载 DigitalOcean 覆盖配置
  • 仅在明确使用 -e digitalocean 时应用平台特定配置
  • 遵循具有适当环境隔离的清晰配置架构原则

有关详细配置选项和高级设置,请参阅主 llm-d 指南

内容来源

此内容自动从 llm-d/llm-d 仓库 main 分支的 docs/infra-providers/digitalocean/README.md 同步。

📝 如需建议更改,请 编辑源文件创建 issue