[折腾]搭建自己的深度学习环境
一、从连接服务器开始
如何连接服务器
实验室有一台服务器,假设这台服务器的IP如下所示。
服务器IP:172.18.233.211
1、创建密钥
默认环境配好,能够在终端使用ssh命令。
下面的命令表示使用rsa加密算法,密钥长度为4096位。新版本(版本号在6.5之后的)的ssh默认采用ed25519椭圆曲线算法,如果是访问古早服务器,建议生成一个rsa的密钥。
1 | |
输入完毕后按回车,程序会要求输入一个密码,输入完密码后按回车会要求再确认一次密码,如果不想要密码可以在要求输入密码的时候按两次回车,表示密码为空,并且确认密码为空,此时 (c盘>用户>用户名>.ssh) 目录下已经生成好了。提交底下 id_rsa.pub 文件给服务器管理人员。
2、创建账户
联系管理员创建个人账户,并将公钥文件放在个人目录 /home/{whoami}/.ssh 下,并改名为 authorized_keys (注意是 keys 不是 key) 。
注意:若配好密钥还是权限被拒绝,请仔细检查 .ssh 和 authorized_keys的权限,保证 .ssh 文件夹的权限为 700,authorized_keys 的权限为 600 或 644,owner 和 group为用户自己。
3、配置 vscode 连接
在vscode的拓展插件市场找到 remote-SSH 插件并安装。
1 | |
然后刷新一下就可以在左侧找到“实验室服务器”这一项,点击连接。
二、vscode+docker环境配置
1、安装docker
保证在服务器端 docker 和 nvidia-docker 命令可用若 nvidia-docker 不可用,但 docker run 后接参数 -gpus all 能使用也可以。如果工作不需要GPU,可以忽略这一段。
自从docker19.03版本发布,再也不需要单独安装nvidia-docker了,因此在使用下面的命令之前先检查一下服务器上的docker版本。
2、准备 Docker Image
这里以 PyTorch 官方提供的镜像为例,可从 pytorch/pytorch Tags | Docker Hub 自行下载,这里使用的是 pytorch:1.12.1-cuda11.3-cudnn8-runtime 镜像,可使用以下命令直接下载:
1 | |
3、启动镜像
推荐使用如下的参数启动镜像进行测试,而不是开始环境配置,之后自行学习根据需求启动镜像。
1 | |
提醒:使用非 GPU 镜像可以使用 Docker 命令而不是 nvidia-docker 命令。或者加上参数 –gpus all。
解释参数的含义
- -it:启动一个交互式的bash窗口。(使用Windows Docker GUI因为不会指定启动命令,导致你点击启动,docker镜像启动了,因为没有可执行的任务迅速关闭。)
- –rm:关闭容器后自动删除。用来测试启动,并减少手动删除工作量。
- -p:端口映射。{host port}:{container port},就理解成主机端口映射到内部端口
- -v:路径映射。{host volume}:{container volume},如果你有数据集在主机,使用这个参数挂载到容器中。
- –name:设置容器名字。方便日后管理(至少不用手动输入hash值来管理)
- -d:后台启动
4、设置容器 SSH
开启docker容器需要为它单独重新配置ssh连接。就当作是开了一台子电脑。
1 | |
这台子电脑默认root账户登录(放心大胆的造,大不了重开一个)。SSH默认不会开启root的密码登录,可以跳过本小节,保留记录是为了方便查找。
输入下面的命令用 vim 编辑文件
1 | |
从上往下找到下面的内容并改为下面的形式。找到的内容有可能是被注释的,删掉前面的注释符号以修改默认配置。
1 | |
然后重启 ssh-server 服务。
1 | |
至此docker环境配置完毕,检查docker端口对外映射是否成功。
1 | |
不出意外应该返回。
1 | |
这个时候开一个终端测试ssh登录。
1 | |
因为docker下的环境不是真实的操作系统,缺少systemd进程,需要用绝对路径手动拉起ssh-server服务。
1 | |
5、安装conda
建议安装pyenv,或者uv组件来代替conda和pip。
- 第一条指令先下载conda安装包;
- 第二条指令将conda安装到/opt/conda这个目录下;
- 第三条指令利用conda初始化终端;
- 第四条指令重新启动终端,这样conda就可以直接使用了。
1 | |
然后根据自身需求配置conda和pyenv环境。
三、番外
记录一些主线之外,环境配置的记录。
1、镜像打包
环境终于配好了,这时候如果没来得及导出就弄坏了,那不是很尴尬……
打包并提交镜像命令。
1 | |
2、迁移镜像
使用容器就是为了方便环境的迁移。
千辛万苦之后,老师购买了一台插满H100新的服务器,终于不需要和同学抢TITAN V显卡了,快速迁移自己的环境到新服务器。
导出容器,把一个已经创建的容器打包到一个可以迁移的文件
1 | |
会在当前目录生成一个wwww.tar.gz的压缩包,这个压缩包就是你的环境全部,把它复制到新服务器上。
使用下面的命令加载成一个新的镜像,然后重新启动这个镜像即可。
1 | |
3、conda延迟加载
linux下的conda比较安分,基本加载速度很快。在windows下经过多次conda升级后,整个conda的初始化就会越来越慢,有时只是临时开一个powershell处理事情,不需要启动python的虚拟环境,长达10多秒的初始化就十分令人沮丧。这里通过修改powershell的profile文件实现conda的懒加载功能。
输入指令找到profile.ps1的位置。
1 | |
打开编辑这个文件,发现内容如下:
1 | |
全部注释掉,修改成以下内容。注意,path\to\conda.exe需要更换成自己的conda安装路径。
1 | |
4、更新软件源
用root权限执行以下脚本,默认使用sysu.edu.cn的软件源,默认操作系统是ubuntu。
1 | |
5、反向代理下载github
⚠ 进行代理之前务必确保信息安全问题,内网服务器尤其注意。
❌注意,Docker镜像下载管理依赖系统服务systemd,以下配置对docker大概率不起作用。
问题:
学校/公司的一台内网服务器,没有接入互联网(如ping外网不成功),这台服务器使用起来非常不方便。例如无法直接pip安装Python包,需要本地下载上传服务器后离线安装。
或者接入互联网,但缺乏代理导致下载git仓库经常报错。
可以利用ssh的反向端口转发使得这台服务器接入外网,或者走本地主机的代理软件。
假设连接服务器的ssh指令如下ssh wwww@172.18.233.211 -p 22,主机的代理软件端口为7897,确保服务器上7890端口未使用。创建反向代理的命令如下:
1 | |
上一条指令执行完成后,执行以下命令让所有浏览走代理端口:
1 | |