我正在尝试使用 pytorch lighting 训练神经网络,我想将训练分成两个集群节点,每个节点有 4 个 GPU。我可以在单个节点的 4 个 GPU 上进行训练,但是当我尝试使用第二个节点时,我收到以下错误:
[rank: 3] Global seed set to 0
[rank: 1] Global seed set to 0
[rank: 2] Global seed set to 0
[rank: 0] Global seed set to 0
[rank: 5] Global seed set to 0
[rank: 6] Global seed set to 0
[rank: 7] Global seed set to 0
[rank: 4] Global seed set to 0
[...]
raise MisconfigurationException(
lightning_fabric.utilities.exceptions.MisconfigurationException: You requested gpu: [0, 1, 2, 3, 4, 5, 6, 7]
But your machine only has: [0, 1, 2, 3]
srun: error: lrdn0346: tasks 0-3: Exited with exit code 1
srun: error: lrdn0910: tasks 4-7: Exited with exit code 1
这是我对培训师的定义:
trainer = pl.Trainer(accelerator=accelerator, strategy="ddp_find_unused_parameters_true", devices=8, num_nodes=2, log_every_n_steps=20, max_epochs=conf.training.max_epochs, callbacks=[early_stop_callback, checkpoint_callback], logger=tb_logger, check_val_every_n_epoch=1)
在之前的尝试中,我没有输入 num_nodes 和 devices 的参数,但也失败了。
我认为我们缺少信息。您应该添加用于调用训练脚本的 Slurm 脚本。它可能就像将 --nodes=2 添加到 srun 或将 #SBATCH --nodes=2 添加到 SBATCH 指令一样简单。仅 Pytorch 传递信息是不够的,Slurm 也需要它。
这里创建 Slurm 脚本的一个很好的来源。
简单的 Slurm 脚本示例 (script.sh):
#!/bin/bash
#SBATCH --job-name=test_job
#SBATCH --output=./logs_%j.out
#SBATCH --error=./logs_%j.err
#SBATCH --nodes=2
#SBATCH --time=00:10:00
#SBATCH --partition=partition-name
srun python train.py
然后通过调用
sbatch script.sh
将其传递到队列。请注意,它很容易出错,并且可见 CPU 或 GPU 的数量低于节点中的数量,我还发现文档有时有点神秘。您应该记录您的训练情况。