深度学习炼丹,当然少不了 GPU 和 Linux 系统了,部分朋友没有 GPU 的话只能租用远程服务器来训练,这样就少不了 Xshell 这样一款利器了,以下,我们就来介绍 Xshell 这款工具在深度学习的时候一些常用的功能和 Linux 命令。

unnamed.png

工具

Xshell 使用

打开 Xshell 工具,点击左上角新建会话,在连接处输入远程服务器的 IP 和 端口号,然后点击用户身份验证,输入账号(一般账户名是 root)密码点击连接即可连接至远程服务器。

image.png

image.png

终端复用器 Tmux

远程进行深度学习的时候,为了确保本地的网络不会终止现有的训练,我们需要在服务器的创建一个会话,就是 XShell 软件关闭的时候,也能确保训练正常进行。

  1. # Ubuntu 或 Debian 安装
  2. sudo apt-get install tmux
  3. tmux new -s <session-name> # 新建会话 <session-name> 是会话名
  4. # Ctrl+D 可以退出会话,但是不会关闭会话,就是程序会在后台一直运行
  5. tmux ls # 查看当前所有会话
  6. tmux attach -t <session-name> # 接入会话 <session-name> 是会话名

参考:https://www.ruanyifeng.com/blog/2019/10/tmux.html

screen

  1. screen [-AmRvx -ls -wipe][-d < 作业名称 >][-h < 行数 >][-r < 作业名称 >][-s ][-S < 作业名称 >]

参数说明
-A  将所有的视窗都调整为目前终端机的大小。
-d <作业名称>  将指定的 screen 作业离线。
-h <行数>  指定视窗的缓冲区行数。
-m  即使目前已在作业中的 screen 作业,仍强制建立新的 screen 作业。
-r <作业名称>  恢复离线的 screen 作业。
-R  先试图恢复离线的作业。若找不到离线的作业,即建立新的 screen 作业。
-s  指定建立新视窗时,所要执行的 shell。
-S <作业名称>  指定 screen 作业的名称。
-v  显示版本信息。
-x  恢复之前离线的 screen 作业。
-ls 或 —list  显示目前所有的 screen 作业。
-wipe  检查目前所有的 screen 作业,并删除已经无法使用的 screen 作业。

  1. screen -S yourname -> 新建一个叫 yourname session
  2. screen -ls -> 列出当前所有的 session
  3. screen -r yourname -> 回到 yourname 这个 session
  4. screen -d yourname -> 远程 detach(脱离) 某个 session
  5. screen -d -r yourname -> 将这个会话从它所在的终端分离,转移到新的终端上来,如果 screen -r 没有作用的情况下可以使用

https://www.runoob.com/linux/linux-comm-screen.html
https://www.cnblogs.com/mchina/archive/2013/01/30/2880680.html

传输工具

如果你有两台服务器,可能需要传输数据或者模型的话,可以使用 Linux 是传输功能,相关的命令如下:

  1. apt install ssh # 安装必要包
  2. # 本地传输文件到远程服务器
  3. scp -P [remote-port] filename root@ip:/dir/ # 传输 filename 文件到远程服务器的 dir 文件夹下
  4. scp -P [remote-port] -r [文件夹] root@ip:/root/code # 传输 文件夹到远程服务器的 /root/code/ 文件夹下

远程访问tensorboard

对于深度学习炼丹师来说,可视化的使用是必不可少的,那么如何将远程服务器可视化到本地,请看以下操作的截图

需要确保 tensorflow、tensorboard、tensorboardX 的版本一致,然后在 xshell 中进行设置,设置完成以后,运行 tensorboard --logdir='logs' --port=6006 其中 logs/ 是运行日志的文件夹,并指定端口,然后在本地浏览器打开 http://localhost:6006/ 即可

Linux 常用命令/工具 - 图4

image.png

命令

GPU使用情况

