2015-08-13 1 views
10

Je forme des filets neuraux avec theano et lasagnes sur une machine à 4 GPU. Mon .theanorc contient les lignes suivantes:Sélectionnez le GPU pendant l'exécution dans Theano

[global] 
device = gpu0 

Alors, quand en python j'exécute import theano, je reçois Using gpu device 0: GRID K520

Et si, après avoir importé Théano, j'ai choisi d'utiliser dire GPU1? Je voudrais le faire dynamiquement, c'est-à-dire, sans modifier .theanorc est-ce possible? Ou même de le choisir à l'exécution?

Répondre

11

Je crains que ce n'est pas possible de changer le dispositif d'exécution après Théano a été importé. De l'documentation:

config.device

String value: either 'cpu', 'gpu', 'gpu0', 'gpu1', 'gpu2', or 'gpu3'

[...]

This flag’s value cannot be modified during the program execution.

Bonus: cependant, disons que vous vouliez avoir deux processus Python chacun en cours d'exécution sur un GPU séparé (est-ce que vous voulez?), Alors vous pourriez faire quelque chose comme:

import os 
os.system("THEANO_FLAGS='device=gpu0' python myscript.py") 
os.system("THEANO_FLAGS='device=gpu1' python myscript.py") 

ou pirater/étendre le module multiprocessing de Python (qui fonctionne en générant des sous-processus) pour garantir que l'indicateur est défini avant la génération d'un processus enfant.

+2

Cela peut être pertinent: https://github.com/Theano/Theano/wiki/Utilisation-multiple-GPU –

5

EDIT: Théano est maintenant basé sur le back-end de tableau GPU et l'API suivante est plus disponible.

Comme @EelkeSpaak mentionné, vous ne pouvez pas changer le périphérique de GPU après Théano a été importé. Mais si vous voulez le choisir par programme avant que ce soit possible sans changer les variables d'environnement.

  1. Assurez-vous de ne pas choisir un périphérique dans votre fichier .theanorc. Donc rien comme:

    device=gpu

  2. avant d'appeler import theano choisir le périphérique GPU comme suit:

    import theano.sandbox.cuda 
    theano.sandbox.cuda.use('gpu1') 
    
    #Results in Using gpu device 1: Tesla K80 
    
+0

Je reçois cette erreur: 'RuntimeError: (. 'initCnmem:. cnmemInit appel a échoué Raison = CNMEM_STATUS_OUT_OF_MEMORY NumDev = 1 \ n', « Vous avez demandé à forcer ce dispositif et il a échoué Non repli sur le cpu ou ot son appareil gpu. ') '. C'était après la première déclaration d'importation, n'a même pas pu établir le gpu. –

+0

@Sachin_ruk c'est un problème différent. Vous pourriez vouloir poser une nouvelle question. – gidim