GPU并行效率问题——通过MPS提升GPU计算收益

news2024/11/16 8:28:49

现象描述

使用V100_32G型号的GPU运行计算程序时,发现程序每5秒能够完成一次任务,耗费显存6G。

鉴于V100 GPU拥有32G的显存,还有很多空闲,决定同时运行多个计算程序,来提升GPU计算收益。

然而,这一切都是想当然的。运行多个计算程序时,每个计算程序的处理耗时大大增加。例如,同时运行4个计算程序,则这些计算程序差不多需要20秒才能完成一次任务,几乎是单进程运行时的4倍,算上并行的收益,20秒能够处理4个任务,这和单进程的计算程序的运行效果几乎没有区别,也就是说,多进程并行和单进程运行完全没有效率的提升。

单进程:

5秒/任务

4进程:

20秒/任务

问题原因

一种可能的解释是,当前的计算程序对GPU的利用率很高,单进程执行时已经几乎占用全部的GPU计算核心,因此,多进程执行实际上也只相当于单进程执行,但事实并非如此。

与单核CPU的调度方式类似,在单一时间片内,GPU中只会有一个GPU进程在运行,当多个进程同时把CUDA任务发射到GPU时,GPU使用时间片轮转调度的方式,多个GPU进程之间在微观层面上是交替运行的。这也导致,在某一个时间片内,如果正在运行的GPU进程没有很好地利用计算资源,那么空闲的计算资源就是浪费掉的。也就是说,GPU并没有真正地进行并发计算。再加上不同进程的上下文切换,也带来了更多的时间开销。

MPS简介

Nvidia针对多进程并发执行的场景推出了多进程服务解决方案-MPS,该方案可以做到空分复用。

MPS的运行模式为一个MPS Server和多个MPS Client。MPS Server通过一个CUDA Context管理GPU硬件资源,每个MPS Client对应一个GPU进程,多个MPS Client会将它们的任务通过MPS Server传入GPU,MPS Server可以把多个进程的上下文进行融合,合并后的进程将多个进程的Kernel交织到一起进行发射,从而越过了硬件时间分片调度的限制,使得它们的CUDAkernels实现真正意义上的并行,这可以带来以下好处:

> 进程之间无需上下文切换,减少了上下文切换的开销。

> 同一个时间片里,多个进程的kernel一起执行,提升了GPU计算资源的利用率。

MPS在单进程对GPU利用率不高的情况下是非常有用的,MPS的缺点则在于故障隔离问题,本文忽略。

MPS的使用

1. 启动MPS。

a. 设置GPU计算模式为exclusive mode。

设置GPU compute mode 为 exclusive mode (非必须,但推荐设置,设置后有可能使得原本正常的计算程序运行失败)

nvidia-smi -i 0 -c EXCLUSIVE_PROCESS

注意:

执行该设置需要root权限。

除非使用-i参数指定单个GPU,否则将影响所有GPU。

此操作的效果立即生效,但它不会在主机重新启动后持续存在,主机重新启动后,计算模式将重置为“DEFAULT”。

补充说明:

-c选项设置目标GPU的计算模式。计算模式标志指示单个或多个计算应用程序是否可以在GPU上运行。

0/Default:表示每个设备允许多个上下文。

1/Exclusive_Thread:已弃用,改用 Exclusive_Process。

2/Prohibited:表示每台设备不允许使用任何上下文(无计算应用程序)。

3/Exclusive_Process:表示每个设备只允许一个上下文,一次可从多个线程使用。

b. 启动MPS守护进程。

服务器中有多个GPU时,选择特定的GPU运行程序可在程序运行命令前使用:CUDA_VISIBLE_DEVICES=0命令。0为服务器中的GPU编号,可以为0, 1, 2, 3等,表明对程序可见的GPU编号。

CUDA_VISIBLE_DEVICES=1

只有编号为1的GPU对程序是可见的,在代码中gpu[0]指的就是这块GPU

CUDA_VISIBLE_DEVICES=0,2,3

只有编号为0,2,3的GPU对程序是可见的,在代码中gpu[0]指的是第0块,gpu[1]指的是第2块,gpu[2]指的是第3块

CUDA_VISIBLE_DEVICES=2,0,3

只有编号为0,2,3的GPU对程序是可见的,但是在代码中gpu[0]指的是第2块,gpu[1]指的是第0块,gpu[2]指的是第3块

首先设置CUDA变量:

export CUDA_VISIBLE_DEVICES=0

export CUDA_MPS_PIPE_DIRECTORY=/tmp/nvidia-mps

(cuda 7.0以后非必须)

export CUDA_MPS_LOG_DIRECTORY=/tmp/nvidia-log

