Selalu frustrasi kehilangan banyak waktu saat menerapkan berbagai tutorial online tentang cara menginstal driver Nvidia, CUDA, cuDNN, atau cara mengkompilasi sumber TensorFlow dengan dukungan GPU yang menyebabkan kegagalan fungsi atau kesalahan kompilasi. Saya sendiri, saya kehilangan waktu berhari-hari untuk mencoba menginstal alat dan perpustakaan ini dengan benar meskipun tutorial resminya tidak berfungsi.

Di sini, saya ingin berbagi dengan komunitas pembelajaran mesin dan komputasi GPU tentang apa yang berhasil untuk konfigurasi saya. Saya yakin tutorial ini dapat digeneralisasikan ke banyak konfigurasi, sistem operasi Linux, dan versi CUDA.

Tujuan akhir tutorial ini adalah mengkompilasi TensorFlow berdasarkan sumber yang mendukung GPU. Kami ingin memulai dari awal. Kita kemudian perlu melalui langkah-langkah berikut:

1. Cara membersihkan komputer Anda dari instalasi sebelumnya
2. Cara menginstal driver Nvidia dengan mudah
3. Cara menginstal CUDA Toolkit secara terpisah dari instalasi driver
4. Cara instal file cuDNN di komputer Anda
5. Cara mengkompilasi TensorFlow 2.1 dari sumber yang mendukung GPU (dengan beberapa proses debug)
6. Cara menggeneralisasi tutorial ini ke versi lain

Apa konfigurasi saya? OS saya adalah Ubuntu 20.04 LTS (alias Focal Fossa) dan kartu grafis saya adalah Quadro RTX 5000 Mobile.

1. Cara membersihkan komputer Anda dari instalasi sebelumnya

Pertama-tama kita perlu membersihkan sistem kita dari driver grafis dan instalasi CUDA sebelumnya. Di Ubuntu 20.04, ini dapat dilakukan dengan mudah dengan perintah berikut yang saya temukan di artikel ini. Asumsinya di sini adalah Anda menginstal CUDA Toolkit menggunakan repositori Ubuntu atau file .deb yang tersedia di situs web Nvidia.

# Remove already installed Nvidia/CUDA packages
sudo rm /etc/apt/sources.list.d/cuda*
sudo apt remove --autoremove nvidia-cuda-toolkit
sudo apt remove --autoremove nvidia-*
# Remove remaining Nvidia files and dependencies
sudo apt purge nvidia*
sudo apt autoremove
sudo apt autoclean
# Remove remaining CUDA files
sudo rm -rf /usr/local/cuda

Jika Anda menginstal driver Nvidia dan/atau CUDA Toolkit dengan file run (.sh), Anda perlu menggunakan

# cuda-uninstaller
/usr/local/cuda/bin/cuda-uninstaller

untuk menghapus segala sesuatu yang berhubungan dengan CUDA. Pada titik ini, perintah seperti

cat /proc/driver/nvidia/version
nvidia-smi
nvcc --version
ls /usr/local/cuda/

harus memberikan kesalahan seperti "perintah tidak ditemukan" atau "tidak ada file atau direktori". Sekarang saatnya untuk menyelesaikan langkah ini dengan melakukan reboot dengan

sudo reboot

2. Cara menginstal driver kartu grafis Nvidia

Catatan: Boot Aman komputer Anda harus dinonaktifkan untuk menginstal driver kartu grafis dengan benar. Untuk mengetahui apakah benar atau tidak, reboot mesin Anda dan tekan tombol "F10" atau "F12" atau "Suppr" (tergantung konfigurasi Anda) untuk menampilkan menu boot komputer Anda. Status Boot Aman harus dapat dibaca dari titik ini atau dalam submenu.

Saya menyarankan untuk menginstal driver kartu grafis Nvidia dari repositori default sistem operasi Anda. Untuk melakukannya, pertama-tama kita perlu memperbarui daftar paket yang tersedia di repositori dan memperbarui paket yang diinstal

sudo apt update && sudo apt upgrade

Ini mungkin memerlukan waktu tergantung pada kali terakhir Anda mengupgrade paket Anda.

Salah satu cara untuk membuat daftar driver Nvidia yang tersedia di repositori Anda adalah dengan mengetik

sudo apt search nvidia-driver
# or
ubuntu-drivers devices

