NVIDIA 做了一件不太寻常的事:把 build.nvidia.com 背后跑的整套函数计算平台——NVCF(NVIDIA Cloud Functions)——以 Apache 2.0 协议完整开源。不是 SDK,不是客户端库,不是"参考实现",而是控制平面、调用平面、计算平面、CLI、Helm charts、数据库迁移脚本,全部丢进一个单体仓库 github.com/nvidia/nvcf。这意味着你可以在自己的集群里跑一套和 NVIDIA 内部同架构的 GPU 函数调度系统。
为什么这件事值得关注
函数计算(FaaS)在 CPU 世界已经很成熟——AWS Lambda、Azure Functions、Cloud Run 都能按请求调度容器。但 GPU 函数计算一直是个硬骨头:GPU 资源贵、冷启动慢、显存管理复杂、多租户隔离难。市面上大多数"GPU 函数计算"产品只做了请求路由,底层调度逻辑闭源,你看不到它怎么把一个推理请求塞进一张还在跑别的任务的卡上。
NVCF 开源的意义在于:调度策略、任务排队、GPU 分配、冷启动优化——这些核心逻辑你都能直接读代码。想改优先级算法?想加自定义指标调度?想适配非 NVIDIA GPU?fork 一份就能动手。
三平面架构:控制、调用、计算各管什么
NVCF 把系统拆成三个平面,职责边界清晰:
控制平面(Control Plane)——管理函数定义、版本、部署策略、配置元数据。你注册一个新函数、发布一个新版本、设置伸缩策略,都走这里。相当于"注册中心 + 配置中心"。
调用平面(Invocation Plane)——接收外部请求,做路由、鉴权、限流、排队,然后把请求转发到对应的计算实例。这是用户流量的入口,也是延迟最敏感的部分。
计算平面(Compute Plane)——真正管 GPU 容器的地方。负责拉镜像、分配 GPU、启动工作负载、监控健康状态、回收资源。一个计算平面可以管理多个 Kubernetes 集群或裸金属节点群。
三个平面之间通过内部 API 通信,每个平面可以独立伸缩。这种拆法的好处:调用平面可以轻量部署在边缘节点,计算平面留在有 GPU 的数据中心,控制平面只需要高可用不需要高算力。
仓库结构速览
克隆仓库后,核心目录大致如下:
nvcf/
├── control-plane/ # 函数注册、版本管理、配置服务
├── invocation-plane/ # 请求路由、排队、鉴权网关
├── compute-plane/ # GPU 容器调度、资源分配引擎
├── cli/ # nvcf 命令行工具
├── helm/ # 各平面的 Helm charts
├── migrations/ # 数据库 schema 迁移脚本
└── docs/ # 架构文档与部署指南
每个平面内部又按微服务拆分,比如计算平面里有调度器(scheduler)、节点代理(node-agent)、监控收集器(metrics-collector)等子服务。
上手:用 Helm 在本地集群部署 NVCF
下面是一个最小化部署流程,假设你有一个 Kubernetes 集群(minikube 或真实集群均可)和 Helm 3。
1. 克隆仓库并安装依赖
git clone https://github.com/nvidia/nvcf.git
cd nvcf
# 确认 Helm 和 kubectl 可用
helm version --short
kubectl cluster-info
2. 创建命名空间并部署控制平面
kubectl create namespace nvcf-system
# 先部署数据库(NVCF 使用 PostgreSQL 作为元数据存储)
helm install nvcf-db helm/nvcf-db \
--namespace nvcf-system \
--set persistence.enabled=false # 开发环境用临时存储
# 运行数据库迁移
kubectl apply -f migrations/ -n nvcf-system
# 部署控制平面
helm install nvcf-control helm/nvcf-control \
--namespace nvcf-system \
--set replicaCount=1
3. 部署调用平面
helm install nvcf-invocation helm/nvcf-invocation \
--namespace nvcf-system \
--set replicaCount=1 \
--set controlPlane.endpoint=nvcf-control:8080
4. 部署计算平面(需要 GPU 节点)
如果你的集群有 NVIDIA GPU 节点并且已安装 NVIDIA device plugin:
helm install nvcf-compute helm/nvcf-compute \
--namespace nvcf-system \
--set controlPlane.endpoint=nvcf-control:8080 \
--set gpuResourceType=nvidia.com/gpu \
--set scheduler.strategy=priority-based
如果没有 GPU 节点,可以先用 CPU 模拟模式跑通流程(调度器会忽略 GPU 请求,所有函数以 CPU 模式运行):
helm install nvcf-compute helm/nvcf-compute \
--namespace nvcf-system \
--set controlPlane.endpoint=nvcf-control:8080 \
--set gpuEmulation.enabled=true
5. 用 CLI 注册并调用一个函数
# 安装 CLI
pip install -e cli/
# 注册一个示例函数(使用 NVIDIA 提供的 Triton 推理服务器镜像)
nvcf function create \
--name "my-triton-fn" \
--image "nvcr.io/nvidia/tritonserver:24.01-py3" \
--gpu-count 1 \
--endpoint "/v2/models/default/infer"
# 发布版本
nvcf function publish --name "my-triton-fn" --version 1
# 调用函数
nvcf function invoke \
--name "my-triton-fn" \
--version 1 \
--payload '{"inputs": [{"name": "input__0", "shape": [1, 3, 224, 224], "datatype": "FP32", "data": [...]}]}'
⚠️ 以上 CLI 子命令和参数基于仓库文档推断。NVCF 刚开源,CLI 接口可能仍在调整,实际使用前请对照仓库中
cli/目录的最新 README 确认具体命令格式。
调度策略:看代码比看文档更靠谱
NVCF 的计算平面调度器是整个系统最值得深读的部分。几个关键设计点:
优先级队列 + GPU 碎片整理——请求不是简单 FIFO。高优先级函数(比如实时推理)可以抢占低优先级函数(比如批量离线处理)占用的 GPU。调度器会计算 GPU 显存碎片,尝试把小模型打包到同一张卡上,而不是一张卡只跑一个模型。
冷启动分层——首次调用需要拉镜像、初始化运行时,延迟可能到数十秒。NVCF 的做法是:热门函数保持 warm pool(预启动容器池),冷函数走 on-demand 启动。warm pool 的大小由控制平面根据历史调用频率动态调整。
多集群调度——计算平面可以管理多个 Kubernetes 集群。调度器收到请求后,会根据各集群的 GPU 负载、网络延迟、成本标签选择目标集群。这为"跨区域 GPU 调度"提供了基础。
想看具体实现,直接读 compute-plane/scheduler/ 下的 Go 代码,核心调度逻辑集中在 schedule.go 和 gpu_allocator.go 两个文件。
实际落地的几个考量
适合谁用? 如果你在运营 GPU 推理服务集群,需要多租户调度、按请求计费、函数版本管理——NVCF 直接可用。如果你只是跑单模型服务,Kubernetes + Triton 就够了,NVCF 的三层架构反而过重。
GPU 依赖——计算平面目前硬绑定 NVIDIA GPU(通过 nvidia.com/gpu resource)。想跑 AMD 或 Intel GPU,需要改 device plugin 配置和调度器的 GPU 类型枚举,工作量不小。
数据库选择——元数据存储用 PostgreSQL。大规模部署需要考虑 PG 的高可用和性能调优,小规模开发可以用临时存储。
安全边界——调用平面做了鉴权和限流,但多租户之间的 GPU 显存隔离依赖容器级隔离(MIG 或时间切片),不是 NVCF 自己实现的。部署前要确认你的 GPU 隔离策略。
快速检查清单
部署 NVCF 前过一遍这几项:
| 检查项 | 要求 |
|---|---|
| Kubernetes 版本 | ≥ 1.26,支持 device plugin |
| NVIDIA GPU driver | ≥ 535,容器内可访问 |
| NVIDIA device plugin | 已安装并正常报告 nvidia.com/gpu |
| PostgreSQL | 控制平面元数据存储,生产环境需 HA |
| Helm 3 | 部署各平面组件 |
| 网络策略 | 三平面间内部 API 互通,调用平面对外暴露 |
NVCF 开源把 GPU 函数计算从"黑箱产品"变成了"可读、可改、可移植的基础设施"。对做 GPU 集群调度的人来说,这是目前能拿到最完整的一份参考实现——不是纸面设计,是跑在 build.nvidia.com 上的那套代码。