Google Colaboratory: información engañosa sobre su GPU (solo un 5% de RAM disponible para algunos usuarios)

111

actualización: esta pregunta está relacionada con la "Configuración del portátil: Acelerador de hardware: GPU" de Google Colab. Esta pregunta se escribió antes de que se agregara la opción "TPU".

Al leer varios anuncios emocionados sobre Google Colaboratory que proporciona la GPU Tesla K80 gratuita, traté de ejecutar la lección fast.ai para que nunca se completara, agotando rápidamente la memoria. Empecé a investigar por qué.

La conclusión es que el "Tesla K80 gratuito" no es "gratuito" para todos; para algunos, sólo una pequeña parte es "gratuito".

Me conecto a Google Colab desde la costa oeste de Canadá y obtengo solo 0.5GB de lo que se supone que es una GPU RAM de 24GB. Otros usuarios obtienen acceso a 11 GB de RAM GPU.

Claramente, la RAM GPU de 0.5GB es insuficiente para la mayoría de los trabajos de ML / DL.

Si no está seguro de lo que obtiene, aquí hay una pequeña función de depuración que reuní (solo funciona con la configuración de GPU del portátil):

# 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()

Ejecutarlo en un cuaderno jupyter antes de ejecutar cualquier otro código me da:

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

Los usuarios afortunados que tengan acceso a la tarjeta completa verán:

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

¿Ves algún defecto en mi cálculo de la disponibilidad de RAM de la GPU, tomada de GPUtil?

¿Puede confirmar que obtiene resultados similares si ejecuta este código en el portátil Google Colab?

Si mis cálculos son correctos, ¿hay alguna forma de obtener más RAM de la GPU en la caja gratuita?

actualización: No estoy seguro de por qué algunos de nosotros obtenemos una vigésima parte de lo que obtienen otros usuarios. por ejemplo, la persona que me ayudó a depurar esto es de la India y ¡lo entiende todo!

nota : no envíe más sugerencias sobre cómo eliminar los portátiles paralelos / fugitivos que podrían estar consumiendo partes de la GPU. No importa cómo lo corte, si está en el mismo barco que yo y ejecutara el código de depuración, vería que aún obtiene un total del 5% de la RAM de la GPU (aún a partir de esta actualización).

