准备并验证容器镜像
训练任务的镜像决定 Worker 内的操作系统、Python 环境、CUDA、PyTorch、NCCL 和业务依赖。提交任务前先确认镜像的可用范围包含训练任务,并且可用区与本次资源池所在可用区一致,然后跑通训练脚本的最小输入。
优先复用已验证镜像
如果平台预置镜像已经包含目标 CUDA、PyTorch 和常用训练依赖,优先使用预置镜像。只有在缺少固定依赖、团队基线环境或特定系统库时,再使用自定义镜像。
选择镜像前确认以下信息:
- 可用服务 包含任务。可用服务是在镜像中心手动配置的;如果没有包含任务,镜像可能只出现在开发机或推理服务创建页。需要调整时,编辑镜像的可用服务,详见限制可用服务范围。
- 可用区 与本次训练使用的资源池所在可用区一致。可用区是在构建或导入镜像时手动选择的;如果镜像在其他可用区,当前资源池所在可用区的训练任务创建页不会显示它。需要跨可用区使用时,详见镜像仓库地址与可用区和导入或跨可用区迁移镜像。
- 镜像标签明确,不使用临时或含义不清的 tag。
- 镜像已经在开发机或小规格任务中跑过目标训练脚本。
把固定依赖构建进镜像
训练任务启动命令中不适合临时安装大量依赖。每次启动都 pip install、编译扩展或下载大模型,会把错误暴露到 GPU 分配之后,也会让重跑结果不稳定。
建议把以下内容固定到镜像中:
- CUDA、PyTorch、NCCL、Transformers、DeepSpeed、vLLM 等运行时依赖。
- 需要编译的 Python 包或系统库。
- 团队长期复用的训练框架和工具链。
如果只需要少量脚本或配置文件,可以放在共享高性能存储中,不必为每次代码改动重新构建镜像。构建方式详见构建自定义镜像;已有外部镜像可先导入镜像仓库。
在开发机中验证镜像环境
提交训练任务前,使用同一镜像启动开发机或小规格任务,至少验证到第一个 batch 能正常完成:
language-bash
python - <<'PY'
import torch
print("torch:", torch.__version__)
print("cuda:", torch.version.cuda)
print("gpu_count:", torch.cuda.device_count())
PY
python train.py \
--data /mnt/public/datasets/sample \
--output_dir /mnt/public/outputs/smoke-test \
--max_steps 1这一步通常能提前发现缺少环境变量、依赖包未安装、数据 collator 处理变长 label 出错等问题。详见在开发机中试跑训练脚本。
检查分布式训练依赖
如果训练任务使用 PyTorch DDP、MPI 或 Ray,还需要检查分布式依赖:
- PyTorch DDP:确认镜像内可以执行
torchrun,并能导入训练脚本所需包。 - MPI:确认镜像内的 MPI 运行时与训练脚本兼容。
- Ray:确认 Ray 版本和业务依赖在镜像中可用。
- RDMA:使用自定义镜像且启用 RDMA 时,确认镜像已包含必要依赖;平台预置镜像通常不需要手动处理。详见RDMA 网络。
找不到镜像时检查可用范围
如果创建任务时看不到目标镜像,先检查镜像中心里的可用范围,不要先重新构建镜像。
常见原因:
- 可用服务 没有包含任务:进入镜像中心编辑镜像,将可用服务勾选为任务。详见限制可用服务范围。
- 可用区 与本次训练任务选择的资源池不一致:在目标可用区重新导入或构建镜像。详见镜像仓库地址与可用区和导入或跨可用区迁移镜像。
- 镜像构建失败或 tag 写错。
- 当前账号没有访问该租户镜像的权限。
镜像可选后,再继续编写可靠启动命令。