你有没有和室友合租过?一个人租一整套两居室,每月房租五千,压力不小。但如果两个人合租,房租平摊,每人只要两千五,客厅、厨房、卫生间还能共用——这就是合租省钱的核心逻辑。 今天要讲的“多模型共享 GPU 降本”,本质就是 AI 世界里的“合租”。单个 GPU 实例就像一套精装公寓,独租自然贵,但如果把多个 AI 模型当作多个租客,让它们分享同一块 GPU 的算力和显存,成本就能大幅下降。当然,合租也有麻烦——室友作息不同怎么办?厨房用不过来怎么办?谁多交了水电气怎么算?这些对应到技术上,就是资源隔离、显存分配、调度优先级和 SLA 保障等问题。 这篇文章将带你一步步了解:如何给 AI 模型“合租”GPU,如何做到既省钱又不打架,以及云厂商环境下的种种注意事项。

岗位关联

多模型共享 GPU 是 AI 推理降本的核心手段之一。掌握它,你就能为企业设计出既省钱又可靠的 AI 云服务方案,成为真正懂 FinOps 的 AI 工程师。

目录
  1. 可视化演示
  2. 合租原理与价值
  3. 资源隔离方案
  4. 显存分配策略
  5. 调度优先级管理
  6. SLA保障方法
  7. 性能测试与调优
  8. 云厂商兼容差异
  9. 降本核算与FinOps
  10. AI 应用场景
  11. Python 演示
  12. 常见误区
  13. 面试题

可视化演示

三步展示多模型共享GPU降本:MPS共享/MIG分区/时间片三种技术、Triton单卡多模型部署与动态批处理、以及显存80%上限与SLA的资源规划。

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

GPU共享技术 MPS: 上下文级共享运算 MIG: 硬件级隔离分区 时间片:轮流使用 分摊算力成本 降低单位推理成本。

合租原理与价值

想象你开了一家“AI 模型公寓”。公寓里租住着好几个模型——有的负责图像识别,有的处理语音,有的做自然语言理解。过去你财大气粗,给每个模型都租了一整套 GPU“独栋别墅”。结果呢?很多模型一天大部分时间都在“睡大觉”,GPU 利用率可能只有 20%~30%。这就好比花大价钱租了别墅,结果每天都在客厅沙发上看电视,根本不需要那些房间。

多模型共享 GPU 的思路,就是把这套“独栋别墅”改成“合租公寓”。多个模型住在同一个 GPU 实例里,共享算力和显存。虽然每个模型的性能可能略有下降,但成本下降的幅度远大于性能损失。据统计,一台空闲 GPU 的资源利用率从 30% 提升到 80% 以上是常见的,这意味着同样的硬件成本,能干原来三倍的活。

成本节约率=1−共享后 GPU 总成本独享时 GPU 总成本\text{成本节约率} = 1 - \frac{\text{共享后 GPU 总成本}}{\text{独享时 GPU 总成本}}

1. 共享后 GPU 总成本:指多个模型共享后,实际需要购买的 GPU 实例成本总和。由于共享提高了利用率,所需实例数变少。

Cshared=Ninstances×Pper_instanceC_{\text{shared}} = N_{\text{instances}} \times P_{\text{per\_instance}}

2. 独享时 GPU 总成本:指每个模型单独拥有一台 GPU 实例时的成本总和。

Cdedicated=∑i=1MPmodel_iC_{\text{dedicated}} = \sum_{i=1}^{M} P_{\text{model\_i}}

3. 计算节约率:用 1 减去共享成本与独享成本之比,得到节约比例。

Rate=1−CsharedCdedicated\text{Rate} = 1 - \frac{C_{\text{shared}}}{C_{\text{dedicated}}}

总之,合租原理的核心就一句话:把闲置的算力变成钱。这不仅是技术方案,更是 FinOps(云成本优化)理念在 AI 领域的具体实践。

资源隔离方案

