谷歌协作: 关于其 GPU 的误导性信息(只有5% 的内存可用于一些用户)

更新: 这个问题与 Google Colab 的“笔记本设置: 硬件加速器: GPU”有关。这个问题是在加入「 TPU 」选项前写的。

看到谷歌合作实验室提供免费的 Tesla K80图形处理器的多个令人兴奋的公告,我试图在上面运行 快点课程,因为它永远不会完成——很快就会耗尽内存。我开始调查原因。

底线是,“免费的特斯拉 K80”不是“免费的”所有-对于一些只有一小部分是“免费的”。

我连接到谷歌 Colab 从西海岸加拿大,我只得到0.5 GB 的什么应该是一个24 GB 的 GPU 内存。其他用户可以使用11GB 的 GPU RAM。

显然,0.5 GB 的 GPU RAM 对于大多数 ML/DL 工作来说是不够的。

如果你不确定你得到了什么,这里有一个我拼凑起来的小调试函数(只适用于笔记本的 GPU 设置) :

# memory footprint support libraries/code
!ln -sf /opt/bin/nvidia-smi /usr/bin/nvidia-smi
!pip install gputil
!pip install psutil
!pip install humanize
import psutil
import humanize
import os
import GPUtil as GPU
GPUs = GPU.getGPUs()
# XXX: only one GPU on Colab and isn’t guaranteed
gpu = GPUs[0]
def printm():
process = psutil.Process(os.getpid())
print("Gen RAM Free: " + humanize.naturalsize( psutil.virtual_memory().available ), " | Proc size: " + humanize.naturalsize( process.memory_info().rss))
print("GPU RAM Free: {0:.0f}MB | Used: {1:.0f}MB | Util {2:3.0f}% | Total {3:.0f}MB".format(gpu.memoryFree, gpu.memoryUsed, gpu.memoryUtil*100, gpu.memoryTotal))
printm()

在运行任何其他代码之前,在一个木星笔记本上执行它会给我:

Gen RAM Free: 11.6 GB  | Proc size: 666.0 MB
GPU RAM Free: 566MB | Used: 10873MB | Util  95% | Total 11439MB

获得完整信用卡的幸运用户将看到:

Gen RAM Free: 11.6 GB  | Proc size: 666.0 MB
GPU RAM Free: 11439MB | Used: 0MB | Util  0% | Total 11439MB

从 GPUtil 借来的 GPU RAM 可用性计算中,您是否发现了任何缺陷?

如果你在 Google Colab 笔记本上运行这段代码,你能确认你得到类似的结果吗?

如果我的计算是正确的,有没有办法获得更多的 GPU 内存的免费框?

更新: 我不知道为什么我们中的一些人得到了其他用户得到的二十分之一。例如,帮助我调试这个程序的人来自印度,他得到了所有的东西!

注意 : 请不要发送任何关于如何消除可能会消耗部分 GPU 的潜在卡住/失控/并行笔记本的建议。不管你怎么分配,如果你和我在同一条船上,并运行调试代码,你会看到你仍然得到总共5% 的 GPU 内存(截至目前为止仍然更新)。

110742 次浏览

昨晚我看了你的片段,得到了和你一样的结果:

Gen RAM Free: 11.6 GB  | Proc size: 666.0 MB
GPU RAM Free: 566MB | Used: 10873MB | Util  95% | Total 11439MB

但今天:

Gen RAM Free: 12.2 GB  I Proc size: 131.5 MB
GPU RAM Free: 11439MB | Used: 0MB | Util   0% | Total 11439MB

我认为最有可能的原因是 GPU 在虚拟机之间共享,所以每次重新启动运行时,你都有机会切换 GPU,也有可能切换到其他用户正在使用的 GPU。

更新: 事实证明,我可以正常使用 GPU,即使当 GPU 内存空闲是504 MB,我认为这是我昨晚得到的资源耗尽错误的原因。

我相信如果我们有多个笔记本打开。仅仅关闭它实际上并不能停止这个过程。我还没想好怎么阻止它。但是我使用 top 来查找运行时间最长的 python3的 PID,并且使用了大部分内存,然后我杀死了它。一切都恢复正常了。

如果执行的单元格只有
! 杀死 -9-1
这将导致清除所有运行时状态(包括内存、文件系统和 GPU)并重新启动。等待30-60秒,然后按右上角的 CONNECT 按钮重新连接。

