Skip to content

全新服务器配置科研环境


2023.06.20

近期趁着618活动买了一些硬件组建了一台深度学习工作站,为了更好的解决平时环境搭建中的问题,因此特意记录了全部的搭建过程。不得不说,虽然平时经常有搭建,但是到了自己手里,却还是发现问题不断,折腾了好久才弄好。

换源

查询机器的版本:

cat /etc/os-release

lsb_release -a

此次安装的系统版本是Ubuntu22.04,更换[清华源],具体步骤如下:

# 备份原始的系统源
sudo cp /etc/apt/sources.list /etc/apt/sources.list.bak
# 修改 /etc/apt/sources.list
sudo vim /etc/apt/sources.list
# 或者
sudo gedit /etc/apt/sources.list

# 删除其中的内容,并在其中填入以下内容

# 默认注释了源码镜像以提高 apt update 速度,如有需要可自行取消注释
deb https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ jammy main restricted universe multiverse
# deb-src https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ jammy main restricted universe multiverse
deb https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ jammy-updates main restricted universe multiverse
# deb-src https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ jammy-updates main restricted universe multiverse
deb https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ jammy-backports main restricted universe multiverse
# deb-src https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ jammy-backports main restricted universe multiverse

# deb https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ jammy-security main restricted universe multiverse
# # deb-src https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ jammy-security main restricted universe multiverse

deb http://security.ubuntu.com/ubuntu/ jammy-security main restricted universe multiverse
# deb-src http://security.ubuntu.com/ubuntu/ jammy-security main restricted universe multiverse

# 预发布软件源,不建议启用
# deb https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ jammy-proposed main restricted universe multiverse
# # deb-src https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ jammy-proposed main restricted universe multiverse

# 保存并更新
sudo apt-get update
# 复损坏的软件包,尝试卸载出错的包,重新安装正确版本
sudo apt-get -f install
# 更新软件
sudo apt-get upgrade

应用

在换源以后,就可以继续安装其它各种平时需要用到的软件了,例如远程用的ssh、后台运行的tmux等。

ssh

远程连接使用

# 安装
sudo apt install openssh-server
# 设置开机启动
sudo systemctl status ssh

vim

编辑器

sudo apt-get install vim

tmux

后台运行

sudo apt-get install tmux

curl

sudo apt-get install curl

tree

sudo apt-get install tree

htop

sudo apt-get install htop

ZeroTier

局域网组建

# 下载与安装
curl -s https://install.zerotier.com | sudo bash
# 加入网络
sudo zerotier-cli join [your network ID] # 完成以后还要去网页确认
sudo zerotier-cli join af78bf943630f92e

安装gcc

部分软件对gcc版本有要求,因此需要安装最新的gcc进行支持。

sudo apt-get  install  build-essential
gcc --version

安装完以后,获得版本信息:

最后更新initramfs

sudo update-initramfs -u

git和git lfs

gitgit lfs分别是从GitHub和huggingface上获取模型资源的工具,因此需要提前安装这两个工具在系统中。

# 安装git
sudo apt-get  install  git -y

# 安装git lfs
curl -s https://packagecloud.io/install/repositories/github/git-lfs/script.deb.sh | sudo bash
sudo apt-get install git-lfs
git lfs install

Expect

Expect命令是一个用来处理交互的命令。借助Expect,可以将交互过程中的一些动作(例如,登录跳转机等)写在一个脚本上,使它能够自动完成登录或其他动作。前提是linux/mac使用ssh远程登录没有保存密码或自动登录的功能,因此使用expect脚本的形式实现,保证linux/mac上已经安装了expect(apt-get/brew install expect)。

sudo apt-get install expect

GPU

nvidia driver

  • 删除所有显卡驱动
# 方法1
sudo apt purge nvidia*
sudo apt autoremove
# 方法2
sudo apt-get --purge remove nvidia*
sudo apt autoremove
  • 禁用系统默认显卡驱动nouveau

在安装NVIDIA驱动后,系统重启时可能会出现黑屏,无法进入图形界面。这通常因为NVIDIA驱动与系统自带的nouveau驱动冲突,或者驱动版本不兼容等原因导致黑屏。

