推理服务的 GPU 资源池化管理:基于 CUDA MPS 的多模型混部与隔离策略
推理服务的 GPU 资源池化管理基于 CUDA MPS 的多模型混部与隔离策略一、三张 A100 跑 5 个模型GPU 显存碎片导致总有模型加载失败在一个多模型推理服务的部署中。需要在 3 张 A100每张 80GB上部署 5 个模型。模型的显存需求分别为 45GB、30GB、25GB、20GB、15GB含 KV Cache。单看总显存 240GB 总需求 135GB。但实际部署时显存碎片导致总有模型无法加载。问题在于默认的 GPU 分配策略是按整卡分配。每个模型独占一张或多张 GPU。45GB 模型需要独占一张 80GB 卡。30GB 和 25GB 模型无法共存于同一张卡。20GB 和 15GB 模型可以共享一张。3 张卡不够分。出现了一张卡上有大量空闲显存却无法利用的情况。这就是 GPU 资源池化要解决的问题。通过 CUDA MPSMulti-Process Service或 MIGMulti-Instance GPU。让多个模型在一张 GPU 上共享计算资源和显存。实现细粒度的资源复用。二、CUDA MPS 与 MIG 的架构对比与适用场景两种 GPU 虚拟化技术有根本不同的设计目标。graph TD A[GPU 资源池化策略] -- B[CUDA MPSbr/多进程服务] A -- C[MIGbr/多实例 GPU] subgraph MPS 特性 B -- B1[逻辑空间共享] B -- B2[显存共享计算时分复用] B -- B3[故障隔离弱一个进程的 CUDA 错误影响全局] B -- B4[性能可通过 MPS 控制并发度] end subgraph MIG 特性 C -- C1[物理切分 GPU] C -- C2[显存和算力硬隔离] C -- C3[故障隔离强实例间完全独立] C -- C4[性能分配后不可动态调整] end subgraph 适用场景 D1[MPS: 模型需要弹性资源br/同质化计算负载] D2[MIG: 模型需要硬隔离br/多租户严格隔离] end B -- D1 C -- D2CUDA MPS 是一种软件层面的多进程共享机制。多个 CUDA 进程的逻辑上下文通过 MPS Server 合并。MPS Server 将不同进程的 CUDA Kernel 在时间维度上交错执行。显存空间是共享的。没有硬性的显存隔离。MIG 是硬件层面的切分A100/A30/H100 支持。将一张 GPU 物理切分为多个独立实例。每个实例有独立的显存、缓存和计算单元。实例间完全隔离一个实例的崩溃不影响其他实例。关键差异在于隔离性和灵活性。MPS 提供更高的资源利用率因为共享更灵活。但隔离性差。MIG 提供强隔离。但切分后不能动态调整。如果需要在一个 GPU 实例上同时跑大小差异大的模型。MPS 更合适。如果需要多租户严格隔离。MIG 是更好的选择。三、基于 MPS 的资源调度实现#!/bin/bash # GPU 资源池化管理脚本 # 目标在有限 GPU 资源上部署多个模型 # # 阶段一启用 CUDA MPS # # 设置 MPS 守护进程 export CUDA_VISIBLE_DEVICES0 # 启动 MPS Control Daemon nvidia-cuda-mps-control -d # 验证 MPS 是否启动 echo get_server_list | nvidia-cuda-mps-control # 设置 MPS 的活跃线程百分比 # 为什么限制 80%预留 20% 给操作系统和系统守护进程 echo set_default_active_thread_percentage 80 | nvidia-cuda-mps-control # # 阶段二模型部署分配策略 # # GPU 0 (80GB)部署两个模型 # Model A: 45GB 4GB KV Cache 49GB # Model B: 25GB 2GB KV Cache 27GB # Total: 76GB / 80GB利用率 95% CUDA_VISIBLE_DEVICES0 ollama serve --model llama3:70b-q4 CUDA_VISIBLE_DEVICES0 ollama serve --model qwen2:14b-q4 # GPU 1 (80GB)部署两个模型 # Model C: 30GB 3GB KV Cache 33GB # Model D: 20GB 2GB KV Cache 22GB # Model E: 15GB 2GB KV Cache 17GB # Total: 72GB / 80GB利用率 90% CUDA_VISIBLE_DEVICES1 ollama serve --model mistral:7b-q8 CUDA_VISIBLE_DEVICES1 ollama serve --model qwen2:7b-q4 CUDA_VISIBLE_DEVICES1 ollama serve --model bge-large:fp16 # # 阶段三显存监控与告警 # # 持续监控脚本 monitor_gpu_memory() { while true; do echo $(date) nvidia-smi --query-gpuindex,name,memory.used,memory.free,utilization.gpu \ --formatcsv,noheader # 检查显存使用是否超过阈值 USED$(nvidia-smi --query-gpumemory.used --formatcsv,noheader,nounits -i 0) if [ $USED -gt 76000 ]; then # 76GB / 80GB 95% echo 警告GPU 0 显存使用超过 95% # 触发告警发送到监控系统 fi sleep 30 done } monitor_gpu_memory /// GPU 资源管理器 /// /// 职责 /// 1. 追踪每张 GPU 的显存使用情况 /// 2. 为模型分配最优的 GPU /// 3. 在显存不足时触发降级或驱逐策略 use std::collections::HashMap; use std::sync::Arc; use tokio::sync::RwLock; #[derive(Debug, Clone)] struct GpuInfo { gpu_id: usize, total_memory_mb: u64, free_memory_mb: u64, utilization_percent: u32, /// 此 GPU 上当前运行的模型 models: VecString, } #[derive(Debug, Clone)] struct ModelRequirement { model_name: String, /// 模型所需显存含 KV Cache required_memory_mb: u64, /// 是否需要独占 GPU exclusive: bool, /// 优先级数字越小优先级越高 priority: u32, } /// GPU 资源池管理器 struct GpuResourcePool { gpus: ArcRwLockVecGpuInfo, /// 模型到 GPU 的映射 model_placement: ArcRwLockHashMapString, usize, } impl GpuResourcePool { /// 为模型分配 GPU /// /// 分配策略 /// 1. 优先查找已有模型的 GPU提高利用率 /// 2. 使用 Best-Fit 算法减少碎片 /// 3. 独占模型跳过共享 GPU async fn allocate_gpu( self, requirement: ModelRequirement, ) - Resultusize, String { let gpus self.gpus.read().await; if requirement.exclusive { // 独占模型找一张空闲的 GPU for gpu in gpus.iter() { if gpu.models.is_empty() gpu.free_memory_mb requirement.required_memory_mb { return Ok(gpu.gpu_id); } } return Err(无空闲 GPU 可用于独占模型.to_string()); } // 共享模型Best-Fit 算法 // 优先选择已有模型的 GPU提高资源利用率 let mut best_fit: Optionusize None; let mut best_waste u64::MAX; for gpu in gpus.iter() { if gpu.free_memory_mb requirement.required_memory_mb { let waste gpu.free_memory_mb - requirement.required_memory_mb; // 偏好已有模型的 GPU 空闲 GPU let score if gpu.models.is_empty() { waste 1024 // 惩罚空闲 GPU鼓励共享 } else { waste }; if score best_waste { best_waste score; best_fit Some(gpu.gpu_id); } } } best_fit.ok_or_else(|| { format!( 模型 {} 需要 {}MB 显存所有 GPU 均无足够空间, requirement.model_name, requirement.required_memory_mb ) }) } /// 显存不足时的降级策略 /// /// 选项 /// 1. 减少低优先级模型的 KV Cache 大小 /// 2. 卸载低优先级模型Swapping /// 3. 拒绝新模型加载 async fn handle_oom(self, gpu_id: usize, shortage_mb: u64) - Result(), String { let mut gpus self.gpus.write().await; let mut placements self.model_placement.write().await; if let Some(gpu) gpus.iter_mut().find(|g| g.gpu_id gpu_id) { // 查找可降级的低优先级模型 // 此处简化卸载第一个非独占模型 let evict_model gpu.models.iter() .find(|name| !name.contains(high-priority)) .cloned(); if let Some(model) evict_model { gpu.models.retain(|m| m ! model); placements.remove(model); gpu.free_memory_mb shortage_mb; // 简化计算 Ok(()) } else { Err(无可降级模型GPU 显存不足.to_string()) } } else { Err(GPU 未找到.to_string()) } } }分配策略采用 Best-Fit 算法。在各种碎片化的显存空洞中选择最紧凑的那个。这减少了显存碎片的产生。惩罚系数鼓励模型共享 GPU。将多个小模型放在同一张卡上。为独占模型保留整张空闲卡。OOM 处理中的降级策略是生产环境必需的容错机制。当显存不足时优先减少低优先级模型的 KV Cache 或卸载。而不是让新部署直接失败。四、MPS 的隔离缺陷与生产级注意事项MPS 的资源共享带来了利用率的好处。但引入了隔离性的风险。首先是故障传播。在 MPS 模式下一个 CUDA 进程的致命错误如非法内存访问、越界 Kernel可能导致 MPS Server 崩溃。进而影响同一 GPU 上所有其他进程。需要额外的进程监控和自动重启机制。其次是性能干扰。共享 GPU 的竞争可能导致表现不稳定的延迟抖动。当高优先级模型推理时。如果低优先级模型的 Kernel 正在执行。高优先级模型需要等待。MPS 不提供优先级调度。需要通过限制低优先级模型的并发度来间接控制。第三是 MPS 和 MIG 不能同时使用。这是硬件层面的限制。需要在规划和设计阶段就做出选择。最后是资源碎片随时间恶化。随着模型的加载和卸载。显存中产生不可用的小碎片。类似于操作系统的内存碎片问题。定期或在低峰期执行模型的卸载和重新加载。可以整理碎片。五、总结CUDA MPS 通过软件层面多进程共享 GPU。实现显存和算力的细粒度复用。提高 GPU 利用率。MIG 通过硬件切分提供强隔离。适合多租户场景。但不能动态调整分配。GPU 池化分配采用 Best-Fit 算法减少显存碎片。并惩罚空闲 GPU 鼓励模型共享。MPS 的故障隔离性弱。一个 CUDA 进程的错误可能影响同 GPU 上所有进程。需要进程监控和自动重启。定期模型重新加载可以整理显存碎片。建议在低峰期执行。避免影响在线服务。

