想象你开了一家“大模型私房菜馆”,厨房里只有一口昂贵的黄金灶(GPU)。每位客人都点不同的菜谱(AI 模型),每个菜谱都要求独占整口灶来做菜。结果一道小炒只用了灶台十分之一的火力,其余时间大火空烧,煤气费却一点不少。这正是很多 AI 团队的真实写照:模型推理请求很短,但每张 GPU 卡都被单个模型独占,算力利用率低得可怜。 GPU 池化与共享技术,就是把这口黄金灶变成后厨共享系统。要么按时间表让不同菜谱轮流上灶——这是“时间分片”;要么用隔板把灶切成几个小灶眼同时炒菜——这是“空间分区”。再配合隔离机制防止串味、混部策略避免抢火、监控看板盯住出菜节奏,最终让每一口 GPU 灶都不空转。本文用“共享厨房”的故事,拆解这套推理服务架构的关键设计。

岗位关联

对 AI 从业者而言,掌握 GPU 池化与共享技术,意味着能在大模型推理成本高企的今天,用更少的卡支撑更多的业务,是 AI 平台工程师和推理架构师的核心竞争力之一。

目录
  1. 可视化演示
  2. 背景与动机
  3. 池化核心原理
  4. 时间分片方案
  5. 空间分区方案
  6. 隔离机制设计
  7. 多模型混部
  8. 性能调优监控
  9. AI 应用场景
  10. Python 演示
  11. 常见误区
  12. 面试题

可视化演示

三步展示GPU池化与共享技术:时间分片/MIG/vGPU/空间分区四种方案、CUDA Context/显存/SM底层原理、以及多模型混部部署提升GPU利用率。

本节配有交互动效(进入视口后自动加载,约 3KB)。

GPU共享方案 时间分片:轮流占用GPU MIG: 硬件级强隔离 vGPU: 虚拟化细分 虚拟化逻辑单元 提升推理资源利用率。

背景与动机

老胡的后厨有一口进口“黄金灶”,平时只炒一道“小炒黄牛肉”。这道菜从备料到出锅只用两分钟,但灶台预热、等待翻锅的时间却占了一大半。老板发现,厨师基本在闲着,灶火在空烧——这正是很多 AI 团队面对 GPU 的真实写照:模型推理请求很短,但每个模型都独占整卡,GPU 算力大量闲置。

推理不像训练。训练像一次马拉松,可以把 GPU 跑得满满当当;推理像外卖订单,一会儿来一单,每单只有几毫秒到几十毫秒。如果为每个模型单独分配一张物理 GPU,多数时间这张卡都处于“等单”状态。GPU 利用率低带来两个直接后果:硬件成本居高不下,资源碎片化严重。小模型占着大卡,大模型又排不进去,算力被切得七零八落。

池化技术就是把这口大灶交还给“后厨总管”统一管理。总管把多张物理 GPU 纳入同一个资源池,再按模型请求切成逻辑资源:一个模型需要多少算力就分多少。硬件层面由驱动或虚拟化层完成逻辑隔离,软件层由调度器决定谁在什么时候用。这里的核心指标就是 GPU 利用率。

因此,池化不是换一口更大的灶,而是让每一口灶尽量不空烧。理解了这一点,再看时间分片和空间分区,就会明白它们是两种不同的“开火策略”。

U=TbusyTbusy+Tidle\displaystyle U = \frac{T_{\text{busy}}}{T_{\text{busy}} + T_{\text{idle}}}
公式说的是:GPU 利用率等于真正干活的时间,除以干活加发呆的总时间。
  1. GPU 忙碌时间 $T_{\text{busy}}$真正执行矩阵乘、卷积等运算占用的时间。
    TbusyT_{\text{busy}}
  2. GPU 空闲时间 $T_{\text{idle}}$等待下一条请求、等待数据加载的时间。
    TidleT_{\text{idle}}
  3. 利用率 $U$忙碌时间占总时间的比例,越接近 1 说明灶台越充实。
    U=TbusyTbusy+TidleU = \frac{T_{\text{busy}}}{T_{\text{busy}} + T_{\text{idle}}}

池化核心原理

