Google Colaboratory: informazioni fuorvianti sulla sua GPU (solo il 5% di RAM disponibile per alcuni utenti)


111

aggiornamento: questa domanda è correlata alle "Impostazioni notebook: acceleratore hardware: GPU" di Google Colab. Questa domanda è stata scritta prima dell'aggiunta dell'opzione "TPU".

Leggendo diversi annunci entusiasti su Google Colaboratory che fornisce GPU Tesla K80 gratuita, ho provato a eseguire una lezione veloce su di esso affinché non si completasse mai, esaurendo rapidamente la memoria. Ho iniziato a indagare sul perché.

La conclusione è che "Tesla K80 gratuita" non è "gratuita" per tutti - per alcuni solo una piccola parte è "gratuita".

Mi collego a Google Colab dalla costa occidentale del Canada e ottengo solo 0,5 GB di quella che dovrebbe essere una GPU RAM da 24 GB. Altri utenti hanno accesso a 11 GB di RAM GPU.

Chiaramente 0,5 GB di RAM GPU non sono sufficienti per la maggior parte del lavoro ML / DL.

Se non sei sicuro di cosa ottieni, ecco una piccola funzione di debug che ho raccolto insieme (funziona solo con l'impostazione GPU del notebook):

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

Eseguirlo in un notebook jupyter prima di eseguire qualsiasi altro codice mi dà:

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

I fortunati utenti che avranno accesso alla scheda completa vedranno:

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

Vedi qualche difetto nel mio calcolo della disponibilità di RAM della GPU, presa in prestito da GPUtil?

Puoi confermare di ottenere risultati simili se esegui questo codice su Google Colab Notebook?

Se i miei calcoli sono corretti, c'è un modo per ottenere più di quella GPU RAM sulla scatola gratuita?

aggiornamento: non sono sicuro del motivo per cui alcuni di noi ottengono 1/20 di ciò che ricevono gli altri utenti. ad esempio, la persona che mi ha aiutato a eseguire il debug viene dall'India e ottiene tutto!

nota : si prega di non inviare altri suggerimenti su come eliminare i notebook potenzialmente bloccati / in fuga / paralleli che potrebbero consumare parti della GPU. Non importa come lo tagli, se ti trovi nella stessa barca di me e dovessi eseguire il codice di debug, vedresti che hai ancora un totale del 5% di RAM della GPU (ancora a partire da questo aggiornamento).


Qualche soluzione a questo? perché ottengo risultati diversi quando faccio! cat / proc / meminfo
MiloMinderbinder

Sì, lo stesso problema, solo circa 500 MB di RAM della GPU ... descrizione fuorviante :(
Naveen

2
Prova gli strumenti di data science open source IBM (cognitiveclass.ai) poiché hanno anche una GPU gratuita con i notebook jupyter.
AQ

Ho riportato questa domanda a uno stato in cui in realtà c'è una domanda . Se hai svolto ulteriori ricerche e hai trovato una risposta, il posto appropriato è nella casella delle risposte. Non è corretto aggiornare la domanda con una soluzione.
Chris Hayes

@ChrisHayes, capisco la tua intenzione, ma non è corretto, dal momento che il tuo rollback ha cancellato un sacco di dettagli rilevanti che ora sono spariti. Se desideri suggerire una formulazione migliore che si adatti meglio alle regole di questa comunità, fallo, ma in caso contrario ripristina il rollback. Grazie. ps ho già postato la risposta .
stason

Risposte:


42

Quindi, per evitare che un'altra dozzina di risposte suggeriscano non valido nel contesto di questo suggerimento di thread a! Kill -9-1, chiudiamo questo thread:

La risposta è semplice:

Al momento della stesura di questo articolo Google fornisce semplicemente solo il 5% della GPU ad alcuni di noi, mentre il 100% agli altri. Periodo.

Aggiornamento dic-2019: il problema persiste: i voti positivi di questa domanda continuano ancora.

Aggiornamento mar-2019: un anno dopo un dipendente di Google @AmiF ha commentato lo stato delle cose, affermando che il problema non esiste e chiunque sembri avere questo problema deve semplicemente reimpostare il proprio runtime per recuperare la memoria. Tuttavia, gli upvote continuano, il che mi dice che il problema esiste ancora, nonostante il suggerimento di @ AmiF al contrario.

Aggiornamento dicembre 2018: ho una teoria secondo cui Google potrebbe avere una lista nera di determinati account, o forse le impronte digitali del browser, quando i suoi robot rilevano un comportamento non standard. Potrebbe essere una coincidenza totale, ma per un po 'di tempo ho avuto un problema con Google Re-captcha su qualsiasi sito web che lo richiedesse, dove avrei dovuto passare attraverso dozzine di enigmi prima di essere autorizzato, spesso mi ci vogliono più di 10 minuti per realizzarlo. Questo è durato molti mesi. All'improvviso a partire da questo mese non ricevo alcun puzzle e qualsiasi re-captcha di Google viene risolto con un solo clic del mouse, come era quasi un anno fa.

E perché sto raccontando questa storia? Bene, perché allo stesso tempo mi è stato dato il 100% della RAM della GPU su Colab . Ecco perché il mio sospetto è che se sei su una teorica lista nera di Google, non ti viene affidato un sacco di risorse gratuitamente. Mi chiedo se qualcuno di voi trovi la stessa correlazione tra l'accesso limitato alla GPU e l'incubo Re-captcha. Come ho detto, potrebbe anche essere totalmente una coincidenza.


4
La tua dichiarazione di "Al momento della stesura di questo articolo Google dà semplicemente solo il 5% di GPU ad alcuni di noi, mentre il 100% agli altri. Punto." non è corretto - Colab non ha mai funzionato in questo modo. Tutti i casi diagnosticati di utenti che vedono meno della dotazione completa di RAM della GPU a loro disposizione si sono ridotti a un altro processo (avviato dallo stesso utente, possibilmente in un altro notebook) utilizzando il resto della RAM della GPU.
Ami F

11
Lettori futuri: se pensi di vedere questo o altri sintomi simili di indisponibilità della RAM della GPU, "Ripristina tutti i runtime" nel menu Runtime ti fornirà una nuova VM che garantisce che nessun processo stantio rimanga sulla RAM della GPU. Se vedi ancora questo sintomo subito dopo aver utilizzato l'opzione di menu, segnala un bug su github.com/googlecolab/colabtools/issues
Ami F

La tua realtà è chiaramente diversa dalla realtà di molti altri che continuano a votare questo post un anno dopo che è stato creato. È molto probabile che alcuni utenti incontrino effettivamente ciò che hai descritto, ma non è così per tutti. Quindi non sono sicuro di come la tua dichiarazione aiuti qui. Inoltre, quando qualcuno ha posto questa domanda esatta nel repo che hai consigliato, ha ricevuto una risposta BS e il suo ticket è stato chiuso: github.com/googlecolab/colabtools/issues/52
stason

2
Nel caso non fosse chiaro: non sto descrivendo ciò che credo che l'implementazione sia basata sull'osservazione del comportamento del sistema come utente. Sto descrivendo ciò che so direttamente come l'implementazione. Ho postato sperando che gli utenti che vedono una disponibilità inferiore a quella completa lo segnalino come un problema (errore dell'utente o bug di sistema) invece di leggere le dichiarazioni errate sopra e presumere che le cose funzionino come previsto.
Ami F

1
No, le GPU non sono mai state condivise e non ci sono bugie nell'esempio che hai collegato (semplicemente un'ipotesi e una spiegazione del motivo più comune per il sintomo segnalato).
Ami F

