Recensione: il deep learning MXNet brilla con Gluon

Quando ho esaminato MXNet v0.7 nel 2016, ho ritenuto che fosse un framework di deep learning promettente con un'eccellente scalabilità (quasi lineare sui cluster GPU), una buona auto-differenziazione e supporto all'avanguardia per le GPU CUDA. Ho anche sentito che aveva bisogno di lavorare sulla sua documentazione e tutorial e aveva bisogno di molti più esempi nel suo zoo modello. Inoltre, mi sarebbe piaciuto vedere un'interfaccia di alto livello per MXNet, che immaginavo fosse Keras.

Da allora, ci sono stati parecchi progressi. MXNet è passata sotto l'ombrello di Apache Software Foundation all'inizio del 2017 e, sebbene sia ancora in fase di "incubazione" alla versione 1.3, sembra abbastanza ben sviluppata.

Sebbene si sia lavorato su Keras con un back-end MXNet, una diversa interfaccia di alto livello è diventata molto più importante: Gluon. Prima dell'incorporazione di Gluon, era possibile scrivere codice imperativo semplice o codice simbolico veloce in MXNet, ma non entrambi contemporaneamente. Con Gluon, puoi combinare il meglio di entrambi i mondi, in un modo che compete sia con Keras che con PyTorch.

Cos'è Gluon per MXNet?

I vantaggi rivendicati per Gluon includono codice semplice, modellazione flessibile, grafici dinamici e prestazioni elevate:

  1. Codice semplice e di facile comprensione : Gluon offre un set completo di elementi costitutivi della rete neurale plug-and-play, inclusi livelli predefiniti, ottimizzatori e inizializzatori.
  2. Struttura flessibile e imperativa : Gluon non richiede la definizione rigida del modello di rete neurale, ma piuttosto avvicina l'algoritmo di addestramento e il modello per fornire flessibilità nel processo di sviluppo.
  3. Grafici dinamici : Gluon consente agli sviluppatori di definire modelli di rete neurale che sono dinamici, nel senso che possono essere costruiti al volo, con qualsiasi struttura e utilizzando qualsiasi flusso di controllo nativo di Python.
  4. Prestazioni elevate : Gluon fornisce tutti i vantaggi di cui sopra senza influire sulla velocità di allenamento fornita dal motore sottostante.

Questi quattro elementi, insieme a una raccolta ampiamente ampliata di esempi di modelli, portano Gluon / MXNet alla massima parità con Keras / TensorFlow e PyTorch per facilitare lo sviluppo e la velocità di addestramento. Puoi vedere esempi di codice Gluon che illustrano ciascuna di queste caratteristiche nella pagina principale di Gluon e ripetuti nella pagina di panoramica per l'API Gluon.

L'API Gluon include funzionalità per livelli di rete neurale, reti neurali ricorrenti, funzioni di perdita, metodi di set di dati e set di dati di visione, uno zoo modello e un set di metodi di rete neurale contribuiti sperimentali. Si può liberamente combinare Gluone con normali MXNet e NumPy moduli, per esempio module, autograde ndarray-come pure con flussi controllo Python.

Gluon offre una buona selezione di layer per la creazione di modelli, inclusi layer di base (Dense, Dropout, ecc.), Layer convoluzionali, layer di pooling e layer di attivazione. Ognuna di queste è una chiamata su una riga. Questi possono essere utilizzati, tra l'altro, all'interno di contenitori di rete come gluon.nn.Sequential().

Una HybridSequentialrete può essere memorizzata nella cache (trasformata in un grafico simbolico) per prestazioni elevate utilizzando il hybridize()metodo:

net = nn.HybridSequential ()

con net.name_scope ():

    net.add (nn.Dense (256, activation = "relu"))

    net.add (nn.Dense (128, activation = "relu"))

    net.add (nn.Dense (2))

net.hybridize ()

Notare il modo in cui il Densemetodo del livello può assumere un nome di livello di attivazione come parametro. Questa è una delle tante somiglianze tra Gluon e Keras.

Né i contenitori Sequentialné i HybridSequentialcontenitori sono documentati come parte dell'API Gluon. Come ho scoperto cercando nell'albero del codice sorgente, sono implementati in incubator-mxnet / python / mxnet / gluon / nn / basic_layers.py.

