首页 > 其他分享 >抢占GPU的脚本

抢占GPU的脚本

时间:2023-08-26 11:11:05浏览次数:36  
标签:脚本 抢占 -- occupy num gpus gpu GPU ocpy

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

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

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

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

运行结果如下:
image
完整代码如下

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)

标签:脚本,抢占,--,occupy,num,gpus,gpu,GPU,ocpy
From: https://www.cnblogs.com/littletreee/p/17658006.html

相关文章

  • sql Server利用其create脚本来创建表
    1--这是依据系统自动生成的create脚本,填入所需字段来创建表23USE[csnprod]4GO56/******Object:Table[dbo].[message_master]ScriptDate:2023/8/2512:57:06******/7SETANSI_NULLSON8GO910SETQUOTED_IDENTIFIERON11GO1213SET......
  • centos7实现开机自启动Python脚本
    在Linux系统中,你可以使用不同的方法来实现开机自启动Python脚本和确保守护进程不挂掉。以下是一些常用的方法:1.开机自启动Python脚本:使用rc.local文件(适用于一些旧的系统):编辑/etc/rc.local文件,将你希望在系统启动时运行的命令或脚本添加到文件中。确保给脚本提供正确的路径。......
  • mysql 常用脚本语法
    mysql常用脚本语法创建表:CREATETABLEtest_db1.test_table1(idINTauto_incrementNOTNULL,my_namevarchar(100)NOTNULL,memovarchar(100)NULL,CONSTRAINTtest_table1_PKPRIMARYKEY(id))ENGINE=InnoDBDEFAULTCHARSET=utf8mb4COLLATE=ut......
  • SecureCRT通过脚本实现自动化登录
    1、配置登录主机名、用户和密码 2、配置登录后操作脚本目录 3、vbs操作脚本如下(crt也支持python)#$language="VBScript"#$interface="1.0"crt.Screen.Synchronous=TrueSubMain crt.Screen.Send"[email protected]"&chr(13) if(crt.Screen.Wait......
  • shell脚本通过read实现与键盘交互
    #!/bin/bashread-p"输入你想执行的操作(run|kill):"execread-p"输入对应的进程(server|web|all):"processfunctionrun_process(){case${1}inall)echo'启动所有进程';;server)echo'只启动server'......
  • centos定时备份mysql数据库 用shell脚本实现
    数据很重要,上线的项目必须数据库做到定时备份数据量小的可用如下方法,下面的是全量备份,数据量大的肯定行不通的,这时可用mysql主从复制了注意事项:1、shell脚本的mysqldump命令必须使用绝对路径,首先用find/-name'mysqldump'找到真实绝对路径,否则备份出来文件0kb 2、在终端用......
  • python调用SAP脚本下载库存报表MB52
    importmathimportos,sys,win32com.clientimportclipboardfrompprintimportpprintimportcsvdefget_mb52(session,args={},plant='0001'):result=download_from_sap(session,args=args,plant=plant)ifnotresult:#n......
  • Python SAP 脚本定时自动下载资产清单 S_ALR_87011990
    业务场景使用了外部工作流系统管理固定资产申请,转移(负责人变更),盘点,报废等涉及固定资产的业务,而固定资产采购,折旧等仍在SAP中进行,所以需要定时从SAP中下载包括固定资产账面值的固定资产清单,以作为工作流审批节点流转的依据主要功能说明定时运行自动登录SAP下载SAP固定资......
  • qBittorrent如何运行脚本 BT实现自动改名并方便Jellyfin的搜刮器
    qBittorrent如何运行脚本BT实现自动改名并方便Jellyfin的搜刮器很多影视网站下载的视频名字大概是为了规避监测,命名非常奇葩,比如:z灼f流,y骨y等等。如果你使用了Jellyfin,Emby又或者是其他视频管理软件,搜刮器就会搜不到相应的电视剧的介绍,图片和字幕了,但是40多集电视剧每一集......
  • cmd执行任务时间差计算脚本
    @echooffsetlocalenabledelayedexpansionREM===========================dosomethingsetstart_time=%time%timeout/t3setend_time=%time%REM===========================deltatimeset/adelta_hours=1%end_time:~0,2%-1%start_time:~0,2%set/adelta_......