谁在使用GPU?
nvidia-smi命令可以查看GPU使用情况,但是只能看到占用每个GPU的进程ID。根据进程ID可以得到进程详情,进程详情中包括用户ID,根据用户ID可以获取用户名称,从而知道哪个用户在使用GPU。
import json
import os
import re
import sys
import time
import typing
import bidict
"""
查看谁在使用GPU
"""
def get_user_id_map() -> typing.Dict[str:str]:
"""获取用户名和用户ID的对应关系"""
home = os.path.expanduser('~')
users = bidict.bidict()
for user_name in os.listdir(os.path.join(home, '..')):
info = os.popen('id ' + user_name + ' 2>&1').read().strip()
if 'no such user' in info: continue
try:
a = re.search("uid=(\\d+)\((\\w+)\)", info)
users[a.group(1)] = a.group(2) # userid==>username
except Exception as e:
print(e)
return users
def nvidia_smi() -> (int, typing.Dict[str:str]):
"""使用nvidia-smi命令查看GPU使用情况,返回GPU个数和各个GPU的进程的描述line"""
info = os.popen('nvidia-smi').read()
info = info.split('\n')
"""
smi信息分成上下两部分
上面部分:以表格形式展示各个GPU的使用率
下面部分:展示各个GPU上运行的进程ID
"""
space_ind = 0
for ind, line in enumerate(info):
if not line.strip():
space_ind = ind
break
first_line = 0
for ind, line in enumerate(info):
if line.startswith('|===='):
first_line = ind
break
gpu_count = abs(space_ind - first_line) // 3
pos = None
for ind, line in enumerate(info):
line = line.split()
if len(line) > 1 and line[1] == 'Processes:':
pos = ind + 2
break
gpu_usage = dict()
if pos == None:
return gpu_count, gpu_usage
for i in range(pos, len(info)):
line = info[i].split()
if len(line) > 1:
thread = line[2]
gpu_id = int(line[1])
if gpu_id not in gpu_usage:
gpu_usage[gpu_id] = []
gpu_usage[gpu_id].append(thread)
return gpu_count, gpu_usage
def get_thread_info(thread_id: str):
"""根据thread_id获取thread详细信息"""
id2user = get_user_id_map()
thread_info = os.popen('ps -l ' + thread_id).read().split('\n')[1].split()
thread_user = id2user.get(thread_info[2])
thread_time = re.search('\\d+', thread_info[12]).group()
thread_cmd = ' '.join(thread_info[13:])
return dict(user=thread_user, use_time="{} hours".format(float(thread_time) / 60), thread_id=thread_id, cmd=thread_cmd)
def grep_gpu(task):
"""抢占GPU准备执行某个任务"""
free_gpu = None
while free_gpu is None:
gpu_count, usage = nvidia_smi()
time.sleep(2)
for i in range(gpu_count):
if i not in usage:
free_gpu = i
break
print('free gpu found ! ', free_gpu)
os.system(task)
def show():
gpu_count, usage = nvidia_smi()
for gpu_id in usage:
usage[gpu_id] = [get_thread_info(thread_id) for thread_id in usage[gpu_id]]
print('gpu count', gpu_count)
print(json.dumps(usage, ensure_ascii=0, indent=2))
def run(gpu_id, task):
os.environ['CUDA_VISIBLE_DEVICES'] = str(gpu_id)
os.system('echo CUDA_VISIBLE_DEVICES:$CUDA_VISIBLE_DEVICES')
os.system(task)
if __name__ == '__main__':
print(sys.argv)
if len(sys.argv) == 1:
print("""
GPU utility
gpu show
gpu grep your command here
gpu 1 python haha.py
""")
exit(0)
action = sys.argv[1]
if action == 'show': # 显示GPU使用情况
show()
elif action == 'grep': # 争夺GPU,得到之后执行命令
cmd = ' '.join(sys.argv[2:])
print('grep gpu and run', cmd)
grep_gpu(cmd)
elif re.match("\\d+", action): # 使用gpu_id执行某个action
gpu_id = int(action)
cmd = ' '.join(sys.argv[2:])
print('run on gpu', gpu_id, 'cmd', cmd)
run(gpu_id, cmd)
else:
print("unkown command")
谁在使用GPU?的更多相关文章
- 高级渲染技巧和代码示例 GPU Pro 7
下载代码示例 移动设备正呈现着像素越来越高,屏幕尺寸越来越小的发展趋势. 由于像素着色的能耗非常大,因此 DPI 的增加以及移动设备固有的功耗受限环境为降低像素着色成本带来了巨大的压力. MSAA 有 ...
- 【腾讯优测干货分享】安卓专项测试之GPU测试探索
本文来自于Dev Club 开发者社区,非经作者同意,请勿转载,原文地址:http://dev.qq.com/topic/57c7ffdc0569a1191bce8a63 作者:章未哲——腾讯SNG质 ...
- [译]基于GPU的体渲染高级技术之raycasting算法
[译]基于GPU的体渲染高级技术之raycasting算法 PS:我决定翻译一下<Advanced Illumination Techniques for GPU-Based Volume Ra ...
- Microsoft Windows* SDK May 2010 或较新版本(兼容 2010 年 6 月 DirectX SDK)GPU Detect
原文链接 下载代码样本 特性/描述 日期: 2016 年 5 月 5 日 GPU Detect 是一种简短的示例,演示了检测系统中主要显卡硬件(包括第六代智能英特尔® 酷睿™ 处理器产品家族)的方式. ...
- 基于GPU的高分一号影像正射校正的设计与实现
一 RPC正射校正的原理 影像正射校正的方法有很多,主要包含两大类:一类是严格的几何纠正模型,另一类是近似几何纠正模型.当遥感影像的成像模型和有关参数已知时,可以根据严格的成像模型来校正图像,这种方法 ...
- tensorflow 一些好的blog链接和tensorflow gpu版本安装
pading :SAME,VALID 区别 http://blog.csdn.net/mao_xiao_feng/article/details/53444333 tensorflow实现的各种算法 ...
- [信安Presentation]一种基于GPU并行计算的MD5密码解密方法
-------------------paper--------------------- 一种基于GPU并行计算的MD5密码解密方法 0.abstract1.md5算法概述2.md5安全性分析3.基 ...
- 【转】Ubuntu 16.04安装配置TensorFlow GPU版本
之前摸爬滚打总是各种坑,今天参考这篇文章终于解决了,甚是鸡冻\(≧▽≦)/,电脑不知道怎么的,安装不了16.04,就安装15.10再升级到16.04 requirements: Ubuntu 16.0 ...
- 为什么现在更多需要用的是 GPU 而不是 CPU,比如挖矿甚至破解密码?
作者:Cascade链接:https://www.zhihu.com/question/21231074/answer/20701124来源:知乎著作权归作者所有,转载请联系作者获得授权. 想要理解G ...
- 浅谈CPU和GPU的区别
导读: CPU和GPU之所以大不相同,是由于其设计目标的不同,它们分别针对了两种不同的应用场景.CPU需要很强的通用性来处理各种不同的数据类型,而GPU面对的则是类型高度统一的.相互无依赖的大规模数据 ...
随机推荐
- 如何通过纯javascript实现表单提交
通常,如果是POST方法,一般使用vuejs+axios,或使用Jquery实现表单提交.有些地方,我想使用纯JS实现,比方简单的登陆跳转.话不多说,看原代码, laravel中的HTML部分,如果不 ...
- gitlab从开发分支合并代码到master分支
你敢相信这是个码农? 新项目开发完成,代码要封版.开发分支是dev,将代码合并到master时可费了劲儿了,上周我们几个同事前前后后折腾了两天,还是有问题. 今天上完线必须要封版了.所以务必得搞定. ...
- linux下搭建jenkins
为了配合上一篇的ant+jenkins做持续集成,需要在linux环境下搭建一个jenkins平台.网上有很多安装的例子,我主要记录一下自己遇到的问题,真真的是特别惆怅的,每次我遇到的问题都格外多. ...
- js对象比较
使用闭包实现 js 对象按指定属性进行大小比较 需要比较的对象 let obj1 = { name:'张三', age:19 }; let obj2 = { name:'李四', age:22 }; ...
- python字符减运算
在C语言等高级语言中,字符之间的减运算都是支持的,但是python不然,在python中直接进行字符减运算是不被允许的. >>> print('c'-'a') Traceback ( ...
- c++ 模板特化与局部特化
c++ 模板特化与局部特化 模板的由来是要处理泛化,也就是任何类型都可以处理.但是泛化的同时,如果针对某种特殊的类型,又更加效率的处理方法.c++提供针对特殊的类型,可以定义不同的处理方法.针对某种特 ...
- [日常] 安装windows+deepin双系统
我的测试电脑上安装了三个系统,分别是win7 , ubuntu16.04 ,deepin15.11下面的步骤是安装deepin系统的过程 1.制作启动u盘,直接使用官方工具制作就可以了,我的已经制作好 ...
- 【cf343】D. Water Tree(dfs序+线段树)
传送门 题意: 给出一个以\(1\)为根的有根树,起始每个结点都为\(0\),现在有三种操作: 1.将\(v\)及\(v\)的子树都置为\(1\): 2.将\(v\)及其所有的祖先都置为\(0\): ...
- 初学JavaScript正则表达式(一)
给单个单词is改为大写的IS \bis\b // \b指的是单词边界 IS He is a boy This is a test isn't it 给以http://开头并且以jpg结尾的链接删除掉h ...
- Scrapy-splash
Scrapy-splash Splash是一个javascript渲染服务.它是一个带有HTTP API的轻量级Web浏览器,使用Twisted和QT5在Python 3中实现.QT反应器用于使服务完 ...