相关新闻

苹果18硬件升级:本地AI开发与高性能计算实践指南

苹果18硬件升级:本地AI开发与高性能计算实践指南

🚀 30款热门AI模型一站整合,DeepSeek/GLM/Qwen 随心用,限时 5 折。 👉 点击领海量免费额度 这次我们来看苹果18系列带来的技术升级,重点不是参数堆砌,而是这些改进对开发者、内容创作者和普通用户的实际…

2026/7/9 0:14:37阅读更多 →
终极指南:如何用LocalVocal为OBS Studio添加本地AI实时字幕

终极指南:如何用LocalVocal为OBS Studio添加本地AI实时字幕

终极指南:如何用LocalVocal为OBS Studio添加本地AI实时字幕 【免费下载链接】obs-localvocal OBS plugin for local speech recognition and captioning using AI 项目地址: https://gitcode.com/gh_mirrors/ob/obs-localvocal 你是否曾为直播或录播内容添加…

2026/7/9 0:14:37阅读更多 →
STM32与CMT-8540S音频模块开发实战

STM32与CMT-8540S音频模块开发实战

1. STM32F107VC与CMT-8540S-SMT的硬件组合解析在嵌入式音频开发领域,STM32F107VC微控制器与CMT-8540S-SMT音频模块的组合堪称黄金搭档。STM32F107VC基于ARM Cortex-M3内核,主频72MHz,内置256KB Flash和64KB SRAM,其丰富的外设接口…

