BrokenPipeError: [Errno 32] Broken pipe解决办法

我在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 和多进程有关。

可以尝试以下方法来解决这个问题:

  1. 将 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 可能会降低数据加载的速度。

  1. 如果你在 Jupyter Notebook 中运行代码,尝试将代码移到独立的 Python 脚本中,并在命令行中运行它。有时,Jupyter Notebook 与多进程不兼容。

  2. 确保所有函数和对象都是可序列化的。在多进程环境中,对象需要在进程之间序列化和传输。如果遇到不可序列化的对象,可能会导致通信错误。检查 DataLoader 和模型中使用的所有自定义函数和对象,确保它们可以使用 pickle 库进行序列化。

  3. 如果你使用的是 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 在主进程中运行,而不是多个子进程中。但请注意,这可能会降低数据加载速度,因为不再使用多进程并行加载数据。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值