2015-04-15 3 views
9

Ich versuche, ein wirklich großes Dataset (~ 28 GB RAM in einem NDarray) den freigegebenen Variablen zuzuteilen, wobei borrow = True verwendet wird, um die Replikation des Speichers zu vermeiden. Um dies zu tun, verwende ich die folgende Funktion:Nicht genügend Speicher beim Erstellen einer gemeinsam genutzten Theano-Variable mit borrow = True

def load_dataset(path): 
    # Load dataset from memory 
    data_f = np.load(path+'train_f.npy') 
    data_t = np.load(path+'train_t.npy') 

    # Split into training and validation 
    return (
     (
      theano.shared(data_f[:-1000, :], borrow=True), 
      theano.shared(data_t[:-1000, :], borrow=True) 
     ), (
      theano.shared(data_f[-1000:, :], borrow=True), 
      theano.shared(data_t[-1000:, :], borrow=True) 
     ) 
    ) 

Um Datenkonvertierungen zu vermeiden, bevor die Arrays auf der Festplatte retten I definierte sie bereits im richtigen Format zu sein (danach füllt sie und sie in Platte mit np.save Dumping()):

data_f = np.ndarray((len(rows), 250*250*3), dtype=theano.config.floatX) 
data_t = np.ndarray((len(rows), 1), dtype=theano.config.floatX) 

Es scheint aber, dass Theanos Reifen die Speicher ohnehin zu replizieren, mir die folgenden Fehler Dumping:

Fehler 25594500000 Bytes Gerät Zuweisen Speicher (nicht genügend Speicher). Treiberbericht 3775729664 Bytes frei und 4294639616 Bytes insgesamt.

Theano ist konfiguriert, um auf der GPU (GTX 970) zu arbeiten.

Antwort

10

Anstatt theano.shared zu verwenden, kann theano.tensor._shared verwendet werden, um die Zuordnung der Daten zum CPU-Speicher zu erzwingen. Der feste Code endet wie folgt:

def load_dataset(path): 
    # Load dataset from memory 
    data_f = np.load(path+'train_f.npy') 
    data_t = np.load(path+'train_t.npy') 

    # Split into training and validation 
    return (
     (
      theano.tensor._shared(data_f[:-1000, :], borrow=True), 
      theano.tensor._shared(data_t[:-1000, :], borrow=True) 
     ), (
      theano.tensor._shared(data_f[-1000:, :], borrow=True), 
      theano.tensor._shared(data_t[-1000:, :], borrow=True) 
     ) 
    )