(cuda 7.0以后非必须)

启动mps:

nvidia-cuda-mps-control -d

查看MPS 守护进程是否正在运行:

ps -ef | grep mps

此时可以看到一个mps进程:

root 1826 1 0 Nov27 ? 00:00:04 nvidia-cuda-mps-control -d

接着运行计算程序,并再次查看mps进程,此时可以看到多出了一个mps-server进程:

root 1826 1 0 Nov27 ? 00:00:04 nvidia-cuda-mps-control -d

root 2544 1826 0 Nov27 ? 00:00:43 nvidia-cuda-mps-server

2. 关闭MPS。

关闭mps-control:

echo quit | nvidia-cuda-mps-control

让GPU计算模式恢复为默认模式:

nvidia-smi -i 0 -c DEFAULT

3. Volta MPS资源配置。

nvidia-cuda-mps-control

set_default_active_thread_percentage 10

该命令为每个MPS Client限制10%的threads。不是为每个Client预留专用资源,而是限制它们可以最多使用多少threads。默认情况下,每个Client可以获取所有threads(即100%)。

4. MPS与docker。

为了配合MPS的使用,docker在创建容器时需要通过

--ipc=host

参数启用内存共享:

docker run -itd --gpus all --ipc=host --network host -p 5501:5501 -v /mnt/data/enhancefox:/home/server-v /etc/timezone:/etc/timezone -v /etc/localtime:/etc/localtime --name enhancefox vsr_trt

注意:

在没有启动MPS的情况下,这样创建的容器仍然能够正常运行(非MPS模式);此时,在启动mps之后,即使重启docker中的程序,该程序仍然不会以mps模式运行。要以mps模式运行程序,必须重启docker:

docker restart enhancefox

5. 如何查看GPU进程是否处于MPS模式?

通过NVIDIA的nvidia-smi命令我们可以知道显卡上的任务可以分为图形图像任务和计算任务两种,其中图形图形任务类型为Graphic,计算任务类型(Type)为compute,缩写分别为G和C,在使用nvidia-smi命令后我们可以通过查看process内容知道不同的进程是属于G类型还是C类型。当启用MPS之后,Type将会对应地变为M+G或者M+C:

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

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

相关文章

Kotlin新手教程一(Kotlin简介及环境搭建)

目录一、 什么是Kotlin?二、为什么要使用Kotlin?三、使用IntelliJ IDEA搭建Kotlin四、Kotlin使用命令行编译一、 什么是Kotlin? Kotlin 是一种在 Java 虚拟机上运行的静态类型编程语言,它也可以被编译成为 JavaScript 源代码&…

IDEA入门安装使用教程

一、背景 作为一个Java开发者,有非常多编辑工具供我们选择,比如Eclipse、IntelliJ IDEA、NetBeans、Visual Studio Code、Sublime Text等等,这些有免费也有收费的,但是就目前市场占比来说普遍使用Eclipse和IntelliJ IDEA这两款主…

字节软件测试岗:惨不忍睹的三面,幸好做足了准备,月薪19k,已拿offer

我今年25岁,专业是电子信息工程本科,19年年末的时候去面试,统一投了测试的岗位,软件硬件都有,那时候面试的两家公司都是做培训的,当初没啥钱,他们以面试为谎言再推荐去培训这点让我特别难受。后…

让huggingface/transformers的AutoTokenizer从本地读词表

https://stackoverflow.com/questions/62472238/autotokenizer-from-pretrained-fails-to-load-locally-saved-pretrained-tokenizer

ArcGIS网络分析之构建网络分析数据集(一)

说明: 1. 本文主要用于演示网络分析服务的搭建过程。所以在此不会深入讨论网络分析服务的每一个细节,本文的目的就是让初学者学会使用网络分析服务进行基本的分析(主要针对后续的WEB开发):路径分析,最近设施点分析,以及服务区分析。 2.关于OD成本矩阵分析,多路径配送,…

如何解决 Python 错误 NameError: name ‘X‘ is not defined