一些场景下,可能需要查看 GPU 的运行状况,来调节 batchsize 大小,可以使用以下命令

  1. watch -n 10 nvidia-smi # 查看 GPU 使用情况,每 10s 刷新一次,可以设置小一点,如 0.1 可以实时刷新

Linux 常用命令/工具 - 图6

以下是对上图参数的说明:

  • Fan:显示风扇转速,数值在 0 到 100% 之间,是计算机的期望转速,如果计算机不是通过风扇冷却或者风扇坏了,显示出来就是 N/A;
  • Temp:显卡内部的温度,单位是摄氏度;
  • Perf:表征性能状态,从 P0 到 P12,P0 表示最大性能,P12 表示状态最小性能;
  • Pwr:能耗表示;
  • Bus-Id:涉及 GPU 总线的相关信息;
  • Disp.A:是 Display Active 的意思,表示 GPU 的显示是否初始化;
  • Memory Usage:显存的使用率;
  • Volatile GPU-Util:浮动的 GPU 利用率;
  • Compute M:计算模式;

查看文件数目

深度学习当然少不了数据,那么有时需要对数据的情况进行简单的查看计数,可以使用一下命令

lsgrepwc 三者的组合可以实现多种文件数目的查看

  1. ls -l | grep "^-" | wc -l # 统计当前目录下文件的个数(不包括目录(即统计有后缀名的文件数量))
  2. # 递归查看
  3. for a in `find . -mindepth 1 -maxdepth 1 -type d|sort -r`; do echo "$a:`find $a |wc -l`"; done
  4. ls -lR| grep "^-" | wc -l # 统计当前目录下文件的个数(包括子目录)
  5. ls -lR | grep "^d" | wc -l # 查看某目录下文件夹 (目录) 的个数(包括子目录)

下面是 lsgrepwc 参数的具体说明

  • ls
  1. -a 显示所有文件及目录 (ls 内定将文件名或目录名称开头为 "." 的视为隐藏档,不会列出)
  2. -l 除文件名称外,亦将文件型态、权限、拥有者、文件大小等资讯详细列出
  3. -r 将文件以相反次序显示 (原定依英文字母次序)
  4. -t 将文件依建立时间之先后次序列出
  5. -A -a ,但不列出 "." (目前目录) ".." (父目录)
  6. -F 在列出的文件名称后加一符号;例如可执行档则加 "*", 目录则加 "/"
  7. -R 若目录下有文件,则以下之文件亦皆依序列出
  • grep:用于查找文件里符合条件的字符串。
  1. -a --text : 不要忽略二进制的数据。
  2. -A <显示行数> --after-context=< 显示行数 > : 除了显示符合范本样式的那一列之外,并显示该行之后的内容。
  3. -b --byte-offset : 在显示符合样式的那一行之前,标示出该行第一个字符的编号。
  4. -B <显示行数> --before-context=< 显示行数 > : 除了显示符合样式的那一行之外,并显示该行之前的内容。
  5. -c --count : 计算符合样式的列数。
  6. -C <显示行数> --context=< 显示行数 > -< 显示行数 > : 除了显示符合样式的那一行之外,并显示该行之前后的内容。
  7. -d <动作> --directories=< 动作 > : 当指定要查找的是目录而非文件时,必须使用这项参数,否则 grep 指令将回报信息并停止动作。
  8. -e <范本样式> --regexp=< 范本样式 > : 指定字符串做为查找文件内容的样式。
  9. -E --extended-regexp : 将样式为延伸的正则表达式来使用。
  10. -f <规则文件> --file=< 规则文件 > : 指定规则文件,其内容含有一个或多个规则样式,让 grep 查找符合规则条件的文件内容,格式为每行一个规则样式。
  11. -F --fixed-regexp : 将样式视为固定字符串的列表。
  12. -G --basic-regexp : 将样式视为普通的表示法来使用。
  13. -h --no-filename : 在显示符合样式的那一行之前,不标示该行所属的文件名称。
  14. -H --with-filename : 在显示符合样式的那一行之前,表示该行所属的文件名称。
  15. -i --ignore-case : 忽略字符大小写的差别。
  16. -l --file-with-matches : 列出文件内容符合指定的样式的文件名称。
  17. -L --files-without-match : 列出文件内容不符合指定的样式的文件名称。
  18. -n --line-number : 在显示符合样式的那一行之前,标示出该行的列数编号。
  19. -o --only-matching : 只显示匹配 PATTERN 部分。
  20. -q --quiet --silent : 不显示任何信息。
  21. -r --recursive : 此参数的效果和指定 "-d recurse" 参数相同。
  22. -s --no-messages : 不显示错误信息。
  23. -v --revert-match : 显示不包含匹配文本的所有行。
  24. -V --version : 显示版本信息。
  25. -w --word-regexp : 只显示全字符合的列。
  26. -x --line-regexp : 只显示全列符合的列。
  27. -y : 此参数的效果和指定 "-i" 参数相同。
  • wc
  1. -c --bytes --chars 只显示 Bytes 数。
  2. -l --lines 只显示行数。
  3. -w --words 只显示字数。
  4. --help 在线帮助。
  5. --version 显示版本信息。

