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 +xcuda_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
- untuk menginstal driver Nvidia menggunakan repositori sistem operasi
- untuk menginstal CUDA menggunakan metode runfile, tanpa driver Nvidia
- untuk menginstal cuDNN dengan paket .deb atau arsip .tar
- 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!