基于mps的pytorch 多实例并行推理

背景

大模型训练好后,进行部署时,发现可使用的显卡容量远大于模型占用空间 。是否可以同时加载多个模型实例到显存空间,且能实现多个实例同时并发执行?本次实验测试基于mps的方案,当请求依次过来时,多个相同的实例推理任务就可以同时运行。显然,该方法需要显卡测提供某种支持。这种就是 nvidia 的 Multi-Processing Services,即显卡多进程服务。一些网上公布的资料[1],主要是基于已经编译好的二进制程序在终端,通过指定不同的配置参数,如多进程数量,测试不同进程数执行同样的推理任务耗时,来证明mps对于并发推理任务的支持。本次实验基于Pytorch的模型仓库和多进程库,来实现类似的测试。

MPS的开启和关闭
# 服务开启
export CUDA_VISIBLE_DEVICES=0
nvidia-smi -i 0 -c 3 # -c 3 同 -c EXCLUSIVE_PROCESS
nvidia-cuda-mps-contrl -d

服务开启成功后并不会有任何显示,只有当运行一次任务后才能看到服务进程。
在这里插入图片描述

# 服务关闭
sudo nvidia-cuda-mps-control quit # 通常不能关闭mps服务,需要强制关闭
ps -ef | grep mps  # 查看mps的进程号
sudo kill -9 mps的进程号
Pytorch 多进程管理多个cuda流

nvidia显卡上的并发推理计算,是通过cuda流来管理的。在 mps 服务的模型中,cpu进程与cuda流的关系,可以总结为,一个cpu进程管理一个或多个流 [2]
在这里插入图片描述

一个流对应一个工作队列

一个流对应一个工作队列

客户端一个进程管理两个流

根据以上文献资料指导,编写基于Pytorch多进程客户端测试代码:

import torch
import torchvision
import time
import os
import torchvision.models as models
from PIL import Image
import copydevice = torch.device('cuda')# 装饰器,用于计算推理耗时
def getCompDuration(func):def warpper(*args, **kwargs):print("%s is running" % func.__name__)start = time.time()result = func(*args, **kwargs)end = time.time()computeTime = end - startprint('forward time cost: %.5f sec' %computeTime)return resultreturn wrapperdef getInputData(device = device):img = Image.open('your/data.jpg').convert('RGB')img = torchvision.transforms.ToTensor()(img)print(f'img:{img.shape}, rquires_grad:{img.requires_grad}')imgs = [img.to(device)]return imgs@getCompDuration
def modelForwardImage(input, model, nTimes, stream, device = device):pid = os.getpid()model.eval()for i in range(nTimes):with torch.no_grad(): # 非常重要,用于降低显存消耗predictions = model(input)pred = predictions[0]['boxes'].shapeprint(f'pid:{pid}, stream:{stream}, predict result:{pred}')def getModels(nProcess, device = device):modellist = []with torch.no_grad():model = models.detection.maskrcnn_resnet50_fpn(pretrained = False, pretrained_backbone = False)model.load_state_dict(torch.load('./your/dir/maskrcnn_resnet50_fpn_coco-bf2d0c1e.pth'))for i in range(nProcess):mod = copy.deepcopy(model)mod.to(device)modellist.append(mod)return modellistdef funcInStream(input, model, nTimes):stream = torch.cuda.Stream()with torch.cuda.stream(stream):modelForwardImage(input, model, nTimes, stream)def test(nTimes, nProcess):input = getInputData()# spwan是多任务的一种方式ctx = torch.multiprocessing.get_context('spawn')models = getModels(nProcess)pool = []for i in range(nProcess):p = ctx.Process(target = funcInStream, args = (input, models[i], nTimes))pool.append(p)for p in pool:p.start()if __name__ == '__main__':nTimes = 50nProcess = 2test(nTimes, nProcess)

以上代码,可分别控制循环执行nTimes次的maskrcnn的前向推理任务,和nProcess的进程数,观察单进程及多进程执行相同任务的计算耗时。同时可观察打开或者关闭mps服务下,单/多进程执行相同任务的耗时表现。这里提供关闭/开启mps服务后,一组不同控制变量下的耗时记录。

关闭mps服务下,统计不同任务、不同进程数下的耗时情况