Daftar driver Nvidia akan muncul dan saya sarankan menginstal versi tertinggi yang tersedia. Pada tanggal penulisan, dalam kasus saya versi 510.47.03, maka:

sudo apt install nvidia-driver-510

Catatan: Anda tidak perlu terlalu memikirkan versi driver dan kompatibilitas CUDA. Seperti disebutkan di situs web Nvidia, driver terbaru kompatibel dengan versi CUDA sebelumnya, artinya CUDA 10.2 harus bekerja dengan versi driver 510.47.03 misalnya.

Reboot segera diperlukan lagi setelah instalasi:

sudo reboot

Pada titik ini, perintah “nvidia-smi” atau “cat /proc/driver/nvidia/version” akan memberikan sesuatu seperti

menunjukkan bahwa instalasi driver berhasil. Jika Anda tidak dapat memperoleh hasil ini, saya sarankan untuk kembali ke langkah 1 dan ulangi semuanya. Jika ini masih tidak berhasil dalam instalasi, Anda harus mempertimbangkan untuk menginstal ulang Ubuntu (jangan lupa untuk menyimpan data Anda).

3. Cara menginstal CUDA Toolkit

Pada artikel ini, kami berupaya mengompilasi sumber TensorFlow 2.1. Di situs web TensorFlow, mereka merekomendasikan untuk menginstal CUDA 10.1 ketika ingin membuat TensorFlow 2.1 dari sumber:

Perangkat CUDA tersedia online. Karena kami memerlukan versi CUDA “lama”, kami perlu mencarinya di dalam arsip.

CUDA 10.1 terakhir adalah versi “pembaruan 2”. Dengan mengkliknya, kita perlu menjawab beberapa pertanyaan tentang sistem operasi kita dan metode yang kita inginkan untuk menginstal toolkit tersebut.

Untuk Ubuntu 20.04, seseorang harus memilih versi Ubuntu 18.04. Di sini, saya yakin cara paling sederhana untuk menginstal CUDA adalah dengan memilih metode runfile (lokal). Perintahnya

# Download the runfile
wget https://developer.download.nvidia.com/compute/cuda/10.1/Prod/local_installers/cuda_10.1.243_418.87.00_linux.run
# Give the permission to execute the runfile
sudo chmod +x cuda_10.1.243_418.87.00_linux.run
# Run it
sudo sh cuda_10.1.243_418.87.00_linux.run

akan mengunduh runfile CUDA 10.1, menjadikannya dapat dieksekusi dan meluncurkan instalasi. Namun, untuk saat ini, karena kami tidak memiliki versi GCC yang benar di OS kami, kami harus mengamati pesan kesalahan ini:

Failed to verify gcc version. See log at /var/log/cuda-installer.log for details.

Kita kemudian perlu menginstal kompiler GCC versi 7 dan memberi tahu OS bahwa kita ingin menggunakan versi ini secara default saat menggunakan perintah "gcc". Secara default, versi GCC dari Ubuntu 20.04 adalah 9.3.0. Catatan: versi GCC yang tersedia di komputer Anda dapat diperiksa

ls /usr/bin/gcc*

Kita dapat mencapai tujuan ini dengan perintah:

# Install gcc 7.5.0
sudo apt install gcc-7 g++-7
# Remove any previous configuration of gcc and g++ command with 
# update-aternatives
sudo update-alternatives --remove-all gcc
sudo update-alternatives --remove-all g++
# Link the command gcc with the first version "7"
sudo update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-7 20
# Link the command gcc with the second version "9"
sudo update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-9 10
# Same with g++ command
sudo update-alternatives --install /usr/bin/g++ g++ /usr/bin/g++-7 20
sudo update-alternatives --install /usr/bin/g++ g++ /usr/bin/g++-9 10
# Link the cc/c++ command to the gcc/g++ ones
sudo update-alternatives --install /usr/bin/cc cc /usr/bin/gcc 30
sudo update-alternatives --set cc /usr/bin/gcc
sudo update-alternatives --install /usr/bin/c++ c++ /usr/bin/g++ 30
sudo update-alternatives --set c++ /usr/bin/g++

Perintah update-alternatives memungkinkan untuk mengelola versi berbeda dari satu perintah/alat (baca manual untuk informasi lebih dalam). Jika karena alasan tertentu, Anda perlu beralih kembali ke versi GCC yang lain, Anda selalu dapat mengetik

