接下来我会使用我校的GPU服务器为例,为大家展示Linux服务器上常用基础命令,主要针对的是从未在远程服务器上进行开发活动的人群,虽然大篇幅罗列了一些常用命令,但为了更好地看懂本文,你需要有一定的Linux基础

示例服务器配置列表如下;一般而言,深度学习新手使用的顶级服务器配置也只是如此了

项目 规格
CPU Inter(R) Xeon(R) Gold 6326 CPU @ 2.90GHz
内存 377GB
GPU NVIDIA GeForce RTX 4090 * 7
操作系统 Ubuntu 20.04.4 LST x86_64

基础配置

服务器操作系统的选择还是以Linux为最优,并且有厂商进行安装与维护,因此操作系统选择、配置等部分就此略过

关于anaconda3的配置,我在anaconda3的安装及使用一文中有粗略介绍,此处不再赘述

如果是大陆境内服务器,那么还需要进行python和Ubuntu换源操作,关于Ubuntu更换国内软件源,可以参考Ubuntu 20.04换国内源 清华源 阿里源 中科大源 163源这篇知乎文章

显卡

一般来说,在安装服务器操作系统的时候厂商都会配置好GPU驱动,如果你的服务器没有安装系统/配置驱动,请直接直接与厂商沟通,NVIDIA的驱动是出了名的麻烦,请不要自己尝试配置驱动

考虑到大部分科学计算服务器使用的都是英伟达显卡,所以可以使用如下命令来查看显卡的详细信息,包括CUDA版本,以验证驱动

nvidia-smi

如果一切正常,输出如下图所示
image_2024-01-11_17-17-40.png安装了七张RTX 4090的服务器 CUDA版本为12

如果是个人组装的计算机,需要自行配置显卡驱动,那么可以阅读知乎Ubuntu配置nvidia显卡驱动、CUDA、CuDNN难点一文,考虑到篇幅,本文不再单开一节详述

也可以参照How to check which CUDA version is installed on Linux一文,检查自己的在Linux系统上安装的CUDA

显卡架构与它的对应型号

我在复现他人研究时发现,由于研究人员使用的显卡配置与我使用的显卡配置不同,因此运行前都需要手动修改代码中的CUDA arch或CUDA gencode,而4090等40系显卡中文互联网上少有此类信息,我特地去英文互联网上寻求答案;

参照某英文博客上Matching CUDA arch and CUDA gencode for various NVIDIA architectures一文,写出了本小节(由于这篇英文博文本身就很优秀,所以接下来的内容几乎是大段的翻译内容)

如果依照架构划分,应当是以下简单表格所示

Fermi Kepler Maxwell Pascal Volta Turing Ampere Ada Hopper Blackwell
sm_20 sm_30 sm_50 sm_60 sm_70 sm_75 sm_80 sm_89 sm_90 ???
sm_35 sm_52 sm_61 sm_72 (Xavier) sm_86 sm_90a (Thor)
sm_37 sm_53 sm_62 sm_87 (Orin)

接下来我会一一罗列各架构的代表显卡,以方便大家更快的寻找

Fermi架构 (CUDA 3.2至CUDA 8)

SM20或SM_20,compute_30 –
代表显卡:GeForce 400, 500, 600, GT-630

Kepler架构 (CUDA 5至CUDA 10)

SM30或SM_30, compute_30 –
代表显卡:generic Kepler, GeForce 700, GT-730

SM35或SM_35, compute_35 –
代表显卡:Tesla K40

SM37或SM_37, compute_37 –
代表显卡:Tesla K80.

Maxwell架构 (CUDA 6至CUDA 11)

SM50或SM_50, compute_50 –
代表显卡:Tesla/Quadro M 系列

SM52或SM_52, compute_52 –
代表显卡:Quadro M6000 , GeForce 900, GTX-970, GTX-980, GTX Titan X