合租第一个要解决的问题就是:室友之间怎么不互相干扰?你不能让 A 模型半夜放“摇滚乐”(算力占满),吵得 B 模型没法工作。资源隔离,就是给每个“租客”砌一堵墙。

墙有两层:第一层是容器级隔离。每个模型跑在独立的容器(比如 Docker/Kubernetes Pod)里,文件系统、网络栈、进程空间都相互隔离。就像合租公寓里每个房间都有独立的门锁,室友进不了你的房间。第二层是显存分区隔离。GPU 显存被划分成多个区域,每个模型只能用自己分配到的显存块。这类似于公寓里每个房间的大小不同,但都是你的私人空间,别人不能占用。

Vlimit=MtotalNmodels×(1+α)V_{\text{limit}} = \frac{M_{\text{total}}}{N_{\text{models}}} \times (1 + \alpha)

1. 总显存除以模型数:在理想情况下,把 GPU 显存平均分给每个模型。

MtotalNmodels\frac{M_{\text{total}}}{N_{\text{models}}}

2. 乘以弹性系数:实际上不能分得那么死,要给每个模型留一点余量,应对突发流量。$\alpha$ 通常取 0.1~0.3。

(1+α)(1 + \alpha)

除了显存隔离,还有算力限额(Compute Limit)。GPU 的 SM(流式多处理器)数量和算力也是有限的。通过 MPS(Multi-Process Service)或 CUDA 流优先级,可以限制每个容器使用的 GPU 算力百分比。这就像合租公寓里的公共水电气——每个人都有额度,超过就要限流。

显存分配策略

墙砌好了,接下来要解决“房间怎么分”的问题。显存分配策略,就是给不同租客分配房间大小的规则。

静态分配最简单:每个模型固定分配一定大小的显存,比如模型 A 分 4GB,模型 B 分 4GB,模型 C 分 4GB,谁也不能超过。优点是不会互相影响,缺点是浪费——如果模型 A 实际只用了 2GB,剩下的 2GB 就闲置了。这就像合租公寓里每个卧室固定面积,但有的租客带的东西少,房间一大半空着。

动态分配更聪明:根据模型实时的显存需求,动态调整分配。模型 A 高峰期给它 6GB,低峰期收回 2GB 给模型 C 用。这就像合租公寓里,多出来的储物间谁需要谁用。但动态分配实施难度大——频繁搬动显存数据会影响性能,而且容易产生碎片。

Umem=∑i=1NAiMtotalU_{\text{mem}} = \frac{\sum_{i=1}^{N} A_i}{M_{\text{total}}}

1. 实际显存求和:把所有模型实际占用的显存加起来。

∑i=1NAi\sum_{i=1}^{N} A_i

2. 除以总显存:就能算出整体显存利用率,这是衡量共享策略好坏的核心指标。

碎片整理是另一件大事。当模型反复申请和释放显存后,显存会出现很多“小碎块”——就像仓库里堆满了大小不一的箱子,有空隙但用不上。定期做碎片整理(把连续的显存块合并),能进一步提高利用率。

调度优先级管理

合租公寓的厨房只有一个,但租客们都要做饭。谁先用?调度优先级管理解决的就是“谁先上 GPU”的问题。

通常我们给不同模型设置不同优先级。在线推理模型(比如实时语音识别、在线推荐)像上班族,早上八点必须用厨房——延迟要求高,必须优先调度。批量训练任务像在家办公的自由职业者,时间灵活,可以排在后面。离线数据分析像周末才做饭的人——优先级最低。

Priority(t)=w1×Latency_SLO(t)−w2×Wait_Time(t)\text{Priority}(t) = w_1 \times \text{Latency\_SLO}(t) - w_2 \times \text{Wait\_Time}(t)

1. 延迟要求:Latency_SLO 表示该模型对响应时间的苛刻程度。SLO 为 10ms 的模型,优先级比 SLO 为 1s 的高很多。

Latency_SLO(t)\text{Latency\_SLO}(t)

2. 等待时间:为了防止低优先级模型“饿死”,随着等待时间增加,它的优先级也会逐渐提升。

