暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

字节跳动AIBrix来袭:深度解析云原生部署测试,开启大模型推理新时代

AI云枢 2025-05-18
284
AIBrix是一个为大型语言模型(LLM)推理设计的云原生平台,其架构分为两个主要维度:控制平面(Control Plane)和数据平面(Data Plane)。

控制平面组件
控制平面负责资源编排和管理,主要由以下Kubernetes控制器组成:
1、Controller Manager - 所有控制器的核心管理组件,负责协调各个控制器的运行。
2、PodAutoscaler Controller - 自动扩缩容控制器,根据不同指标和策略自动扩缩容资源。支持三种扩缩容策略:
  • HPA (Horizontal Pod Autoscaler) - 标准Kubernetes HPA
  • KPA (Knative-style Pod Autoscaler) - 具有稳定和紧急扩缩容模式,适合处理流量突发。
  • APA (Application Pod Autoscaler) - 应用特定的扩缩容逻辑,提供可配置的容忍带,适合应用特定的扩缩容需求。
3、ModelAdapter Controller - 管理LoRA适配器的生命周期,包括调度(将LoRA适配器调度到合适的模型Pod上)、加载和卸载LoRA模型及创建必要的svc服务使适配器可访问。
4、RayClusterFleet Controller 和 RayClusterReplicaSet Controller - 管理分布式推理的Ray集群,RayClusterFleet Controller管理具有滚动更新能力的Ray集群舰队;RayClusterReplicaSet Controller管理具有特定副本计数的Ray集群集合
5、ModelRoute Controller - 管理模型路由,创建HTTP路由规则。
6、KVCache Controller - 管理分布式KV缓存,实现高容量、跨引擎的KV重用。

