Skip to content

Ubuntu 深度学习服务器配置(管理员篇)

4917字约16分钟

Deep Learning

2024-12-21

本篇博客主要记录 Ubuntu 深度学习服务器配置从删库到跑路

在昨天12月20日下午本来一切配置妥当,但是晚上输入 nvidia-smi 突然报错

原因可能是没有把自动更新关掉,系统自动更新了 NVIDIA 库文件,和驱动不匹配,我尝试更新驱动,失败了,导致服务器差点成砖了,后续重装了四次系统,终于在12月21日下午4点恢复正常使用,在此记录下,可为以后的服务器管理员重装作参考

(base) zzy@user:/home/user/Downloads$ ls
Anaconda3-2024.10-1-Linux-x86_64.sh  cudnn-linux-x86_64-8.9.7.29_cuda11-archive         NVIDIA-Linux-x86_64-550.142.run
cuda_11.8.0_520.61.05_linux.run      cudnn-linux-x86_64-8.9.7.29_cuda11-archive.tar.xz
(base) zzy@user:/home/user/Downloads$

1. 重装系统 Ubuntu20.04

准备:一个u盘,一台能联网的windows电脑

1.1 下载 Ubuntu20.04

下载地址:Ubuntu 20.04.6 LTS (Focal Fossa)

往下拉,选择 ubuntu-20.04.6-desktop-amd64.iso 2023-03-16 15:58 4.1G Desktop image for 64-bit PC (AMD64) computers (standard download) 下载到你的windows电脑

1.2 下载 软碟通软件

下载软碟通软件(UltralSO),这个百度即可。

下载安装之后,提示要注册,这个可以不必管它,直接试用即可。 ::: iportant 重要 如果你的u盘有重要文件,请先备份! :::

1.3 刻录到u盘

在左侧打开 Ubuntu 镜像:

启动-写入硬盘镜像,磁盘启动器选择自己U盘,映像文件选择 Ubuntu 系统镜像,写入方式选择 USB-HDD+,点击写入即可。

刻录校验不选

等待十分钟左右,u盘变成:

1.3 u盘启动

给服务器插上u盘,开机后疯狂按 del,直到左下角出现变化,好像是什么正在进入设置,反正左下角有变化就是成功了不用按了

进入主板:

按小键盘的 移动到 Boot

移动到 Boot Option #1- 可以切换启动项,直到启动项是u盘即可:

f10 保存,之后会自己启动 ubuntu,什么都不要按:

1.4 安装 Ubuntu

选择 Install Ubuntu

默认英语,直接 Continue

默认 Normal installation 直接 Continue

选择 Erase disk and install Ubuntu

选择 2t 盘

Continue

随便点个国内点,默认上海就行,Continue

设置主机名和管理员,Continue

1.5 2t固态启动

之后会自动重启,出现:

提示你弹出u盘,然后按回车,这时候又会重启,疯狂按 del,去修改启动项为2t盘(修改启动方式上面教过了,不再赘述)

启动成功:

1.6 关闭自动更新

  1. 把那该死的自动更新关掉!
  • 修改配置文件/etc/apt/apt.conf.d/10periodic

    将“1”改为“0”,保存即可

  • 修改配置文件/etc/apt/apt.conf.d/20auto-upgrades

    将“1”改为“0”,保存即可

  • 系统设置-->软件和更新-->更新,将“自动检查更新”和“有新版本时通知我”设置为“从不“,关闭对话框完成设置。

  1. 设置永不息屏

2. 配置网络

重要

我建议你做完 2.1 连上网之后,先去做 3 安装驱动,第三章最容易出问题导致重装系统,如果第三章没问题了,再配置 2.2 和 2.3 也是可以的

2.1 联网

下载锐捷linux版

下载解压后,使用u盘拷到服务器上

服务器网线接口应该使用:

此处有图!

查看当前ip

ip a