老胡决定不再让每道菜独占一口灶,而是把所有灶台交给一位“后厨总管”。总管手里有一张总表:左边是十口灶的实时状态,右边是所有客人的点单。哪道菜要用多大的火、多长时间,总管按需分配——这就是资源池的雏形。

在 AI 推理服务中,池化通常由驱动层或虚拟化层完成。物理 GPU 被虚拟成多个逻辑设备,每个逻辑设备有独立的显存视图、算力配额和句柄。容器或进程看到的是一张“虚拟 GPU”(vGPU),而不是物理卡。调度分配器则负责把推理请求派发到合适的逻辑实例上,避免某张卡忙死、另一张卡闲死。

这个过程中最关键的原则是:逻辑实例可以有多份,但所有实例的容量之和不能超过物理 GPU 的总容量。

老胡的厨房里,十口灶变成一张“总表”。每位厨师不再盯着固定灶台,而是按订单领取临时灶台。这个“总表”就是资源池,也是后面所有调度、隔离和监控的基础。

V=⋃i=1kvi,∑i=1k∣vi∣≤∣V∣\displaystyle V = \bigcup_{i=1}^{k} v_i,\quad \sum_{i=1}^{k}\left| v_i \right| \le \left| V \right|
公式说明:物理 GPU 被拆成多个逻辑实例,逻辑实例的容量总和不能超过物理容量。
  1. 物理 GPU 容量 $V$一张物理卡拥有的总算力和显存上限。
    VV
  2. 逻辑 GPU 实例 $v_i$从物理卡中切出的第 $i$ 个虚拟设备。
    viv_i
  3. 并集关系 $\bigcup$物理设备被拆成多个逻辑设备,它们共同对外提供算力。
    V=⋃i=1kviV = \bigcup_{i=1}^{k} v_i
  4. 容量约束 $\sum$所有逻辑实例容量之和必须小于等于物理容量,这是池化必须遵守的边界。
    ∑i=1k∣vi∣≤∣V∣\sum_{i=1}^{k}\left| v_i \right| \le \left| V \right|

时间分片方案

老胡没有真的把黄金灶切开,而是给每道菜排了一张“上灶时间表”:剁椒鱼头炖五分钟,小炒肉炒两分钟,番茄蛋汤煮三分钟。灶台在同一段时间只服务一道菜,但通过快速轮换,所有菜看起来都在被照顾。这正是时间分片。

在技术实现上,GPU 的驱动调度器把计算单元的使用权按时间片切分。多个模型轮流获得执行机会,每个模型的显存上下文仍然保留在卡上,所以显存是“独占”的,但计算任务需要排队。时间分片允许一定程度的超卖:多个模型可以登记同一份算力份额,因为大多数推理请求不会持续占满计算单元。

每个模型分到的时间片长度,由共享的模型数量决定:

时间分片适合小模型、短请求和能容忍排队的场景。老胡的经验是:菜越简单,翻台越快;一旦来了一道要炖两小时的硬菜,后面所有菜都会遭殃。

ti=Tcyclem\displaystyle t_i = \frac{T_{\text{cycle}}}{m}
公式含义:一轮调度周期越短、共享模型越少,单个模型等待时间越短。
  1. 调度周期 $T_{\text{cycle}}$一轮时间片轮转的总时长,通常由调度器配置。
    TcycleT_{\text{cycle}}
  2. 共享模型数 $m$同一张 GPU 上参与时间分片的模型数量。
    mm
  3. 每个模型的时间片 $t_i$每个模型在一轮周期中分到的执行时间,模型越多,等待越久。
    ti=Tcyclemt_i = \frac{T_{\text{cycle}}}{m}

空间分区方案

老胡买了四块隔板,把黄金灶台切成四个小灶眼。每口小灶眼有自己的炉芯、锅架和排烟管,几位厨师可以同时炒菜,谁也不碰谁的火。这就是空间分区:从物理上把 GPU 的显存、计算单元和带宽切成多个独立区域。

空间分区的典型实现包括 NVIDIA MIG(Multi-Instance GPU)和 vGPU 方案。MIG 可以把一张物理 GPU 划分为多个显存和算力都隔离的实例,每个实例拥有自己的计算核心和显存带宽,互不抢占。每个实例获得的总算力比例由配额系数决定。

