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 "+------------------------------------------------------------------------------+"