Python“NameError: name is not defined”发生在我们试图访问一个未定义的变量或函数时,或者在它被定义之前。 要解决该错误,需要确保我们没有拼错变量名并在声明后访问它。 确保你没有拼错变量或函数 下面是产生上述错误的示例代码。 employee {na…

【MySQL进阶】SQL优化

😊😊作者简介😊😊 : 大家好,我是南瓜籽,一个在校大二学生,我将会持续分享Java相关知识。 🎉🎉个人主页🎉🎉 : 南瓜籽的主页…

论文阅读笔记《Common Visual Pattern Discovery via Spatially Coherent Correspondences》

核心思想 两组点集中共有的匹配区域通常具备两个特点:1.局部的特征相似;2.特征点在空间上的分布也相似。作者将候选匹配点对作为图的节点,将两种相似性统一到边的权重来表示。通过寻找图中稠密连接的子图来寻找两个点集中的匹配区域&#xff…

2023年浙江建筑特种工(施工升降机)真题题库及答案

百分百题库提供特种工(施工升降机)考试试题、特种工(施工升降机)考试预测题、特种工(施工升降机)考试真题、特种工(施工升降机)证考试题库等,提供在线做题刷题,在线模拟考…

大数据DataX(一):DataX的框架设计和插件体系

文章目录 DataX的框架设计和插件体系 一、DataX是什么

Python客户端使用SASL_SSL连接Kafka需要将jks密钥转换为pem密钥,需要转化成p12格式再转换pem才能适配confluent_kafka包

证书生成 生成证书以及jks参考以下文章 https://blog.csdn.net/qq_41527073/article/details/121148600 证书转换jks -> pem 需要转化成p12以下转换才能适配confluent_kafka包,直接jks转pem会报错不能使用,具体参考以下文章 https://www.ngui.cc/z…

我的Android启动优化—【黑白屏优化】

简述 在Android App使用过程中,对于应用的优化是一个加分项,举个例子,打开你的App需要2秒,人家0.5秒,这就是很大的用户体验上的优化。 问题的产生 在开发中,我们在启动app的时候,屏幕会出现一…

C语言之函数

函数不可嵌套定义&#xff0c;函数之间为平行关系#include<stdio.h> //比较大小 int max(int x,int y){int z;if(x>y){zx;}else{zy;}return z;//带返回值 }//不带参数 void help(void){printf("**********hello********\n"); }int main(){int num;nummax(3,…

Kubernetes集群编排工具helm3 工作学习记录

文章目录1. helm 介绍、组件、安装和目录结构1.1 helm 介绍1.2 helm 组件1.2.1 helm2 和 helm3 的区别1.3 helm 安装1.4 helm 目录结构2. 编写一个chart 和 helm3 内置对象讲解2.1 创建编写一个chart2.1.1 创建chart,引用内置对象的变量值2.1.2 helm通过各种类型chart包安装一个…

微信上线外卖小程序“门店快送”

我是卢松松&#xff0c;点点上面的头像&#xff0c;欢迎关注我哦&#xff01; 抖音入局外卖&#xff0c;微信都开始下场做外卖了&#xff0c;难道都知道这块儿特赚钱吗&#xff0c;只能说如今大环境还是不太好&#xff0c;南山必胜客都开始搞兼职了…… 2月15日&#xff0c;有…

【管理您的整个软件供应链】上海道宁与​Sonatype助力您以更安全的开源更快地交付产品

Sonatype是 美国一家开源DevOps服务供应商 支持开源组件&#xff08;中央仓&#xff09; 为开发者提供资源库管理器&#xff08;Nexus&#xff09; 帮助加速软件创新 配备Nexus产品的组织 可以做出更好的决策 更快地进行大规模创新 并且知道他们的应用程序 始终由最高质…

微电影的行业痛点有哪些?

微电影全称微型电影&#xff0c;又称微影。是指能够通过互联网新媒体平台传播&#xff08;几分钟到60分钟不等&#xff09;的影片&#xff0c;适合在移动状态、短时休闲状态下观看&#xff0c;具有完整故事情节的“微(超短)时”(几分钟-60分钟)放映、“微(超短)周期制作(7-15天…

iOS开发framework和demo 使用cocoapod方法集成三方库

使用workspace。workspace相当于项目管理&#xff0c;创建workspace形成的文件是.xcworkspace。使用 一、xcode创建workspace并放入SDKFramework文件夹内&#xff0c;如图 选择File → new→Workspace → 点击save 这时候文件夹中就多了 SDKFramework.xcworkspace 文件 1-4.p…

功率放大器在MEMS微结构模态测试研究中的应用

实验名称&#xff1a;功率放大器在MEMS微结构模态测试研究中的应用研究方向&#xff1a;元器件测试测试目的&#xff1a;随着MEMS器件在各个领域中广泛应用&#xff0c;对微结构进行模态测试获得其动态特性参数对微结构的设计、仿真、制造、以及质量控制和评价等方面具有十分重…

机器学习:self-attention

输入 编码方式&#xff1a; one-hot:word-embedding:能更明显的区分不同类别的输入 图也能看作是多个向量输入 输出 每个向量都有一个label 一整个sequence有一个label 模型自己决定有多少个label&#xff08;sequence to sequence&#xff09; 重点介绍每个vector有一个…