查看文件大小(bit、GB 等)

  1. du -b [filename or path] # 计算文件夹或者文件的字节数
  2. du -h [filename or path] # 计算文件夹或者文件的大小(以MB、GB 形式展示、符合人的直觉)

image.png

如果有需要对不同单位的数据进行转换的话,可以使用:字节、GB 转换计算器:https://cn.calcuworld.com/字节计算器
image.png

解压缩

https://www.runoob.com/w3cnote/linux-tar-gz.html

一般上传数据是使用压缩包的方式,那么到远程服务器就无法使用可视化操作进行,这时候需要使用命令对压缩包进行解压了,针对不同压缩的格式,下面给出解压缩的命令:

  • rar

要在 linux 下处理 .rar 文件,需要安装 RAR for Linux。下载地址:http://www.rarsoft.com/download.htm,下载后安装即可。

  1. wget https://www.rarlab.com/rar/rarlinux-x64-5.9.0.tar.gz
  2. tar -xzpvf rarlinux-x64-5.9.0.tar.gz
  3. cd rar
  4. make

解压

  1. unrar e all.rar # 解压 all.rar
  • .zip 文件
  1. apt install zip
  2. # 解压
  3. unzip -o test.zip -d tmp/ # 解压 test.zip 文件到 tmp/ 下
  4. # 压缩
  5. /home/html/ 这个目录下所有文件和文件夹打包为当前目录下的 html.zip
  6. zip -q -r html.zip /home/html

解压缩显示进度:https://mlog.club/article/2907799

  • tar.gz 格式
  1. tar -zxvf ×××.tar.gz
  • .7z 文件
  1. sudo apt-get install p7zip-full
  2. # 压缩
  3. 7za a 压缩包.7z 被压缩文件或目录
  4. # 解压
  5. #将压缩包解压到指定目录,注意:指定目录参数-o后面不要有空格
  6. 7za x 压缩包.7z -o解压目录
  7. #将压缩包解压到当前目录
  8. 7za x 压缩包.7z

测试网速

杠杠的网络不管对数据的传输,还是从互联网上下载模型,都是很关键的,所以有必要对远程服务器的网速进行测试一番。

  1. curl -s https://raw.githubusercontent.com/sivel/speedtest-cli/master/speedtest.py | python

image.png

参考:https://github.com/sivel/speedtest-cli

ping

