Keras2.x&TensorFlow2.x下Mask RCNN多进程训练卡顿问题求解
解决Mask-RCNN多进程训练卡顿与线程安全问题(Keras 2.9.0 + TF 2.9.2)
方案1:给原生成器添加线程安全锁(最小改动,保留多线程)
针对use_multiprocessing=False时的线程安全错误,给原生成器套一个带锁的包装类,无需修改Mask-RCNN核心生成逻辑:
import threading class ThreadSafeGenerator: def __init__(self, generator): self.generator = generator self.lock = threading.Lock() def __iter__(self): return self def __next__(self): with self.lock: return next(self.generator) # 替换原训练生成器 train_gen = ThreadSafeGenerator(your_original_maskrcnn_train_generator)
训练时配置:
model.train(train_gen, ..., use_multiprocessing=False, workers=4) # workers可设4-8,根据Colab资源调整
这个方案通过锁避免多线程下的资源竞争,解决线程安全错误,同时利用多线程提升数据加载速度。
方案2:轻量包装为keras.utils.Sequence(适配多进程,彻底解决重复/卡顿)
TF官方推荐用Sequence类实现进程安全的数据加载,只需把原Mask-RCNN的生成逻辑包装成Sequence,核心数据加载代码完全复用:
from keras.utils import Sequence import numpy as np class MaskRCNNSequence(Sequence): def __init__(self, dataset, config, shuffle=True): self.dataset = dataset self.config = config self.shuffle = shuffle self.indices = list(range(len(dataset))) if shuffle: np.random.shuffle(self.indices) def __len__(self): # 返回每个epoch的步数(总样本数/批次大小) return len(self.dataset) // self.config.BATCH_SIZE def __getitem__(self, idx): # 复用原Mask-RCNN的batch生成逻辑 batch_idx = self.indices[idx*self.config.BATCH_SIZE : (idx+1)*self.config.BATCH_SIZE] # 调用原代码中的batch加载函数(比如dataset.load_batch) batch_data, batch_labels = self.dataset.load_batch(batch_idx, self.config) return batch_data, batch_labels def on_epoch_end(self): # 每个epoch结束后打乱索引 if self.shuffle: np.random.shuffle(self.indices)
训练时配置:
train_seq = MaskRCNNSequence(your_dataset, your_config) model.train(train_seq, ..., use_multiprocessing=True, workers=6) # workers建议设6-8,Colab GPU可承载
Sequence会为每个进程分配独立的索引区间,彻底解决数据重复问题,同时多进程加载数据不会卡顿,且几乎没改动原Mask-RCNN的核心逻辑。
方案3:临时规避Colab多进程启动方式(快速验证)
Colab默认用fork启动多进程,可能和TF GPU资源冲突导致卡顿,可强制用spawn方式启动进程,无需修改生成器代码:
import multiprocessing multiprocessing.set_start_method('spawn', force=True)
之后用原生成器启动多进程训练:
model.train(your_original_generator, ..., use_multiprocessing=True, workers=4)
这个方案适合快速验证,但仍可能存在数据重复问题,仅作为临时 workaround。
注意事项
- Colab GPU显存有限,workers数不要超过8,避免显存溢出;
- 若原Mask-RCNN生成器依赖全局变量,建议优先用方案2的
Sequence类,避免进程间状态共享冲突。
内容的提问来源于stack exchange,提问作者ArieAI
相关产品推荐
相关产品推荐

