Compile OpenCV 4.5.2 dengan Cuda dan CuDNN pada Ubuntu 20.04

Pre-Requirement
Diasumsikan setiap pengguna panduan ini sudah mahir menggunakan komputer, dan browsing internet, serta unduh unduh file dari internet. Lebih khusus lagi, karena kita menggunakan ubuntu, maka kemampuan mengoperasikan terminal di linux juga sudah menjadi hal yg minimal bisa.
PC
Sebagai starting point, tentu kita membutuhkan PC untuk melakukan ini semua. Kali ini spesifikasi PC yang saya gunakan adalah sebagai berikut :
•    Intel Core i7 6th generation
•    RAM 32 GB
•    Nvidia GForce 745 2GB
•    Dan standard power supply.
Tidak ada detail kebutuhan khusus untuk PC yang digunakan dalam kegiatan ini, hanya saja satu hal yang musti kita miliki adalah kartu grafis NVIDIA yang sudah support CUDA. Hal ini dapat di cek di situs resmi NVIDIA ( kasih link ). Untuk spesifikasi tentang kemampuan komputasi antara prosesor dan graphic card adalah sebagai berikut
 
Operating System
Untuk system operasi yang saya gunakan saat ini adalah Ubuntu 20.04. cuda sendiri pada dasarnya mendukung 3 sistem operasi populer, apa lagi kalau bukan Mac, Windows dan Linux. Scara spesifik untuk linux ada beberapa distribusi linux yang disediakan paket instalasi secara khusus lengkap dengan dokumentasinya. Distribusi linux ini antara lain RHEL7/CentOS7, RHEL8/CentOS8, Fedora, SUSE Linux Enterprise System (SLES), OpenSUSE, WSL, Ubuntu, Debian.
Untuk ubuntu 20.04 yang saya gunakan didalamnya sudah terdapat python3.8, sehingga nantinya tidak akan terjadi banyak perbedaan (dari sisi python), dengan sumber sumber dokumentasi yang akan kita gunakan pada tahapan berikutnya.

Sumber dokumentasi sebagai acuan
Kegiatan ini tidak lepas dari kegiatan kegiatan serupa yang telah dilakukan sebelumnya dan yang sudah terdokumentasi dengan apik. Selain itu dokumentasi resmi yang pengembang teknologi CUDA juga menyediakan step by step instalasi hingga contoh pengaplikasian teknologi cuda, yang dapat dengan mudah dibaca dan diikuti. Secara umum kegiatan ini mengikuti sumber sumber dokumentasi baik dari kegiatan serupa yang pernah dilakukan maupun dari sumber dokumentasi resmi dari pihak pengembang. Hanya saja untuk beberapa detail memang harus membutuhkan penyesuaian sesuai dengan kondisi di meja kerja kita. Adapun beberapa sumber yang digunakan dalam kegiatan ini antara lain:
•    Dokumentasi NVIDIA Cuda
Situs ini disediakan oleh NVIDIA secara resmi untuk memberikan panduan kepada developer maupun enthusiast yang ingin menginstall cuda di dalam PC atau Mac mereka. Situs ini dapat diakases dia halaman :
https://docs.nvidia.com/cuda/cuda-installation-guide-linux/index.html#post-installation-actions

•    Dokumentasi Verifikasi instalasi Cuda.
Situs ini sebenarnya memuat dokumentasi tentang penggunaan software xCat (Extreme Cloud Administration Toolkit), hanya saja ada Sebagian kecil dari dokumentasi ini yang menjelaskan tentang bagaimana melakukan verifikasi terhadap installasi software cuda yang dapat kita dapat gunakan pada kegiatan kali ini. Sistus ini dapat di akses melalui alamat :
https://xcat-docs.readthedocs.io/en/stable/advanced/gpu/nvidia/verify_cuda_install.html

•    GithubGist Pritthijit Nath, tentang install opencv cuda python.
Boleh dibilang ini adalah panduan utama kita dalam melakukan kegiatan ini, hanya saja beberapa hal memang harus di sesuaikan dan di perinci, biar lebih jelas.
https://gist.github.com/nathzi1505/858a140b4ab621209b0e71c8a55df221