Cosa c'è di nuovo in MXNet 1.3?

MXNet v1.3 include un lungo elenco di nuove funzionalità, miglioramenti e correzioni di bug. I punti salienti includono la capacità di ibridare i livelli RNN (rete neurale ricorrente) per le prestazioni, modelli di visione pre-addestrati nuovi e aggiornati, esportazione del modello in formato ONNX (Open Neural Network Exchange) e integrazione runtime di Nvidia TensorRT in MXNet per accelerare l'inferenza . Inoltre, l'integrazione di Intel MKL (Math Kernel Library) in MXNet offre fino a 4 volte il miglioramento delle prestazioni sulle CPU Intel per operazioni intensive, inclusi i nodi di convoluzione.

La comunità MXNet ha inoltre prestato maggiore attenzione al controllo di qualità e all'integrazione continua. Tra i passaggi effettuati c'è l'integrazione dei notebook di esempio del tutorial Deep Learning: The Straight Dope nei test CI notturni.

Installazione di MXNet senza lacrime

Se hai già un'installazione corrente e funzionante di notebook Python, MXNet e Jupyter con Notedown, puoi passare alla sezione successiva. Altrimenti, per favore segui.

Non posso dirti quanti problemi ho avuto con le versioni precedenti dei diversi componenti software che generavano errori oscuri, insieme all'interferenza dalle installazioni di altri pacchetti, prima di capire questa sequenza riproducibile. In questo modo, non dovresti incontrare bug, tranne nel tuo codice, e non dovresti rompere altri framework di apprendimento profondo che potresti aver installato.

È l'unica opzione di installazione possibile? No certo che no. È ancora più facile eseguire MXNet in Amazon SageMaker o eseguire un'AMI Deep Learning su AWS, che ha tutto ciò di cui hai bisogno già installato.

Inizia installando l'ultima versione di Python 3 per la tua piattaforma. (Ho avuto problemi a eseguire MXNet con Python 2 o versioni precedenti di Python 3.) Suggerisco di installare Python 3 da Python.org. Se preferisci un ambiente Anaconda o MiniConda, puoi invece installare Python 3 con uno di questi ed eventualmente saltare il passaggio di installazione di Jupyter.

Verificare di poter eseguire python3dalla riga di comando e che riporti l'ultima versione. Nella mia installazione di fine ottobre 2018, python3 -Vrestituisce Python 3.7.1; la tua versione potrebbe essere successiva.

Quindi installa Jupyter. Ho usato pip. Questo passaggio non è necessario se hai installato Anaconda, che installa Jupyter per impostazione predefinita.

python3 -m pip install --upgrade pip

python3 -m pip installa jupyter

Se esegui jupyter notebookdalla riga di comando dovresti vedere una finestra del browser aperta ed essere in grado di creare un nuovo notebook con un kernel Python 3. Chiudere queste due finestre e arrestare il server notebook, in genere premendo due volte Ctrl-c nella riga di comando.

Ora installa Notedown usando un tarball come descritto nel file Leggimi del corso accelerato Gluon. Il plug-in Notedown consente a Jupyter di leggere i taccuini salvati in formato markdown, utile sia per il corso intensivo che per Deep Learning: The Straight Dope.

pip installa //github.com/mli/notedown/tarball/master

Prova il fumo eseguendo Jupyter con Notedown:

jupyter notebook --NotebookApp.contents_manager_class = 'notatedown.NotedownContentsManager'

Ancora una volta chiudere tutte le pagine Web e arrestare il server notebook.

Ora siamo pronti per creare un ambiente virtuale per MXNet. Se sei un utente Anaconda, puoi invece creare l'ambiente virtuale con conda. Ho usato la funzione venv nativa di Python3, partendo dalla mia home directory:

python3 -m venv envs / mxnet

Ora attiva l'ambiente virtuale e installa MXNet per la tua piattaforma. Ho scelto la build MXNet con MKL (la libreria ad alte prestazioni di Intel per le sue CPU), dato che sono su un Mac (per il quale non esiste un binario MXNet per le GPU CUDA), ma se hai una GPU Nvidia recente con CUDA installato su Linux o Windows, puoi installare una versione MXNet con supporto sia CUDA che MKL. Su una shell Bash l'installazione di MXNet nell'ambiente virtuale era la seguente:

