Utilisation des librairies Cuda sur une Debian Wheezy

Au 21 mai 2014, il n'est pas possible de rétroporter les paquets sans avoir de gros soucis d'exploitation des cartes Nvidia. Ni les versions 331.37 ou 337.19 . Sachant que la version la plus récente qui fonctionnait était la 331.49, l'opération est plus lourde et elle exclue l'usage d'un noyau 3.14 !

Rétroportage de CUDA 5.5 sous Wheezy

La Debian Wheezy ne dispose que de la version 4.2.9 de CUDA et du pilote 304.88. Ces versions peuvent rapidement sembler insuffisantes pour ceux qui désirent utiliser les dernières fonctionnalités de CUDA 5 ou simplement utiliser les dernières cartes video Nvidia.

La Debian Wheezy dispose de ses propres paquets rétroportés mais, même s'ils sont plus récents, ils ne proposent que les versions 5.0.35 de CUDA et 3.19.72 du pilote. L'exploitation des dernières cartes peut donc poser problème, même dans ces versions.

Voici la méthode permettant d'installer à partir d'un rétro-portage les paquets Nvidia ainsi que tout l'environnement associé.

Pour une compilation dans SIDUS, ne pas oublier de monter le /proc

Purge des paquets Nvidia et CUDA originels

dpkg -l | egrep "nvidia|cuda|cupti|nvtoolsext|nvvm|nvctrl|nvcuvid|curand|cublas|cufft|cudart|cuinj|cusparse|libnpp" | awk '{ print $2 }' | xargs -I '{}' apt-get -y purge '{}'
dpkg -l | grep opencl | grep -v openclip | awk '{ print $2 }' | xargs -I '{}' apt-get -y purge '{}'

Préparation du système

Il est nécessaire d'insérer les sources des paquets sid et expérimentaux pour disposer de la dernière version de CUDA packagée (la 5.5.22) et du dernier pilote Nvidia qui fonctionne (le 331.49).

apt-get install -y pbuilder pciutils

[ $(grep wheezy /etc/apt/sources.list | grep deb-src | wc -l) -gt 0 ] && echo "Already present" || echo "deb-src http://ftp.fr.debian.org/debian/ sid main contrib non-free" >> /etc/apt/sources.list
[ $(grep sid /etc/apt/sources.list | grep deb-src | wc -l) -gt 0 ] && echo "Already present" || echo "deb-src http://ftp.fr.debian.org/debian/ sid main contrib non-free" >> /etc/apt/sources.list
[ $(grep experimental /etc/apt/sources.list | grep deb-src | wc -l) -gt 0 ] && echo "Already present" || echo "deb-src http://ftp.fr.debian.org/debian/ experimental main contrib non-free" >> /etc/apt/sources.list
aptitude -y update

Rétroportage des composants Système

mkdir -p /root/nvidia/debian
cd /root/nvidia
apt-get source glx-alternatives
apt-get build-dep glx-alternatives
cd glx-alternatives-*
debuild
cd ..
ls -1 *.deb
mv *.deb debian

Les paquets créés sont les suivants :

glx-alternative-fglrx_0.4.1_amd64.deb
glx-alternative-mesa_0.4.1_amd64.deb
glx-alternative-nvidia_0.4.1_amd64.deb
glx-diversions_0.4.1_amd64.deb

Rétroportage des composants Nvidia

cd /root/nvidia
apt-get source nvidia-xconfig nvidia-settings nvidia-support nvidia-modprobe
apt-get -y build-dep nvidia-xconfig nvidia-settings nvidia-graphics-drivers  nvidia-support nvidia-modprobe
cd /root/nvidia/
wget http://snapshot.debian.org/archive/debian/20140223T100457Z/pool/non-free/n/nvidia-graphics-drivers/nvidia-graphics-drivers_331.49-1.debian.tar.xz
wget http://snapshot.debian.org/archive/debian/20140223T100457Z/pool/non-free/n/nvidia-graphics-drivers/nvidia-graphics-drivers_331.49-1.dsc
wget http://snapshot.debian.org/archive/debian/20140223T100457Z/pool/non-free/n/nvidia-graphics-drivers/nvidia-graphics-drivers_331.49.orig.tar.gz
tar xzf nvidia-graphics-drivers_331.49.orig.tar.gz
mv nvidia-graphics-drivers-331.49.orig nvidia-graphics-drivers-331.49
cd nvidia-graphics-drivers-331.49
tar Jxf ../nvidia-graphics-drivers_331.49-1.debian.tar.xz
debuild
cd ..
ls -1 *.deb
mv *.deb debian