sudo update-alternatives — config gcc

dan pilih versi yang bagus. Perintah untuk mendapatkan versi compiler GCC yang digunakan

gcc --version

harus memberi

Mari kita kembali ke instalasi CUDA kita…

sudo sh cuda_10.1.243_418.87.00_linux.run

sekarang harus bekerja. Pertama-tama, lisensi Nvidia akan terbuka untuk menggunakan CUDA Toolkit: terima dengan mengetik "accept" dan tombol Enter. Menu baru akan muncul. Ini memberi Anda pilihan untuk menginstal CUDA Toolkit bersama dengan driver GPU (sebenarnya, versi 418.87), sampel dan dokumentasi CUDA. Anda sebaiknya tidak memilih driver Nvidia karena kami telah menginstalnya. Selain driver, saya sarankan untuk menginstal semuanya:

Instalasi mungkin memerlukan waktu beberapa saat. Setelah sedikit reboot komputer Anda, Anda masih perlu menambahkan jalur perpustakaan CUDA Anda di dalam .bashrc atau .profile Anda. File CUDA secara default ada di folder /usr/local/:

Tambahkan garis

export PATH=/usr/local/cuda-10.1/bin${PATH:+:${PATH}}
export LD_LIBRARY_PATH=/usr/local/cuda-10.1/lib64${LD_LIBRARY_PATH:+:${LD_LIBRARY_PATH}}

ke akhir file .bashrc Anda, misalnya

nano ~/.bashrc

dan jangan lupa perbarui terminal Anda dengan jalur baru ini terima kasih

source ~/.bashrc

Selamat, Anda berhasil menginstal CUDA di komputer Anda! Anda sekarang seharusnya dapat menjalankan perintah

nvcc --version

dan untuk mendapatkan sesuatu seperti

Satu cara yang lebih teliti untuk memeriksa apakah CUDA terpasang dengan baik adalah dengan membuat sampel CUDA. Bangunan ini akan menggunakan setiap perpustakaan CUDA melalui berbagai contoh kode: jika kesalahan muncul, mungkin karena CUDA tidak diatur dengan benar. Mari salin sampel CUDA dalam direktori home Anda dengan:

cp -r /usr/local/cuda/samples/ ~/cuda_samples

Untuk membuat sampel CUDA, kita perlu mengunduh beberapa dependensi pihak ketiga

sudo apt install freeglut3-dev build-essential libx11-dev     libxmu-dev libxi-dev libglu1-mesa libglu1-mesa-dev libfreeimage-dev

dan hanya menggunakan

cd ~/cuda_samples
make

Proses ini akan memakan waktu beberapa menit hingga selesai: mungkin Anda boleh membiarkan komputer Anda sendiri dan menyiapkan serta minum kopi atau teh tergantung selera Anda :)

Pada akhirnya, cukup periksa laporan deviceQuery secara keseluruhan

./bin/x86_64/linux/release/deviceQuery

Laporan ini, selain beberapa informasi kuantitatif tentang komputasi GPU Anda, akan ditampilkan di bagian akhir:

Result = PASS

Sekarang, Anda dapat yakin bahwa CUDA telah terinstal dengan benar.

4. Cara menginstal file cuDNN

Seperti yang ditunjukkan di atas, kompilasi sumber TensorFlow 2.1 memerlukan cuDNN versi 7.6. File cuDNN tersedia di situs web Nvidia untuk arsip cuDNN: di sana, kita akan menemukan paket .deb untuk cuDNN 7.6.5 dan CUDA 10.1.

Untuk Ubuntu 20.04, file Ubuntu 18.04 akan kembali berfungsi. Kita perlu mendownload semuanya, yaitu Runtime dan Developper Library serta Contoh Kode dan Panduan Pengguna (total 3 paket .deb)

Untuk melakukannya, Anda perlu membuat akun Nvidia. Setelah formalitas ini, di folder unduhan Anda, buat saja

sudo dpkg -i libcudnn7*

untuk menyalin semua perpustakaan cuDNN di komputer Anda. File perpustakaan cuDNN ada di /usr/local/cuda/. Salah satu cara untuk memeriksa instalasi file cuDNN adalah dengan membuat sampel cuDNN. Salin sampel di direktori home Anda dengan

