Skip to content

显卡使用情况查看

1. Web网页查看

在浏览器中输入GPU服务器的网址即可查看。

2. NVIDIA-SMI

nvidia-smi
watch -n 1 nvidia-smi

3. NVITOP(推荐)

使用nvitop查看显卡使用情况。

# 激活虚拟环境
conda activate nvitop

nvitop
nvitop
多用户服务器直接输入nvitop没有作用

通常出现在用户首次登录服务器,需要重新打开一个新的终端,再次输入即可

通过nvitop自动选择满足需求的显卡

将以下代码添加至Python文件首行(第一行),使用nvitop自动选择空闲显存满足需求的显卡。

import os
from nvitop import select_devices

os.environ['CUDA_VISIBLE_DEVICES'] = ','.join(
    select_devices(format='uuid', min_count=1, min_free_memory='10GiB')
)

# 以下应为Python文件原代码
...

其中min_count=1表示选择至少有1个显卡,min_free_memory='10GiB'表示选择空闲显存大于10GiB的显卡。

通过nvitop等待显卡空闲自动启动训练

适用条件

适用于没有空闲显卡来加入排队

使用以下代码启动训练脚本的main函数,通过nvitop接口持续检测可用显卡。等待显卡直到满足需求,模拟终端输入命令,执行相应Python文件来启动训练。

check_gpu.py
import os
import sys
from datetime import datetime
from time import sleep

need_devices = 1
need_gpu_memory_MiB = 10 * 1000  # 10GiB

devices = select_devices(
    min_count=need_devices, min_free_memory=f"{need_gpu_memory_MiB}MiB"
)

while not devices:
    sys.stdout.write(
        f"\r[{datetime.now().replace(microsecond=0)}]Waiting for devices..."
    )
    sys.stdout.flush()
    sleep(60)

device_strs = [str(device) for device in devices]  # 将设备ID列表转换为字符串列表

# 程序启动时间
time_launch = datetime.now().replace(microsecond=0)
print(f"[{time_launch}]Found {len(device_strs)} CUDA devices: {devices}")

"""
模拟终端输入,根据自己实际情况修改cmd内容,以下为命令行输入'python tracking/run.py --dataset_file tracking/datasets/coco_mot.yaml'
"""
# Python脚本启动训练(可选1)
cmd = f"CUDA_VISIBLE_DEVICES={','.join(device_strs)} python tracking/run.py \
        --dataset_file tracking/datasets/coco_mot.yaml"

# Shell脚本启动训练(可选2),Shell脚本中的第一行应添加`CUDA_VISIBLE_DEVICES=$1`
shell_scripts = "xxx.sh"
cmd = f"sh {shell_scripts} {','.join(device_strs)}"

os.system(cmd)

4. AutoDL微信API

使用AutoDL的微信API,自动通过AutoDL微信公众号发送指定信息。

AutoDL官方教程

获取API token

登录AutoDL账号,控制台(右上角)->账号(左下角)->设置->开发者token->新增token->复制token,复制token后替换下方代码中的api_token即可。

点击直达开发者token页面(需已登录)

Autodl_Weixin_API.py
api_token = ""  #从AutoDL获取
msg_text = f"程序跑完了!"  # 自定义修改,可加入变量信息(如最优指标、训练剩余时间)

# 如果程序运行总时长超过10分钟,则调用AutoDL微信API来发送微信消息
if (datetime.now().replace(microsecond=0) - time_launch).seconds > 10 * 60:
    resp = requests.post(
        "https://www.autodl.com/api/v1/wechat/message/send",
        json={"name": msg_text},
        headers= {"Authorization": api_token},
    )

注意

AutoDL官方教程中json的titlecontent已不可用,严格按照上述代码修改即可正常使用。