有时候模型无法下载?数据下载太慢?可能不是你的问题,而是墙的问题,这时候,你就需要对网络 ping 一下,

  1. apt install ping # 安装包,会出现以下信息
  2. """
  3. Package ping is a virtual package provided by:
  4. iputils-ping 3:20161105-1 # 仅在 Linux 系统上使用
  5. inetutils-ping 2:1.9.4-2+b1 # 有更多的功能,可以在非 Linux 系统上使用
  6. You should explicitly select one to install.
  7. """
  8. ping bing.com

ping google.com

image.png

ping bing.com

image.png

二者的区别参考:https://unix.stackovernet.com/cn/q/107009

创建用户

https://www.runoob.com/linux/linux-comm-adduser.html

  1. adduser kk //添加用户kk

参考:

常用 Linux 命令

ls

list 的缩写,通过 ls 命令不仅可以查看 linux 文件夹包含的文件,而且可以查看文件权限 (包括目录、文件夹、文件权限)查看目录信息等等。

  1. ls -a 列出目录所有文件,包含以.开始的隐藏文件
  2. ls -A 列出除.及..的其它文件
  3. ls -r 反序排列
  4. ls -t 以文件修改时间排序
  5. ls -S 以文件大小排序
  6. ls -h 以易读大小显示
  7. ls -l 除了文件名之外,还将文件的权限、所有者、文件大小等信息详细列出来

高级用法

  • 列出文件绝对路径(不包含隐藏文件)

    1. ls | sed "s:^:`pwd`/:"
  • 列出文件绝对路径(包含隐藏文件)

    1. find $pwd -maxdepth 1 | xargs ls -ld

cd

cd (changeDirectory) 命令语法:

  1. cd [目录名]

举例

  1. cd / # 进入根目录
  2. cd ~ # 进入 "home" 目录
  3. cd - # 进入上一次工作路径
  4. cd !$ # 进入上一次工作路径

pwd

pwd 命令用于查看当前工作目录路径

  1. pwd # 查看当前路径
  2. pwd -P # 查看软连接的实际路径

mkdir

mkdir 命令用于创建文件夹。

  • -p 一次可以建立多个目录。
    1. mkdir path # 创建 path 文件夹
    2. mkdir -p path/path1/path2 # path 文件夹下的 path1 是不存在的,使用 -p 参数可以一次建立多个目录
    image.png

    rm

    删库跑路的命令

Linux 常用命令/工具 - 图13

删除一个目录中的一个或多个文件或目录,如果没有使用 -r 选项,则 rm 不会删除目录。
如果使用 rm 来删除文件,通常仍可以将该文件恢复原状。

  1. rm [选项] 文件…
  1. rm -i *.log # 删除任何 .log 文件,删除前逐一询问确认:
  2. rm -rf test # 删除 test 子目录及子目录中所有档案删除,并且不用一一确认
  3. rm -- -f* # 删除以 -f 开头的文件

top

显示当前系统正在执行的进程的相关信息,包括进程 ID、内存占用率、CPU 占用率等
image.png

grep

强大的文本搜索命令,grep (Global Regular Expression Print) 全局正则表达式搜索。
grep 的工作方式是这样的,它在一个或多个文件中搜索字符串模板。如果模板包括空格,则必须被引用,模板后的所有字符串被看作文件名。搜索的结果被送到标准输出,不影响原文件内容。

  1. grep [option] pattern file|dir
  2. # 常用参数
  3. -A n --after-context显示匹配字符后n
  4. -B n --before-context显示匹配字符前n
  5. -C n --context 显示匹配字符前后n
  6. -c --count 计算符合样式的列数
  7. -i 忽略大小写
  8. -l 只列出文件内容符合指定的样式的文件名称
  9. -f 从文件中读取关键词
  10. -n 显示匹配内容的所在文件中行数
  11. -R 递归查找文件夹

