Pagina 1 di 1

[SOLVED] Compilazione di opencv con il supporto a CUDA e CUDNN

Inviato: dom 3 nov 2019, 20:28
da gian_d
Ho installato cudatoolkit versione 8.0 (quella supportata dal repository di Ponce) e le librerie di cuDNN versione 6. Per cuDNN ho scaricato la versione 6 invece della 5 perché opencv richiede una versione non inferiore alla 6.
Dopo questo, non riesco a far andare avanti la compilazione di opencv versione 4.1.2 a causa di un errore che sembrerebbe essere generato da un'incompatibilità di un componente di CUDA toolkit (nvcc) con il compilatore della serie 9. Questo è il codice restituito nella parte finale:

Codice: Seleziona tutto

[  3%] Building NVCC (Device) object modules/core/CMakeFiles/cuda_compile_1.dir/src/cuda/cuda_compile_1_generated_gpu_mat.cu.o
cd /tmp/SBo/opencv-4.1.2/build/modules/core/CMakeFiles/cuda_compile_1.dir/src/cuda && /usr/bin/cmake -E make_directory /tmp/SBo/opencv-4.1.2/build/modules/core/CMakeFiles/cuda_compile_1.dir/src/cuda/.
cd /tmp/SBo/opencv-4.1.2/build/modules/core/CMakeFiles/cuda_compile_1.dir/src/cuda && /usr/bin/cmake -D verbose:BOOL=1 -D build_configuration:STRING=Release -D generated_file:STRING=/tmp/SBo/opencv-4.1.2/build/modules/core/CMakeFiles/cuda_compile_1.dir/src/cuda/./cuda_compile_1_generated_gpu_mat.cu.o -D generated_cubin_file:STRING=/tmp/SBo/opencv-4.1.2/build/modules/core/CMakeFiles/cuda_compile_1.dir/src/cuda/./cuda_compile_1_generated_gpu_mat.cu.o.cubin.txt -P /tmp/SBo/opencv-4.1.2/build/modules/core/CMakeFiles/cuda_compile_1.dir/src/cuda/cuda_compile_1_generated_gpu_mat.cu.o.Release.cmake
-- Removing /tmp/SBo/opencv-4.1.2/build/modules/core/CMakeFiles/cuda_compile_1.dir/src/cuda/./cuda_compile_1_generated_gpu_mat.cu.o
/usr/bin/cmake -E remove /tmp/SBo/opencv-4.1.2/build/modules/core/CMakeFiles/cuda_compile_1.dir/src/cuda/./cuda_compile_1_generated_gpu_mat.cu.o
-- Generating dependency file: /tmp/SBo/opencv-4.1.2/build/modules/core/CMakeFiles/cuda_compile_1.dir/src/cuda/cuda_compile_1_generated_gpu_mat.cu.o.NVCC-depend
/usr/share/cuda/bin/nvcc -M -D__CUDACC__ /tmp/SBo/opencv-4.1.2/modules/core/src/cuda/gpu_mat.cu -o /tmp/SBo/opencv-4.1.2/build/modules/core/CMakeFiles/cuda_compile_1.dir/src/cuda/cuda_compile_1_generated_gpu_mat.cu.o.NVCC-depend -ccbin /usr/bin/cc -m64 -D__OPENCV_BUILD=1 -D_USE_MATH_DEFINES -D__STDC_CONSTANT_MACROS -D__STDC_LIMIT_MACROS -D__STDC_FORMAT_MACROS -DOPENCV_WITH_ITT=1 -Xcompiler ,\"-O2\",\"-fPIC\",\"-fsigned-char\",\"-W\",\"-Wall\",\"-Werror=return-type\",\"-Werror=non-virtual-dtor\",\"-Werror=address\",\"-Werror=sequence-point\",\"-Wformat\",\"-Werror=format-security\",\"-Wmissing-declarations\",\"-Winit-self\",\"-Wpointer-arith\",\"-Wuninitialized\",\"-Winit-self\",\"-Wno-comment\",\"-Wno-strict-overflow\",\"-fdiagnostics-show-option\",\"-Wno-long-long\",\"-pthread\",\"-fomit-frame-pointer\",\"-ffunction-sections\",\"-fdata-sections\",\"-msse\",\"-msse2\",\"-msse3\",\"-fvisibility=hidden\",\"-fopenmp\",\"-Wno-undef\",\"-Wno-enum-compare\",\"-Wno-unused-function\",\"-Wno-shadow\",\"-Wno-unused-but-set-variable\",\"-O3\",\"-DNDEBUG\",\"-DNDEBUG\" -gencode arch=compute_20,code=sm_20 -gencode arch=compute_30,code=sm_30 -gencode arch=compute_35,code=sm_35 -gencode arch=compute_37,code=sm_37 -gencode arch=compute_50,code=sm_50 -gencode arch=compute_52,code=sm_52 -gencode arch=compute_60,code=sm_60 -gencode arch=compute_61,code=sm_61 -D_FORCE_INLINES -Xcompiler -DCVAPI_EXPORTS -Xcompiler -fPIC --std=c++11 -DNVCC -I/usr/share/cuda/include -I/tmp/SBo/opencv-4.1.2/build -I/usr/include/eigen3 -I/tmp/SBo/opencv-4.1.2/modules/core/include -I/tmp/SBo/opencv-4.1.2/build/modules/core -I/tmp/SBo/opencv-4.1.2/opencv_contrib-4.1.2/modules/cudev/include -I/tmp/SBo/opencv-4.1.2/3rdparty/include/opencl/1.2 -I/tmp/SBo/opencv-4.1.2/3rdparty/ittnotify/include
nvcc warning : The 'compute_20', 'sm_20', and 'sm_21' architectures are deprecated, and may be removed in a future release (Use -Wno-deprecated-gpu-targets to suppress warning).
In file included from /usr/share/cuda/include/cuda_runtime.h:78,
                 from <command-line>:
