Toolkit Bertahan GPU untuk Era AI
(journal.hexmos.com)- Pengembangan AI tidak lagi cukup hanya dengan eksekusi berurutan ala CPU; untuk benar-benar menangani performa pelatihan dan inferensi, kita perlu memahami model pemrosesan paralel skala besar pada GPU
- CPU umumnya memiliki 2~16 core untuk kelas konsumen dan unggul dalam thread tunggal serta pekerjaan dengan percabangan kondisi, sedangkan GPU memiliki ribuan core kecil yang lebih cocok untuk operasi matriks, pemrosesan gambar, dan deep learning
- AWS menyediakan lingkungan eksekusi GPU seperti P3/P4, P5/Inf1, G4, dan Amazon SageMaker; p3.2xlarge berada di kisaran $3.06 per jam, p5.48xlarge $98.32, dan g4dn.xlarge $0.526
- NVIDIA CUDA memungkinkan developer menangani langsung alur eksekusi paralel mulai dari alokasi memori GPU, penyalinan data, eksekusi kernel, hingga kompilasi
- Contoh penjumlahan array, pembuatan Mandelbrot, dan CNN klasifikasi kucing-anjing menunjukkan cara membagi loop berurutan menjadi thread GPU; Mandelbrot turun dari 4.07 detik di CPU menjadi 0.0046 detik di GPU
Mengapa pengetahuan CPU saja tidak cukup
- Banyak developer belajar pemrograman dan pemecahan masalah dengan pendekatan berpusat pada CPU, tetapi CPU pada dasarnya bekerja dengan mengandalkan arsitektur berurutan
- CPU tradisional mengeksekusi instruksi secara linear dan mengoptimalkan sejumlah kecil core yang kuat untuk performa thread tunggal
- Saat harus menangani banyak pekerjaan sekaligus, pendekatan eksekusi berurutan membuat biaya memproses tugas satu per satu menjadi besar
- Performa memang bisa ditingkatkan dengan multithreading, tetapi filosofi desain dasar CPU tetap lebih dekat ke eksekusi berurutan
Model AI dan pemrosesan paralel
- Arsitektur AI modern seperti Transformer memanfaatkan pemrosesan paralel untuk meningkatkan performa pelatihan
- RNN bekerja secara berurutan, tetapi Transformer seperti GPT dapat memproses banyak kata sekaligus, sehingga meningkatkan efisiensi pelatihan dan kapabilitas model
- Pelatihan paralel memungkinkan model yang lebih besar, dan model yang lebih besar menjadi dasar untuk menghasilkan output yang lebih baik
- Paralelisme tidak hanya berlaku untuk pemrosesan bahasa alami, tetapi juga untuk pengenalan gambar
- AlexNet adalah contoh yang memproses banyak bagian gambar secara bersamaan untuk mengidentifikasi pola
- Karena CPU dirancang dengan fokus pada performa thread tunggal, CPU sulit mendistribusikan dan menjalankan komputasi paralel dalam jumlah besar yang dibutuhkan model AI kompleks secara efisien
Cara GPU mengurangi bottleneck
- GPU dirancang dengan struktur yang menggunakan banyak core kecil dan terspesialisasi alih-alih core CPU yang besar dan kuat
- Paralelisme GPU sangat terlihat pada workload yang mengulang jenis operasi yang sama dalam jumlah besar, seperti rendering grafis dan perhitungan matematis kompleks
- Framework deep learning seperti TensorFlow dioptimalkan untuk memanfaatkan performa GPU agar pelatihan dan inferensi model berjalan lebih cepat
- Pelatihan jaringan saraf melibatkan banyak operasi matriks, dan GPU unggul dalam memparalelkan operasi ini berkat jumlah core yang besar
Perbedaan peran CPU dan GPU
-
CPU
- CPU dirancang dengan fokus pada pemrosesan berurutan, sehingga kuat untuk pekerjaan yang mengeksekusi satu aliran instruksi secara linear
- Cocok untuk komputasi tujuan umum, tugas sistem, dan pemrosesan algoritme kompleks yang mengandung percabangan kondisi
- CPU konsumen biasanya memiliki jumlah core yang relatif sedikit, umumnya di kisaran 2~16 core
- Setiap core dapat memproses instruction set-nya sendiri secara independen
-
GPU
- GPU dirancang sebagai arsitektur paralel sehingga efisien untuk memproses banyak subtugas sekaligus
- Unggul untuk rendering grafis, perhitungan matematis kompleks, dan eksekusi algoritme yang bisa diparalelkan
- Pekerjaan dipecah menjadi unit paralel yang lebih kecil agar banyak operasi bisa diproses bersamaan
- Core GPU sering kali berjumlah ribuan dan tersusun dalam streaming multiprocessors(SMs) atau struktur serupa
- Cocok untuk pekerjaan yang menangani banyak data sekaligus, seperti pemrosesan gambar dan video, deep learning, serta simulasi ilmiah
Lingkungan GPU yang bisa dipilih di AWS
- AWS menyediakan berbagai instance GPU yang bisa digunakan untuk pekerjaan seperti machine learning
-
Instance GPU serbaguna
-
Instance yang dioptimalkan untuk inferensi
- Inferensi adalah proses memasukkan data real-time ke model AI yang telah dilatih untuk membuat prediksi atau menyelesaikan tugas
- P5 dan Inf1 ditujukan untuk inferensi machine learning yang membutuhkan latensi rendah dan efisiensi biaya
- p5.48xlarge berharga $98.32 per jam dan menyediakan 8 GPU NVIDIA H100, masing-masing dengan memori 80GB, total memori video 640GB
-
Instance yang dioptimalkan untuk grafis
- G4 instances dirancang untuk menangani pekerjaan yang intensif grafis
- Developer video game dapat menggunakan instance G4 untuk merender grafis 3D untuk game
- g4dn.xlarge berharga $0.526 per jam dan menggunakan 1 GPU NVIDIA T4 dengan memori 16GB
-
Layanan machine learning terkelola
- Amazon SageMaker adalah layanan terkelola untuk machine learning yang menyediakan akses ke instance berbasis GPU seperti P3, P4, dan P5
- SageMaker cocok untuk organisasi yang ingin memulai machine learning tanpa mengelola infrastruktur dasarnya secara langsung
- Dokumen harga Amazon SageMaker disediakan secara terpisah
Dasar penggunaan NVIDIA CUDA
- CUDA adalah platform komputasi paralel sekaligus model pemrograman yang dikembangkan NVIDIA, yang memungkinkan aplikasi berjalan lebih cepat dengan memanfaatkan akselerator GPU
- Contohnya menunjukkan alur pengembangan CUDA mulai dari alokasi memori GPU, penyalinan data, eksekusi kernel, hingga pengambilan hasil
-
Alur instalasi
- Unduh base installer dan driver installer dari CUDA
- Tambahkan variabel lingkungan berikut ke
.bashrcdi folder homeexport PATH="/usr/local/cuda-12.3/bin:$PATH"export LD_LIBRARY_PATH="/usr/local/cuda-12.3/lib64:$LD_LIBRARY_PATH"
- Jalankan perintah berikut
sudo apt-get install cuda-toolkitsudo apt-get install nvidia-gds
- Reboot sistem untuk menerapkan perubahan
-
Perintah pemeriksaan yang berguna
lspci | grep VGA: mengidentifikasi dan menampilkan GPU di sistemnvidia-smi: menampilkan informasi detail seperti utilisasi, suhu, dan penggunaan memori GPU NVIDIAsudo lshw -C display: menampilkan informasi display controller termasuk kartu grafisinxi -G: menampilkan informasi subsistem grafis termasuk GPU dan displaysudo hwinfo --gfxcard: digunakan untuk memeriksa informasi detail kartu grafis sistem
Memparalelkan penjumlahan array dengan CUDA
- Penjumlahan array adalah masalah yang cocok untuk menjelaskan paralelisasi GPU
- Contoh array adalah
A = [1,2,3,4,5,6],B = [7,8,9,10,11,12], dan hasilnyaC = [8,10,12,14,16,18] - Pendekatan CPU menjumlahkan elemen array satu per satu
- Saat data bertambah banyak, waktu pendekatan berurutan ikut meningkat, sedangkan GPU dapat menjalankan operasi seperti
1+7,2+8, dan3+9secara bersamaan - Contoh CUDA menggunakan file kernel
.cu__global__menandakan fungsi kernel yang dipanggil di GPUvectorAddmenerima tiga pointer integera,b, danclalu melakukan penjumlahan vektorthreadIdx.xmengambil indeks thread saat ini- Setiap thread menyimpan hasil penjumlahan elemen yang sesuai ke
c[i]
- Fungsi
mainberjalan dengan urutan alokasi memori GPU, penyalinan data, eksekusi kernel, lalu penyalinan hasilcudaMallocmengalokasikan memoricudaA,cudaB, dancudaCdi GPUcudaMemcpymenyalinadanbdari host ke GPUvectorAdd <<<1, sizeof(a) / sizeof(a[0])>>>menjalankan kernel- Vektor hasil
cudaCdisalin kembali dari GPU ke host
- Kompilasi dan eksekusi menggunakan perintah
nvcc - Kode lengkap disediakan
Memanfaatkan GPU untuk pembuatan gambar Python
- Pembuatan Mandelbrot set adalah pekerjaan yang menghasilkan pola visual kompleks berdasarkan perilaku angka dalam persamaan tertentu, dan sangat intensif sumber daya
- Contoh Python berbasis CPU menghitung nilai Mandelbrot dengan menelusuri setiap piksel, dan membutuhkan 4.07 detik untuk membuat gambar 1024×1536
- Versi akselerasi GPU menggunakan Numba library
- Dekorator
@jitmelakukan kompilasi Just-In-Time yang mengubah kode Python menjadi machine code cuda.jitdigunakan untuk membuatmandel_gpu, dandevice=Trueditetapkan agar berjalan di GPUmandel_kernelberjalan di CUDA GPU dan membagi pekerjaan pembuatan Mandelbrot ke thread GPU
- Dekorator
create_fractal_gpumelakukan alokasi memori GPU, pengaturan thread dan block, eksekusi kernel GPU, sinkronisasi, dan penyalinan hasil- Menggunakan
threadsperblock = (16, 16) cuda.synchronize()menunggu hingga pekerjaan GPU selesaid_image.copy_to_host(image)menyalin hasil ke sisi CPU
- Menggunakan
- Waktu eksekusi GPU adalah 0.0046 detik, jauh lebih cepat daripada kode berbasis CPU
- Kode lengkap disediakan
Melatih jaringan saraf klasifikasi kucing-anjing dengan GPU
- Untuk menunjukkan bagaimana GPU digunakan dalam AI, digunakan contoh jaringan saraf yang membedakan kucing dan anjing
- Prasyaratnya adalah CUDA dan TensorFlow
- TensorFlow dapat diinstal dengan
pip install tensorflow[and-cuda] - Dataset yang digunakan adalah Kaggle Dogs vs. Cats
- Setelah diunduh, gambar kucing dan anjing diatur ke subfolder yang berbeda dalam folder pelatihan
- TensorFlow dapat diinstal dengan
- Model menggunakan convolutional neural network(CNN)
- pandas dan numpy digunakan untuk manipulasi data
Sequentialdigunakan untuk menumpuk layer jaringan saraf secara linearConvolution2D,MaxPooling2D,Dense,Flattenadalah layer penyusun CNNImageDataGeneratordigunakan untuk augmentasi data real-time selama pelatihan
- Data pelatihan dimuat dengan
ImageDataGenerator- Untuk data pelatihan diterapkan
rescale=1./255,shear_range=0.2,zoom_range=0.2,horizontal_flip=True - Gambar input diatur ke ukuran
(64, 64), batch size 32, dan mode klasifikasi biner
- Untuk data pelatihan diterapkan
- Struktur CNN terdiri dari convolution, max pooling, flatten, layer Dense, dan output sigmoid
- Model dikompilasi dengan optimizer
adam, lossbinary_crossentropy, dan metrikaccuracy - Pelatihan dijalankan dengan
epochs=25,validation_steps=2000, lalu disimpan ke file.h5melaluiclassifier.save('trained_model.h5') - Kode inferensi memuat
trained_model.h5, mengubah ukuran gambar ke(64, 64), lalu menampilkandogjika nilai prediksi 0.5 atau lebih, jika tidak makacat - Kode lengkap disediakan
Cakupan pemanfaatan GPU
- Di era AI, kemampuan GPU sulit diabaikan, dan developer perlu memahami kapabilitas GPU dengan lebih baik
- Saat beralih dari algoritme berurutan ke algoritme yang diparalelkan, GPU menjadi alat untuk mempercepat komputasi kompleks
- Kemampuan pemrosesan paralel GPU sangat menguntungkan untuk menangani dataset skala besar dan arsitektur jaringan saraf kompleks dalam tugas AI dan machine learning
- GPU digunakan tidak hanya di ranah machine learning tradisional, tetapi juga dalam riset ilmiah, simulasi, dan pekerjaan yang intensif data
- Kemampuan pemrosesan paralel dimanfaatkan untuk memecahkan masalah di berbagai bidang seperti penemuan obat, pemodelan iklim, dan simulasi keuangan
1 komentar
Opini Hacker News
Kode dalam artikel ini salah. Kernel CUDA sama sekali tidak dipanggil: https://github.com/RijulTP/GPUToolkit/blob/f17fec12e008d0d37...
Dalam kode kompilasi JIT, 90% waktu untuk “menghitung” himpunan Mandelbrot sebenarnya dihabiskan bukan untuk perhitungannya, melainkan untuk kompilasi fungsi
Jika ingin benar-benar belajar CUDA, implementasi perkalian matriks adalah latihan yang bagus, dan tutorial yang layak dijadikan rujukan adalah https://cnugteren.github.io/tutorial/pages/page1.html dan https://siboehm.com/articles/22/CUDA-MMM
Ia menerima vektor X dan Y bertipe floating point 32-bit serta skalar A, lalu mengalikan setiap X[i] dengan A dan menambahkannya ke Y[i]: https://developer.nvidia.com/blog/six-ways-saxpy/
Artikel ini mengklaim “semua developer harus tahu”, tetapi sebenarnya lebih dekat ke tulisan tentang cara GPU digunakan dalam AI. Kebanyakan developer bukan developer AI, dan mereka juga tidak berinteraksi langsung dengan AI atau memakai GPU secara langsung
Selain itu, grafik 3D, yang merupakan alasan utama GPU ada, hampir tidak dibahas
Dengan pengetahuan dasar, Anda juga bisa lebih memahami cerita soal “AI” yang dijual ke manajer
Sikap “bidang sekitar tidak perlu dipelajari” adalah sesuatu yang sering saya lihat di sekolah. Di sisi administrasi sistem, teman-teman menganggap mereka tidak perlu tahu pemrograman, tetapi ternyata tetap butuh scripting; di sekolah pengembangan perangkat lunak, ada yang bilang tak perlu paham jaringan, tetapi beberapa tahun kemudian lowongan kerja penuh dengan DevOps
Jika artikelnya sekitar 1.500 kata, membacanya dengan serius mungkin makan waktu 12 menit, dan bahkan jika menghabiskan sekitar 2 jam untuk menjalankan contoh kodenya pun itu bukan investasi besar. Tentu saja, itu dengan asumsi artikelnya memang pengantar yang bagus
curl. Saya masih developer embedded, tetapi sejak itu saya banyak belajar backend, frontend, dan infrastruktur, dan tampaknya ada kemungkinan besar situasi serupa akan terjadi di seluruh industri dalam beberapa tahun ke depan terkait AIMenurut saya, alasan Python dominan di AI adalah karena relasi Python-C mirip dengan relasi CPU-GPU
GPU punya performa sangat bagus, tetapi sulit diprogram secara langsung, jadi orang mengakses GPU lewat pemanggilan API tingkat tinggi seperti PyTorch
C juga punya performa bagus, tetapi sulit ditulis, jadi Python dipakai sebagai lapisan abstraksi di atas C
Tidak jelas apakah orang benar-benar perlu memahami GPU sedalam itu. Kecuali jika benar-benar masuk jauh ke training atau operasi AI, dan jika Hukum Moore berakhir serta multithreading menjadi cara utama peningkatan kecepatan, kemungkinan akan muncul bahasa-bahasa baru yang disesuaikan dengan paradigma pemrograman paralel. Mojo tampak seperti titik awal ke arah itu
Dari komputasi berulang sederhana hingga semua instruksi yang di belakang layar secara cerdas memanfaatkan semua core CPU secara paralel, dan pekerjaan yang memungkinkan akan dialihkan ke GPU
Saya penasaran apakah upaya seperti ini sudah pernah ada, atau apakah ini memang memungkinkan sejak awal
Penjelasan bahwa “saat CPU menghadapi banyak tugas, ia membagi sumber daya untuk menangani tiap tugas satu per satu” terlalu menyederhanakan. Bahkan saya jadi berharap CPU masih sesederhana itu
Wajar jika artikel ini berfokus pada model pemrograman, tetapi dari sudut pandang performa, pernyataan bahwa “CPU mengeksekusi instruksi secara berurutan” pada dasarnya salah. Pipeline mengeksekusi instruksi secara paralel, ada juga SIMD, dan beberapa core bisa bersama-sama menangani masalah yang sama
Perbedaan besarnya adalah CPU menghabiskan banyak silikon dan daya untuk menangani control flow agar satu thread bisa berjalan efisien, sedangkan GPU menggunakan sumber daya itu untuk lebih banyak unit komputasi dan menjalankan sangat banyak thread guna menyembunyikan control flow dan latensi memori
Ungkapan bahwa CPU bagus untuk kode serial dan GPU bagus untuk kode paralel memang ada benarnya, tetapi itu pendekatan yang cukup kasar. Dengan asumsi anggaran daya yang mirip, di kisaran ratusan watt, CPU punya sekitar 100 “core” yang menjalankan tugas independen satu per satu, termasuk hyperthread, dan menyembunyikan latensi memori lewat prediksi cabang dan pipelining
GPU punya sekitar 100 “compute unit”, dan tiap unit menjalankan silang sekitar 80 tugas independen, menyembunyikan latensi memori dengan mengeksekusi instruksi berikutnya dari tugas lain
Istilahnya memang cukup membingungkan, dan CPU kemungkinan punya unit vektor selebar 256-bit, sementara GPU kemungkinan punya unit vektor selebar 2048-bit, tetapi jika dilihat dari agak jauh, kedua arsitektur ini tampak cukup mirip
Namanya bisa Xeon Chi
Sementara sebagian besar bahasa pemrograman dirancang untuk pemrosesan berurutan seperti CPU, kalau Erlang/Elixir dianggap dirancang untuk paralelisme seperti GPU, saya jadi penasaran apakah Nx / Axon akan naik daun: https://github.com/elixir-nx/
Perlu panduan pembelian. Ingin tahu minimal harus mengeluarkan berapa, dan pilihan terbaik di tiap rentang anggaran. Masalahnya, informasi itu kadang berubah, dan saya tidak tahu apakah ada sumber yang terus diperbarui
https://colab.google/
https://www.kaggle.com/docs/notebooks
https://www.paperspace.com/gradient/free-gpu
Jadi kita kembali lagi ke artikel clickbait model “yang harus diketahui semua developer”
Saya suka tulisan yang menghadapi kompleksitas secara langsung, dan karena saya cukup paham baik pendekatan kuantitatif maupun detail kualitatif di bidang seperti perangkat keras komputer, saya senang melihat tulisan yang benar-benar menjelaskan detail suatu bidang
Misalnya, terlepas dari apakah “What every programmer should know about memory” memang harus diketahui semua programmer, programmer yang baik setidaknya perlu punya gambaran tentang bagaimana komputer benar-benar bekerja. Inti penting yang bisa diambil dari tulisan itu, yaitu locality, sering muncul secara alami dalam kode yang cepat, mudah diikuti, dan cocok dengan masalahnya
Tulisan yang bagus, tetapi AWS P5 instance jelas lebih ditujukan untuk pelatihan, bukan inferensi, bersama P4d dan P4de. Jenis instance yang lebih cocok untuk inferensi adalah G4dn dan G5, yang masing-masing memakai GPU T4 dan A10G
Saya hampir benar-benar baru dalam pemrograman GPU, tetapi tulisan ini menyenangkan untuk dibaca. Menakjubkan bahwa sekarang melatih jaringan saraf sederhana “anjing atau kucing” bisa semudah ini