1.   使用

# ------- 选择设备 ------- #
from gpu_manager import GPUManager
device_id = GPUManager().auto_choice()
device = torch.device('cuda:%d' % device_id if device_id >= 0 else 'cpu')
torch.cuda.set_device(device)# ------- 使用设备 ------- #
model = model.cuda(device)
inputs = inputs.cuda(device)
targets = targets.cuda(device)

2.   库

# -*- coding: utf-8 -*-
"""
Created on Tue Aug 22 19:41:55 2017
@author: Quantum Liu
"""
'''
Example:
gm=GPUManager()
with torch.cuda.device(gm.auto_choice()):blabla
Or:
gm=GPUManager()
torch.cuda.set_device(gm.auto_choice())
'''import os
import torch
def check_gpus():'''GPU available checkhttp://pytorch-cn.readthedocs.io/zh/latest/package_references/torch-cuda/'''if not torch.cuda.is_available():print('This script could only be used to manage NVIDIA GPUs,but no GPU found in your device')return Falseelif not 'NVIDIA System Management' in os.popen('nvidia-smi -h').read():print("'nvidia-smi' tool not found.")return Falsereturn Trueif check_gpus():def parse(line,qargs):'''line:a line of textqargs:query argumentsreturn:a dict of gpu infosPasing a line of csv format text returned by nvidia-smi解析一行nvidia-smi返回的csv格式文本'''numberic_args = ['memory.free', 'memory.total', 'power.draw', 'power.limit']#可计数的参数power_manage_enable=lambda v:(not 'Not Support' in v)#lambda表达式,显卡是否滋瓷power management(笔记本可能不滋瓷)to_numberic=lambda v:float(v.upper().strip().replace('MIB','').replace('W',''))#带单位字符串去掉单位process = lambda k,v:((int(to_numberic(v)) if power_manage_enable(v) else 1) if k in numberic_args else v.strip())return {k:process(k,v) for k,v in zip(qargs,line.strip().split(','))}def query_gpu(qargs=[]):'''qargs:query argumentsreturn:a list of dictQuerying GPUs infos查询GPU信息'''qargs =['index','gpu_name', 'memory.free', 'memory.total', 'power.draw', 'power.limit']+ qargscmd = 'nvidia-smi --query-gpu={} --format=csv,noheader'.format(','.join(qargs))results = os.popen(cmd).readlines()return [parse(line,qargs) for line in results]def by_power(d):'''helper function fo sorting gpus by power'''power_infos=(d['power.draw'],d['power.limit'])if any(v==1 for v in power_infos):print('Power management unable for GPU {}'.format(d['index']))return 1return float(d['power.draw'])/d['power.limit']class GPUManager():'''qargs:query argumentsA manager which can list all available GPU devicesand sort them and choice the most free one.Unspecified ones pref.GPU设备管理器,考虑列举出所有可用GPU设备,并加以排序,自动选出最空闲的设备。在一个GPUManager对象内会记录每个GPU是否已被指定,优先选择未指定的GPU。'''def __init__(self,qargs=[]):''''''self.qargs=qargsself.gpus=query_gpu(qargs)for gpu in self.gpus:gpu['specified']=Falseself.gpu_num=len(self.gpus)def _sort_by_memory(self,gpus,by_size=False):if by_size:print('Sorted by free memory size')return sorted(gpus,key=lambda d:d['memory.free'],reverse=True)else:print('Sorted by free memory rate')return sorted(gpus,key=lambda d:float(d['memory.free'])/ d['memory.total'],reverse=True)def _sort_by_power(self,gpus):return sorted(gpus,key=by_power)def _sort_by_custom(self,gpus,key,reverse=False,qargs=[]):if isinstance(key,str) and (key in qargs):return sorted(gpus,key=lambda d:d[key],reverse=reverse)if isinstance(key,type(lambda a:a)):return sorted(gpus,key=key,reverse=reverse)raise ValueError("The argument 'key' must be a function or a key in query args,please read the documention of nvidia-smi")def auto_choice(self,mode=0):'''mode:0:(default)sorted by free memory sizereturn:a TF device objectAuto choice the freest GPU device,not specifiedones 自动选择最空闲GPU,返回索引'''for old_infos,new_infos in zip(self.gpus,query_gpu(self.qargs)):old_infos.update(new_infos)unspecified_gpus=[gpu for gpu in self.gpus if not gpu['specified']] or self.gpusif mode==0:print('Choosing the GPU device has largest free memory...')chosen_gpu=self._sort_by_memory(unspecified_gpus,True)[0]elif mode==1:print('Choosing the GPU device has highest free memory rate...')chosen_gpu=self._sort_by_power(unspecified_gpus)[0]elif mode==2:print('Choosing the GPU device by power...')chosen_gpu=self._sort_by_power(unspecified_gpus)[0]else:print('Given an unaviliable mode,will be chosen by memory')chosen_gpu=self._sort_by_memory(unspecified_gpus)[0]chosen_gpu['specified']=Trueindex=chosen_gpu['index']print('Using GPU {i}:\n{info}'.format(i=index,info='\n'.join([str(k)+':'+str(v) for k,v in chosen_gpu.items()])))return int(index)
else:raise ImportError('GPU available check failed')