/usr/share/cuda/include/host_config.h:119:2: error: #error -- unsupported GNU version! gcc versions later than 5 are not supported!
  119 | #error -- unsupported GNU version! gcc versions later than 5 are not supported!
      |  ^~~~~
CMake Error at cuda_compile_1_generated_gpu_mat.cu.o.Release.cmake:219 (message):
  Error generating
  /tmp/SBo/opencv-4.1.2/build/modules/core/CMakeFiles/cuda_compile_1.dir/src/cuda/./cuda_compile_1_generated_gpu_mat.cu.o

make[2]: *** [modules/core/CMakeFiles/opencv_core.dir/build.make:65: modules/core/CMakeFiles/cuda_compile_1.dir/src/cuda/cuda_compile_1_generated_gpu_mat.cu.o] Error 1
make[2]: uscita dalla directory "/tmp/SBo/opencv-4.1.2/build"
make[1]: *** [CMakeFiles/Makefile2:2791: modules/core/CMakeFiles/opencv_core.dir/all] Error 2
make[1]: uscita dalla directory "/tmp/SBo/opencv-4.1.2/build"
make: *** [Makefile:163: all] Error 2 
in sintesi:

Codice: Seleziona tutto

In file included from /usr/share/cuda/include/cuda_runtime.h:78,
                 from <command-line>:
/usr/share/cuda/include/host_config.h:119:2: error: #error -- unsupported GNU version! gcc versions later than 5 are not supported!
Da qualche parte avevo letto che il problema si poteva superare inserendo dei collegamenti simbolici ai compilatori della serie 5 nella directory contenente i binari di cudatoolkit. Es.:
ln -s /usr/bin/gcc-5 /usr/share/cuda/bin/gcc
Ho messo questi due collegamenti (gcc e g++) ma persiste l'errore di compilazione in opencv. Ieri ho provato a vedere la fattibilità di un'installazione di una versione più recente di CUDA Toolkit (la 10) e adattare lo slackbuild, ma l'architettura degli installatori rilasciati da Nvidia è drasticamente cambiata. Peraltro ho notato che verrebbe avviata anche l'installazione di un driver Nvidia, perciò mi sono fermato per evitare di incasinarmi la configurazione grafica del computer.

A questo punto è ragionevole provare a superare l'empasse dell'errore di compilazione di opencv, ma non so cos'altro posso fare. A parte questo, senza il supporto a CUDA l'installazione di opencv va a buon fine. Potrei anche farne a meno, ma l'obiettivo è quello di estendere le funzionalità della computer vision e del deep learning all'interno di Blender. Ergo, cosa posso fare?

PS: a margine, ho il sospetto che forse i miei quesiti non sono del tutto allineati con gli obiettivi specifici dei forum di slacky.eu, perciò se sono off topic bacchettatemi senza pietà ;)

Re: Compilazione di opencv con il supporto a CUDA e CUDNN

Inviato: dom 3 nov 2019, 23:06
da ponce
potresti provare a scrivere al maintainer di cudatoolkit se per caso avesse una versione dello SlackBuild per una versione piu' recente...

rovistando sul suo repository di github ho trovato questo

https://github.com/gperon/mmyy_slackbui ... udatoolkit

Re: Compilazione di opencv con il supporto a CUDA e CUDNN

Inviato: dom 3 nov 2019, 23:40
da gian_d
Ho visto il codice dello slackbuild e in effetti ci sono alcune differenze significative rispetto a quello per la versione 8 di CUDA. Uno dei prossimi giorni lo provo e se il problema dovesse persistere provo a chiedergli dei suggerimenti per adattarlo eventualmente alla versione più recente.
Un'altra cosa che ho pensato di fare è quella di ricostruire l'intero albero del pacchetto rpm in modo da tirarne fuori un tarball usabile con uno slackbuild, ma mi ci vuole un po' di tempo e pazienza per farlo perché devo capire dove va a parare la compilazione e l'installazione. Però per me è un approccio più abbordabile rispetto a quello del file run a meno che non riesca a capire come scompattarlo: l'opzione -extract non è più supportata nelle nuove versioni.

