跳转至

在容器中运行任务

集群通过 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
sbatch container-gpu.sh

首次导入镜像会比后续启动慢。镜像必须使用 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],并只挂载 你有权访问的路径:

--container-mounts=/project/example:/workspace/project:ro

镜像选择

  • 使用带明确版本或摘要的镜像,不使用会漂移的 latest 作为生产环境。
  • CUDA 运行时版本需要兼容节点驱动;不要在容器内安装或替换宿主机驱动。
  • 把环境定义放入 Dockerfile/镜像构建流程,不要每次作业启动时重新安装全部依赖。
  • 多节点任务使用同一镜像与固定 NCCL/CUDA 版本,记录镜像标识和应用版本。

调试

先确认 Pyxis 参数存在:

srun --help | grep -- --container-image

容器失败时分层检查:

  1. 不带容器运行 hostname,确认 Slurm 分配本身成功;
  2. 使用小型基础镜像运行 true
  3. 运行 nvidia-smi -L 检查设备隔离;
  4. 最后加入项目挂载、应用和多节点通信。

不要在登录节点直接执行 Enroot 导入或 GPU 工作负载。