我在Keras开发了一个模型,并训练了很多次。一旦我强行停止模型的训练,从那时起我收到以下错误:
Traceback (most recent call last):
File "inception_resnet.py", line 246, in <module>
callbacks=[checkpoint, saveEpochNumber]) ##
File "/home/eh0/E27890/anaconda3/lib/python3.5/site-packages/keras/legacy/interfaces.py", line 87, in wrapper
return func(*args, **kwargs)
File "/home/eh0/E27890/anaconda3/lib/python3.5/site-packages/keras/engine/training.py", line 2042, in fit_generator
class_weight=class_weight)
File "/home/eh0/E27890/anaconda3/lib/python3.5/site-packages/keras/engine/training.py", line 1762, in train_on_batch
outputs = self.train_function(ins)
File "/home/eh0/E27890/anaconda3/lib/python3.5/site-packages/keras/backend/tensorflow_backend.py", line 2270, in __call__
session = get_session()
File "/home/eh0/E27890/anaconda3/lib/python3.5/site-packages/keras/backend/tensorflow_backend.py", line 163, in get_session
_SESSION = tf.Session(config=config)
File "/home/eh0/E27890/anaconda3/lib/python3.5/site-packages/tensorflow/python/client/session.py", line 1486, in __init__
super(Session, self).__init__(target, graph, config=config)
File "/home/eh0/E27890/anaconda3/lib/python3.5/site-packages/tensorflow/python/client/session.py", line 621, in __init__
self._session = tf_session.TF_NewDeprecatedSession(opts, status)
File "/home/eh0/E27890/anaconda3/lib/python3.5/contextlib.py", line 66, in __exit__
next(self.gen)
File "/home/eh0/E27890/anaconda3/lib/python3.5/site-packages/tensorflow/python/framework/errors_impl.py", line 466, in raise_exception_on_not_ok_status
pywrap_tensorflow.TF_GetCode(status))
tensorflow.python.framework.errors_impl.InternalError: Failed to create session.
所以错误实际上就是这样
tensorflow.python.framework.errors_impl.InternalError:无法创建会话。
最有可能的是,GPU内存仍然被占用。我甚至无法创建一个简单的tensorflow会话。
我已经看到了答案here,但是当我在终端中执行以下命令时
export CUDA_VISIBLE_DEVICES=''
无需GPU加速即可开始模型训练。
此外,当我在服务器上训练我的模型并且我没有对服务器的root访问权限时,我无法重新启动服务器或清除具有root访问权限的GPU内存。现在的解决方案是什么?
我在this question的评论中找到了解决方案。
nvidia-smi -q
这给出了占用GPU内存的所有进程(及其PID)的列表。我用它逐个杀死了它们
kill -9 PID
现在一切都顺利了。
我使用的是Anaconda 4.5.12和python 3.5,NVIDIA Driver 390.116,也遇到了同样的问题。在我的情况下,这是由不兼容的cudatoolkit版本引起的
conda install tensorflow-gpu
安装cudatoolkit 9.3.0与cudnn 7.3.x.然而,经过回答here并参考我的其他虚拟环境,我使用pytorch与GPU没有任何问题,我推断cudatookit 9.0.0
将与我的驱动程序版本兼容。
conda install cudatoolkit==9.0.0
这从cudatoolkit 9.0.0
build安装了cudnn 7.3.0
和cuda 9.0_0
。在此之后,我能够与GPU创建tensorflow会话。
现在可以选择杀死工作
tf
会话(前提是已经解决了兼容性问题)tf.Session()
查找PID并将cuda可见设备设置为可用的GPU ID(此示例为nvidia-smi
)后终止先前的0
请求
import os
os.environ["CUDA_VISIBLE_DEVICES"]='0'
然后使用tf.Session
可以使用指定的GPU设备创建会话。tf.Session()
找到PID并将cuda visible device设置为undefined之后杀死先前的nvidia-smi
请求
import os
os.environ["CUDA_VISIBLE_DEVICES"]=''
然后使用tf.Session
可以创建CPU会话。在集群上工作时我遇到了类似的问题。当我将作业脚本提交给Slurm服务器时,它运行正常,但在Jupytyter笔记本上训练模型时,我会收到以下错误:
InternalError:无法创建会话
原因:这是因为我在同一GPU下运行多个jupyter笔记本(所有这些都使用tensorflow),因此slurm服务器将限制创建一个新的tensorflow会话。通过停止所有jupyter笔记本,然后一次只运行一个/两个来解决问题。
以下是jupyter笔记本的日志错误:
内部:调用cuDevicePrimaryCtxRetain失败:CUDA_ERROR_OUT_OF_MEMORY;报告的总内存:12786073600