这是改名后正常的样子,没改名之前是叫eno4,我试了其实也可以正常用

user@user:~$ ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
    inet6 ::1/128 scope host 
       valid_lft forever preferred_lft forever
2: eth0: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc mq state DOWN group default qlen 1000
    link/ether b4:2e:99:df:df:75 brd ff:ff:ff:ff:ff:ff
    altname eno3
    altname enp66s0
3: eth1: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP group default qlen 1000
    link/ether b4:2e:99:df:df:76 brd ff:ff:ff:ff:ff:ff
    altname eno4
    altname enp68s0
    inet 10.162.32.65/21 brd 10.162.39.255 scope global noprefixroute eth1
       valid_lft forever preferred_lft forever
    inet6 fe80::b62e:99ff:fedf:df76/64 scope link 
       valid_lft forever preferred_lft forever
user@user:~$

网卡改名(其实可以不改)

现在来改名,修改配置文件

sudo nano /etc/default/grub # 我比较喜欢用vim, vi也可以

找到

GRUB_CMDLINE_LINUX=""

改成:

GRUB_CMDLINE_LINUX="net.ifnames=0 biosdevname=0"

保存配置:

sudo grub-mkconfig -o /boot/grub/grub.cfg

重启服务器

查看

ip a

出现

user@user:~$ ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
    inet6 ::1/128 scope host 
       valid_lft forever preferred_lft forever
2: eth0: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc mq state DOWN group default qlen 1000
    link/ether b4:2e:99:df:df:75 brd ff:ff:ff:ff:ff:ff
    altname eno3
    altname enp66s0
3: eth1: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP group default qlen 1000
    link/ether b4:2e:99:df:df:76 brd ff:ff:ff:ff:ff:ff
    altname eno4
    altname enp68s0
    inet 10.162.32.65/21 brd 10.162.39.255 scope global noprefixroute eth1
       valid_lft forever preferred_lft forever
    inet6 fe80::b62e:99ff:fedf:df76/64 scope link 
       valid_lft forever preferred_lft forever
user@user:~$

在rjsupplicant目录联网:

sudo bash ./rjsupplicant.sh -a 1 -n eth0 -d 1 -u 用户名 -p 密码

运行rj.sh

bash rj.sh

参考:Linux下使用锐捷客户端连接网络,以及遇到的问题

2.2 静态ip

服务器默认使用的是dhcp,会导致连不上ssh,因此我们要使用静态 ip

修改etc里面的netplan文件夹,里面有一个很长的yaml文件

sudo vim /etc/netplan/01-network-manager-all.yaml

改成这个样子:

# Let NetworkManager manage all devices on this system
network:
  version: 2
  renderer: NetworkManager
  ethernets:
    eth1:
      dhcp4: false
      addresses: [10.162.32.65/21]
      gateway4: 10.162.32.1
      nameservers:
        addresses: [8.8.8.8, 8.8.4.4]

保存配置:

sudo netplan apply

2.3 启用ssh

sudo apt-get update
sudo apt-get install openssh-server

查询SSH服务状态:

sudo systemctl status ssh

出现:

user@user:~$ sudo systemctl status ssh
 ssh.service - OpenBSD Secure Shell server
     Loaded: loaded (/lib/systemd/system/ssh.service; enabled; vendor preset: enabled)
     Active: active (running) since Sat 2024-12-21 15:22:09 CST; 5h 25min ago
       Docs: man:sshd(8)
             man:sshd_config(5)
   Main PID: 4242 (sshd)
      Tasks: 1 (limit: 154319)
     Memory: 4.3M
     CGroup: /system.slice/ssh.service
             └─4242 sshd: /usr/sbin/sshd -D [listener] 0 of 10-100 startups