数据平面组件
数据平面处理实际的请求处理和模型执行:
1、Gateway Plugins - 基于Envoy的网关扩展,提供动态路由、用户配置和高级路由策略,其中也包括用户请求计数和令牌使用预算配置、流式处理和高级路由策略,并支持多种路由算法:随机、最少请求、吞吐量、前缀缓存感知。
2、AI Engine Runtime - 推理容器的统一管理层,提供指标标准化、模型下载和管理功能。
3、Metadata Service - 提供元数据服务。
4、Redis - 用于存储指标和状态信息,如用户速率相关信息。
    [root@system-test-102-94 lgy]# kubectl get po -n aibrix-system 
    NAME                                         READY   STATUS    RESTARTS      AGE
    aibrix-controller-manager-7557f875bf-xxhmn   1/1     Running   1 (33h ago)   2d23h
    aibrix-gateway-plugins-6f76c4ccf7-bhg6g      1/1     Running   0             2d23h
    aibrix-gpu-optimizer-78cfdb6dc7-vnbtb        1/1     Running   0             2d23h
    aibrix-kuberay-operator-5586cd8976-mm884     1/1     Running   1 (33h ago)   2d23h
    aibrix-metadata-service-79cc7786b9-dxdtm     1/1     Running   0             2d23h
    aibrix-redis-master-84c69b7d5d-dwtdw         1/1     Running   0             2d23h
    [root@system-test-102-94 lgy]# kubectl get svc -n aibrix-system 
    NAME                                             TYPE        CLUSTER-IP      EXTERNAL-IP   PORT(S)          AGE
    aibrix-controller-manager-metrics-service        ClusterIP   10.96.104.139   <none>        8080/TCP         2d23h
    aibrix-gateway-plugins                           ClusterIP   10.96.134.7     <none>        50052/TCP        2d23h
    aibrix-gpu-optimizer                             ClusterIP   10.96.249.205   <none>        8080/TCP         2d23h
    aibrix-kuberay-operator                          ClusterIP   10.96.60.14     <none>        8080/TCP         2d23h
    aibrix-lora-controller-manager-metrics-service   ClusterIP   10.96.89.16     <none>        8080/TCP         74m
    aibrix-metadata-service                          NodePort    10.96.246.18    <none>        8090:32004/TCP   2d23h
    aibrix-redis-master                              ClusterIP   10.96.149.47    <none>        6379/TCP         2d23h

    推理示例
      apiVersion: apps/v1
      kind: Deployment
      metadata:
        labels:
          model.aibrix.ai/name: deepseek-r1-distill-llama-8b # 和svc一致
          model.aibrix.ai/port: "8000"
        name: deepseek-r1-distill-llama-8b
        namespace: default
      spec:
        replicas: 1
        selector:
          matchLabels:
            model.aibrix.ai/name: deepseek-r1-distill-llama-8b
        template:
          metadata:
            labels:
              model.aibrix.ai/name: deepseek-r1-distill-llama-8b
          spec:
            containers:
              - command:
                  - python3
                  - -m
                  - vllm.entrypoints.openai.api_server
                  - --host
                  - "0.0.0.0"
                  - --port
                  - "8000"
                  - --uvicorn-log-level
                  - warning
                  - --model
                  - models/DeepSeek-R1-Distill-Llama-8B
                  - --served-model-name
                  - deepseek-r1-distill-llama-8b # 和svc一致
                  - --max-model-len
                  - "12288"
                image: docker.1ms.run/vllm/vllm-openai:v0.7.1
                imagePullPolicy: IfNotPresent
                name: vllm-openai
                volumeMounts:
                - name: models
                  mountPath: models/DeepSeek-R1-Distill-Llama-8B
                ports:
                  - containerPort: 8000
                    protocol: TCP
                resources:
                  limits:
                    nvidia.com/nvidia-rtx-3090-24GB: "1"
                  requests:
                    nvidia.com/nvidia-rtx-3090-24GB: "1"
                livenessProbe:
                  httpGet:
                    path: health
                    port: 8000
                    scheme: HTTP
                  failureThreshold: 3
                  periodSeconds: 5
                  successThreshold: 1
                  timeoutSeconds: 1
                readinessProbe:
                  httpGet:
                    path: health
                    port: 8000
                    scheme: HTTP
                  failureThreshold: 5
                  periodSeconds: 5
                  successThreshold: 1
                  timeoutSeconds: 1
                startupProbe:
                  httpGet:
                    path: health
                    port: 8000
                    scheme: HTTP
                  failureThreshold: 30
                  periodSeconds: 5
                  successThreshold: 1
                  timeoutSeconds: 1
            volumes:
            - name: models
              hostPath:
                path: root/lgy/models/DeepSeek-R1-Distill-Llama-8B
                type: Directory
      ---
      apiVersion: v1
      kind: Service
      metadata:
        labels:
          model.aibrix.ai/name: deepseek-r1-distill-llama-8b
          prometheus-discovery: "true"
        annotations:
          prometheus.io/scrape: "true"
          prometheus.io/port: "8080"
        name: deepseek-r1-distill-llama-8b # 需和model.aibrix.ai/name一致
        namespace: default
      spec:
        ports:
          - name: serve
            port: 8000
            protocol: TCP
            targetPort: 8000
          - name: http
            port: 8080
            protocol: TCP
            targetPort: 8080
        selector:
          model.aibrix.ai/name: deepseek-r1-distill-llama-8b
        type: ClusterIP

      Gateway Route

        [root@system-test-102-94 lgy]# kubectl get po -n envoy-gateway-system 
        NAME                                                     READY   STATUS    RESTARTS      AGE
        envoy-aibrix-system-aibrix-eg-903790dc-fccbb99cd-4b9jg   2/2     Running   0             2d23h
        envoy-gateway-748f68f8f5-c55xx                           1/1     Running   1 (33h ago)   2d23h
        [root@system-test-102-94 lgy]# kubectl get svc -n envoy-gateway-system 
        NAME                                     TYPE        CLUSTER-IP     EXTERNAL-IP   PORT(S)                                   AGE
        envoy-aibrix-system-aibrix-eg-903790dc   NodePort    10.96.192.76   <none>        80:1422/TCP                               3d
        envoy-gateway                            ClusterIP   10.96.18.242   <none>        18000/TCP,18001/TCP,18002/TCP,19001/TCP   3d
        [root@system-test-102-94 lgy]# kubectl get gateway -n aibrix-system 
        NAME        CLASS       ADDRESS       PROGRAMMED   AGE
        aibrix-eg   aibrix-eg   10.0.100.16   True         3d
        [root@system-test-102-94 lgy]# kubectl get httproute -n aibrix-system 
        NAME                                  HOSTNAMES   AGE
        aibrix-reserved-router                            2d23h
        deepseek-r1-distill-llama-8b-router               2d16h

        访问策略
        • random:将请求路由到随机 pod。
        • least-request:将请求路由到正在进行的请求最少的 pod。
        • throughput:将请求路由到已处理最低总加权令牌的 pod。
        • prefix-cache:将请求路由到已经具有与请求的提示前缀匹配的 KV 缓存的 pod。
        • least-busy-time:将请求路由到累计繁忙处理时间最短的 pod。
        • least-kv-cache:将请求路由到当前 KV 缓存大小最小(使用的 VRAM 最少)的 pod。
        • least-latency:将请求路由到平均处理延迟最低的 pod。
        • prefix-cache-and-load:路由请求时同时考虑前缀缓存命中和 pod 负载。
        • vtc-basic:使用平衡公平性(用户令牌计数)和 Pod 利用率的混合评分来路由请求。它是虚拟令牌计数器 (VTC) 算法的一个简单变体
          curl http://10.0.102.94:32004/CreateUser -H "Content-Type: application/json" -d '{"name""lgy","rpm"100,"tpm"1000}'
          限速
            curl http://10.0.102.94:32004/CreateUser -H "Content-Type: application/json" -d '{"name""lgy","rpm"100,"tpm"1000}'
            RPM:每分钟最大请求数(Requests Per Minute)
            TPM:每分钟最大令牌数(Tokens Per Minute)

            查看用户配置
              curl http://10.0.102.94:32004/ReadUser -H "Content-Type: application/json" -d '{"name""lgy"}'

              更新配额
                curl http://10.0.102.94:32004/UpdateUser -H "Content-Type: application/json" -d '{"name""lgs","rpm"3,"tpm"1000}'

                请求
                发起请求,请求头携带-H "user: your-user-id"
                  curl -10.0.102.94:1422/v1/chat/completions \
                    -H "user: lgy" \
                    -H "Content-Type: application/json" \
                    -d '{
                      "model""deepseek-r1-distill-llama-8b",
                      "messages": [{"role""user""content""Say this is a test!"}],
                      "temperature"0.7
                    }'

                  速率限制的实现细节
                  当请求到达网关时,系统会执行以下检查:
                  • 检查RPM限制:验证用户当前的请求数是否已超过RPM限制
                  • 增加RPM计数:如果未超过限制,增加用户的RPM计数
                  • 检查TPM限制:验证用户当前的令牌使用量是否已超过TPM限制
                  如果任何一项检查失败,请求将被拒绝并返回429 Too Many Requests状态码。
                    {"error":{"code":429,"message":"user: lgy has exceeded RPM: 3"}}

                    AI Engine Runtime
                    AI Engine Runtime 是统一的管理层,作为推理容器的 sidecar运行,提供了指标标准化、模型下载和本地模型管理功能。
                    控制平面集成 API:确保控制平面和推理 Pod 之间通信。这允许 LoRA 适配器控制器、自动扩缩容器和冷启动管理器等组件与推理容器动态交互。
                    抽象特定供应商的推理引擎:为支持多种推理引擎,包括最流行的引擎。然而,不同引擎的 API 各不相同。抽象了关键操作,如模型加载/卸载、适配器配置和性能监控,使新的推理后端能够以最小的摩擦集成。
                    可观察性:统一的监控接口,允许一致的性能跟踪和故障排除。
                              - name: aibrix-runtime
                                image: docker.1ms.run/aibrix/runtime:v0.2.1
                                command:
                                  - aibrix_runtime
                                  - --port
                                  - "8080"
                                env:
                                  - name: INFERENCE_ENGINE
                                    value: vllm # 指定推理引擎交互(目前主要支持 vLLM)
                                  - name: INFERENCE_ENGINE_ENDPOINT
                                    value: http://localhost:8000 # 指定推理引擎的 API 端点
                                ports:
                                  - containerPort: 8080
                                    protocol: TCP

                      Multi-Node Inference
                      使用Ray作为底层分布式计算框架,允许将大型模型的推理工作负载分散到多个GPU节点上。
                        apiVersion: orchestration.aibrix.ai/v1alpha1
                        kind: RayClusterFleet
                        metadata:
                          name: qwen-coder-7b-instruct
                          labels:
                            app.kubernetes.io/name: aibrix
                            app.kubernetes.io/managed-by: kustomize
                        spec:
                          replicas: 1
                          selector:
                            matchLabels:
                              model.aibrix.ai/name: qwen-coder-7b-instruct
                          strategy:
                            type: RollingUpdate
                            rollingUpdate:
                              maxSurge: 25%
                              maxUnavailable: 25%
                          template:
                            metadata:
                              labels:
                                model.aibrix.ai/name: qwen-coder-7b-instruct
                              annotations:
                                ray.io/overwrite-container-cmd: "true"
                            spec:
                              rayVersion: "2.10.0"
                              headGroupSpec:
                                rayStartParams:
                                  dashboard-host: "0.0.0.0"
                                template:
                                  metadata:
                                    labels:
                                      model.aibrix.ai/name: qwen-coder-7b-instruct
                                  spec:
                                    containers:
                                      - name: ray-head
                                        image: vllm/vllm-openai:v0.7.1
                                        command: ["/bin/bash""-c"]
                                        args:
                                          - >
                                            ulimit -n 65536 &&
                                            echo "[INFO] Starting Ray head node..." &&
                                            eval "$KUBERAY_GEN_RAY_START_CMD" &
                                            echo "[INFO] Waiting for Ray dashboard to be ready..." &&
                                            until curl --max-time 5 --fail http://127.0.0.1:8265 > dev/null 2>&1; do
                                              echo "[WAITING] $(date -u +'%Y-%m-%dT%H:%M:%SZ') - Ray dashboard not ready yet...";
                                              sleep 2;
                                            done &&
                                            echo "[SUCCESS] Ray dashboard is available!" &&
                                            vllm serve Qwen/Qwen2.5-Coder-7B-Instruct \
                                              --served-model-name qwen-coder-7b-instruct \
                                              --tensor-parallel-size 2 \
                                              --distributed-executor-backend ray \
                                              --host 0.0.0.0 \
                                              --port 8000 \
                                              --dtype half
                                        ports:
                                          - containerPort: 6379
                                            name: gcs-server
                                          - containerPort: 8265
                                            name: dashboard
                                          - containerPort: 10001
                                            name: client
                                          - containerPort: 8000
                                            name: service
                                        resources:
                                          limits:
                                            cpu: "4"
                                            nvidia.com/nvidia-rtx-3090-24GB: 1
                                          requests:
                                            cpu: "4"
                                            nvidia.com/nvidia-rtx-3090-24GB: 1
                                      - name: aibrix-runtime
                                        image: docker.1ms.run/aibrix/runtime:v0.2.1
                                        command:
                                          - aibrix_runtime
                                          - --port
                                          - "8080"
                                        env:
                                          - name: INFERENCE_ENGINE
                                            value: vllm
                                          - name: INFERENCE_ENGINE_ENDPOINT
                                            value: http://localhost:8000
                                          - name: PYTORCH_CUDA_ALLOC_CONF
                                            value: "expandable_segments:True"
                                        ports:
                                          - containerPort: 8080
                                            protocol: TCP
                                        livenessProbe:
                                          httpGet:
                                            path: healthz
                                            port: 8080
                                          initialDelaySeconds: 3
                                          periodSeconds: 2
                                        readinessProbe:
                                          httpGet:
                                            path: ready
                                            port: 8080
                                          initialDelaySeconds: 5
                                          periodSeconds: 10
                                        resources:
                                          limits:
                                            cpu: "1"
                                          requests:
                                            cpu: "1"
                              workerGroupSpecs:
                                - groupName: small-group
                                  replicas: 1
                                  minReplicas: 1
                                  maxReplicas: 5
                                  rayStartParams: {}
                                  template:
                                    metadata:
                                      labels:
                                        model.aibrix.ai/name: qwen-coder-7b-instruct
                                    spec:
                                      containers:
                                        - name: ray-worker
                                          image: docker.1ms.run/vllm/vllm-openai:v0.7.1
                                          env:
                                            - name: MY_POD_IP
                                              valueFrom:
                                                fieldRef:
                                                  fieldPath: status.podIP
                                          command: [ "/bin/bash""-c" ]
                                          args:
                                            - >
                                              ulimit -n 65536 &&
                                              eval "$KUBERAY_GEN_RAY_START_CMD --node-ip-address=$MY_POD_IP" &&
                                              tail -f dev/null
                                          lifecycle:
                                            preStop:
                                              exec:
                                                command: [ "/bin/sh""-c""ray stop" ]
                                          resources:
                                            limits:
                                              cpu: "4"
                                              nvidia.com/nvidia-rtx-3090-24GB: 1
                                            requests:
                                              cpu: "4"
                                              nvidia.com/nvidia-rtx-3090-24GB: 1
                        ---
                        apiVersion: v1
                        kind: Service
                        metadata:
                          name: qwen-coder-7b-instruct
                          labels:
                            model.aibrix.ai/name: qwen-coder-7b-instruct
                            prometheus-discovery: "true"
                          annotations:
                            prometheus.io/scrape: "true"
                            prometheus.io/port: "8080"
                        spec:
                          selector:
                            model.aibrix.ai/name: qwen-coder-7b-instruct
                          ports:
                            - name: serve
                              port: 8000
                              protocol: TCP
                              targetPort: 8000
                            - name: http
                              port: 8080
                              protocol: TCP
                              targetPort: 8080
                        ---
                        apiVersion: gateway.networking.k8s.io/v1
                        kind: HTTPRoute
                        metadata:
                          name: qwen-coder-7b-instruct-router
                          namespace: aibrix-system
                        spec:
                          parentRefs:
                            - group: gateway.networking.k8s.io
                              kind: Gateway
                              name: aibrix-eg
                              namespace: aibrix-system
                          rules:
                            - backendRefs:
                                - group: ""
                                  kind: Service
                                  name: qwen-coder-7b-instruct
                                  namespace: default
                                  port: 8000
                                  weight: 1
                              matches:
                                - headers:
                                    - name: model
                                      type: Exact
                                      value: qwen-coder-7b-instruct
                                  path:
                                    type: PathPrefix
                                    value: /v1/completions
                                - headers:
                                    - name: model
                                      type: Exact
                                      value: qwen-coder-7b-instruct
                                  path:
                                    type: PathPrefix
                                    value: /v1/chat/completions
                              timeouts:
                                request: 120s

                        可选组建
                        Lora Dynamic Loading

                        LoRA动态加载允许在已部署的基础模型上动态加载和卸载LoRA适配器。LoRA(Low-Rank Adaptation)是一种高效的大型语言模型(LLM)微调技术,它通过在冻结的预训练模型上添加小型、可训练的适配器模块来实现模型的定制化,而不需要重新训练整个模型。
                        作用
                        • 提高模型密度和降低推理成本:通过在共享基础模型上动态加载不同的LoRA适配器,可以更高效地部署多个模型变体。
                        • 优化GPU内存使用:多个LoRA适配器可以共享同一个基础模型,减少了重复加载基础模型的需要,从而节省GPU内存。
                        • 减少冷启动时间:由于只需加载轻量级的LoRA适配器而不是整个模型,启动新模型变体的时间大大缩短。
                        • 提高可扩展性:使系统能够支持更多的模型变体,适合高密度部署和成本效益高的生产环境推理。

                        实现机制
                        • ModelAdapter控制器:负责管理LoRA适配器的生命周期,包括调度、加载和服务发现。
                        • 服务发现:使用Kubernetes Service作为每个LoRA模型的抽象层,允许单个Pod上的多个LoRA适配器属于多个服务。
                        • vLLM引擎集成:需要vLLM引擎支持LoRA元数据的可见性、动态加载和卸载、远程注册表支持以及可观察性。(现阶段局限性)
                        示例
                          # 基础模型
                          apiVersion: apps/v1
                          kind: Deployment
                          metadata:
                            labels:
                              model.aibrix.ai/name: qwen-coder-1-5b-instruct # 需和svc保持一致
                              model.aibrix.ai/port: "8000"
                              adapter.model.aibrix.ai/enabled: "true" # 启用适配器功能
                            name: qwen-coder-1-5b-instruct
                          spec:
                            replicas: 1
                            selector:
                              matchLabels:
                                model.aibrix.ai/name: qwen-coder-1-5b-instruct
                            template:
                              metadata:
                                labels:
                                  model.aibrix.ai/name: qwen-coder-1-5b-instruct
                              spec:
                                volumes:
                                - name: models
                                  hostPath:
                                    path: /root/lgy/models
                                    type: Directory
                                containers:
                                  - command:
                                      - python3
                                      - -m
                                      - vllm.entrypoints.openai.api_server
                                      - --host
                                      - "0.0.0.0"
                                      - --port
                                      - "8000"
                                      - --uvicorn-log-level
                                      - warning
                                      - --model
                                      - /models/DeepSeek-R1-Distill-Llama-8B
                                      - --served-model-name
                                      - qwen-coder-1-5b-instruct # 需和svc一致
                                      - --enable-lora # 启用LoRA功能
                                    image: docker.1ms.run/vllm/vllm-openai:v0.7.1
                                    imagePullPolicy: Always
                                    name: vllm-openai
                                    env:
                                      - name: VLLM_ALLOW_RUNTIME_LORA_UPDATING # 允许运行时更新LoRA
                                        value: "True"
                                    ports:
                                      - containerPort: 8000
                                        protocol: TCP
                                    resources:
                                      limits:
                                        nvidia.com/nvidia-rtx-3090-24GB: "1"
                                      requests:
                                        nvidia.com/nvidia-rtx-3090-24GB: "1"
                                    volumeMounts:
                                    - name: models
                                      mountPath: /models
                                  - name: aibrix-runtime
                                    image: docker.1ms.run/aibrix/runtime:v0.2.1
                                    command:
                                      - aibrix_runtime
                                      - --port
                                      - "8080"
                                    env:
                                      - name: INFERENCE_ENGINE
                                        value: vllm
                                      - name: INFERENCE_ENGINE_ENDPOINT
                                        value: http://localhost:8000
                                    volumeMounts:
                                    - name: models
                                      mountPath: /models
                                    ports:
                                      - containerPort: 8080
                                        protocol: TCP
                                    livenessProbe:
                                      httpGet:
                                        path: /healthz
                                        port: 8080
                                      initialDelaySeconds: 3
                                      periodSeconds: 2
                                    readinessProbe:
                                      httpGet:
                                        path: /ready
                                        port: 8080
                                      initialDelaySeconds: 5
                                      periodSeconds: 10
                          ---
                          apiVersion: v1
                          kind: Service
                          metadata:
                            labels:
                              model.aibrix.ai/name: qwen-coder-1-5b-instruct
                              prometheus-discovery: "true"
                            annotations:
                              prometheus.io/scrape: "true"
                              prometheus.io/port: "8080"
                            name: qwen-coder-1-5b-instruct
                            namespace: default
                          spec:
                            ports:
                              - name: serve
                                port: 8000
                                protocol: TCP
                                targetPort: 8000
                              - name: http
                                port: 8080
                                protocol: TCP
                                targetPort: 8080
                            selector:
                              model.aibrix.ai/name: qwen-coder-1-5b-instruct
                            type: ClusterIP
                          ---
                          # lora适配器
                          apiVersion: model.aibrix.ai/v1alpha1
                          kind: ModelAdapter
                          metadata:
                            name: qwen-code-lora # lora模型的服务名称
                            labels:
                              model.aibrix.ai/name: "qwen-code-lora"
                              model.aibrix.ai/port: "8000"
                          spec:
                            baseModel: qwen-coder-1-5b-instruct # 部署的基础模型名称
                            podSelector:
                              matchLabels:
                                model.aibrix.ai/name: qwen-coder-1-5b-instruct # 与基础模型的标签匹配
                            artifactURL: huggingface://ai-blond/Qwen-Qwen2.5-Coder-1.5B-Instruct-lora # lora模型路径,可以从hf、S3、hostPath加载
                            schedulerName: default

                          • 部署一个基础模型(如LLAMA、Qwen等),这个基础模型运行在独立的Pod中。
                          • 基础模型Pod必须启用LoRA支持:容器需要配置特定的参数来支持LoRA,包括--enable-lora参数和VLLM_ALLOW_RUNTIME_LORA_UPDATING=True环境变量。
                          • 创建ModelAdapter资源:创建ModelAdapter自定义资源,指定LoRA模型的位置和要应用到哪个基础模型上。
                          • 控制器加载LoRA到基础模型Pod:ModelAdapter控制器会找到匹配的基础模型Pod,然后通过API调用将LoRA模型加载到该Pod中。

                          Autoscaling
                          PodAutoscaler自定义资源定义了自动扩缩容的行为,包括以下关键字段:
                          • spec.scaleTargetRef: 要扩缩容的目标资源引用(如Deployment、StatefulSet)
                          • spec.minReplicas: 最小副本数(可选,默认为1)
                          • spec.maxReplicas: 最大副本数
                          • spec.metricsSources: 要监控的指标源列表
                          • spec.scalingStrategy: 使用的扩缩容策略(HPA、KPA、APA)

                          HPA
                          HPA策略利用Kubernetes原生的Horizontal Pod Autoscaler。当选择此策略时,PodAutoscaler控制器会基于PodAutoscaler规范创建和管理一个Kubernetes HPA资源。
                            apiVersion: autoscaling.aibrix.ai/v1alpha1
                            kind: PodAutoscaler
                            metadata:
                              name: deepseek-r1-distill-llama-8b-hpa
                              namespace: default
                              labels:
                                app.kubernetes.io/name: aibrix
                                app.kubernetes.io/managed-by: kustomize
                            spec:
                              scalingStrategy: HPA
                              minReplicas: 1
                              maxReplicas: 10
                              metricsSources:
                                - metricSourceType: pod
                                  protocolType: http
                                  port: '8000'
                                  path: /metrics
                                  targetMetric: gpu_cache_usage_perc
                                  targetValue: '50'
                              scaleTargetRef:
                                apiVersion: apps/v1
                                kind: Deployment
                                name: deepseek-r1-distill-llama-8b

                            KPA
                            KPA策略实现了一个受Knative Pod Autoscaler启发的自动扩缩容算法。它具有"稳定"和"紧急"两种模式,以处理不同的流量模式。
                            主要特点:
                            • 稳定模式:在正常情况下,使用60秒的稳定窗口计算平均指标值,平稳地调整副本数
                            • 紧急模式:当指标值超过目标值的2倍(可配置)时,切换到紧急模式,使用10秒的短窗口快速响应流量峰值。
                            • 扩容保护:防止在紧急模式期间快速缩容
                            • 延迟缩容:在负载减少后,维持较高的副本数一段时间(默认30分钟),防止频繁的扩缩容操作。
                              apiVersion: autoscaling.aibrix.ai/v1alpha1
                              kind: PodAutoscaler
                              metadata:
                                name: deepseek-r1-distill-llama-8b-kpa
                                namespace: default
                                labels:
                                  app.kubernetes.io/name: aibrix
                                  app.kubernetes.io/managed-by: kustomize
                                annotations:  
                                  kpa.autoscaling.aibrix.ai/target-burst-capacity: "2.0"  
                                  kpa.autoscaling.aibrix.ai/activation-scale: "2"  
                                  kpa.autoscaling.aibrix.ai/panic-threshold: "2.0"  
                                  kpa.autoscaling.aibrix.ai/stable-window: "60s"  
                                  kpa.autoscaling.aibrix.ai/panic-window: "10s"  
                                  kpa.autoscaling.aibrix.ai/scale-down-delay: "30m"
                              spec:
                                scalingStrategy: KPA
                                minReplicas: 1
                                maxReplicas: 8
                                metricsSources:
                                  - metricSourceType: pod
                                    protocolType: http
                                    port: '8000'
                                    path: metrics
                                    targetMetric: gpu_cache_usage_perc
                                    targetValue: '0.5'
                                scaleTargetRef:
                                  apiVersion: apps/v1
                                  kind: Deployment
                                  name: deepseek-r1-distill-llama-8b

                              APA
                              APA策略实现了一个自定义的自动扩缩容算法,专注于维持稳定的扩缩容,具有可配置的容忍度。
                              主要特点:
                              • 波动容忍度:可配置的扩容和缩容阈值
                              • 扩缩容速率:对扩缩容速率的限制
                              • 指标窗口:使用时间窗口进行指标平均
                                apiVersion: autoscaling.aibrix.ai/v1alpha1
                                kind: PodAutoscaler
                                metadata:
                                  name: deepseek-r1-distill-llama-8b-apa
                                  namespace: default
                                  labels:
                                    app.kubernetes.io/name: aibrix
                                    app.kubernetes.io/managed-by: kustomize
                                  annotations:
                                    autoscaling.aibrix.ai/up-fluctuation-tolerance: '0.1' # 上波动容忍度:扩容前的阈值(例如,目标值上方10%)
                                    autoscaling.aibrix.ai/down-fluctuation-tolerance: '0.2' # 下波动容忍度:缩容前的阈值(例如,目标值下方20%)
                                    apa.autoscaling.aibrix.ai/window: 30s # 计算指标的时间窗口
                                spec:
                                  scalingStrategy: APA
                                  minReplicas: 1
                                  maxReplicas: 8
                                  metricsSources:
                                    - metricSourceType: pod
                                      protocolType: http
                                      port: '8000'
                                      path: metrics
                                      targetMetric: gpu_cache_usage_perc
                                      targetValue: '0.5'
                                  scaleTargetRef:
                                    apiVersion: apps/v1
                                    kind: Deployment
                                    name: deepseek-r1-distill-llama-8b

                                分布式KV缓存
                                目前分布式KV缓存仅支持FlashAttention。0.2版本开始支持,目前使用问题较多,扔在持续优化中
                                部署模式
                                • 集中式模式:使用 Vineyard 作为 KV 缓存实现,etcd 作为元数据存储。
                                • 分布式模式:计划中但尚未完全实现,旨在用于更具可扩展性的场景。
                                  apiVersion: orchestration.aibrix.ai/v1alpha1  
                                  kind: KVCache  
                                  metadata:  
                                    name: example-kvcache  
                                    annotations:  
                                      kvcache.orchestration.aibrix.ai/node-affinity-gpu-type: "A100"  
                                      kvcache.orchestration.aibrix.ai/pod-anti-affinity: "true"  
                                      # kvcache.orchestration.aibrix.ai/mode:缓存模式(集中式/分布式)
                                      # kvcache.orchestration.aibrix.ai/node-affinity-key:节点亲和性标签键
                                      # kvcache.orchestration.aibrix.ai/node-affinity-gpu-type:节点亲和性的 GPU 类型,异构GPU使用
                                      # kvcache.orchestration.aibrix.ai/pod-affinity-workload:必须与metadata.name下面的推理服务部署相匹配
                                      # kvcache.orchestration.aibrix.ai/pod-anti-affinity:启用 Pod 反亲和性
                                  spec:
                                    mode: centralized
                                    replicas: 3  
                                    etcdReplicas: 1  
                                    metadata:  
                                      etcd:  
                                        image: "quay.io/coreos/etcd:v3.5.0"  
                                        storage:  
                                          size: "10Gi"  
                                    cacheSpec:  
                                      image: "docker.1ms.run/aibrix/kvcache:20241120"  
                                      resources:
                                        requests:
                                          cpu: "2000m"
                                          memory: "4Gi"
                                        limits:
                                          cpu: "2000m"
                                          memory: "4Gi"
                                    service:  
                                      type: ClusterIP  
                                      ports:
                                        - name: service
                                          port: 9600
                                          targetPort: 9600
                                          protocol: TCP
                                    NAME                                            READY   STATUS              RESTARTS   AGE
                                    deepseek-coder-7b-instruct-85664648c7-xgp9h     1/1     Running             0          2m41s
                                    deepseek-coder-7b-kvcache-7d5896cd89-dcfzt      1/1     Running             0          2m31s
                                    deepseek-coder-7b-kvcache-etcd-0                1/1     Running             0          2m31s
                                    分布式 KV 缓存指标可以在 AIBrix 引擎仪表板中查看。以下是分布式 KV 缓存仪表板面板的示例:
                                    总结
                                    优点
                                    • 原生支持 vLLM:AIBrix 对 vLLM 有很好的支持,包括配置示例和集成功能。
                                    • 模块化设计:AIBrix 采用模块化设计,允许您根据需求选择性地部署组件,如自动扩缩容、LoRA 动态加载等。
                                    • 高密度 LoRA 管理:支持在同一基础模型上动态加载和卸载多个 LoRA 适配器,提高资源利用率。
                                    • 灵活的自动扩缩容:提供多种扩缩容策略(HPA、KPA、APA),适应不同的工作负载模式。
                                    • 分布式推理支持:通过 Ray 集群支持跨多个节点的分布式推理,适合部署大型模型。
                                    • 统一的 AI Runtime:提供统一的接口来管理不同的推理引擎,标准化指标,支持模型的动态加载。
                                    • 异构 GPU 支持:支持在不同类型的 GPU 上部署相同的模型,解决 GPU 可用性和成本优化挑战。
                                    缺点
                                    • SGLang和其他推理框架支持有限:从代码库中没有看到对 SGLang 的明确支持。AIBrix 主要针对 vLLM 进行了优化,对于 SGLang 可能需要额外的配置或自定义集成。
                                    • 仍在开发中:AIBrix 仍处于开发阶段(当前版本 0.2.1),某些功能可能不完善或存在稳定性问题。
                                    • 分布式 KV Cache 实现不完整:分布式模式尚未完全实现,目前主要支持集中式模式。
                                    • 文档和示例可能不足:对于某些高级功能,可能缺乏详细的文档和使用示例,增加了学习和使用的难度。
                                    • 依赖 Kubernetes 特定功能:深度集成 Kubernetes,可能对 Kubernetes 版本或特定功能有依赖,增加了部署的复杂性。

                                    文章转载自AI云枢,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

                                    评论