OverflowError: (34, 'Numerical result out of range') in PyTorch
OverflowError: (34, 'Numerical result out of range') in PyTorch
当我 运行 我的代码在不同的 GPU(Tesla K-20,已安装 cuda 7.5,6GB 内存)时,我收到以下错误(请参阅堆栈跟踪)。如果我在 GeForce 1080 或 Titan X GPU 中 运行,代码工作正常。
堆栈跟踪:
File "code/source/main.py", line 68, in <module>
train.train_epochs(train_batches, dev_batches, args.epochs)
File "/gpfs/home/g/e/geniiexe/BigRed2/code/source/train.py", line 34, in train_epochs
losses = self.train(train_batches, dev_batches, (epoch + 1))
File "/gpfs/home/g/e/geniiexe/BigRed2/code/source/train.py", line 76, in train
self.optimizer.step()
File "/gpfs/home/g/e/geniiexe/BigRed2/anaconda3/lib/python3.5/site-packages/torch/optim/adam.py", line 70, in step
bias_correction1 = 1 - beta1 ** state['step']
OverflowError: (34, 'Numerical result out of range')
那么,在 GeForce 或 Titan X GPU 中工作正常时,在不同的 GPU (Tesla K-20) 中出现此类错误的原因可能是什么?此外,错误是什么意思?是不是和内存溢出有关,我觉得不是。
discuss.pytorch.org
中建议的一种解决方法如下。
替换 adam.py
中的以下行:-
bias_correction1 = 1 - beta1 ** state['step']
bias_correction2 = 1 - beta2 ** state['step']
通过
bias_correction1 = 1 - beta1 ** min(state['step'], 1022)
bias_correction2 = 1 - beta2 ** min(state['step'], 1022)
万一有人像我一样来到这里,寻找相同的错误,但是 CPU 使用 scikit-learn 的 MLPClassifier,上面的修复恰好是一个足够好的提示来修复 sklearn 代码。
修复方法是:
在文件中.../site-packages/sklearn/neural_network/_stochastic_optimizers.py
改变这个:
self.learning_rate = (self.learning_rate_init *
np.sqrt(1 - self.beta_2 ** self.t) /
(1 - self.beta_1 ** self.t))
至:
orig_self_t = self.t
new_self_t = min(orig_self_t, 1022)
self.learning_rate = (self.learning_rate_init *
np.sqrt(1 - self.beta_2 ** new_self_t) /
(1 - self.beta_1 ** new_self_t))
当我 运行 我的代码在不同的 GPU(Tesla K-20,已安装 cuda 7.5,6GB 内存)时,我收到以下错误(请参阅堆栈跟踪)。如果我在 GeForce 1080 或 Titan X GPU 中 运行,代码工作正常。
堆栈跟踪:
File "code/source/main.py", line 68, in <module>
train.train_epochs(train_batches, dev_batches, args.epochs)
File "/gpfs/home/g/e/geniiexe/BigRed2/code/source/train.py", line 34, in train_epochs
losses = self.train(train_batches, dev_batches, (epoch + 1))
File "/gpfs/home/g/e/geniiexe/BigRed2/code/source/train.py", line 76, in train
self.optimizer.step()
File "/gpfs/home/g/e/geniiexe/BigRed2/anaconda3/lib/python3.5/site-packages/torch/optim/adam.py", line 70, in step
bias_correction1 = 1 - beta1 ** state['step']
OverflowError: (34, 'Numerical result out of range')
那么,在 GeForce 或 Titan X GPU 中工作正常时,在不同的 GPU (Tesla K-20) 中出现此类错误的原因可能是什么?此外,错误是什么意思?是不是和内存溢出有关,我觉得不是。
discuss.pytorch.org
中建议的一种解决方法如下。
替换 adam.py
中的以下行:-
bias_correction1 = 1 - beta1 ** state['step']
bias_correction2 = 1 - beta2 ** state['step']
通过
bias_correction1 = 1 - beta1 ** min(state['step'], 1022)
bias_correction2 = 1 - beta2 ** min(state['step'], 1022)
万一有人像我一样来到这里,寻找相同的错误,但是 CPU 使用 scikit-learn 的 MLPClassifier,上面的修复恰好是一个足够好的提示来修复 sklearn 代码。
修复方法是: 在文件中.../site-packages/sklearn/neural_network/_stochastic_optimizers.py
改变这个:
self.learning_rate = (self.learning_rate_init *
np.sqrt(1 - self.beta_2 ** self.t) /
(1 - self.beta_1 ** self.t))
至:
orig_self_t = self.t
new_self_t = min(orig_self_t, 1022)
self.learning_rate = (self.learning_rate_init *
np.sqrt(1 - self.beta_2 ** new_self_t) /
(1 - self.beta_1 ** new_self_t))