第一次接触超算平台时,我被它强大的计算能力震撼到了。想象一下,几百张GPU同时为你工作是什么感觉?但很快我就发现,想要用好这个"钢铁巨兽",得先学会怎么给它"喂食"——也就是搭建合适的深度学习环境。
超算平台和我们平时用的个人电脑或服务器很不一样。它采用分布式架构,通过作业调度系统(比如Slurm)来管理计算资源。这意味着你不能像在本地电脑上那样随意安装软件,而是需要遵循特定的环境管理规范。我刚开始就犯过直接pip install的错误,结果不仅装不上,还差点被管理员警告。
常见的环境搭建方式主要有两种:使用平台预置的Module环境,或者自己创建Conda虚拟环境。预置环境就像快餐店的标准套餐,开箱即用但可能不完全符合你的口味;自定义环境则像自己下厨,可以精确控制每个配料,但需要更多准备工作。
超算平台通常会预装一些常用软件环境,通过module命令就能轻松调用。我第一次使用时简直像发现了新大陆:
bash复制module avail # 查看可用环境
module load apps/Pytorch/llama_py38 # 加载指定环境
这种方式的优点是即装即用,特别适合快速验证想法。但缺点也很明显:环境版本固定,无法灵活添加额外依赖。我记得有次需要安装一个特殊的数据处理包,结果因为环境权限问题折腾了一整天。
当预置环境不能满足需求时,就需要自己搭建环境了。超算平台通常提供两种方式:
bash复制module load apps/anaconda3/5.2.0
conda create -n myenv python=3.10
source activate myenv
bash复制wget https://repo.anaconda.com/miniconda/Miniconda3-latest-Linux-x86_64.sh
bash Miniconda3-latest-Linux-x86_64.sh -b -p $HOME/miniconda3
我强烈建议选择第二种方式。虽然多了一步安装过程,但能避免很多权限问题。有次我需要编译安装一个特殊版本的PyTorch,用平台预装的Anaconda总是报错,换成自己的Miniconda后一次就成功了。
在超算上安装PyTorch有些特殊注意事项。首先要确认平台使用的加速卡类型(比如NVIDIA GPU还是国产加速卡),然后选择对应的版本。
以某国产超算平台为例:
bash复制conda install pytorch torchvision torchaudio -c pytorch --index-url https://pypi.tuna.tsinghua.edu.cn/simple
安装完成后一定要验证是否能正常调用加速卡:
python复制import torch
print(torch.__version__)
print(torch.cuda.is_available()) # 如果是CUDA设备
print(torch.backends.xxx.is_available()) # 国产加速卡通常有特定后端
TensorFlow的安装同样需要注意版本匹配:
bash复制pip install tensorflow-gpu==2.10.0 # 根据平台建议选择版本
验证安装:
python复制import tensorflow as tf
print(tf.config.list_physical_devices('GPU'))
我遇到过最头疼的问题是CUDA/cuDNN版本不匹配。后来发现超算平台通常会在Module环境中提供配套的编译工具链,正确的做法是先加载这些环境:
bash复制module load compiler/cuda/11.3
module load compiler/cudnn/8.2
新手最容易犯的错误就是资源申请不当。记得我第一次提交任务时写了:
bash复制#SBATCH --nodes=2
#SBATCH --gres=gpu:5
结果直接报错:"Requested node configuration is not available"。后来才明白超算平台的GPU卡是按节点分配的,每个节点有固定数量的卡。比如某平台每个节点4张卡,要使用5张卡就得申请2个节点(实际获得8张卡)。
正确的做法是:
bash复制#SBATCH --nodes=2
#SBATCH --gres=gpu:4 # 每个节点4张卡
在超算上遇到动态库缺失是家常便饭。有次运行程序时报错:
code复制libssl.so.1.1: cannot open shared object file
解决方法是在conda环境中创建软链接:
bash复制cd $CONDA_PREFIX/lib
ln -s libssl.so.3 libssl.so.1.1
ln -s libcrypto.so.3 libcrypto.so.1.1
另一个常见问题是环境变量冲突。有次我的Python程序总是调用系统自带的Python而不是conda环境里的,后来发现是因为在提交脚本中激活环境的方式不对。
正确的做法是在提交脚本中完整设置环境:
bash复制#!/bin/bash
module purge
module load compiler/devtoolset/7.3.1
source ~/miniconda3/bin/activate
conda activate myenv
python train.py
学会监控作业状态能节省大量时间。我最常用的几个命令:
bash复制squeue -u $USER # 查看自己的作业
sacct -j <jobid> # 查看作业详情
ssh <node> # 登录计算节点(需要配置免密登录)
watch -n 1 rocm-smi # 实时监控加速卡状态
合理的日志管理能让debug更容易。我习惯在提交脚本中这样设置:
bash复制#SBATCH -o ./logs/%j.out
#SBATCH -e ./logs/%j.err
但要注意两点:
超算平台的存储系统通常有特殊优化。几个实用建议:
让我们通过一个完整案例巩固所学知识。假设我们要在超算上训练ResNet50模型。
首先准备提交脚本train.sh:
bash复制#!/bin/bash
#SBATCH --job-name=resnet_train
#SBATCH --partition=gpu
#SBATCH --nodes=1
#SBATCH --gres=gpu:4
#SBATCH --time=24:00:00
#SBATCH -o ./logs/%j.out
#SBATCH -e ./logs/%j.err
module purge
module load compiler/devtoolset/7.3.1
source ~/miniconda3/bin/activate
conda activate torch
python -m torch.distributed.launch --nproc_per_node=4 \
train.py --arch resnet50 --batch-size 256 --epochs 100
然后提交作业:
bash复制mkdir -p logs
sbatch train.sh
这个案例用到了我们讲到的多个知识点:资源申请、环境加载、分布式训练、日志管理等。在实际项目中,你可能还需要考虑数据预处理、模型保存、恢复训练等更多细节。