Stason
fuente
¿Alguna solución a esto? ¿Por qué obtengo resultados diferentes al hacer! cat / proc / meminfo
MiloMinderbinder
Sí, el mismo problema, solo alrededor de 500 mb de RAM de GPU ... descripción engañosa :(
Naveen
2
Pruebe las herramientas de ciencia de datos de código abierto de IBM (cognitivlass.ai), ya que también tienen una GPU gratuita con portátiles jupyter.
AQ
He hecho retroceder esta pregunta a un estado en el que en realidad hay una pregunta en ella. Si ha investigado más y ha encontrado una respuesta, el lugar apropiado para eso es en el cuadro de respuestas. Es incorrecto actualizar la pregunta con una solución.
Chris Hayes
@ChrisHayes, entiendo su intención, pero esto no es correcto, ya que su reversión eliminó un montón de detalles relevantes que ahora se han ido. Si desea sugerir una redacción mejor que se ajuste mejor a las reglas de esta comunidad, hágalo, pero de lo contrario revierta la reversión. Gracias. ps ya publiqué la respuesta .
stason

Respuestas:

42

Entonces, para evitar otra docena de respuestas que sugieran inválido en el contexto de esta sugerencia de hilo para! Kill -9 -1, cerremos este hilo:

La respuesta es simple:

Al momento de escribir estas líneas, Google simplemente da solo el 5% de la GPU a algunos de nosotros, mientras que el 100% a los demás. Período.

Actualización de diciembre de 2019: el problema aún existe; los votos a favor de esta pregunta continúan.

Actualización de marzo de 2019: un año después, un empleado de Google @AmiF comentó sobre el estado de las cosas, afirmando que el problema no existe, y cualquiera que parezca tener este problema debe simplemente restablecer su tiempo de ejecución para recuperar la memoria. Sin embargo, los votos a favor continúan, lo que para mí esto me dice que el problema aún existe, a pesar de la sugerencia de @ AmiF de lo contrario.

Actualización de diciembre de 2018: tengo la teoría de que Google puede tener una lista negra de ciertas cuentas, o quizás huellas digitales del navegador, cuando sus robots detectan un comportamiento no estándar. Podría ser una coincidencia total, pero durante bastante tiempo tuve un problema con Google Re-captcha en cualquier sitio web que lo requiriera, donde tenía que pasar por docenas de acertijos antes de que me permitieran pasar, a menudo me toma más de 10 minutos para lograrlo. Esto duró muchos meses. De repente, a partir de este mes no tengo ningún rompecabezas y cualquier re-captcha de Google se resuelve con un solo clic del mouse, como solía ser hace casi un año.

¿Y por qué estoy contando esta historia? Bueno, porque al mismo tiempo me dieron el 100% de la RAM de la GPU en Colab . Es por eso que sospecho que si estás en una lista negra teórica de Google, entonces no se confía en ti para recibir muchos recursos de forma gratuita. Me pregunto si alguno de ustedes encuentra la misma correlación entre el acceso limitado a la GPU y la pesadilla Re-captcha. Como dije, también podría ser una coincidencia total.

Stason
fuente
4
Su declaración de "Al momento de escribir estas líneas, Google simplemente da solo el 5% de la GPU a algunos de nosotros, mientras que el 100% a los demás. Punto". es incorrecta: Colab nunca ha funcionado de esta manera. Todos los casos diagnosticados de usuarios que ven menos del complemento completo de RAM de la GPU disponible para ellos se han reducido a otro proceso (iniciado por el mismo usuario, posiblemente en otro portátil) utilizando el resto de la RAM de la GPU.
Ami F
11
Futuros lectores: si cree que está viendo este o síntomas similares de falta de disponibilidad de RAM de GPU, "Restablecer todos los tiempos de ejecución" en el menú de tiempo de ejecución le proporcionará una máquina virtual nueva que garantiza que ningún proceso obsoleto todavía se aferre a la RAM de la GPU. Si aún ve este síntoma inmediatamente después de usar esa opción de menú, presente un error en github.com/googlecolab/colabtools/issues
Ami F
Su realidad es claramente diferente de la realidad de muchos otros que continúan votando a favor de este puesto un año después de su creación. Es muy probable que algunos usuarios se encuentren con lo que describió, pero este no es el caso de todos. Así que no estoy seguro de cómo su declaración ayuda aquí. Además, cuando alguien hizo esta pregunta exacta en el repositorio que recomendó, obtuvo una respuesta BS y su ticket se cerró: github.com/googlecolab/colabtools/issues/52
stason
2
En caso de que no esté claro: no estoy describiendo lo que creo que la implementación se basa en la observación del comportamiento del sistema como usuario. Estoy describiendo lo que sé directamente que es la implementación. Publiqué con la esperanza de que los usuarios que vean una disponibilidad inferior a la completa lo informen como un problema (ya sea un error del usuario o un error del sistema) en lugar de leer las declaraciones incorrectas anteriores y asumir que las cosas están funcionando como se esperaba.
Ami F
1
No, las GPU nunca se han compartido, y no hay mentiras en el ejemplo que vinculó (simplemente una conjetura y una explicación de la razón más común del síntoma informado).
Ami F
22

Anoche ejecuté tu fragmento y obtuve exactamente lo que obtuviste:

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

pero hoy:

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

Creo que la razón más probable es que las GPU se comparten entre VM, por lo que cada vez que reinicia el tiempo de ejecución, tiene la oportunidad de cambiar la GPU, y también existe la probabilidad de que cambie a una que esté siendo utilizada por otros usuarios.

ACTUALIZADO: Resulta que puedo usar la GPU normalmente incluso cuando la RAM libre de la GPU es de 504 MB, lo que pensé que era la causa de ResourceExhaustedError que obtuve anoche.

Nguyễn Tài Long
fuente
1
Creo que me reconecté probablemente 50 veces durante el período de unos pocos días y siempre obtenía el mismo 95% de uso para empezar. Solo una vez vi 0%. En todos esos intentos, estaba obteniendo cuda de error de memoria una vez que se acercaba al 100%.
stason
¿Qué quieres decir con tu actualización? ¿Todavía puedes ejecutar cosas con 500Mb? Tengo el mismo problema, estoy recibiendoRuntimeError: cuda runtime error (2) : out of memory at /pytorch/torch/lib/THC/generated/../THCTensorMathCompare.cuh:84
ivan_bilan
6

Si ejecuta una celda que solo tiene
! Kill -9 -1
, eso hará que todo el estado de su tiempo de ejecución (incluida la memoria, el sistema de archivos y la GPU) se borre y se reinicie. Espere 30-60 segundos y presione el botón CONECTAR en la parte superior derecha para volver a conectarse.

Ajaychhimpa1
fuente
2
gracias, pero tu sugerencia no cambia nada. Todavía obtengo el 5% de la RAM de la GPU.
Stason
Esto no ayuda. Después de matar y volver a conectar, la memoria de la GPU todavía está en 500Mb de ~ 12GB.
ivan_bilan
4

Descripción engañosa por parte de Google. Yo también me emocioné demasiado, supongo. Configuré todo, cargué los datos y ahora no puedo hacer nada con ellos debido a que solo tengo 500Mb de memoria asignada a mi computadora portátil.

ivan_bilan
fuente
3

simplemente dele una tarea pesada a google colab, nos pedirá que cambiemos a 25 gb de ram.

ingrese la descripción de la imagen aquí

ejemplo, ejecute este código dos veces:

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)

