监控有空闲资源的GPU并发送邮件

助你不浪费资源

NOTE

  • 打开POP3/SMTP
  • getpass;re;smtplib;socket;subprocess;time;email
  • linux运行
  • 注意事先检查服务器是否可以访问外网

CODE

import getpass
import re
import smtplib
import socket
import subprocess
import time
from email.mime.text import MIMEText

import numpy as np


def login_email():
    msg_from = input('发送方邮箱账户:')  # 发送方邮箱
    passwd = input('发送方邮箱密码:')  # 填入发送方邮箱的授权码
    msg_to = input('收件人邮箱:')  # 收件人邮箱

    return msg_from, passwd, msg_to


def gather_info():
    user_name = getpass.getuser()

    ip_addr = socket.gethostbyname(socket.gethostname())

    used_gpu_memory = np.array(list(map(int, re.findall("(\d+)", subprocess.getstatusoutput(
        'nvidia-smi -q -d Memory |grep -A4 GPU|grep Used')[1], flags=0))))
    free_gpu_memory = np.squeeze(np.argwhere(used_gpu_memory < 100)).tolist()
    gpu_message = f"当前可能空闲的卡号为:{str(free_gpu_memory)}."

    content = f"{user_name}, 您好! " \
              f"IP 为 {ip_addr} 的服务器有显卡空余, " \
              f"{gpu_message}"

    return content, True if len(free_gpu_memory) > 0 else False


def send_email(content, msg_from, passwd, msg_to):
    msg = MIMEText(content)
    msg['Subject'] = "GPU 有空缺提示!"
    msg['From'] = msg_from
    msg['To'] = msg_to
    try:
        s = smtplib.SMTP_SSL("smtp.qq.com", 465)  # 邮件服务器及端口号
        s.login(msg_from, passwd)
        s.sendmail(msg_from, msg_to, msg.as_string())
        print("发送成功")
    except Exception as e:
        print(f"发送失败: {e}")
    finally:
        quit()


if __name__ == "__main__":
    msg_from, passwd, msg_to = login_email()
    while True:
        content, flag = gather_info()
        if flag:
            send_email(content, msg_from, passwd, msg_to)
        time.sleep(10)

ref

https://github.com/iuhiyuh/GPU-watchdog

### 如何检查服务器中空闲GPU数量 为了确定服务器中的空闲GPU数量,可以采用多种方法来评估各个GPU的工作负载以及资源使用状况。一种有效的方式是通过命令行工具`nvidia-smi`配合脚本处理来完成这一目标。 对于Linux环境下的Ubuntu服务器而言,可以通过执行特定指令获取有关GPU及其显存使用的即时数据[^1]。具体来说,借助Python编写一段小程序能够自动化地识别统计出哪些GPU目前处于低负荷或未被占用的状态。下面给出了一段基于Python编写的代码片段用于检测空闲GPU: ```python import os import numpy as np def get_free_gpus(): # 使用 nvidia-smi 命令查询各 GPU 显存量,过滤得到可用显存量信息 os.system('nvidia-smi -q -d Memory | grep -A4 GPU | grep Free > tmp') # 解析临时文件内容,提取每张 GPU 上剩余显存量数值列表 free_memory = [int(line.split()[2]) for line in open('tmp', 'r').readlines()] # 清理不再需要的临时文件 os.remove('tmp') # 定义阈值(单位 MB),超过此值即认为该 GPU 是 "空闲" 的 threshold_mb = 5000 # 统计满足条件的 GPU 数量 idle_count = sum([mem >= threshold_mb for mem in free_memory]) return idle_count ``` 上述函数定义了一个名为 `get_free_gpus()` 的功能模块,它会调用系统命令收集关于所有已安装NVIDIA GPU的信息,特别是它们各自的自由显存量。之后依据预设的一个最低限度——在这个例子中设定为5GB (5000MB),判断一张GPU是否可视为“空闲”。最后返回符合条件的GPU总数作为结果。 值得注意的是,在实际应用过程中可以根据具体情况调整这个阈值参数以适应不同的需求场景。此外,考虑到不同应用程序可能对GPU计算能力和显存有不同的偏好倾向[^2],因此建议根据具体的业务逻辑进一步优化判定标准。
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值