空间分区就像把大锅固定成几个小锅,几道菜可以同时开火、互不串味。但如果来了一条几十斤的大鱼,固定小锅可能装不下。所以在选型时,必须看模型是否适合某个分区规格。

Ci=αi⋅Ctotal,∑i=1nαi≤1\displaystyle C_i = \alpha_i \cdot C_{\text{total}},\quad \sum_{i=1}^{n} \alpha_i \le 1
公式说明:第 $i$ 个空间分区获得的算力等于物理总算力乘以其配额占比,所有占比之和不能超过 1。
  1. 物理总算力 $C_{\text{total}}$整张 GPU 的计算能力。
    CtotalC_{\text{total}}
  2. 配额系数 $\alpha_i$第 $i$ 个实例占物理总算力的比例,取值范围通常在 0 到 1 之间。
    αi\alpha_i
  3. 实例算力 $C_i$第 $i$ 个分区实际获得的算力。
    Ci=αi⋅CtotalC_i = \alpha_i \cdot C_{\text{total}}
  4. 配额上界 $\sum \alpha_i \le 1$所有分区分配出去的算力不能超过物理上限。
    ∑i=1nαi≤1\sum_{i=1}^{n} \alpha_i \le 1

隔离机制设计

厨房里最怕串味:宫保鸡丁的辣椒味窜进清蒸鲈鱼的蒸笼里。老胡给每个小灶眼配了独立锅盖、独立调料盒,还规定每口灶只能从自己的食材柜里取料。对应到 GPU 隔离机制,就是显存隔离、算力隔离和故障隔离。

显存隔离确保每个逻辑实例只能使用自己的显存配额,超限时触发 OOM,而不是抢占其他实例。算力隔离通过 MIG 或配额调度限制每个实例对计算单元和显存带宽的占用。故障隔离则保证某个实例崩溃时,不会拖垮整张卡或同卡上的其他租户。安全边界进一步防止不同租户读取彼此的显存数据。

这里的隔离可以用一个简单的不等式表达:每个实例的显存使用量不能超过平均配额。

隔离不是把厨师关进小黑屋,而是给每个人一张限额取料卡:谁也不能拿出超过配额的材料,出了事故也只是自己那口锅遭殃。有了这层保障,多租户混部才敢真正上线。

Mi≤MGPUn\displaystyle M_i \le \frac{M_{\text{GPU}}}{n}
公式含义:每个实例的实际显存用量被限制在总显存除以实例数量得到的配额内。
  1. 实例显存用量 $M_i$第 $i$ 个虚拟 GPU 当前实际占用的显存。
    MiM_i
  2. 物理总显存 $M_{\text{GPU}}$整张 GPU 的显存容量。
    MGPUM_{\text{GPU}}
  3. 平均配额 $\frac{M_{\text{GPU}}}{n}$在 $n$ 个实例平均分配时,每个实例最多可用的显存。
    MGPUn\frac{M_{\text{GPU}}}{n}

多模型混部

老胡开始尝试“川粤同灶”,几个模型共享一张卡。结果宫保鸡丁和清蒸鲈鱼同时开火,整间厨房都是辣椒味,粤菜师傅连连咳嗽,出菜速度慢了一半。这就是多模型混部中的性能干扰。

混部调度器会按模型特征做组合:延迟敏感的模型搭配离线批处理模型,计算密集的模型搭配访存密集的模型。亲和性策略则把互相干扰的小模型放在同一张卡上,把大模型和强隔离需求高的模型放到独立分区。QoS 保障是硬约束:无论怎么混部,线上请求的延迟目标不能突破。

在评估混部效果时,通常会计算干扰因子,也就是混部后的延迟与独占时延迟的比值:

混部不是把模型丢进一口锅就完事,而是要像配菜一样讲究“荤素搭配”。搭配得当,所有灶都能热起来;搭配不当,再好的食材也会糊成一锅。

