Configurare CNTK in Linux

CNTK configurazione di compilazione e test di produzione

CNTK può essere eseguito correttamente in molte configurazioni Linux, ma nel caso in cui si voglia evitare possibili problemi di compatibilità, è possibile acquisire familiarità con CNTK configurazione di compilazione e test di produzione in cui sono elencate tutte le versioni di componenti e componenti di dipendenza usate.

CNTK come contenitore Docker

Prima di continuare, è possibile valutare la possibilità di distribuire CNTK come contenitore Docker. Leggere la sezione corrispondente.

Limitazioni e precauzioni correnti

Leggere attentamente questa sezione prima di procedere con la configurazione del sistema. Le informazioni seguenti possono risparmiare molto tempo altrimenti per il debug degli errori di compilazione.

Nota

Questa pagina presuppone che si stia tentando di compilare CNTK ramo master.

Percorsi dei componenti previsti negli script di configurazione e makefile

Attualmente configure e Makefile gli script supportano solo un set limitato di percorsi di installazione per tutti i componenti di dipendenza elencati in questa sezione. Sappiamo, che si tratta di una limitazione e lo correggerà presto (anche se si ritiene di migliorare questi script voi stessi e inviare le modifiche proposte il vostro aiuto è benvenuto e molto apprezzato).

configure cerca tutti i componenti di dipendenza tra i percorsi elencati nella default_path_list variabile definita nello script.

Importante

Per modificare default_path_list la variabile in configure per aggiungere un percorso personalizzato per un determinato componente di dipendenza, assicurarsi di controllare la sezione corrispondente di Makefile. In caso contrario, è possibile che si verifichino errori di compilazione a causa dell'impossibilità di trovare file INCLUDE, librerie e così via.

Metodi di installazione e percorsi dei componenti di dipendenza

Di seguito sono elencati tutti i componenti di dipendenza necessari per compilare CNTK e spiegare come installarli. Sappiamo che esistono molti altri modi per ottenere gli stessi componenti. Tuttavia, se si preferisce un modo alternativo di installazione, assicurarsi di ottenere la stessa cosa, perché spesso origini di installazione alternative, ovvero pacchetti di distribuzione di rete (come Debian, RPM e così via) contengono versioni precedenti del software, perdere alcune librerie e così via. In alcune sezioni di seguito vengono evidenziate in modo specifico queste limitazioni, ma è consigliabile prenderla come precauzione generale.

Utilizzo di make -j

Nella maggior parte delle sezioni è consigliabile usare il make -j comando per richiamare processi di compilazione paralleli e quindi aumentare la velocità del processo di compilazione. Tuttavia, tenere presente che in alcuni sistemi e in particolare nelle macchine virtuali che usano make -j potrebbero verificarsi errori di memoria insufficiente. In questo caso, è sufficiente usare "normale" make o limitare il numero di processi eseguiti contemporaneamente (due processi simultanei funzionano in genere per la maggior parte dei sistemi - usare il comando make -j 2).

Installazione simultanea di versioni diverse degli stessi pacchetti di sviluppo

Prestare molta attenzione nel caso in cui si vogliano avere diverse installazioni di alcuni dei pacchetti di sviluppo indicati di seguito nello stesso sistema. Potrebbe risultare molto difficile eseguire il debug degli errori di compilazione come si può vedere in questo post.

E ora procediamo con la configurazione.

Per sapere quale configurazione dei prerequisiti viene usata nell'ambiente di produzione CNTK, ad esempio ciò che viene usato internamente per la compilazione e il test, vedere questa sezione

Sistema operativo a 64 bit

Per usare CNTK è necessaria un'installazione linux a 64 bit.

Compilatore C++

Verificare che l'installazione disponga di un compilatore C++. Molte distribuzioni non lo includono per impostazione predefinita. Vedere la documentazione della piattaforma su come verificare e ottenere un compilatore C++.

Esempio: per Ubuntu eseguire il comando seguente:

dpkg --list | grep compiler

se nell'output non viene visualizzato qualcosa di simile

g++-5 5.4.0-6ubuntu1~16.04.5 amd64 GNU C++ compiler

quindi non è installato un compilatore C++. Se si ha Ubuntu 1604, installare gcc 5.4 con:

sudo apt-get install g++

Git

Installare Git nel sistema come descritto qui.

MKL

La libreria matematica predefinita CNTK è Intel Math Kernel Library (Intel MKL).The default CNTK math library is the Intel Math Kernel Library (Intel MKL). Seguire questa pagina per installarla

Aprire MPI

Installare Open Message Passing Interface Library (Open MPI).

