深度学习实验中监控 GPU 脚本

PyTorch 中 选择指定的 GPU

PyTorch默认使用从0开始的GPU,如果GPU0正在运行程序,需要指定其他GPU。

有如下两种方法来指定需要使用的GPU。

1. 类似tensorflow指定GPU的方式,使用CUDA_VISIBLE_DEVICES。

1.1 直接终端中设定:

CUDA_VISIBLE_DEVICES=1 python main.py

1.2 python代码中设定:

import os
os.environ["CUDA_VISIBLE_DEVICES"] = "2"

见网址:http://www.cnblogs.com/darkknightzh/p/6591923.html

2. 使用函数 set_device

import torch
torch.cuda.set_device(id)

该函数见 pytorch-master\torch\cuda\__init__.py。

不过官方建议使用CUDA_VISIBLE_DEVICES,不建议使用 set_device 函数。

监控GPU脚本  需要linux环境下

这个脚本可监控当前机器运行了的进程的 GPU_id    PID   SM  MEM  OCCPUY  PATH等参数

我们仅在debian/ubuntu 环境下进行了测试 

在其他环境下无法使用暂无法告知问题

alias nv='/usr/bin/nvidia-smi'
alias nvp="bash /home/banana/nvidia-smip.sh"

/home/banana/nvidia-smip.sh脚本文件

(base) ➜  ~ cat nvidia-smip.sh
#!/bin/bash
# nvidia-smi pmon -c 1 -s um | sed -r 's/^\s+//g' | tr -s ' ' '\t' | sed '1,2d'
#1.gpu   2.pid   3.type  4.sm   5.mem   6.enc   7.dec   8.fb   9.command
#Idx     #       C/G     %      %       %       %       MB     name


# GPU  PID  SM  MEM  FB  PATH  CMD
nvidia-smi
REGX_STR_PROC="^l.+-> "
SPLIT_CHAR="+"
FORMAT_STR="| %3s  %6s  %3s  %3s  %6s   %-45s|\n"

PS_LIST=$(nvidia-smi pmon -c 1 -s um | sed -r 's/^\s+//g' | tr -s ' ' $SPLIT_CHAR | sed '1,2d')

echo "+------------------------------------------------------------------------------+"
printf "$FORMAT_STR" GPU PID SM MEM OCCPUY "                          HostName: $(hostname)"
printf "$FORMAT_STR" Idx "#" %  %   MB     PATH
echo "|==============================================================================|"
for line in $PS_LIST; do
    gpu=$(echo $line | cut -d $SPLIT_CHAR -f 1)
    ps=$(echo $line | cut -d $SPLIT_CHAR -f 2)

    if [[ $ps != "-" ]];then
        sm=$(echo $line | cut -d $SPLIT_CHAR -f 4)
        mem=$(echo $line | cut -d $SPLIT_CHAR -f 5)
        fb=$(echo $line | cut -d $SPLIT_CHAR -f 8)
        cwd=$(ls -l /proc/$ps | grep cwd | sed -r "s/$REGX_STR_PROC//g" \
                        | sed -r "s/\/home\/banana\/user\/dynamic/~uD/g" \
                        | sed -r "s/\/home\/banana\/user\/local/~uL/g")
        exe=$(ls -l /proc/$ps | grep exe | sed -r "s/$REGX_STR_PROC//g")

        printf "$FORMAT_STR" $gpu $ps "$sm" "$mem" "$fb" $cwd
    fi

done
echo "|==============================================================================|"
echo "|  Tips:                                                                       |"
echo "|        ~uL表示用户的本都目录,即/home/banana/Scholar                         |"
echo "+------------------------------------------------------------------------------+"

使用后

(base) ➜  ~ nvp
Mon Dec 25 05:27:38 2023
+-----------------------------------------------------------------------------+
| NVIDIA-SMI 515.43.04    Driver Version: 515.43.04    CUDA Version: 11.7     |
|-------------------------------+----------------------+----------------------+
| GPU  Name        Persistence-M| Bus-Id        Disp.A | Volatile Uncorr. ECC |
| Fan  Temp  Perf  Pwr:Usage/Cap|         Memory-Usage | GPU-Util  Compute M. |
|                               |                      |               MIG M. |
|===============================+======================+======================|
|   0  NVIDIA GeForce ...  Off  | 00000000:07:00.0 Off |                  Off |
| 84%   66C    P2   414W / 450W |  14125MiB / 24564MiB |    100%      Default |
|                               |                      |                  N/A |
+-------------------------------+----------------------+----------------------+

+-----------------------------------------------------------------------------+
| Processes:                                                                  |
|  GPU   GI   CI        PID   Type   Process name                  GPU Memory |
|        ID   ID                                                   Usage      |
|=============================================================================|
|    0   N/A  N/A      4463      C   python                          14123MiB |
+-----------------------------------------------------------------------------+
+------------------------------------------------------------------------------+
| GPU     PID   SM  MEM  OCCPUY                             HostName: ubuntu-server|
| Idx       #    %    %      MB   PATH                                         |
|==============================================================================|
|   0    4463   99   51   14123   /home/banana/Scholar/BasicSR                 |
|==============================================================================|
|  Tips:                                                                       |
|        ~uL表示用户的本都目录,即/home/banana/Scholar                         |
+------------------------------------------------------------------------------+