Wait_Time(t)\text{Wait\_Time}(t)

抢占式调度意味着高优先级任务可以打断低优先级任务——就像紧急情况下,上班族可以把正在做饭的自由职业者挤开,先用厨房。但实现抢占需要保存和恢复上下文,开销不小。公平调度(如 Max-Min Fairness)则更“社会主义”,保证每个模型都至少获得最低限度的资源,避免有人完全没饭吃。

SLA保障方法

合租省钱可以,但服务质量不能掉链子。SLA(服务等级协议)就像合租公寓的“管理公约”,规定了公共区域(GPU 算力)必须达到的清洁标准(性能指标)。

请求级 QoS 是 SLA 的第一道防线。通过限流和排队机制,保证高优先级模型的请求能迅速得到响应。这就像合租公寓的电梯——高峰期会启用“楼层分流”,让高楼层住户(高优先级模型)先上。具体技术包括 Token Bucket 限流、请求队列分离等。

弹性伸缩是 SLA 的第二道防线。当某个模型的负载突然暴涨(比如双十一的推荐模型),就需要给它“加房间”——动态扩展它的资源配额,甚至把多余的请求转发到其他 GPU 实例上。

QPSmax⁡=Nreplicas×Model_ThroughputAvg_Latency\text{QPS}_{\max} = \frac{N_{\text{replicas}} \times \text{Model\_Throughput}}{\text{Avg\_Latency}}

1. 副本数乘单模型吞吐量:看整个共享系统每秒能处理多少请求。

Nreplicas×Model_ThroughputN_{\text{replicas}} \times \text{Model\_Throughput}

2. 除以平均延迟:请求处理都需要时间,平均延迟越高,系统的实际 QPS 上限越低。

故障转移与容灾是最后一道防线。如果共享 GPU 上的一个模型崩了(比如内存泄漏),不能让它拖垮其他模型。Kubernetes 的健康检查 + 自动重启,以及模型副本的多节点部署,都是常见的保障手段。

性能测试与调优

怎么知道合租方案是否真的可行?性能测试与调优,就是给合租公寓做一次全面“体检”。

基准测试是体检的第一项:跑一组标准的推理请求,看延迟、吞吐量和显存占用三个核心指标。比如 BERT-base 模型在独占 GPU 时延迟 5ms、吞吐 1000 QPS;共享后延迟变成 8ms、吞吐 600 QPS——要判断这个差距是否在接受范围内。

压力测试是体检的第二项:持续增加请求量,找到系统的“崩溃点”。性能分析则用 Profiling 工具(如 Nsight Systems、PyTorch Profiler)定位瓶颈——是显存带宽不够?还是 SM 算力饱和?还是内存分配锁竞争?

Ttotal=Tcompute+Tmemory+Tqueue+ToverheadT_{\text{total}} = T_{\text{compute}} + T_{\text{memory}} + T_{\text{queue}} + T_{\text{overhead}}

1. 计算耗时:GPU 真正执行矩阵乘法等计算的时间。

TcomputeT_{\text{compute}}

2. 访存耗时:把数据和模型参数从显存搬到计算单元的时间。共享场景下多个模型争抢显存带宽,这项开销会激增。

TmemoryT_{\text{memory}}

3. 排队与调度开销:请求在队列里等待的时间,以及调度器切换模型上下文的时间。

Tqueue+ToverheadT_{\text{queue}} + T_{\text{overhead}}

常见的调优手段包括:调整 Batch Size(让 GPU 算力吃饱)、开启 CUDA Graphs 减少内核启动开销、用 TensorRT 做模型优化、设置合适的显存池大小减少分配频率等。

云厂商兼容差异

合租方案在一家云厂商跑得好好的,换一家就“水土不服”?云厂商兼容差异,就是不同云平台的“公寓管理制度”不同。

