[折腾]搭建自己的深度学习环境

一、从连接服务器开始

如何连接服务器

实验室有一台服务器,假设这台服务器的IP如下所示。
服务器IP:172.18.233.211

1、创建密钥

默认环境配好,能够在终端使用ssh命令。

下面的命令表示使用rsa加密算法,密钥长度为4096位。新版本(版本号在6.5之后的)的ssh默认采用ed25519椭圆曲线算法,如果是访问古早服务器,建议生成一个rsa的密钥。

1
ssh-keygen -t rsa -b 4096

输入完毕后按回车,程序会要求输入一个密码,输入完密码后按回车会要求再确认一次密码,如果不想要密码可以在要求输入密码的时候按两次回车,表示密码为空,并且确认密码为空,此时 (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
2
3
4
5
6
Host 实验室服务器
  HostName 172.18.233.211
  User wwww
  Port 22
  IdentityFile C:/Users/xxx/.ssh/id_rsa
  IdentitiesOnly yes

然后刷新一下就可以在左侧找到“实验室服务器”这一项,点击连接。

二、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
sudo docker pull pytorch/pytorch:1.12.1-cuda11.3-cudnn8-runtime

3、启动镜像

推荐使用如下的参数启动镜像进行测试,而不是开始环境配置,之后自行学习根据需求启动镜像。

1
sudo docker run -it --rm --gpus all -p 8022:22 -v ~/remote_workspace:/workspace --name wz_pytorch pytorch/pytorch:1.12.1-cuda11.3-cudnn8-runtime /bin/bash

提醒:使用非 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
2
apt update
apt install openssh-server

这台子电脑默认root账户登录(放心大胆的造,大不了重开一个)。SSH默认不会开启root的密码登录,可以跳过本小节,保留记录是为了方便查找。

输入下面的命令用 vim 编辑文件

1
vim /etc/ssh/sshd_config

从上往下找到下面的内容并改为下面的形式。找到的内容有可能是被注释的,删掉前面的注释符号以修改默认配置。

1
2
PermitRootLogin yes
PasswordAuthentication no

然后重启 ssh-server 服务。

1
service ssh restart

至此docker环境配置完毕,检查docker端口对外映射是否成功。

1
sudo docker port [container-name] 22

不出意外应该返回。

1
0.0.0.0:8022

这个时候开一个终端测试ssh登录。

1
ssh root@[host_ip] -p 8022 -i [path to your id_rsa file]

因为docker下的环境不是真实的操作系统,缺少systemd进程,需要用绝对路径手动拉起ssh-server服务。

1
/usr/sbin/sshd

5、安装conda

建议安装pyenv,或者uv组件来代替conda和pip。

  1. 第一条指令先下载conda安装包;
  2. 第二条指令将conda安装到/opt/conda这个目录下;
  3. 第三条指令利用conda初始化终端;
  4. 第四条指令重新启动终端,这样conda就可以直接使用了。
1
2
3
4
wget https://repo.anaconda.com/miniconda/Miniconda3-latest-Linux-x86_64.sh -O miniconda3.sh
sh miniconda3.sh -b -p /opt/conda
/opt/conda/bin/conda init
/bin/bash

然后根据自身需求配置conda和pyenv环境。

三、番外

记录一些主线之外,环境配置的记录。

1、镜像打包

环境终于配好了,这时候如果没来得及导出就弄坏了,那不是很尴尬……

打包并提交镜像命令。

1
2
# sudo docker commit [container-name] [image]:[tag]
sudo docker commit wwww_pytorch my_pytorch:1.12.1-gpu

2、迁移镜像

使用容器就是为了方便环境的迁移。

千辛万苦之后,老师购买了一台插满H100新的服务器,终于不需要和同学抢TITAN V显卡了,快速迁移自己的环境到新服务器。

导出容器,把一个已经创建的容器打包到一个可以迁移的文件

1
docker container export wwww_pytorch | tar > wwww.tar.gz

会在当前目录生成一个wwww.tar.gz的压缩包,这个压缩包就是你的环境全部,把它复制到新服务器上。

使用下面的命令加载成一个新的镜像,然后重新启动这个镜像即可。

1
docker load wwww.tar www_pytorch:0.1

3、conda延迟加载

linux下的conda比较安分,基本加载速度很快。在windows下经过多次conda升级后,整个conda的初始化就会越来越慢,有时只是临时开一个powershell处理事情,不需要启动python的虚拟环境,长达10多秒的初始化就十分令人沮丧。这里通过修改powershell的profile文件实现conda的懒加载功能。

输入指令找到profile.ps1的位置。

1
$PROFILE

打开编辑这个文件,发现内容如下:

1
2
3
4
5
6
#region conda initialize
# !! Contents within this block are managed by 'conda init' !!
If (Test-Path "path\to\conda.exe") {
(& "path\to\conda.exe" "shell.powershell" "hook") | Out-String | ?{$_} | Invoke-Expression
}
#endregion

全部注释掉,修改成以下内容。注意,path\to\conda.exe需要更换成自己的conda安装路径。

1
2
3
4
5
6
7
8
9
10
#region conda initialize
# !! Contents within this block are managed by 'conda init' !!
function Load-Conda {
If (Test-Path "path\to\conda.exe") {
(& "path\to\conda.exe" "shell.powershell" "hook") | Out-String | ?{$_} | Invoke-Expression
}
conda @args
}
Set-Alias conda Load-Conda
#endregion

4、更新软件源

用root权限执行以下脚本,默认使用sysu.edu.cn的软件源,默认操作系统是ubuntu

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
#!/bin/bash
# 自动更换 Ubuntu 软件源为 mirrors.sysu.edu.cn
# 使用方法: sudo ./change_ubuntu_source.sh

set -e # 遇到错误立即退出

# 1. 检查是否为 Ubuntu 系统
if [ ! -f /etc/os-release ]; then
echo "错误: 无法确定操作系统类型。"
exit 1
fi
. /etc/os-release
if [ "$ID" != "ubuntu" ]; then
echo "错误: 此脚本仅适用于 Ubuntu 系统。"
exit 1
fi

# 2. 获取 Ubuntu 版本代号 (如 focal, jammy)
if ! command -v lsb_release &>/dev/null; then
echo "正在安装 lsb-release, ca-certificates..."
apt update && apt install -y lsb-release ca-certificates
fi
CODENAME=$(lsb_release -sc)
if [ -z "$CODENAME" ]; then
echo "错误: 无法获取 Ubuntu 版本代号。"
exit 1
fi
echo "检测到 Ubuntu 版本: $CODENAME"

# 3. 检查 root 权限
if [ "$EUID" -ne 0 ]; then
echo "请使用 sudo 或以 root 用户运行此脚本。"
exit 1
fi

# 4. 备份现有 sources.list
BACKUP_FILE="/etc/apt/sources.list.bak.$(date +%Y%m%d%H%M%S)"
if [ -f /etc/apt/sources.list ]; then
cp /etc/apt/sources.list "$BACKUP_FILE"
echo "已备份原源文件至: $BACKUP_FILE"
else
echo "未找到 /etc/apt/sources.list,将直接创建新文件。"
fi

# 5. 写入新源配置
cat > /etc/apt/sources.list << EOF
# 由 change_ubuntu_source.sh 于 $(date) 自动生成
# 使用中山大学镜像站 mirrors.sysu.edu.cn

deb https://mirror.sysu.edu.cn/ubuntu/ $CODENAME main restricted universe multiverse
deb https://mirror.sysu.edu.cn/ubuntu/ $CODENAME-updates main restricted universe multiverse
deb https://mirror.sysu.edu.cn/ubuntu/ $CODENAME-backports main restricted universe multiverse
deb https://mirror.sysu.edu.cn/ubuntu/ $CODENAME-security main restricted universe multiverse

# 如果上述 security 行无法使用,可尝试取消下面一行的注释
# deb http://security.ubuntu.com/ubuntu $CODENAME-security main restricted universe multiverse
EOF

echo "已生成新的源配置文件 /etc/apt/sources.list"

# 6. 可选:更新软件包索引
read -p "是否立即执行 apt update 更新软件包索引? (y/n): " -n 1 -r
echo
if [[ $REPLY =~ ^[Yy]$ ]]; then
apt update
fi

echo "脚本执行完毕。"

5、反向代理下载github

⚠ 进行代理之前务必确保信息安全问题,内网服务器尤其注意。

❌注意,Docker镜像下载管理依赖系统服务systemd,以下配置对docker大概率不起作用。

问题:
学校/公司的一台内网服务器,没有接入互联网(如ping外网不成功),这台服务器使用起来非常不方便。例如无法直接pip安装Python包,需要本地下载上传服务器后离线安装。
或者接入互联网,但缺乏代理导致下载git仓库经常报错。

可以利用ssh的反向端口转发使得这台服务器接入外网,或者走本地主机的代理软件。

假设连接服务器的ssh指令如下ssh wwww@172.18.233.211 -p 22,主机的代理软件端口为7897,确保服务器上7890端口未使用。创建反向代理的命令如下:

1
ssh -R 172.18.233.211:7890:127.0.0.1:7897 wwww@172.18.233.211 -p 22

上一条指令执行完成后,执行以下命令让所有浏览走代理端口:

1
export https_proxy=http://127.0.0.1:7890 http_proxy=http://127.0.0.1:7890 all_proxy=socks5://127.0.0.1:7890

[折腾]搭建自己的深度学习环境
http://example.com/2026/03/23/折腾/折腾-搭建自己的深度学习环境/
Author
peach-water
Posted on
March 23, 2026
Licensed under