2016-07-22 1 views
0

J'ai un modèle CNN. Les demandes d'utilisation de ce modèle, par exemple pour classer une image, viennent 1 fois par seconde.Comment gérer des tâches multiples dans un processus en utilisant Theano pour l'apprentissage automatique?

Je souhaite recueillir les demandes en tant que nouvelles données non supervisées et continuer à former mon modèle.

Ma question est: Comment puis-je gérer la tâche d'entraînement et classifier efficacement la tâche?

Je vais vous expliquer pourquoi il devient un problème:

Chaque étape de formation prend beaucoup de temps, secondes au moins Severy, en utilisant le GPU et non interruptible. Donc, si mes tâches de classification utilisent aussi GPU, je ne peux pas répondre aux demandes à temps. Je voudrais faire classer des tâches en utilisant le CPU, mais il semblerait que ce ne soit pas le cas pour deux différents config.device en un seul processus.

Le processus multiple n'est pas acceptable, car ma mémoire est limitée et le coût est trop élevé.

Toute aide ou conseil serait aprécié.

Répondre

0

Vous pouvez créer deux copies distinctes du même CNN, l'une sur le processeur et l'autre sur le GPU. Je pense que cela pourrait se faire sous soit l'ancien back-end GPU ou le nouveau, mais de différentes manières .... quelques idées:

sous l'ancien back-end:

charge Théano avec device=cpu. Construisez votre fonction d'inférence et compilez-la. Ensuite, appelez theano.sandbox.cuda.use('gpu'), et créez une nouvelle copie de votre fonction d'inférence et prenez les gradients de celle-ci pour effectuer toutes les fonctions d'entraînement. Maintenant, la fonction d'inférence devrait s'exécuter sur le CPU, et la formation devrait se faire sur le GPU. (Je ne l'ai jamais fait exprès, mais je l'avais me arriver sur un accident!)

Sous le nouveau back-end:

Pour autant que je sais, vous devez dire Théano au sujet des processeurs graphiques droit lors de l'importation , pas plus tard. Dans ce cas, vous pouvez utiliser THEANO_FLAGS="contexts=dev0->cuda0", ce qui ne force pas l'utilisation d'un périphérique par rapport à un autre. Construisez ensuite la version d'inférence de votre fonction comme d'habitude, et pour la version d'entraînement, placez toutes les variables partagées sur le GPU, et les variables d'entrée à n'importe laquelle de vos fonctions d'entraînement doivent également être des variables GPU. Lorsque toutes vos fonctions sont compilées, regardez les programmes en utilisant theano.printing.debugprint(function) pour voir ce qu'il y a sur GPU vs CPU. (Lors de la compilation des fonctions du processeur, il peut être averti qu'il ne peut pas déduire le contexte, et pour autant que je l'ai vu, il atterrit sur le CPU ... je ne sais pas si ce comportement est fiable.)

Dans les deux cas, cela dépendra de vos fonctions basées sur GPU ne RETOURNEZ AUCUN AU CPU (assurez-vous que les variables de sortie sont celles du GPU). Cela devrait permettre à la fonction d'entraînement de fonctionner simultanément avec votre fonction d'inférence, et plus tard vous saisirez ce dont vous avez besoin dans le CPU. Par exemple, lorsque vous suivez une formation, copiez simplement les nouvelles valeurs sur vos paramètres de réseau d'inférence, bien sûr.

Laissez-nous entendre ce que vous venez avec!