numba.cuda.close()之后如何使用GPU?

问题描述 投票:0回答:1

我在

tensorflow
上使用
jupyter notebook
。假设我想刷新 GPU 内存中的所有内容而不重新启动内核(这意味着不触及 RAM 内容)。请不要深入探讨我的要求背后的原因;最后我应该可以随意清除GPU内存。

关于这个简单的问题有很多讨论,但没有明确的答案。不过我看到很多人推荐

numba.cuda.close()
。但这给我带来了问题,最终杀死了内核并违背了我的目的。 下面是基本代码。

#---- cell 1 ----
import tensorflow as tf
from numba import cuda 

#---- cell2 ----
a = tf.constant([[1.0, 2.0, 3.0], [4.0, 5.0, 6.0]])
b = tf.constant([[1.0, 2.0], [3.0, 4.0], [5.0, 6.0]])
c = tf.matmul(a, b)

#---- cell3 ----
#device = cuda.get_current_device(); device.reset()
cuda.select_device(0); cuda.close()

在 cell3 之后,内存被释放,但是当我尝试再次执行 cell2 时,内核死亡。事实上,在新内核中,一旦我执行 cell2 和 cell3,那么无论我做什么,我都无法在不杀死内核的情况下再次执行 cell2。我很困惑。如果我使用

device = cuda.get_current_device(); device.reset()
代替
cuda.close()
,也会发生同样的情况。

所以我的问题是。

  1. 执行
    cuda.select_device(0); cuda.close()
    后我可以再次使用GPU吗?如果是这样,怎么办?请注意,这个问题之前曾被问过here,但没有明确的答案。
  2. 如果
    cuda.close()
    的这个问题无法避免,是否有更好的解决方案可以释放所有GPU内存而不触及
    ipython
    笔记本中RAM上的任何内容?
    tf.keras.backend.clear_session()
    一开始就没有释放内存。

提前致谢。

tensorflow cuda gpu tensorflow2.0 numba
1个回答
0
投票

执行

cuda.select_device(0); cuda.close()
后我可以再次使用GPU吗?

不是你想象的那种感觉。该 API 将绑定并销毁当前的 GPU 上下文。虽然这将释放上下文中保存的资源(即所有内存),但它也会破坏由 Tensorflow 及其依赖的 CUDA 库初始化的所有状态,可能导致它们无法运行。你不应该指望在那之后会有任何效果。

…有没有更好的解决方案可以释放所有 GPU 内存而不触及 ipython 笔记本中 RAM 上的任何内容?

这个问题表明了对问题的根本误解。问题的全部根源在于Python解释器内存中存在Python对象(您称之为“ipython笔记本中的RAM”),它们在GPU上保存了大量资源。在它们被销毁之前,它们的 GPU 资源占用仍然存在(并且假设它们经过正确设计并在删除时释放它们所持有的所有 GPU 资源)。根据定义,如果不“触摸 RAM 上的任何内容”,你就无法实现你想要的目标。

我建议您彻底熟悉 Python 垃圾收集器和最佳实践,以确保引用计数不会被您编写的代码击败。这是确保 Python 代码中良好资源管理的秘诀,尤其是在使用在标准 Python 内存管理器之外分配资源的框架时。

如果你不能或不愿意这样做,重新启动 Python 解释器将是释放 GPU 资源的唯一方法。

© www.soinside.com 2019 - 2024. All rights reserved.