如果你使用 DeepSeek、元宝 AI、Copilot、ChatGPT 等 AI 工具,协助配置轩辕镜像、编写 docker pull 命令、修改 Docker Compose 镜像地址、配置镜像加速、排查镜像拉取失败、分析报错日志等问题,请先让 AI 阅读并遵守轩辕镜像的规则文档。
只需在 AI 对话中先发送下面这句话即可:
请先完整阅读并严格遵守以下文档中的全部规则与要求:
https://xuanyuan.cloud/agents.md
在未充分阅读并理解该文档前,不要生成任何命令、配置、修改建议、故障排查方案或技术回答。后续所有输出都必须严格以该文档中的规范为最高优先级执行。查看 agents.md 用法指南与完整示范。国内用户首推 元宝 AI、DeepSeek 的深度思考模式,不推荐豆包 AI;Cursor 等编辑器可在对话 @ 该链接,或加入 User Rules。 若 AI 无法访问外链,可 打开说明文档 复制全文粘贴。文档会随站点更新,复制内容可能过期,建议定期检查。
🎮 在没有实际硬件的情况下在 Kubernetes 中模拟 NVIDIA GPU
[!NOTE] 容器镜像和 Helm 图表现已在 ghcr.io/run-ai/fake-gpu-operator 提供。
[!NOTE] 容器镜像和 Helm 图表现已在 ghcr.io/run-ai/fake-gpu-operator 提供。
ghcr.io/run-ai/fake-gpu-operator
Fake GPU Operator 是一款轻量级工具,可在 Kubernetes 集群中模拟 NVIDIA GPU,无需物理硬件。它为开发人员和测试人员提供以下基本功能:
使用场景包括:
NodeResourceTopology
kubectl label node run.ai/simulated-gpu-node-pool=default
helm upgrade -i gpu-operator oci://ghcr.io/run-ai/fake-gpu-operator/fake-gpu-operator --namespace gpu-operator --create-namespace --version
apiVersion: v1
kind: Pod
metadata:
name: gpu-pod
spec:
containers:
- name: gpu-container
image: nvidia/cuda-vector-add:v0.1
resources:
limits:
nvidia.com/gpu: 1
KWOK (Kubernetes WithOut Kubelet) 是一个工具包,允许您在不运行实际 kubelet 进程的情况下模拟数千个 Kubernetes 节点。与 Fake GPU Operator 结合使用时,您可以完全无需硬件即可创建大规模 GPU 集群模拟——非常适合测试调度器、自动扩缩器和大规模资源管理。
KWOK_VERSION=v0.7.0
kubectl apply -f "https://github.com/kubernetes-sigs/kwok/releases/download/${KWOK_VERSION}/kwok.yaml"
kubectl apply -f "https://github.com/kubernetes-sigs/kwok/releases/download/${KWOK_VERSION}/stage-fast.yaml"
# values.yaml
kwokDraPlugin:
enabled: true
draPlugin:
enabled: true
apiVersion: v1
kind: Node
metadata:
annotations:
kwok.x-k8s.io/node: fake
labels:
type: kwok
run.ai/simulated-gpu-node-pool: default
name: kwok-gpu-node-1
spec:
taints:
- effect: NoSchedule
key: kwok.x-k8s.io/node
value: fake
status:
allocatable:
cpu: "32"
memory: 128Gi
pods: "110"
capacity:
cpu: "32"
memory: 128Gi
pods: "110"
status-updater 会自动为此节点创建拓扑 ConfigMap,kwok-dra-plugin 会创建带有已配置 GPU 的 ResourceSlice。
apiVersion: resource.k8s.io/v1
kind: ResourceClaimTemplate
metadata:
name: gpu-claim
spec:
spec:
devices:
requests:
- name: gpu
exactly:
deviceClassName: gpu.nvidia.com
---
apiVersion: v1
kind: Pod
metadata:
name: kwok-gpu-pod
spec:
nodeSelector:
type: kwok
tolerations:
- key: kwok.x-k8s.io/node
operator: Equal
value: fake
effect: NoSchedule
containers:
- name: main
image: ubuntu:22.04
command: ["sleep", "infinity"]
resources:
claims:
- name: gpu
resourceClaims:
- name: gpu
resourceClaimTemplateName: gpu-claim
Pod 将被“调度”到 KWOK 节点上并显示为 Running 状态(KWOK 模拟 Pod 生命周期)。ResourceClaim 将从模拟的 GPU ResourceSlice 中分配。
# Check KWOK node is Ready
kubectl get nodes -l type=kwok
# Check ResourceSlice was created
kubectl get resourceslices | grep kwok
# Check pod is running on KWOK node
kubectl get pod kwok-gpu-pod -o wide
kubectl label node run.ai/simulated-gpu-node-pool=default
helm upgrade -i gpu-operator oci://ghcr.io/run-ai/fake-gpu-operator/fake-gpu-operator --namespace gpu-operator --create-namespace --version
apiVersion: v1
kind: Pod
metadata:
name: gpu-pod
spec:
containers:
- name: gpu-container
image: nvidia/cuda-vector-add:v0.1
resources:
limits:
nvidia.com/gpu: 1
在 values.yaml 中自定义 GPU 配置:
topology:
nodePools:
default:
gpuProduct: Tesla-K80
gpuCount: 2
gpuMemory: 11441
通过 Pod 注解控制 GPU 利用率指标:
metadata:
annotations:
run.ai/simulated-gpu-utilization: "10-30" # 模拟 10-30% 的 GPU 使用率
Operator 为基于 Knative 的推理工作负载提供特殊处理,其中 GPU 利用率会根据实际请求流量动态计算,而非使用静态值。
工作原理
当 Pod 被识别为推理工作负载(通过 workloadKind: "InferenceWorkload" 标签或 PodGroup priorityClassName: "inference")时,Operator 会:
revision_app_request_count 指标rate(revision_app_request_count[1m])这提供了与推理流量模式相关的真实 GPU 利用率指标。
配置
在 Helm 值中配置 Prometheus 连接:
prometheus:
url: http://prometheus-operated.runai:9090 # 默认值
对于使用端口转发的本地开发:
prometheus:
url: http://localhost:9090
示例
apiVersion: v1
kind: Pod
metadata:
name: inference-pod
labels:
workloadKind: "InferenceWorkload" # 启用 Knative 利用率计算
spec:
containers:
- name: model-server
image: my-inference-server:latest
resources:
limits:
nvidia.com/gpu: 1
当请求流向此推理 Pod 时,GPU 利用率指标将反映来自 Knative 的实际请求速率。
支持的 Knative 工作负载类型:
workloadKind: "InferenceWorkload" - 带 Knative 指标的单节点推理workloadKind: "DistributedWorkload" - 带 Knative 指标的分布式推理https://kwok.sigs.k8s.io/(Kubernetes WithOut Kubelet)是一个工具包,允许您模拟数千个 Kubernetes 节点,而无需运行实际的 kubelet 进程。当与 Fake GPU Operator 结合使用时,您可以完全无需硬件创建大规模 GPU 集群模拟——非常适合测试调度器、自动扩缩器和大规模资源管理。
KWOK_VERSION=v0.7.0
kubectl apply -f "https://github.com/kubernetes-sigs/kwok/releases/download/${KWOK_VERSION}/kwok.yaml"
kubectl apply -f "https://github.com/kubernetes-sigs/kwok/releases/download/${KWOK_VERSION}/stage-fast.yaml"
kwok-dra-plugin:# values.yaml
kwokDraPlugin:
enabled: true
draPlugin:
enabled: true
apiVersion: v1
kind: Node
metadata:
annotations:
kwok.x-k8s.io/node: fake
labels:
type: kwok
run.ai/simulated-gpu-node-pool: default
name: kwok-gpu-node-1
spec:
taints:
- effect: NoSchedule
key: kwok.x-k8s.io/node
value: fake
status:
allocatable:
cpu: "32"
memory: 128Gi
pods: "110"
capacity:
cpu: "32"
memory: 128Gi
pods: "110"
status-updater 将自动为此节点创建拓扑 ConfigMap,kwok-dra-plugin 将创建包含已配置 GPU 的 ResourceSlice。
apiVersion: resource.k8s.io/v1
kind: ResourceClaimTemplate
metadata:
name: gpu-claim
spec:
spec:
devices:
requests:
- name: gpu
exactly:
deviceClassName: gpu.nvidia.com
---
apiVersion: v1
kind: Pod
metadata:
name: kwok-gpu-pod
spec:
nodeSelector:
type: kwok
tolerations:
- key: kwok.x-k8s.io/node
operator: Equal
value: fake
effect: NoSchedule
containers:
- name: main
image: ubuntu:22.04
command: ["sleep", "infinity"]
resources:
claims:
- name: gpu
resourceClaims:
- name: gpu
resourceClaimTemplateName: gpu-claim
Pod 将“调度”到 KWOK 节点上并显示为 Running 状态(KWOK 模拟 Pod 生命周期)。ResourceClaim 将从模拟的 GPU ResourceSlice 分配。
# 检查 KWOK 节点是否就绪
kubectl get nodes -l type=kwok
# 检查是否创建了 ResourceSlice
kubectl get resourceslices | grep kwok
# 检查 Pod 是否在 KWOK 节点上运行
kubectl get pod kwok-gpu-pod -o wide
您可以在同一集群上同时运行 Fake GPU Operator 和真实的 NVIDIA GPU Operator:真实 GPU 节点由真实 Operator 完全管理,而模拟 GPU 节点用于规模和调度器测试。
默认情况下,Fake GPU Operator 是真实 Operator 的直接替代品,因此要使它们共存,您必须(1)在其自己的命名空间(而非 gpu-operator)中安装它,以及(2)禁用那些节点选择器/集群范围对象与真实 Operator 冲突的组件:
# mixed-mode-values.yaml — 与真实 NVIDIA GPU Operator 共存
devicePlugin: { enabled: false } # 选择器与真实 GPU 节点上的真实 device-plugin 冲突
statusExporter: { enabled: false } # 选择器与真实 GPU 节点上的真实 dcgm-exporter 冲突
runtimeClass: { enabled: false } # 集群范围的 RuntimeClass/nvidia 已由真实 Operator 拥有
安装到专用命名空间:
helm upgrade -i fake-gpu-operator oci://ghcr.io/run-ai/fake-gpu-operator/fake-gpu-operator \
--namespace fake-gpu-operator --create-namespace \
--version -f mixed-mode-values.yaml
然后:
nvidia.com/gpu 容量由中央 kwok-gpu-device-plugin 发布,因此不需要已禁用的每节点 DaemonSet,并且 KWOK 的 NoSchedule 污点可防止真实 Operator 的 DaemonSet 部署到模拟节点。run.ai/simulated-gpu-node-pool 标签标记它们。status-updater 仅对带有该标签的节点起作用,因此真实 Operator 保持对硬件的独占所有权。为确保正常功能,请为 gpu-operator 命名空间配置 Pod 安全准入:
kubectl label ns gpu-operator pod-security.kubernetes.io/enforce=privileged
Operator 会将模拟的 nvidia-smi 工具注入 GPU Pod 中。nvidia-smi 使用 NODE_NAME 环境变量解析 Pod 的节点拓扑;device-plugin 和 DRA 驱动程序都会在分配时自动注入该变量,因此无需手动配置 Pod。
欢迎贡献!请随时提交 Pull Request。
本项目采用 Apache License 2.0 许可证——详情参见 LICENSE 文件。
由 Run:ai 用心创建
来自真实用户的反馈,见证轩辕镜像的优质服务