È consigliabile eseguire l'installazione da origini come descritto di seguito perché molti pacchetti di distribuzione contengono versioni precedenti e mancano le librerie richieste da CNTK. Il requisito corrente CNTK versione Open MPI è almeno 1.10. Controllare se nel sistema sono presenti installazioni di versioni precedenti e, in caso affermativo, disinstallarle o assicurarsi (ad esempio, collegamenti simbolici) che CNTK procedura di compilazione usi la versione richiesta. In caso contrario, potrebbe essere difficile eseguire il debug degli errori di compilazione come si può vedere in questo post.

  • Ottenere le origini di installazione:
wget https://www.open-mpi.org/software/ompi/v1.10/downloads/openmpi-1.10.3.tar.gz
  • Decomprimere, compilare e installare Open MPI (in /usr/local/mpi questo esempio):
tar -xzvf ./openmpi-1.10.3.tar.gz
cd openmpi-1.10.3
./configure --prefix=/usr/local/mpi
make -j all
sudo make install
  • Aggiungere la variabile di ambiente seguente alla sessione corrente e al .bashrc profilo (Prepending the new path, assicura che questa versione venga usata anziché una versione predefinita disponibile tramite il sistema operativo):
export PATH=/usr/local/mpi/bin:$PATH
export LD_LIBRARY_PATH=/usr/local/mpi/lib:$LD_LIBRARY_PATH

Protobuf

Per la serializzazione si usano i buffer del protocollo. Per l'installazione, seguire questa procedura:

  • Installare i pacchetti necessari usando
sudo apt-get install autoconf automake libtool curl make g++ unzip
  • Scaricare e decomprimere le origini protobuf
wget https://github.com/google/protobuf/archive/v3.1.0.tar.gz
tar -xzf v3.1.0.tar.gz
  • Compilare protobuf
cd protobuf-3.1.0
./autogen.sh
./configure CFLAGS=-fPIC CXXFLAGS=-fPIC --disable-shared --prefix=/usr/local/protobuf-3.1.0
make -j $(nproc)
sudo make install

ZLIB

zlib oggi fa parte di molte distribuzioni Linux più diffuse, quindi con la probabilità elevata che è preinstallata. Si noti tuttavia che libzip richiede zlib versione 1.1.2 o successiva e questo in genere non è preinstallato. Zlib deve essere installato prima di compilare Boost di seguito.

Vedere la documentazione della piattaforma su come ottenere il pacchetto zlib necessario o ottenerlo direttamente dal sito Web zlib.

Esempio: per Ubuntu usare il comando seguente:

sudo apt-get install zlib1g-dev

LIBZIP

libzip è disponibile in pacchetti di distribuzione di rete diversi, ma molti di essi contengono versioni precedenti. L'uso di queste versioni genererà probabilmente errori di compilazione. È quindi consigliabile compilare libzip da origini come descritto di seguito.