#打开系统黑名单:
sudo gedit /etc/modprobe.d/blacklist.conf

#文件末尾填入:
#for nvidia display device install
blacklist vga16fb
blacklist nouveau

blacklist rivafb
blacklist rivatv
blacklist nvidiafb

# 或者填入
blacklist amd76x_edac
blacklist nouveau
options nouveau modeset =0

#保存,然后更新initramfs:
sudo update-initramfs -u
#重启电脑
sudo reboot
#开机后输入:
lsmod | grep nouveau
#没有任何输出说明禁用成功。
#关闭图形界面
sudo service lightdm stop
  • 配置Xorg

在完成NVIDIA驱动安装后,也完成了nouveau禁用,但仍然可能出现黑屏,这多半是需要手动配置Xorg。(此问题多出现在 Ubuntu 20.04 之后的版本。)

# 删除xorg.conf文件
sudo rm /etc/X11/xorg.conf

# 重新生成xorg.conf文件
sudo nvidia-xconfig

# 重启电脑
sudo reboot

安装NVIDIA驱动后,开机黑屏问题:请参考解决Ubuntu装完NVIDIA驱动后黑屏问题的详细步骤及代码解析ubuntu Nvidia显卡驱动安装后 屏幕不能外接显示(扩展显示)的问题

  • 安装

M1.离线安装

驱动下载,下载完成后,按照如下命令进行安装:

sudo bash ./NVIDIA-Linux-x86_64-530.41.03.run

安装结束后,使用nvidia-smi进行测试:

M2.命令行安装

命令行安装的前提是机器联网了。安装的时候有两种命令,第一种是自动安装最新驱动,第二种是手动选择特定版本的驱动程序安装。

# 方法1
sudo ubuntu-drivers autoinstall

# 方法2:安装特定版本
ubuntu-drivers devices
sudo apt install nvidia-driver-xxx

Command 'nvidia-smi' not found, but can be installed with:

sudo apt install nvidia-340               # version 340.108-0ubuntu5.20.04.2, or
sudo apt install nvidia-utils-390         # version 390.157-0ubuntu0.20.04.1
sudo apt install nvidia-utils-450-server  # version 450.248.02-0ubuntu0.20.04.1
sudo apt install nvidia-utils-470         # version 470.256.02-0ubuntu0.20.04.1
sudo apt install nvidia-utils-470-server  # version 470.256.02-0ubuntu0.20.04.1
sudo apt install nvidia-utils-535         # version 535.183.01-0ubuntu0.20.04.1
sudo apt install nvidia-utils-535-server  # version 535.183.06-0ubuntu0.20.04.1
sudo apt install nvidia-utils-550-server  # version 550.90.07-0ubuntu0.20.04.2
sudo apt install nvidia-utils-435         # version 435.21-0ubuntu7
sudo apt install nvidia-utils-440         # version 440.82+really.440.64-0ubuntu6
sudo apt install nvidia-utils-418-server  # version 418.226.00-0ubuntu0.20.04.2

在方法2中,“ubuntu-drivers devices”命令可以查看可用驱动程序,然后使用apt选择对应的版本安装。

cuda

  • 下载

前往Cuda官网下载对应的cuda。目前,cuda更新版本很快,一般来说选择较为新的版本即可,下载链接,选择好版本以后,根据系统版本确定要下载的文件。

wget https://developer.download.nvidia.com/compute/cuda/12.0.0/local_installers/cuda_12.0.0_525.60.13_linux.run
  • 安装

参考已有的教程会有如下两种安装方式,前者是较为通用的,也是官方给出的。后者则是一些避免检查的情况,这里需要说明的是,如果前面Nvidia驱动安装没有问题的话,直接按照第一条命令运行即可,如果没按上述操作,可能第二条命令能否通过也不完全能肯定。

sudo sh cuda_12.0.0_525.60.13_linux.run
sudo sh cuda_12.0.0_525.60.13_linux.run -–no-opengl-files -no-x-check

安装完成后做一下检查:

ls /usr/local/
ls /usr/local/cuda-11.2
ls /usr/local/cuda #和上面那条命令展示出来的内容是一样的,说明建立了软链接

cudnn

  • 下载

和cuda的下载一样,需要去官网下载对应的cudnn文件。这里选择合适自己cuda版本的即可,下载链接(v8.9.7及以前版本)下载链接(新的版本)。需要注意的是,下载cudnn需要账号,一般来说找个邮箱注册一下即可。

这里还需要注意的是,虽然系统是ubuntu22.04,但还是选择如下截图的蓝色框内的版本即可。

这里还有一个问题是,因为需要登录了才能下载,我通常是在笔记本上登录下载后传输到服务器上进行安装,除非是直接在服务器上登录账号下载。

  • 安装包解压

获得下载好的cudnn文件以后,首先对文件进行解压。最近一段时间和以往有了很大不同,早期是直接的tar.gz压缩包,现在换成了tar.xz压缩包,解压有所区别(这里我也不是太清楚区别是什么),我是按照下面的解压方式操作的:

tar -xvf cudnn-linux-x86_64-8.8.0.121_cuda12-archive.tar.xz
  • 执行安装

进入解压包,依次执行下面的命令

sudo cp include/cudnn*.h /usr/local/cuda-12.0/include
sudo cp lib/libcudnn*  /usr/local/cuda-12.0/lib64/
sudo chmod a+r  /usr/local/cuda-12.0/include/cudnn*.h

安装完成后,输入nvcc -V进行测试:

配置环境

最后,还需要进行最后一步,需要将cuda环境配置给用户,这样用户才能使用cuda。

在用户目录下运行vim ~/.bashrc,并在文件末尾添加命令:

# 设置正确的CUDA路径
export CUDA_HOME=/usr/local/cuda-12.0
export PATH=$CUDA_HOME/bin:$PATH
export LD_LIBRARY_PATH=$CUDA_HOME/lib64:$LD_LIBRARY_PATH

最后激活环境source ~/.bashrc

启航

Anaconda

通常选用清华源提供的miniconda作为base环境,详细说明可以看 [清华源]

# 下载miniconda
wget -c https://mirrors.tuna.tsinghua.edu.cn/anaconda/miniconda/Miniconda3-py39_4.9.2-Linux-x86_64.sh
# 安装
bash Miniconda3-py39_4.9.2-Linux-x86_64.sh
# 激活环境
source ~/.bashrc
# 设置开机不自动加载
conda config --set auto_activate_base false

完成以后设置pip和conda的源为清华源,方便后续安装各种包文件

  • pip
# 临时使用
pip install -i https://pypi.tuna.tsinghua.edu.cn/simple some-package
# 长期使用
# 1.升级pip
python -m pip install -i https://pypi.tuna.tsinghua.edu.cn/simple --upgrade pip
# 2.设置清华源
pip config set global.index-url https://pypi.tuna.tsinghua.edu.cn/simple
  • conda

清华源为conda也提供了源服务,详细内容可以访问 [清华源] 了解详细内容。

# 打开配置文件
vim ~/.condarc

# 替换里面的内容为
channels:
  - defaults
show_channel_urls: true
default_channels:
  - https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/main
  - https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/r
  - https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/msys2
custom_channels:
  conda-forge: https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud
  msys2: https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud
  bioconda: https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud
  menpo: https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud
  pytorch: https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud
  pytorch-lts: https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud
  simpleitk: https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud

保存好以后,还需要清理索引缓存:

conda clean -i # 清除索引缓存,保证用的是镜像站提供的索引

PyTorch

PyTorch目前已经成为深度学习不可或缺的框架之一,随着其不断地迭代更新,目前有1.x和2.x两个分支版本,我平时以1.x为主,所以安装了较为新的1.12.0版本。通常都会去官网获取下载命令,访问 [pytorch.org].

