在新服务器上配环境的 Cheat Sheet

| Views: | Total Words: 18k | Reading Time: 17 mins.

作为一个 CS 或者相关专业的研究者,在新的机器上配环境是一个非常经常遇到的情况,并且往往这些步骤都是重复而不好记的(总不能背那些 bash 命令吧!)。尤其是当笔者在微软实习的过程中,由于 Azure 租的机器都有时限,在机器过期时我就要把工作环境迁到新的机器上,一些东西就要重新开始。虽然大部分时间我都是快速网上查一下就知道怎么干了,但是我感觉把一些东西记下来好像也方便一些。因此这是一个 Cheat Sheet 性质的博客,会贴一些常用的步骤和 bash 命令。

我会持续在这里更新,当我遇到一些我感觉有必要记录下来的配环境步骤时,我就会把它贴在这里。

配置 SSH

SSH(Secure Shell)是最通用的 Linux 加密登录协议,其使用非对称加密。其登录过程大致可以概括为:客户端发送登录请求,服务端收到后向客户端发送自己的公钥,客户端使用公钥加密自己的密码然后发送回去,服务端使用私钥进行解密。

当然,我们一般配置 SSH 是为了方便地免密登录。免密登录的原理和用密码登录有点像,不过反过来了:客户端存着自己的公钥和私钥,然后将公钥发到服务端(一般有一个 authorized_keys 的地方存这些公钥)。当客户端发起免密登录时,服务端会生成一个随机数 R 并用公钥加密发回,然后客户端用私钥解密后发回,服务端对比验证后放行。

这里由于是 Cheat Sheet 就不讲太细了。所以我们的配置过程其实就是:

  • 第一步,在客户端生成自己的 SSH 公钥、私钥对。

    1
    ssh-keygen -t ed25519 -C "<your email address>"

    可以用 -t 参数指定加密方式,默认是 rsa,个人比较推荐较短的 ed25519。这里的 -C 参数是 comment 的意思,也就是让你给这个 key 一个注解,不一定要是邮箱。不过在这个场景下我们用邮箱作为 comment。

    在生成时,一般会问你要不要设置密语(passphrase)。我比较懒,一般不设置(直接按回车跳过)。如果设置了,之后每次访问私钥都需要输一遍。

  • 第二步,把公钥提交到对应处,一般直接告诉管理员让他帮你粘贴到 authorized_keys 里就好了。

  • 第三步,尝试登录

    1
    ssh <user-name>@<host> -p <port> -i <path to your public key>

    如果发现神秘错误需要调试,可以使用 -vvv 参数来输出 Log

    1
    ssh -vvv ...

配置 Github SSH

首先需要机器上安装了 gitssh

  • 第一步,配置用户名和邮箱:

    1
    2
    git config --global user.name "<your github username>"
    git config --global user.email "<your email address>"

    或者写在 .gitconfig 里。注意这里的邮箱会作为你 commit 里的信息,如果不是和你 Github 账号绑定的邮箱,应该不会算进你这个 Github 账号的 commit 数,同时头像会显示成白色的匿名头像。

  • 第二步,生成 ssh 公私钥匙。

    1
    ssh-keygen -t ed25519 -C "<your email address>"
  • 第三步,把公钥提交到 Github 上。

    1
    cat ~/.ssh/id_ed25519.pub

    然后在 Github 网页端的 Setting - SSH / GPG Keys 里新建一个,把公钥贴过去就好。

    搞完之后可以测试一下:

    1
    ssh -T [email protected]

配置深度学习环境

这里主要针对 N 卡用户。常用的深度学习环境的配置一般是 CUDA + PyTorch(Tensorflow 真不熟好吧)。不过为了让服务器好用一点,还需要配置一些比较边边角角的事情。

配置 Python 环境

一般来讲,我们会用 conda 包管理器(当然,还有很多别的,比如 pip、pdm、poetry 等等,但是 conda 的逻辑更适合科研人员一点),conda 的多环境可以方便地让我们在不同的 Python 版本以及对应的依赖之间切换。安装可以选择 Anaconda 或者 Miniconda,这边我推荐后者(更轻量化一点):

  • Miniconda 安装:Link

注意,一般来说安装完你需要进行一次 conda init,然后重启一次 shell。直到 bash 旁边出现 (base) 字样表示安装成功。