2026/7/9 0:09:37阅读更多 →
写爬虫最重要的事永远是合规和安全

写爬虫最重要的事永远是合规和安全

很多中小团队和初创公司,做数据采集最容易踩的坑,就是盲目追求低成本,这次NetNut被FBI关停就是最真实的反面教材。小团队预算有限,总想能省则省,觉得大平台溢价太高,低价代理性价比更高,却忽略了…

2026/7/9 1:09:41阅读更多 →
工业品企业AI品牌推广难点拆解:专业术语内容生产与AI抓取匹配度优化

工业品企业AI品牌推广难点拆解:专业术语内容生产与AI抓取匹配度优化

工业品企业在进行企业AI推广时,核心难点不在于“有没有内容”,而在于“AI能不能准确理解并引用你的专业内容”。与C端消费品不同,工业品涉及大量非标参数、行业黑话和复杂应用场景,通用大模型极易产生幻觉或忽略关键信息。如果你正…

2026/7/9 1:09:41阅读更多 →
i.MX RT1170 1GHz vs RT1021 500MHz:5 大维度实测对比与选型指南

i.MX RT1170 1GHz vs RT1021 500MHz:5 大维度实测对比与选型指南

i.MX RT1170 1GHz vs RT1021 500MHz:5 大维度实测对比与选型指南 在嵌入式系统开发中,选择合适的微控制器往往决定了项目的成败。NXP的i.MX RT系列凭借其跨界MCU的特性,在工业控制、物联网和边缘计算等领域广受欢迎。本文将深入对比该系列中的…

2026/7/9 1:09:41阅读更多 →
mp3录音快速转文稿好用APP对比:5款主流工具实测与场景解析

mp3录音快速转文稿好用APP对比:5款主流工具实测与场景解析

