抢占GPU的脚本

这篇具有很好参考价值的文章主要介绍了抢占GPU的脚本。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

前言

同样的,这篇博客也源自于我在做组内2030项目所产生的结果。当时,5个硕士生需要进行类似的微调工作,偶尔还会有博士生使用服务器上的GPU,但服务器上仅有8块GPU。
因此,如何快速抢占到 \(n\) 块GPU,从而高效完成手里的工作,便是一个很重要的问题啦~^ _ ^

问题

我首先在网上看了下现有的抢GPU的脚本,但发现简单的脚本要么只能抢1块GPU,要么是一个复杂项目操作起来较麻烦。
于是便萌生了自己写个Python脚本,这样以后凡是涉及到需要抢GPU的场景,我都可以通过运行该脚本抢占到 \(n\) 块GPU后,便开始我的模型训练或是其他。
这样一种一劳永逸的工作,何乐而不为呢?
闲话少叙,下面开始介绍实现方法。

解决方法

我主要利用Python多进程编程,通过占用GPU内存,从而达到占用GPU的目的。关于代码的解释以及整个完成过程详见我的个人博客,以下主要介绍如何使用该脚本。

我的Python版本为3.11,执行命令如下

python grab_gpu.py --n 3 --otime 30 --spath ./train.sh

其中n表示需要占用的GPU个数,otime表示占用时间,spath表示一旦释放GPU后,我们需要执行的脚本。

运行结果如下:
抢占GPU的脚本
完整代码如下文章来源地址https://www.toymoban.com/news/detail-673060.html

import os
import subprocess
import time
import argparse
from multiprocessing import Process, Value, Lock, Array

def get_gpu_mem(gpu_id):
    gpu_query = subprocess.check_output(['nvidia-smi', '--query-gpu=memory.used', '--format=csv,nounits,noheader'])
    gpu_memory = [int(x) for x in gpu_query.decode('utf-8').split('\n')[:-1]]
    return gpu_memory[gpu_id]

def get_free_gpus()->list:
    gpu_query = subprocess.check_output(['nvidia-smi', '--query-gpu=memory.used', '--format=csv,nounits,noheader'])
    gpu_memory = [int(x) for x in gpu_query.decode('utf-8').split('\n')[:-1]]
    free_gpus = [i for i, mem in enumerate(gpu_memory) if mem < 100]
    return free_gpus

def occupy_gpu(gpu_id:int, n, occupy_num, ocpy_gpus, lock, a_dim=140000):
    with lock:
        if get_gpu_mem(gpu_id) < 100 and occupy_num.value < n:
            import torch
            a = torch.ones((a_dim,a_dim)).cuda(gpu_id)
            ocpy_gpus[occupy_num.value]= gpu_id
            occupy_num.value += 1
            print(f"Occupying GPU {gpu_id}, Total Occupied: {occupy_num.value}")
    while True:
        time.sleep(10)

def occupy_all_gpus(n:int, occupy_num, ocpy_gpus, interval=10):
    print("Launching process to occupy GPU ...")
    lock = Lock()
    processes = [] #List to store the processes
    while occupy_num.value < n:
        free_gpus = get_free_gpus()
        will_occupy_num = min(n, max(0,len(free_gpus)))
        for i in range(will_occupy_num):
            if occupy_num.value < n:
                p = Process(target=occupy_gpu, args=(free_gpus[i], n, occupy_num, ocpy_gpus, lock))
                p.start()
                processes.append(p)
        time.sleep(interval) # enough time to occupy gpus and update nvidia-smi
    return processes, ocpy_gpus

def run_my_program(n, desired_script, processes, ocpy_gpus, occupy_num):
    for p in processes:
        p.terminate()
    ocpy_gpus_list = list(ocpy_gpus[:occupy_num.value])
    cuda_visible_devices = ",".join(map(str, ocpy_gpus_list))
    os.environ['CUDA_VISIBLE_DEVICES'] = cuda_visible_devices
    subprocess.run([desired_script, str(n)])
    
if __name__ == "__main__":
    parser = argparse.ArgumentParser(description="Arguments for Occupy GPUs")
    parser.add_argument(
        "--n", type=int, default=2, help="Number of GPUs to occupy"
    )
    parser.add_argument(
        "--otime", type=int, default=10, help="Time of occupying gpu" 
    )
    parser.add_argument(
        "--spath", type=str, default='./train.sh', help="the execute script path"
    )
    args = parser.parse_args()
    n = args.n
    occupy_time = args.otime
    desired_script = args.spath
    occupy_num = Value('i', 0) # Shared variable to count occupied GPUs
    ocpy_gpus =  Array('i', [-1 for _ in range(8)])# Shared array to store occupied gpu
    processes,ocpy_gpus = occupy_all_gpus(n, occupy_num, ocpy_gpus)
    time.sleep(occupy_time)
    run_my_program(n, desired_script, processes, ocpy_gpus, occupy_num)