•    NVIDIA cuda download
Sesuai dengan judulnya, disini kita peroleh sumber instalasi software cuda
https://developer.nvidia.com/cuda-downloads
Untuk jenis installer yang akan di download disesuaikan dengan jenis OS yang kita gunakan.

•    NVIDIA cudnn download
Sesuai dengan judulnya, disini kita peroleh installer software CuDNN
https://developer.nvidia.com/cudnn
Kita terlebih dulu harus login atau dengan kata lain harus jadi member komunitas developer nvidia. Kalau belum punya akun, daftar aja, gratis.

•    OpenCV download
Sesuai dengan judulnya, disini kita peroleh installer software OpenCV
https://opencv.org/
Dalam praktek nanti kita akan mendownload source code dari github langsung.

Kita mulai sekarang
Installasi Cuda
Pertama kunjungi alamat situs download nya, pilih operating system sesuai dengan yang akan kita gunakan, dalam hal ini adalah ubuntu 20.04.
 
Kali ini saya sarankan untuk memilih opsi file [deb local], dengan alasan untuk menghindari auto update dimana belum tentu update terbaru akan compatible dengan mesin kita. Saya sering mengalami hal ini dimana saat selesai proses automatic update, dan restart komputer, layar pc hanya mentok di black screen. Belum ngerti gimana cara mecahin masalah ini, waktu itu saya reinstall aja PC nya.
Berikutnya ikuti langkah yang sudah di cantumkan di website
 
Setelah proses installasi lakukan beberapa tahapan pasca instalasi seperti yang dicantumkan di halaman website berikut.
https://docs.nvidia.com/cuda/cuda-installation-guide-linux/index.html#post-installation-actions

Instalasi CuDNN
Setelah masuk dengan menggunakan akun Nvidia dan menyetujui agreement yang disebutkan, berikutnya download beberapa file installer sesuai dengan spesifikasi yang kita punya. Untuk kasus kali ini, yang perlu kita download versi terbaru 11.x dengan tipe file .deb dan arsitektur x86.64
 

Download beberapa file, diantaranya
•    CuDNN runtime library
•    CuDNN developer Library
•    CuDNN Code sample and Documentation
Dengan menggunakan terminal, masuk ke folder dimana fie download-an tersimpan. Install ke tiga library tersebut dengan perintah :
$ sudo dpkg -i [nama_file].deb
Ganti [nama_file] dengan masing masih file installer yang berhasil di download

Instalasi Library Pendukung
Sebelum kita sampai pada tahapan compile source opencv dengan cuda, ada beberapa rekomendasi library yang patut untuk di install
Generic Tools
$ sudo apt install build-essential cmake pkg-config unzip yasm git checkinstall
Image I/O libraries
$ sudo apt install libjpeg-dev libpng-dev libtiff-dev

Video Audio Libraries
$ sudo apt install libavcodec-dev libavformat-dev libswscale-dev libavresample-dev
$ sudo apt install libgstreamer1.0-dev libgstreamer-plugins-base1.0-dev
$ sudo apt install libxvidcore-dev x264 libx264-dev libfaac-dev libmp3lame-dev libtheora-dev
$ sudo apt install libfaac-dev libmp3lame-dev libvorbis-dev

OpenCore - Adaptive Multi Rate Narrow Band (AMRNB) and Wide Band (AMRWB) speech codec
$ sudo apt install libopencore-amrnb-dev libopencore-amrwb-dev

Cameras programming interface libs
$ sudo apt-get install libdc1394-22 libdc1394-22-dev libxine2-dev libv4l-dev v4l-utils
$ cd /usr/include/linux
$ sudo ln -s -f ../libv4l1-videodev.h videodev.h
$ cd ~

GTK lib for the graphical user functionalites coming from OpenCV highghui module
$ sudo apt-get install libgtk-3-dev

Python libraries for python3
$ sudo apt-get install python3-dev python3-pip
$ sudo -H pip3 install -U pip numpy
$ sudo apt install python3-testresources

Parallelism library C++ for CPU
$ sudo apt-get install libtbb-dev

Optimization libraries for OpenCV
$ sudo apt-get install libatlas-base-dev gfortran