f=LmixedLsolo\displaystyle f = \frac{L_{\text{mixed}}}{L_{\text{solo}}}
公式说明:干扰因子越接近 1,说明混部对彼此的影响越小;大于 1 越多,性能劣化越明显。
  1. 独占延迟 $L_{\text{solo}}$模型独占整张 GPU 时的 P99 延迟。
    LsoloL_{\text{solo}}
  2. 混部延迟 $L_{\text{mixed}}$模型与其它模型共享 GPU 后的 P99 延迟。
    LmixedL_{\text{mixed}}
  3. 干扰因子 $f$混部延迟除以独占延迟,用来量化性能被干扰的程度。
    f=LmixedLsolof = \frac{L_{\text{mixed}}}{L_{\text{solo}}}

性能调优监控

老胡在后厨挂了一块看板:每口灶的温度、排队人数、出菜时长一目了然。哪口灶要空烧了,总管就多派单过去;哪口灶排队太长,总管就少接单。对于 GPU 推理服务,这块看板就是监控系统。

性能调优时,不能只看 GPU 利用率。利用率高可能是好事,也可能意味着请求正在排队,延迟早就超标。所以需要联合观察三个维度:GPU 利用率、请求延迟、排队等待长度。调优参数包括时间片大小、空间分区规格、最大并发数和 batch 大小。容量规划则根据监控趋势决定什么时候加卡、什么时候缩容。

平均利用率是容量规划中最常用的指标,它表示一段时间内 GPU 忙闲的平均水平:

看板不是用来炫耀的,而是用来发现“灶太忙、菜出不来”的问题。理想状态不是利用率 100%,而是稳定在目标区间,同时 P99 延迟不突破 SLO。这样才算是把 GPU 池化真正用好了。

Uavg=1T∫0Tu(t) dt\displaystyle U_{\text{avg}} = \frac{1}{T}\int_0^T u(t)\,dt
公式说明:把每个瞬间的利用率在一段时间内求和取平均,得到平均利用率。
  1. 瞬时利用率 $u(t)$在时刻 $t$ 采样到的 GPU 利用率。
    u(t)u(t)
  2. 监控周期 $T$统计利用率的时间长度,比如 5 分钟、1 小时。
    TT
  3. 平均利用率 $U_{\text{avg}}$周期内利用率的时间平均,也是容量规划和告警阈值的基准。
    Uavg=1T∫0Tu(t) dtU_{\text{avg}} = \frac{1}{T}\int_0^T u(t)\,dt

AI 应用场景

云上大模型推理平台

阶段:推理服务资源池化

解决的问题:多个业务部门各自申请 GPU 整卡,模型流量不大却占满整卡,导致利用率低、成本高。AI 平台通过 GPU 池化把轻量模型组合共享在同一张卡上,再按模型需求分配逻辑实例。

具体案例:某 SaaS 公司有 20 个轻量模型,原来每天占用 20 张卡;池化后按时间分片加空间分区组合部署到 5 张卡,P99 延迟从 300ms 变为 350ms,仍在 SLO 内,GPU 平均利用率从 18% 提升到 64%。

金融风控实时推理

阶段:租户隔离与安全合规

解决的问题:不同风控模型分属不同业务部门,不能互相读取参数或显存数据,传统时间分片很难满足强隔离要求。空间分区加显存配额可以给出硬边界。

具体案例:银行将反欺诈和信用评分两个模型部署在一台 A100 的 MIG 分区上,两个实例的显存和算力配额相互独立,任何一侧 OOM 都不会影响另一侧,季度安全审计顺利通过。

多模型混部容量规划

阶段:容量规划与性能调优

解决的问题:新增模型后不确定能否与现有模型共用 GPU,需要先用监控和压测验证干扰因子,再决定是否混部。

具体案例:推理团队用线上流量回放,对比混部前后的 P99 延迟和 GPU 利用率,发现实时翻译与离线图像分类混部后干扰因子约为 1.1,于是把它们固定在同一亲和性节点上长期运行。

Python 演示