SM53或SM_53, compute_53 –
代表显卡:Tegra (Jetson) TX1 / Tegra X1, Drive CX, Drive PX, Jetson Nano

Pascal (CUDA 8及更高版本)

SM60或SM_60, compute_60 –
代表显卡:Quadro GP100, Tesla P100, DGX-1 (Generic Pascal)

SM61或SM_61, compute_61–
代表显卡:GTX 1080, GTX 1070, GTX 1060, GTX 1050, GTX 1030 (GP108), GT 1010 (GP108) Titan Xp, Tesla P40, Tesla P4, NVIDIA Drive PX2 上的独立 GPU

SM62或SM_62, compute_62 –
代表显卡:NVIDIA Drive PX2 上的集成 GPU, Tegra (Jetson) TX2

Volta (CUDA 9及更高版本)

SM70或SM_70, compute_70 –
代表显卡:DGX-1 with Volta, Tesla V100, GTX 1180 (GV104), Titan V, Quadro GV100

SM72或SM_72, compute_72 –
代表显卡:Jetson AGX Xavier, Drive AGX Pegasus, Xavier NX

Turing (CUDA 10及更高版本)

SM75或SM_75, compute_75 –
代表显卡:GTX/RTX Turing – GTX 1660 Ti, RTX 2060, RTX 2070, RTX 2080, Titan RTX, Quadro RTX 4000, Quadro RTX 5000, Quadro RTX 6000, Quadro RTX 8000, Quadro T1000/T2000, Tesla T4

Ampere (CUDA 11.1及更高版本)

SM80或SM_80, compute_80 –
代表显卡:NVIDIA A100, NVIDIA DGX-A100

SM86或SM_86, compute_86 – (从CUDA 11.1开始)
代表显卡:Tesla GA10x, RTX Ampere – RTX 3080, GA102 – RTX 3090, RTX A2000, A3000, RTX A4000, A5000, A6000, NVIDIA A40, GA106 – RTX 3060, GA104 – RTX 3070, GA107 – RTX 3050, RTX A10, RTX A16, RTX A40, A2 Tensor Core GPU

SM87或SM_87, compute_87 – (从 CUDA 11.4 开始,随 PTX ISA 7.4 / Driver r470 及更高版本引入) – 仅适用于 Jetson AGX Orin 和 Drive AGX Orin

Ada Lovelace (CUDA 11.8及更高版本)

SM89或SM_89, compute_89 –
代表显卡:NVIDIA GeForce RTX 4090, RTX 4080, RTX 6000 Ada, Tesla L40, L40s Ada, L4 Ada

Hopper (CUDA 12及更高版本)

SM90或SM_90, compute_90 –
代表显卡:NVIDIA H100 (GH100), NVIDIA H200

Blackwell (CUDA 12及更高版本)

SM95或SM_95, compute_95 –
代表显卡:NVIDIA B100 (GB100)

基础Linux命令

本处仅罗列最常用Linux命令,更全更详细的命令需要去相应的Linux发行版系统文档中查看;由于不同的Linux发行版有些许差异,虽说大体相同,但若遇到命令错误的情况,请使用搜索引擎检索您所使用的操作系统的相应命令

对于Linux操作命令,初学者毋需死记硬背,需要某种操作而不知道的时候上网查询即可,某些常用命令多用自然就记住了

命令前加 sudo 表示 “super user do” 即使用root权限(最高权限)运行该命令,如果不熟悉Linux系统请慎重使用root权限!

但是某些命令在大部分情况下需要配合root权限一同使用,这些命令在下文会被提及

如果提示 “user is not in the sudoers file. This incident will be reported.” 就表明当前用户无root权限(最高权限)的使用权
image.pnguser is not in the sudoers file

如果对Linux系统已经很熟悉,那么可以直接跳转到下一节

系统操作

shutdown -h now #关机
init 0 #关机
telinit 0 #关机
reboot #重启

系统信息