找到 Python 3 pid 并关闭该 pidenter image description here

注意: 只杀死 python3(pid = 130)而不杀死 jupyterpython (122)。

重启 Jupiter IPython 内核:

!pkill -9 -f ipykernel_launcher

所以为了防止另外十几个答案建议在这个帖子的上下文中无效,要!Kill-9-1,让我们关闭这个线程:

答案很简单:

写这篇文章的时候,Google 只给了我们一些人5% 的 GPU,而给了其他人100% 。就这样。

2019年12月更新: 问题仍然存在-这个问题的赞成票仍然继续。

Mar-2019更新: 一年后,一位 Google 员工@AmiF 对事情的现状发表评论,称问题并不存在,任何似乎有这个问题的人只需要简单地重置运行时来恢复内存。然而,赞成票还在继续,对我来说,这表明问题仍然存在,尽管@AmiF 的建议与此相反。

2018年12月更新: 我有一个理论,谷歌可能有一个黑名单的某些帐户,或者浏览器指纹,当它的机器人检测到一个非标准的行为。这可能完全是个巧合,但是有很长一段时间,我在任何需要 Google Re-captcha 的网站上都遇到了问题,在那里我必须通过几十个谜题才能被允许通过,通常需要10多分钟才能完成。这种情况持续了好几个月。突然之间,在这个月,我没有得到任何谜题,任何谷歌重新验证码得到解决,只需要一个单一的鼠标点击,因为它曾经是大约一年前。

还有我为什么要讲这个故事?因为 与此同时,我得到了100% 的 GPU 内存在 Colab 上。这就是为什么我怀疑,如果你在一个理论上的谷歌黑名单上,那么你就不会被信任为免费提供大量资源。我想知道你们中是否有人发现了 GPU 访问受限和 Re-captcha 噩梦之间的相关性。就像我说的,这也可能完全是个巧合。

我不确定这个黑名单是真的!很有可能,这些核心在用户之间共享。我也进行了测试,结果如下:

Gen RAM Free: 12.9 GB  | Proc size: 142.8 MB
GPU RAM Free: 11441MB | Used: 0MB | Util   0% | Total 11441MB

似乎我也得到了充分的核心。然而,我运行了几次,我得到了相同的结果。也许我会在白天重复这个检查几次,看看是否有任何变化。

只要给谷歌 colab 一个繁重的任务,它就会要求我们改为25gb 的内存。

enter image description here

例子运行此代码两次:

import numpy as np
from keras.layers import Conv2D, MaxPooling2D, AveragePooling2D
from keras.layers import Dropout, Flatten, Dense
from keras.models import Sequential
from keras.layers.advanced_activations import LeakyReLU
from keras.datasets import cifar10
(train_features, train_labels), (test_features, test_labels) = cifar10.load_data()
model = Sequential()


model.add(Conv2D(filters=16, kernel_size=(2, 2), padding="same", activation="relu", input_shape=(train_features.shape[1:])))
model.add(MaxPooling2D(pool_size=(2, 2), padding='same'))


model.add(Conv2D(filters=32, kernel_size=(3, 3), padding="same", activation="relu"))
model.add(MaxPooling2D(pool_size=(2, 2), padding='same'))


model.add(Conv2D(filters=64, kernel_size=(4, 4), padding="same", activation="relu"))
model.add(MaxPooling2D(pool_size=(2, 2), padding='same'))


model.add(Flatten())


model.add(Dense(25600, activation="relu"))
model.add(Dense(25600, activation="relu"))
model.add(Dense(25600, activation="relu"))
model.add(Dense(25600, activation="relu"))
model.add(Dense(10, activation="softmax"))


model.compile(optimizer='adam', loss='sparse_categorical_crossentropy', metrics=['accuracy'])


model.fit(train_features, train_labels, validation_split=0.2, epochs=10, batch_size=128, verbose=1)

然后点击获取更多内存:) enter image description here enter image description here

enter image description here

GoogleColab 资源分配是动态的,基于用户过去的使用情况。假设一个用户最近使用了更多的资源,而一个新用户使用 Colab 的频率较低,那么他在资源分配方面将获得相对更多的优先权。

因此,为了最大限度地利用 Colab,关闭所有 Colab 标签页和所有其他活动会话,重置想要使用的会话的运行时。你肯定会得到更好的 GPU 分配。