开会时语速太快来不及记笔记?整理访谈录音耗费大量时间?寻找一款好用的会议录音app,将音频快速转化为结构化文稿,已成为现代职场提升效率的刚需。本文基于真实使用场景,对市面上5款主流录音转文字工具进行客观对比&…

2026/7/9 1:09:41阅读更多 →
AIGC检测到底是什么原理?搞懂这三点,论文AI疑似率轻松控制在安全线以内

AIGC检测到底是什么原理?搞懂这三点,论文AI疑似率轻松控制在安全线以内

一、先搞清楚一件事:AIGC检测不是在"读"你的论文 很多同学误以为AIGC检测系统像导师一样在"阅读理解"你的论文内容。实际上完全不是。 AIGC检测系统做的事,更像一个笔迹鉴定专家。 笔迹鉴定专家不需要读懂信的内容,他…

2026/7/9 1:09:41阅读更多 →
3步掌握VASPsol:免费开源的VASP隐式溶剂模型完整指南

3步掌握VASPsol:免费开源的VASP隐式溶剂模型完整指南

3步掌握VASPsol:免费开源的VASP隐式溶剂模型完整指南 【免费下载链接】VASPsol Solvation model for the plane wave DFT code VASP. 项目地址: https://gitcode.com/gh_mirrors/va/VASPsol 想要在VASP密度泛函理论计算中考虑溶剂效应,却担心计算…

2026/7/9 1:04:41阅读更多 →
从GitHub安全案例解析常见漏洞与防护实践

从GitHub安全案例解析常见漏洞与防护实践

1. 项目概述:从GitHub Trending看安全实战 最近在GitHub Trending上看到一个项目,叫 skills4/skills ,它因为一些安全漏洞案例被大家讨论。这其实是一个挺典型的场景:一个旨在展示或教授某种技能的仓库,本身却成了安…

2026/7/8 5:12:14阅读更多 →
MLT 2026启示:因果推理与概率建模驱动下一代LLM应用

MLT 2026启示:因果推理与概率建模驱动下一代LLM应用

# MLT 2026启示:因果推理与概率建模驱动下一代LLM应用## 一、背景与挑战:从“黑箱预测”到“可信推理”2026年6月,第7届机器学习与趋势国际会议(MLT 2026)将在悉尼召开。会议议程中,“因果与可解释机器学习…

2026/7/8 7:00:12阅读更多 →
通达OA SQL注入漏洞深度剖析:从手工注入到自动化利用与防御

通达OA SQL注入漏洞深度剖析:从手工注入到自动化利用与防御

1. 项目概述与漏洞背景最近在梳理一些历史OA系统的安全风险时,通达OA v11.6版本中的一个老漏洞又进入了我的视线。这个漏洞位于/general/bi_design/appcenter/report_bi.func.php文件中,是一个典型的SQL注入点。虽然这个漏洞的利用方式看起来并不复杂&am…

2026/7/8 2:26:06阅读更多 →
Three.js 着色器光效教程

Three.js 着色器光效教程

着色器光效 Shader Light ▶ 在线运行案例 案例合集: 三维可视化功能案例(threehub.cn)开源仓库github地址: https://github.com/z2586300277/three-cesium-examples400个案例代码: 网盘链接 你将学到什么 ShaderMaterial 自…

2026/7/9 0:04:37阅读更多 →
如何5分钟掌握CS2智能库存管理:开源工具CASEMOVE终极指南

如何5分钟掌握CS2智能库存管理:开源工具CASEMOVE终极指南

如何5分钟掌握CS2智能库存管理:开源工具CASEMOVE终极指南 【免费下载链接】casemove A dedicated desktop app that enables you to move items in and out of storage units in CS2. 项目地址: https://gitcode.com/gh_mirrors/ca/casemove 还在为CS2存储单…

2026/7/9 0:04:37阅读更多 →
GBase 8a vs MySQL 8.0:ALTER TABLE语法与限制的5点关键差异对比

GBase 8a vs MySQL 8.0:ALTER TABLE语法与限制的5点关键差异对比

GBase 8a与MySQL 8.0:ALTER TABLE语法差异深度解析与实战指南1. 两种数据库的ALTER TABLE能力全景对比在数据库架构设计和运维过程中,表结构变更(DDL操作)是不可避免的需求。GBase 8a作为国产分析型数据库代表,与开源M…

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

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

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

2026/7/8 6:59:54阅读更多 →
Coze与Dify对比指南:低代码AI应用开发从入门到实战

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

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

2026/7/8 13:42:39阅读更多 →
AI生图工具怎么选?2026年6月版实测对比

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

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

2026/7/8 13:42:39阅读更多 →