arch #显示服务器的处理器架构
uname -m #显示服务器的处理器架构
uname -r #显示正在使用的Linux内核版本
cat /proc/cpuinfo #显示CPU info的信息

文件与目录操作

cd /home #进入 /home 目录
cd .. #返回上一级目录
cd ~ #进入个人的主目录
pwd #显示当前工作路径
ls #查看该目录中的文件
ls -l #显示该目录中所有文件的详细信息
ls -a #显示所有文件(包括隐藏文件)
mkdir dir1 #创建一个叫做 ‘dir1’ 的目录
mkdir -p /tmp/dir1/dir2 #创建一个目录树
rm -f file1 #删除一个叫做 ‘file1’ 的文件
rm -rf dir1 #删除一个叫做 ‘dir1’ 的目录并同时删除其内容
mv dir1 new_dir #重命名/移动某个目录
cp file1 file2 #复制一个文件
cp dir/* . #复制一个目录下的所有文件到当前工作目录
cp -a /tmp/dir1 . #复制一个目录到当前工作目录
cp -a dir1 dir2 #复制一个目录

bunzip2 file1.bz2 #解压后缀为 ‘.bz2’的压缩包
bzip2 file1 #压缩一个叫做 ‘file1’ 的文件
gunzip file1.gz #解压后缀为 ‘.gz’的压缩包
gzip file1 #压缩一个叫做 ‘file1’的文件
rar a file1.rar file1 file2 dir1 #同时压缩 ‘file1’, ‘file2’ 以及目录 ‘dir1’
rar x file1.rar #解压rar包
unrar x file1.rar #解压rar包
tar -tf archive.tar #显示后缀为 ‘.tar’ 压缩包中的内容
tar -xvf archive.tar #解压后缀为 ‘.tar’ 的压缩包
tar -xvf archive.tar -C /tmp #将压缩包解压到 /tmp目录下
tar -cvfj archive.tar.bz2 dir1 #创建一个bzip2格式的压缩包
tar -xvfj archive.tar.bz2 #解压一个bzip2格式的压缩包
tar -cvfz archive.tar.gz dir1 #创建一个gzip格式的压缩包
tar -xvfz archive.tar.gz #解压一个gzip格式的压缩包
zip file1.zip file1 #创建一个zip格式的压缩包
zip -r file1.zip file1 file2 dir1 #将几个文件和目录同时压缩成一个zip格式的压缩包
unzip file1.zip #解压一个zip格式压缩包

磁盘操作

df -h #显示已经挂载的分区列表
ls -lSr |more #以尺寸大小排列文件和目录
du -sh dir1 #估算目录 ‘dir1’ 已经使用的磁盘空间
du -sk * | sort -rn #以容量大小为依据依次显示文件和目录的大小

用户操作

groupadd group_name #创建一个新用户组
groupdel group_name #删除一个用户组
groupmod -n new_group_name old_group_name #重命名一个用户组
useradd -c “Name Surname “ -g admin -d /home/user1 -s /bin/bash user1 #创建一个属于 “admin” 用户组的用户
useradd user1 #创建一个新用户
userdel -r user1 #删除某一用户 ( ‘-r’ 排除主目录)
passwd #修改当前用户密码
passwd user1 #修改某一用户的密码 (只允许root执行)

软件包管理工具

不同的Linux发行版有不同的软件包管理工具,此处仅罗列两种最为常见的软件包管理工具

大部分情况下,这些命令需要配合root权限(最高权限),即命令前加 sudo 来完成操作

YUM 软件包管理器(适用于Fedora、RedHat及类似系统)

yum install package_name #安装一个rpm包
yum update package_name.rpm #更新当前系统中所有安装的rpm包
yum update package_name #更新一个rpm包
yum remove package_name #删除一个rpm包
yum list #列出当前系统中安装的所有包
yum search package_name #在rpm仓库中搜寻软件包
yum clean packages #清理rpm缓存删除下载的包
yum clean all #删除所有缓存的包和头文件

APT 软件包管理器(适用于Debian、Ubuntu及类似系统)

apt-get install package_name #安装/更新一个 deb 包
apt-get update #升级列表中的软件包
apt-get upgrade #升级所有已安装的软件
apt-get remove package_name #从系统删除一个deb包
apt-get clean #从下载的软件包中清理缓存
apt-cache search searched-package #返回包含关键词地所要软件包名称

基础vim使用

需要说明的是,vim并不是一个“好用”的工具,只是在Unix及类Unix操作系统(包括Linux系统)命令行环境下,较其他软件好用;如果你使用带有图形操作环境的系统,并且使用的编程语言有一个优秀的IDE(集成开发环境),亦或有一个优秀的文本编辑器,那么就去使用它,不要纠结于某些计算机大神所谓“简洁”、“优雅”、“现代”的文本编辑器vim

某些文件也因为权限问题,而需要用root权限运行vim,以编辑此类文件

使用下行命令查看vim的安装状态

vim –version

image.png

如果没有安装vim,可以运行下面的命令来安装vim

sudo apt install vim

然后使用vim编辑一下vim的配置文件

sudo vim /etc/vim/vimrc

在文件的最下面添加(可以根据自身需求更改)

set number
set autoindent
set cursorline
set ruler
set tabstop=4

以上这些分别表示:

  • 显示行号
  • 自动缩进
  • 突出显示当前行
  • 打开状态栏标尺
  • tab键为4个单位

运行 vim xxx.txt 即可使用vim编辑名为 “xxx.txt” 的文件。进去之后是normal模式,无法修改文件任何内容,输入 :q 即可退出vim

要编辑文件,必须进入编辑模式,输入 i (insert)进入编辑模式,此外输入 a (append), o (open a line below)也可以进入编辑模式。 i 表示在光标的位置插入, a 表示在光标后的位置插入, o 表示在当前的下一行插入

在编辑模式下,按esc键即可退回到normal模式,输入 :wq 表示保存文件,然后退出

注意⚠️:如果对文件进行了修改,输入 :q 就无法退出文件,必须输入 :wq 保存文件后退出,或者输入 :q! 不保存,强制退出

画蛇添足

好孩子不要看这节

众所周知,美丽的终端就是程序员的生产力,该节使用的是zsh终端与oh-my-zsh框架对终端进行美化

安装zsh

先查看一下系统可用shell

cat /etc/shells

如果没有zsh,那么需要运行命令来安装它

sudo apt install zsh

如果系统本身就有zsh,或者刚刚安装了zsh,那么执行

zsh

之后会出来一堆选项,输入 2 继续

配置oh-my-zsh

先把oh-my-zsh框架git clone下来

git clone https://github.com/robbyrussell/oh-my-zsh.git ~/.oh-my-zsh

之后替换zsh默认的配置文件

cp ~/.oh-my-zsh/templates/zshrc.zsh-template ~/.zshrc

​oh-my-zsh的自带插件都储存在 ~/.oh-my-zsh/plugins 目录中,如果希望安装某个插件,可以在 .zshrc 文件的 plugins=(xxx xxx) 这一行加入插件名称;此处仅安装两个插件,命令语法高亮与命令提示插件

语法高亮

git clone https://github.com/zsh-users/zsh-syntax-highlighting.git ${ZSH_CUSTOM:-~/.oh-my-zsh}/plugins/zsh-syntax-highlighting

命令提示

git clone https://github.com/zsh-users/zsh-autosuggestions ${ZSH_CUSTOM:-~/.oh-my-zsh}/plugins/zsh-autosuggestions

编辑 .zshrc 文件,选择一个你喜欢的主题,并配置插件

vim ~/.zshrc

重载配置

source ~/.zshrc

如果你想使用zsh作为你的默认终端,请接着执行

chsh -s /bin/zsh

关掉SSH再登陆就会发现变成漂亮的zsh终端啦

对于程序员来讲,在爆出ERROR之后欣赏一下美丽的终端何尝不是一种解脱呢?

远程开发

仅在本节中介绍一些常用的远程开发配置

Jupyter notebook

考虑到大部分初学者是使用GPU服务器来学习深度学习,加之jupyter notebook配置简单,操作方便,所以直接在服务器上运行jupyter notebook进行开发活动是初学者最好的选择之一;

有一点需要注意地是,如果在服务器上运行

jupyter notebook

后直接访问http://ip:8888/?token=xxxx,Linux系统防火墙可能会阻止你的访问,此时有两种解决方法,一是让防火墙放开8888端口(或者其他jupyter notebook Web端口),二是将服务器上的端口映射到本地,绕开Linux服务器的限制,我会对此一一讲解

开放防火墙

⚠开放Linux防火墙有风险,请谨慎操作,特别是有公网IP的服务器

由于防火墙的特殊性,运行此类命令时前都要加”sudo”使用root权限;演示中使用的是Ubuntu系统,如果是其他Linux系统,命令可能会有所不同

在操作之前先验证一下防火墙状态,还可以查看已经放开的端口

sudo ufw status

如果显示防火墙状态是“active”,说明防火墙已经被开启;如果状态是“inactive”,说明防火墙没有被开启
image.png正常开放的防火墙

开启的防火情,使用如下命令放开端口

sudo ufw allow 8888

放开端口之后如果还是不能访问,可以重启一下防火墙

sudo ufw reload

删除放开的端口

sudo ufw delete allow 8888

将端口映射到本地

实际上可以使用VS Code进行简单的端口映射,但是鉴于大家不一定都安装/习惯使用VS Code,所以此处写一下如何通过本地终端设置端口映射

端口映射的好处之一就是即绕开了Linux防火墙的阻拦,又在一定程度上避免了服务器遭受网络攻击

倘若没有特殊情况,本地端口尽量与需要访问的服务器端口保持一致

ssh -L 8888:localhost:8888 用户名@服务器IP

对于长时间,需要在后台运行端口映射的命令如下

ssh -f -N -L 8888:localhost:8888 用户名@服务器IP

-f 参数允许SSH在后台运行,而 -N 参数表示SSH不执行远程命令

使用桌面环境进行远程开发

不推荐,但对于不熟悉命令行的初学者很友好;不过安装桌面端也是件麻烦事儿,真的会有人使用桌面环境吗?

绝对不是因为我懒,写了个标题缺不想写内容,嗯

还是多熟悉下黑框框吧😁

使用VS Code进行远程开发

需要在本地VS Code下载Remote - SSH插件,随后输入连接服务器即可;VS Code远程开发的配置问题互联网上相关的文章颇多,我就不再班门弄斧了,仅记录一下我配置VS Code远程开发时遇到的问题及解决办法

使用VS Code开发的好处之一就是其可以自动配置端口转发,在我不想执行命令转发端口的时候,都是直接去VS Code配置一下了事

诚然,VS Code连接远程服务器开发依然有许多问题,我会分成小节解决它们

插件版本不匹配

在VS Code中,似乎只有服务器端与本地的插件版本保持一致时,才能生效,这就有些蛋疼了;

我在给服务器端VS Code安装插件的时候并没有考虑到这个问题,导致现在连接服务器端VS Code写代码的时候没有高亮,没有提示,很不习惯,只好在本地先写好代码,再上传到服务器端运行,很麻烦

远程VS Code安装插件

或许是服务器处在大陆地区的原因,安装插件的时间非常长,虽然没办法给他加速,但是可以在本地下载好插件上传到服务器再安装

加载配置时间过长

远程VS Code的延迟不小,并且每次加载配置的时间也不短,每次都需要一两分钟才能加载完,除了耐心等待别无他法😑

结语

此文会持续更新,可以在Blog留言询问我相关问题,如果这个问题比较常见&典型,我会把它添加到这篇文章里