到了这里,关于抢占GPU的脚本的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

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

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

相关文章

  • 【Kotlin】从Java转向Kotlin,耐心看完这篇博客就够了。Kotlin快速入门教程分享

    适合群体:Java已经入门的人,如果是零基础,不要勉强!虽然没有深奥的术语,即使有也尽可能通俗易懂 。 Kotlin和Java都是Jvm语言,相同的部分能省则省(篇幅有限),重点是Kotlin。 示例代码的注释很重要。最好可以使用IDEA等开发工具运行一下。 最后创作不易,全部都是自

    2023年04月08日
    浏览(54)
  • GPU性能的简单测试脚本(pytorch版)

    2024年02月14日
    浏览(35)
  • ChatGPT 在做什么,为什么有效?

    原文:What Is ChatGPT Doing … and Why Does It Work? 译者:飞龙 协议:CC BY-NC-SA 4.0 这本简短的书试图从第一原理解释 ChatGPT 是如何工作的。在某种程度上,这是关于技术的故事。但它也是关于科学的故事。以及关于哲学的故事。为了讲述这个故事,我们将不得不汇集许多世纪以来的

    2024年04月09日
    浏览(50)
  • 电脑死机的时候,CPU到底在做什么?

    电脑死机,应该每个接触计算机的小伙伴都经历过吧。 尤其是早些年,电脑配置还没现在这么高的时候,多开几个重量级应用程序,死机就能如约而至,就算你把键盘上的CTRL+ALT+DELETE按烂了,任务管理器也出不来,最后只能默默含泪长按关机按钮,强制关机。 那么,你有没

    2024年02月08日
    浏览(44)
  • 还在做 Hadoop 生态?那我祝你一帆风顺

    上回说到,我决定走出大数据的围城,用另一种视角审视与复盘行业。 文章发出后收到很多读者的反馈,其中呼声比较高的一条是希望我能聊聊大数据的行业前景与思考。针对这个问题,后面我会分享一些自己的经验与思考,同时,也会邀请来自各个大厂及正在相关方向创业

    2024年02月01日
    浏览(34)
  • 橙河网络:2023年,我看谁还在做实体行业?

    大家好,我是橙河老师,今天讲一讲实体行业。 现在实体行业还好干吗? 肯定是不好干了。 别的不扯,这几年很多大佬,能把老百姓干的事儿都干了。 一天收入上百万的演员,在直播间卖着九块九的东西,使劲吆喝着喊破了喉咙。 一个自己有博物馆的相声大师,在直播间

    2024年02月13日
    浏览(42)
  • 开源自定义数据中台AllData第一章

    ​ 💥🔥 Hey there! I\\\'m AllDataDC. Developing BigData Platform Exploring new technologies Studying Computer Science Enthusiast in BigData and AI Full Stack developer and BigData developer Create a product that is useful to society [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-RsXUstB2-1679966837577)(

    2024年02月11日
    浏览(37)
  • MybatisPlus笔记分享【源自三更草堂】

    ​ MybatisPlus是一款Mybatis增强工具,用于简化开发,提高效率。 它在 MyBatis 的基础上只做增强不做改变,为简化开发、提高效率而生。 ​ 官网: https://mp.baomidou.com/ 2.0 准备工作 ①准备数据 ②创建SpringBoot工程 添加依赖 创建启动类 ③准备实体类 2.1 使用MybatisPlus ①添加依赖

    2023年04月09日
    浏览(27)
  • 快速学习正则表达式 (源自github)

    目录 什么是正则表达式 1.基本匹配 2.元字符 2.1点运算符 . 2.2字符集 2.2.1否定字符集 2.3重复次数 2.3.1 * 号 2.3.2 + 号 2.3.3 ? 号 2.4 {} 号 2.5 (...) 特征标群 2.6 | 或运算符 2.7 转码特殊字符 2.8 锚点 2.8.1 ^ 号 2.8.2 $ 号 3. 简写字符集 4. 零宽度断言(前后预查) 4.1 ?=... 正先行断言 4.2

    2024年01月24日
    浏览(35)
  • 运维工程师一天的日常都在做什么?

    在公司负责Linux运维工作,就我一人,之前公司没有运维。 每天的日常,就是看B站,学习新的内容(主要是工位位置不好),逛一些论坛,还有接一些小活,写写脚本处理问题之类的,一个月也可以有个两千左右的额外收入。 一个月估计差不多有25天没人找我,每天都是准时

    2024年02月05日
    浏览(85)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包