在跑深度模型的时候,经常需要和课题组其他同学共用服务器或者多个对比模型需要依次训练,这时候可能需要频繁去查看当前gpu是否满足需求。所以想写一个gpu任务及时调用的脚本,实现目标有三个:

周期性监控gpu显存状态,若满足任务运行条件则运行任务

若任务成功放到gpu上,则邮件通知代码开始执行

周期性监控gpu显存状态

读取gpu显存状态

python中使用pynvml库查询。

#python2

pip install nvidia-ml-py2

#python3

pip install nvidia-ml-py3

读取gpu显存

import pynvml

pynvml.nvmlInit() # 初始化

handle=pynvml.nvmlDeviceGetHandleByIndex(0) # 这里参数表示查询的索引

meminfo = pynvml.nvmlDeviceGetMemoryInfo(handle)

print("totol mem: %0.3f G, used mem: %0.3f G, free mem: %0.3f G"%(meminfo.total/1e9, meminfo.used/1e9, meminfo.free/1e9))

deviceCount = pynvml.nvmlDeviceGetCount()

deviceName = pynvml.nvmlDeviceGetName(handle)

print('device count: %d device name: %s'%(deviceCount, deviceName))

pynvml.nvmlShutdown() # 关闭

周期性执行任务

python 周期性任务执行方式大概有四种,参考Python3-定时任务四种实现方式, 这里使用定时框架: APScheduler实现。

安装apscheduler

pip install apscheduler

调度器使用:

import time

from apscheduler.scheduler.blocking import BlockingScheduler

def func(arg1, arg2):

pass

def dojob():

scheduler = BlockingScheduler() # 创建任务调度器