实例类型差异是最显著的。AWS 的 A100 GPU 实例(如 p4d.24xlarge)和阿里云的 A100 实例(如 ecs.gn7i-c16g1.4xlarge)虽然都是 A100,但 CPU、内存、网络带宽的配置比例不一样,驱动和 CUDA 版本也可能不同。这就如同一套北京的老公房和一套深圳的电梯公寓——面积一样,户型完全不同。

迁移注意事项包括:检查 GPU 驱动的 CUDA 版本兼容性(比如 AWS 的 EFA vs 阿里云的 RDMA)、网络架构差异(VPC/安全组规则)、存储挂载方式(EBS vs 云盘 vs NAS)等。最容易被忽略的是镜像兼容层——用 Docker 镜像可以屏蔽大部分系统差异,但 GPU 驱动和 CUDA 运行时要根据云厂商版本重新构建。

Portability=1−NmodificationsTotal_Components\text{Portability} = 1 - \frac{N_{\text{modifications}}}{\text{Total\_Components}}

1. 需要修改的组件数:迁移时,要改动的代码、配置、依赖项数量。

NmodificationsN_{\text{modifications}}

2. 总组件数:整个服务包含的组件总数。如果总共 20 个组件,迁移时只改了 2 个,可移植性就是 90%。

多云部署策略则是为了“不把鸡蛋放在一个篮子里”。可以把在线推理服务部署在两个云厂商上,用 DNS 流量调度按比例分发请求,这样即使一家云厂商出故障,另一家也能扛住。

降本核算与FinOps

最后一个问题:合租到底省了多少钱?降本核算与FinOps,就是给“合租”算清账。

先看成本模型。GPU 成本包含三部分:实例费用(按秒或按小时计费)、存储费用(模型文件和数据)、网络流量费用(传输数据)。多模型共享 GPU 后,实例数量减少,实例费用大幅下降,但存储和网络费用可能略增——因为多个模型要同时加载和传输。

Cmonthly=Cinstance+Cstorage+Cnetwork−SsavingsC_{\text{monthly}} = C_{\text{instance}} + C_{\text{storage}} + C_{\text{network}} - S_{\text{savings}}

1. 实例费用:GPU 实例的租赁费用。

CinstanceC_{\text{instance}}

2. 存储与网络费用:模型文件存储和数据传输的费用。

Cstorage+CnetworkC_{\text{storage}} + C_{\text{network}}

3. 共享节省:因为共享而省下的钱,也就是前面算的成本节约率对应的金额。

SsavingsS_{\text{savings}}

账单分析是 FinOps 的日常工作。通过云厂商的账单接口,按模型、按项目、按团队拆分成本,看看哪个模型的 GPU 消耗最多、哪个模型闲置率最高。这就好比合租公寓每月贴出水电费明细,谁用得多谁多摊。

持续优化是最后一环。GPU 型号升级(比如从 A10 升级到 A100,单卡算力提升 3 倍但价格只贵 2 倍)、用 Spot 实例跑低优先级任务、关掉闲置时段的实例——这些都是可以持续做的降本动作。FinOps 的核心是“持续”两个字:降本不是一次性的,而是像记账一样每月复盘。

AI 应用场景

场景一:在线推荐系统多模型共享 GPU

阶段:模型部署与推理优化

解决的问题:某电商平台的推荐系统包含用户画像模型、商品召回模型和排序模型三个模型。传统做法是每个模型部署在一台独立的 GPU 实例上,三台 T4 实例每月成本超过 1.2 万元,但每台实例的 GPU 利用率平均只有 25%,大量算力被浪费。通过多模型共享 GPU,三个模型部署在同一台 A10 实例上,通过容器隔离和动态显存分配,GPU 利用率提升到了 75% 以上,月度成本降至 6000 元以内,降低超过 50%。

具体案例:平台在 Kubernetes 集群中用 NVIDIA MPS 实现了算力限额,三个模型各分配约 30% 的 GPU 计算单元。在双十一大促期间,通过动态提升用户画像模型的优先级和显存配额,保证了推荐接口的 P99 延迟仍低于 200ms,满足业务 SLA 要求。后续通过账单分析进一步发现,凌晨 2:00~6:00 的流量仅为白天的 10%,于是部署了定时扩缩容策略,额外节省了 20% 的成本。

