最近科技圈有个消息一直挂在热搜上没下来:某家芯片巨头砸了一笔以十亿美元计的钱,买下的不是芯片设计公司,也不是什么新架构IP,而是一个“平台”。消息传出来的时候,评论区吵得热闹,有人说这是溢价,有人说这是布局。但如果你也做AI基础设施,或者管过GPU集群,你会瞬间明白这枚棋子的分量——黄仁勋买的不是现有业务,而是未来十年整个AI算力栈的“入口”。
这篇文章我想把这个事拆开讲清楚。先说结论:这笔交易背后真正的焦虑不是芯片性能落后,而是GPU正在变成标准件、算力正在被“白牌化”,一旦AI工程师的上层入口被Kubernetes这类通用编排工具接管,英伟达就会从“独一档的算力定义者”退化成“卖配件的”。
所以本文会从算力调度平台的本质出发,聊透GPU利用率为什么上不去、调度平台到底在干什么、黄仁勋在怕什么,再给出一套你可以直接在自己K8s集群里复现的GPU编排验证方案,最后聊几个我实际踩过的坑。适合AI Infra工程师、运维同学,以及所有想搞懂“英伟达未来几年软件打法”的技术决策者。
1. “买平台”买的是什么:AI算力调度平台的底层逻辑
1.1 GPU集群的真实痛点:算力买了70%,用上的还不到一半
先说一个特别反常识的现象。很多企业买了整柜整柜的GPU服务器,但你去nvidia-smi上看,很多卡利用率常年只有百分之二三十。不是算力不够,是没调度起来。
我用一个最常见的场景来说明。假设你有4台机器,每台8张A100,总共32张卡。团队A跑一个大模型训练,要申请16张卡;团队B跑推理服务,每路请求需要1张卡;团队C做数据预处理,偶尔用2张卡跑几十分钟。如果靠人工分配,大概率会出现这种情况:团队A占的16张卡里,有一台机器的2张卡因为和别的任务冲突上不去;团队B的推理服务为了扩容,瓶瓶罐罐地占着不同节点的零散卡,显存用了不到一半;团队C的短任务没人排期,要么挤在深夜跑,要么排队排到天亮。最终的结果就是卡都在,但碎片化严重,大任务进不去,小任务占着拉不出屎。
这种浪费是可以量化的。在行业里,企业自建GPU集群的利用率普遍在30%-50%之间,调度做得好能拉高到70%-80%。如果是混部训练、推理、数据任务,通过精细的资源配额和动态调度,甚至能到90%以上。而英伟达卖卡卖得再多,如果客户买回去发现用不满、算力成本降不下来,后续采购就会犹豫,云上租卡反而更香。这才是真正的生意危机。
1.2 调度平台到底是什么:GPU版的Kubernetes
业内把这类平台称为AI算力编排平台(AI Orchestration Platform),说白了就是“GPU版的Kubernetes”。Kubernetes管的是容器,把CPU、内存、网络这些资源抽象成池子,按需调度。而这类平台管的是GPU,让不同团队提交的训练、推理、数据处理任务按照优先级、配额、拓扑要求落到最合适的卡上,用完自动释放。
用一个生活化的类比帮你快速建立画面感。GPU算力就像自来水厂的产能,调度平台则是从水厂到你家的“供水管网+水表+物业”。如果没有管网,水厂产能再大,你也只能提着桶去接水;如果只有管网没有水表,有些人就无限用水,邻居家一口水都等不到;如果物业不管事,水管乱接、压力不均,谁都别想稳定用水。调度平台要解决的,正是“水压低”“水费乱”“水管打架”这三件事。
所以,回到那笔收购,“买下一个平台”买的不是某个具体的软件功能,而是整个AI算力分配体系的控制权。它决定了未来一家企业的GPU集群里,谁的任务先跑、谁的资源有保障、哪一步的算力被浪费——这个控制权,比几十万张卡本身更值钱。
2. 黄仁勋在怕什么:从卖卡到卖AI工厂的三个转折点
2.1 怕GPU变成“白牌资源”,软件入口被上游夺走
黄仁勋最不想看到的局面,就是GPU像服务器CPU一样,变成标准化硬件。标准化的意思就是,你今天能用NVIDIA,明天换AMD、后天换自研芯片,用户体验差异不大。当前的现实显然不是这样,CUDA深度绑定着训练和推理框架,迁移成本极高。但这个绑定并不牢固——因为上层入口正在被通用化技术取代。
具体点说,今天很多AI任务的调度已经不是提交到GPU上,而是提交到Kubernetes集群里。Kubernetes只认资源,不认品牌。一旦这种模式成为绝对主流,在用户看来GPU就是一个可插拔资源,那么英伟达掌握的CUDA生态价值就会被上层编排层架空。应用层的开发者和运维者更关心的是“我的Pod调度在哪台机器上”,而不是“底下的GPU是哪家的”。这时候,谁控制了调度平台、队列、配额、监控面板,谁就掌握了AI工程师的使用入口。
收购一个编排平台,本质上就是要在Kubernetes之上再长出一层“AI原生调度层”,把这层牢牢握在自己手里,让客户哪怕用云原生方式跑任务,最终也是跑在英伟达定义的算力体系内。
2.2 怕AI工程师用不起GPU,被成本倒逼转向自研或云上
第二层恐惧很现实:GPU卖得越贵,客户对利用率越敏感。今天一张H100的市场价动辄十几万人民币,跑不起来就是亏。你想想,一个AI团队花几百万买的卡,如果实际利用率只有30%,老板会怎么想?大概率是:下一批预算不给AI了,或者转向云上按时长租卡。不管是哪一种,英伟达的硬件销量都会受影响。
更危险的是,部分大厂已经开始自研AI芯片,从Google TPU到各类国产芯片,路线越来越成熟。它们有一个共同的卖点:针对自家集群做了深度定制的调度系统,利用率可以做到很高。英伟达如果不在软件层面帮客户把成本打下来,就等于把“算力利用率”这个战场拱手让人。买下平台以后,英伟达可以把调度能力直接打进DGX、DGX Cloud和AI Enterprise订阅服务里,告诉客户:“你买我的整机方案,我帮你把GPU利用率拉到80%以上,综合单卡成本反而比租云更便宜。”这是典型的用软实力巩固硬件护城河的打法。
2.3 怕CUDA帝国出现“旁路”:多芯片混跑的幽灵
再往深一层想,英伟达的护城河到底是硬件还是CUDA?我的判断是CUDA生态。但CUDA生态有一个软肋:它只绑定在英伟达自己的GPU上。一旦调度层、推理层、甚至训练框架里的底层设备适配层变得足够“中立”,应用可以在不同芯片间平移,那CUDA就不再是唯一选项。
这也是为什么英伟达近几年连续吃下多家AI Infra公司,从去年到现在的多笔收购,几乎都瞄准同一个方向:算力编排、推理优化、AI云平台。它不是在买技术村料,而是在拼一张“AI工厂操作系统”的版图——底层拥有GPU硬件,中间有CUDA和NIM推理微服务,上层有调度平台控制资源的分配和成本,顶层还有云服务入口。黄仁勋反复讲AI Factory,不是造概念,而是要把卖卡这件事变成卖整个工厂的产线。买“平台”是整个拼图里最容易被外界忽视、但最关键的一块。
3. 拆解一个商用GPU调度平台的工作原理
3.1 整体架构:控制面、调度器、执行面如何协同
不用把这类平台想得太玄乎。它的核心架构通常分三块:控制面(Control Plane)、调度器、执行面(Agent/Worker)。
控制面负责接收用户的提交请求,管理队列、配额、权限、策略。它是整个平台的“大脑”加“物业接待处”。调度器则是核心决策模块,它会实时扫描集群里所有GPU节点,根据任务优先级、资源需求量、节点亲性和拓扑约束,决定把任务放到哪张卡上。执行面一般以Agent的方式跑在每台GPU服务器上,负责在节点上完成具体分配——例如配置MIG切片、设置时间片、注入环境变量、拉起容器进程。
这三块配合起来,对外暴露出来的就是一句简单的runai submit或者一个API请求。用户不用关心该选哪台机器、要不要抢卡、显存够不够,平台自动处理。与此同时,平台还会带一个仪表盘,展示每张卡的实时利用率、队列等待时间、成本分摊情况。这个可观测层非常关键,因为以前运维同学排查“为啥我的任务没跑起来”要登录好几台机器看日志,现在直接在控制面板上看任务在哪排队、被谁占着资源,效率完全不一样。
3.2 六大关键能力与技术选型深度对比
一个成熟的GPU调度平台,至少要有六项能力,我挨个说清楚,顺便把这些能力对应的开源方案列出来,方便你对照理解。
第一,调度策略。主要包括装箱(bin-packing)和打散(spread)。装箱策略会把任务尽量堆到少数节点上,省出空闲节点给大任务,适合训练场景;打散策略则把任务分散开,降低单点故障影响,适合高可用推理服务。开源方案里,Kueue负责队列级调度,Volcano则偏批处理和HPC任务,两者各有侧重。
第二,动态配额与抢占。团队A有100张卡的配额,团队B有50张,但只要A没跑满,B可以临时借用;A一旦有高优任务进来,B的闲置占用会被收回。类似银行“闲钱理财”。Kubernetes原生的ResourceQuota只能做静态限制,做不到超卖和抢占,所以生产中往往需要Kueue或者Volcano这类扩展组件。
第三,GPU共享。显存足够、算力有富余的场景下,一张卡可以塞多个小任务。技术上分三种:Time Slicing(时间片轮转)、MIG(物理切分)、vGPU(虚拟化)。时间片适合延迟要求不高的推理批处理,MIG适合隔离要求高、显存需求明确的任务。A100、H100支持MIG,但RTX 4090这类消费卡不支持MIG,得靠时间片。这个限制在实际选型时影响挺大。
第四,拓扑感知调度。大模型训练时,节点内NVLink通信比跨节点网络快好几个量级。调度平台要尽量把同一个分布式训练任务的8张卡分到同一台8卡机器上,避免跨机通信拖慢速度。开源层面,Volcano和Kueue都开始引入拓扑感知约束,但配置复杂度和成熟度还远不及商业平台。
第五,多集群与多云纳管。大企业的GPU资源通常分散在不同机房、不同云,平台需要统一纳管,一个界面看全球资源。开源方案里KubeFed早就不太活跃了,Karmada目前是主流,但AI任务调度生态还不够丰富。
第六,可观测与成本分析。平台会记录每张卡被谁用了多久,按团队、项目、任务维度拆分成本。很多老板做AI预算决策就靠这张成本报表。开源方案有OpenCost、dcgm-exporter加Grafana的组合,但要做成多维成本分摊,还是得自己写不少胶水。
我把这些对比整理成一个表格,你直接看会更快。
| 能力项 | 典型商用实现 | 开源替代方案 | 适用场景 |
|---|---|---|---|
| 队列调度 | Run:ai、Lepton AI | Kueue、Volcano | 多团队共享GPU,统一配额管理 |
| 抢占策略 | Run:ai优先级队列 | Kueue Preemption、Volcano Preempt | 高优任务插队时回收闲置资源 |
| GPU共享 | MIG、Time Slicing | NVIDIA官方MIG/time-slicing插件 | 小模型推理、资源共享 |
| 拓扑感知调度 | Run:ai拓扑调度 | Volcano、Kueue较有限 | 大模型分布式训练避免跨机通信 |
| 多集群纳管 | Run:ai多集群、Lepton AI | Karmada+Volcano组合 | 多机房/多云资源统一管理 |
| 成本分析 | Run:ai Dashboard | dcgm-exporter+自研报表 | 算力成本分摊与量化 |
4. 不花钱也能体验“平台式调度”:Kubernetes+Kueue上手实践
买不起商用平台没关系,调度平台的核心逻辑完全可以用开源组件在自己的K8s集群里复现。这一节带你走一套最小可行的方案,跑完后你会理解前面聊的那些能力在系统里究竟是怎么实现的。
4.1 环境准备与组件安装
你不需要太强的硬件,只要有一台带NVIDIA GPU的机器,装上Docker和Kubernetes(单节点也能跑),再装好NVIDIA的GPU驱动,后面步骤就能继续。推荐用Ubuntu 22.04,K8s版本1.28以上。检查GPU驱动的命令很简单,执行nvidia-smi能看到显卡信息就说明驱动没问题。
第一步,在K8s集群里安装NVIDIA Device Plugin,这是让Kubernetes认识GPU的关键。核心组件就是一个DaemonSet,它会监听节点上的GPU设备,把资源数量上报给kubelet,这样调度器在分配Pod时才能看到类似nvidia.com/gpu这样的资源。可以用Helm安装,或者直接apply官方yaml。
第二步,安装Kueue。Kueue是Kubernetes SIG鼎力支持的队列级调度组件,它把“容器调度”和“作业排队”两层拆开,你可以在集群里定义队列,再把Job提交到队列里等待调度。安装也走Helm:
helm repo add kueue https://kubernetes-sigs.github.io/kueue/ helm install kueue kueue/kueue -n kueue-system --create-namespace装完后会有kueue-controller-manager这个Pod在运行。
4.2 配置队列、调度策略与动态分片
Kueue的资源模型里有两个核心对象:ClusterQueue和LocalQueue。ClusterQueue定义的是集群级别的资源池和调度策略,LocalQueue是某个命名空间下的子队列,用户把任务提交到LocalQueue,再由Kueue映射到ClusterQueue。
下面这个例子,定义一个ClusterQueue,资源上限是4张GPU,装箱策略是BestFit(尽量把任务往已有节点上塞)。实际生产中我会建议你把strategy参数设为BestFit,因为GPU集群通常很贵,装箱能省出整节点给大任务。
apiVersion: kueue.x-k8s.io/v1beta1 kind: ClusterQueue metadata: name: gpu-cluster-queue spec: namespaceSelector: {} resourceGroups: - coveredResources: ["nvidia.com/gpu"] flavors: - name: gpu-flavor resources: - name: "nvidia.com/gpu" nominalQuota: 4 preemption: withinClusterQueue: PreemptLowerPriority schedulingPolicy: strategy: BestFit然后是LocalQueue,它很简单,绑定到上面这个ClusterQueue:
apiVersion: kueue.x-k8s.io/v1beta1 kind: LocalQueue metadata: name: ai-team-queue namespace: ai-dev spec: clusterQueue: gpu-cluster-queue之后用户只要创建普通K8s Job,并在Job的metadata里打上kueue.x-k8s.io/queue-name: ai-team-queue这个标签,Kueue就会接管它。我来演示一个申请1张GPU、运行5分钟的压力测试任务:
apiVersion: batch/v1 kind: Job metadata: name: gpu-test-job namespace: ai-dev labels: kueue.x-k8s.io/queue-name: ai-team-queue spec: parallelism: 1 completions: 1 template: spec: containers: - name: gpu-burn image: nvidia/cuda:12.2.0-base-ubuntu22.04 command: ["sh", "-c", "nvidia-smi && sleep 300"] resources: limits: nvidia.com/gpu: 1 restartPolicy: Never提交后,用kubectl get workload能看到Kueue创建了一个对应的工作负载对象。如果集群里有4张GPU,这个任务会被调度到其中一张卡上。再来两个同样的小任务,观察它们如何被分配到空闲卡上,或如何贴到同一张卡上——如果策略是BestFit且显存充足,多个小任务会挤在一张卡上,这就复现了前面说的“装箱”。
4.3 GPU时间切片实验与结果验证
K8s原生只能把一张GPU一次性分配给一个容器,如果想让多个容器共享同一张GPU,就得开Time Slicing。NVIDIA官方提供的device-plugin支持配置时间切片,修改DevicePlugin的配置文件,把time-slicing的资源名加进去就能生效。
实际操作中,需要创建一个ConfigMap,声明GPU资源的共享配置,这里以一张A100为例:
apiVersion: v1 kind: ConfigMap metadata: name: time-slicing-config namespace: kube-system data: time-slicing: | version: v1 sharing: timeSlicing: resources: - name: nvidia.com/gpu replicas: 4接着让device-plugin加载这个配置。这步做完后,kubectl describe node会看到一张卡被识别为4个可分配资源,nvidia.com/gpu: 4,也就是一张物理卡对外变成4张“虚拟卡”,可以同时被4个不同的Pod请求。
实验验证时可以提交4个nvidia-smi任务,每个任务申请1个nvidia.com/gpu资源,你会看到它们都调度到同一张物理卡上,并且4个容器同时运行。在宿主机上执行nvidia-smi,能看到这张卡的利用率被切成时间片轮流服务。需要注意,Time Slicing并不会隔离显存,4个容器共用同一块显存空间,任何一个任务显存占多了其他任务就会OOM,这一点和MIG完全不同。关于这个坑,我在下一节还会单独说。
4.4 一组建议的落地参数
如果你跑完上面的实验,想在更真实的环境里用起来,我建议按场景调参数:小模型推理服务并发量高、单任务占卡少,优先用Time Slicing配合BestFit装箱;分布式训练任务之间占用卡多但数量固定,建议把preemption关掉或只允许优先级高的队列抢占,避免训练中途被挤掉导致checkpoint反复重存;如果服务器是A100/H100这类数据中心卡,同时部署几个隔离要求高的服务,直接MIG切分组合更稳,常用的做法是把一张80GB的A100切成3份(1×40GB + 2×20GB),按需暴露给不同团队。
以上这些实验虽然只跑在单机或小集群上,但你已经完整接触了“资源抽象—队列排队—调度决策—共享执行”这条链路。商用平台上绝大多数功能,本质都是在这个链路里加入更精细的策略和更漂亮的可视化。
5. 常见问题与排查技巧实录
自己搭GPU调度平台和用商业平台,遇到的坑其实大同小异。下面这4个问题是我在多个集群里反复踩过、也看别人踩过的,每一类都值得记下来。
5.1 “卡没被调度上”:节点亲和性与资源模型的坑
现象是任务一直处于Pending状态,kubectl describe pod显示0/1 nodes available,但节点明明有GPU。最常见的原因是device-plugin没有上报资源,或者上报的资源名和你请求的不一致。执行kubectl describe node,确认节点上有nvidia.com/gpu这个条目。如果只有nvidia.com/gpu却显示数量为0,多半是驱动和容器运行时版本不匹配,查看device-plugin日志一般会提示could not start device plugin。另一个容易忽略的原因是节点标签和ClusterQueue的namespaceSelector或nodeSelector不匹配,调度器根本看不到这个节点。
5.2 Time Slicing引发的显存OOM和资源假象
这个坑特别隐蔽。开了Time Slicing以后,一张卡被映射成4个资源,但系统层面并没有真的把显存切成4份,4个Pod可以同时吃到整张卡的显存。如果其中一个Pod申请了40GB,另一个Pod也申请40GB,而卡只有80GB显存,它们同时跑起来就可能双双OOM,但Kubernetes还认为资源是充足的。排查时不能只看调度器,必须在宿主机上执行nvidia-smi查看进程占用。生产环境如果有隔离需求,不要指望Time Slicing,直接走MIG或者给Pod设置好明确的环境变量,比如CUDA_VISIBLE_DEVICES和NVIDIA_VISIBLE_DEVICES来管控可见卡数。
5.3 优先级抢占引发的“无限重启”
集群里开了抢占策略后,高优任务会把低优任务挤掉。看起来很正常,但如果你没控制好抢占次数,低优任务可能刚启动几秒就被打断,反复重试,半天跑不出一个结果。排查时看工作负载的status.requeueCount,如果数值一路飙升,就要考虑收紧调度策略。我的建议是:训练任务能不抢占就不抢占,把抢占留给推理和短时任务;如果一个低优任务被抢占3次还没跑完,就退回队列尾部,防止集群里陷入“永无宁日”的调度风暴。
5.4 拓扑感知失效,训练性能骤降
大模型训练最怕的调度结果,是8卡任务被拆到两台上不同交换机下的机器上,虽然也能跑,但通信效率直接掉一半以上。这里要强调,单纯看资源数量不算真正的调度,还得看节点之间的拓扑关系。排查时可以按下面的表来定位问题:
| 现象 | 可能原因 | 排查命令/工具 | 解决建议 |
|---|---|---|---|
| 任务卡在Pending | device-plugin未上报GPU资源 | kubectl describe node | 检查device-plugin日志、驱动版本 |
| GPU显示有资源但无法调度 | 节点标签与队列不匹配 | kubectl get nodes --show-labels | 对齐LabelSelector |
| Time Slicing后任务OOM | 显存非隔离导致超额 | nvidia-smi查看进程显存 | 改用MIG或控制单Pod显存上限 |
| 低优任务反复重启 | 抢占策略不合理 | kubectl get workload | 限制抢占次数、降级抢占优先级 |
| 多卡训练性能差 | 拓扑感知未生效 | nvidia-smi topo -m | 给节点打rack/switch拓扑标签 |
还有一个经验是:学会把nvidia-smi topo -m的输出提前录进CMDB。调度前先根据拓扑信息给节点打上标签,比如“rack-a-switch-1”,然后在调度配置里加nodeAffinity约束,让同一个训练任务的Pod尽量落到同一标签节点下。不要等到性能掉下来了再去查网络,那时候定位成本远高于提前规划。
6. 后续影响:一个“算力操作系统”时代正在到来
这笔并购真正的影响面,不只在英伟达一家。云厂商、做AI Infra的创业公司、还有那些想切入AI计算的硬件厂商,都在盯着这件事。
对云厂商来说,英伟达如果掌握调度平台,就能把“GPU利用率”做到极致,那云厂商自己给客户分的GPU池,就得在开放度和绑定度之间重新找平衡。对AI创业公司而言,以后申请算力可能不再单纯是“开几台机器”,而是“在英伟达定义的队列里买配额”。对AMD和国内芯片厂商来说,挑战更直接:它们本来希望靠开源调度工具让客户平滑切换芯片,现在英伟达把调度层也收编了,迁移成本只会更高。
所以我看这件事的实质,就是英伟达正在构建一个从芯片、服务器、集群调度、推理服务到云入口的完整“算力操作系统”。黄仁勋怕的不是某一个具体的竞争对手,而是怕整个AI基础设施层失去控制权。买“平台”这场仗,打得其实比卖卡本身更值钱。而我个人的体会是,作为AI基础设施工程师,现在应该开始认真地把Kubernetes的调度能力、GPU共享机制、配额策略这些知识补起来——未来几年,无论你用的是商业平台还是开源组件,这些底层的资源调度思维都是躲不开的核心技能。最后再分享一个小技巧:在决定为团队引入任何调度平台之前,先把当前集群每张GPU的利用率、每类任务的排队时长、每次抢卡冲突的成本记录成表格,用数据说话,这件事比任何技术选型都更关键。