luego haga clic en obtener más ram :) ingrese la descripción de la imagen aquí ingrese la descripción de la imagen aquí

ingrese la descripción de la imagen aquí

Jainil Patel
fuente
Puedo confirmar esto. Tenía un conjunto de datos de 15 gigas de imágenes en su mayoría HD (mi disco tiene 30 gigas en lugar de 15 gigas) y ejecuté mi código para cambiar el tamaño del conjunto de datos de imagen a 224,224,3 y me cambiaron a un tiempo de ejecución de RAM alto. Luego, cuando comencé a entrenar, el uso de RAM subió a 31,88 gigas.
Anshuman Kumar
Pero me gustaría agregar que una vez que terminé ese trabajo, no he podido acceder a otra GPU / TPU durante las últimas 24 horas. Es posible que estuviera en la lista negra.
Anshuman Kumar
@AnshumanKumar, dé la carga alta al comenzar, de lo contrario, al cambiar la configuración, perderá el trabajo realizado anteriormente que en ram. No utilicé una configuración alta durante 24 horas, así que no sé nada sobre las listas negras.
Jainil Patel
Sí, eso pasó conmigo. Sin embargo, el trabajo se hizo.
Anshuman Kumar
2

Encuentre el pid de Python3 y elimine el pid. Por favor vea la imagen de abajoingrese la descripción de la imagen aquí

Nota: elimine solo python3 (pid = 130), no jupyter python (122).

Manivannan Murugavel
fuente
¿Esto ayudará con el problema de la memoria? ¿No estás matando a todas las carreras de otras personas entonces?
ivan_bilan
esto no ayuda, tengo el mismo problema:GPU RAM Free: 564MB
ivan_bilan
2

Reinicie el kernel de Jupyter IPython:

!pkill -9 -f ipykernel_launcher
mkczyk
fuente
1
cerrado, pero no puro:GPU RAM Free: 564MB
ivan_bilan
como método más simple para reiniciar el kernel, puede hacer clic en Tiempo de ejecución | Reinicie el tiempo de ejecución ... o el acceso directoCMD/CTRL+M
Agile Bean
2

¡No estoy seguro de si esta lista negra es cierta! Es bastante posible que los núcleos se compartan entre los usuarios. También ejecuté la prueba y mis resultados son los siguientes:

Gen RAM libre: 12,9 GB | Tamaño de proceso: 142,8 MB RAM GPU Libre: 11441 MB | Usado: 0 MB | Util 0% | Total 11441 MB

Parece que también estoy obteniendo el núcleo completo. Sin embargo, lo ejecuté varias veces y obtuve el mismo resultado. Tal vez repita este control varias veces durante el día para ver si hay algún cambio.

Kregnach
fuente
1

Creo que si tenemos varios cuadernos abiertos. El simple hecho de cerrarlo no detiene el proceso. No he descubierto cómo detenerlo. Pero usé top para encontrar el PID del python3 que se estaba ejecutando durante más tiempo y usaba la mayor parte de la memoria y lo maté. Todo volvió a la normalidad ahora.

Ritwik G
fuente