Optional libraries
$ sudo apt-get install libprotobuf-dev protobuf-compiler
$ sudo apt-get install libgoogle-glog-dev libgflags-dev
$ sudo apt-get install libgphoto2-dev libeigen3-dev libhdf5-dev doxygen

Installasi OpenCV
Installasi OpenCV ini terdiri dari 2 paket, yang pertama OpenCV itu sendiri (core nya) dan yang kedua adalah file file atau library dari para contributor. Langsung saja ikuti beberapa langkah di bawah ini :
Download source file berupa opencv core dan opencv contributor dari Github
$ cd ~
$ wget -O opencv.zip https://github.com/opencv/opencv/archive/4.5.2.zip
$ wget -O opencv_contrib.zip https://github.com/opencv/opencv_contrib/archive/4.5.2.zip
Unzip kedua file tersebut
$ unzip opencv.zip
$ unzip opencv_contrib.zip

Instalasi OpenCV ini akan dilakukan di bawah virtual environment python, untuk itu pertama kita harus mempersiapkan virtual environment tersebut terlebih dahulu
$ sudo pip install virtualenv virtualenvwrapper
$ sudo rm -rf ~/.cache/pip
Edit ~/.bashrc
$ export WORKON_HOME=$HOME/.virtualenvs
$ export VIRTUALENVWRAPPER_PYTHON=/usr/bin/python3
Lanjutkan proses persiapan virtual environment
$ source /usr/local/bin/virtualenvwrapper.sh
$ mkvirtualenv cv -p python3
$ pip install numpy

Masuk ke topik utama, Installasi OpenCV:
Masuk ke dalam folder hasil ekstrak opencv, buat folder build dan kemudian masuk ke dalamnya
$ cd opencv-4.5.2
$ mkdir build
$ cd build
Masukkan baris perintah seperti di bawah ini sebagai parameter proses compiling


cmake -D CMAKE_BUILD_TYPE=RELEASE \
-D CMAKE_C_COMPILER=/usr/bin/gcc-9 \
-D CMAKE_INSTALL_PREFIX=/usr/local \
-D INSTALL_PYTHON_EXAMPLES=ON \
-D INSTALL_C_EXAMPLES=OFF \
-D WITH_TBB=ON -D WITH_CUDA=ON \
-D BUILD_opencv_cudacodec=OFF \
-D ENABLE_FAST_MATH=1 \
-D CUDA_FAST_MATH=1 \
-D WITH_CUBLAS=1 \
-D WITH_V4L=ON \
-D WITH_QT=OFF \
-D WITH_OPENGL=ON \
-D WITH_GSTREAMER=ON \
-D OPENCV_GENERATE_PKGCONFIG=ON \
-D OPENCV_PC_FILE_NAME=opencv.pc \
-D OPENCV_ENABLE_NONFREE=ON \
-D OPENCV_PYTHON3_INSTALL_PATH=~/.virtualenvs/cv/lib/python3.8/site-packages\
-D OPENCV_EXTRA_MODULES_PATH=~/SourceCode/opencv_contrib-4.5.2/modules \
-D PYTHON_EXECUTABLE=~/.virtualenvs/cv/bin/python \
-D BUILD_EXAMPLES=ON \
-D WITH_CUDNN=ON \
-D OPENCV_DNN_CUDA=ON \
-D CUDA_ARCH_BIN=7 \
-D CUDNN_LIBRARY=/usr/lib/x86_64-linux-gnu/libcudnn.so \
-D CUDNN_INCLUDE_DIR=/usr/include ..

Penjelasan Code :
Untuk beberapa baris kode, saya berikan beberapa penjelasan karena memang harus disesuaikan dengan proses installasi yang kita lakukan
-D CMAKE_C_COMPILER=/usr/bin/gcc-9 \
Disesuaikan dengan tipe gcc yang terinstall di OS
-D CMAKE_INSTALL_PREFIX=/usr/local \
Pastikan sudah memiliki folder cuda di /usr/local, atau kalau tidak gunakan symbolic link “cuda” yang mengarah ke folder instalasi cuda di bawah /usr/local
-D OPENCV_EXTRA_MODULES_PATH=~/SourceCode/opencv_contrib-4.5.2/modules \
Baris diatas menunjukkan lokasi modul modul paket opencv_contrib. Yang terpenting adalah bagian “opencv_contrib-4.5.2/modules” sedangkan bagian depan disesuaikan dimana kita meletakkan folder hasil ekstrak oencv_contrib
-D CUDA_ARCH_BIN=7 \
Nilai dibelakan tanda “sama dengan” disesuaikan dengan tipe graphic card yang kita gunakan pada PC kita. Nilai ini merujuk pada arsitektur komputasi cuda.
-D CUDNN_LIBRARY=/usr/lib/x86_64-linux-gnu/libcudnn.so \
-D CUDNN_INCLUDE_DIR=/usr/include ..
Untuk baris di atas, harus dipastikan terlebih dahulu dimana letak hasil instalasi library cudnn yang sudah kita lakukan sebelumnya.