22

La scorsa notte ho eseguito il tuo snippet e ho ottenuto esattamente quello che hai ottenuto:

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

ma oggi:

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

Penso che il motivo più probabile sia che le GPU sono condivise tra le VM, quindi ogni volta che riavvii il runtime hai la possibilità di cambiare la GPU, ed è anche probabile che passi a una che viene utilizzata da altri utenti.

AGGIORNATO: Si scopre che posso usare la GPU normalmente anche quando la RAM della GPU libera è di 504 MB, che ho pensato come la causa di ResourceExhaustedError che ho ricevuto ieri sera.


1
Penso di essermi ricollegato probabilmente 50 volte nell'arco di pochi giorni e ho sempre ottenuto lo stesso utilizzo del 95% per iniziare. Solo una volta ho visto lo 0%. In tutti quei tentativi stavo ottenendo cuda dall'errore di memoria una volta che si avvicinava al 100%.
stason

Cosa intendi con il tuo aggiornamento? Riesci ancora a eseguire cose con 500 Mb? Ho lo stesso problema, ricevoRuntimeError: cuda runtime error (2) : out of memory at /pytorch/torch/lib/THC/generated/../THCTensorMathCompare.cuh:84
ivan_bilan

6

Se esegui una cella che contiene solo
! Kill -9 -1
, ciò causerà la cancellazione e il riavvio di tutto lo stato del tuo runtime (inclusi memoria, filesystem e GPU). Attendi 30-60 secondi e premi il pulsante CONNECT in alto a destra per riconnetterti.