# CUDA 11.6
pip install torch==1.12.0+cu116 torchvision==0.13.0+cu116 torchaudio==0.12.0 --extra-index-url https://download.pytorch.org/whl/cu116
# CUDA 11.3
pip install torch==1.12.0+cu113 torchvision==0.13.0+cu113 torchaudio==0.12.0 --extra-index-url https://download.pytorch.org/whl/cu113

为了方便以后进行二次利用,这里我采取了下载本地的操作:

# CUDA 11.6
pip download torch==1.12.0+cu116 torchvision==0.13.0+cu116 torchaudio==0.12.0 --extra-index-url https://download.pytorch.org/whl/cu116 -i https://pypi.tuna.tsinghua.edu.cn/simple

安装好以后需要测试一下是否生效:

# 安装torch
pip install torch-1.12.0+cu116-cp39-cp39-linux_x86_64.whl
# 本地测试

import torch
print(torch.__version__)
print(torch.rand(1, device="cuda"))

上述代码顺利运行不报错,则表示环境配置正常。

用户和权限

权限

  • 让所有用户都可以读写目录内的所有内容
chmod -R 777 /path/to/file_or_directory
  • 将目录内所有文件的所有者改为username
  • 将目录内所有文件的所有组改为groupname
chown -R username /path/to/file_or_directory
chown -R username:groupname /path/to/file_or_directory

挂载新硬盘

  1. 将新硬盘正确安装到机器内;
  2. 查看硬盘分区:
    硬盘安装成功后,开机进入系统,在终端查看 /dev 目录下映射到硬盘的文件。
ls -l /dev/sd*

/dev/sda表示第1块硬盘,/dev/sdb表示第2块硬盘,/dev/sdc表示第3块硬盘。另外,还有一个/dev/sda1表示第1块硬盘的第一个分区,同时可以发现/dev/sdb/dev/sdc没有分区,表示这是新添加的硬盘。

  1. 查看各个硬盘设备的信息:
lsblk -f  / fdisk -l

nvme*的分区是用来安装系统的,第一个SATA硬盘已经划分了一个分区 sda1sdbsdc没有分区。

  1. 创建硬盘分区

使用fdisk工具为新硬盘创建分区:

sudo fdisk /dev/sdb

然后进入fdisk的命令提示界面,通过m查看帮助信息:

根据提示,输入nw来创建新分区并退出。

再次查看分区信息:

ls -l /dev/sd*
  1. 分区格式化
sudo mkfs.ext4 /dev/sdb1
  1. 硬盘挂载

临时挂载用 mount:

mkdir /mnt/disk01 # 创建挂载点
mount /dev/sdb1 /mnt/disk01

umount /mnt/disk01 # 卸载

查看挂载结果:

df -h

永久挂载用 vim /etc/fstab,在文件末尾添加:

/dev/sdb1 /mnt/disk01 ext4 defaults 0 0
  1. 挂载生效
mount -a

设置huggingface国内源和映射路径

  1. 设置国内镜像源
export HF_ENDPOINT=https://hf-mirror.com

# 或者
vim ~/.bashrc
# 添加
export HF_ENDPOINT=https://hf-mirror.com 
source ~/.bashrc
  1. 设置模型下载路径

默认下载路径是: ~/.cache/huggingface,可以将其映射到目标路径(例如:/data/models

ln -s /data/models ~/.cache/huggingface

注意,目标路径必须是一个绝对地址。

无秘钥设置

为提高服务器的安全性,通常需要设置无秘钥登录,这里以设置无秘钥登录为例。

无秘钥设置的核心是关于本地pc和远程服务器之间的ssh秘钥的设置,因此分为两部分:

远程服务器设置 本地pc设置

  • 远程服务器设置
# 生成秘钥
ssh-keygen -t rsa
# 将秘钥添加到authorized_keys文件中
cat ~/.ssh/id_rsa.pub >> ~/.ssh/authorized_keys
# 设置权限
chmod 600 ~/.ssh/authorized_keys
  • 本地pc设置
# 将本地pc的公钥添加到远程服务器的authorized_keys文件中
cat ~/.ssh/id_rsa.pub >> ~/.ssh/authorized_keys

设置完成后,即可完成在本地pc无秘钥登录远程服务器。