场景二:多租户 AI 云平台

阶段:云服务设计与资源管理

解决的问题:某 AI 云服务商为多家客户提供模型推理 API。过去每个客户的模型单独占用一个 GPU 实例,资源浪费严重且客户单价高。通过多模型共享 GPU 方案,云服务商可以在同一 GPU 上承载多个客户的模型,按客户隔离资源和费用,既降低了单个客户的成本,又提高了云平台的利润空间。

具体案例:平台引入共享 GPU 调度器,支持按客户设置资源配额和优先级。高价值客户的模型收到请求时,通过抢占式调度保障其响应速度;低价客户的批量任务则在空闲时段运行。通过成本归因系统,每个客户可以看到自己的模型占用了多少 GPU 资源和对应费用,实现透明计费。

场景三:企业内部多模型推理平台

阶段:模型统一纳管与成本治理

解决的问题:一家中型企业有 20 多个 AI 模型(包括 NLP、CV、语音),各部门分散使用各自的 GPU 资源,总体利用率不足 30%,且各团队自行采购造成大量浪费。通过建设统一的模型推理平台,将模型按优先级分组后共享部署在少量 GPU 实例上,实现资源池化管理和按部门核算成本。

具体案例:平台使用 KServe(Kubernetes 上的模型服务框架)统一管理模型。财务部门每月通过平台导出的成本报表,按部门(如搜索部、推荐部、风控部)拆分 GPU 费用,倒逼各部门优化自己的模型部署方式。运行半年后,公司整体 GPU 成本下降了 40%,而模型服务的平均延迟仅增加了 15%,远低于业务可接受的上限。

Python 演示

python74 行
import timeimport threadingfrom dataclasses import dataclassfrom collections import dequefrom typing import List, Dict, Optional @dataclassclass Model:    name: str    priority: int    mem_required: int    mem_actual: int class GPUScheduler:    """多模型共享GPU调度器模拟"""    def __init__(self, total_mem: int):        self.total_mem = total_mem        self.models: List[Model] = []        self.queue: deque = deque()        self.gc_count = 0        self.free_lists: Dict[str, int] = {}     def add_model(self, model: Model, static: bool = True):        """添加模型到共享GPU,static=True为静态分配"""        # 为每个新的模型划分内存        if static:            if sum(m.mem_required for m in self.models) + model.mem_required > self.total_mem:                print("[调度器] 显存不足,拒绝部署模型", model.name)                return False            model.mem_actual = model.mem_required        else:            # 动态分配模式:先按最小需求分配            model.mem_actual = min(model.mem_required, self.total_mem // 4)        self.models.append(model)        self.free_lists[model.name] = model.mem_required - model.mem_actual        print(f"[调度器] 部署模型 {model.name},占用显存 {model.mem_actual}G")        return True     def dispatch(self):        """调度主循环:按优先级处理请求"""        self.queue = deque(model.priority for model in self.models)        for model in sorted(self.models, key=lambda m: -m.priority):            if self._check_resource(model):                self._allocate(model)            else:                print(f"[调度器] 模型 {model.name} 资源不足,请求排队")                self.queue.append(model.priority);        return True     def _check_resource(self, model: Model) -> bool:        """检查模型是否还有剩余显存配额"""        return self.free_lists.get(model.name, 0) + model.mem_actual > 0     def _allocate(self, model: Model):        """为模型分配一个推理请求的算力"""        self.gc_count += 1        self.free_lists[model.name] = max(0, self.free_lists.get(model.name, 0) - 0.5)        print(f"[调度器] 模型 {model.name} 正在推理,累计推理次数 {self.gc_count}")     def compact_memory(self):        """模拟碎片整理:回收所有模型空闲的显存"""        reclaimed = sum(self.free_lists.values())        for name in self.free_lists:            self.free_lists[name] = 0        print(f"[调度器] 碎片整理完成,回收 {reclaimed:.1f}G 闲置显存")        return reclaimed if __name__ == "__main__":    scheduler = GPUScheduler(total_mem=12)    scheduler.add_model(Model("BERT", priority=3, mem_required=4, mem_actual=4))    scheduler.add_model(Model("GPT", priority=2, mem_required=5, mem_actual=4))    scheduler.add_model(Model("CV", priority=1, mem_required=3, mem_actual=2))    scheduler.dispatch()    scheduler.compact_memory()
目的:模拟了一个 12G 显存的 GPU 如何通过调度器被三个模型共享——包含静态/动态分配、优先级调度和碎片整理。
  1. class GPUScheduler代表一个“合租公寓管家”,负责所有模型的资源分配和调度。
  2. add_model(model, static=True)“新租客签约”,通过显存检查决定是否允许该模型加入共享 GPU。
  3. model.priority每个租客的“VIP等级”,决定排队顺序。
  4. _check_resource(model)查看租客的“剩余水电气额度”,不足则请求排队。
  5. _allocate(model)正式执行推理任务,每次调用减少该模型的一点配额。
  6. compact_memory()“仓库整理”,统计所有租客的闲置空间并回收,腾出显存给新请求。