12月 21 15:57:29 user sshd[22259]: Accepted password for wmq from 10.162.32.196 port 4669 ssh2
12月 21 15:57:29 user sshd[22259]: pam_unix(sshd:session): session opened for user wmq by (uid=0)
12月 21 16:09:47 user sshd[28304]: Accepted password for wmq from 10.162.32.94 port 56211 ssh2
12月 21 16:09:47 user sshd[28304]: pam_unix(sshd:session): session opened for user wmq by (uid=0)
12月 21 16:10:12 user sshd[28680]: Accepted password for wmq from 10.162.32.94 port 56259 ssh2
12月 21 16:10:12 user sshd[28680]: pam_unix(sshd:session): session opened for user wmq by (uid=0)
12月 21 16:11:15 user sshd[29075]: Accepted password for user from 10.162.32.196 port 8286 ssh2
12月 21 16:11:15 user sshd[29075]: pam_unix(sshd:session): session opened for user user by (uid=0)
12月 21 16:18:20 user sshd[31481]: Accepted password for user from 10.162.32.196 port 10660 ssh2
12月 21 16:18:20 user sshd[31481]: pam_unix(sshd:session): session opened for user user by (uid=0)
user@user:~$

3. 安装 NVIDIA 显卡驱动

这一步最麻烦(

按照网上的教程来做,但是网上的教程有个坑点就是顺序存在一定问题,在下载了 nvidia 驱动后并没有直接安装,而是先禁用了本身的集显 nouveau 后就重启了,导致启动后黑屏无法进入图形化界面。我一开始不知道,试了好几次,因为这个重装了三次系统...

正确顺序应该是,将 nouveau 禁用加入到黑名单后,不要立即重启,下载并安装好对应的显卡驱动了再重启这样使用的就是显卡驱动而非自带的 nouveau 了,这里介绍了在禁用nouveau但没安装显卡驱动直接重启时如何恢复。

安装前需要安装依赖

sudo apt-get update #更新软件列表
#安装编译依赖
sudo apt-get install g++
sudo apt-get install gcc
sudo apt-get install make

3.1 下载 NVIDIA 驱动

下载 NVIDIA 驱动,服务器使用的是 2080ti

进入官网下载

选择如图所示:

下好的文件应该是 NVIDIA-Linux-x86_64-550.142.run

3.2 删除 NVIDIA 相关

在安装驱动之前,先将之前已经安装过与Nvidia相关的内容删除

sudo apt-get remove --purge nvidia*

3.3 禁用 nouveau

首先明确:nouveau是通用的驱动程序,也就是集显,在安装NVIDIA驱动以前需要禁止系统自带显卡驱动nouveau:可以先通过指令 lsmod | grep nouveau 查看nouveau驱动的启用情况,如果有输出表示nouveau驱动正在工作,如果没有内容输出则表示已经禁用了nouveau。

sudo vim /etc/modprobe.d/blacklist.conf

在打开的blacklist.conf末尾添加如下,保存文本关闭

blacklist nouveau
options nouveau modeset=0

在终端输入如下内容,进行更新,这一步一定要小心,千万不要重启服务器!!网上的教程是错误的!!启动后黑屏无法进入图形化界面,更别说安装NVIDIA驱动了!!

sudo update-initramfs -u

3.4 安装 lightdm

sudo apt-get install lightdm

这一步也可以不安装lightdm,使用ubuntu20.04、22.04自带的gdm3显示管理器,直观的区别就是gdm3的登陆窗口在显示器正中间,而lightdm登录窗口在偏左边,正常使用没有区别。

3.5 停止当前的显示服务器,

为了安装新的Nvidia驱动程序,需要停止当前的显示服务器。最简单的方法是使用telinit命令更改为运行级别3。在终端输入以下linux命令后,显示服务器将停止。

sudo telinit 3

这时候会结束图形界面,转到只有命令行的界面,先输入你的用户名和密码登录

禁用X-window服务

sudo /etc/init.d/gdm3 stop

赋予可执行权限:

sudo chmod 777 NVIDIA-Linux-x86_64-550.142.run

3.6 准备安装驱动

安装 NVIDIA 驱动:

sudo ./NVIDIA-Linux-x86_64-*.run –no-opengl-files

会弹出一些选择的窗口:

The distribution-provided pre-install script failed! Are you sure you want to continue? 选择 yes 继续
Would you like to register the kernel module souces with DKMS? This will allow DKMS to automatically build a new module, if you install a different kernel later? 选择 No 继续
Would you like to run the nvidia-xconfigutility to automatically update your x configuration so that the NVIDIA x driver will be used when you restart x? Any pre-existing x confile will be backed up. 选择 NO 继续
安装过程中会询问是否安装32位的,选择 NO 继续

输入:

nivdia-smi

出现:

user@user:~$ nvidia-smi
Sat Dec 21 17:02:48 2024       
+-----------------------------------------------------------------------------------------+
| NVIDIA-SMI 550.142                Driver Version: 550.142        CUDA Version: 12.4     |
|-----------------------------------------+------------------------+----------------------+
| 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 RTX 2080 Ti     Off |   00000000:01:00.0 Off |                  N/A |
| 22%   21C    P8             21W /  250W |       6MiB /  22528MiB |      0%      Default |
|                                         |                        |                  N/A |
+-----------------------------------------+------------------------+----------------------+
|   1  NVIDIA GeForce RTX 2080 Ti     Off |   00000000:41:00.0 Off |                  N/A |
| 22%   23C    P8              3W /  250W |       6MiB /  22528MiB |      0%      Default |
|                                         |                        |                  N/A |
+-----------------------------------------+------------------------+----------------------+
|   2  NVIDIA GeForce RTX 2080 Ti     Off |   00000000:81:00.0 Off |                  N/A |
| 22%   24C    P8              1W /  250W |       6MiB /  22528MiB |      0%      Default |
|                                         |                        |                  N/A |
+-----------------------------------------+------------------------+----------------------+
|   3  NVIDIA GeForce RTX 2080 Ti     Off |   00000000:C1:00.0  On |                  N/A |
| 22%   23C    P8             23W /  250W |     144MiB /  22528MiB |      0%      Default |
|                                         |                        |                  N/A |
+-----------------------------------------+------------------------+----------------------+
                                                                                         
+-----------------------------------------------------------------------------------------+
| Processes:                                                                              |
|  GPU   GI   CI        PID   Type   Process name                              GPU Memory |
|        ID   ID                                                               Usage      |
|=========================================================================================|
|    0   N/A  N/A      1415      G   /usr/lib/xorg/Xorg                              4MiB |
|    1   N/A  N/A      1415      G   /usr/lib/xorg/Xorg                              4MiB |
|    2   N/A  N/A      1415      G   /usr/lib/xorg/Xorg                              4MiB |
|    3   N/A  N/A      1415      G   /usr/lib/xorg/Xorg                             72MiB |
|    3   N/A  N/A      2067      G   /usr/bin/gnome-shell                           68MiB |
+-----------------------------------------------------------------------------------------+
user@user:~$

4. 挂载机械硬盘

目的:把 8t 的机械盘挂到目录 /mnt/data 下,用于我们的用户存放数据集和代码,便于管理

还有一个好处就是重装系统的时候机械盘的数据不会丢失

我们使用的系统盘是 2t 的固态,已经默认配好了,还有 8t 的机械需要更改挂载路径

使用命令查看挂载情况:

lsblk

可以看到,我们的 sda1 位于 /media/user/afdb377b-dod3-48dc-8fe3-001c1370db65 路径下

先取消挂载

sudo umount /media/user/afdb377b-dod3-48dc-8fe3-001c1370db65

创建目标路径:

sudo mkdir -p /mnt/data

挂载到 /mnt/data

sudo mount /dev/sda1 /mnt/data
blkid

查看挂载情况:

df -Th

可以看到,已经切换成功了,设置开机自动挂载

写入 /etc/fstab,要先切换到 root 权限:

sudo -i
sudo echo "/dev/sda1 /mnt/data ext4 defaults  0 0" >> /etc/fstab

输入命令验证一下,如果没有输出就是成功了

mount -a

下面来安装深度学习环境

5. Anaconda

5.1 下载 Anaconda

Anaconda官网地址

wget https://repo.anaconda.com/archive/Anaconda3-2024.10-1-Linux-x86_64.sh

慢的话可以去清华源下载

下载好后安装:

sh Anaconda3-2024.10-1-Linux-x86_64.sh

配置环境变量

修改

sudo vim ~/.bashrc

在最下面添加:

export PATH=/home/user/anaconda3/bin:$PATH

更新环境变量

source ~/.bashrc

使用conda能找到命令就是成功了

5.2 配置全局 conda

/etc/skel/ 下的 .bashrc 可以在新建用户时为其加入默认环境变量

sudo vim /etc/skel/.bashrc

在文件末尾添加 Anaconda 环境变量设置:

# Anaconda setup
export PATH=/home/user/anaconda3/bin:$PATH

6. cuda

6.1 apt 换源

apt 换源,打开配置文件

sudo vim /etc/apt/sources.list

i进入编辑模式,将原有软件源开头全部用 # 注释掉,然后将以下代码复制进去,然后按esc推出编辑模式,输入:wq保存并退出,

deb 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 https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ jammy-backports main restricted universe multiverse
deb http://security.ubuntu.com/ubuntu/ jammy-security main restricted universe multiverse

更新软件包

sudo apt update

6.2 下载 cuda 11.8

下载 cuda 11.8,地址为 Installer for Linux Ubuntu 20.04 x86_64

wget https://developer.download.nvidia.com/compute/cuda/11.8.0/local_installers/cuda_11.8.0_520.61.05_linux.run
sudo sh cuda_11.8.0_520.61.05_linux.run

编辑环境变量

sudo vim ~/.bashrc

i 进入编辑模式,在末尾将以下代码复制进去,然后按esc推出编辑模式,输入:wq保存并退出

export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/usr/local/cuda-11.8/lib64
export PATH=$PATH:/usr/local/cuda-11.8/bin
export CUDA_HOME=$CUDA_HOME:/usr/local/cuda-11.8

刷新环境变量

source  ~/.bashrc

查看cuda是否已经安装成功

nvcc -V

出现:

user@user:~$ nvcc -V
nvcc: NVIDIA (R) Cuda compiler driver
Copyright (c) 2005-2022 NVIDIA Corporation
Built on Wed_Sep_21_10:33:58_PDT_2022
Cuda compilation tools, release 11.8, V11.8.89
Build cuda_11.8.r11.8/compiler.31833905_0
user@user:~$

6.3 不兼容

如果执行 sudo sh cuda_11.8.0_520.61.05_linux.run 时提示 gcc 不兼容,可以使用 gcc-9

sudo apt install gcc-9 g++-9

设置为默认 gcc 版本

sudo update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-9 100
sudo update-alternatives --install /usr/bin/g++ g++ /usr/bin/g++-9 100

检查 gcc 版本是否成功切换

gcc --version

6.4 配置全局 cuda

修改 /etc/profile 文件,它是一个全局配置文件,所有用户登录时都会读取这个文件

sudo vim /etc/profile

在文件末尾添加CUDA环境变量配置:

# CUDA setup
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/usr/local/cuda-11.8/lib64
export PATH=$PATH:/usr/local/cuda-11.8/bin
export CUDA_HOME=/usr/local/cuda-11.8

刷新环境变量

source  ~/.bashrc

7.安装 cudnn

cuDNN 官网历史版本

选择 下载 cuDNN v8.9.7 (2023 年 12 月 5 日), 适用于 CUDA 11.x 下面的 Local Installers for Windows and Linux, Ubuntu(x86_64, armsbsa) 中的 Local Installer for Linux x86_64 (Tar)

下载 cudnn 需要邮箱验证

解压并复制文件

sudo tar -xvf cudnn-linux-x86_64-8.9.7.29_cuda11-archive.tar.xz
cd cudnn-linux-x86_64-8.9.7.29_cuda11-archive/
sudo cp -r lib/* /usr/local/cuda-11.8/lib64/
sudo cp -r include/* /usr/local/cuda-11.8/include/
sudo chmod a+r /usr/local/cuda-11.8/lib64/libcudnn*
sudo chmod a+r /usr/local/cuda-11.8/include/cudnn*

验证是否成功安装

cat /usr/local/cuda-11.8/include/cudnn_version.h | grep CUDNN_MAJOR -A 2

出现:

zzy@user:~$ cat /usr/local/cuda-11.8/include/cudnn_version.h | grep CUDNN_MAJOR -A 2
#define CUDNN_MAJOR 8
#define CUDNN_MINOR 9
#define CUDNN_PATCHLEVEL 7
--
#define CUDNN_VERSION (CUDNN_MAJOR * 1000 + CUDNN_MINOR * 100 + CUDNN_PATCHLEVEL)

/* cannot use constexpr here since this is a C-only file */
zzy@user:~$

因为 cudnn 是直接复制到 cuda 目录的,所以不需要进行配置

至此,你已经完成了环境配置,下面是一些创建用户的命令

8. 管理员常用命令

8.1 新建用户

提示

注意将 zzy 改成你要新建的用户名

创建用户

sudo useradd -m -s /bin/bash zzy

用户自己可以访问,其他人无法访问

sudo chmod 700 /home/zzy

在 /mnt/data 下创建用户对应的文件夹

sudo mkdir /mnt/data/zzy

确保用户只能访问自己的文件夹,用户 zzy 只能访问 /mnt/data/zzy 目录,其他用户无法访问。

sudo chown zzy:zzy /mnt/data/zzy

只有该目录的拥有者可以读取、写入和执行

sudo chmod 700 /mnt/data/zzy

给用户初始化密码

sudo passwd zzy

8.2 删除用户

查找并结束该用户的进程

ps -u zzy

出现:

user@user:~$ ps -u zzy
    PID TTY          TIME CMD
 132988 ?        00:00:00 sh
 133489 ?        00:00:00 sh
 139956 pts/6    00:00:00 sh

使用 kill -9 强制终止进程

sudo kill -9 132988
sudo kill -9 133489
sudo kill -9 139956

删除用户

sudo userdel -r zzy

9. 其他

9.1 为所有用户安装git

sudo apt update
sudo apt install git

出现:

user@user:~$ git --version
git version 2.34.1
user@user:~$

10. 总结

10.1 问题

在重启ubuntu的过程中发现2种情况的黑屏:

  1. 在grub引导菜单选择ubuntu后进入黑屏后,左上角有 - 光标一直在闪烁,操作无反应且一直进不去系统。

  1. 在grub引导菜单选择 Advanced options for Ubuntu,以救援模式启动:

卡在这里操作无反应且一直进不去系统,如下图所示的报错

10.2 原因分析

这两种错误都是由于安装的NVIDIA显卡驱动与ubuntu自带的 nouveau 发生了冲突导致的

下面教你怎么进入单用户模式:

  1. 我尝试了这个方法没用,你看一下就行:

在第二行按e进入编辑

出现:

ro 后面改成 rw single quiet splash nomodeset init=/bin/bash

可以出现命令行,但是按什么键都没有反应

  1. 你需要按照这个方法:

尝试在第一行按e进入编辑

出现:

ro 后面改成 rw single init=/bin/bash

出现:

这时候就可以敲命令了,不过最后还是没救回来


参考资料:

Copyright © 2024 AJohn