Les paquets créés sont les suivants :

libcuda1_331.49-1_amd64.deb
libgl1-nvidia-glx_331.49-1_amd64.deb
libnvcuvid1_331.49-1_amd64.deb
libnvidia-compiler_331.49-1_amd64.deb
libnvidia-encode1_331.49-1_amd64.deb
libnvidia-fbc1_331.49-1_amd64.deb
libnvidia-ifr1_331.49-1_amd64.deb
libnvidia-ml1_331.49-1_amd64.deb
nvidia-alternative_331.49-1_amd64.deb
nvidia-cuda-mps_331.49-1_amd64.deb
nvidia-detect_331.49-1_amd64.deb
nvidia-driver_331.49-1_amd64.deb
nvidia-glx_331.49-1_amd64.deb
nvidia-kernel-dkms_331.49-1_amd64.deb
nvidia-kernel-source_331.49-1_amd64.deb
nvidia-libopencl1_331.49-1_amd64.deb
nvidia-opencl-common_331.49-1_amd64.deb
nvidia-opencl-icd_331.49-1_amd64.deb
nvidia-smi_331.49-1_amd64.deb
nvidia-vdpau-driver_331.49-1_amd64.deb
xserver-xorg-video-nvidia_331.49-1_amd64.deb
cd /root/nvidia/nvidia-modprobe-*/
debuild
cd ..
ls -1 *.deb
mv *.deb debian

Les paquets créés sont les suivants :

nvidia-modprobe_334.16-1_amd64.deb
cd /root/nvidia/nvidia-settings-*/
debuild
cd ..
ls -1 *.deb
mv *.deb debian

Les paquets créés sont les suivants :

libxnvctrl0_331.67-1_amd64.deb
libxnvctrl-dev_331.67-1_amd64.deb
nvidia-settings_331.67-1_amd64.deb
cd /root/nvidia/nvidia-xconfig-*/
debuild
cd ..
ls -1 *.deb
mv *.deb debian

Le paquet créé est le suivant :

nvidia-xconfig_331.67-1_amd64.deb
cd /root/nvidia/nvidia-support-*/
debuild
cd ..
ls -1 *.deb
mv *.deb debian

Les paquets créés sont les suivants :

nvidia-installer-cleanup_20131102+1_amd64.deb
nvidia-kernel-common_20131102+1_amd64.deb
nvidia-support_20131102+1_amd64.deb

Installation des composants Nvidia

cd /root/nvidia/debian

rmmod nvidia
sync
rmmod -f nouveau

dpkg -i nvidia-installer-cleanup_*_amd64.deb
dpkg -i glx-diversions_*_amd64.deb glx-alternative-mesa_*_amd64.deb
dpkg -i nvidia-support_*_amd64.deb
dpkg -i glx-alternative-nvidia_*_amd64.deb

dpkg -i nvidia-modprobe_*_amd64.deb

dpkg -i nvidia-alternative_*_amd64.deb

dpkg -i libgl1-nvidia-glx_*_amd64.deb 

apt-get install xserver-xorg-core libaudit0 libxkbfile1 x11-xkb-utils xfonts-base xserver-common

dpkg -i nvidia-kernel-common_*_amd64.deb 

dpkg -i nvidia-kernel-dkms_*_amd64.deb

ls -1 lib*331.49* lib*334.16* | xargs -I '{}' dpkg -i '{}'

apt-get -f install

dpkg -i xserver-xorg-video-nvidia_*

dpkg -i nvidia-vdpau-driver_*_amd64.deb nvidia-driver_*_amd64.deb

ls *331.49* lib*334.16*  | grep -v ^lib | grep -v nvidia-kernel | grep -v libopencl | xargs -I '{}' dpkg -i '{}'

apt-get -f install

Rétroportage des composants Cuda

cd /root/nvidia
apt-get source nvidia-cuda-toolkit
apt-get -y build-dep nvidia-cuda-toolkit
cd nvidia-cuda-toolkit-5.5.22
debuild
cd ..
ls -1 *.deb
mv *.deb debian

Les paquets créés sont les suivants :