常见误区

误区把多个模型放到同一台 GPU 上就行,Docker 一跑就万事大吉。GPU 会自动分配资源给各个模型,不需要做特别的隔离和配额设置。

正解如果不做显存隔离,多个模型会争抢显存导致 OOM(内存溢出)。最典型的例子:PyTorch 模型默认会尽量占满所有空闲显存,两个模型同时跑一定会互相挤爆。实际生产环境必须显式配置 CUDA_VISIBLE_DEVICES 指定使用的 GPU 编号,或用 MPS 限制算力占比,用显存池设上限。就像合租公寓不划分房间,所有人挤在大通铺,不仅睡不好,还会不断打架。

为何常见:因为开发者在自己电脑上跑实验时,一个 GPU 只跑一个模型,从未遇到过资源争抢的问题,容易忽略多进程共存时的资源竞争。

误区静态分配就是给每个模型固定显存大小,稳定可靠。动态分配又要监控又要搬数据,还会影响性能,不如就静态分配。

正解静态分配确实实现简单、隔离性好,但资源利用率通常很低。比如给模型 A 固定 6G 显存,但 A 平时只用到 2G,剩下的 4G 就白白浪费了。相比之下,动态分配可以让模型 B 临时借用这部分闲置显存。合理的做法是混合策略:基础配额静态分配、弹性配额动态调整。生产中常用“显存池 + 动态配额”方案。这就像合租公寓,每个房间有固定卧室,但储物间等公共区域按需分配,谁需要谁用。

为何常见:动态分配在实现上确实复杂,很多团队因为技术门槛和管理成本望而却步。

误区多模型共享 GPU 反正能省钱,性能损失一点没关系。业务方不会在意延迟增加几毫秒。

正解性能下降会直接影响用户体验和收入。比如在线推荐系统延迟从 50ms 涨到 200ms,用户点击率可能下降几个百分点,损失的收入远超省下的 GPU 成本。多模型共享是“用性能换成本”的平衡术——必须事先通过压测确定性能退化是否在可接受范围(通常延迟增加 <50%,吞吐下降 <30%),并设置 SLA 红线。省下的钱要大于业务损失才划算,否则就是“赔本赚吆喝”。

为何常见:KPI 导向下成本敏感型公司容易只盯着资源账单,忽略了服务质量下滑带来的隐性损失。

误区Docker 镜像都是标准的,在 AWS 上能跑的容器在阿里云、Azure 上应该也能跑,不存在兼容性问题。

正解虽然容器层做了很好的封装,但 GPU 驱动版本、CUDA 库、网络架构、存储接口在不同云厂商之间差异很大。例如 AWS 的 NVIDIA 驱动版与阿里云不同,代码里硬编码的 CUDA 版本可能不匹配;AWS 的多节点通信用的是 EFA 协议,Azure 可能用 InfiniBand,代码要用统一的 NCCL/RCCL 接口层做适配。迁移前要做灰度验证,不能直接一把梭。