https://github.com/QuantumLiu/tf_gpu_manager/blob/master/manager_torch.py

GPUManager相关推荐

  1. k8s中GPU虚拟化工具gpu-manager的安装

    gpu-manager安装 概述 准备工作 部署gpu-manager 部署gpu-admission 查看结果 参考 概述 gpu-manager是腾讯的一个开源vGPU应用,具体原理就不介绍了,详 ...

  2. 腾讯GaiaStack容器平台负责人罗韩梅:All on GaiaStack

    6月29日,DevOps国际峰会在北京盛大开幕.腾讯数据平台部高级工程师罗韩梅做了主题为"腾讯基于Kubernetes的企业级容器云平台GaiaStack"的演讲. 以下为演讲内容 ...

  3. 如何查看 Linux 中所有正在运行的服务

    有许多方法和工具可以查看 Linux 中所有正在运行的服务.大多数管理员会在 System V(SysV)初始化系统中使用 service service-name status 或 /etc/ini ...

  4. Kubelet 源码剖析

    女主宣言 本文作者王希刚主要负责 HULK 云平台容器服务和 Kubernetes 的定制开发.本篇文章主要介绍了 kubelet 服务启动和创建 pod 的流程,给想要阅读 kubelet 源码的同 ...

  5. Android/Linux boot time分析优化

    如果需要优化boot time,就需要一个量化的工具来分析每个阶段的时间消耗.这种类型的优化特别适合使用基于timeline的图表,有着明显的时间顺序.要求不但能给出整个流程消耗的时间,还要能对流程进 ...

  6. cube一站式云原生机器学习平台-推理服务的工程化加速

    全栈工程师开发手册 (作者:栾鹏) 一站式云原生机器学习平台 前言:cube是tme开源的云原生机器学习平台,目前包含特征平台,支持在/离线特征:数据源管理,支持结构数据和媒体标注数据管理:在线开发, ...

  7. linux oracle查看服务,技术|如何查看 Linux 中所有正在运行的服务

    有许多方法和工具可以查看 Linux 中所有正在运行的服务.大多数管理员会在 System V(SysV)初始化系统中使用 service service-name status 或 /etc/ini ...

  8. pytorch 指定卡1_如何为TensorFlow和PyTorch自动选择空闲GPU,解决抢卡争端

    原标题:如何为TensorFlow和PyTorch自动选择空闲GPU,解决抢卡争端 雷锋网按:本文作者天清,原文载于其知乎专栏世界那么大我想写代码,雷锋网获其授权发布. 项目地址:QuantumLiu ...

  9. linux 忽略错误信息,linux – 由于文件模式错误而忽略/etc/logrotate.conf

    我如何做logrotate,当我做logrotate时,我看不出任何效果 root@me-Latitude-E5550:/etc/logrotate.d# cd .. root@me-Latitude ...

最新文章

  1. ScaleYViewPager
  2. python画简单图片-Python绘制“高颜值”桑基图
  3. 什么叫返回路径平面上的间隙_信号完整性:关于走线的参考平面问题探讨
  4. CentOS 7 解决丢失 nginx.pid 1
  5. oracle替代变量输出,【Oracle】替代变量
  6. Ubuntu下Memcache的安装与基本使用
  7. potplayer连续播放视频时保持原有屏幕大小不变
  8. [转]『TensorFlow』读书笔记_TFRecord学习
  9. Vue基础知识之vue-resource和axios(三)
  10. MySQL · 答疑解惑 · MySQL Sort 分页
  11. python逻辑运算符例子_python运算符-实战中常用的三个逻辑运算符使用实例
  12. SQL必知必会 课后题答案
  13. 【推荐系统】:Deep Crossing模型解析以及代码实现
  14. NotePad++安装HEX-Editor插件
  15. Odoo message 日志
  16. PHY驱动调试之 --- PHY控制器驱动(二)
  17. 关于电话号码欺骗的一切
  18. Node(Next)+React实现飞书扫码登录+鉴权的详细开发过程
  19. (Win10)基于Anaconda的 Tensorflow 1.15.0 安装教程
  20. 第七章:Qt设计师使用(designer)

热门文章

  1. iomanip头文件常用函数
  2. SLAM学习之路---双目相机照片生成点云(附C++代码)
  3. Uncaught SyntaxError: Unexpected token ‘<‘ (at chunk-vendors.js:1:1) app.js:1 Uncaught SyntaxError:
  4. PowerBuilder 拖动文件显示路径
  5. 物流 快递信息查询接口(阿里快递物流接口案例)
  6. 2.2计算圆柱体的体积.py
  7. Mac 清除本地DNS缓存
  8. macvim/babun+spf13-vim
  9. pppoe linux软件,在Ubuntu 18.04上编译安装pppoe客户端软件
  10. 2023华为OD机试真题C++实现【密室逃生游戏】