cp -r /usr/src/cudnn_samples_v7/ ~/cudnn_samples

dan mengetik

cd cudnn_samples/mnistCUDNN/
make
./mnistCUDNN

untuk membuat sampel cuDNN dan memeriksa prosesnya berjalan dengan baik. Setelah perhitungan cepat, Anda akan memperolehnya

Test passed!

Selamat (lagi)! cuDNN diinstal dengan benar di mesin Anda :)

5. Cara mengkompilasi TensorFlow dari sumbernya

Pekerjaan sebenarnya dimulai di sini. Mari bersiap untuk pertempuran besar ini.

Catatan: Saya menyarankan untuk membaca seluruh tutorial yang tersedia di "situs web" TensorFlow sebelum melanjutkan dengan tutorial saya sendiri. Ini akan memberi Anda langkah-langkah umum untuk mengkompilasi sumber.

Persyaratan pertama adalah membuat lingkungan virtual Python menggunakan kerangka lingkungan favorit Anda. Saya pribadi menyukai manajer lingkungan Anaconda. Mari kita bangun dan aktifkan dengan

conda create -n tfsource python=3.6
conda activate tfsource

Lingkungan yang disebut “tfsource” akan menggunakan Python 3.6, seperti yang direkomendasikan oleh situs TensorFlow. Kami tahu perlunya menginstal dependensi kompilasi. Berkat Conda, kita hanya perlu melakukannya

pip install six numpy==1.18.5
pip install keras-preprocessing --no-deps

Catatan: versi Numpy itu penting. Seperti disebutkan di sini, versi Numpy yang lebih baru menyebabkan kesalahan “python:bfloat16_lib” selama kompilasi sumber karena masalah tipe float Python. Saya rasa masalah ini sudah tidak ada lagi pada TensorFlow versi terbaru, namun waspadai kemungkinan sumber masalahnya.

Terakhir, kita perlu mendownload versi Bazel yang tepat yang akan mengelola kompilasi semua sumber TensorFlow. Di situs TensorFlow, disarankan untuk menggunakan Bazel versi 0.27.1 untuk melakukan kompilasi. Namun, kompilasi juga dapat dilakukan menggunakan versi 0.29.1, seperti yang disebutkan dalam file konfigurasi.py sumber (kami akan kembali ke file ini nanti).

Pemasang Bazel tersedia di antara “rilis Bazel di GitHub”. Kami akan mengunduh penginstal runfile untuk linux-x86_64:

Untuk menginstal Bazel, cukup ketik folder unduhan Anda

chmod +x bazel-0.29.1-installer-linux-x86_64.sh
sudo ./bazel-0.29.1-installer-linux-x86_64.sh

Runfile memerlukan hak sudo untuk menginstal Bazel. Setelah instalasi, perintahnya

bazel --version

harus memberi

Mari kita rekap. Kami menginstal driver Nvidia terbaru dan stabil, GCC 7.5, CUDA 10.1, cuDNN 7.6.5, Python 3.6, dan Bazel 0.29.1. Artinya semua Ksatria yang mengkompilasi Grail TensorFlow 2.1 berkumpul di Meja Bundar. Sekarang saatnya mendownload sumber TensorFlow. Tutorial situs TensorFlow memberikan perintah

git clone https://github.com/tensorflow/tensorflow.git
cd tensorflow
git checkout r2.1

untuk mengunduh sumber dan memilih cabang versi 2.1 di antara rilis. Kompilasi ini didorong secara global oleh skrip konfigurasi dalam direktori tensorflow. Tepatnya, ada dua versi skrip konfigurasi ini, skrip bash dan skrip Python. Luncurkan konfigurasi dengan

./configure
# or
python configure.py

Skrip akan meminta berbagai jenis dukungan yang Anda perlukan. Dalam kasus saya, saya hanya memerlukan XLA JIT (untuk akselerasi perhitungan) dan dukungan GPU. Proses konfigurasinya terlihat seperti ini:

Seperti yang Anda lihat, semuanya hampir secara default kecuali dukungan CUDA. Kami sekarang dapat memulai kompilasi dengan

bazel build --config=cuda --config=v2 //tensorflow/tools/pip_package:build_pip_package