为何常见:很多团队只在小规模测试环境验证过,没经历过大规模生产环境迁移的坑,低估了云厂商底层差异的复杂性。

误区成本优化是运维或基础设施团队的事,开发人员只要把功能做完就行,FinOps 就是每月看一下账单有没有异常。

正解FinOps 的核心是跨团队协同的文化。开发团队需要在编码时就考虑资源效率(比如模型量化、剪枝、控制请求大小),运维团队制定资源水位和调度策略,财务团队做成本归因和预算管理。三个团队要组合好,且持续循环改进——就像合租公寓的室友要一起商量怎么省水电气费,单靠一个人盯是盯不住的。好的 FinOps 实践是“云成本像软件一样被管理和优化”。

为何常见:传统企业里成本问题一直是财务部门的事,技术团队只负责交付功能,缺乏“有成本的工程师文化”。

面试题

Q1. 多模型共享 GPU 的核心原理与下列哪种生活现象最相似?

单选题 · single

  • A.把多间办公室租给一个公司
  • B.多个住户合租一套公寓分摊房租← 正确答案
  • C.一个人一天打两份工赚两份工资
  • D.一个公司开多个分公司扩大市场

答案:B。B 正确。多模型共享 GPU 就是将多个模型(住户)部署在同一 GPU 实例(公寓)上,共享算力资源(公共区域)和显存(房间),从而分摊成本。A 是一个公司独享多间办公室,C 是单模型高利用率,D 是业务扩展,均不符合“多个租户共享一份资源降低成本”的核心逻辑。

Q2. 在 Kubernetes 中部署多个模型共享同一 GPU 时,最适合用来做资源隔离的工具是?

单选题 · single

  • A.Virtual Kubelet
  • B.NVIDIA MPS← 正确答案
  • C.Terraform
  • D.Prometheus

答案:B。NVIDIA MPS(Multi-Process Service)可以从架构上限制多个容器进程对 GPU SM 算力的占用比例,是实现算力限额的标准方式。Virtual Kubelet 是虚拟节点,Terraform 是 IaC 工具,Prometheus 是监控工具,都不直接解决 GPU 算力隔离问题。

Q3. 静态显存分配的主要缺点是什么?

单选题 · single

  • A.实现难度太大,代码写不出来
  • B.需要频繁搬动显存数据,影响性能
  • C.资源利用率低,会造成闲置浪费← 正确答案
  • D.会导致模型之间互相抢占显存

答案:C。静态分配指系统启动前就固定每个模型的显存配额。它的缺点是即使模型实际用不到这么多显存,配额也无法让给其他模型,导致资源利用率低。B 是动态分配的缺点,D 是不做隔离时的现象,A 属于强干扰项(静态分配实现难度低,动态分配才难)。

Q4. 高优先级模型在共享 GPU 中“饿死”了低优先级模型,解决这个问题最合理的策略是?

单选题 · single

  • A.等待时间加权,让等待越久的任务优先级逐步提高← 正确答案
  • B.直接把低优先级任务砍掉
  • C.取消高优先级模型的调度
  • D.买更多 GPU,避免低优先级模型饿死

答案:A。A 正确。在优先级调度中引入“等待时间加权”机制,可以让低优先级任务在队列中等待时间越长、优先级动态上升,这是一种常见的防饿死策略。B 过于粗暴,C 会影响核心业务,D 是需要额外成本的做法,都不是合理的调度策略。

Q5. 在共享 GPU 场景中,保障 SLA 的常用手段有哪些?

单选题 · multiple

  • A.请求级 QoS 限流与排队← 正确答案
  • B.基于负载的弹性伸缩← 正确答案
  • C.故障自动转移与容器自愈← 正确答案
  • D.禁止所有模型使用 GPU 以外资源

