1、背景介绍
实验室有多个大佬同时共用一台服务器,每个服务器上有若干块GPU显卡,经常在一台服务器上搭好环境,调好代码,准备跑程序,发现GPU卡已经全被被占了。
2、功能:
- 定时查询服务器显卡,
- 若有空卡,则邮件通知。
- 可以设置通知的时间范围(工作时间8-24时)
- 可以设置时间间隔
3、安装:
- 需要安装 python 环境(python3.6),建议使用anaconda。
- pip install nvidia-ml-py python工具pynvml来实现显卡信息的读取与管理
- pip install schedule 可以用一个很方便且轻量的第三方库:schedule
- 利用python工具pynvml来实现显卡信息的读取与管理
#可以根据python版本制定2/3
# python2
pip install nvidia-ml-py2
# python3
pip install nvidia-ml-py3
https://blog.csdn.net/u014636245/article/details/83932090
4、使用
安装完后,直接运行该程序 python filename.py。提醒:可以使用同一个QQ邮箱进行收发
#coding=utf-8
from email.mime.text import MIMEText
from email.header import Header
from smtplib import SMTP_SSL
from pynvml import *
import schedule
import time
import datetime
def mail_fun():
#qq邮箱smtp服务器
host_server = 'smtp.qq.com'
#sender_qq为发件人的qq号码
sender_qq = '25****75@qq.com'
#pwd为qq邮箱的授权码
pwd = ' xh**********bdc' ## xh**********bdc
#发件人的邮箱
sender_qq_mail = '25****75@qq.com'
#收件人邮箱
receiver = '41****75@qq.com'
#邮件的正文内容
mail_content = 'fwq 有卡'
#邮件标题
mail_title = 'fwq的邮件'
#ssl登录
smtp = SMTP_SSL(host_server)
#set_debuglevel()是用来调试的。参数值为1表示开启调试模式,参数值为0关闭调试模式
smtp.set_debuglevel(1)
smtp.ehlo(host_server)
smtp.login(sender_qq, pwd)
msg = MIMEText(mail_content, "plain", 'utf-8')
msg["Subject"] = Header(mail_title, 'utf-8')
msg["From"] = sender_qq_mail
msg["To"] = receiver
smtp.sendmail(sender_qq_mail, receiver, msg.as_string())
smtp.quit()
def check_nvi():
nvmlInit() #初始化
#查看设备
deviceCount = nvmlDeviceGetCount()
print(datetime.datetime.now())
for i in range(deviceCount):
handle = nvmlDeviceGetHandleByIndex(i)
# print("GPU", i, ":", nvmlDeviceGetName(handle))
# 查看当前显卡 剩余显存大小pip
free_info = nvmlDeviceGetMemoryInfo(handle).free / 1024 / 1024
print("GPU", i, ":", str(free_info)+"M")
# 剩余显存 大于9000 邮件通知
if free_info >= 9000:
# 判断当前时间是否是在 工作时间(工作时间才通知 8-24)
# 当前时间(第几个小时)
curr_hour = time.localtime( time.time() ).tm_hour
if curr_hour >= 8 and curr_hour <=24:
mail_fun()
break
#最后要关闭管理工具
nvmlShutdown()
def job():
check_nvi()
# 定时任务
schedule.every(30).minutes.do(job) # 每30分钟执行一次
# schedule.every(30).seconds.do(job) # 每10秒执行一次
if __name__ == "__main__":
# mail_fun()
# check_nvi()
while True:
schedule.run_pending() # 运行所有可运行的任务
time.sleep(1)
5、结果
设置的是每隔10秒钟执行一次
邮箱收到的邮件
开启与关闭
参考:https://www.yuque.com/docs/share/d28fc430-e5bf-461b-9181-069d3bacf78d?#