nTimes/nProcess1 (单进程)/sec2 (双进程)/sec双进程耗时/单进程耗时
505.77(6.80, 5.69)1.08
10011.49(19.87, 18.49)1.67
20023.40(47.39, 46.01)1.99
40045.00(100.18, 98.80)2.21

开启mps服务下,统计不同任务、不同进程数下的耗时情况

nTimes/nProcess1 (单进程)/sec2 (双进程)/sec双进程耗时/单进程耗时
505.54(5.64, 5.48)1.00
10011.08(13.73, 13.36)1.22
20023.98(28.45, 27.53)1.17
40046.57(59.85, 59.89)1.29
400*44.59(killed, 44.21)0.99

补充实验 400*,在双进程运行期间,手动关闭一个进程,kill -9 进程号。另一个进程会正常运行直至结束,其运行时间会接近单进程运行时间。

终端运行结果部分展示
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

总结
  1. 不开启mps服务下,相同任务的双进程耗时是单进程耗时的2倍,说明双进程是串行运行的。符合预期。
  2. 开启mps服务下,相同让任务的双进程耗时是单进程耗时的1~1.3倍,说明两个进程在并发运行,但是有抢占某种资源的情况,无法做到接近单进程耗时,需要进一步研究。
参考文档

[1] 如何使用MPS提升GPU计算收益

[2] IMPROVING GPU UTILIZATION WITH MULTI-PROCESS SERVICE (MPS)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/188749.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

一种LED驱动专用控制电路方案

一、基本的概述 TM1651 是一种带键盘扫描接口的LED(发光二极管显示器)驱动控制专用电路,内部集成有MCU 数字接口、数据锁存器、LED 高压驱动、键盘扫描等电路。本产品性能优良,质量可靠。采用SOP16/DIP16的封装形式。 二、特性说…

整体迁移SVN仓库到新的windows服务器

一、背景 公司原有的SVN服务器年代比较久远经常出现重启情况,需要把SVN仓库重新迁移到新的服务器上,在网上也搜到过拷贝Repositories文件直接在新服务器覆盖的迁移方案,但考虑到原有的操作系统和现有的操作系统版本不一致,SVN版本…

获取窗口中文标题栏GetWindowText()

GetWindowText(hwnd, lpString, len)会根据传入的第二个参数lpString 判断是ASCII或者Unicode编码选择调用GetWindowTextA(hwnd, lpString, len),还是GetWindowTextW(hwnd, lpString, len),所以想获取中文标题直接调用GetWindowTextW() ASCII GetWindowT…

frp 配置内网访问

frp介绍 frp 是一个开源、简洁易用、高性能的内网穿透软件,支持 tcp, udp, http, https 等协议。frp 项目官网是 https://github.com/fatedier/frp 下载地址: https://github.com/fatedier/frp/releases frp工作原理 服务端运行,监听一个…

分治算法——75. 颜色分类

文章目录 🌿0. 分治🌻1. 题目🌼2. 算法原理🌴3. 代码实现 🌿0. 分治 分治分治,顾名思义分而治之,将一个大问题转换成若干个子问题,再将这些子问题的基础上继续划分成更小的子问题&a…

【新手解答3】深入探索 C 语言:头文件提供必要的接口、源文件保持实现细节的私有性 + 进一步学习的方向 + 如何快速编写程序并最终能制作小游戏

C语言的相关问题解答 写在最前面问题1:头文件提供必要的接口、源文件保持实现细节的私有性封装在头文件中的作用源文件中的“封装”总结 问题2:接下来的学习方向问题3:如何快速编写程序并最终能制作小游戏1. 基本编程概念2. 数组和基本算法3.…

PyQt基础_011_对话框类控件QMessage

基本功能 import sys from PyQt5.QtCore import * from PyQt5.QtGui import * from PyQt5.QtWidgets import *class WinForm( QWidget): def __init__(self): super(WinForm,self).__init__() self.setWindowTitle("QMessageBox") self.resize(300, 100) self.myButt…

EG20网口远程下载程序使用案例

EG20网口远程下载程序使用案例 前言:本文档主要说明了使用蓝蜂虚拟网络工具通过EG20网关的网口(LAN口)远程给PLC下载程序的步骤及其注意事项。使用蓝蜂虚拟网络工具,不仅支持程序的远程下载,同样支持程序的远程上传与…