2
grazie, ma il tuo suggerimento non cambia nulla. Ricevo ancora il 5% di RAM della GPU.
stason

Questo non aiuta. Dopo l'uccisione e la riconnessione, la memoria della GPU è ancora a 500 Mb su ~ 12 GB.
ivan_bilan

4

Descrizione fuorviante da parte di Google. Anch'io ne ero troppo eccitato, immagino. Ho impostato tutto, caricato i dati e ora non sono in grado di farci nulla a causa di avere solo 500Mb di memoria allocata al mio Notebook.


2

Trova il pid Python3 e uccidi il pid. Si prega di vedere l'immagine sottostanteinserisci qui la descrizione dell'immagine

Nota: kill only python3 (pid = 130) not jupyter python (122).


questo aiuterà con il problema della memoria? non stai uccidendo le corse di tutte le altre persone allora?
ivan_bilan

questo non aiuta, ho lo stesso problema:GPU RAM Free: 564MB
ivan_bilan

2

Riavvia il kernel Jupyter IPython:

!pkill -9 -f ipykernel_launcher

1
chiuso, ma niente sigaro:GPU RAM Free: 564MB
ivan_bilan

come metodo più semplice per riavviare il kernel, puoi semplicemente fare clic su Runtime | Riavvia il runtime ... o la scorciatoiaCMD/CTRL+M
Agile Bean

2

Non sono sicuro che questa lista nera sia vera! È piuttosto possibile che i core siano condivisi tra gli utenti. Ho eseguito anche il test ei miei risultati sono i seguenti:

Gen RAM libera: 12,9 GB | Dimensione Proc: 142,8 MB GPU RAM libera: 11441 MB | Usato: 0MB | Util 0% | Totale 11441 MB

Sembra che sto ottenendo anche il nucleo completo. Tuttavia l'ho eseguito un paio di volte e ho ottenuto lo stesso risultato. Forse ripeterò questo controllo alcune volte durante il giorno per vedere se ci sono cambiamenti.


2

basta dare un compito pesante a google colab, ci chiederà di passare a 25 gb di ram.

inserisci qui la descrizione dell'immagine

esempio esegui questo codice due volte:

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)

quindi fare clic su ottieni più ram :) inserisci qui la descrizione dell'immagine inserisci qui la descrizione dell'immagine

inserisci qui la descrizione dell'immagine


Lo posso confermare. Avevo un set di dati da 15 GB per lo più di immagini HD (il mio disco ha 30 GB invece di 15 GB) e ho eseguito il mio codice per ridimensionare il set di dati dell'immagine a 224,224,3 e sono passato a un elevato runtime di RAM. Poi, quando ho iniziato ad allenarmi, l'utilizzo della RAM è salito a 31.88gigs.
Anshuman Kumar

Ma vorrei aggiungere che una volta terminato il lavoro, non sono stato in grado di accedere a un'altra GPU / TPU nelle ultime 24 ore. È possibile che io sia stato inserito nella lista nera.
Anshuman Kumar,

@AnshumanKumar, dai il carico elevato all'inizio solo altrimenti cambiando configurazione perderai il lavoro precedentemente fatto che in ram. Non ho usato la configurazione alta per 24 ore, quindi non conosco la lista nera.
Jainil Patel,

Sì, è successo con me. Tuttavia il lavoro è stato svolto.
Anshuman Kumar,

1

Credo che se abbiamo più taccuini aperti. La semplice chiusura non interrompe effettivamente il processo. Non ho capito come fermarlo. Ma ho usato top per trovare il PID del python3 che era in esecuzione più a lungo e utilizzava la maggior parte della memoria e l'ho ucciso. Adesso tutto torna alla normalità.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.