适用环境:Windows 本机、阿里云 Ubuntu GPU 服务器、Python 模型训练项目。
1. 准备训练项目
在本机整理以下文件:
D:\cloud_training\ ├── project.zip 训练代码和配置 └── dataset.zip 训练数据代码包中保留:
训练入口程序。
模型和数据加载代码。
训练配置文件。
requirements.txt、environment.yml 或项目指定的环境文件。
数据划分、标签映射等必要文件。
项目要求的预训练权重。
不打包本机虚拟环境、缓存、无关数据和历史训练输出。
阅读项目安装说明,确认 Python 版本、训练框架版本、显存要求、启动命令和检查点保存方式。
本文中的PUBLIC_IP替换为服务器公网 IP。路径、环境名称按实际情况替换。
训练启动参数由项目决定。本文出现的 train.py、--config、--resume 均为示例,不是所有项目通用的接口。
2. 选择实例
进入阿里云控制台 → 云服务器 ECS → 实例 → 创建实例。
| 配置项 | 选择方法 |
|---|---|
| 付费方式 | 选按量付费 |
| 地域、可用区 | 按 GPU 库存、数据所在地和连接条件选择 |
| GPU | 按模型显存需求、精度模式和训练耗时选择 |
| GPU 数量 | 单卡项目先选一张;多卡需项目支持分布式训练 |
| CPU、内存 | 满足数据解码、增强和加载需要 |
| 系统镜像 | 项目支持的 Ubuntu 版本,优先预装 NVIDIA 驱动镜像 |
| 系统盘 | 用于系统、环境、代码和缓存 |
| 数据盘 | 按数据集、检查点和日志容量配置 |
| 公网 IPv4 地址 | 使用本文公网 SSH 流程时勾选 |
| 带宽 | 按数据上传和结果下载需求配置 |
| 登录凭证 | 密钥对或密码 |
先用小规模数据测试显存和训练速度,再决定正式实例规格。显存容量大不代表训练速度一定更快。
计算磁盘需求时同时包含:原始压缩包、解压数据、预处理缓存、环境、多个检查点和输出结果。
核对 GPU、云盘、公网流量等费用后创建实例。
3. 配置安全组
允许本地电脑通过 SSH(Secure Shell,安全外壳协议)连接服务器。
| 字段 | 设置 |
|---|---|
| 方向 | 入方向 |
| 策略 | 允许 |
| 协议 | TCP |
| 目的端口 | 22 或 22/22 |
| 来源 | 本机网络公网 IP/32 |
创建页面提供“SSH 远程连接 Linux 实例”时,勾选并将来源设为“我的 IP”。
更换本地网络后,检查是否需要更新来源 IP。命令行训练不需要开放网页或远程桌面端口。
4. 连接服务器
在 Windows PowerShell 执行:
ssh root@PUBLIC_IP首次连接核对主机指纹,确认后输入 yes,再输入密码。输入密码时不显示字符。
使用密钥时:
ssh -i "C:\Keys\training.pem" root@PUBLIC_IP登录用户名以实例设置为准。本文用 root 演示;其他账号需要使用有写权限的工作目录,系统安装命令可能需要 sudo。
保持两个窗口:
| 窗口 | 用途 |
|---|---|
| Windows 本机 PowerShell | 上传、下载、建立 SSH 连接 |
| 已登录的服务器终端 | 安装环境、运行训练、监控 |
5. 检查服务器
在服务器执行:
nvidia-smi free -h df -h lsblk -f确认 GPU 型号和数量、系统内存、磁盘容量及挂载位置。
GPU 检查失败时,先按镜像说明处理 NVIDIA 驱动,不继续安装训练环境。
新增数据盘先确认设备和文件系统,再按阿里云文档挂载。已有数据的磁盘不要格式化。
安装常用工具:
sudo apt-get update sudo apt-get install -y git wget unzip tmux按项目需要另外安装视频、图像、编译等系统依赖。
6. 建立工作目录
本文统一使用/root/work。使用数据盘时,将工作目录改为实际挂载点下的目录,不要假定任意文件夹自动位于数据盘上。
mkdir -p /root/work/project /root/work/data /root/work/uploads /root/work/runs /root/work/pretrained目录用途:
/root/work/ ├── project/ 代码和配置 ├── data/ 数据集 ├── uploads/ 上传的压缩包 ├── pretrained/ 预训练权重 └── runs/ 每次训练的日志、检查点和结果7. 上传下载数据和代码
本地
在 Windows PowerShell 执行:
scp "D:\cloud_training\project.zip" root@PUBLIC_IP:/root/work/uploads/ scp "D:\cloud_training\dataset.zip" root@PUBLIC_IP:/root/work/uploads/如果使用密钥,在 scp 后加上:
-i "C:\Keys\training.pem"在服务器检查压缩包目录:
unzip -l /root/work/uploads/project.zip unzip -l /root/work/uploads/dataset.zip解压:
unzip /root/work/uploads/project.zip -d /root/work/project unzip /root/work/uploads/dataset.zip -d /root/work/data ls /root/work/project ls /root/work/data如果压缩包自带顶层文件夹,后续路径应包含该层,不要误用未包含代码的父目录。
大量数据或反复传输时,可使用阿里云 OSS(Object Storage Service,对象存储服务)配合 ossutil。按官方文档配置最小权限凭证,不把访问密钥写进训练代码或发到群里。
需要校验传输完整性时,对同一个文件分别计算 SHA256:
Windows:
Get-FileHash "D:\cloud_training\dataset.zip" -Algorithm SHA256服务器:
sha256sum /root/work/uploads/dataset.zip确认两端值一致。
OSS
参考:
ossutil 2.0 安装与配置
RAM AccessKey 说明(本流程使用实例角色,无需创建长期密钥)
ossfs 2.0 配置(另一种挂载方案)
现在建立了一个RAM ECS角色做OSS授权,这样AccessKey由系统生成更加安全。官方文档里有说明怎么用,这里做简单流程摘要。
完成节点与实例角色认证
需先在ECS控制台进行ram授权:ECSExperimentMachine
ECSExperimentMachine 为本文档参考ECS RAM授权角色,若有需要,替换成自己的。
ecs需与oss在同一区域,用内网Endpoint,流量免费。
这里有两种访问方式
ossutil,每次文件需要先下载到ecs再进行操作
ossfs,挂载oss为本地文件夹,每次调用不需要输入oss路径,挂在后: ~/oss/
ossutil
先进行ossutil下载,这里以x86-linux 为例
#下载并安装 ossutil,/tem只放安装包,程序复制到/usr/local/bin/ossutil 可任意目录调用 mkdir -p ~/tools/ossutil cd ~/tools/ossutil curl -fL -o ossutil.zip \ https://gosspublic.alicdn.com/ossutil/v2/2.4.0/ossutil-2.4.0-linux-amd64.zip unzip -o ossutil.zip sudo install -m 755 \ ossutil-2.4.0-linux-amd64/ossutil \ /usr/local/bin/ossutil #检查是否可运行 ossutil --help首次配置可直接运行下面整段。这会覆盖已有的同名配置文件;如果已有其他用途的配置,先用cp ~/.ossutilconfig ~/.ossutilconfig.backup备份。
cat > ~/.ossutilconfig <<'EOF' [default] mode = EcsRamRole region = cn-shanghai endpoint = https://oss-cn-shanghai-internal.aliyuncs.com EOFcat配合>将两行 EOF 之间的文字写入文件,EOF 本身不会写入。该配置不包含长期密钥。当前工具无需在命令中传角色名称,会尝试从实例获取角色凭证。
验证配置生效:
ossutil ls oss://jnmedtech-original-data1/Ossutil 常用代码归纳
以下为常用命令归纳,路径中jnmedtech-original-data1为bucket名称,需要替换为列举得到的真实对象路径。ossutil的语法与linux相近。
查看 OSS 文件
# 查看 Bucket 下的对象 ossutil ls oss://jnmedtech-original-data1/ # 查看指定日期前缀下的对象 ossutil ls oss://jnmedtech-original-data1/20260617/OSS 的“目录”本质是对象名称的前缀。无需扁平化,保留日期/session 层级即可。文件路径区分大小写。
下载单个文件到 ECS
mkdir -p ~/data/oss-test ossutil cp \ "oss://jnmedtech-original-data1/20260617/实际文件名" \ ~/data/oss-test/ ls -lh ~/data/oss-test/顺序为ossutil cp 源路径 目标路径。源文件仍留在 OSS,ECS 得到一份副本。ls -lh能确认文件存在及大小,不等于完整性校验。
下载一个 session 的全部文件
mkdir -p ~/data/20260617/session01 ossutil cp -r \ oss://jnmedtech-original-data1/20260617/session01/ \ ~/data/20260617/session01/-r表示递归处理该前缀下的文件和子目录;保留内部相对层级。先选一个小 session 检查下载后的目录结构,再扩展批量任务。下载前可用df -h ~/data检查可用磁盘空间。
上传单个文件或结果目录
上传不需要预先在bucket中建立文件夹,若没有会自动创建
# 当前工作目录中的单个结果文件 ossutil cp ./metrics.json \ oss://jnmedtech-original-data1/ecs-test/run01/metrics.json # 当前工作目录中的整个结果目录 ossutil cp -r ./results/run01/ \ oss://jnmedtech-original-data1/ecs-test/run01/ossfs
进行下载安装
wget https://gosspublic.alicdn.com/ossfs/ossfs2_2.0.9_linux_x86_64.deb sudo dpkg -i ossfs2_2.0.9_linux_x86_64.deb ossfs2 --version建立ossfs配置文件
sudo nano /etc/ossfs2.conf这里假设
Bucket = jnmedtech-original-data1 Region = 上海 RAM Role = ECSExperimentMachine写
--oss_endpoint=https://oss-cn-shanghai-internal.aliyuncs.com --oss_bucket=jnmedtech-original-data1 --ram_role=ECSExperimentMachine若有多个Bucket需要挂载,每个Bucket都需要写一遍配置再挂载
保存nano
Ctrl + O Enter Ctrl + X创立挂载目录
mkdir -p ~/oss挂载Bucket
格式是 ossfs2 mount <挂载目录> -c <配置文件>
sudo ossfs2 mount ~/oss -c /etc/ossfs2.conf访问
ls ~/oss8. 创建训练环境
优先使用项目提供的环境文件和安装说明。不同项目使用独立环境,不在一个环境中混装多个项目要求的训练框架。
未安装 Conda 时,在服务器执行:
wget https://repo.anaconda.com/miniconda/Miniconda3-latest-Linux-x86_64.sh bash Miniconda3-latest-Linux-x86_64.sh -b -p /opt/miniconda3 source /opt/miniconda3/etc/profile.d/conda.sh如果/opt/miniconda3已存在,直接加载,不重复安装。
项目提供 environment.yml
cd /root/work/project conda env create -n trainenv -f environment.yml conda activate trainenv项目只提供 requirements.txt
按项目指定的 Python 版本创建环境。下面以 Python 3.11 为例,执行前按项目要求替换:
conda create -n trainenv --override-channels -c conda-forge python=3.11 pip -y conda activate trainenv cd /root/work/project python -m pip install -r requirements.txt如果项目要求先安装训练框架,再安装其他依赖,按该顺序执行。两种环境创建方式选择一种,不重复创建同名环境。
安装训练框架
镜像有 CUDA,不代表环境中已经有 PyTorch 或 TensorFlow。
PyTorch:按项目版本要求和官方安装页面选择 GPU 包。
TensorFlow:按官方 GPU 安装要求选择兼容环境。
项目要求 Docker 时:使用项目指定镜像,并确认 NVIDIA 容器支持正常。
不统一指定 torch、CUDA 或 Python 的版本号。系统驱动必须支持所选框架的运行库;不要只根据镜像显示的 CUDA 版本机械选择包
普通 Python 依赖下载慢时,可使用清华 PyPI 镜像:
python -m pip install -r requirements.txt -i https://pypi.tuna.tsinghua.edu.cn/simple框架专用下载索引按官方命令保留;普通镜像不一定提供相同的 GPU 构建。
安装完成后:
python -m pip check训练过程中不升级或替换环境中的软件包。
9. 验证 GPU 计算
PyTorch 项目执行:
python -c "import torch; print('torch:', torch.__version__); print('CUDA:', torch.version.cuda); print('GPU available:', torch.cuda.is_available()); print('GPU:', torch.cuda.get_device_name(0)); x=torch.randn(128,128,device='cuda'); print('GPU test:', (x@x).mean().item())"确认 GPU available 为 True,显示正确显卡,并输出计算数值。
TensorFlow 项目检查设备发现:
python -c "import tensorflow as tf; print(tf.__version__); print(tf.config.list_physical_devices('GPU'))"随后用项目的短训练检查实际设备分配。仅能运行 nvidia-smi,不代表训练框架已正确使用 GPU。
10. 修改训练配置
按项目的配置格式修改以下项目:
| 配置 | 设置内容 |
|---|---|
| 数据路径 | 服务器上的实际数据目录 |
| 训练、验证、测试划分 | 使用固定划分,避免数据泄漏 |
| 标签和类别 | 与模型输出和数据集一致 |
| 预训练权重 | 服务器实际文件路径 |
| 输出目录 | 每次训练使用独立目录 |
| batch size | 先用能稳定运行的小批量 |
| epochs 或 steps | 先短测,再正式训练 |
| 学习率及调度 | 按模型和训练配方设置 |
| GPU 数量 | 与实例和启动方式一致 |
| 数据加载进程数 | 从较小值起步,再按吞吐调整 |
| 检查点保存 | 设置保存频率及保留数量 |
| 验证频率 | 设置定期评估 |
| 随机种子 | 固定并记录 |
删除配置中的本机 Windows 路径,改成 Linux 路径。不要使用测试集反复选择训练参数。
建立本次运行目录:
mkdir -p /root/work/runs/exp001将项目的输出目录配置为该位置。新实验使用 exp002、exp003 等新目录,不覆盖旧实验。
11. 先跑短训练
将配置改成少量训练步骤或一个短训练轮次,执行项目给出的启动命令。
例如,项目支持以下接口时:
cd /root/work/project python -u train.py --config configs/train.yaml检查:
数据能正确读取,样本数量和标签符合预期。
模型使用预期 GPU。
能完成前向计算、反向传播和优化器更新。
损失没有持续出现 NaN 或 Inf。
验证流程能执行。
检查点实际保存到指定目录。
能从检查点恢复训练状态。
检查通过后,再恢复正式轮次或步数。
12. 后台启动正式训练
在服务器执行:
tmux new -s training进入会话后:
source /opt/miniconda3/etc/profile.d/conda.sh conda activate trainenv cd /root/work/project运行项目训练命令,并保存日志。以下以支持 train.py 和 --config 的项目为例:
set -o pipefail python -u train.py --config configs/train.yaml 2>&1 | tee /root/work/runs/exp001/train.logtee 会覆盖同名日志;续训时使用新的日志名。训练命令刚退出时,可执行echo $?检查退出码,0 表示命令正常退出,不代表模型质量达标。
离开 tmux:按 Ctrl+B,松开,再按 D。此时可以断开 SSH,任务继续运行。
重新登录后恢复:
tmux attach -t training查看会话:
tmux ls会话已存在时先进入查看,不重复启动同一训练。Ctrl+C 会中断程序。tmux 不能让任务跨服务器关机、重启或释放继续运行。
13. 查看训练状态
在另一个服务器连接窗口执行:
watch -n 1 nvidia-smi按 Ctrl+C 退出监控。
top按 q 退出。
df -h tail -n 50 /root/work/runs/exp001/train.log持续查看日志:
tail -f /root/work/runs/exp001/train.log退出该日志查看窗口不会停止另一个会话中的训练。
重点检查训练速度、损失、验证指标、显存、CPU、系统内存和磁盘余量。显存占用高不等于 GPU 利用率高;瞬时利用率也不能替代实际训练吞吐。
14. 查看 TensorBoard
项目生成 TensorBoard 日志时,在环境中安装并启动 TensorBoard。logdir 指向实际事件文件所在目录:
tensorboard --logdir /root/work/runs --host 127.0.0.1 --port 6006在 Windows 另开 PowerShell,建立转发:
ssh -N -L 6006:127.0.0.1:6006 root@PUBLIC_IP保持该窗口运行,本机浏览器打开:
http://localhost:6006使用这种方式不需要在安全组开放 6006。项目没有生成 TensorBoard 事件文件时,页面不会出现训练曲线。
15. 调整训练速度
每次只改一类设置,用固定的训练步数比较,记录吞吐、显存和验证指标。
| 现象 | 调整方向 |
|---|---|
| GPU 经常空闲、数据加载慢 | 检查存储、解码、增强和数据加载进程数 |
| CPU 或系统内存吃紧 | 减少不必要的数据加载进程和缓存 |
| 显存不足 | 降低 batch,按项目支持使用混合精度或梯度检查点 |
| GPU 持续繁忙 | 比较混合精度、模型配置或更快显卡的实际收益 |
| 检查点占满磁盘 | 调整保存频率和保留策略,先备份需要的版本 |
训练时改变 batch 会改变优化过程。使用梯度累积或调整学习率时,应遵循项目训练配方,不只比较速度。
混合精度和梯度检查点必须由项目支持;修改后检查数值稳定性及验证指标。缩小输入或改变采样方式也可能影响模型效果。
多卡不会自动加速单卡脚本。只有项目支持分布式训练时,才使用其指定的 torchrun 或其他启动方式,并核对总 batch、数据采样和检查点保存规则。
16. 中断和恢复训练
正式训练前,确认检查点包含恢复所需的模型、优化器、学习率调度器和训练步数等状态。
中断前尽量等待最近一次检查点保存完成。文件名包含 best 或 last,不代表它一定保存了完整训练状态。
恢复时使用项目支持的命令。例如,项目支持 --resume 时:
python -u train.py --config configs/train.yaml --resume /root/work/runs/exp001/checkpoints/last.pt路径和参数以项目为准。检查恢复日志,确认轮次、步数和学习率从正确位置继续,而不是只加载权重重新开始。
恢复时使用新日志名,例如 resume01.log,避免覆盖原始日志。
17. 保存运行信息
在当前训练环境执行:
python -m pip freeze > /root/work/runs/exp001/environment.txt python --version > /root/work/runs/exp001/python-version.txt nvidia-smi > /root/work/runs/exp001/gpu-info.txt代码使用 Git 时,在代码目录执行:
git rev-parse HEAD > /root/work/runs/exp001/code-version.txt git status --short > /root/work/runs/exp001/code-status.txt git diff > /root/work/runs/exp001/code-changes.patch另外保存实际使用的训练配置、启动命令和数据版本。未跟踪的代码文件不会包含在 git diff 中,需要单独保留。重复执行上述命令会覆盖同名记录。
18. 检查训练结果
训练完成后检查:
日志是否正常结束。
训练步数或轮次是否达到配置要求。
检查点是否完整保存。
验证指标是否符合要求。
最佳权重能否加载并完成一次评估或推理。
需要续训时,最后检查点能否恢复训练状态。
按项目要求运行评估命令。保留最佳权重和用于续训的检查点,不将二者混淆。
19. 下载结果
在 Windows PowerShell 执行:
New-Item -ItemType Directory -Force "D:\training_results" scp -r root@PUBLIC_IP:/root/work/runs/exp001 "D:\training_results"使用密钥时,在 scp 后添加 -i 和密钥路径。
下载后检查权重、配置、日志和环境记录。重要权重可以用 Get-FileHash 与服务器 sha256sum 对比。
如果只下载部分文件,至少保留实际模型权重、模型配置、类别或标签映射,以及复现所需的代码版本和预处理说明。
20. 停止或释放实例
确认训练和评估结束。
下载结果及运行记录。
检查本机文件完整性和模型可加载性。
进入阿里云控制台,找到对应实例。
继续保留时,查看停止实例的计费选项。
不再使用时,确认备份完成后释放实例。
检查关联云盘、公网资源、快照和对象存储是否继续计费。
关闭终端、退出 SSH 或离开 tmux 不会停止实例计费。停止实例后,部分资源仍可能收费,以控制台规则为准。
释放实例或删除云盘前完成备份。多人共用服务器时,由管理员分配个人账号和目录,不共享 root 密码、私钥或云账号访问密钥。
21. 常见问题
| 问题 | 处理 |
|---|---|
| SSH 超时 | 检查公网 IP、实例状态、安全组来源和 TCP 22 |
| Permission denied | 核对用户名、密码或密钥 |
| Host key verification failed | 核对主机身份,不关闭指纹检查 |
| Windows SSH 配置权限错误 | 修复配置权限;直接 IP 连接且不依赖配置时,可临时使用 -F NUL |
| Could not resolve hostname d | 回到 Windows 本机上传,不在服务器使用 D: 路径 |
| 找不到本机文件 | 在资源管理器复制真实路径,保留双引号 |
| 找不到数据或标签 | 核对解压层级、路径大小写和数据格式 |
| GPU 框架不可用 | 同时检查驱动、环境和安装的框架构建 |
| 显存不足 | 降低 batch,检查其他进程;按项目支持调整精度或梯度检查点 |
| 进程被 Killed | 检查系统内存和系统日志,不仅检查显存 |
| No space left on device | 检查容量和 inode,处理前备份重要文件 |
| loss 为 NaN 或 Inf | 检查数据、标签、学习率、数值精度和损失计算 |
| GPU 利用率低 | 检查数据加载、预处理、存储和同步开销 |
| 断开连接后任务停止 | 使用 tmux;实例关机仍会终止任务 |
| 恢复后从第零轮开始 | 检查是否只加载权重、恢复参数是否正确、检查点是否完整 |
| 多卡没有提速 | 检查项目分布式实现、通信开销和数据吞吐 |
22. 官方文档
阿里云 GPU 实例规格
连接 Linux 实例
添加安全组规则
阿里云对象存储 OSS
PyTorch 安装
TensorFlow 安装
TensorBoard
NVIDIA nvidia-smi
清华 PyPI 镜像
tmux