AI 推理服务的多模型共存:同集群部署不同版本的策略
AI 推理服务的多模型共存同集群部署不同版本的策略一、集群里同时跑了 vLLM 0.4、TGI 1.3、TensorRT-LLM 三个版本资源分配一团糟AI 推理服务的版本管理比传统微服务复杂得多。传统微服务部署的是同一个 Docker 镜像的不同版本——v1、v2、v3管理起来是标准的 K8s Deployment 滚动更新。AI 推理服务不一样——不同模型GPT-4、Llama-3、Claude、不同推理引擎vLLM、TGI、TensorRT-LLM、不同量化版本FP16、INT8、INT4可能同时运行在同一个集群中。问题不在于能不能共存——K8s 天然支持多 Deployment。问题在于资源怎么分配。AI 推理是 GPU 密集型负载GPU 是不可压缩资源——同一张 GPU 卡不能同时被两个推理进程使用除非用 MIG 切分。所以多模型共存的核心挑战是 GPU 资源的调度和隔离。策略的三个层次水平切分不同模型跑在不同 GPU 上、垂直切分同一 GPU 上用 MIG 隔离不同模型、调度混合GPU 和 CPU 混合部署轻量推理用 CPU 兜底。二、底层机制与原理剖析多模型共存的三层策略水平切分不同 GPU最简单的策略。每个模型独占一张 GPU 卡。优点隔离性最好一个模型出问题不影响其他模型、推理性能不受干扰。缺点资源利用率低——Llama-3-70B 占 70GB 显存剩下 10GB 白白浪费。MIG 垂直切分Mult-Instance GPUA100/H100 支持 MIG多实例 GPU把一张 GPU 显存切分成多个独立实例。例如一张 80GB 的 A100 切成 5GB 10GB 30GB 35GB 四个实例。每个实例有独立的内存和缓存互不干扰。优点显存利用率高。缺点只支持特定 GPU 型号A100、A30、H100、切分后的实例互相隔离无法共享计算力。Time-Slicing时间片共享没有真正的显存隔离多个推理进程轮流占用 GPU 计算单元。优点实现简单、不依赖 GPU 型号。缺点切换开销每次切换需要重新加载模型权重、显存竞争可能导致 OOM。三、生产级代码实现# k8s/vllm-llama3-70b.yaml # vLLM Llama-3-70B 部署配置 # 设计要点 # 1. 独占 GPU不与其他模型共享——稳定优先 # 2. nodeSelector 指定 GPU 型号——不同模型对 GPU 架构有要求 # 3. 资源 Requests Limits —— GPU 资源保证性 --- apiVersion: apps/v1 kind: Deployment metadata: name: vllm-llama3-70b namespace: ai-inference labels: app: vllm-llama3-70b model: llama-3-70b engine: vllm version: v0.4.2 annotations: # 标记模型信息供路由发现 model.workbuddy.tech/name: llama-3-70b model.workbuddy.tech/engine: vllm model.workbuddy.tech/quantization: fp16 prometheus.io/scrape: true spec: replicas: 1 # GPU 推理通常 1 副本多副本需要多张 GPU selector: matchLabels: app: vllm-llama3-70b template: metadata: labels: app: vllm-llama3-70b spec: # GPU 节点亲和性 nodeSelector: nvidia.com/gpu.product: NVIDIA-A100-SXM4-80GB tolerations: - key: nvidia.com/gpu operator: Exists effect: NoSchedule containers: - name: vllm image: vllm/vllm-openai:v0.4.2 args: - --model - meta-llama/Meta-Llama-3-70B-Instruct - --host - 0.0.0.0 - --port - 8000 - --tensor-parallel-size - 1 # 单 GPUTP1如果跨 GPU 推理设为 2 - --gpu-memory-utilization - 0.90 # 留 10% 给 CUDA context - --max-model-len - 8192 # 上下文长度 env: - name: CUDA_VISIBLE_DEVICES value: 0 - name: NVIDIA_VISIBLE_DEVICES value: 0 ports: - containerPort: 8000 name: http resources: requests: nvidia.com/gpu: 1 memory: 80Gi # 模型 KV Cache 的显存需求 cpu: 8 limits: nvidia.com/gpu: 1 memory: 80Gi cpu: 16 readinessProbe: httpGet: path: /health port: 8000 initialDelaySeconds: 60 # 模型加载需要时间 periodSeconds: 10 livenessProbe: httpGet: path: /health port: 8000 initialDelaySeconds: 120 periodSeconds: 30 volumeMounts: - name: model-storage mountPath: /models readOnly: true volumes: - name: model-storage persistentVolumeClaim: claimName: pvc-llama-models# k8s/mig-tgi-whisper.yaml # 使用 MIG 后的 TGI Whisper 部署 # MIG 实例通过 nvidia.com/mig-3g.20gb 这种扩展资源申请 --- apiVersion: apps/v1 kind: Deployment metadata: name: tgi-whisper-large namespace: ai-inference labels: app: tgi-whisper-large model: whisper-large-v3 engine: tgi spec: replicas: 1 selector: matchLabels: app: tgi-whisper-large template: spec: nodeSelector: nvidia.com/gpu.product: NVIDIA-A100-SXM4-80GB containers: - name: tgi image: ghcr.io/huggingface/text-generation-inference:1.3 args: - --model-id - openai/whisper-large-v3 - --num-shard - 1 - --max-total-tokens - 4096 resources: requests: nvidia.com/mig-3g.20gb: 1 # 申请 20GB MIG 实例 memory: 24Gi limits: nvidia.com/mig-3g.20gb: 1 memory: 24Gi# model_router.py 多模型路由器根据请求中的 model 参数将请求路由到正确的推理引擎实例 设计要点 1. 基于 K8s Service label selector 实现服务发现 2. 支持模型→引擎→实例的映射 3. 熔断如果某个模型实例全部不可用返回 503 而非无限等待 import os import logging import threading from typing import Dict, Optional, List from dataclasses import dataclass, field from urllib.request import Request, urlopen from urllib.error import URLError import json logging.basicConfig(levellogging.INFO) logger logging.getLogger(__name__) dataclass class ModelEndpoint: 推理引擎实例的端点信息 url: str model: str engine: str version: str weight: int 1 # 流量权重 priority: int 0 # 优先级数字越小越高 healthy: bool True # 健康状态 # 延迟统计 avg_latency_ms: float 0 error_count: int 0 class ModelRouter: 模型路由器 为什么自己实现而不是用 Istio / Envoy 模型路由需求的特殊性 - 需要按 model name 路由不是 Host header - 需要感知模型列表的动态变化新模型加入、旧模型下线 - 有些模型有多个实例负载均衡有些只有一个主备 def __init__(self, k8s_namespace: str ai-inference): self.namespace k8s_namespace self._endpoints: Dict[str, List[ModelEndpoint]] {} self._lock threading.RLock() # 静态模型映射K8s Service discovery 的简化版 # 生产环境应从 K8s API 动态发现 self._static_endpoints { llama-3-70b: [ ModelEndpoint( urlhttp://vllm-llama3-70b.ai-inference.svc:8000, modelllama-3-70b, enginevllm, version0.4.2, priority0, ), ], gpt-4-mini: [ ModelEndpoint( urlhttp://vllm-gpt4-mini-mig.ai-inference.svc:8000, modelgpt-4-mini, enginevllm, version0.4.2, priority0, ), ], qwen-72b: [ ModelEndpoint( urlhttp://trt-qwen-72b.ai-inference.svc:8000, modelqwen-72b, enginetensorrt-llm, version0.8.0, priority1, ), ], whisper-large: [ ModelEndpoint( urlhttp://tgi-whisper.ai-inference.svc:8000, modelwhisper-large-v3, enginetgi, version1.3, priority0, ), ], } self._endpoints dict(self._static_endpoints) # 启动后台健康检查 self._start_health_checks() def resolve(self, model_name: str) - Optional[ModelEndpoint]: 为指定模型解析一个可用的端点 策略 1. 精确匹配 model name 2. 从可用实例中选择优先级最高 健康的实例 3. 如果有多个同等优先级实例按权重随机选择 with self._lock: endpoints self._endpoints.get(model_name, []) # 过滤健康实例 healthy [ep for ep in endpoints if ep.healthy] if not healthy: logger.warning(No healthy endpoint for model: %s, model_name) return None # 按优先级排序 healthy.sort(keylambda ep: ep.priority) # 选择最高优先级的实例 # 如果同一优先级有多个按权重选择——简化实现直接轮询 top_priority healthy[0].priority candidates [ep for ep in healthy if ep.priority top_priority] # 简单的加权随机生产环境用更精细的算法 import random return random.choices( candidates, weights[ep.weight for ep in candidates], k1, )[0] def mark_unhealthy(self, model_name: str, endpoint_url: str): 标记某个端点为不健康在请求失败后调用 with self._lock: endpoints self._endpoints.get(model_name, []) for ep in endpoints: if ep.url endpoint_url: ep.healthy False ep.error_count 1 logger.warning(Marked %s unhealthy: %s, model_name, endpoint_url) def _start_health_checks(self): 启动后台健康检查线程 self._health_thread threading.Thread( targetself._health_check_loop, daemonTrue ) self._health_thread.start() def _health_check_loop(self): 周期性的健康检查——恢复标记为 unhealthy 的端点 import time while True: time.sleep(15) # 每 15 秒检查一次 with self._lock: for model, endpoints in self._endpoints.items(): for ep in endpoints: if not ep.healthy: if self._check_endpoint(ep): ep.healthy True ep.error_count 0 logger.info(Recovered %s/%s: %s, model, ep.engine, ep.url) staticmethod def _check_endpoint(ep: ModelEndpoint) - bool: 检查单个端点是否健康 try: req Request(f{ep.url}/health, methodGET) with urlopen(req, timeout5) as resp: return resp.status 200 except Exception: return False # --------------------------------------------------------------------------- # 使用示例在 API Gateway 中集成路由器 # --------------------------------------------------------------------------- if __name__ __main__: router ModelRouter() # 模拟请求用户指定了模型 requests [ {model: llama-3-70b, prompt: Hello}, {model: qwen-72b, prompt: 你好}, {model: nonexistent-model, prompt: test}, # 不存在的模型 ] for req in requests: endpoint router.resolve(req[model]) if endpoint: print(f[{req[model]}] → {endpoint.url} ({endpoint.engine})) else: print(f[{req[model]}] → 无可用实例 (503))四、边界分析与架构权衡MIG 的限制MIG 切分后每个实例的显存和缓存是隔离的——如果一个大模型需要 50GB 显存但 MIG 实例只有 30GB它就跑不了MIG 实例间的通信效率不如统一显存——跨 MIG 实例的 tensor 传输需要走 PCIe不是所有 GPU 都支持 MIG——A100、A30、H100 支持V100、T4 不支持多模型共存的内存风险K8s 的requests: nvidia.com/gpu: 1只是保证容器能访问 GPU——不保证显存分配。两个容器各请求 1 个 GPU 但运行在同一张卡上可能同时 OOM解决方案使用 GPU Operator 的 Time-Slicing 配置 显存限制--gpu-memory-utilization生产环境建议核心模型高流量、高优先级独占 GPU保证性能稳定非核心模型MIG 或 Time-Slicing 共享 GPU轻量模型如 embedding、分类器CPU 推理ONNX Runtime节省 GPU 资源制定 GPU配额制度每个团队/业务线有 GPU 时间的配额上限五、总结AI 推理服务的多模型共存核心矛盾是 GPU 资源如何分配。水平切分简单但利用率低MIG 垂直切分利用率高但灵活度受限Time-Slicing 灵活但隔离性差。建议的核心模型独占 GPU稳非核心模型共享 GPU省轻量模型用 CPU 推理更省。路由器Model Router是这一切的入口——让用户在请求时指定模型名路由层负责将请求转发到正确的推理实例用户不需要知道底层是哪个引擎、哪个 GPU 在跑。

