在国家超算中心使用GPU资源时,很多新手用户都会遇到一个共同困惑:为什么在登录节点执行nvidia-smi命令看不到显卡?命令行操作会不会意外消耗我的GPU算力卡时长?其实这涉及到HPC(高性能计算)环境的基本设计理念。与个人工作站不同,超算中心的计算资源需要通过作业调度系统统一分配,这是保证资源公平使用和高效调度的关键机制。
我刚接触超算时也犯过同样的错误——在登录节点反复尝试运行CUDA程序,结果不仅无法执行,还担心会不会因此被计费。后来才明白,超算环境的设计遵循着严格的资源隔离原则。登录节点(通常以login或admin命名)仅用于文件管理、作业提交等轻量级操作,真正的计算资源(包括GPU)都部署在专门的计算节点上,必须通过Slurm等作业调度系统申请才能使用。
所有正规的超算中心都会将节点划分为两种角色:
这种隔离设计主要基于三个考虑:
超算中心的GPU资源就像酒店房间——不能随意进出,必须通过前台(调度系统)登记使用。以Slurm为例,关键参数包括:
bash复制--gres=gpu:1 # 申请1块GPU
--cpus-per-task=4 # 每个任务配4个CPU核
--mem=16G # 申请16GB内存
这些参数不仅决定资源分配,也是计费依据。我曾见过用户因为漏写--gres参数,导致作业虽然运行但无法调用GPU,白白浪费计算时间。正确的做法是提交作业前用scontrol show partition查看分区配置,或直接咨询管理员获取推荐参数。
当需要测试环境或调试代码时,交互式作业是最佳选择。以下命令申请1块GPU并进入bash shell:
bash复制srun -p hx2hdtest -N 1 --gres=gpu:1 --ntasks-per-node=1 \
--cpus-per-task=4 --time=01:00:00 --pty /bin/bash
进入交互环境后,建议立即执行以下检查:
nvidia-smi 确认GPU可见性nvcc --version 检查CUDA版本python -c "import torch; print(torch.cuda.is_available())" 测试PyTorch环境特别注意:交互式会话会持续占用资源直到超时或手动退出。我曾因为忘记退出导致GPU卡被占用8小时,不仅影响他人使用,还消耗了大量算力卡时。建议设置合理的
--time参数,并在调试完成后及时输入exit退出。
正式计算任务应该使用批处理作业。下面是一个完整的Slurm脚本示例(保存为gpu_job.slurm):
bash复制#!/bin/bash
#SBATCH -p hx2hdtest # 指定分区
#SBATCH -N 1 # 1个计算节点
#SBATCH --gres=gpu:2 # 申请2块GPU
#SBATCH --ntasks-per-node=1 # 每个节点1个任务
#SBATCH --cpus-per-task=8 # 每个任务8个CPU核
#SBATCH -t 24:00:00 # 最大运行时间
#SBATCH -o %j.out # 输出日志
#SBATCH -e %j.err # 错误日志
# 加载软件环境
module load cuda/11.7
source activate py38
# 运行Python脚本
python train.py --batch-size 256 --epochs 100
提交作业后,可以通过以下命令监控状态:
bash复制squeue -u $USER # 查看自己的作业
sacct -j <JobID> # 查看作业详情
scancel <JobID> # 取消作业
当作业已经运行但GPU不可用时,按以下步骤排查:
--gres=gpu:N参数我曾遇到过一个典型案例:用户本地开发环境使用CUDA 11.7,但计算节点仅支持CUDA 11.4。解决方案是在Slurm脚本中添加:
bash复制module load cuda/11.4
根据不同类型的计算任务,推荐以下配置策略:
| 任务类型 | GPU数量 | CPU核数 | 内存 | 典型场景 |
|---|---|---|---|---|
| 模型调试 | 1 | 4-8 | 16-32G | 小批量训练、代码测试 |
| 中等规模训练 | 2-4 | 16-32 | 64-128G | ResNet50等模型训练 |
| 大规模分布式 | 8+ | 64+ | 256G+ | LLM预训练、HPC应用 |
对于数据密集型任务,还可以通过以下方式提升效率:
/tmp作为临时文件存储(计算节点本地SSD通常更快)num_workers参数)国家超算中心通常采用"卡时"(GPU×小时)作为计费单位,其计算方式为:
code复制总卡时 = GPU数量 × 实际使用小时数
例如使用2块GPU运行3.5小时,则消耗7卡时。
关键注意事项:
建议定期检查资源使用情况:
bash复制# 查看账户余额(不同集群命令可能不同)
balance_check
# 查询近期作业资源消耗
job_stat -u $USER -d 30
控制成本的实用技巧:
--time设置合理的时间上限为避免每次重新配置环境,推荐以下做法:
bash复制conda env export > environment.yml
对于使用国产GPU(如海光DCU)的超算中心,需要注意:
安装国产优化版PyTorch的示例:
bash复制pip install torch==2.5.1+das.opt1.dtk25041 \
--index-url https://cancon.hpccube.com:65024/4/main/pytorch/DAS1.6
通过以下方法可以显著提升GPU利用率:
nsys进行性能分析:bash复制nsys profile -t cuda,nvtx python train.py
python复制torch.cuda.amp.autocast(enabled=True)
python复制DataLoader(..., num_workers=4, pin_memory=True)
经过这些优化,我曾将一个NLP模型的训练速度提升了3倍,相当于节省了2/3的计算成本。这充分证明了"磨刀不误砍柴工"的道理——在正式运行前花些时间优化配置,往往能获得超乎想象的回报。