Si noti che la procedura seguente installerà libzip in /usr/local. Questa è esattamente la posizione in cui CNTK procedura di compilazione è prevista (vedere l'inizio di questa pagina per informazioni dettagliate). Se si vuole installare libzip in un percorso diverso, vedere le istruzioni nel INSTALL file nella radice della cartella di distribuzione libzip. Tuttavia, tenere presente che in questo caso è necessario modificare configure manualmente AND Makefile di CNTK per supportare questo percorso.

Usare il seguente comando:

wget http://nih.at/libzip/libzip-1.1.2.tar.gz
tar -xzvf ./libzip-1.1.2.tar.gz
cd libzip-1.1.2
./configure
make -j all
sudo make install

Aggiungere la variabile di ambiente seguente alla sessione corrente e al .bashrc profilo:

export LD_LIBRARY_PATH=/usr/local/lib:$LD_LIBRARY_PATH

Boost Library

La libreria Boost è un prerequisito per la compilazione del Microsoft Cognitive Toolkit. Seguire questa procedura per installare la libreria Boost nel sistema:

sudo apt-get install libbz2-dev
sudo apt-get install python-dev

wget -q -O - https://sourceforge.net/projects/boost/files/boost/1.60.0/boost_1_60_0.tar.gz/download | tar -xzf - 
cd boost_1_60_0 
./bootstrap.sh --prefix=/usr/local/boost-1.60.0
sudo ./b2 -d0 -j"$(nproc)" install  

Pacchetti specifici della GPU

Se si intende usare CNTK con supporto GPU, seguire questa pagina per installare e configurare l'ambiente di conseguenza.

FACOLTATIVO SORSO.

Se si vuole sfruttare i vantaggi di CNTK da Python, è necessario installare SWIG. SWIG è anche un requisito per compilare le librerie di valutazione CNTK per Java. Per installarlo, eseguire lo script : [CNTK clone root]/Tools/devInstall/Linux/install-swig.sh. Verrà creata la versione installata nella cartella /usr/local/swig-3.0.10.

FACOLTATIVO supporto di Python CNTK v2

Questa sezione descrive come compilare CNTK v2 con il supporto di Python.

Passaggio 1: Compilare API Python

  • Installare lo strumento SWIG se non è ancora stato fatto.
  • Installare Anaconda3 4.1.1 (64 bit)
  • Se si dispone già di un ambiente Python CNTK (denominato cntk-py36, cntk-py35o cntk-py27) è possibile aggiornarlo con i pacchetti necessari più recenti con i comandi seguenti:
# For cntk-py36:
conda env update --file [CNTK clone root]/Scripts/install/linux/conda-linux-cntk-py36-environment.yml --name cntk-py36
# For cntk-py35:
conda env update --file [CNTK clone root]/Scripts/install/linux/conda-linux-cntk-py35-environment.yml --name cntk-py35
# For cntk-py27:
conda env update --file [CNTK clone root]/Scripts/install/linux/conda-linux-cntk-py27-environment.yml --name cntk-py27
  • Se non si dispone ancora di un ambiente Python CNTK, è possibile scegliere tra un ambiente Python 2.7, 3.5 o 3.6 basato su CNTK Python.
  • Creare l'ambiente Python preferito nell'installazione di Python 3.5 Anaconda o Miniconda esistente usando uno dei comandi seguenti, a seconda della versione di Python desiderata:
# For a Python 3.6 based version:
conda env create --file [CNTK clone root]/Scripts/install/linux/conda-linux-cntk-py36-environment.yml
# For a Python 3.5 based version:
conda env create --file [CNTK clone root]/Scripts/install/linux/conda-linux-cntk-py35-environment.yml
# For a Python 2.7 based version:
conda env create --file [CNTK clone root]/Scripts/install/linux/conda-linux-cntk-py27-environment.yml

Nota: assicurarsi che l'ambiente Python aggiornato o creato in precedenza sia attivato per il resto delle istruzioni. Ad esempio, se si dispone di un ambiente basato su Python 3.5 denominato cntk-py35 eseguire questo comando:

source activate cntk-py35

Analogamente, per un ambiente basato su Python 3.6 o 2.7.

Passaggio 2: Disinstallare il pacchetto di CNTK precedente

  • Se in precedenza è stata installata qualsiasi versione del CNTK pip-package nel computer, disinstallarla eseguendo:pip uninstall cntk

Passaggio 3: Compilare il pacchetto Python

  • Per configurare una compilazione con Python, includere questa due opzioni durante l'esecuzione configuredi :
--with-swig[=directory]

e uno dei seguenti (qualsiasi cosa si applica all'ambiente):

--with-py36-path[=directory]
--with-py35-path[=directory]
--with-py27-path[=directory]
  • In questa fase sono supportate solo le build di versione. Ad esempio, se è stato installato SWIG in /usr/local/swig-3.0.10 e l'ambiente Python si trova in $HOME/anaconda3/envs/cntk-py35 fornire questi parametri aggiuntivi a configure:
--with-swig=/usr/local/swig-3.0.10 --with-py35-path=$HOME/anaconda3/envs/cntk-py35
  • In seguito, eseguire come normalmente si farebbe, che creerà il modulo Python CNTK all'interno bindings/python/cntk e produce anche un pacchetto (.whl) in una sottocartella python della cartella di output della compilazione (ad esempio, build/gpu/release/python).
cd [CNTK clone root]
export PYTHONPATH=$PWD/bindings/python:$PYTHONPATH
cd [CNTK clone root]/bindings/python
export LD_LIBRARY_PATH=$PWD/cntk/libs:$LD_LIBRARY_PATH

Nota

Al contrario dell'installazione illustrata per l'installazione del pacchetto Pip, verrà caricato il modulo CNTK dal clone del repository CNTK, non come pacchetto installato nell'ambiente Python. (di conseguenza anche la differenza nella configurazione PYTHONPATH)

Passaggio 4: Verificare la configurazione

Python

  • Eseguire gli esempi python dall'interno delle [CNTK clone root]/Tutorials directory o [CNTK clone root]/Examples per verificare l'installazione. Ad esempio, passare alla cartella [CNTK clone root]/Tutorials/NumpyInterop ed eseguire python FeedForwardNet.py. Verrà visualizzato l'output seguente nella console:
Minibatch: 0, Train Loss: 0.7915553283691407, Train Evaluation Criterion: 0.48

Minibatch: 20, Train Loss: 0.6266774368286133, Train Evaluation Criterion: 0.48

Minibatch: 40, Train Loss: 1.0378565979003906, Train Evaluation Criterion: 0.64

Minibatch: 60, Train Loss: 0.6558118438720704, Train Evaluation Criterion: 0.56

FACOLTATIVO OpenCV

CNTK 2.2 richiede l'installazione di Open Source Visione artificiale (OpenCV), ma è facoltativo dopo CNTK 2.3. Seguire questa pagina per installarla

FACOLTATIVO Java

Per compilare le associazioni Java per la libreria di valutazione CNTK, installare lo strumento SWIG se non è ancora stato fatto. È inoltre necessario un Java Development Kit (JDK). Attualmente si usa OpenJDK a 64 bit 8.

Lo script di configurazione offre --with-jdk l'opzione per specificare manualmente la directory JDK, se non è possibile trovare per impostazione predefinita.

Recupero di codice sorgente CNTK

Prima di procedere ulteriormente, si noti che se si prevede di apportare modifiche al codice CNTK è necessario leggere le informazioni su Sviluppo e test.

Usare Git per clonare il repository CNTK e accedere al codice sorgente:

git clone --recursive https://github.com/Microsoft/cntk
cd cntk

Il modulo secondario Multiverso viene usato per abilitare DataParallelASGD per il training.

Opzionale Se non è necessario il supporto di DataParallelASGD, passare l'opzione --asgd=no al comando configura.

Compilazione di CNTK

Per compilare CNTK usare i comandi seguenti (si presuppone che il repository CNTK sia stato clonato in ~/Repos/cntk):

cd ~/Repos/cntk
mkdir build/release -p
cd build/release
../../configure

Assicurarsi che l'output configure corrisponda ai pacchetti installati nelle sezioni precedenti. Assicurarsi, ad esempio, di configure trovare CUDA se installato e così via.

Eseguire le operazioni seguenti per compilare CNTK usando tutti i core per ridurre al minimo il tempo di compilazione. Si noti che in alcuni computer, questo può sovraccaricare il sistema causando blocchi o interruzioni durante la compilazione.

make -j all

Se l'oggetto precedente supera il computer, provare a specificare meno core. Ad esempio, se sono presenti più di 2 core e si desidera mantenere 2 core liberi dalla compilazione, è possibile provare:

make -j"$(($(nproc)  - 2))" all

Se si vuole essere assolutamente sicuri, usare solo 1 core:

make all

Questo deve produrre una build di versione di CNTK. Se si vuole ottenere una compilazione di debug, usare il parametro seguente quando si richiama configure:

../../configure --with-buildtype=debug

Test rapido delle funzionalità di compilazione CNTK

Per assicurarsi che CNTK funzioni correttamente nel sistema, è possibile eseguire rapidamente un esempio dall'esercitazione Hello World - Regressione logistica. Questo esempio esegue il training di una rete semplice e può essere indirizzato all'uso della CPU o della GPU, che consente di garantire rapidamente che CNTK funzioni correttamente.

Di seguito si presuppone che il repository di CNTK sia clonato in ~/Repos/cntk e build/release sia stato usato come sotto directory per la compilazione.

  • Specificare il percorso dei file binari CNTK e passare alla Tutorials/HelloWorld-LogisticRegression directory:
export PATH=$HOME/Repos/cntk/build/release/bin:$PATH
cd ~/Repos/cntk/Tutorials/HelloWorld-LogisticRegression

Provare prima di tutto l'esempio:

cntk configFile=lr_bs.cntk makeMode=false

Se l'esempio viene eseguito, ad esempio, se non sono presenti messaggi di errore, verrà visualizzato prima l'output correlato alla lettura della configurazione, seguito dall'output del training di rete effettivo.

Tentativo di CNTK con GPU

Se è stato creato CNTK per l'utilizzo della GPU, provare a usare la GPU eseguendo i comandi seguenti:

cntk configFile=lr_bs.cntk makeMode=false deviceId=auto

All'inizio dell'output dovrebbe essere visualizzata una riga che conferma che è stata usata una GPU:

Model has 9 nodes. Using GPU 0.

Si noti che l'ID GPU può essere diverso. Il deviceId parametro definisce il processore da usare per il calcolo.

  • deviceId=-1 significa usare la CPU. Valore predefinito
  • deviceId=X dove X è un intero >=0 significa usare GPU X, ad esempio deviceId=0 significa GPU 0 e così via.
  • deviceId=auto significa usare GPU, selezionare automaticamente GPU

Contributo al codice CNTK

Se si pianificano modifiche al codice, è necessario leggere le informazioni su Sviluppo e test.

Passaggi successivi