Compilare Caffe2 e Detectron con supporto GPU su Windows (Parte 2 di 2)

martedì 9 ottobre 2018

Qualche settimana fa, ho avuto bisogno di provare ed usare alcuni modelli personalizzati implementati con il framework Caffe2 e Detectron. Sono progetti attivamente sviluppati su Linux, ma ho avuto bisogno di farli girare su Windows 10 con supporto GPU CUDA. E' possibile compilare Caffe2 per Windows, e una guida è disponibile, ma se c'è bisogno di usare Detectron (non supportato ufficialmente su Windows), è un po' più complicato, e sono necessarie alcune modifiche ai sorgenti e agli script di compilazione.

Nel post precedente, ho spiegato in dettaglio tutti i passi necessari per compilare Caffe2 su Windows 10 con supporto CUDA 9/10. Dovete seguire tutti quei passi, se non l'avete già fatto, prima di continuare con questa guida, dove vi mostro come compilare ed eseguire Detectron su Windows.

ATTENZIONE: questa guida è stata scritta e provata nell'ultima settimana di settembre 2018. L'ho provata su 3 differenti macchine Windows di sviluppo (2 con CUDA 9.2, 1 con CUDA 10), con successo. Ma non posso assicurare al 100% che funzioni sulle vostre, e non posso neanche fornirvi supporto diretto in caso qualcosa non funzioni. Per favore, controllate attentamente le versioni dei pacchetti, le dipendenze, le commit git, ecc. E' molto probabile che versioni più recenti (di qualcunque pacchetto, dipendenza, codici sorgenti, strumenti) possano rompere la compilazione.


Passo 0: prerequisiti

Per compilare ed eseguire con successo Detectron su Windows 10, si applicano gli stessi pre-requisiti di Caffe2 su Windows 10. Anche se è possibile compilare ed eseguire Caffe2 con solo supporto CPU, per Detectron E' NECESSARIO avere il supporto GPU CUDA.


Passo 1: Python Virtual Environment per Detectron

Prepareremo un virtual environment per eseguire i nostri esperimenti Detectron. Potete usare lo stesso environment creato per compilare Caffe2, basato su Python 2.7. Io ho preferito creare un virtual environment dedicato a Detectron.

  1. Aprite una x64 Native Tools Developer Command Prompt

  2. Clonate Detectron dal repository GitHub ufficiale

    > mkdir c:\projects\detectron
    > cd c:\projects\detectron
    > git clone --recursive https://github.com/facebookresearch/Detectron.git
    

    Se preferite, potete usare TortoiseGit per clonare. Ricordatevi di abilitare l'opzione recursive.

    Ho compilato con successo usando le seguenti versioni dal master branch:

    • d38ade04c7aed364814f27bab588d74502c85c40 (2018-09-25 23:22:59)
    • 3a38b7bcfc728dbe0ea7923af8ca77d7afbdb7ba (2018-09-06 00:57:42)
  3. Aggiornate pip all'ultima versione (io ho usato v18.0)

    > python -m pip install -U pip
    
  4. Installate virtualenv

    > python -m pip install virtualenv
    
  5. Create un nuovo virtual environment Python 2.7

    > python -m virtualenv caffe2env
    
  6. Attivate il virtual environment

    > caffe2env\Scripts\activate
    
  7. Installate tutti i pacchetti richiesti (facendo riferimento al README nel repository Detectron).

    Io ho usato numpy ottimizzato con Intel-MKL. Lo potete prendere da qui e installarlo prima di tutti gli altri package. Io ho usato la versione 1.15.2.

    (caffe2env)> pip install PATH_PER\numpy‑1.15.2+mkl‑cp27‑cp27m‑win_amd64.whl
    

    Quindi installate tutte le altre dipendenze:

    (caffe2env)> pip install -r requirements.txt
    
  8. Aggiungete i pacchetti mancanti in requirements.txt:

    (caffe2env)> pip install protobuf
    (caffe2env)> pip install future
    (caffe2env)> pip install pydot
    
  9. Compilate i pacchetti bbox e nms ottimizzati con Cython.

    Dovete modificare alcune cose prima di poterli compilare e usare.

    • In setup.py, commentate TUTTE le opzioni extra_compile_args ['-Wno-cpp'], (non supportate da VC++)

    • In detectron\utils\cython_nms.pyx, sistemate un problema a runtime descritto qui. Alla riga 45, sostituite np.int_t con np.intp_t.

    • In detectron\utils\net.py, sistemate un problema a runtime quando si carica un file di modello Pickle salvato. Alla riga 62, sostituite ['r'] con ['rb'].

    (caffe2env)> python setup.py build_ext install
    

    Questo compila e prepara un pacchetto per il modulo Detectron, con i file cython_bbox e cython_nms ottimizzati. Estraete il file Egg (zip) che trovate nella cartella dist in una cartella temporanea, e copiate il contenuto in \detectron\utils (sovrascrivendo eventuali file esistenti).

  10. Scaricate e installate PyCocoTools per Python 2.7, per Windows:

    Dovete usare una versione personalizzata che funziona su Windows, perchè la versione disponibile tramite pip non funziona con Python 2.7. Se preferite, potete anche clonare il repository usando TortoiseGit. Quindi, usando il virtual environment caffe2env che abbiamo creato fin'ora, configurate e installate il pacchetto.

    > mkdir c:\projects\cocoapi-python27
    > cd c:\projects\cocoapi-python27
    > git clone --recursive https://github.com/neoglez/cocoapi
    (caffe2env)> PythonAPI\python setup.py build_ext install
    
  11. La build di Caffe2 che abbiamo preparato usa una modifica per far funzionare gli operatori Detectron in Windows. Pertanto, dobbiamo modificare la loro modalità di caricamento come libreria esterna dinamica. Da notare che gli operatori personalizzati al momento NON sono supportati (se ne avete bisogno, magari si può applicare una strategia simile).

    Cambiate \detectron\utils\env.py in modo da saltare il caricamento della DLL (e stampare un messaggio di avviso per ricordarsi di questa modifica):

    def get_detectron_ops_lib():
    print("In Windows, Detectron ops are built-in. No need to load dynamically. Ignore the following warning.")
    return ""
    
    def get_custom_ops_lib():
    print("In Windows, Detectron custom ops are currently not supported. Ignore the following warning.")
    return ""
    

Detectron per Windows è pronto.


Passo 2: test

Per verificare che il tutto funzioni, potete usare questi comandi:

> (caffe2env)> set pythonpath=C:\python27;C:\python27\DLLs;c:\Projects\pytorch\build;c:\Projects\detectron;C:\opencv\build
> (caffe2env)> python detectron/tests/test_spatial_narrow_as_op.py

Dovrebbero partire alcuni test che usano gli operatori Detectron di Caffe2... se passano, il vostro Detectron funziona. Se no, o se ci sono altri errori, la build di Caffe2/Detectron ha qualche problema (es. configurazione sbagliata, dipendenze mancanti, DLL mancanti, nessun dispositivo CUDA disponibile, ecc.). Cercate su Internet, su StackOverflow, nelle issue del repo GitHub per idee e suggerimenti su come risolverli.


Questo è tutto. Un'altra guida passo-passo un po' lunga, ma che dovrebbe darvi tutto per far funzionare Detectron su Windows.