我在train的过程中。出现错误
BrokenPipeError Traceback (most recent call last)
~\AppData\Local\Temp\ipykernel_15608\3724903352.py in <module>
37 checkpoint_dir=checkpoint_dir,
38 checkpoint_interval=hparams.syncnet_checkpoint_interval,
---> 39 nepochs=27)
~\AppData\Local\Temp\ipykernel_15608\843007753.py in train(device, model, train_data_loader, test_data_loader, optimizer, checkpoint_dir, checkpoint_interval, nepochs)
7 while global_epoch < nepochs:
8 running_loss = 0.
----> 9 prog_bar = tqdm(enumerate(train_data_loader))
10 for step, (x, mel, y) in prog_bar:
11 model.train()
~\.conda\envs\wav2lip\lib\site-packages\torch\utils\data\dataloader.py in __iter__(self)
436 return self._iterator
437 else:
--> 438 return self._get_iterator()
439
440 @property
~\.conda\envs\wav2lip\lib\site-packages\torch\utils\data\dataloader.py in _get_iterator(self)
382 else:
383 self.check_worker_number_rationality()
--> 384 return _MultiProcessingDataLoaderIter(self)
385
386 @property
~\.conda\envs\wav2lip\lib\site-packages\torch\utils\data\dataloader.py in __init__(self, loader)
1046 # before it starts, and __del__ tries to join but will get:
1047 # AssertionError: can only join a started process.
-> 1048 w.start()
1049 self._index_queues.append(index_queue)
1050 self._workers.append(w)
~\.conda\envs\wav2lip\lib\multiprocessing\process.py in start(self)
110 'daemonic processes are not allowed to have children'
111 _cleanup()
--> 112 self._popen = self._Popen(self)
113 self._sentinel = self._popen.sentinel
114 # Avoid a refcycle if the target function holds an indirect
~\.conda\envs\wav2lip\lib\multiprocessing\context.py in _Popen(process_obj)
221 @staticmethod
222 def _Popen(process_obj):
--> 223 return _default_context.get_context().Process._Popen(process_obj)
224
225 class DefaultContext(BaseContext):
~\.conda\envs\wav2lip\lib\multiprocessing\context.py in _Popen(process_obj)
320 def _Popen(process_obj):
321 from .popen_spawn_win32 import Popen
--> 322 return Popen(process_obj)
323
324 class SpawnContext(BaseContext):
~\.conda\envs\wav2lip\lib\multiprocessing\popen_spawn_win32.py in __init__(self, process_obj)
87 try:
88 reduction.dump(prep_data, to_child)
---> 89 reduction.dump(process_obj, to_child)
90 finally:
91 set_spawning_popen(None)
~\.conda\envs\wav2lip\lib\multiprocessing\reduction.py in dump(obj, file, protocol)
58 def dump(obj, file, protocol=None):
59 '''Replacement for pickle.dump() using ForkingPickler.'''
---> 60 ForkingPickler(file, protocol).dump(obj)
61
62 #
BrokenPipeError: [Errno 32] Broken pipe
出现 BrokenPipeError
错误通常是因为在多进程环境中,父进程和子进程之间的通信管道中断导致的。在这种情况下,这个问题可能与 DataLoader 和多进程有关。
可以尝试以下方法来解决这个问题:
- 将 DataLoader 的
num_workers
参数设置为 0。这将使 DataLoader 在主进程中运行,而不是多个子进程中:
train_data_loader = DataLoader(train_dataset, batch_size=hparams.syncnet_batch_size, shuffle=True, num_workers=0)
test_data_loader = DataLoader(test_dataset, batch_size=hparams.syncnet_batch_size, shuffle=False, num_workers=0)
请注意,将 num_workers
设置为 0 可能会降低数据加载的速度。
-
如果你在 Jupyter Notebook 中运行代码,尝试将代码移到独立的 Python 脚本中,并在命令行中运行它。有时,Jupyter Notebook 与多进程不兼容。
-
确保所有函数和对象都是可序列化的。在多进程环境中,对象需要在进程之间序列化和传输。如果遇到不可序列化的对象,可能会导致通信错误。检查 DataLoader 和模型中使用的所有自定义函数和对象,确保它们可以使用
pickle
库进行序列化。 -
如果你使用的是 Windows 操作系统,请确保在运行训练代码时使用
if __name__ == '__main__':
语句来防止多进程的递归调用。这将确保只有在脚本作为主模块执行时,训练代码才会运行。例如:
if __name__ == '__main__':
train(device, model, train_data_loader, test_data_loader, optimizer,
checkpoint_dir=checkpoint_dir,
checkpoint_interval=hparams.syncnet_checkpoint_interval,
nepochs=27)
解决方法二、
修改调用torch.utils.data.DataLoader()函数时的 num_workers 参数。 让参数设置为零。
这将使 DataLoader
在主进程中运行,而不是多个子进程中。但请注意,这可能会降低数据加载速度,因为不再使用多进程并行加载数据。