第一个时期后,Pytorch的GPU利用率较低

zbdgwd5y  于 2022-11-09  发布在  其他
关注(0)|答案(1)|浏览(106)

嗨,我正在远程服务器上训练我的pytorch模型。
所有的工作都是由slurm管理的。
我的问题是“修炼第一个纪元后,修炼速度非常慢”。
我检查了GPU利用率。
在我的第一个时期,利用率如下图所示。

我可以看到gpu被利用。但从第二个时期利用的百分比几乎是零

我的数据加载器代码是这样的

class img2selfie_dataset(Dataset):
    def __init__(self, path, transform, csv_file, cap_vec):
        self.path = path
        self.transformer = transform
        self.images = [path + item for item in list(csv_file['file_name'])]
        self.smiles_list = cap_vec

    def __getitem__(self, idx):
        img = Image.open(self.images[idx])
        img = self.transformer(img)
        label = self.smiles_list[idx]
        label = torch.Tensor(label)
        return img, label.type(torch.LongTensor)

    def __len__(self):
        return len(self.images)

我的数据加载器定义如下

train_data_set = img2selfie_dataset(train_path, preprocess, train_dataset, train_cap_vec)
train_loader = DataLoader(train_data_set, batch_size = 256, num_workers = 2, pin_memory = True)
val_data_set = img2selfie_dataset(train_path, preprocess, val_dataset, val_cap_vec)
val_loader = DataLoader(val_data_set, batch_size = 256, num_workers = 2, pin_memory = True)

我的培训步骤定义如下

train_loss = []
valid_loss = []
epochs = 20
best_loss = 1e5
for epoch in range(1, epochs + 1):
    print('Epoch {}/{}'.format(epoch, epochs))
    print('-' * 10)
    epoch_train_loss, epoch_valid_loss = train(encoder_model, transformer_decoder, train_loader, val_loader, criterion, optimizer)
    train_loss.append(epoch_train_loss)
    valid_loss.append(epoch_valid_loss)
    if len(valid_loss) > 1:
        if valid_loss[-1] < best_loss:
            print(f"valid loss on this {epoch} is better than previous one, saving model.....")
            torch.save(encoder_model.state_dict(), 'model/encoder_model.pickle')
            torch.save(transformer_decoder.state_dict(), 'model/decoder_model.pickle')
            best_loss = valid_loss[-1]
            print(best_loss)
    print(f'Epoch : [{epoch}] Train Loss : [{train_loss[-1]:.5f}], Valid Loss : [{valid_loss[-1]:.5f}]')

在我看来,如果这个问题来自我的代码。它不会在第一个纪元达到100%的利用率。

ngynwnxp

ngynwnxp1#

我通过将训练数据移动到本地驱动器中修复了此问题。
我的远程服务器(学校服务器)的策略是将个人数据存储到NAS。从NAS的文件I/O证明了网络负载很重。它还受到其他用户从NAS的文件I/O的影响。
在我将训练数据移到NAS后,一切都很好。

相关问题