2015-03-30 14 views
5

Sto iniziando a imparare Torch7 per entrare nel campo del machine learning/deep learning e lo trovo affascinante (e molto complicato haha). La mia preoccupazione principale, tuttavia, è se posso trasformare questo apprendimento in un'applicazione - principalmente posso trasformare i miei script Lua Torch7 in un server che un'app può utilizzare per eseguire calcoli di apprendimento automatico? E se è possibile, come?Server HTTP utilizzando Lua/Torch7

Grazie

risposta

2

Si dovrebbe guardare a torcia come una libreria (anche se si può essere accede come un eseguibile standalone). Quella libreria può essere utilizzata da un codice Lua accessibile tramite HTTP. Il codice Lua potrebbe essere in esecuzione all'interno di OpenResty, che si prenderà cura di tutte le interazioni HTTP e otterrai le stesse prestazioni di OpenResty che può essere configurato per utilizzare LuaJIT.

Un'altra opzione consiste nell'utilizzare l'elaborazione HTTP basata sulle librerie di luasocket e copas (ad esempio, Xavante) o utilizzare una delle opzioni elencate nella pagina LuaWebserver.

+0

Ottimo, grazie. Avete una raccomandazione su quale metodo dovremmo usare? Stiamo pensando che il caso d'uso sarebbe la classificazione delle immagini, il riepilogo del testo e il data mining per l'impresa. I pensieri finora sono server AWS con una GPU, che esegue Torch7 come server. – Rob

+0

Penso che il modo più versatile sarà quello di continuare a usare torcia come server in grado di comunicare su TCP (possibilmente usando pacchetti asincroni con riferimenti @smhx) con un altro componente in esecuzione sulla stessa macchina che gestisce le interazioni HTTP. In questo modo è possibile utilizzare e testare il codice indipendentemente da HTTP e integrarlo in vari modi senza influire sull'implementazione principale. La sfida principale sta nel trovare una buona API da utilizzare su socket. –

+0

Perché dovresti raccomandare TCP invece di usare l'implementazione JSON di async? Inoltre, cosa intendi con "calcolare una buona API da utilizzare su socket"? Sto pensando che nodejs potrebbe essere in grado di farlo bene se questo è ciò che intendi – Rob

3

È anche possibile utilizzare il pacchetto async che abbiamo testato con torcia.

+0

Sembra che anche "asincrono" non accetti le richieste HTTP parallele. Cosa voglio fare per accettare richieste parallele? – SKK

0

Prova llserver - server Lua minimalista. Funziona come singola coroutine, serve contenuto dinamico tramite la funzione di callback: https://github.com/ncp1402/llserver È possibile eseguire altre attività/calcoli in ulteriori coroutine.

5

È possibile utilizzare waffle. Ecco l'esempio ciao mondo su di essa la pagina:

local app = require('waffle') 

app.get('/', function(req, res) 
    res.send('Hello World!') 
end) 

app.listen() 

permette di dire la tua algoritmo è un semplice rilevatore di faccia. L'input è un'immagine e l'output è il rilevamento dei volti in qualche formato JSON. È possibile effettuare le seguenti operazioni:

local app = require('waffle') 
require 'graphicsmagick' 
require 'MyAlgorithm' 

app.post('/', function(req, res) 
    local img, detections, outputJson 
    img = req.form.image_file:toImage() 
    detections = MyAlgorithm.detect(img:double()) 
    outputJson = {} 
    if (detections ~= nil) then 
    outputJson.faceInPicture = true 
    outputJson.faceDetections = detections 
    else 
    outputJson.faceInPicture = false 
    outputJson.faceDetections = nil 
    end 
    res.json(outputJson) 
end) 

app.listen() 

In questo modo l'algoritmo può essere utilizzato come servizio indipendente.

+0

Funziona quando hai già un modello addestrato. Come vorresti aggiungere un'immagine e allenare la tua modella?Ad esempio, la richiesta http post invia un'immagine, quell'immagine deve essere elaborata in un set di allenamento e quindi l'addestramento avviene e infine gli aggiornamenti del modello. Hai qualche esempio per fare lo stesso? –

+0

Sembra che "waffle" non accetti le richieste HTTP parallele. Cosa devo fare per accettare richieste parallele? – SKK

1

Entrambi async e waffle sono grandi opzioni. Un'altra opzione è quella di utilizzare ZeroMQ + Protocol Buffers. Qualunque sia l'ambiente di sviluppo Web preferito, è possibile inviare richieste a Torch utilizzando ZeroMQ in modo asincrono, eventualmente serializzando i messaggi con i buffer del protocollo, quindi elaborare ogni richiesta in Torch e restituire il risultato.

In questo modo sono riuscito a ottenere un throughput molto più elevato rispetto al test Fib per 20K di waffle.