相关新闻

【软件工程】板块总结 + 下期预告(面向对象技术)

【软件工程】板块总结 + 下期预告(面向对象技术)

适合读者:软考中级备考同学 阅读时间:4分钟 内容:软件工程板块知识体系回顾、核心对比表、易错点汇总、下期预告一、板块内容概览 “软件工程”板块共完成 24篇 文章,覆盖以下知识模块:知识模块篇数核心内容软件工程基…

2026/7/22 15:30:43阅读更多 →
Agent 服务网格化:像治理微服务一样治理智能体集群

Agent 服务网格化:像治理微服务一样治理智能体集群

Agent 服务网格化:像治理微服务一样治理智能体集群 一、当你线上跑了 200 个 Agent 实例,却没有一个统一的流量治理层 Agent 上生产之后,最容易被忽视的一层是"路由层"。大多数团队的做法是:一个 Agent 对应一个 Pod&am…

2026/7/22 15:30:43阅读更多 →
AI 原生组织是什么 —— 人 + Agent 的超级协作如何落地

AI 原生组织是什么 —— 人 + Agent 的超级协作如何落地

AI 原生组织是什么 —— 人 Agent 的超级协作如何落地 引言:先回答一个问题,谁是数字员工 三年前谈企业 AI,大家还在问"大模型能做什么"。今天谈企业 AI,问题变了,变成"每个员工要不要带几个 Agent 工…

