Skip to content

“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-ready

4. 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_totalTriton 模型重载失败次数0

这些指标被注入到 Grafana dashboard 的 Enterprise AI Harness Overview 中,且每个 panel 均标注 SLO Bound: YES/NO

运维建议:从“能跑”到“稳跑”的五条军规

基于我们在金融客户集群的落地经验,提出以下硬性建议(非可选):

  1. 永远禁用 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)同步。

  2. GPU 监控必须启用 DCGM-Exporter + nvidia-smi dmon 双采集
    单靠 nvidia.com/gpu allocatable 无法发现 GPU memory fragmentation。Harness 的 vllm-validator initContainer 会检查 dcgm-exporter 是否上报 DCGM_FI_DEV_MEM_COPY_UTIL,若缺失则拒绝启动。

  3. KEDA 的 pollingInterval 必须 ≥ 30s
    vLLM 的 cache_num_blocks_used 指标更新周期为 20s,过短的 polling 会导致 KEDA 读取 stale 数据,引发抖动扩缩。已在 Harness v0.3.1 中硬编码校验。

  4. Prometheus 远程写必须启用 write_relabel_configs 过滤非 harness 指标
    避免 vllm_.* 指标与业务指标混写同一 TSDB,造成查询爆炸。推荐配置:

    yaml
    remote_write:
    - url: http://thanos-receive.monitoring.svc:19291/api/v1/receive
      write_relabel_configs:
      - source_labels: [__name__]
        regex: 'vllm_.*|keda_.*|triton_.*'
        action: keep
  5. Arbitrary PodSecurityPolicy 已废弃,改用 PodSecurity Admissionrestricted profile
    Harness 的所有工作负载(vLLM Pod、Triton Server、KServe controller)均满足 baseline profile,但 restricted 会阻止 hostNetwork: true —— 而 vLLM 的 --host 参数需绑定 0.0.0.0,因此必须在 Namespace 中启用:

    bash
    kubectl 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 正在构建 RayClusterInferenceService 的双向绑定,目标是让训练与推理共享同一套弹性调度语义。

对于中高级 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-operator v2.12.0,该版本存在 CVE-2024-30201(权限提升),务必升级至 v2.12.2 或打补丁。细节见 ai-harness/security-advisories