注释:

#!/bin/bash
# 这一行是指定脚本的解释器为bash
# nvidia-smi pmon -c 1 -s um | sed -r 's/^\s+//g' | tr -s ' ' '\t' | sed '1,2d'
# 这一行是注释,用#开头,表示执行nvidia-smi命令,查看GPU的性能监控,然后用sed和tr命令对输出进行格式化,最后去掉前两行的表头
#1.gpu   2.pid   3.type  4.sm   5.mem   6.enc   7.dec   8.fb   9.command
#Idx     #       C/G     %      %       %       %       MB     name
# 这两行是注释,表示输出的每一列的含义,分别是GPU编号,进程ID,进程类型,GPU利用率,显存利用率,编码利用率,解码利用率,显存占用,进程名

# GPU  PID  SM  MEM  FB  PATH  CMD
# 这一行是输出的表头,用空格分隔,和上面的注释对应
nvidia-smi
# 这一行是执行nvidia-smi命令,显示GPU的基本信息,如型号,温度,功率,驱动版本等
REGX_STR_PROC="^l.+-> "
# 这一行是定义一个变量,存储一个正则表达式,用于匹配/proc/$ps目录下的符号链接
SPLIT_CHAR="+"
# 这一行是定义一个变量,存储一个分隔符,用于分割nvidia-smi pmon的输出
FORMAT_STR="| %3s  %6s  %3s  %3s  %6s   %-45s|\n"
# 这一行是定义一个变量,存储一个格式化字符串,用于输出每一行的数据,按照指定的宽度和对齐方式

PS_LIST=$(nvidia-smi pmon -c 1 -s um | sed -r 's/^\s+//g' | tr -s ' ' $SPLIT_CHAR | sed '1,2d')
# 这一行是执行nvidia-smi pmon命令,然后用管道符连接sed和tr命令,对输出进行格式化,最后去掉前两行的表头,将结果赋值给变量PS_LIST

echo "+------------------------------------------------------------------------------+"
# 这一行是输出一个分隔符,用+和-组成
printf "$FORMAT_STR" GPU PID SM MEM OCCPUY "                          HostName: $(hostname)"
# 这一行是用printf命令,按照格式化字符串输出表头,其中$(hostname)是执行hostname命令,显示主机名
printf "$FORMAT_STR" Idx "#" %  %   MB     PATH
# 这一行是用printf命令,按照格式化字符串输出表头
echo "|==============================================================================|"
# 这一行是输出一个分隔符,用|和=组成
for line in $PS_LIST; do
# 这一行是开始一个for循环,遍历PS_LIST中的每一行
    gpu=$(echo $line | cut -d $SPLIT_CHAR -f 1)
    # 这一行是用echo和cut命令,按照分隔符提取第一列的数据,即GPU编号,赋值给变量gpu
    ps=$(echo $line | cut -d $SPLIT_CHAR -f 2)
    # 这一行是用echo和cut命令,按照分隔符提取第二列的数据,即进程ID,赋值给变量ps

    if [[ $ps != "-" ]];then
    # 这一行是开始一个if判断,如果进程ID不等于-,表示有进程在使用GPU
        sm=$(echo $line | cut -d $SPLIT_CHAR -f 4)
        # 这一行是用echo和cut命令,按照分隔符提取第四列的数据,即GPU利用率,赋值给变量sm
        mem=$(echo $line | cut -d $SPLIT_CHAR -f 5)
        # 这一行是用echo和cut命令,按照分隔符提取第五列的数据,即显存利用率,赋值给变量mem
        fb=$(echo $line | cut -d $SPLIT_CHAR -f 8)
        # 这一行是用echo和cut命令,按照分隔符提取第八列的数据,即显存占用,赋值给变量fb
        # 获取当前工作目录并进行路径简化
        cwd=$(ls -l /proc/$ps | grep cwd | sed -r "s/$REGX_STR_PROC//g" \
                        | sed -r "s/\/home\/banana\/user\/dynamic/~uD/g" \
                        | sed -r "s/\/home\/banana\/user\/local/~uL/g")
        
        # 获取可执行文件路径
        exe=$(ls -l /proc/$ps | grep exe | sed -r "s/$REGX_STR_PROC//g")

        # 打印GPU进程信息
        printf "$FORMAT_STR" $gpu $ps "$sm" "$mem" "$fb" $cwd
    fi
done

# 打印表尾和额外信息
echo "|==============================================================================|"
echo "|  Tips:                                                                       |"
echo "|        ~uL表示用户的本都目录,即/home/banana/Scholar                         |"
echo "+------------------------------------------------------------------------------+"

  • 3
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值