libcublas5.5_5.5.22-3_amd64.deb
libcudart5.5_5.5.22-3_amd64.deb
libcufft5.5_5.5.22-3_amd64.deb
libcufftw5.5_5.5.22-3_amd64.deb
libcuinj64-5.5_5.5.22-3_amd64.deb
libcupti5.5_5.5.22-3_amd64.deb
libcupti-dev_5.5.22-3_amd64.deb
libcupti-doc_5.5.22-3_all.deb
libcurand5.5_5.5.22-3_amd64.deb
libcusparse5.5_5.5.22-3_amd64.deb
libnppc5.5_5.5.22-3_amd64.deb
libnppi5.5_5.5.22-3_amd64.deb
libnpps5.5_5.5.22-3_amd64.deb
libnvtoolsext1_5.5.22-3_amd64.deb
libnvvm2_5.5.22-3_amd64.deb
nvidia-cuda-dev_5.5.22-3_amd64.deb
nvidia-cuda-doc_5.5.22-3_all.deb
nvidia-cuda-gdb_5.5.22-3_amd64.deb
nvidia-cuda-toolkit_5.5.22-3_amd64.deb
nvidia-nsight_5.5.22-3_amd64.deb
nvidia-opencl-dev_5.5.22-3_amd64.deb
nvidia-profiler_5.5.22-3_amd64.deb
nvidia-visual-profiler_5.5.22-3_amd64.deb

Installation des composants Cuda & OpenCL

apt-get install -y opencl-headers ocl-icd-opencl-dev g++-4.6 libthrust-dev libstdc++6-4.6-dev
cd /root/nvidia/debian
ls *5.5.22* | grep -v opencl | xargs -I '{}' dpkg -i '{}'
# Il arrive que l'installeur rale sur nvidia-cuda-toolkit. Si c'est le cas, la commande suivante s'impose
apt-get -f install

Rétroportage du composant Python PyOpenCL

La dépendance sur une version plus récente de PyTools impose le rétroportage de cette dernière.

cd /root/nvidia
apt-get source python-pytools
apt-get -y build-dep python-pytools
cd /root/nvidia/pytools-*/
debuild
cd ..
ls -1 *.deb
mv *.deb debian
python3-pytools_2013.5.7-1_all.deb
python-pytools_2013.5.7-1_all.deb
cd /root/nvidia/debian
dpkg -i python3-pytools_*.deb python-pytools_*.deb 
cd /root/nvidia
apt-get source pyopencl
apt-get -y build-dep pyopencl
cd /root/nvidia/pyopencl-*/
debuild
cd ..
ls -1 *.deb
mv *.deb debian

Les paquets créés sont les suivants :

python3-pyopencl_2013.2-1_amd64.deb
python3-pyopencl-dbg_2013.2-1_amd64.deb
python-pyopencl_2013.2-1_amd64.deb
python-pyopencl-dbg_2013.2-1_amd64.deb
python-pyopencl-doc_2013.2-1_all.deb

Reinstallation du composant ICD associé au périphérique Nvidia

cd /root/nvidia/debian
dpkg -i nvidia-opencl-common_*_amd64.deb nvidia-opencl-icd_*_amd64.deb

Rétroportage du composants Python PyCUDA

cd /root/nvidia/debian
apt-get purge -y ocl-icd-libopencl1 amd-libopencl1:amd64
dpkg -i nvidia-libopencl1_*_amd64.deb
dpkg -i --force-all $(ls *5.5.22-*.deb) 

La version la plus récente de PuCUDA disponible dans la Debian en source est la version 2013.1.1+git20140310 mais elle n'est pas rétroportable. Il est donc nécessaire de construire les paquets par rapport au PyCUDA de la Wheezy, lequel ne peut pas être installé tel que (il dépend d'un CUDA 4.2.9 alors que nous installons un CUDA 5.5.22).

cd /root/nvidia
apt-cache showsrc pycuda | grep ^Version: | head -1 | awk '{ print $2 }' | xargs -I '{}' apt-get source pycuda='{}'
apt-get -y build-dep pycuda
cd /root/nvidia/pycuda-*/
debuild
cd ..
ls -1 *.deb
mv *.deb debian
python-pycuda_2012.1-1_amd64.deb
python-pycuda-doc_2012.1-1_all.deb
python-pycuda-headers_2012.1-1_all.deb

Installation des composants Python