配置显卡驱动和 CUDA 环境

现在 CUDA 已经比较成熟了,只需要安装 Toolkit 就能配齐一整套东西,包括编译器 nvcc 等。关于 CUDA 的这些杂记有时间我大概会专开一篇来记录。

首先,先查看显卡驱动和 CUDA 版本对应关系:Link,通常是你需要什么版本的 CUDA(artifact 里写的) -> 你需要什么版本的驱动。如果你安装了显卡驱动,可以使用如下命令查看版本:

1
nvidia-smi

得到的结果一般长这样(在浏览器上看可能有点破碎)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
+---------------------------------------------------------------------------------------+
| NVIDIA-SMI 545.34 Driver Version: 546.26 CUDA Version: 12.3 |
|-----------------------------------------+----------------------+----------------------+
| 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 GTX 1650 Ti On | 00000000:01:00.0 On | N/A |
| N/A 42C P5 7W / 50W | 1137MiB / 4096MiB | 33% Default |
| | | N/A |
+-----------------------------------------+----------------------+----------------------+

+---------------------------------------------------------------------------------------+
| Processes: |
| GPU GI CI PID Type Process name GPU Memory |
| ID ID Usage |
|=======================================================================================|
| No running processes found |
+---------------------------------------------------------------------------------------+

这里显示的 CUDA Version 指的是当前驱动支持的最高 CUDA 版本

安装驱动,首先要卸载旧版驱动。可以通过包管理器进行:

1
2
sudo apt-get remove --purge nvidia*
sudo apt autoremove

也可以用二进制文件进行:

1
2
# 一般在 /usr/bin 下
./nvidia-uninstall

卸载之后需要 reboot 机器一次。

然后下一步是安装新版驱动,一般直接使用包管理器安装即可:

1
sudo apt install nvidia-driver-530 # 530 是版本号

安装结束后使用 nvidia-smi 查看版本号即可。

关于 CUDA 安装,官网的链接有 CUDAToolkitcuDNN。不过其实现在安装 PyTorch 时可以帮你带上 cudatoolkit 和 cudnn 等等东西的安装,所以也可以跳过。

配置 PyTorch

PyTorch 一般直接使用 conda 安装即可。在官网选好版本会有命令给你复制:Link

不过如果 CUDA 版本比较非主流,可以指定安装时的 index 地址。官方提供的 whl 目录在这:Link。具体变成命令就是:

1
2
3
# 示例:安装 CUDA 12.1 的 torch
# torchvision 和 torchaudio 是 optional 的
pip3 install torch torchvision torchaudio --index-url https://download.pytorch.org/whl/cu121

如果你之前没安装 cuda toolkit 的话,

1
conda install pytorch torchvision torchaudio cudatoolkit=12.1 -c pytorch

(PS:现在似乎已经不用类似 CUDA_HOME 或者 CUDA_PATH 之类的环境变量了?不太确定)

安装完成之后可以检查一下版本是否对应:

1
2
3
4
5
6
7
8
9
10
# 查看cuda (这里的cuda版本指的是编译torch时用的版本)
import torch
torch.version.cuda

# 查看torch实际使用的运行时的cuda目录
import torch.utils.cpp_extension
torch.utils.cpp_extension.CUDA_HOME

# 查看是否可用
torch.cuda.is_available()

配置 X11 Forwarding

通常我们使用一个 client 设备通过 SSH 来访问远程的 Linux 服务器,而 SSH 协议正如其名只实现了 Shell 的传输。有时候我们可能希望在远程服务器运行的图形界面能显示到我们的客户端上,这就要用到 X11 协议的 Forwarding。

X11 协议是最常用的 Linux 图形界面协议,它实现了 Linux 上的图形显示。先查看服务器上是否安装了 X11:

1
dpkg -l | grep xserver-xorg-core
  • 第一步,如果没安装,安装 X11(Ubuntu/Debian),这里暂时不考虑用 Wayland

    1
    2
    3
    4
    5
    # 安装 X.Org 服务器
    sudo apt install xorg

    # 安装 xauth 授权管理工具
    sudo apt install xauth

    X11 的使用中最重要的是有一个 DISPLAY 环境命令,它指定了图形界面显示在哪一个显示设备上。在 Forwarding 的场景中,我们会把客户端的显示器映射到服务器上的某个虚拟显示设备中。

  • 第二步,接下来是客户端的配置。对于 macOS 用户,可以使用 xQuartz 软件完成 X11 Forwarding:

    1
    sudo brew install xquartz

    安装后重启,在命令行里输入 xterm 如果找得到说明安装成功。然后在客户端查看 DISPLAY 环境命令,应该可以看到一个复杂的路径(/private/tmp/...

    1
    echo $DISPLAY

    然后修改一下 SSH 的配置文件。打开 ~/.ssh/config(或者其他路径的 ssh config 文件),在对应服务器的 SSH 配置添加以下三行(就是有 HostName 那一堆的一列):

    1
    2
    3
    ForwardAgent yes
    ForwardX11 yes
    ForwardX11Trusted yes
  • 第三步,配置完成后使用 ssh 登录服务端,如果是 VSCode 的话直接连接就行。如果是命令行登录的话,添加一下 -X 或者 -Y 参数(-Y 参数更安全一点)。

    1
    ssh -X <user-name>@<host>

    如果成功的话可以在服务端看到环境变量 DISPLAY 的值。注意,如果该环境变量没有值说明是失败了。一个比较典型的例子是 X11 forwarding request failed on channel 0,一种可能的解决办法是:把 /etc/ssh/sshd_config 中的 X11UseLocalhost 改成 no,并重启 sshd:

    1
    sudo /etc/init.d/ssh restart

    这个解决办法是为了禁止 X11 Forwarding 服务器绑定到 loopback 地址(也就是 localhost),在有些情况会导致 X11 连接失败。

  • 第四步,测试。

    在上一步成功后,接下来在服务端可以用 Python 的 matplotlib 随便画一个图,然后 plt.show(),如果成功会在 Mac 打开一个 xQuarts 窗口显示图像;或者安装 x11-apps 然后使用 xclock 测试

    1
    2
    sudo apt install x11-apps
    xclock

配置 Vim

这个要讲起来可以单开一个文章了。不过在现在 VSCode 如此生猛的情况下,我用 Vim 的频率也不算很高了。我在 Github 上有维护一个自己的 dotfiles,里面大概是有一个看起来还可以的 Vim 配置。

Vim 主要就是折腾插件,先选择一个插件管理器(pathogen 或者 Vundle 等),然后就是下各种插件。如果只是简单更改,可以直接编辑 .vimrc

以及有兴趣的朋友可以了解一下 NeoVim,是个 vim 的 fork 版本,最突出的一点是用更现代的语言 lua 替换了 vim script 的语法,对插件开发人员以及用户阅读配置文件都十分友好。

配置与美化 Shell

Shell 作为大部分时间我们与服务器交互的方式,做一些简单的美化还是很有用的,而且不少有用的插件确实能提高我们的效率。

首先我推荐 zsh 作为 bash 的代替。查看当前的 Shell 是什么:

1
echo $SHELL
  • 第一步,如果还是 bash 的话,首先安装一下 zsh(以 Ubuntu 为例)。

    1
    sudo apt install zsh

    安装完后使用如下命令将默认 Shell 改成 zsh:

    1
    chsh -s /bin/zsh
  • 第二步,安装 oh-my-zsh。这是一个 zsh 美化与扩展框架,也可以理解为一种插件管理器,它能方便地让你更改 zsh 的主题、添加许多有用的插件等等。

    1
    sh -c "$(wget https://raw.github.com/ohmyzsh/ohmyzsh/master/tools/install.sh -O -)"

    如果在国内翻不了墙的话,官方也提供了一个镜像

    1
    sh -c "$(wget -O- https://install.ohmyz.sh/)"

    这里用 wget 作为例子,curl 和 fetch 也都是可以的。安装完成后会看到一个很炫酷的终端画面。

  • 第三步,自由扩展你的 zsh。这里扩展有两方面:换主题(theme)和加插件(plugin)。如果你比较懒,可以学习我的 dotfiles 里的配置。

Update 2024 8 27

看了别人用 Dendron 建的 knowledge base 之后,有点想专门弄个站来记录这种 Cheat Sheets 了,因此这篇 Blog 就暂时封笔。如果搞的差不多了之后会把链接放这里。

Author: SiriusNEO

Published on: Metric Space

All posts on this blog are licensed under the CC BY-NC-SA 4.0 license unless otherwise noted.