source envs / mxnet / bin / activation

pip installa mxnet-mkl

L'attivazione è leggermente diversa nella shell C e nella shell di pesce, poiché è possibile eseguire lo script di attivazione direttamente invece di utilizzare source. In ogni caso, dovrai attivare l'ambiente ogni volta che vuoi tornare a questa installazione di MXNet dopo aver chiuso la shell. Se non sei nella tua home directory, il comando di attivazione di Bash sarebbe:

fonte ~ / envs / mxnet / bin / activation

Prova l'installazione di MXNet dalla riga di comando eseguendo Python 3 e importando la libreria MXNet che abbiamo appena installato. Nota che il (mxnet)prefisso sulla riga di comando significa che siamo nell'ambiente virtuale.

(mxnet) Martins-Retina-MacBook: ~ martinheller $ python3

Python 3.7.1 (v3.7.1: 260ec2c36a, 20 ottobre 2018, 03:13:28)

[Clang 6.0 (clang-600.0.57)] su darwin

Digitare "aiuto", "copyright", "crediti" o "licenza" per ulteriori informazioni.

>>> importa mxnet come mx

>>> da mxnet import nd

>>> nd.array (((1,2,3), (5,6,7)))

[[1. 2. 3.]

 [5. 6. 7.]]

>>> ^ D

(mxnet) Martins-Retina-MacBook: ~ martinheller $

Ora siamo pronti per testare MXNet all'interno di un notebook Jupyter con Notedown, nell'ambiente virtuale in cui abbiamo installato MXNet:

Ora che hai testato la tua installazione MXNet in un notebook Jupyter, puoi fare il passo successivo e testare Gluon più completamente. Passare al repository gluon-api / gluon-api su GitHub e scaricare il notebook Jupyter del codice di esempio. Passare alla directory in cui è stato scaricato il notebook, attivare l'ambiente virtuale MXNet se necessario, eseguire il notebook Jupyter, aprire l'esempio ed eseguirlo. Potrebbe essere necessario un po 'di tempo per completare la formazione. Se tutto va bene, vedrai qualcosa di simile a quanto segue:

Tutorial su Gluon e MXNet Module

MXNet ora ha una serie di tutorial sia per Gluon che per l'API del modulo. Ho già menzionato il lungo corso sul deep learning con Gluon, Deep Learning: The Straight Dope, e la versione breve, il Gluon Crash Course di 60 minuti.

Inoltre, ci sono circa 30 tutorial Gluon per Python. Sul lato API del modulo, ci sono circa 24 tutorial per Python, cinque per Scala, due per C ++, nove per R e quattro per Perl.

Quando ho esaminato Keras nel settembre di quest'anno, ho detto che "Se dovessi iniziare un nuovo progetto di apprendimento profondo oggi, molto probabilmente farei la ricerca con Keras". Non ne sono più così sicuro. Gluon / MXNet è una scelta quasi altrettanto buona di Keras / TensorFlow per la ricerca di deep learning su CPU e GPU.

Sul lato negativo, MXNet attualmente manca del supporto per TPU o FPGA, a differenza di TensorFlow, e manca un equivalente di TensorBoard di TensorFlow per la visualizzazione dei grafici. Inoltre, Keras / TensorFlow ha un ecosistema più ampio di Gluon / MXNet.

Keras può essere distribuito su più ambienti rispetto a Gluon, ma puoi distribuire modelli Gluon per la previsione su dispositivi Android, iOS, Raspberry Pi e Nvidia Jetson, oltre a computer in grado di addestrare i modelli e su TensorRT. Gluon e Keras sono attualmente entrambi più maturi di PyTorch, che è ancora in uno stato beta. PyTorch e Gluon possono entrambi creare modelli dinamicamente; Keras attualmente non può.

In definitiva, la scelta del framework di deep learning da utilizzare potrebbe benissimo ruotare attorno alle tue esigenze specifiche o a ciò che conosci e ti piace. Ma grazie a Gluon e ad altri notevoli miglioramenti (nella documentazione, nei tutorial, nei modelli, ecc.), MXNet si preannuncia come una buona scelta come TensorFlow o PyTorch per il deep learning.