前言

初次使用远程服务器的GPU时遇到了以下问题:

  1. 某些进程本地端结束但是远程服务器仍在运行,导致过分占用GPU进程;
  2. 训练过程必须保证本地电脑开机状态,随着训练时间增长这将变得很不现实;
  3. 试图使用rm命令时出现报错:rm: command not found,一般由环境变量配置出错导致;
  4. 同时使用多个GPU运行网络,导致 GPU资源的浪费。

配置:本地:win10系统Pycharm2022.3.2专业版、远程服务器:Linux系统CUDA Version: 11.2
说明:由于之前一直使用win10系统刚刚接触linux时很多操作都并不熟悉,所以决定记录当下学习过程中遇到的问题。考虑到笔者自身水平有限存在一定的局限性,欢迎在评论区指正,后续也会持续更新。

一、命令行结束进程

很多情况下在本地通过手动停止而结束的进程在远端依旧存在,这时需要kill该进程来避免服务器过于拥堵。

nvidia-smi #查看当前GPU使用情况,找到进程的PID
kill -9 PID #强制结束该进程

关于kill命令可以参考Linux 之 kill 命令入门实践,后续用到了我会再更新相关内容。

二、本机关机状态下远端继续训练网络

内容完全借鉴文章:Tmux 使用教程,但是根据自身使用习惯进行了一定的归纳。

Tmux 本质上是将会话与窗口进行"解绑"的工具,将它们彻底分离这样在本地关闭窗口之后远程服务器将会继续运行,我们只需要在需要时再次载入进程即可。

Tmux命令有三种方式:[1] 命令行运行tmux指令;[2]Tmux窗口运行指令;(两者指令完全相同,因为本质上tmux窗口就是命令行)[3]Tmux窗口使用快捷键。

[1] Tmux指令
# 帮助信息
tmux ls #显示所有快捷键
tmux list-keys #显示所有快捷键
tmux list-commands #显示所有指令信息

# 创建、重命名、退出窗口、杀死进程
tmux new -s <session-name> #创建新tmux(默认命名为0),并进入tmux环境
tmux rename-session -t <old-name> <new-name> #重命名
exit #从tmux中退回到命令行
tmux kill-session -t <session-name> #结束远程服务器的进程
tmux ls #显示所有的tmux进程

# 解绑、重载、切换窗口
tmux detach <session-name> #将当前窗口与命令行解绑
tmux attach -t <session-name> #重新载入某个窗口
tmux switch -t <session-name> #切换窗口
[2] tmux快捷键

注意:当tmux窗口正在运行代码时无法输入命令,此时我们可以通过快捷键切换窗口而不必每次都重启命令行窗口。

# 所有的快捷键都需要先按下:“Ctrl+b”,然后按下对应快捷键
? #相当于list-keys指令,按下"ESC"或"q"退出帮助文件
d #相当于detach指令
s #相当于ls指令,显示所有的tmux窗口,并可以通过选中"Enter"访问
$ #相当于rename-session指令

说明:tmux还可以进行窗格操作和多窗口管理,但是目前对我来说并不需要用到。

三、单GPU训练网络

在使用GPU进行训练时,如果使用了nn.DataParallel时,如果存在多块GPU将会进行并行训练,但是其实我目前的网络很小这样会造成GPU资源的浪费,笔者在最初使用GPU时忽略了这个问题,下面介绍三种解决方案。

方案一:通过os.environ来设置CUDA_VISIBLE_DEVICES
import torch
import os
os.environ["CUDA_VISIBLE_DEVICE"]="0" #指定运行设备为cuda:0
方案二:通过bash脚本设置CUDA_VISIBLE_DEVICES
CUDA_VISIBLE_DEVICES=0 nohup python -u train.py
方案三:每次运行时指定需要的device并进行参数传递

数据搬到GPU上:data.to(“cuda”)
创建数据时指定设备:torch.tensor(, device=“cuda”)
网络搬到GPU上:net.to(“cuda”)(不要使用nn.DataParallel)

四、rm: command not found

在使用rm -rf命令删除文件时突然出现了rm: command not found的报错,而之前还可以正常使用,经过一定的排查发现是可能是环境变量配置上出现了一定问题,激活一下即可。进入根目录:echo $PATH