scheduler.add_job(func, args=(a1, a2), "interval", seconds=2, id="test_job1) # 添加任务

scheduler.start() # 周期性调度开始

dojob()

所以周期性查询gpu显存只需要将查询任务放入scheduler调用列表中。

定时发送邮件

我们希望任务开始执行时发送提醒邮件,显然只需实现发送邮件服务即可。简单三步,用 Python 发邮件

import smtplib

from email.mime.text import MIMEText

mail_host = 'smtp.163.com' # 163邮箱的域名

mail_user='casia_zhouzongwei' # 邮箱用户名

mail_pass = '**********' # 邮箱密码(有可能是开始SMTP时提供的授权码)

sender='casia_zhouzongwei@163.com' # 发送邮箱,和上面用户名一致

receivers=['****@163.com'] # 要接收邮件的邮箱

message=MIMEText('context', 'plain', 'utf-8') # 发送内容,格式,字体

message['Subject']='Title' # 邮件主题

message['From'] = sender

message['To'] = receivers[0]

try:

smtpObj = smtplib.SMTP()

#连接到服务器

smtpObj.connect(mail_host,25)

#登录到服务器

smtpObj.login(mail_user,mail_pass)

#发送

smtpObj.sendmail(

sender,receivers,message.as_string())

#退出

smtpObj.quit()

print('success')

except smtplib.SMTPException as e:

print('error',e) #打印错误

消息提醒的话,显然富文本就足够了,因此后面发送图片和附件用到时再说。

代码

# --*-- coding:utf-8 --*--

import os

import time

import pynvml

import smtplib

from email.mime.text import MIMEText

from apscheduler.schedulers.blocking import BlockingScheduler

import datetime

def send_message_by_email(mes):

mail_host = 'smtp.163.com'

mail_user = 'casia_zhouzongwei'

mail_pass = "*******"

sender = 'casia_zhouzongwei@163.com'

receivers=['cumtzhouzongwei@163.com']

message = MIMEText(mes, 'plain', 'utf-8')

message['Subject'] = "New Task has been move to GPUs"

message['From'] = sender

message['To'] = receivers[0]

try:

smtpObj = smtplib.SMTP()

#连接到服务器

smtpObj.connect(mail_host,25)

#登录到服务器

smtpObj.login(mail_user,mail_pass)

#发送

smtpObj.sendmail(

sender,receivers,message.as_string())

#退出

smtpObj.quit()

print('state been sent successfully.')

except smtplib.SMTPException as e:

print('email error',e) #打印错误

def func(pre_commands, command_file, mem_required=8, gpu_num_need=2):

"""

:param pre_commands: 任务执行前的处理,比如环境和路径的设置等

:param command_file: 最终需要执行的指令文件 "*.sh"

:param men_required: 每张卡最低需要的显存数, 单位G

:param gpu_num_need: 每个任务需要的gpu卡数

"""

now = datetime.datetime.now()

ts = now.strftime('%Y-%m-%d %H:%M:%S')

# print('do func {} time :'.format(command_file),ts)

pynvml.nvmlInit()

deviceCount = pynvml.nvmlDeviceGetCount() # 当前机器gpu个数

available_device = []

if os.path.exists('tmp.txt'):

with open('tmp.txt', 'r') as f:

lines = f.readlines()

cidx = int(lines[0].strip())

else:

cidx = 0

if cidx < len(command_file):

for i in range(deviceCount):

handle = pynvml.nvmlDeviceGetHandleByIndex(i) # 第i张卡

meminfo = pynvml.nvmlDeviceGetMemoryInfo(handle) # 读取信息

freeMem = meminfo.free/1e9 # 该张卡还剩多少显存

if freeMem >= mem_required: # 该张卡可用

available_device.append(str(i))

if len(available_device) == gpu_num_need: # 满足条件,执行

os.system('{} && CUDA_VISIBLE_DEVICES={} sh {}'.format(pre_commands, ','.join(available_device), command_file[cidx]))

message = 'task id %d : %s is executed!'%(cidx, command_file[cidx])+' the gpu indices used are %s'%(','.join(available_device))

send_message_by_email(message)

with open('tmp.txt','w') as f:

f.write(str(cidx+1))

else:

print('all tasks are done. please kill this subprocess! time :'.format(command_file),ts)

def dojob():

with open('tmp.txt','w') as f:

f.write(str(0))

pre_commands="cd ~/Documents/subdir " # 此处修改

commands = ['job1.sh', 'job2.sh'] # 此处修改

scheduler = BlockingScheduler()

job1 = scheduler.add_job(func, 'interval', seconds=10, id='job1', args=(pre_commands, commands,))

scheduler.start()

dojob()

目前只邮件通知任务执行,可以很容易的通过附件的形式把结果也同步发送。

python程序gpu运行时间表_python gpu任务及时调度相关推荐

  1. python计算函数运行时间表_python计算一段代码的运行时间(类和函数)

    使用python的timeit模块可以轻松的获得一段代码的运行时间. 一.获得一个类的运行时间:import timeit as ti gettime = """ imp ...

  2. python代码怎么运行-Python程序执行原理,python程序怎么运行的?

    随着人工智能时代的来临,python成为了人们学习编程的首先语言.那么,python程序的程序的执行原理什么呢?python程序怎么运行的?我们下面来介绍下. 我们都知道,使用CC++之类的编译性语言 ...

  3. python程序只能使用源代码进行运行吗-谈谈 Python 程序的运行原理

    因为我的个人网站 restran.net 已经启用,博客园的内容已经不再更新.请访问我的个人网站获取这篇文章的最新内容,谈谈 Python 程序的运行原理 这篇文章准确说是『Python 源码剖析』的 ...

  4. python每天定时9点执行_win10设置Python程序定时运行(设置计划任务)

    楼主最近写了一个简单的Python程序,想让这个小程序每天上午8点定时运行一次,因为我的电脑是Windows系统,无法使用Linux下强大的crontab命令,所以我只好求助于度娘.我搜到了好几个相关 ...

  5. 谈谈 Python 程序的运行原理

    谈谈 Python 程序的运行原理 这篇文章准确说是『Python 源码剖析』的读书笔记,整理完之后才发现很长,那就将就看吧. 1. 简单的例子 先从一个简单的例子说起,包含了两个文件 foo.py ...

  6. python程序运行原理_谈谈 Python 程序的运行原理

    因为我的个人网站 restran.net 已经启用,博客园的内容已经不再更新.请访问我的个人网站获取这篇文章的最新内容,谈谈 Python 程序的运行原理 这篇文章准确说是『Python 源码剖析』的 ...

  7. python程序-Python程序执行原理,python程序怎么运行的?

    随着人工智能时代的来临,python成为了人们学习编程的首先语言.那么,python程序的程序的执行原理什么呢?python程序怎么运行的?我们下面来介绍下. 我们都知道,使用CC++之类的编译性语言 ...

  8. win10设置Python程序定时运行(设置计划任务)

    楼主最近写了一个简单的Python程序,想让这个小程序每天上午8点定时运行一次,因为我的电脑是Windows系统,无法使用Linux下强大的crontab命令,所以我只好求助于度娘.我搜到了好几个相关 ...

  9. python程序运行结果始终为0_下列 Python 程序的运行结果是( )。 x=0 y=True print(xy and 'A''B')_学小易找答案...

    [单选题]下列 Python 程序的运行结果是( ). x=0 y=True print(x>y and 'A' [判断题]城市轨道交通是公共交通铁路化的产物,因此它保留有铁路交通的部分基因,比 ...

最新文章

  1. Picasso-源码解析(三)
  2. 多行列表右边距为零的实现方法
  3. win7下搭建opengles2.0编程环境
  4. 1108. IP 地址无效化
  5. 【TensorFlow】TensorFlow函数精讲之value()
  6. 数字图像处理实践(二)
  7. ZEMAX基础光学设计笔记(一)
  8. ADC0808确定地址及查询方式示例
  9. 计算机系统类型怎么改变,更改文件类型_win7电脑系统文件类型怎么更改?
  10. matlab设置图片背景透明_[转载]Matlab中得到透明背景图片的方法
  11. matinee和matin区别_法语小灶 | an和année, jour和journée有什么区别?
  12. PS-fourday-套索工具组(抠图强化)
  13. vue3.0+ts+element-plus多页签应用模板:侧边导航菜单(上)
  14. 【UOJ#311】【UNR #2】积劳成疾(动态规划)
  15. 今天咱爬点不一样的!获取华为应用商店app信息!
  16. Linux相关实验总结
  17. Kubernetes中配置livenessProbe、readinessProbe和startupProbe
  18. Excel函数 - 时间函数
  19. [五]虚拟机执行子系统
  20. 面试题【jdk8新特性】

热门文章

  1. python2还是3好_学Python2还是python3 究竟哪个好
  2. 404!优秀案例分享,这样的页面照样能给你小惊喜
  3. 多看优秀的设计,时刻关注行业风向
  4. 潮流趋势UI素材|梯度半透明、透明套件
  5. 美轮美奂渐变炫彩海报素材,荣盛回来!
  6. UI加载动效模板|优秀作品给UI设计师做个示范
  7. tlc5620输出三角波流程图_[笔记].串型DAC TLC5620生成锯齿波、三角波实验,Verilog版本...
  8. Java标识符和数据类型
  9. Madagascar的自定义浮点型函数--三角函数和反三角函数
  10. Linux内核TCP/IP协议栈运行时序 | 配图