实验室服务器管理经验
前言
研究生阶段,实验室如果是搞深度学习的,那很有可能会有个倒霉蛋被导师要求管理服务器,我就是那个倒霉蛋。我在研究生阶段积累了一些管理服务器的经验,现在把目前的管理方案和经验分享出来,希望能够帮到其他的倒霉蛋,能够更好地度过一个研究生阶段。
当然还有其他的一些方案,其目的都是为了大家的代码环境不会相互影响,比如师兄所写的实验室GPU管理神器Determined,但后来因为新旧服务器管理不一致、维护繁琐、docker镜像会丢失,可能需要重新配置环境、小白不会用老过来问等各种原因,换回物理机的管理方式。
以下的方案使用的操作系统版本是ubuntu 24.04
,能做到使用的用户能够ssh到服务器上写代码跑代码,使用自己独立的账号,与其他同学的深度学习环境不冲突,并且不能杀其他同学的进程(应该),能够查看、运行其他同学的文件,但不能修改。
再往下看之前,用命令行和服务器打交道最重要的一点是,你需要知道你执行的每一条命令都是在干什么,每一个参数的意思是什么。尤其是遇到问题时,绝不要搜了教程就随便执行不知道干了什么的命令。
文件与用户管理
管理机器首先需要了解ubuntu下的文件权限是怎么样的,我们肯定不想让一个用户能够改动其他用户的文件,不然就失去了管理的意义了。菜鸟教程的Linux文件基本属性写的很清楚,这里稍微总结一下,一个文件会有三个重要属性,“属主权限”、“属组权限”和“其他用户权限”。当修改一个文件夹拥有者为A之后,默认权限是rwxrwxr-x
:A对该文件夹能够读、写、执行,和A同属一个用户组的其他用户对该文件夹能够读、写、执行,不能写入,其他用户只能读和执行。
对于用户和用户组管理,菜鸟教程的Linux用户和用户组管理也写得很详细,我们需要了解的主要是,需要给用户指定一个home目录,用于给用户存放自己的文件,也就是useradd
命令的-d
参数,默认的话,比如myuser
的home目录是/home/myuser
,在/home
底下。
但添加用户最好用另一个命令adduser
命令,默认情况下,在用户的home目录底下,会有.bashrc
和.profile
两个文件,并存有默认内容,其作用一是用来给命令行显示颜色,二是给用户写入一些自己的环境变量,但使用useradd
命令创建用户时,不会给新用户创建这两个文件,而adduser
会自动创建,所以创建用户还是使用后一个命令好一点,其用法可以自行搜索。
另外需要注意的一个点是,如果服务器物理上有两个或以上的硬盘,可以拿一个硬盘装系统,作为“系统盘”,另一个硬盘装用户数据,作为“数据盘”,也就是将新创建的用户的home目录指定在“数据盘”上,各种软件装在“系统盘”上。万一服务器出现问题需要重装系统,只需要把“系统盘”抹除,把系统重新装在“系统盘”上,这样“数据盘”不受影响,就不用操心备份用户数据的问题了。当然,这个操作一定要注意重装系统时不要选错安装的硬盘。
一个新机器安装好ubuntu后,会有一个自定义的、拥有管理员权限(也就是可以执行sudo
命令)的账户,为了方便就用myuser
指代,这是区别于root
账户的。这个myuser
账户只有管理员可以用,不要透露给其他不懂的同学。然后给其他每一个同学创建账号,比如用adduser
命令给张三创建账号:
# 创建zhangsan用户,并指定home目录,默认情况下其用户组为zhangsan,
# sudo adduser [username] --home /home/[username]
sudo adduser zhangsan --home /home/zhangsan
如果home目录已经存在的话,还需要注意使用chown
命令递归更改里面所有文件的拥有者为zhangsan
用户,否则张三操作文件时会一直报权限错误:
# sudo chown -R [username]:[username] /home/[username]
# 文件夹里文件越多,执行时间越长
chown -R zhangsan:zhangsan /home/zhangsan
以上方案会将新创建的用户放在其独立的、同名的用户组中,因此比如创建的A和B账户,相互访问其文件时,属于“其他用户权限”这一类,只能读和执行,不能写入。如果需要有其他需求比如使用户相互之间不能查看执行文件等,具体实现就请读者自己钻研钻研了。
以上方案没有给创建的用户加入sudo组中,这也是一个十分重要的点,很多同学遇到问题就去搜各种解决方法,不过脑子直接sudo执行命令,对自己干了些什么事毫无头绪,这样很容易搞崩环境,所以不要轻易把sudo权限给出去,给也是给懂的同学。
环境变量
无论是ubuntu还是windows系统,环境变量都是很重要的系统与用户沟通的手段。用户在环境中设置特定的参数变量,程序读取特定的环境变量来运行。一个代表性的例子就是$PATH
环境变量,当在命令行执行一个命令时,比如Java
,系统会到$PATH
环境变量中的路径去寻找名为Java
的程序去执行。如果没有配置好$PATH
环境变量就会报Command Not Found
错误。而安装Java时,也会要求设置$JAVA_HOME
环境变量,这是因为很多程序会读取该变量去获取Java的路径,而不只是$PATH
,这是约定俗成的。
设置环境变量有两种方式,临时地和永久地。临时设置很好理解,只要在当前命令行中使用export命令就可以暂时地修改环境变量,在当前命令窗口下生效,关闭后就失效:
export http_proxy="http://ip:port"
永久设置则是在配置文件中直接使用export命令,但很多教学设置的文件都不同,我们应该需要知道设置在这几个文件里都有什么不同,不同情况下应该设置在哪里比较好。常见的几个配置文件有~/.bashrc
, ~/.profile
, /etc/bash.bashrc
,当然还有其他的一些文件。主要的差别是,profile类的文件是仅在用户登录时(如 SSH 连接、图形界面登录)加载一次。而bashrc类文件是每次打开非登录的交互式 Shell(如桌面终端)时加载。而/etc
目录下的配置文件是所有用户都会先执行的,然后才执行各用户自己的配置文件(同名变量后者会覆盖前者)。考虑到这样的区别,如果某个用户想要使用他自己的代理,那么就在~/.bashrc
文件中设置他自己的代理,文件最底下增加这两行:
# 注意第二行的"s"的位置,不要打错
export http_proxy="http://ip:port"
export https_proxy="http://ip:port"
如果管理员需要为所有人都设置这样的代理,那么就在/etc/bash.bashrc
文件最底下增加上面这两行。
软件安装
关于软件安装,我个人觉得一个比较好的原则是:一些大家都需要用的工具就“为所有用户安装”,比如curl
,conda
,tmux
,但是一旦涉及到个人环境配置,就让用户自己安装,而不是使用apt安装,比如cuda
。关于这点,我使用conda
和cuda
分别说明。
在安装miniconda时,官方文档里会指引安装到类似PREFIX=/Users/<USER>/miniconda3
的目录里,如果这样安装,会安装到当前用户目录中。但是管理员可以通过指定安装时的PREFIX
参数,使miniconda安装到/usr/local/miniconda3
,这样安装的话,大家都可以使用同一个conda软件,而不是每个用户自己安装一个conda软件。需要注意的是,安装好后,其他用户需要执行一次/usr/local/miniconda3/bin/conda init
命令,才能在以后不加前缀地使用conda命令,像这样conda create env
,否则会报conda command not found
的找不到conda命令的错误。如果不是使用apt安装的公共软件,都应该考虑按以上方式给大家安装使用。
而在深度学习环境中,cuda
是不同用户不一定用同一个版本的,管理员不可以给全部用户安装一个cudatookit包。有些网站教大家到官网下载cudatoolkit包,使用sudo安装后,在/etc/bash.bashrc
文件中添加环境变量。这样的方法会让大家执行nvcc命令时,找到是同一个cuda,而不是他们各自应该使用的cuda版本。更重要的是,cuda应该是在conda虚拟环境下管理的,可以创建conda虚拟环境后,在里面使用conda install
或者pip install
安装,而不是由管理员操心。如果有特殊需求,就请同学自己不使用sudo权限地安装在他们自己的home目录下,在他们自己的.bashrc
引入环境变量,不影响其他人。
另外有些同学想要sudo权限使用apt安装什么包,查清楚conda命令能不能安装,搞深度学习conda基本都能管理大多数的包,包括cuda、nvcc等。但如果涉及显卡驱动,这确实需要管理员这边保持最新。
网络
网络上,每个学校上网的方式不一样,这里主要是考虑深度学习下载安装包时需要科学上网的问题。一般的操作是,在学校内网的某台服务器或电脑上,安装科学上网软件,把代理打开,允许局域网访问,打开防火墙对应端口,以确保这个科学上网软件开启的代理能够在局域网内被其他机器访问。
然后在需要用代理的电脑内的/etc/bash.bashrc
文件中,export所开启代理的ip地址和端口,于是所有用户的环境变量都有这个代理地址了。
然而仅仅配置http_proxy和https_proxy环境变量还不够,使用代理上网时,主要是两种方式:
- 有一些工具会读取环境变量连接网络,比如
apt
、curl
。 - 而一些工具不会读取环境变量,比如
git
、conda
。所以如果想要这些工具连接网络,需要单独配置代理。比如conda使用conda config --set proxy_servers.http http://ip:port
,conda config --set proxy_servers.https http://ip:port
命令进行配置。
遇到一些需要外网的情况,需要判断是属于以上的哪种情况,针对性的解决。如果是代码里需要下载权重文件的,可能也要在参数设置里设置,比如huggingface的from_pretrained
函数:
config = AutoConfig.from_pretrained(
args.model_name_or_path,
proxies={'http': 'http://ip:port/', 'https': 'http://ip:port/'}
)
深度学习环境
深度学习环境看上去特别麻烦,什么显卡驱动,cuda,cudnn,然而我的经验是,只需要:
- (需要管理员)保持显卡驱动最新(链接中的方法2的“安装特定的驱动程序版本”,不推荐方法4的手动下载驱动安装)
- (其他同学)在虚拟环境内根据pytorch官方教程安装pytorch(链接),在conda虚拟环境中自行管理cuda,nvcc这类包就行
就可以了。
重装系统经验
万一不小心崩了,这里给我自己的重装经验
- 备份数据
- 先分清楚数据盘和系统盘,把用户的数据都迁移到数据盘,如果本来就在数据盘就还好,一般容量大的是数据盘,小的是系统盘。
- 没有的话,就拿其他硬盘备份重要数据,重装会抹除全部数据
- 用一个空U盘做ubuntu启动盘进行重装(最好用ubuntu24.04版本)
- 过程中一定要看清楚,安装的是在系统盘!!!担心选错的话可以先把数据盘拔了看一眼还能不能进系统,重装完成后再把数据盘插回去。
- 如果数据盘中直接是每个用户的个人文件夹,可以考虑把数据盘在安装ubuntu系统时直接挂载到
/home
。 - 记得选中安装ssh服务
- 安装好后,先给root设密码:
passwd root
- 启用ssh服务
- 在机房改好ip地址,测试能工位ssh后,就可以在工位继续配环境了
- 挂载数据盘
- 创建/data目录,搜教程先简单的mount一下
- 测试没问题后,看教程配置开机自动挂载
- 重启测试能否开机自动挂载
- 切root用户,把默认用户的home目录改好,并改好其中的文件权限
- 登陆校园网/填好代理,能够上网
- 代理填在/etc/bash.bashrc文件里,其他用户登陆也会有同样的代理
- 安装显卡驱动
- 安装conda在
/usr/local/miniconda3
- 测试cuda
- 默认用户下,执行
/usr/local/miniconda3/bin/conda init
后,重新打开命令行 - 创建conda虚拟环境
- 在其中安装pytorch并测试pytorch能否使用显卡
- 默认用户下,执行
- 按照上面的教程创建其他用户
- 建议使用的密码不能是弱密码
- 测试创建的用户能不能正常ssh
踩过的一些坑
- 给ubuntu-22.04-server安装图形界面后,使用snap store应用和用该商店安装的firefox时,发现无法读取键盘输入,但鼠标能够点击,其他系统应用正常使用。谷歌后发现该问题是由于更改了用户的默认home目录到了其他地方,snap应用出现bug。而给ubuntu-24.04-server机器安装图形界面后,修改snap设置没有问题。
- http_proxy和https_proxy的拼写不要有误,代理地址中
http://
是看代理软件的,一般不带"s",而不是看http_proxy还是https_proxy。 - 创建用户时设置的密码不能太简单,还有和用户名相同,曾经试过简单的用户名+同样的密码被别人撞对并拿去攻击其他电脑。
- 学校的校园网登录是用浏览器登录的,如果A电脑(浏览器)正在使用B电脑开启的代理,然后在A电脑上登录校园网时,会引发vscode不断重复连接的问题,登录校园网需要注意。