Lanjut ke proses instalasi.
Setelah semua di ketikkan maka proses configurasi pun akan berjalan. Bila masih ada error dalam proses konfigurasi, maka dicari dulu errornya baru kemudian ulangi proses configurasi. Sebelum mengulang proses konfigurasi, sebaiknya isi folder “build” di kosongkan terlebih dahulu.

Setelah semua O.K, maka selanjutnya kita cek jumlah core di CPU kita untuk proses compiling
$ nproc
Di PC saya jumlah core nya ada 8, jadi proses compile atau instalasi selanjutnya adalah
$ make -j8
$ sudo make install
Proses ini akan memakan waktu yang cukup lumayan, tergantung spesifikasi PC kita.

Pasca Instalasi
Include hasil instalasi ke dalam library environment OS
$ sudo /bin/bash -c 'echo "/usr/local/lib" >> /etc/ld.so.conf.d/opencv.conf'
$ sudo ldconfig
Jika ingin hasil instalasi ini tersedia juga pada python secara global (tidak melalui virtual environment), maka bisa lakukan beberapa baris perintah berikut.
$ sudo cp -r ~/.virtualenvs/cv/lib/python3.8/site-packages/cv2 /usr/local/lib/python3.8/dist-packages
Edit config-3.8.py
$ sudo nano /usr/local/lib/python3.8/dist-packages/cv2/config-3.8.py

```
    PYTHON_EXTENSIONS_PATHS = [
    os.path.join('/usr/local/lib/python3.8/dist-packages/cv2', 'python-3.8')
    ] + PYTHON_EXTENSIONS_PATHS
```

Seperti yang di sebutkan dalam sumber, ada contoh program sederhana untuk melihat kinerja GPU

#include <iostream>
#include <ctime>
#include <cmath>
#include "bits/time.h"

#include <opencv2/core.hpp>
#include <opencv2/highgui.hpp>
#include <opencv2/imgproc.hpp>
#include <opencv2/imgcodecs.hpp>

#include <opencv2/core/cuda.hpp>
#include <opencv2/cudaarithm.hpp>
#include <opencv2/cudaimgproc.hpp>

#define TestCUDA true

int main() {
    std::clock_t begin = std::clock();

        try {
            cv::String filename = "image.png"; // Enter your image path
            cv::Mat srcHost = cv::imread(filename, cv::IMREAD_GRAYSCALE);

            for(int i=0; i<1000; i++) {
                if(TestCUDA) {
                    cv::cuda::GpuMat dst, src;
                    src.upload(srcHost);

                    //cv::cuda::threshold(src,dst,128.0,255.0, CV_THRESH_BINARY);
                    cv::cuda::bilateralFilter(src,dst,3,1,1);

                    cv::Mat resultHost;
                    dst.download(resultHost);
                } else {
                    cv::Mat dst;
                    cv::bilateralFilter(srcHost,dst,3,1,1);
                }
            }

            //cv::imshow("Result",resultHost);
            //cv::waitKey();

        } catch(const cv::Exception& ex) {
            std::cout << "Error: " << ex.what() << std::endl;
        }

    std::clock_t end = std::clock();
    std::cout << double(end-begin) / CLOCKS_PER_SEC  << std::endl;
}

Compile dan jalankan
$ g++ -o test test.cpp `pkg-config opencv --cflags --libs`
$ ./test


Komentar

Postingan populer dari blog ini

Akses Remote Server Jupyter dengan Anydesk

Install CUDA on Ubuntu 18.04