Re: Compilazione di opencv con il supporto a CUDA e CUDNN

Inviato: dom 3 nov 2019, 23:46
da gian_d
Dimenticavo di segnalarti un piccolo errore nello slackbuild del tuo repository, nelle righe 58 e 59:

Codice: Seleziona tutto

chmod +x $CWD/$FILENAME\_$VERSION\_375.26\_linux-run
$CWD/$FILENAME\_$VERSION\_375.26\_linux-run -extract=$TMP
nel nome del file c'è un errore di digitazione perché è stato messo il trattino al posto del punto prima dell'estensione run

Re: Compilazione di opencv con il supporto a CUDA e CUDNN

Inviato: lun 4 nov 2019, 10:43
da ponce
io non ho modificato lo SlackBuild in nessun modo rispetto a come e' su SBo... puoi vedere le modifiche che faccio per ogni SlackBuild al link sottostante
http://cgit.ponce.cc/slackbuilds/refs/heads

credo pero' che il nome del file sia corretto: e' col trattino e non col punto prima di "run", puoi verificarlo col nome del file che viene scaricato e linkato nel file cudatoolkit.info.
come considerazione a margine, se fosse stato sbagliato, non lo avrebbe espanso neppure e non avresti avuto l'errore del perl che mi hai segnalato.

Re: Compilazione di opencv con il supporto a CUDA e CUDNN

Inviato: lun 4 nov 2019, 20:09
da gian_d
Scusami Matteo, ma a me capita qualcosa di veramente strano. Spesso quando devo scaricare un sorgente lo faccio dal file pacchetto.info: con firefox seleziono l'indirizzo, clicco con il pulsante destro del mouse e dal menu contestuale clicco su "Apri link".
Ebbene, selezionando l'indirizzo https://developer.nvidia.com/compute/cu ... _linux-run (nota bene, con il trattino) il server di nvidia mi rilascia il file però il nome ha il punto al posto del trattino! Ho provato a incollare l'indirizzo su konqueror e anche in questo caso viene rilasciato un file con il punto al posto del trattino.

A questo punto è evidente che il server fa un redirect al nome del file che contiene il punto. Probabilmente è una modifica relativamente recente che hanno fatto sul server di nvidia, d'altra parte i file dello slackbuild compreso il file cudatoolkit.info risalgono a tre anni fa. Anche nella sezione interna riservata ai registrati, compare questa istruzione:

Codice: Seleziona tutto

Base Installer 	
Installation Instructions:
$ wget http://developer.download.nvidia.com/compute/cuda/10.1/Prod/local_installers/cuda_10.1.243_418.87.00_linux.run
$ sudo sh cuda_10.1.243_418.87.00_linux.run
Presumo che abbiano impostato dei symlink che puntano a *.run per mantenere una retrocompatibilità con collegamenti in rete che hanno il link *-run

Re: Compilazione di opencv con il supporto a CUDA e CUDNN

Inviato: lun 4 nov 2019, 20:15
da gian_d
ponce ha scritto:come considerazione a margine, se fosse stato sbagliato, non lo avrebbe espanso neppure e non avresti avuto l'errore del perl che mi hai segnalato.
anche qui ho una spiegazione: al primo avvio lo slackbuild mi ha segnalato un errore di file non trovato. È allora che ho notato l'anomalia del trattino al posto del punto e ho quindi corretto lo slackbuild. Solo dopo, al secondo avvio, mi ha espanso correttamente il file arrivando all'errore del perl

Re: Compilazione di opencv con il supporto a CUDA e CUDNN

Inviato: lun 4 nov 2019, 20:49
da ponce
e' sconsigliato scaricare i file linkati su SBo usando i browser (tranne in rarissimi casi in cui e' necessario ed e' specificato nel README, tipo jdk), perche' puoi avere comportamenti inaspettati e non supportati (come il redirect riportato che cambia addirittura il nome del file): usa wget, e' il metodo raccomandato e quello usato per testare praticamente tutti gli script.

Re: Compilazione di opencv con il supporto a CUDA e CUDNN

Inviato: lun 4 nov 2019, 22:04
da gian_d
Oh cavolo! è vero, con wget scarica correttamente il nome con il trattino. Non si finisce mai di imparare. Certo che ne hai di pazienza, chiedo scusa per le cantonate :-)
Metto il tag solved perché a questo punto lascio tutto in sospeso per dedicarmici appena possibile. Peraltro devo ancora provare se è possibile integrare il supporto a CUDA direttamente su Blender senza attivarlo in Open CV. In ogni modo aggiungerò gli eventuali aggiornamenti se dovessi trovare una soluzione con la strada che mi hai indicato.