2026/7/22 15:28:42阅读更多 →
react-native-sketch-canvas进阶教程:实现路径序列化与多设备同步

react-native-sketch-canvas进阶教程:实现路径序列化与多设备同步

react-native-sketch-canvas进阶教程:实现路径序列化与多设备同步 【免费下载链接】react-native-sketch-canvas A React Native component for drawing by touching on both iOS and Android. 项目地址: https://gitcode.com/gh_mirrors/re/react-native-sketch-…

2026/7/22 16:28:53阅读更多 →
HuProt™ 人类蛋白组芯片支持小分子靶标筛选与机制研究

HuProt™ 人类蛋白组芯片支持小分子靶标筛选与机制研究

在现代药物研发体系中,小分子化合物作用机制解析是推动药物发现和功能研究的重要环节。对于已经发现具有生物活性的化合物,进一步明确其直接结合蛋白,有助于建立更加完整的作用机制模型。因此,小分子药物靶点筛选、药物靶点鉴定以…

2026/7/22 16:28:53阅读更多 →
Appium终极指南:从零开始掌握跨平台自动化测试核心技术

Appium终极指南:从零开始掌握跨平台自动化测试核心技术

Appium终极指南:从零开始掌握跨平台自动化测试核心技术 【免费下载链接】appium Cross-platform automation framework for all kinds of apps, built on top of the W3C WebDriver protocol 项目地址: https://gitcode.com/GitHub_Trending/ap/appium 想要快…

