Colab中PyTorch设置num_workers>0报错,求解决方法
解决Colab中PyTorch DataLoader num_workers>0报错的问题
第一步:获取真实错误信息
先按照错误提示将num_workers设为0重新运行,这样能看到完整的错误堆栈——多进程模式会掩盖具体报错,这是定位问题的核心前提。
第二步:修复Dataset中的变量引用错误
你的CustomDataset类__init__方法存在明显变量错误:
self.training = glob.glob(base_path+str('*.mp4'))
这里的base_path未加self.,属于未定义的全局变量,会直接抛出NameError。修改为:
self.training = glob.glob(self.base_path + '*.mp4')
第三步:处理Google Drive路径的多进程访问问题
Colab挂载的Google Drive在多进程模式下,子进程可能无法直接继承父进程的挂载上下文:
- 确保启动DataLoader前Google Drive已完成挂载(Colab挂载后通常会持续有效,若动态挂载需保证子进程能访问)。
- 避免在
__init__中提前加载Drive文件到内存,尽量在__getitem__里延迟读取,减少跨进程资源共享冲突。
第四步:修复__getitem__的返回值问题
当前__getitem__在save=False时返回False, False,会导致DataLoader无法批量处理数据(期望的是张量或可统一处理的数据类型),可做如下调整:
- 提前过滤无效文件:在
__init__阶段筛选出可处理的mp4文件,减少后续无效读取。 - 递归获取有效样本:
def __getitem__(self, idx): self.fileName = self.training[idx] self.filePath = self.fileName feature, save = makeFeature(self.filePath, self.fileName) if save: return feature, self.fileName else: # 递归获取下一个有效样本,需确保数据集至少有一个有效样本 if idx + 1 < len(self.training): return self.__getitem__(idx + 1) else: raise ValueError("数据集无有效样本")
- 自定义collate_fn过滤无效样本:
def collate_fn(batch): # 过滤返回False的无效样本 batch = [item for item in batch if item[0] is not False] if not batch: return None, None features = torch.stack([item[0] for item in batch]) filenames = [item[1] for item in batch] return features, filenames # 初始化DataLoader时指定collate_fn dataloader = DataLoader(dataset, batch_size=9, shuffle=False, num_workers=1, collate_fn=collate_fn)
第五步:调整多进程与CUDA的兼容设置
使用spawn启动方式时,父进程的CUDA资源无法被子进程继承,需注意:
- 所有CUDA操作(如
makeFeature中的张量创建、模型推理)都在子进程内部初始化,不要在父进程提前创建CUDA张量。 - 若
makeFeature用到模型,确保每个子进程单独加载模型到CUDA,避免跨进程共享模型实例。
其他注意事项
- 确保
json、glob等依赖模块在全局作用域导入,不要仅在__init__方法内导入,否则子进程可能无法找到这些模块。 - 避免用类变量或全局变量存储Dataset状态,尽量使用实例变量,减少跨进程状态冲突。
内容的提问来源于stack exchange,提问作者Pengu
相关产品推荐
相关产品推荐

