Pytorch模型训练出现fd_event_list = self._poll.poll(timeout)问题

本文探讨了在PyTorch模型训练中遇到的卡死问题,分析了可能的原因,涉及数据集大小、Dataloader timeout和算法逻辑错误。解决建议包括检查数据获取逻辑,适当调整worker数量,并强调了正确设计__getitem__方法的重要性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、问题描述

        在使用Pytorch训练模型的时候,程序出现卡死、没反应的现象。当卡到无法令人接受,然后强制终止运行程序的时候,得到以下的终端输出信息:

  xxxxxxxxx
  File "/home/csx/.conda/envs/py4torch17/lib/python3.6/site-packages/torch/utils/data/dataloader.py", line 435, in __next__
    data = self._next_data()
  File "/home/csx/.conda/envs/py4torch17/lib/python3.6/site-packages/torch/utils/data/dataloader.py", line 1068, in _next_data
    idx, data = self._get_data()
  File "/home/csx/.conda/envs/py4torch17/lib/python3.6/site-packages/torch/utils/data/dataloader.py", line 1034, in _get_data
    success, data = self._try_get_data()
  File "/home/csx/.conda/envs/py4torch17/lib/python3.6/site-packages/torch/utils/data/dataloader.py", line 872, in _try_get_data
    data = self._data_queue.get(timeout=timeout)
  File "/home/csx/.conda/envs/py4torch17/lib/python3.6/multiprocessing/queues.py", line 104, in get
    if not self._poll(timeout):
  File "/home/csx/.conda/envs/py4torch17/lib/python3.6/multiprocessing/connection.py", line 257, in poll
    return self._poll(timeout)
  File "/home/csx/.conda/envs/py4torch17/lib/python3.6/multiprocessing/connection.py", line 414, in _poll
    r = wait([self], timeout)
  File "/home/csx/.conda/envs/py4torch17/lib/python3.6/multiprocessing/connection.py", line 911, in wait
    ready = selector.select(timeout)
  File "/home/csx/.conda/envs/py4torch17/lib/python3.6/selectors.py", line 376, in select
    fd_event_list = self._poll.poll(timeout)
KeyboardInterrupt

        我称之为"fd_event_list = self._poll.poll(timeout)"问题。

二、原因分析

        如果模型没有问题(在一个数据集上能够正常训练,但切换到另一个数据集后出现了这个问题),这很有可能是因为数据集的规模引起的Dataloader加载数据timeout。当然,如果不考虑数据集规模,还有可能就是模型训练的机器性能不够,比如运行内存、显卡内存等,若不够大都有可能出现这个问题,但这个可能性比较小。

        作以上的分析,这是因为我通过降低训练数据集的方法,使得程序恢复正常运行,而不至于卡死,一直不动。

        后续的更新:表面上的确是数据集的问题,然而后面发现是自己的算法设计上出了逻辑错误(这个才是真正问题),才导致了timeout。问题出在Dataloader中__getitem__(self, idx) 这个方法中,我设置了一个循环,由于一直满足不了条件,导致陷入了死循环,一直获取不了数据,最终timeout。

三、建议方案

        ①网上有些大神认为是因为cpu worker nums设置得太高导致,可以适当地降低worker的数量,也许能够解决该问题。但我在我所使用的模型和数据集中作了相应的尝试,不行。

        ②尝试降低模型训练的数据量。如果这个方法有效,那么说明数据集确实有问题,只不过,这个是表面上的问题,真正的问题其实是在你的算法,尤其是__getitem__(self, idx)这个方法。如果这个方法中有循环,要特别地思考思考,这个循环有什么样的问题。

四、其他

        若你遇到了该问题,请在下方留言,如果我所作出的建议有误,也可进行批评改正。欢迎加入讨论。

模块4Epoch 1/10 训练: 0%| | 0/1863 [00:05<?, ?it/s] --------------------------------------------------------------------------- Empty Traceback (most recent call last) File ~\.conda\envs\Anaconda\Lib\site-packages\torch\utils\data\dataloader.py:1243, in _MultiProcessingDataLoaderIter._try_get_data(self, timeout) 1242 try: -> 1243 data = self._data_queue.get(timeout=timeout) 1244 return (True, data) File ~\.conda\envs\Anaconda\Lib\multiprocessing\queues.py:114, in Queue.get(self, block, timeout) 113 if not self._poll(timeout): --> 114 raise Empty 115 elif not self._poll(): Empty: The above exception was the direct cause of the following exception: RuntimeError Traceback (most recent call last) Cell In[10], line 79 76 print(f"\nEpoch {epoch+1}/{num_epochs}") 78 # 训练阶段 ---> 79 train_loss, train_acc = train_model(model, train_loader, criterion, optimizer, device) 80 train_losses.append(train_loss) 81 train_accs.append(train_acc) Cell In[10], line 19, in train_model(model, train_loader, criterion, optimizer, device) 16 correct = 0 17 total = 0 ---> 19 for inputs, labels in tqdm(train_loader, desc="训练"): 20 inputs, labels = inputs.to(device), labels.to(device) 22 optimizer.zero_grad() File ~\.conda\envs\Anaconda\Lib\site-packages\tqdm\std.py:1181, in tqdm.__iter__(self) 1178 time = self._time 1180 try: -> 1181 for obj in iterable: 1182 yield obj 1183 # Update and possibly print the progressbar. 1184 # Note: does not call self.update(1) for speed optimisation. File ~\.conda\envs\Anaconda\Lib\site-packages\torch\utils\data\dataloader.py:701, in _BaseDataLoaderIter.__next__(self) 698 if self._sampler_iter is None: 699 # TODO(https://github.com/pytorch/pytorch/issues/76750) 700 self._reset() # type: ignore[call-arg] --> 701 data = self._next_data() 702 self._num_yielded += 1 703 if ( 704 self._dataset_kind == _DatasetKind.Iterable 705 and self._IterableDataset_len_called is not None 706 and self._num_yielded > self._IterableDataset_len_called 707 ): File ~\.conda\envs\Anaconda\Lib\site-packages\torch\utils\data\dataloader.py:1448, in _MultiProcessingDataLoaderIter._next_data(self) 1445 return self._process_data(data) 1447 assert not self._shutdown and self._tasks_outstanding > 0 -> 1448 idx, data = self._get_data() 1449 self._tasks_outstanding -= 1 1450 if self._dataset_kind == _DatasetKind.Iterable: 1451 # Check for _IterableDatasetStopIteration File ~\.conda\envs\Anaconda\Lib\site-packages\torch\utils\data\dataloader.py:1412, in _MultiProcessingDataLoaderIter._get_data(self) 1408 # In this case, `self._data_queue` is a `queue.Queue`,. But we don't 1409 # need to call `.task_done()` because we don't use `.join()`. 1410 else: 1411 while True: -> 1412 success, data = self._try_get_data() 1413 if success: 1414 return data File ~\.conda\envs\Anaconda\Lib\site-packages\torch\utils\data\dataloader.py:1256, in _MultiProcessingDataLoaderIter._try_get_data(self, timeout) 1254 if len(failed_workers) > 0: 1255 pids_str = ", ".join(str(w.pid) for w in failed_workers) -> 1256 raise RuntimeError( 1257 f"DataLoader worker (pid(s) {pids_str}) exited unexpectedly" 1258 ) from e 1259 if isinstance(e, queue.Empty): 1260 return (False, None) RuntimeError: DataLoader worker (pid(s) 28620, 21908, 29584, 29632) exited unexpectedly
06-20
评论 8
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

飞机火车巴雷特

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值