这绝对是你见过的最全深度学习服务器管理配置手册,学不会你打我
这绝对是你见过的最全深度学习服务器管理配置手册,学不会你打我
这绝对是你见过的最全深度学习服务器管理/配置手册,学不会你打我
最近在配置服务器,遇到了不少问题,在此整理记录一下。主要是以下几个方面:多用户管理、服务器环境配置、Anaconda虚拟环境安装TensorFlow/PyTorch、远程访问。
目录
一、多用户管理
1、新建/删除用户
参考:
linux新建用户命令有两个:useradd和adduser。这两个命令略有区别,总结如下:
1、adduser会自动创建用户组,useradd不会自动创建,需要加参数
2、adduser会自动创建用户目录,useradd不会自动创建,需要加参数
3、adduser会自动选择shell版本,useradd不会自动选择
4、adduser会提示添加用户密码,useradd不会
推荐使用adduser来创建新用户,设置完密码之后,一切默认即可:
sudo adduser test_user
参考:
类似地,删除用户命令也有两个:userdel和deluser,区别如下:
1、deluser的选项要比userdel丰富,功能要更强大
2、deluser可以删除普通用户、从系统中删除用户组、将用户从一个组中删除
推荐使用usedel来删除用户,并使用-r选项删除用户目录:
sudo userdel -r test_user
2、更改用户权限
参考:
对于新建的用户可能需要赋予root权限,推荐使用如下方法:
1、vim /etc/sudoers ,找到下面内容
## Allow root to run any commands anywhere
root ALL=(ALL) ALL
2、在root后添加如下内容
test_user ALL=(ALL) ALL
3、修改后的文件内容如下,此时通过sudo命令,test_user即可获得root权限
## Allow root to run any commands anywhere
root ALL=(ALL) ALL
test_user ALL=(ALL) ALL
二、服务器环境配置
1、安装NVIDIA驱动
对于深度学习服务器,可以使用nvidia-smi命令查看显卡使用情况,这就需要安装NVIDIA驱动。
1、去 下载显卡对应的驱动版本,先选择显卡版本,然后点击搜索和下载即可
2、上传驱动程序至服务器,并赋予可执行权限
sudo chmod +x NVIDIA-Linux-x86_64-515.76.run
3、安装驱动程序,然后按照提示安装即可
sudo ./NVIDIA-Linux-x86_64-515.76.run
安装过程可能遇到如下问题,对应解决方案如下:
参考:
1、An NVIDIA kernel module ‘nvidia-drm‘ appears to already be load
原因:因为安装的是Ubuntu 图形化版本,之前也安装了 NVIDIA 驱动和 CUDA,系统加载图形化界面后,就会自动加载运行 NVIDIA 相关模块(如:nvidia-drm、nvidia-modeset 等)。
解决方法:启动 Ubuntu 系统时不让系统加载图形化界面 。在终端命令模式下卸载 NVIDIA 驱动,再重装新的驱动。
# 1. 获得超级用户权限
sudo -i
# 2. 关闭所有使用 GPU 的进程
sudo systemctl isolate multi-user.target
sudo modprobe -r nvidia-drm
# 3. 重装 NVIDIA 驱动
sudo ./NVIDIA-Linux-x86_64-XX.run
# 4. 打开使用GPU的进程
sudo systemctl set-default multi-user.target
# 5. 重新启动
sudo reboot
2、缺失gcc或make
sudo apt-get install gcc
sudo apt-get install make
3、x server或nouveau相关
sudo ./NVIDIA-Linux-x86_64-XX.run --no-x-check --no-nouveau-check
4、貌似安装驱动时加上 –no-opengl-files可以避免重启后nvidia-smi命令失效,就不需要修改内核啦!
5、如果出现ERROR: Unable to load the kernel module ‘nvidia.ko’. 安装输出的日志,可能是gcc原因,也可能是nouveau的原因。如果是nouveau的原因,可参考
# 查看lightdm和dgm状态
sudo service lightdm status
service gdm status
# 如果正在运行,就stop;否则忽略即可
sudo service lightdm stop
service gdm stop
# 修改/etc/modprobe.d/blacklist.conf,末尾添加如下两行:
blacklist nouveau
options nouveau modeset=0
# update
sudo update-initramfs -u
# 重启
sudo reboot
# 查看nouveau状态,如果没有输出,则说明ok了
lsmod | grep nouveau
2、安装CUDA Toolkit
1、去 选择要安装的版本
2、以cuda 11.1为例,选择系统配置
3、执行安装命令,由于前面已经安装了nvidia驱动,所以在安装选项里要取消Driver
wget https://developer.download.nvidia.com/compute/cuda/11.1.1/local_installers/cuda_11.1.1_455.32.00_linux.run
sudo sh cuda_11.1.1_455.32.00_linux.run
4、将cuda写入环境变量,由于是多用户系统,推荐在/etc/profile文件(所有用户均生效)的末尾写入,也可以在~/.bashrc文件(仅当前用户生效)的末尾写入
#####################cuda11.1#######################
export PATH=$PATH:/usr/local/cuda-11.1/bin
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/usr/local/cuda-11.1/lib64
5、source刷新环境变量
source /etc/profile
安装过程可能遇到如下问题,对应解决方案如下:
1、gcc版本太高
推荐使用gcc 9.4.0,也可以根据提示no-check
参考:
# 1.卸载
sudo apt-get remove gcc gcc-xx #可能有多个版本,都要删掉
sudo apt-get remove g++
# 2.安装gcc、g++
sudo apt-get install gcc # 默认安装的是gcc 9.4.0
sudo apt-get install build-essential
3、安装cuDNN
1、去 选择要安装的版本
2、以cuda 11.1和cuDNN8.9.7为例,选择对于文件
3、下载后解压,然后复制文件到指定位置。具体可参考
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 lib/* /usr/local/cuda-11.1/lib64/
sudo cp include/* /usr/local/cuda-11.1/include/
sudo chmod a+r /usr/local/cuda-11.1/lib64/*
sudo chmod a+r /usr/local/cuda-11.1/include/*
# 验证
cat /usr/local/cuda-11.1/include/cudnn_version.h | grep CUDNN_MAJOR -A 2
# 老版本使用
cat /usr/local/cuda-11.1/include/cudnn.h | grep CUDNN_MAJOR -A 2
4、完成后使用apt install可能会出现 libcudnn_cnn_train.so.8 is not a symbolic link
参考 ,新建软链接解决
4、配置启动内核 (可选,如果安装驱动时加上了no-opengl-files就不用做)
在安装好NVIDIA驱动后,如果重启服务器,可能出现一种奇怪的现象:nvidia-smi命令无法使用,NVIDIA-SMI has failed because it couldn‘t communicate with the NVIDIA driver。
这是由于系统内核版本过高,导致NVIDIA驱动失效,这时候就需要配置启动内核,步骤如下:
1、查看当前内核版本,默认是5.15.0
uname -a
2.安装旧的内核,亲测5.11.0-34-generic可用
参考:
apt-get install linux-image-5.11.0-34-generic linux-headers-5.11.0-34-generic linux-modules-extra-5.11.0-34-generic
如果安装成功,使用
dpkg --list | grep linux-image
就可以从列表中看到 linux-image-5.11.0-34-generic
3.修改系统默认启动内核
需要修改/etc/default/grub文件来设置系统启动的内核,该配置文件默认内容如下:
GRUB_DEFAULT=0 # 默认内核启动项
GRUB_TIMEOUT_STYLE=hidden # 系统启动时菜单是否显示
GRUB_TIMEOUT=0
GRUB_DISTRIBUTOR=`lsb_release -i -s 2> /dev/null || echo Debian`
GRUB_CMDLINE_LINUX_DEFAULT="quiet splash"
GRUB_CMDLINE_LINUX=""
我们要修改的就是第一项,那么如何修改第一项使得我们的启动内核变为我们想要的版本呢?有三种方式:
在重启时,快速按
ESC
进入GNU grub界面,通过启动菜单来观察我们需要的内核,可参考:但是这种方法只适合于本地机器,对于服务器来说,我们通常不会到机房去直接连接机器进行操作。
直接在GRUB_DEFAULT中指定内核版本,可参考:
这种方法直接修改配置文件第一行为:
GRUB_DEFAULT="Advanced options for Ubuntu>Ubuntu, with Linux 5.11.0-34-generic"
注意,如果按照这种方式修改更新并重启后,发现系统内核版本并未切换成功,可能是因为你的系统语言是中文。所以需将第一行修改为:
GRUB_DEFAULT="Ubuntu 高级选项>Ubuntu,Linux 5.11.0-34-generic"
由于第一种方法需要连接机器来实现,那有没有办法不连接机器就可以知道启动菜单呢?当然是有的,这就是第三种方法。可参考:
首先查看启动菜单的配置文件
cat /boot/grub/grub.cfg | grep menuentry # 结果如下: menuentry 'Ubuntu' submenu 'Advanced options for Ubuntu' menuentry 'Ubuntu, with Linux 5.15.0-50-generic' menuentry 'Ubuntu, with Linux 5.15.0-50-generic (recovery mode)' menuentry 'Ubuntu, with Linux 5.15.0-48-generic' menuentry 'Ubuntu, with Linux 5.15.0-48-generic (recovery mode)' menuentry 'Ubuntu, with Linux 5.11.0-34-generic' menuentry 'Ubuntu, with Linux 5.11.0-34-generic (recovery mode)' menuentry 'UEFI Firmware Settings'
在上述显示信息的情况下,说明grub开机启动界面的菜单结构理应如下:
*Ubuntu # *表示一级菜单 *Advanced options for Ubuntu **Ubuntu, with Linux 5.15.0-50-generic # **表示二级菜单 **Ubuntu, with Linux 5.15.0-50-generic (recovery mode) **Ubuntu, with Linux 5.15.0-48-generic **Ubuntu, with Linux 5.15.0-48-generic (recovery mode) **Ubuntu, with Linux 5.11.0-34-generic **Ubuntu, with Linux 5.11.0-34-generic (recovery mode) *UEFI Firmware Settings
所以我们需要将配置文件第一行修改为:
GRUB_DEFAULT="1>4" # 表示进入第1个一级菜单下的第4个二级菜单
(菜单的起始索引为0,所以"Advanced options for Ubuntu"对应的就是0, “Ubuntu, with Linux 5.11.0-34-generic"对应的就是4)
4.更新配置文件并重启
sudo update-grub
sudo reboot
重启完成后,可使用
uname -a
再次查看内核版本是否正常切换
5、挂载硬盘
在配置深度学习服务器时,除了系统盘外,还会存在多个数据盘,为了方便访问,需要将这些数据盘挂载到指定目录。可参考:
1、临时挂载
sudo mkdir /data # 在根目录下新建目录data作为挂载目录
sudo mount /dev/sdb1 /data # 将硬盘/dev/sdb1挂载到/data目录,可通过sudo fdisk -l | grep /dev来查看磁盘情况
2、开机自动挂载
修改/etc/fstab文件,添加如下内容:
/dev/sdb1 /data auto defaults 0 0
命令格式为:
/dev/device mountpoint type rules dump order
设备名称 挂载点 分区类型 挂载选项 dump选项 fsck选项
各参数含义如下:
设备名称 挂载点 分区类型 挂载选项 dump选项 fsck选项
- 设备名称可以通过sudo fdisk -l | grep /dev来查看
- 挂载点即创建的挂载目录
- 分区类型指的是该磁盘的文件系统
- default的意义是在于按照大多数文件系统的缺省值设置挂载定义,即系统的默认定义(对于大多数文件系统的处理方式),其实除了default还有auto就是开机自动挂载,noauto就是开机不自动挂载,nouser就是只有超级用户才挂载,user,所有用户都挂载
- dump 就是从不备份
- fsck的检查顺序,0为不检查,分区为1,其他分区从2开始,这里指的是检查的优先级
三、Anaconda虚拟环境配置
1、安装Anaconda
在使用服务器时,可以使用Anaconda来创建和管理多个虚拟环境,非常好用。安装步骤如下:
1、去 下载安装文件
2、上传至服务器并赋予执行权限
chmod +x Anaconda3-2022.05-Linux-x86_64.sh
3、安装
sh ./Anaconda3-2022.05-Linux-x86_64.sh
注意,安装路径默认是当前用户的home目录下的anaconda3,例如:/home/test_user/anaconda3。在询问是否执行conda initialization时,选择yes,这样就不需要自己配置环境变量了(默认写入~/.bashrc文件)。
2、配置TensorFlow虚拟环境
1、新建一个Python环境
conda create -n tf2.6 python=3.8 # 新建一个名为tf2.6的Python3.8环境
conda activate tf2.6 # 激活tf2.6环境
注:推荐Python环境为3.6-3.9,太高或太低都可能出现一些问题
2、下载TensforFow-GPU版本
pip install tensorflow-gpu==2.6.0 # 通过pip下载tensorflow-gpu的2.6.0版本
3、验证是否安装成功,执行如下Python代码即可:
import tensorflow as tf
tf.test.is_gpu_available()
4、tensorflow最近更新到2.12+版本了,有大坑。2.12+版本不再区分cpu和gpu,所以需要自己配置好cuda和cudnn环境。
如果想安装新版本,有点麻烦,可参考 。推荐的安装方式可参考: ,conda-forge通道很慢,尽量不要使用。
5,直接用pip安装tensorflow-gpu需要配置好cudnn和cuda,具体可参考
1, 从官网download与cuda版本对应的cudnn包
2,解压
3,将指定文件复制到cuda安装目录
4,赋予相关权限
6, 对于cuda,cudnn和tensorflow的对应关系可以去 查看,记得把language设置为英文
3、配置PyTorch虚拟环境
1、新建一个Python环境
conda create -n py1.7 python=3.7 # 新建一个名为py1.7的python3.7环境
conda activate py1.7 # 激活py1.7环境
2、下载PyTorch-GPU版本
去 查看对应版本的安装命令并执行
conda install pytorch==1.7.1 torchvision==0.8.2 torchaudio==0.7.2 cudatoolkit=11.0 -c pytorch
3、验证是否安装成功,执行如下Python代码即可:
import torch
print(torch.__version__)
print(torch.cuda.is_available())
4、注意conda-forge这个通道会比较慢,所以安装pytorch的时候,最好选择不带conda-forge的命令,例如:
# CUDA 11.3, 推荐,速度很快
conda install pytorch==1.12.1 torchvision==0.13.1 torchaudio==0.12.1 cudatoolkit=11.3 -c pytorch
# CUDA 11.6,不推荐,速度很慢
conda install pytorch==1.12.1 torchvision==0.13.1 torchaudio==0.12.1 cudatoolkit=11.6 -c pytorch -c conda-forge
四、服务器远程访问配置
1、配置ssh
配置ssh是服务器配置的第一步,只有这样,才可以通过ssh命令远程访问服务器。
参考:
sudo apt update
sudo apt install openssh-server -y
sudo systemctl status ssh #查看状态
# 如果你的防火墙开启了,使用下面语句
sudo ufw allow ssh
配置好ssh之后,就可以使用ssh命令远程访问服务器了。
ssh username@server_ip -p ssh_port # 例如 ssh test_user@192.168.1.1 -p 22
2、配置xrdp
当配置ssh之后,也只能使用终端来远程访问服务器,如果要使用图形界面,例如Windows的远程桌面来访问就需要配置xrdp。可参考:
sudo apt install xrdp # 安装xrdp
sudo systemctl status xrdp # 查看xrdp状态
sudo adduser xrdp ssl-cert # 将xrdp用户添加到"ssl-cert"用户组
sudo systemctl restart xrdp # 重启xrdp服务
3、配置frp内网穿透
由于服务器一般只限于局域网内访问,这就使得外网远程访问并不友好,可以通过frp配置内网穿透来实现外网访问服务器。可参考:
1、准备
需要准备一台可以正常访问的具有公网ip的外网服务器,可以购买阿里云、腾讯云等云服务器。
外网服务器需要开启相应的访问端口,包括:连接端口和转发映射端口。
在准备好外网服务器之后,去 下载对应的程序包。
2、配置frps服务器端
将程序包上传至外网服务器,并解压
tar -xzvf frp_0.44.0_linux_amd64.tar.gz
配置frps.ini文件
[common] bind_port = 7000 # 外网服务器和本地服务器连接的端口
启动frps服务器
nohup ./frps -c frps.ini >frps.log 2>&1 &
3、配置frpc客户端
将程序包上传至本地网服务器,并解压
tar -xzvf frp_0.44.0_linux_amd64.tar.gz
配置frpc.ini文件
[common] server_addr = 外网服务器公网ip server_port = 7000 [ssh-22] # 转发映射22端口 type = tcp local_ip = 127.0.0.1 local_port = 22 # 本地服务器的22端口 remote_port = 2222 # 外网服务器的2222端口 [ssh-3389] # 转发映射3389端口 type = tcp local_ip = 127.0.0.1 local_port = 3389 # 本地服务器的3389端口 remote_port = 3390 # 外网服务器的3390端口
启动frpc客户端
nohup ./frpc -c frpc.ini >frpc.log 2>&1 &
4、配置frp开机自启
nohup启动只能保证frp服务会一直挂载在后台,如果服务器重启,frp服务也会中断。因此需要配置开机自启,以本地服务器配置frpc开机自启为例。可参考:
1、安装Supervisor
sudo apt install supervisor
2、配置frpc服务
sudo vim /etc/supervisor/conf.d/frpc.conf
文件内容如下:
[program:frpc]
command = /your_frp_path/frpc -c /your_frp_path/frpc.ini
autostart = true
记得给frpc chmod +x 赋予可执行权限
3、重启Supervisor
# 重启supervisor
sudo systemctl restart supervisor
# 查看supervisor运行状态
sudo supervisorctl status
5、配置仅密钥登录
服务器使用ssh密码,在开放外网登录之后,很容易遭到攻击。建议改为仅使用密钥登录。可参考 。
1、生成密钥:
# 1.生成SSH密钥对, 默认在当前用户目录下.ssh目录
ssh-keygen
# 2.将公钥添加到授权密钥文件
cat ~/.ssh/id_rsa.pub >> ~/.ssh/authorized_keys
# 3.更改权限
chmod 600 ~/.ssh/authorized_keys
# 用户目录下的.ssh/id_rsa就是私钥,用这个登录,拷贝到本地就可以删除服务器上的了。
2、禁用密码登录
sudo vim /etc/ssh/sshd_config
以下两项分别设置为no和yes,表示禁用密码,启用密钥。
PasswordAuthentication no
PubkeyAuthentication yes
3、重启SSH服务
sudo systemctl restart sshd
6、配置fail2ban防止爆破
参考 和 。
前者用于frps服务端,后者用于frpc本地端。
五、遇到的其他问题
1、ubuntu网络链接激活失败
参考:
sudo service network-manager restart # 重启网络
sudo service network-manager stop
sudo rm /var/lib/NetworkManager/NetworkManager.state
sudo service network-manager start
2、E:无法定位软件包
参考:
把软件和更新里面的"下载自:主服务器"改为"下载自:中国的服务器"即可