OpenCV GPU on Google Cloud
By: Andrey Senin
Tags: Nvidia Cuda, Opencv, Google Cloud Platform

Step 1. Creating a virtual machine

If this is your first virtual machine it is likely you don’t have a quota to use GPUs and need to request that. Go to “IAM & Admin > Quotas”, filter by “Service: Compute Engine API” and “GPUs” and click to “GPUs (all regions)”, “ALL QUOTAS”.

On the next image edit the new limit, provide a short comment and click “Next”:

After some time you shall receive a confirmation of the new limit.

After that you’re ready to create your first VM at “Compute Engine” > “VM instances”. For my experiment I created 4 CPU, 26 GB machine with Tesla P4 GPU. The machine runs Ubuntu 20.04 LTS with 256 GB disk:

I enabled HTTP/HTTPS traffic and turned on the display device in the settings.

When the machine is created you can click “SSH” button to proceed to the next step:

Step 2. Installing Chrome Remote Desktop

For OpenCV experiments it might be useful to have Remote Desktop/VNC enabled on the virtual machine. Chrome RDP might be a good solution if you’re using Chrome.

Before you start it is recommended to change your password by running the “passwd” command. Then we can follow the guide for the installation:

wget https://dl.google.com/linux/direct/chrome-remote-desktop_current_amd64.deb sudo apt update && sudo apt install --assume-yes --fix-broken sudo dpkg --install chrome-remote-desktop_current_amd64.deb sudo apt install --assume-yes --fix-broken sudo apt install lightdm sudo DEBIAN_FRONTEND=noninteractive apt install --assume-yes cinnamon-core desktop-base sudo bash -c 'echo "exec /etc/X11/Xsession /usr/bin/cinnamon-session-cinnamon2d" > /etc/chrome-remote-desktop-session'

sudo apt install --assume-yes cinnamon-desktop-environment sudo systemctl disable lightdm.service wget https://dl.google.com/linux/direct/google-chrome-stable_current_amd64.deb sudo dpkg --install google-chrome-stable_current_amd64.deb sudo apt install --assume-yes --fix-broken

If all is installed successfully navigate to https://remotedesktop.google.com/headless, follow the screen instructions and execute the command from the “Debian Linux” window in the virtual machine command line. If all is done correctly you shall see the new machine in the list of online machines at https://remotedesktop.corp.google.com/:

If you click the newly created VM you shall see the Ubuntu GUI:

Step 3. Installing GPU drivers

In order to use the GPU card for computation you’ll need to install the latest drivers and NVidia CUDA toolkit (see the guide for more details):

curl -O https://developer.download.nvidia.com/compute/cuda/repos/ubuntu2004/x86_64/cuda-ubuntu2004.pin sudo mv cuda-ubuntu2004.pin /etc/apt/preferences.d/cuda-repository-pin-600 sudo apt-key adv --fetch-keys https://developer.download.nvidia.com/compute/cuda/repos/ubuntu2004/x86_64/7fa2af80.pub sudo add-apt-repository "deb http://developer.download.nvidia.com/compute/cuda/repos/ubuntu2004/x86_64/ /" sudo apt update sudo apt install cuda sudo reboot sudo apt install nvidia-cuda-toolkit

Step 4. Building OpenCV

The final step is building OpenCV (and OpenCV-contrib): see the guide for more details.

First install the required packages for OpenCV:

sudo apt install cmake cmake-gui sudo apt install build-essential sudo apt install cmake git libgtk2.0-dev pkg-config libavcodec-dev libavformat-dev libswscale-dev sudo apt install python-dev python-numpy libtbb2 libtbb-dev libjpeg-dev libpng-dev libtiff-dev libdc1394-22-dev sudo apt install tesseract-ocr libgflags-dev libgoogle-glog-dev libprotobuf-dev libgtkglext1 libgtkglext1-dev vlc libavresample-dev git clone https://github.com/opencv/opencv.git git clone https://github.com/opencv/opencv_contrib.git

Then create an OpenCV build folder:

cd opencv mkdir build cd build

And run building OpenCV:

cmake -D CMAKE_BUILD_TYPE=Release -D BUILD_EXAMPLES=ON -D BUILD_opencv_java=OFF -D BUILD_opencv_python2=ON -D ENABLE_NEON=OFF -D WITH_OPENCL=OFF -D WITH_OPENMP=OFF -D WITH_FFMPEG=ON -D WITH_GSTREAMER=OFF -D WITH_GSTREAMER_0_10=OFF -D WITH_CUDA=ON -D CUDA_TOOLKIT_ROOT_DIR=/usr/local/cuda-11.0 -D WITH_GTK=ON -D WITH_VTK=OFF -D WITH_TBB=ON -D WITH_1394=OFF -D WITH_OPENEXR=OFF -D INSTALL_C_EXAMPLES=ON -D INSTALL_PYTHON_EXAMPLES=ON -D INSTALL_TESTS=OFF -D WITH_OPENGL=ON -DCUDA_ARCH_BIN=6.1 -DCMAKE_C_COMPILER=/usr/bin/gcc-8 -DOPENCV_EXTRA_MODULES_PATH=../../opencv_contrib/modules .. make -j 4

If the compilation succeed you can go to the bin folder and run one of the examples to verify it works correctly:

cd bin ./example_gpu_bgfg_segm --file=../../samples/data/vtest.avi

You should see something similar to the image below:

With the selected configuration I see about 1800 FPS on the background/foreground segmentation test with the vtest.avi video.