在容器中运行任务¶
集群通过 Pyxis 与 Enroot 让 Slurm 作业直接运行容器镜像。当前配置版本为 Enroot 4.2.1、Pyxis 0.24.0;实际节点版本可在作业中查询。
最小 CUDA 容器作业¶
container-gpu.sh
#!/usr/bin/env bash
#SBATCH --job-name=container-gpu
#SBATCH --account=project-example
#SBATCH --partition=gpu-full
#SBATCH --gres=gpu:h20:1
#SBATCH --time=00:10:00
#SBATCH --output=container-%j.out
set -euo pipefail
srun \
--container-image=docker.io#nvidia/cuda:12.8.1-base-ubuntu22.04 \
--container-name="cuda-${SLURM_JOB_ID}" \
nvidia-smi -L
首次导入镜像会比后续启动慢。镜像必须使用 HTTPS 可获取的来源;集群禁止 Enroot 通过明文 HTTP 拉取。外部镜像连接失败时,参阅出口代理,在提交作业前 按需启用代理。
路径和挂载¶
集群配置会把以下路径提供给容器:
- 个人主目录
/cluster-home/$USER; - 项目目录
/project; - 作业临时盘
/local_scratch/jobs/$SLURM_JOB_ID; - 用户容器缓存与数据目录。
验证容器视图:
srun \
--account=project-example \
--partition=gpu-full \
--gres=gpu:h20:1 \
--time=00:10:00 \
--container-image=docker.io#ubuntu:22.04 \
bash -lc 'id; pwd; ls -ld "$HOME" /project "$LOCAL_SCRATCH"'
如需额外挂载,使用 Pyxis 的 --container-mounts=HOST:CONTAINER[:FLAGS],并只挂载
你有权访问的路径:
镜像选择¶
- 使用带明确版本或摘要的镜像,不使用会漂移的
latest作为生产环境。 - CUDA 运行时版本需要兼容节点驱动;不要在容器内安装或替换宿主机驱动。
- 把环境定义放入 Dockerfile/镜像构建流程,不要每次作业启动时重新安装全部依赖。
- 多节点任务使用同一镜像与固定 NCCL/CUDA 版本,记录镜像标识和应用版本。
调试¶
先确认 Pyxis 参数存在:
容器失败时分层检查:
- 不带容器运行
hostname,确认 Slurm 分配本身成功; - 使用小型基础镜像运行
true; - 运行
nvidia-smi -L检查设备隔离; - 最后加入项目挂载、应用和多节点通信。
不要在登录节点直接执行 Enroot 导入或 GPU 工作负载。