cd /root/nvidia/debian
# Les paquets suivants issus de AMD sont necessaires pour le premier et bien utile pour le second
apt-get install -y ocl-icd-libopencl1 ocl-icd-dev opencl-headers
apt-get install -y amd-opencl-icd amd-clinfo
# Les paquets icd standard ocl-icd-opencl-dev ocl-icd-libopencl1
dpkg -i python-pyopencl_*.deb python3-pyopencl_*.deb python-pyopencl-doc_*.deb
cd /root/nvidia/debian
dpkg -i python-pycuda-*deb

Exécution des exemples

 
python /usr/share/doc/python-pyopencl-doc/examples/benchmark.py 

Sur une carte Quadro 4000 (et un Dell Precision 7500):

Execution time of test without OpenCL:  0.115163087845 s
===============================================================
Platform name: AMD Accelerated Parallel Processing
Platform profile: FULL_PROFILE
Platform vendor: Advanced Micro Devices, Inc.
Platform version: OpenCL 1.2 AMD-APP (923.1)
---------------------------------------------------------------
Device name: Intel(R) Xeon(R) CPU           X5650  @ 2.67GHz
Device type: CPU
Device memory:  48463 MB
Device max clock speed: 1995 MHz
Device compute units: 12
Device max work group size: 1024
Device max work item sizes: [1024, 1024, 1024]
Data points: 8388608
Workers: 256
Preferred work group size multiple: 1
Execution time of test: 0.013031 s
Results OK
===============================================================
Platform name: NVIDIA CUDA
Platform profile: FULL_PROFILE
Platform vendor: NVIDIA Corporation
Platform version: OpenCL 1.1 CUDA 4.2.1
---------------------------------------------------------------
Device name: Quadro 4000
Device type: GPU
Device memory:  2047 MB
Device max clock speed: 950 MHz
Device compute units: 8
Device max work group size: 1024
Device max work item sizes: [1024, 1024, 64]
Data points: 8388608
Workers: 256
Preferred work group size multiple: 32
Execution time of test: 0.00134115 s
Results OK

Sur une carte Quadro 2000 (et un Dell Precision M4600):

Execution time of test without OpenCL:  0.0773868560791 s
===============================================================
Platform name: AMD Accelerated Parallel Processing
Platform profile: FULL_PROFILE
Platform vendor: Advanced Micro Devices, Inc.
Platform version: OpenCL 1.1 AMD-APP (831.4)
---------------------------------------------------------------
Device name: Intel(R) Core(TM) i7-2860QM CPU @ 2.50GHz
Device type: CPU
Device memory:  16042 MB
Device max clock speed: 2501 MHz
Device compute units: 4
Device max work group size: 1024
Device max work item sizes: [1024, 1024, 1024]
/usr/local/lib/python2.7/dist-packages/pyopencl-2012.2-py2.7-linux-x86_64.egg/pyopencl/__init__.py:36: CompilerWarning: Non-empty compiler output encountered. Set the environment variable PYOPENCL_COMPILER_OUTPUT=1 to see more.
  "to see more.", CompilerWarning)
Data points: 8388608
Workers: 256
Preferred work group size multiple: 1
Execution time of test: 0.0163646 s
Results OK
===============================================================
Platform name: NVIDIA CUDA
Platform profile: FULL_PROFILE
Platform vendor: NVIDIA Corporation
Platform version: OpenCL 1.1 CUDA 4.2.1
---------------------------------------------------------------
Device name: Quadro 2000M
Device type: GPU
Device memory:  2047 MB
Device max clock speed: 1100 MHz
Device compute units: 4
Device max work group size: 1024
Device max work item sizes: [1024, 1024, 64]
Data points: 8388608
Workers: 256
Preferred work group size multiple: 32
Execution time of test: 0.00387338 s
Results OK

Vous aurez noter que l'installation préalable d'un SDK AMD a permis de disposer d'un support OpenCL sur le processeur.

Installation de PyFFT

PyFFT permet l'exploitation de PyCUDA et PyOpenCL pour effectuer tranquillement ses FFT directement à partir de ses scripts Python.

Pour son installation, suivre la page : http://www.cbp.ens-lyon.fr/emmanuel.quemener/dokuwiki/doku.php?id=pyfft4squeeze

developpement/activites/integration/cuda4wheezy33149.txt · Dernière modification: 2015/01/07 10:04 (modification externe)