新页面
好的,这是一个非常经典的高性能计算(HPC)和AI集群的搭建需求。你拥有非常棒的硬件基础(8台8卡服务器 + IB网络),搭建一个高效、易用的系统是完全可行的。
下面我将为你提供一套完整的、分阶段的部署方案,从系统架构设计到具体的软件选型和配置,最终实现你想要的效果。
第一部分:整体架构设计 (Architecture)
首先,我们需要一个清晰的架构。你的8台服务器不能都是对等的,需要有角色划分。
-
管理/登录节点 (Head/Login Node):
- 角色: 集群的“大脑”和“大门”。
- 功能:
- 用户通过SSH登录这台服务器。
- 运行作业调度系统的控制器(如Slurm Controller)。
- 编译代码、准备数据集、提交作业。
- 运行监控服务。
- 建议: 从你的8台服务器中指定1台作为管理节点。这台节点本身也包含8张GPU,可以配置成既是管理节点,又是计算节点。对于8台的小规模集群,这是最经济的做法。
-
计算节点 (Compute Nodes):
- 角色: 执行计算任务的“工人”。
- 功能:
- 只负责运行由调度系统分配过来的作业。
- 用户通常不直接登录计算节点。
- 建议: 剩下的7台服务器(以及管理节点自身)都作为计算节点。
-
存储节点/服务 (Storage Node/Service):
- 角色: 提供共享文件中心的“仓库”。
- 功能: 所有节点(管理节点和计算节点)都可以像访问本地目录一样访问这个共享存储。
- 建议: 你可以:
- 方案A (简单快速): 在管理节点上同时运行NFS(Network File System)服务,将一块大容量硬盘(或RAID阵列)共享出来。
- 方案B (性能更佳): 如果有额外的一台服务器,可以将其专门用作NFS存储服务器,性能和稳定性更好。
-
网络规划 (Networking):
- 管理网络 (Ethernet): 使用服务器自带的千兆或万兆以太网口。用于SSH登录、系统管理、软件安装、访问外部互联网等。所有节点都需要连接到这个网络。
- 计算网络 (InfiniBand): 使用IB卡和IB交换机。专门用于高性能计算,特别是多机多卡的分布式训练(如MPI、NCCL通信)。这是保证GPU之间通信速度的关键。
架构图示意:
+------------------+ +-------------------+
| 用户 (SSH) |----->| 管理/登录节点 |
| | | (Head Node) |
+------------------+ | - 作业调度器 Master |
| - NFS Server |
| - 监控服务 |
+--------+----------+
|
+---------------------------+---------------------------+ (管理网络 - Ethernet)
| | |
+----------+---------+ +-----------+--------+ +------------+-------+
| 计算节点 1 (Compute)| | 计算节点 2 (Compute)| ... | 计算节点 8 (Compute)|
| (Head Node 自身) | | | | |
+--------------------+ +--------------------+ +--------------------+
| | |
+---------------------------+---------------------------+ (计算网络 - InfiniBand)
|
+--------+----------+
| IB 交换机 |
+-------------------+
第二部分:分步实施指南 (Step-by-Step Guide)
阶段一:硬件和基础系统安装
-
硬件上架与连接:
- 将8台服务器和IB交换机上架。
- 以太网: 将所有服务器的以太网口连接到同一个以太网交换机。
- InfiniBand: 将所有服务器的IB卡连接到IB交换机。
-
操作系统安装:
- 在所有8台服务器上安装完全相同版本的Linux操作系统。
- 推荐: Ubuntu Server 22.04 LTS,因为它对AI/ML社区支持最好。CentOS/Rocky Linux也是不错的选择。
- 关键: 保持内核版本、系统库一致,避免未来出现奇怪的依赖问题。
- 自动化工具: 为了保证一致性,强烈建议使用自动化工具如 Ansible。你只需要写好一个部署脚本(Playbook),就可以一键在所有机器上完成配置。
-
网络配置:
- 为所有节点的以太网口和IB网口配置静态IP地址。
- 示例:
- 管理网络 (eth0):
192.168.1.10
(管理节点),192.168.1.11
-192.168.1.17
(计算节点) - IB网络 (ib0):
10.10.1.10
(管理节点),10.10.1.11
-10.10.1.17
(计算节点)
- 管理网络 (eth0):
- 配置
/etc/hosts
文件,让所有节点可以通过主机名互相访问(如head-node
,compute-01
)。 - 测试: 在所有节点间
ping
主机名,确保网络通畅。使用ib_pingpong
等工具测试IB网络的连通性和延迟。
-
基础软件和驱动安装:
- 在所有节点上安装:
- NVIDIA Driver: 版本要一致!
- CUDA Toolkit: 版本要一致!
- cuDNN
- NCCL: NVIDIA的集合通信库,对分布式训练至关重要,需要确保它能利用IB网络。
- 再次强调: 使用Ansible来自动化这个过程,确保所有节点配置完全一样。
- 在所有节点上安装:
阶段二:搭建共享文件中心 (NFS)
-
在管理节点上 (作为NFS Server):
- 安装NFS服务:
sudo apt update && sudo apt install nfs-kernel-server
- 创建共享目录:
sudo mkdir -p /export/share
- 设置权限:
sudo chown -R nobody:nogroup /export/share && sudo chmod 777 /export/share
- 配置NFS导出: 编辑
/etc/exports
文件,添加一行:
这允许/export/share 192.168.1.0/24(rw,sync,no_subtree_check)
192.168.1.x
网段的机器读写这个目录。 - 启动并生效:
sudo exportfs -a && sudo systemctl restart nfs-kernel-server
- 安装NFS服务:
-
在所有计算节点上 (以及管理节点自身,作为NFS Client):
- 安装NFS客户端:
sudo apt update && sudo apt install nfs-common
- 创建挂载点:
sudo mkdir -p /share
- 设置开机自动挂载: 编辑
/etc/fstab
文件,添加一行:
(假设192.168.1.10:/export/share /share nfs defaults 0 0
192.168.1.10
是你管理节点的IP) - 手动挂载测试:
sudo mount -a
- 验证: 在任意节点
cd /share
,创建一个文件,然后去另一个节点查看该文件是否存在。
- 安装NFS客户端:
现在,你就有了一个所有节点都能访问的 /share
目录,可以存放代码、数据集和模型。
阶段三:用户管理
为了让Slurm正确地将作业分配给用户,所有节点上的用户和用户组必须有相同的UID和GID。
- 简单方案 (适合小集群): 在所有8台服务器上手动创建相同的用户账号,并确保
useradd
命令生成的UID/GID一致。 - 标准方案 (推荐): 使用 LDAP 或 SSSD 搭建统一认证中心。这样你只需要在一个地方创建用户,所有机器都能识别。这个稍微复杂些,但一劳永逸。对于8台机器,可以先从手动创建开始。
阶段四:作业调度和GPU管理 (核心)
这是实现“选择几张卡跑实验”功能的核心。我们将使用 Slurm,它是开源HPC领域的事实标准。
-
安装Slurm:
- 在所有节点上安装Slurm。在Ubuntu上通常是
slurm-wlm
。sudo apt update sudo apt install slurm-wlm # 这会安装所有组件
- 你还需要一个Munge服务来做Slurm各组件间的认证。
sudo apt install munge # 需要生成一个 munge.key,并分发到所有节点 # 在管理节点生成: sudo /usr/sbin/create-munge-key # 拷贝到其他节点: scp /etc/munge/munge.key compute-01:/etc/munge/ # 在所有节点上设置权限并启动服务
- 在所有节点上安装Slurm。在Ubuntu上通常是
-
配置Slurm: 这是最关键的一步。配置文件是
/etc/slurm/slurm.conf
,你需要在管理节点上精心编辑一份,然后分发到所有节点。slurm.conf
核心配置示例:# 集群名称 ClusterName=ai-cluster # 管理节点信息 SlurmctldHost=head-node # 管理节点的主机名 SlurmctldPort=6817 # GPU作为通用资源(Generic Resource)进行管理 GresTypes=gpu # Slurm状态保存位置 StateSaveLocation=/var/spool/slurmctld # ...其他全局配置... # --- 节点定义 --- # 定义每个计算节点,并告诉Slurm每个节点有多少CPU、内存和GPU # 注意: NodeName必须和`hostname`命令输出一致 NodeName=head-node CPUs=64 RealMemory=256000 Gres=gpu:8 State=UNKNOWN NodeName=compute-01 CPUs=64 RealMemory=256000 Gres=gpu:8 State=UNKNOWN NodeName=compute-02 CPUs=64 RealMemory=256000 Gres=gpu:8 State=UNKNOWN # ...为所有8台机器添加类似的行... # --- 分区定义 --- # 分区是节点的集合,用户向分区提交作业 PartitionName=gpu_partition Nodes=head-node,compute-[01-07] Default=YES MaxTime=INFINITE State=UP
gres.conf
配置GPU设备文件: 为了让Slurm知道Gres=gpu:8
对应/dev/nvidia0
到/dev/nvidia7
,创建/etc/slurm/gres.conf
:# 在所有计算节点上创建此文件 NodeName=head-node Name=gpu File=/dev/nvidia[0-7] NodeName=compute-01 Name=gpu File=/dev/nvidia[0-7] # ...为所有8台机器添加类似的行... # 更简单的方法是使用 AutoDetect=nvml,Slurm会自动检测NVIDIA GPU # AutoDetect=nvml
-
启动服务:
- 管理节点:
sudo systemctl start slurmctld
- 所有计算节点:
sudo systemctl start slurmd
- 检查状态: 在管理节点运行
sinfo
,你应该能看到所有节点和它们的状态。
- 管理节点:
阶段五:运维和用户工作流
-
用户如何使用:
- 用户SSH到
head-node
。 - 在
/share
目录准备好代码和数据。 - 创建一个作业脚本,例如
run_pytorch.sh
:
#!/bin/bash #SBATCH --job-name=my_deep_learning_job # 作业名 #SBATCH --partition=gpu_partition # 提交到gpu_partition分区 #SBATCH --nodes=1 # 需要1个节点 #SBATCH --ntasks=1 # 在节点上运行1个任务 #SBATCH --cpus-per-task=8 # 为这个任务分配8个CPU核心 #SBATCH --mem=64G # 为这个任务分配64GB内存 # !!! 这是关键:请求4张GPU !!! #SBATCH --gres=gpu:4 # 加载环境(如果使用conda或module) # source activate my_env # 打印分配到的GPU信息,Slurm会自动设置CUDA_VISIBLE_DEVICES echo "CUDA_VISIBLE_DEVICES: $CUDA_VISIBLE_DEVICES" nvidia-smi # 运行你的Python训练脚本 python train.py --batch-size 256
-
提交作业:
sbatch run_pytorch.sh
-
工作流:
- Slurm收到请求,寻找一个有至少4张空闲GPU的节点。
- 找到后,它在该节点上锁定这4张GPU,并设置环境变量
CUDA_VISIBLE_DEVICES
(例如0,1,2,3
)。 - 你的
train.py
脚本(使用PyTorch或TensorFlow)将只会看到这4张被分配的卡,从而实现了资源隔离和按需使用。
- 用户SSH到
-
常用监控命令:
sinfo
: 查看集群节点状态。squeue
: 查看正在排队和运行的作业。scontrol show node <nodename>
: 查看节点详细信息,包括GPU分配情况。scancel <jobid>
: 取消作业。watch nvidia-smi
: 在节点上实时查看GPU使用情况。
-
高级监控系统 (运维):
- Prometheus + Grafana: 这是现代运维的标配。
- Node Exporter: 采集节点的CPU、内存、磁盘等系统指标。
- DCGM Exporter: NVIDIA官方的工具,用于采集非常详细的GPU指标(利用率、显存、温度、功耗、NVLink流量等)。
- 在Grafana中创建一个仪表盘,你可以一目了然地看到整个集群所有64张GPU的实时状态,非常酷炫且实用。
当然!搭建 Prometheus + Grafana 监控系统是你运维体系中至关重要的一环,它能让你从“黑盒”运维变成“白盒”运维,对整个集群的健康状况和资源使用情况了如指掌。
下面是一套专门为你这个AI集群量身定制的 Prometheus + Grafana 搭建建议。
第一部分:架构和理念
这个监控系统的核心理念是 "Pull" (拉取) 模型。
- Exporters (数据探针): 在你所有的8台服务器上,我们会安装一些小程序,叫做 "Exporter"。它们的作用就像是暴露在外的传感器,负责采集本机的各种指标(CPU、内存、磁盘、网络,以及最重要的GPU指标),并以特定的格式(HTTP端点)暴露出来。
- Prometheus Server (数据中心): 在你的**管理节点 (Head Node)**上,我们会安装 Prometheus 主服务。它会周期性地(例如每15秒)去“拉取”所有8台服务器上 Exporter 暴露的数据,并存储在自己的时序数据库(TSDB)中。
- Grafana (可视化仪表盘): 同样在你的管理节点上,我们安装 Grafana。它本身不存储数据,而是作为一个漂亮的前端。它会向 Prometheus 查询数据,然后通过丰富的图表、仪表盘等形式展示出来。
- Alertmanager (报警系统,可选): Prometheus 可以根据预设的规则(例如:GPU温度超过90度)产生告警,并将其发送给 Alertmanager。Alertmanager 负责对告警进行去重、分组,并通过Email、Slack、钉钉等方式通知你。
架构图示意:
+-------------------------------------------------+
| 管理节点 (Head Node) |
| |
| +----------------+ PULL +-----------------+ |
| | Grafana |<---------| Prometheus | |
| | (Port 3000) | Query | (Port 9090) | |
| +----------------+ +--------+--------+ |
| | |
+--------------------------------------|----------+
| PULL (Scrape)
|
+--------------------------------------|-----------------------------------------+
| | |
| on all 8 nodes | on all 8 nodes |
| | |
| +----------------------------------+ | +-------------------------------------+ |
| | Node Exporter (系统指标) | | | DCGM Exporter (GPU核心指标) | |
| | (e.g., Port 9100) | | | (e.g., Port 9400) | |
| +----------------------------------+ | +-------------------------------------+ |
| | |
| 计算节点 1-8 | 计算节点 1-8 |
+---------------------------------------------------------------------------------+
第二部分:分步实施指南
先决条件: 假设你的8台服务器(包括管理节点)都已经装好了操作系统,并且网络互通。
阶段一:在所有8台服务器上部署 Exporters
这一步强烈建议使用 Ansible 自动化完成,否则你需要在8台机器上重复操作。
1. 安装 Node Exporter (采集系统基础指标)
Node Exporter 负责采集CPU、内存、磁盘I/O、网络流量等基础指标。
- 在所有8台服务器上执行:
- 下载: 去 Prometheus官网下载页面 找到最新的
node_exporter
for linux-amd64 的下载链接。wget https://github.com/prometheus/node_exporter/releases/download/v1.7.0/node_exporter-1.7.0.linux-amd64.tar.gz
- 解压安装:
tar xvfz node_exporter-1.7.0.linux-amd64.tar.gz sudo mv node_exporter-1.7.0.linux-amd64/node_exporter /usr/local/bin/
- 创建 systemd 服务 (使其开机自启):
创建文件
sudo nano /etc/systemd/system/node_exporter.service
并写入以下内容:[Unit] Description=Node Exporter Wants=network-online.target After=network-online.target [Service] User=node_exporter Group=node_exporter Type=simple ExecStart=/usr/local/bin/node_exporter [Install] WantedBy=multi-user.target
- 创建专用用户并启动服务:
sudo useradd --no-create-home --shell /bin/false node_exporter sudo systemctl daemon-reload sudo systemctl enable node_exporter sudo systemctl start node_exporter
- 验证: 在浏览器或使用
curl
访问http://<任意一台服务器IP>:9100/metrics
,如果看到一大堆文本指标输出,说明成功。
- 下载: 去 Prometheus官网下载页面 找到最新的
2. 安装 DCGM Exporter (采集NVIDIA GPU核心指标)
这是监控GPU的最佳实践。DCGM (Data Center GPU Manager)是NVIDIA官方套件,dcgm-exporter
可以从中提取非常详细的GPU指标,远比nvidia-smi
强大。
- 在所有8台服务器上执行:
- 安装DCGM: 按照 NVIDIA官方文档 的指导,添加NVIDIA的仓库并安装DCGM。对于Ubuntu,通常是:
# 参照官方文档添加仓库... sudo apt-get update sudo apt-get install -y datacenter-gpu-manager
- 启动DCGM服务:
sudo systemctl enable nvidia-dcgm sudo systemctl start nvidia-dcgm
- 下载并运行 dcgm-exporter:
推荐使用Docker来运行,最简单干净。
docker run -d --restart always --gpus all \ --net host \ -p 9400:9400 \ --name dcgm-exporter \ nvidia/dcgm-exporter:3.3.0-1-ubuntu22.04
--gpus all
: 允许容器访问所有GPU。--net host
: 让容器直接使用主机的网络,性能最好,也方便Prometheus发现。-p 9400:9400
: 默认暴露在9400端口。
- 验证: 访问
http://<任意一台服务器IP>:9400/metrics
,应该能看到大量以DCGM_
开头的GPU指标。
- 安装DCGM: 按照 NVIDIA官方文档 的指导,添加NVIDIA的仓库并安装DCGM。对于Ubuntu,通常是:
阶段二:在管理节点上安装和配置 Prometheus
- 只在管理节点 (Head Node) 上执行:
-
下载并安装 Prometheus:
wget https://github.com/prometheus/prometheus/releases/download/v2.51.0/prometheus-2.51.0.linux-amd64.tar.gz tar xvfz prometheus-2.51.0.linux-amd64.tar.gz cd prometheus-2.51.0.linux-amd64 sudo mv prometheus promtool /usr/local/bin/ sudo mkdir /etc/prometheus sudo mv prometheus.yml /etc/prometheus/
-
配置
prometheus.yml
: 这是最关键的配置!编辑sudo nano /etc/prometheus/prometheus.yml
,内容如下:global: scrape_interval: 15s # 每15秒抓取一次 scrape_configs: # 抓取 Prometheus 自身 - job_name: 'prometheus' static_configs: - targets: ['localhost:9090'] # 抓取所有节点的系统指标 - job_name: 'node_exporter' static_configs: - targets: - 'head-node:9100' # 你的管理节点主机名或IP - 'compute-01:9100' # 你的计算节点1 - 'compute-02:9100' - 'compute-03:9100' - 'compute-04:9100' - 'compute-05:9100' - 'compute-06:9100' - 'compute-07:9100' # 把你所有8台机器的地址和端口都加上 # 抓取所有节点的GPU指标 - job_name: 'dcgm_exporter' static_configs: - targets: - 'head-node:9400' - 'compute-01:9400' - 'compute-02:9400' - 'compute-03:9400' - 'compute-04:9400' - 'compute-05:9400' - 'compute-06:9400' - 'compute-07:9400' # 同样,所有8台机器的地址和端口
-
创建 systemd 服务: 创建
sudo nano /etc/systemd/system/prometheus.service
:[Unit] Description=Prometheus Wants=network-online.target After=network-online.target [Service] User=prometheus Group=prometheus Type=simple ExecStart=/usr/local/bin/prometheus \ --config.file /etc/prometheus/prometheus.yml \ --storage.tsdb.path /var/lib/prometheus/ \ --web.console.templates=/etc/prometheus/consoles \ --web.console.libraries=/etc/prometheus/console_libraries [Install] WantedBy=multi-user.target
-
创建用户、目录并启动:
sudo useradd --no-create-home --shell /bin/false prometheus sudo mkdir /var/lib/prometheus sudo chown prometheus:prometheus /var/lib/prometheus sudo systemctl daemon-reload sudo systemctl enable prometheus sudo systemctl start prometheus
-
验证: 访问
http://<管理节点IP>:9090
。点击菜单栏的 "Status" -> "Targets"。你应该能看到node_exporter
和dcgm_exporter
两个 job,并且下面所有节点的 "State" 都应该是 "UP" (绿色)。
-
阶段三:在管理节点上安装和配置 Grafana
- 只在管理节点 (Head Node) 上执行:
- 安装 Grafana: 推荐使用官方源安装,方便升级。
sudo apt-get install -y apt-transport-https software-properties-common wget -q -O - https://packages.grafana.com/gpg.key | sudo apt-key add - echo "deb https://packages.grafana.com/oss/deb stable main" | sudo tee -a /etc/apt/sources.list.d/grafana.list sudo apt-get update sudo apt-get install grafana
- 启动 Grafana:
sudo systemctl daemon-reload sudo systemctl enable grafana-server sudo systemctl start grafana-server
- 配置 Grafana:
- 访问
http://<管理节点IP>:3000
。 - 默认用户名/密码是
admin
/admin
,首次登录会要求你修改密码。 - 添加数据源 (Data Source):
- 点击左侧齿轮图标 -> "Data Sources" -> "Add data source"。
- 选择 "Prometheus"。
- 在 "HTTP" -> "URL" 字段中,输入
http://localhost:9090
。 - 其他保持默认,点击 "Save & Test"。如果显示绿色√,说明连接成功。
- 导入仪表盘 (Import Dashboards): 这是最激动人心的部分!你不需要自己画图,社区有大量现成的优秀模板。
- 导入GPU仪表盘:
- 点击左侧加号图标 -> "Import"。
- 在 "Import via grafana.com" 输入框中,输入
12239
,然后点击 "Load"。这是NVIDIA官方推荐的DCGM仪表盘。 - 在下一个页面,选择你刚刚创建的 Prometheus 数据源,然后点击 "Import"。
- 大功告成! 你现在应该能看到一个极其详细的仪表盘,显示了你集群里所有64张卡的利用率、显存、温度、功耗、NVLink流量等信息。你可以通过下拉菜单选择查看哪个节点。
- 导入Node Exporter仪表盘:
- 重复导入步骤,这次输入
1860
。这是一个非常流行的Node Exporter总览仪表盘。 - 导入后,你就可以看到所有节点的CPU、内存、磁盘和网络状况。
- 重复导入步骤,这次输入
- 导入GPU仪表盘:
- 访问
- 安装 Grafana: 推荐使用官方源安装,方便升级。
非常好!这个问题直击要害,是从“系统管理员”视角转换到“最终用户”视角的关键。一个集群搭得再好,如果用户不知道如何高效、规范地使用,那它的价值也无法完全发挥。
下面我将为你详细描绘一个多人共享此集群的完整工作流程,包括管理员的准备工作和用户的具体操作步骤。
第一部分:管理员的准备工作 (Admin's Checklist)
在你向用户开放集群之前,需要做好以下准备,为他们创造一个清晰、一致、隔离的环境。
1. 创建用户账户
这是第一步。你需要为每一位用户在所有节点上创建账户,并且必须保证同一个用户在所有节点上的用户名、UID (User ID) 和 GID (Group ID) 完全一致。这是Slurm和NFS能正确识别用户权限的基础。
操作示例(为用户 alice
创建账户):
在管理节点上执行:
# 创建一个用户组,比如 researchers
sudo groupadd --gid 1001 researchers
# 创建用户 alice,指定UID和主组,并添加到 researchers 组
sudo useradd --uid 2001 --gid 1001 -g researchers -m -s /bin/bash alice
# -m: 创建家目录
# -s /bin/bash: 设置默认shell
记下 alice
的 UID (2001) 和 GID (1001)。然后,在所有其他7个计算节点上执行完全相同的命令,确保UID/GID不变。
强烈建议: 使用Ansible来自动化这个过程,确保一致性。
2. 配置家目录 (Home Directories)
用户的家目录必须位于共享存储上!这样,用户登录管理节点后,他们放在家目录里的代码、脚本等文件,在计算节点上也能被作业脚本访问到。
-
推荐方案:
- 在你的NFS共享目录
/export/share
下创建一个homes
目录:sudo mkdir /export/share/homes
- 修改
/etc/fstab
,将NFS挂载点从/share
改为/home
。或者创建一个新的挂载点。 - 当使用
useradd
创建用户时,使用-d /home/alice
来指定家目录。
这样,当
alice
登录后,她所在的~
(即/home/alice
) 目录就是网络共享的。 - 在你的NFS共享目录
3. 建立数据存储规范 (Data Policy)
一个混乱的共享目录是灾难的开始。你需要建立并告知用户一套清晰的目录结构规范。
4. 提供环境管理工具
用户的代码依赖五花八门(不同版本的PyTorch、TensorFlow、CUDA),你不能在系统层面为他们一一安装。必须提供工具让他们自己管理自己的环境,互不干扰。
- 首选方案:Conda/Mamba
- 在系统层面安装Miniconda或Mambaforge。
- 指导用户在自己的家目录中初始化并创建自己的Conda环境。这样所有环境配置都保存在用户的家目录里,天然隔离。
- 高级方案:Singularity/Apptainer (取代Docker)
- 在HPC集群中,直接使用Docker有安全风险(需要root权限)。Singularity/Apptainer是专为此类场景设计的容器技术,它允许普通用户运行容器而无需root权限。
- 你可以预先构建一些包含常用AI框架的Singularity镜像,或者教会用户如何将自己的Docker镜像转换为Singularity镜像来运行。
5. 编写一份《用户入门指南》
准备一个简单的文档,包含以下信息,发给每一位新用户:
- 集群登录地址 (
ssh username@head-node.ip
)。 - 文件系统结构说明(
/home
,/datasets
,/scratch
分别用来干什么)。 - 如何使用Conda创建和管理环境。
- Slurm作业提交的模板和常用命令 (
sbatch
,squeue
,scancel
)。 - 集群使用规范(严禁在登录节点上直接跑计算任务!)。
第二部分:用户的工作流程 (User's Workflow)
假设新用户 alice
拿到了她的账户和《用户入门指南》,她想跑一个PyTorch训练任务,她的完整操作流程如下:
步骤1:登录和环境准备
-
登录管理节点:
ssh alice@head-node.ip
她现在位于自己的家目录
/home/alice
。 -
准备代码:
git clone https://github.com/some-repo/my-ai-project.git cd my-ai-project
-
创建独立的Conda环境:
# 创建一个名为 'pytorch_env' 的环境,指定python版本 conda create -n pytorch_env python=3.9 -y # 激活环境 conda activate pytorch_env # 在激活的环境中安装代码需要的库 # 假设你的集群CUDA版本是11.8 pip install torch torchvision torchaudio --index-url https://download.pytorch.org/whl/cu118 pip install -r requirements.txt
现在,
alice
有了一个完全属于她自己的、包含所有依赖的Python环境。
步骤2:编写Slurm作业脚本
alice
在她的项目目录 my-ai-project
下创建一个名为 run.slurm
的脚本文件。这是她与集群资源管理器Slurm对话的“申请表”。
run.slurm
文件内容:
#!/bin/bash
# --- Slurm 资源申请指令 ---
#SBATCH --job-name=alice-test-run # 作业名称,方便自己识别
#SBATCH --partition=gpu_partition # 提交到名为 gpu_partition 的分区
#SBATCH --nodes=1 # 申请1个计算节点
#SBATCH --ntasks-per-node=1 # 每个节点上运行1个任务
#SBATCH --cpus-per-task=16 # 为任务申请16个CPU核心
#SBATCH --mem=128G # 申请128GB内存
# !!! 核心:申请2张GPU !!!
#SBATCH --gres=gpu:2
# --- 作业执行的命令 ---
# 1. 打印作业信息,方便调试
echo "Job ID: $SLURM_JOB_ID"
echo "Job User: $SLURM_JOB_USER"
echo "Num Nodes: $SLURM_JOB_NUM_NODES"
echo "Node List: $SLURM_JOB_NODELIST"
echo "Submit Host: $SLURM_SUBMIT_HOST"
echo "GPU(s) allocated: $CUDA_VISIBLE_DEVICES"
echo "----------------------------------------------------"
# 2. 激活之前创建的Conda环境
# 找到你的conda.sh路径,通常在家目录的miniconda3/etc/profile.d/下
source /home/alice/miniconda3/etc/profile.d/conda.sh
conda activate pytorch_env
# 3. 切换到代码目录
cd /home/alice/my-ai-project
# 4. 运行你的Python训练脚本
# 你的python脚本会因为CUDA_VISIBLE_DEVICES环境变量,自动只使用被分配的2张GPU
python main_train.py --data_dir /share/datasets/some_data --batch_size 512
步骤3:提交并管理作业
-
提交作业:
sbatch run.slurm
终端会返回一个作业ID,例如
Submitted batch job 12345
。 -
查看作业状态:
# 查看自己所有作业的队列情况 squeue -u alice # 输出可能像这样: # JOBID PARTITION NAME USER ST TIME NODES NODELIST(REASON) # 12345 gpu_parti alice-tes alice PD 0:00 1 (Resources) <-- PD表示排队中,等待资源 # 或者 # 12345 gpu_parti alice-tes alice R 5:30 1 compute-03 <-- R表示正在运行
-
查看实时输出: 作业的屏幕输出(
print
语句等)会被重定向到一个名为slurm-12345.out
的文件里。alice
可以用tail -f
来实时查看:tail -f slurm-12345.out
-
取消作业: 如果发现有问题,可以立即取消作业:
scancel 12345
步骤4:获取结果
当作业运行结束后,alice
在 my-ai-project
目录下就能找到她的输出文件:
slurm-12345.out
: 包含了所有的屏幕打印信息。models/best_model.pth
: 假如她的代码会保存模型。logs/training_log.csv
: 假如她的代码会记录日志。
因为这一切都发生在共享存储上,她可以在登录节点上直接访问这些文件,进行分析或下载到本地。
总结:给用户的黄金法则
这套流程的核心,是向用户灌输以下几条“黄金法则”:
- 只在登录节点做“轻”活:登录节点是公共客厅,只用来编辑代码、提交作业、管理文件。严禁直接在登录节点上运行
python train.py
,这会占用所有人的共享资源,导致登录卡顿。 - 用
sbatch
提交一切“重”活:所有计算任务,无论大小,都必须通过sbatch
脚本提交给Slurm。 - 资源按需申请:在
sbatch
脚本里,需要几张卡就申请几张(--gres=gpu:N
),需要多少CPU就申请多少。精确申请可以减少排队时间,提高整个集群的利用率。 - 环境自我管理:使用Conda或Singularity管理自己的软件依赖,不要污染系统环境。
通过这套清晰的流程和规范,你的8台服务器就能高效、有序地被多位用户共享,每个人都能在自己的沙盒里工作,同时又能享受到整个集群强大的计算能力。
No comments to display
No comments to display