grep 的规则表达式:

  1. ^ #锚定行的开始 如:'^grep'匹配所有以grep开头的行。
  2. $ #锚定行的结束 如:'grep$'匹配所有以grep结尾的行。
  3. . #匹配一个非换行符的字符 如:'gr.p'匹配gr后接一个任意字符,然后是p。
  4. * #匹配零个或多个先前字符 如:'*grep'匹配所有一个或多个空格后紧跟grep的行。
  5. .* #一起用代表任意字符。
  6. [] #匹配一个指定范围内的字符,如'[Gg]rep'匹配Grep和grep。
  7. [^] #匹配一个不在指定范围内的字符,如:'[^A-FH-Z]rep'匹配不包含A-R和T-Z的一个字母开头,紧跟rep的行。
  8. \(..\) #标记匹配字符,如'\(love\)',love被标记为1。
  9. \< #锚定单词的开始,如:'\<grep'匹配包含以grep开头的单词的行。
  10. \> #锚定单词的结束,如'grep\>'匹配包含以grep结尾的单词的行。
  11. x\{m\} #重复字符x,m次,如:'0\{5\}'匹配包含5个o的行。
  12. x\{m,\} #重复字符x,至少m次,如:'o\{5,\}'匹配至少有5个o的行。
  13. x\{m,n\} #重复字符x,至少m次,不多于n次,如:'o\{5,10\}'匹配5--10个o的行。
  14. \w #匹配文字和数字字符,也就是[A-Za-z0-9],如:'G\w*p'匹配以G后跟零个或多个文字或数字字符,然后是p。
  15. \W #\w的反置形式,匹配一个或多个非单词字符,如点号句号等。
  16. \b #单词锁定符,如: '\bgrep\b'只匹配grep。

ln

功能是为文件在另外一个位置建立一个同步的链接,当在不同目录需要该问题时,就不需要为每一个目录创建同样的文件,通过 ln 创建的链接(link)减少磁盘占用量。
(对于搞深度学习的人来说,通常需要用到大量的数据集,那么 ln 就是一个非常有用的命令)

软链接:

    1. 软链接,以路径的形式存在。类似于 Windows 操作系统中的快捷方式
    1. 软链接可以 跨文件系统 ,硬链接不可以
    1. 软链接可以对一个不存在的文件名进行链接
    1. 软链接可以对目录进行链接

硬链接:

    1. 硬链接,以文件副本的形式存在。但不占用实际空间。
    1. 不允许给目录创建硬链接
    1. 硬链接只有在同一个文件系统中才能创建

需要注意:

  • 第一:ln 命令会保持每一处链接文件的同步性,也就是说,不论你改动了哪一处,其它的文件都会发生相同的变化;
  • 第二:ln 的链接又分软链接和硬链接两种,软链接就是 ln –s 源文件 目标文件,它只会在你选定的位置上生成一个文件的镜像,不会占用磁盘空间,硬链接 ln 源文件 目标文件,没有参数 - s, 它会在你选定的位置上生成一个和源文件大小相同的文件,无论是软链接还是硬链接,文件都保持同步变化。
  • 第三:ln 指令用在链接文件或目录,如同时指定两个以上的文件或目录,且最后的目的地是一个已经存在的目录,则会把前面指定的所有文件或目录复制到该目录中。若同时指定多个文件或目录,且最后的目的地并非是一个已存在的目录,则会出现错误信息。

参数

  1. -b 删除,覆盖以前建立的链接
  2. -s 软链接(符号链接)
  3. -v 显示详细处理过程

image.png

curl

https://butui.me/post/split-download-large-file-with-curl/

chmod

Linux chmod(英文全拼:change mode)命令是控制用户对文件的权限的命令

Linux 常用命令/工具 - 图16
Linux 常用命令/工具 - 图17

https://www.runoob.com/linux/linux-comm-chmod.html

文件查找

  1. which 查看可执行文件的位置。
  2. whereis 查看文件的位置。
  3. locate 配合数据库查看文件位置。
  4. find 实际搜寻硬盘查询文件名称。

https://www.runoob.com/w3cnote/linux-common-command-2.html