2016-07-22 12 views
0

Ich habe ein CNN-Modell. Die Anforderungen, dieses Modell zu verwenden, um beispielsweise ein Bild zu klassifizieren, kommen 1 Mal pro Sekunde.Wie kann Multi-Task in einem Prozess mit theano für maschinelles Lernen behandelt werden?

Ich möchte die Anfragen als neue unüberwachte Daten sammeln und mein Modell weiterbilden.

Meine Frage ist: Wie kann ich mit der Trainingsaufgabe umgehen und Aufgabe effizient klassifizieren?

Ich werde erklären, warum es ein Problem wird: Schritt

Jedes Training dauert eine lange Zeit, mindestens Severy Sekunden, GPU und nicht unterbrechbare. Wenn meine Aufgaben also auch GPUs verwenden, kann ich die Anfragen nicht rechtzeitig beantworten. Ich würde gerne Aufgaben mit der CPU klassifizieren, aber es sieht so aus, als ob theano nicht zwei verschiedene config.devices in einem Prozess unterstützt.

Multi-Prozess ist nicht akzeptabel, weil mein Gedächtnis begrenzt ist und theano kostet zu viel.

Jede Hilfe oder Beratung wäre zu schätzen.

Antwort

0

Sie könnten zwei separate Kopien desselben CNN erstellen, einen auf der CPU und einen auf der GPU. Ich denke, das entweder unter dem alten GPU-Backend oder die neuen getan werden könnte, aber auf unterschiedliche Weise .... einige Ideen:

Unter dem alten Backend:

Last Theano mit device=cpu. Erstellen Sie Ihre Inferenzfunktion und kompilieren Sie sie. Rufen Sie dann theano.sandbox.cuda.use('gpu') an, und erstellen Sie eine neue Kopie Ihrer Inferenzfunktion, und nehmen Sie Steigungen von diesem, um irgendwelche Trainingsfunktionen zu machen. Jetzt sollte die Inferenzfunktion auf der CPU ausgeführt werden und das Training sollte auf der GPU stattfinden. (Ich habe noch nie das absichtlich getan, aber ich hatte es auf Unfall passiert mir!)

Unter dem neuen Backend:

Soweit ich weiß, Sie haben Theano zu sagen über ein etwaiges Recht GPUs beim Import , nicht später. In diesem Fall könnten Sie THEANO_FLAGS="contexts=dev0->cuda0" verwenden, was nicht zwingt, ein Gerät gegenüber einem anderen zu verwenden. Erstellen Sie dann die Inferenzversion Ihrer Funktion wie normal, und für die Trainingsversion setzen Sie wieder alle gemeinsam genutzten Variablen auf die GPU, und die Eingabevariablen für jede Ihrer Trainingsfunktionen sollten auch GPU-Variablen sein (z. B. input_var_1.transfer('dev0')). Wenn alle Ihre Funktionen kompiliert sind, schauen Sie sich die Programme an, die theano.printing.debugprint(function) verwenden, um zu sehen, was auf GPU gegen CPU ist. (Beim Kompilieren der CPU-Funktionen könnte es eine Warnung geben, dass es nicht auf den Kontext schließen kann und, soweit ich gesehen habe, dass es auf der CPU landet ... nicht sicher, ob dieses Verhalten sicher davon abhängt.)

In beiden Fällen hängt das von Ihren GPU-basierten Funktionen ab, die nichts an die CPU zurückgeben (vergewissern Sie sich, dass die Ausgabevariablen GPUs sind). Dies sollte ermöglichen, dass die Trainingsfunktion gleichzeitig mit Ihrer Inferenzfunktion ausgeführt wird, und später greifen Sie, was Sie für die CPU benötigen. Wenn du zum Beispiel einen Trainingsschritt machst, kopiere einfach die neuen Werte auf deine Inferenznetzwerkparameter.

Lassen Sie uns hören, was Sie kommen!