2026/7/22 16:28:53阅读更多 →
绿盟LAS无实时日志排查

绿盟LAS无实时日志排查

查看日志源情况,可以看到当前已配置日志源并接入LAS(说明有日志接收对象,配置没问题)故障诊断抓包看下有没有实时的SYSLOG数据信息到设备上(有数据说明日志源发日志了)根据上面得到的信息,可以大…

2026/7/22 16:28:53阅读更多 →
AI时代小白程序员如何快速上手大模型,抢占前端开发制高点?

AI时代小白程序员如何快速上手大模型,抢占前端开发制高点?

本文深入探讨了AI在前端开发中的应用现状与未来趋势,分析AI能做与不能做的事务,指出AI冲击下前端岗位的变革与机遇。文章提出四条转型路径:成为AI原生开发者、向业务纵深发展、补齐后端/全栈能力、在垂直领域做到难以替代。同时,为…

2026/7/22 16:28:53阅读更多 →
7月急报:当功率预测误差超标,现货市场如何“用脚投票”?

7月急报:当功率预测误差超标,现货市场如何“用脚投票”?

老陈把7月前三周的交易结算单往桌上一拍,茶杯盖震得哐当响。他是云南某百万千瓦光伏电站的交易负责人,这个月光是偏差考核和现货低价段被迫出清的损失,加一块儿就吞掉了场站将近15%的预期利润。“天气预报明明报的是晴天,结果午后一场突发雷暴,实际出力比申报曲线低了将近…

2026/7/22 16:26:53阅读更多 →
Go语言静态资源打包方案对比与实践指南

Go语言静态资源打包方案对比与实践指南

