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

这篇具有很好参考价值的文章主要介绍了GPU并行效率问题——通过MPS提升GPU计算收益。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

现象描述

使用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:

cuda mps,运维,nvidia,gpu,mps,docker,Powered by 金山文档

文章来源地址https://www.toymoban.com/news/detail-559688.html

到了这里,关于GPU并行效率问题——通过MPS提升GPU计算收益的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 《GPU并行计算与CUDA编程》笔记

    方法一:直接做累加(错误) 方法二:原子相加(分组bins越少,并行化程度越低,方法二适合用于分组bins很多的时候) 方法三:局部直方图 第一步:并行计算局部直方图; 第二步:把所有局部直方图每个分组bin使用Reduction(归约)并行累加起来行程一个总的直方图。

    2024年02月14日
    浏览(42)
  • 看板管理解析:如何通过看板提升项目管理效率?

    在目前市面上的项目管理工具中,项目看板功能基本上成为了标配。看板作为敏捷的项目管理工具,可以帮助我们将项目工作可视化展现。 1, 提高团队信息流动性 :看板工具可以及时的传递项目工作中的最新讯息,保证团队接受信息的一致性,统一团队想法。 2, 提高信息

    2024年02月05日
    浏览(56)
  • 解放计算力:使用并行处理提升python for循环速度

    Python 是一门功能强大的编程语言,但在处理大规模数据或复杂计算任务时,性能可能成为一个瓶颈。幸运的是,Python 提供了多种方法来提升性能,其中之一是利用并行处理来加速循环操作。本文将介绍如何使用并行处理技术来优化 for 循环,从而提高 Python 程序的执行速度。

    2024年02月10日
    浏览(50)
  • 数据仓库建设实践——如何通过数据仓库建设提升效率并确保数据质量

    作者:禅与计算机程序设计艺术 随着互联网经济的快速发展,全球消费者对汽车的需求越来越旺盛。在全球范围内,公共汽车运营商(PSA)正在竞争激烈,包括美国的Tesla、上海的东风、中国的福特等。全球公共汽车市场规模每年呈现爆炸性增长态势。其中,美国曾经的领先地

    2024年02月11日
    浏览(85)
  • 提升您的业务效率:如何通过API集成自动化工具

    在当今快节奏的商业环境中,企业正面临着提高效率和降低成本的双重压力。随着数字化转型的不断深入,越来越多的组织开始寻求技术解决方案来应对这些挑战。API(应用程序编程接口)的集成是实现业务流程自动化的关键步骤之一,它可以帮助企业更高效地管理和分析数

    2024年02月20日
    浏览(42)
  • 【MacOS】MacBook使用本机m1芯片GPU训练的方法(mps替代cuda)

    记录: 对于tensorflow环境配置,即使替换了M1适配的anaconda,使用苹果官方适配m1的tensorflow安装命令,仍旧出现各种问题,可见现在的M1版anaconda还是存在很大问题。所以在屡次不服气的碰壁下我还是改用了miniforge3…真香! so,建议使用miniforge3管理,miniforge3可以理解成 minicon

    2024年02月05日
    浏览(42)
  • 微调 LLaMA 2 模型:通过 QLoRA 充分利用单 GPU 效率 Meta LLaMA 2 微调过程综合指南

    科技巨头 Meta 于 2023 年 7 月 18 日发布了 LLaMA 2,这是他们最新版本的大型语言模型 (LLM),成为头条新闻。我相信 Llama2 在进一步推动人工智能技术方面取得了巨大飞跃,人们将关注私人领域未来对聊天机器人的微调将超过一般聊天机器人。1 这些尖端模型从 2023 年 1 月到 2023

    2024年02月10日
    浏览(49)
  • 云计算与低代码开发:提升软件开发效率的完美组合

    云计算和低代码开发是当前技术领域的两大热门概念,它们对企业和开发者来说都具有巨大的吸引力。本文将探讨云计算与低代码开发的结合,以及这种组合如何加速创新和提高开发效率。 随着技术的不断进步,软件开发领域也迎来了一系列革命性的变化。其中,云计算和低

    2024年01月19日
    浏览(83)
  • Mac Apple Silicon M1/M2 homebrew miniforge conda pytorch yolov5深度学习环境搭建并简单测试MPS GPU加速

    笔者使用的是一台M2版本的Macbook Air,虽然苹果作为深度学习的训练机不太合适,但是由于macbook作为打字机实在是无可挑剔,所以使用macbook调试一下pytorch的代码再放到集群上训练或者直接在mac上调试运行代码都是不错的体验,本文以在mac上直接调试yolov5为目标,大概记录一下

    2024年02月02日
    浏览(52)
  • 从这五个方面提升python的执行效率,才是软件开发层面需要考虑的问题!

    python作为使用最广泛的编程语言之一,有着无穷无尽的第三方非标准库的支持。 简单的语法、优雅的代码块使其在各个业务领域都混的风生水起,除了这些优点,python有一个经常被人诟病的缺点那就是运行速度。 小伙伴通过下面的五个python开发技巧,来充分提高python代码块

    2023年04月14日
    浏览(51)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包