python54 行
# -*- coding: utf-8 -*-from dataclasses import dataclass @dataclassclass Request:    model: str    size: int    duration: int  class VirtualGPU:    def __init__(self, gpu_id, capacity, mode):        self.gpu_id = gpu_id        self.capacity = capacity        self.mode = mode        self.dispatched_count = 0     def submit(self, req):        if req.size > self.capacity:            return False        self.dispatched_count += 1        return True  class GpuPool:    def __init__(self):        self.vgpus = []     def add_vgpu(self, vgpu):        self.vgpus.append(vgpu)     def schedule(self, req, mode):        for vgpu in self.vgpus:            if vgpu.mode == mode and vgpu.submit(req):                return vgpu.gpu_id        return None  def simulate(mode, requests):    pool = GpuPool()    pool.add_vgpu(VirtualGPU("gpu-time-1", 4, "time"))    pool.add_vgpu(VirtualGPU("gpu-space-1", 4, "space"))    mappings = [pool.schedule(req, mode) for req in requests]    print(mode, mappings)  if __name__ == "__main__":    reqs = [        Request("chat", 1, 10),        Request("vision", 3, 5),        Request("nlp", 2, 8),    ]    simulate("time", reqs)    simulate("space", reqs)
目的:一个极简 GPU 池调度模拟器,演示请求如何被派发到时间分片或空间分区的虚拟 GPU 上,并拒绝超出容量的请求。
  1. class VirtualGPU:定义虚拟 GPU 实例,保存自己的调度模式和容量上限。
  2. if req.size > self.capacity:容量不足时直接拒绝,避免挤占其它实例的资源。
  3. if vgpu.mode == mode and vgpu.submit(req):同时匹配调度模式和容量条件,决定是否派发。
  4. mappings = [pool.schedule(req, mode) for req in requests]对每个请求调用调度器,形成派发名单。
  5. if __name__ == "__main__":让代码既可被导入也能直接运行。

常见误区

误区我一开始以为 GPU 池化后,一张卡能当很多张卡用,显存和算力都会翻倍,模型想放多少个就放多少个。

正解池化只是让一张物理 GPU 被多个模型共享,总算力和显存仍然受物理上限约束。时间分片可以超卖时间片,但计算总量没有增加;空间分区更是把总量拆成了几份。就像一口大灶切成四口小灶,总火力不会变多。

为何常见:“虚拟化”和“资源池”这些词容易让人产生无限资源的错觉,尤其超卖概念更强化了这种误解。

误区时间分片不需要切显存、不需要改硬件划分,只是排队执行,应该比空间分区更轻松,也不会带来性能损失。

正解时间分片会引入调度切换开销和排队延迟,多个模型共享计算单元时,P99 延迟会明显上升。空间分区虽然能并发执行,但受固定分区规格限制。两种方案都有代价,没有所谓的“无损共享”。

为何常见:因为时间分片在配置上看起来只是加一个参数,容易被当成零成本方案。

误区只要把多个模型部署在同一张 GPU 上,GPU 就不会闲着,吞吐量一定比单独部署高。

正解混部确实能提高资源利用率,但如果模型之间互相争抢算力,延迟可能大幅劣化,最终为了满足 SLO 反而要降低并发。必须结合干扰因子和延迟指标来判断混部是否划算。

为何常见:大家看到的是“卡被用起来了”,却忽略了服务质量这个约束,于是把占用率提高误当成收益。

误区MIG 分区后每个实例都有独立显存和算力,所以它们完全不会互相影响,可以用在一切高要求场景。

正解MIG 的隔离能力确实很强,但电源、散热、部分 PCIe 带宽等物理资源仍然共享,极端负载下仍可能出现尾部延迟波动。此外,模型必须能适配 MIG 的固定分区规格,并不是所有模型都适合。

为何常见:硬件隔离的宣传容易被绝对化,忽略共享物理组件带来的长尾影响。

误区看板显示 GPU 利用率 90%,我就认为资源用得很好,服务一定很健康。

正解利用率高可能意味着任务在排队,延迟已经超标。正确的做法是把利用率和 P99 延迟、排队长度联合观察,利用率一旦超过合理阈值而延迟上升,就要触发扩容或降并发。

为何常见:利用率是最容易看到的数字,直觉上会觉得越高越好,但推理服务真正要守护的是延迟 SLO。

面试题

Q1. GPU 利用率偏低的主要原因是?

单选题 · easy

  • A.芯片制程太过老旧
  • B.模型独占整张显卡← 正确答案
  • C.显卡风扇噪声太大
  • D.显存容量不够使用

答案:B。推理请求往往很短暂,模型独占整卡会导致大部分时间 GPU 处于等待状态,所以利用率偏低。芯片制程、风扇噪声、显存不足都不是推理场景利用率低的根本原因。