Dua opsi “cuda” dan “v2” menunjukkan kepada bazel bahwa kami memang menginginkan dukungan CUDA dan bahwa kami sedang mengkompilasi TensorFlow yang versinya lebih rendah atau tepatnya 2.0. Sayangnya, kesalahan ini mungkin terjadi saat kompilasi

error: ambiguating new declaration of 'long int gettid()'

Seperti yang dijelaskan di sini, masalahnya berasal dari ketidakcocokan yang disebabkan oleh versi GNU C Library (glibc) yang salah pada definisi fungsi gettid. Untuk mengatasi kesalahan yang sangat terbatas ini, sebenarnya ada tambalan, yang ditulis oleh Liu Jianjun, yang awalnya dapat ditemukan di utas GitHub yang dibagikan di atas. Sayangnya, itu sudah kedaluwarsa. Untungnya, dan terima kasih kepada Vladislav Klim, patch telah disimpan dan direproduksi dan dapat diunduh dengan:

wget https://raw.githubusercontent.com/Desklop/building_tensorflow/master/Add-grpc-fix-for-gettid.patch

Patch ini harus ditempatkan di direktori sumber tensorflow. Setelah itu, terapkan menggunakan

patch -p1 <Add-grpc-fix-for-gettid.patch

Sekarang, perintah bazel

bazel build --config=cuda --config=v2 //tensorflow/tools/pip_package:build_pip_package

harus bekerja. Prosesnya akan memakan waktu: bagi saya, butuh waktu satu jam. Tergantung pada konfigurasi perangkat keras Anda, mungkin diperlukan waktu lebih lama. Waktunya istirahat…

Setelah kompilasi selesai, Anda dapat membuat paket wheel dari TensorFlow yang baru saja Anda kompilasi. Hal ini dilakukan dengan

./bazel-bin/tensorflow/tools/pip_package/build_pip_package /tmp/tensorflow_pkg

Terakhir (!), Anda dapat menginstal paket TensorFlow menggunakan pip with

pip install /tmp/tensorflow_pkg/tensorflow-2.1.4-cp36-cp36m-linux_x86_64.whl

seperti perpustakaan Python lainnya. Tindakan ini tidak hanya akan menginstal TensorFlow 2.1.4, tetapi juga dependensi TensorFlow. Perintah

pip show tensorflow

harus memberi

Mari kita coba fungsi TensorFlow yang bergantung pada GPU! Jenis

python -c "import tensorflow as tf; print(\"Num GPUs Available: \", len(tf.config.list_physical_devices('GPU')))"

dan tekan Enter. Anda harus melihat

artinya perpustakaan CUDA dimuat dengan benar, dan

hasil yang diharapkan dari perintah python yang kami gunakan. Tes lain pada saat ini seharusnya berhasil.

Menikmati! :)))

6. Dan untuk versi lainnya?

Untuk versi CUDA/TensorFlow lainnya, saya sarankan untuk mengikuti tabel kompatibilitas yang tersedia di situs TensorFlow:

Perlu diingat bahwa agar berhasil, Anda harus memiliki kecocokan yang baik antara versi GCC, Python, Bazel, cuDNN, CUDA, dan TensorFlow. Tabel ini menunjukkan kepada Anda apa yang sudah berfungsi untuk versi tertentu TensorFlow atau CUDA.

Saya juga merekomendasikan untuk mengikuti semangat umum dari tutorial ini

  1. untuk menginstal driver Nvidia menggunakan repositori sistem operasi
  2. untuk menginstal CUDA menggunakan metode runfile, tanpa driver Nvidia
  3. untuk menginstal cuDNN dengan paket .deb atau arsip .tar
  4. untuk menginstal Bazel menggunakan runfile dan mencoba mengkompilasi TensorFlow

Kompilasi pasti akan memberikan beberapa kesalahan, dan pada titik ini, mesin pencari favorit Anda adalah teman terbaik Anda, serta perintahnya

nvidia-smi
nvcc --version
gcc --version
bazel --version

yang sangat membantu untuk menemukan asal muasal suatu masalah. Kompilasi sampel CUDA dan cuDNN juga sangat berguna untuk mengontrol pemasangan kedua alat ini dengan benar.

Banyak pengembang dan peneliti telah mencoba apa yang ingin Anda capai: solusi ada di internet. Jangan ragu untuk membuat topik Anda sendiri: orang-orang akan membantu Anda.

Punya iman!