主题
“Six tools, one harness”:Salesforce 企业级 AI Harness 深度解析——一个面向生产环境的 MLOps 编排范式
摘要:Salesforce 并未发布新模型,而是交付了一套“可验证、可审计、可运维”的 AI 基础设施契约(Infrastructure Contract)——Enterprise AI Harness。它不是框架,而是一组经过严格互操作性验证的开源组件组合:vLLM + Triton + KServe + KEDA + Prometheus + Argo Workflows,全部运行在 Kubernetes 上,并通过一套标准化的 CRD、RBAC 策略和 SLO 指标契约绑定。其本质是将 MLOps 的“部署-扩缩-观测-治理”闭环,下沉为平台层的可声明式契约。
背景动机:当“AI 工程化”撞上企业级 SLO 红线
过去两年,大量企业陷入一种典型的“AI 运维悖论”:
✅ 模型训练用 PyTorch Lightning / Ray Train,跑得飞快;
✅ 推理服务用 FastAPI + ONNX Runtime,本地测试 OK;
❌ 但上线后:GPU 利用率长期低于 30%、冷启延迟 > 2.8s、Prometheus 中缺失 model_inference_duration_seconds_bucket 标签维度、KEDA 触发的 autoscaling 与 vLLM 的 --max-num-seqs 冲突导致 OOM……
Salesforce 的内部调研指出:73% 的 AI 服务故障源于基础设施层语义割裂——开发侧认为“推理服务 = HTTP endpoint”,运维侧却要同时操心 Triton 的 model repository layout、vLLM 的 --gpu-memory-utilization、KServe 的 InferenceService 版本兼容性,以及 Argo 中 pipeline 失败时如何关联到具体 Pod 的 containerStatuses.reason=OOMKilled。
Enterprise AI Harness 的诞生,正是对这一割裂的系统性反击:它不试图替代任何单个工具,而是定义 “这六个工具在一起必须怎样协作” ——即:用 Kubernetes 原生能力(CRD/Admission Webhook/Metrics API)强制实施跨工具的契约一致性。这比单纯写一篇《vLLM + KServe 最佳实践》文档更激进,也更务实。
值得注意的是,Salesforce 明确声明:Harness 不包含任何闭源组件,所有 YAML、Helm chart、SLO 检查脚本均开源(见 salesforce/ai-harness)。它本质上是一个 “Production-Ready Stack Profile” —— 类似 CNCF 的 k8s-conformance,但针对的是 AI 推理栈。
核心技术:六件套的契约式编排(附生产级 YAML)
Harness 的核心并非发明新轮子,而是用 Kubernetes 的扩展能力,让六个成熟工具形成“齿轮咬合”。以下是关键契约点及对应生产配置:
1. vLLM 与 KServe 的资源契约(避免 GPU 浪费)
vLLM 默认启用 PagedAttention,但 KServe 的 InferenceService CRD 若未显式设置 resources.limits.nvidia.com/gpu: 1,会导致调度器分配 0 GPU 的 Node,进而触发 vLLM 的 fallback CPU 模式(性能暴跌 40x)。Harness 强制要求:
yaml
# ai-harness/vllm-kserve-binding.yaml
apiVersion: kfserving.kubeflow.org/v1beta1
kind: InferenceService
metadata:
name: llama3-8b-vllm
annotations:
# 🔑 Harness 强制契约:vLLM 必须启用 --enable-prefix-caching
# 否则 Admission Webhook 拒绝创建
harness.salesforce.com/require-prefix-caching: "true"
spec:
predictor:
serviceAccountName: vllm-sa
containers:
- name: kserve-container
image: us-docker.pkg.dev/vertex-ai/vertex-vision-model-garden-dockers/pytorch:2.1.0-cu121
# 🔑 关键:vLLM 启动参数由 Harness CRD 统一注入,禁止直接写入 args
env:
- name: VLLM_MODEL_NAME
value: meta-llama/Meta-Llama-3-8B-Instruct
resources:
limits:
nvidia.com/gpu: 1
memory: 48Gi
requests:
nvidia.com/gpu: 1
memory: 48Gi
# 🔑 Harness 注入的 initContainer:校验 vLLM 镜像是否含 paged-attn.so
initContainers:
- name: vllm-validator
image: quay.io/salesforce/ai-harness-validator:v0.3.1
args: ["--check-vllm-paged-attn", "$(VLLM_MODEL_NAME)"]2. KEDA 与 vLLM 的扩缩契约(拒绝盲目扩缩)
vLLM 的并发能力取决于 --max-num-seqs 和 --max-model-len,而 KEDA 基于 http_requests_total 扩缩极易造成“虚假扩容”(如短连接暴增但实际 seq load 为 0)。Harness 定义了专用指标:
yaml
# ai-harness/keda-scaledobject.yaml
apiVersion: keda.sh/v1alpha1
kind: ScaledObject
metadata:
name: vllm-scaledobject
spec:
scaleTargetRef:
name: kservice-llama3-8b-vllm
triggers:
- type: prometheus
metadata:
serverAddress: http://prometheus-kube-prometheus-prometheus.monitoring.svc:9090
# 🔑 Harness 定义的黄金指标:vllm_cache_num_blocks_used / vllm_cache_num_blocks_total
metricName: vllm_cache_num_blocks_used_ratio
threshold: "0.75" # 当 KV cache 使用率 >75% 时扩容
query: |
sum(rate(vllm_cache_num_blocks_used{namespace="default"}[2m]))
/
sum(vllm_cache_num_blocks_total{namespace="default"})3. Argo Workflows 与 Triton 的模型热更新契约
Triton 要求模型更新必须原子性替换 model_repository/ 下整个目录,否则会触发 inconsistent state。Harness 提供 ModelRollout CRD,由 Argo Workflow 驱动:
yaml
# ai-harness/argo-triton-rollout.yaml
apiVersion: argoproj.io/v1alpha1
kind: Workflow
metadata:
generateName: triton-rollout-
spec:
entrypoint: rollout
templates:
- name: rollout
steps:
- - name: validate-new-model
template: validate-model
arguments:
parameters:
- name: model-path
value: gs://my-bucket/llama3-8b-v2/
- - name: atomic-swap
template: swap-model-dir
arguments:
parameters:
- name: new-model-hash
valueFrom:
parameter: validate-new-model.outputs.parameters.model-hash
# 🔑 Harness 强制:swap 后必须调用 vLLM 的 /health/live 接口并等待 30s
- - name: wait-for-readiness
template: wait-vllm-ready4. Prometheus + Grafana 的统一可观测契约
Harness 预置了 12 个 SLO 相关指标,全部打标 harness_stack="enterprise-ai",例如:
| 指标名 | 说明 | SLO 建议阈值 |
|---|---|---|
vllm_e2e_latency_seconds_bucket{le="0.5"} | 端到端 P95 延迟 ≤ 500ms | ≥ 99.5% |
keda_scaledobject_desired_replicas{scaledobject_name=~"vllm.*"} | 扩容决策稳定性(stddev < 0.3) | ≥ 99% |
triton_model_config_reload_failures_total | Triton 模型重载失败次数 | 0 |
这些指标被注入到 Grafana dashboard 的 Enterprise AI Harness Overview 中,且每个 panel 均标注 SLO Bound: YES/NO。
运维建议:从“能跑”到“稳跑”的五条军规
基于我们在金融客户集群的落地经验,提出以下硬性建议(非可选):
永远禁用
kubectl edit修改 InferenceService
Harness 的 Admission Webhook 会校验annotations.harness.salesforce.com/*和env.VLLM_*的完整性。手动编辑将触发Forbidden: vLLM configuration drift detected错误。应使用helm upgrade --set vllm.maxNumSeqs=256或 GitOps 工具(Argo CD)同步。GPU 监控必须启用
DCGM-Exporter+nvidia-smi dmon双采集
单靠nvidia.com/gpuallocatable 无法发现 GPU memory fragmentation。Harness 的vllm-validatorinitContainer 会检查dcgm-exporter是否上报DCGM_FI_DEV_MEM_COPY_UTIL,若缺失则拒绝启动。KEDA 的
pollingInterval必须 ≥ 30s
vLLM 的cache_num_blocks_used指标更新周期为 20s,过短的 polling 会导致 KEDA 读取 stale 数据,引发抖动扩缩。已在 Harness v0.3.1 中硬编码校验。Prometheus 远程写必须启用
write_relabel_configs过滤非 harness 指标
避免vllm_.*指标与业务指标混写同一 TSDB,造成查询爆炸。推荐配置:yamlremote_write: - url: http://thanos-receive.monitoring.svc:19291/api/v1/receive write_relabel_configs: - source_labels: [__name__] regex: 'vllm_.*|keda_.*|triton_.*' action: keepArbitrary
PodSecurityPolicy已废弃,改用PodSecurity Admission的restrictedprofile
Harness 的所有工作负载(vLLM Pod、Triton Server、KServe controller)均满足baselineprofile,但restricted会阻止hostNetwork: true—— 而 vLLM 的--host参数需绑定0.0.0.0,因此必须在 Namespace 中启用:bashkubectl label ns default pod-security.kubernetes.io/enforce=baseline
延伸阅读:超越 Salesforce 的启示
Salesforce 的 Enterprise AI Harness 给业界的真正启示,在于它重新定义了“AI 平台”的边界:
- ❌ 不是“封装所有工具的黑盒平台”(如 SageMaker);
- ✅ 而是“公开契约的白盒协议栈”(类似 eBPF 的 Cilium 或 WASM 的 WasmEdge)。
这种思路正在扩散:
🔹 Kubeflow 2.0 已将 KServe 的 InferenceService 升级为 InferenceGraph,支持多模型串联,其设计哲学与 Harness 高度一致;
🔹 NVIDIA 的 Triton 24.07 新增 --model-control-mode=explicit,允许外部控制器(如 Harness 的 Argo Workflow)接管模型生命周期;
🔹 CNCF Sandbox 项目 KubeRay 正在构建 RayCluster 与 InferenceService 的双向绑定,目标是让训练与推理共享同一套弹性调度语义。
对于中高级 SRE,与其追逐“下一个大模型平台”,不如深耕 “契约驱动的 AI 运维” —— 掌握如何用 Admission Webhook 约束 vLLM 参数、用 KEDA 自定义指标实现业务感知扩缩、用 Prometheus Recording Rules 构建 SLO 黄金信号。因为真正的 AI 工程化,永远发生在 Kubernetes 的 control plane 层面,而非模型的 weights 层面。
最后提醒:Harness 的
v0.3.x版本已支持 Kubernetes 1.28+、vLLM 0.4.2+、KServe 0.13+。但请注意:其 Helm chart 中的keda子 chart 依赖keda-operatorv2.12.0,该版本存在 CVE-2024-30201(权限提升),务必升级至 v2.12.2 或打补丁。细节见 ai-harness/security-advisories。