远程Linux服务器中ImageFolder加载分类数据集卡顿问题求助
PyTorch数据加载阶段卡顿无进展(Linux服务器异常,Windows正常)
问题详情
在Linux服务器上使用ResNet-101或ConvNet执行图像分类任务时,程序在数据加载阶段卡顿无进展,调试时断点停留在数据集加载环节无法继续。但相同代码在Windows笔记本上运行完全正常。
相关界面截图:
- 运行卡顿状态:

- 调试断点反馈:

部分核心代码:
def main(): device = torch.device("cuda:2" if torch.cuda.is_available() else "cpu") print("using {} device.".format(device)) data_transform = { "train": transforms.Compose([transforms.RandomResizedCrop(224), transforms.RandomHorizontalFlip(), transforms.ToTensor(), transforms.Normalize([0.485, 0.456, 0.406], [0.229, 0.224, 0.225])]), "val": transforms.Compose([transforms.Resize(256), transforms.CenterCrop(224), transforms.ToTensor(), transforms.Normalize([0.485, 0.456, 0.406], [0.229, 0.224, 0.225])])} image_path = r"/home/sc/ClassicalNeuralNetwork/dataset/CGIARWheatGrowthStageChallenge" assert os.path.exists(image_path), "{} path does not exist.".format(image_path) trains_dataset = datasets.ImageFolder(root=os.path.join(image_path, "train"), transform=data_transform["train"], target_transform=None) train_num = len(trains_dataset) flower_list = trains_dataset.class_to_idx cla_dict = dict((val, key) for key, val in flower_list.items()) json_str = json.dumps(cla_dict, indent=4) with open('class_indices.json', 'w') as json_file: json_file.write(json_str) batch_size = 4 nw = min([os.cpu_count(), batch_size if batch_size > 1 else 0, 4]) print('Using {} dataloader workers every process'.format(nw)) train_loader = torch.utils.data.DataLoader(trains_dataset, batch_size=batch_size, shuffle=True, num_workers=nw) validate_dataset = datasets.ImageFolder(root=os.path.join(image_path, "val"), transform=data_transform["val"]) val_num = len(validate_dataset) validate_loader = torch.utils.data.DataLoader(validate_dataset, batch_size=batch_size, shuffle=False, num_workers=nw) print("using {} images for training, {} images for validation.".format(train_num, val_num)) net = resnet101(num_classes=7) net = net.cuda(device)
解决方案
1. 调整DataLoader的num_workers参数
Linux下PyTorch多进程数据加载容易出现死锁,尤其是调试场景。先尝试将num_workers设为0(单进程模式):
nw = 0 # 替换原有的min(...)计算逻辑
如果单进程正常,再逐步尝试设置为1、2等,找到服务器能稳定运行的数值。调试时必须将num_workers设为0,否则多进程会导致调试器卡住。
2. 检查数据集文件权限
确认Linux服务器上数据集路径下的所有图片文件、文件夹都能被当前用户读取:
- 用命令
ls -l /home/sc/ClassicalNeuralNetwork/dataset/CGIARWheatGrowthStageChallenge/train查看权限 - 手动测试读取图片:
from PIL import Image import os img_path = os.path.join("/home/sc/ClassicalNeuralNetwork/dataset/CGIARWheatGrowthStageChallenge/train", "your_class_folder", "sample.jpg") try: img = Image.open(img_path) print("图片读取成功") except Exception as e: print(f"读取失败:{e}")
3. 禁用pin_memory并调整shuffle设置
当shuffle=True且num_workers>0时,共享内存可能引发死锁。修改DataLoader初始化代码:
train_loader = torch.utils.data.DataLoader(trains_dataset, batch_size=batch_size, shuffle=True, num_workers=nw, pin_memory=False)
4. 验证PyTorch与CUDA版本兼容性
检查服务器上的PyTorch和CUDA版本是否匹配,对比Windows上的运行版本:
import torch print(f"PyTorch版本:{torch.__version__}") print(f"CUDA版本:{torch.version.cuda}")
若版本差异较大,尝试安装与Windows一致的PyTorch版本,或确保服务器CUDA驱动与PyTorch兼容。
内容的提问来源于stack exchange,提问作者pointy
相关产品推荐
相关产品推荐