Q2. 时间分片方案的核心思路是什么?

单选题 · easy

  • A.按显存大小切分
  • B.按时间段轮流使用← 正确答案
  • C.多张显卡并联扩容
  • D.强制提高显卡频率

答案:B。时间分片让多个模型按时间片轮流使用同一块 GPU 的计算单元,而不是按显存或频率切分。它相当于让几道菜在同一口灶上轮着烧。

Q3. 空间分区与时间分片最大的区别是什么?

单选题 · mid

  • A.多个实例能同时运行← 正确答案
  • B.显存不能再被共享
  • C.必须使用多张物理卡
  • D.只能部署一个小模型

答案:A。空间分区把 GPU 切成多个独立区域,多个实例可以同时运行;时间分片虽然也有多个模型,但它们轮流使用计算单元,并非真正同时。空间分区并不要求多张物理卡,也不限定只能部署小模型。

Q4. MIG 分区后实例显存超限通常会发生什么?

单选题 · hard

  • A.自动借用其他实例剩余显存
  • B.触发 OOM 而不抢占他人显存← 正确答案
  • C.降低其他实例的运行频率
  • D.整张 GPU 直接停机不可用

答案:B。MIG 的显存隔离是硬隔离,实例超限会触发自己的 OOM,而不是去借用或抢占其它实例的显存。这就像每口灶只能用自己灶台上的食材,不能去拿隔壁的菜。

Q5. 多模型混部时最主要的风险是什么?

单选题 · mid

  • A.模型权重文件会互相覆盖
  • B.算力争抢导致延迟抖动← 正确答案
  • C.GPU 驱动版本无法加载
  • D.容器网络 IP 地址冲突

答案:B。模型文件、驱动和网络一般由容器和编排系统隔离,真正的风险是计算与显存带宽的争抢,导致请求延迟抖动。混部前要通过干扰因子评估这种风险。

Q6. GPU 池化通常带来哪些收益?

多选题 · easy

  • A.提升 GPU 整卡利用率← 正确答案
  • B.降低推理平均成本← 正确答案
  • C.让显存容量无限扩大
  • D.让更多模型共用一张卡← 正确答案

答案:ABD。池化通过共享减少空转,提高利用率,让更多模型共用一张卡,从而摊薄平均推理成本。但它不会让显存或算力凭空变多,物理上限仍然存在。

Q7. 以下属于 GPU 隔离机制关注点的是?

多选题 · mid

  • A.显存使用上限控制← 正确答案
  • B.算力配额公平分配← 正确答案
  • C.故障影响范围隔离← 正确答案
  • D.屏幕分辨率自动调高

答案:ABC。显存、算力和故障域是 GPU 隔离的三大核心。屏幕分辨率与 GPU 虚拟化无关,属于干扰项。

Q8. 时间分片模式下延迟上涨的直接原因是什么?

单选题 · mid

  • A.显存容量被切分变小
  • B.任务排队等待时间片← 正确答案
  • C.GPU 风扇转速变慢降低
  • D.宿主机网络带宽被占满

答案:B。时间分片让多个模型轮流使用计算单元,任务需要排队等待属于自己的时间片,等待时间会直接反映为延迟升高。显存容量并不是时间分片的主要瓶颈。

Q9. 性能调优时通常需要联合观察哪些指标?

多选题 · hard

  • A.平均 GPU 利用率← 正确答案
  • B.请求 P99 延迟← 正确答案
  • C.任务排队等待时长← 正确答案
  • D.机房咖啡机剩余杯数

答案:ABC。利用率高不一定代表健康,必须与 P99 延迟和排队长度一起看。如果利用率高但 P99 也在上涨,说明资源已经过载。咖啡机数据和性能无关。

Q10. 需要兼顾利用率和租户隔离时,通常优先选择哪种方案?

单选题 · hard

  • A.MIG 空间分区← 正确答案
  • B.独占物理整卡
  • C.时间分片超卖
  • D.显存软限制限额

答案:A。MIG 空间分区能在共享物理 GPU 的同时提供较强的显存和算力隔离,适合兼顾利用率和多租户隔离。独占整卡隔离最好但利用率低,时间分片超卖隔离弱,显存软限制难以防止算力争抢。