1. 项目背景与核心需求在Go语言开发中,我们经常需要处理静态资源文件的打包问题。无论是Web应用的模板文件、前端资源,还是配置文件、证书等,都需要随程序一起分发。传统做法是将这些文件与编译后的二进制文件放在同一目录下,但这…

2026/7/22 0:53:59阅读更多 →
Go语言实现高性能LDAP认证服务的架构与实践

Go语言实现高性能LDAP认证服务的架构与实践

1. 项目背景与核心价值LDAP(轻量级目录访问协议)作为企业级身份认证的黄金标准,已经服务了超过80%的财富500强公司。我在金融科技领域实施统一认证体系时,发现传统Java方案存在启动慢、内存占用高等痛点。而Go语言凭借其协程并发模…

2026/7/22 0:53:59阅读更多 →
【AI面试官实战指南】:用ChatGPT模拟10类高频技术岗面试,3天提升应答精准度92%

【AI面试官实战指南】:用ChatGPT模拟10类高频技术岗面试,3天提升应答精准度92%

更多请点击: https://intelliparadigm.com 第一章:AI面试官实战指南的核心价值与适用场景 AI面试官并非替代人类HR的“黑箱工具”,而是以可解释、可审计、可迭代的方式,赋能招聘全链路的关键基础设施。其核心价值在于将主观经验沉…

2026/7/22 0:53:59阅读更多 →
中小企业小程序开发公司怎么选:预算、上手和售后避坑指南

中小企业小程序开发公司怎么选:预算、上手和售后避坑指南

中小企业做小程序,最常见的矛盾是预算有限,但又不希望功能太单薄;没有技术团队,但又希望后续能自己运营;想快速上线,又担心隐性收费和售后失联。选型时如果只看“低价套餐”或“案例数量”,很容…

2026/7/22 0:01:17阅读更多 →
GEO优化如何沉淀长期内容资产?广拓时代谈AI搜索时代的内容ROI

GEO优化如何沉淀长期内容资产?广拓时代谈AI搜索时代的内容ROI

企业做营销,最怕钱花完了,资产没有留下。 效果广告能带来一段时间的曝光,但预算停止后,流量往往也随之停止。短视频内容可能在几天内冲高,也可能很快沉下去。AI搜索时代,企业需要重新思考一个问题&#xff…

2026/7/22 0:01:17阅读更多 →
Agent 终态判定:何时该停止思考、给出最终回复

Agent 终态判定:何时该停止思考、给出最终回复

Agent 终态判定:何时该停止思考、给出最终回复 一、你的 Agent 在"再想想"的循环里绕了 12 轮,用户已经关窗口了 Agent 与人最大的区别是:人知道什么时候该停下来给答案,Agent 会一直"想"下去。你给 Agent 接…

2026/7/22 0:01:17阅读更多 →
YOLOv8推理性能优化:从1.2FPS到35FPS的全链路加速实践

YOLOv8推理性能优化:从1.2FPS到35FPS的全链路加速实践

如果你在部署 YOLOv8 时,发现推理速度只有可怜的 1-2 FPS,而别人的演示视频却能跑到 30 FPS 以上,那么问题很可能不在模型本身,而在于你的整个处理链路。很多开发者拿到一个训练好的 YOLOv8 模型后,会直接使用官方示例…

2026/7/21 22:53:50阅读更多 →
Coze与Dify对比指南:低代码AI应用开发从入门到实战

Coze与Dify对比指南:低代码AI应用开发从入门到实战

1. 从零到一:为什么你需要了解 Coze 和 Dify?如果你对 AI 应用开发感兴趣,但一看到“大模型”、“智能体”、“工作流”这些词就头疼,觉得门槛太高,那这篇文章就是为你准备的。很多开发者,包括我自己&#…

2026/7/21 18:53:30阅读更多 →
AI生图工具怎么选?2026年6月版实测对比

AI生图工具怎么选?2026年6月版实测对比

做自媒体的朋友应该都有体会:配图一直是个让人头疼的问题。2026年,AI生图工具已经非常成熟了,但工具太多反而不知道怎么选。以下是截至2026年6月我对主流AI生图工具的实测对比。Midjourney V8.1:速度之王2026年6月11日&#xff0c…

2026/7/21 18:53:30阅读更多 →