爬虫源代码

public class Spider implements Runnable {private ArrayList urls; //URL列表private HashMap indexedURLs; //已经检索过的URL列表private int threads ; //初始化线程数 public static void main(String argv[]) throws Exception {if(argv[0] null){System.out.printl…

【SA8295P 源码分析】136 - QNX 如何抓取系统 log 方法 之 网络部分日志抓取方法

【SA8295P 源码分析】136 - QNX 如何抓取系统 log 方法 之 网络部分日志抓取方法 一、slog2info二、获取当前系统网络信息三、tracelogger四、qscan.sh : 用于收集 qnx 文件系统 权限、checksums 等信息系列文章汇总见:《【SA8295P 源码分析】00 - 系列文章链接汇总》 本文链…

【Node.js后端架构:MVC模式】基于expres讲解

Node.js后端架构:MVC模式 什么是MVC MVC (Model-View-Controller) 是一种软件设计模式,用于将应用程序的逻辑分离成三个不同的组件:模型、视图和控制器。 模型(Model)负责处理应用程序的数据逻辑。它负责从数据库或其…

21、LED点阵屏显示图形动画

c51的sfr、sbit sfr:特殊功能寄存器声明 例如:sfr P00x80 声明P0口寄存器,物理地址为0x80 sbit:特殊位声明 例如:sbit p0_1 0x81; 或 sbit p0_1 p0^1; 声明P0寄存器的第一位 可位寻址、不可位寻址:在单片机系统中,操…

JS事件循环详解

前言 进程 程序运行需要其专属的内存空间,可以把这块内存空间简单理解为进程。 下图每个颜色块都可视为一个应用,每个应用至少应有一个进程,进程之间相互独立,即使想要通信,也需要双方同意。 线程 有了进程后&…

二次元检测设备导轨修复指南

二次元检测设备是一种高精度的测量仪器,用于检测物体表面的形状、尺寸和精度等。直线导轨是二次元检测设备中最重要的组成部分之一,它的精度和稳定性直接影响到设备的测量结果和可靠性,因此,对导轨进行修复和保养是非常重要的。 直…

基于Java SSM移动电源租赁系统

涉及的知识点:Java程序设计基础知识、类的创建、对象的使用、面向对象继承、面向对象多态性、抽象类和接口、集合与泛型、文件与输入输出流操作、异常处理与日志记录、Java GUI 、事件处理、Java数据库编程。 一、实验目的 (1)掌握Java编程…

Linux删除了大文件为什么磁盘空间没有释放?

某天,收到监控系统的告警信息,说磁盘空间占用过高,登上服务器,使用 df -h 一看,发现磁盘占用率已经 96%了: 通过查看 /usr/local/nginx/conf/vhost/xxx.conf 找到 access_log 和 error_log 的路径&#x…

Android 7.1 点击清空全部按钮清空一切运行进程(包括后台在播音乐)

Android 7.1 点击清空全部按钮清空一切运行进程(包括后台在播音乐) 近来收到客户反馈说音乐在后台播放时点击“清空全部”按钮后台音乐没有被kill掉,仍在播放,需要在点击“清空全部”后kill掉一切后台运行进程,具体修…

SDX12 上层应用gdb调试及环境搭建

SDX12 上层应用gdb调试及环境搭建 1. 问题背景2 环境搭建3 操作步骤4. 调试过程5 实现效果6 附录 1. 问题背景 上层应用在问题定位的过程中,现有手段只能有有限的log打印,通常情况下很难定位问题。如果想在应用程序执行的过程中查看任意调用关系或者数据…

6.1810: Operating System Engineering <Lab2 syscall: System calls>

课程链接:6.1810 / Fall 2023 一、本节任务 二、要点 操作系统要满足三要素:并发、隔离、交互(multiplexing, isolation, and interaction)。 宏内核(monolithic kernel):是操作系统核心架构…

temu上新待确认在哪里点

在Temu平台上,作为卖家,您可能需要上架新的商品以吸引更多的买家。下面是一般的步骤,但请注意,不同平台的操作可能略有不同,具体请参考Temu官方的帮助文档或联系客服。 先给大家推荐一款拼多多/temu运营工具——多多情…