答案:ABC。A(请求级 QoS)通过限额和队列控制延迟;B(弹性伸缩)在负载骤增时动态扩容副本;C(故障转移)保证单点故障不影响整体服务质量。D 属于扰动项,GPU 以外资源(如 CPU、网络)是否需要限制取决于具体场景,不是 SLA 保障的标准手段。

Q6. 在多模型共享 GPU 场景下使用 PyTorch 推理时,发现显存利用率一直很低(~30%),最可能的原因及调优方向是?

单选题 · single

  • A.GPU 型号太老,需要更换新一代 GPU
  • B.Batch Size 过小且未显式分配显存池,导致内核启动开销占比大← 正确答案
  • C.模型参数太大,需要降低模型精度
  • D.网络带宽不足,数据加载太慢

答案:B。显存利用率低的核心原因是单次推理请求较小,GPU 算力没有填满。通过增大 Batch Size 进行批处理,或者用 CUDA Graph、TensorRT 等优化减少内核启动和调度开销,可以显著提升显存和算力利用率。A、C 是激进改动,D 聚焦网络而非 GPU 利用率,均非最优调优方向。

Q7. 以下哪些措施能有效降低多模型共享 GPU 场景下的显存碎片化?

单选题 · multiple

  • A.定期执行显存碎片整理← 正确答案
  • B.使用显存池(Memory Pool)提前申请大块显存复用← 正确答案
  • C.用 CUDA Graph 固化模型执行路径← 正确答案
  • D.禁止模型动态申请显存

答案:ABC。显存碎片主要来自模型的频繁申请和释放。碎片整理合并空闲块、显存池复用避免反复 malloc、CUDA Graph 让显存分配在启动前一次性完成,三者都能减少碎片。D 选项禁止动态申请不现实,模型推理本身就需要运行时分配。

Q8. 三个模型共享一台 24G 显存的 GPU,静态分配各 8G。模型 A 实际只用 4G,模型 B 和 C 高峰期各需要 10G。此时最合理的策略是?

单选题 · single

  • A.维持静态分配,B 和 C 自行排队等待
  • B.动态调整:将 A 闲置的 4G 暂时借给 B 或 C← 正确答案
  • C.让 A 退出共享,B 和 C 各分 12G
  • D.升级到 40G 显存的 GPU

答案:B。B 正确。动态分配让显存资源按需流动——A 空闲的 4G 可以临时调配给 B 或 C,高峰期过后再收回。这既避免了 A 的闲置浪费,又满足了 B、C 的峰值需求。A 会浪费闲置资源,C 和 D 涉及不必要的大改动,都不符合共享降本的核心目标。

Q9. FinOps 中“单位经济学(Unit Economics)”指标的正确理解是?

单选题 · single

  • A.每台 GPU 实例的总采购成本
  • B.每次模型推理请求的边际成本
  • C.每个模型推理一万次的平均成本← 正确答案
  • D.GPU 实例电费与折旧的合计

答案:C。单位经济学关注“成本/业务量”这个比率,把 GPU 总成本分摊到每次具体的推理请求或业务单位上,以此来评估成本优化效果。比如共享前每万次推理成本 5 元,共享后降到 2 元,说明方案有效。A 是实例单价,B 是边际概念,D 是纯物理成本,均未落到业务价值维度。

Q10. 从 AWS 迁移到阿里云使用共享 GPU 方案时,需要重点检查哪些兼容性问题?

单选题 · multiple

  • A.NVIDIA 驱动和 CUDA 版本是否匹配← 正确答案
  • B.容器镜像中是否依赖 EFA 等厂商专有通信库← 正确答案
  • C.弹性伸缩组的自动扩容策略是否一致← 正确答案
  • D.公司发票报销系统是否支持新平台

答案:ABC。跨云迁移必须检查底层 GPU 驱动/CUDA 兼容性(A)、容器内是否依赖源厂商专有库如 EFA(B)、以及弹性伸缩等平台级基础设施配置(C)。D 属于公司内部财务流程,与 GPU 技术兼容性无关,是明显的干扰项。