15 poin oleh GN⁺ 2025-02-22 | 1 komentar | Bagikan ke WhatsApp
  • GPU adalah prosesor paralel berskala besar dengan ribuan core, yang dirancang untuk menangani banyak tugas secara bersamaan
  • CPU unggul dalam tugas yang kompleks dan berurutan, tetapi jumlah tugas yang dapat diproses sekaligus terbatas
  • Sebaliknya, GPU memiliki keunggulan dalam memproses data dalam jumlah besar dengan cepat dengan menangani pekerjaan secara paralel melalui ribuan thread
  • Sebagai contoh, GPU NVIDIA RTX 4090 memiliki 16.384 CUDA core, dibandingkan dengan 16~24 core pada CPU kelas atas
  • Setiap core GPU lebih lambat daripada core CPU, tetapi pemrosesan paralel dari banyak core membuatnya cocok untuk komputasi skala besar seperti operasi matriks

CUDA dan Python

  • CUDA (Compute Unified Device Architecture) dari NVIDIA adalah platform sekaligus ekstensi C++ yang memungkinkan penulisan program yang berjalan di GPU
  • CUDA menyediakan model pemrograman dan API yang memungkinkan developer menulis kode yang berjalan langsung di GPU
  • Dengan ini, pekerjaan yang dapat diparalelkan dapat di-offload dari CPU ke GPU untuk meningkatkan performa
  • Developer Python dapat memanfaatkan akselerasi GPU menggunakan alat seperti Numba
  • Numba adalah compiler Python yang mengompilasi kode Python agar dapat berjalan pada GPU yang mendukung CUDA
  • Dengan demikian, developer Python dapat mulai menggunakan komputasi terakselerasi GPU dengan mudah hanya dengan sedikit sintaks dan istilah baru
  • CUDA Python menyediakan wrapper Cython/Python untuk CUDA driver dan runtime API sehingga developer Python dapat memanfaatkan komputasi paralel GPU
  • CUDA Python dapat diinstal melalui PIP dan Conda

Struktur Thread dan Block di CUDA

  • Dalam CUDA, kernel adalah fungsi yang berjalan di GPU; ketika kernel dijalankan, ratusan atau ribuan thread paralel akan berjalan secara bersamaan untuk memproses data yang berbeda-beda
  • Model ini disebut model SIMT (Single-Instruction Multiple-Thread)
  • Thread disusun dalam warp (kelompok 32 thread), dan warp dikelompokkan menjadi block
  • Setiap block dijalankan pada streaming multiprocessor (SM), dan SM memiliki sumber daya terbatas (register, shared memory, dan sebagainya)
  • Ukuran block memengaruhi alokasi sumber daya ini dan jumlah warp yang dapat berjalan secara bersamaan (occupancy)
  • Dengan mengatur jumlah dan ukuran thread block secara tepat, sumber daya GPU dapat dimanfaatkan secara efisien

Manajemen Memori dan Optimasi

  • Dalam pemrograman CUDA, manajemen memori antara CPU (host) dan GPU (device) harus dilakukan secara eksplisit
  • Alur umumnya adalah sebagai berikut:
    • alokasi memori GPU (cudaMalloc)
    • menyalin data dari host ke device (cudaMemcpy)
    • menjalankan kernel
    • menyalin hasil dari device ke host (cudaMemcpy)
    • membebaskan memori GPU (cudaFree)
  • Shared memory adalah memori on-chip yang memungkinkan thread dalam satu block berbagi data dengan cepat, sehingga dapat meningkatkan kecepatan akses memori
  • Sinkronisasi antar-thread diimplementasikan menggunakan __syncthreads(), yang membantu mencegah race condition

Custom CUDA Kernel untuk LLM

  • Dalam pekerjaan large language model (LLM), custom CUDA kernel dikembangkan untuk menggabungkan beberapa operasi ke dalam satu kernel guna mengurangi memory overhead dan meningkatkan efisiensi
  • Sebagai contoh, FlashAttention mengoptimalkan self-attention pada Transformer dengan mengurangi operasi baca dan tulis memori sehingga efisiensi meningkat secara signifikan
  • FlashAttention memanfaatkan shared memory untuk melakukan tiling komputasi, sehingga mampu mencapai efisiensi tinggi bahkan pada sequence yang panjang
  • Melalui optimasi semacam ini, masalah bottleneck bandwidth memori dalam deep learning dapat diatasi

Perbandingan Implementasi PyTorch dan CUDA

  • Di PyTorch, operasi GPU dapat dilakukan dengan mudah melalui abstraksi tingkat tinggi
  • Sebagai contoh, operasi penjumlahan dua vektor dapat diimplementasikan dengan sederhana sebagai berikut:
import torch  
  
# GPU에서 두 개의 큰 벡터 생성  
a = torch.rand(1000000, device='cuda')  
b = torch.rand(1000000, device='cuda')  
  
# 요소별로 더하기  
c = a + b  
  • Namun, ketika optimasi performa diperlukan, custom kernel dapat ditulis dengan menggunakan CUDA secara langsung
  • Dengan CUDA, pola akses memori, konfigurasi thread, pemanfaatan shared memory, dan lainnya dapat diatur secara rinci untuk memaksimalkan performa
  • Sebagai contoh, implementasi CUDA dari FlashAttention mengoptimalkan akses memori dan melakukan tiling komputasi ke shared memory untuk meningkatkan performa
  • Melalui optimasi tingkat rendah seperti ini, performa yang lebih tinggi dapat dicapai dibanding implementasi tingkat tinggi di PyTorch

Kesimpulan

  • Dengan memanfaatkan kemampuan pemrosesan paralel GPU, pemrosesan data skala besar dan komputasi kompleks dapat dilakukan secara efisien
  • CUDA adalah platform yang memungkinkan performa GPU dimanfaatkan semaksimal mungkin, dan developer Python juga dapat memperoleh manfaat CUDA melalui alat seperti Numba
  • Dengan memahami struktur thread dan block di CUDA, teknik manajemen memori, dan lainnya, pemrograman GPU yang lebih efisien dapat dilakukan
  • Khususnya di bidang seperti deep learning, performa dapat dimaksimalkan dengan menulis custom CUDA kernel
  • Bahkan saat menggunakan framework tingkat tinggi seperti PyTorch, performa yang lebih tinggi tetap dapat dikejar melalui optimasi CUDA tingkat rendah bila diperlukan

1 komentar

 
GN⁺ 2025-02-22
Komentar Hacker News
  • Pertanyaan bodoh: sebagai engineer, mungkinkah mendalami level rendah CUDA atau arsitektur GPU tanpa mempelajari sisi matematis AI? Jika ya, bagaimana cara memulainya? Rasanya perlu belajar optimisasi dan alasan GPU digunakan untuk komputasi tertentu

    • Pertanyaan paralel: saat bekerja sebagai data engineer, saya selalu penasaran apakah mungkin masuk ke MLE atau AI data engineering tanpa tahu AI/ML. Saya pikir cukup tahu bentuk datanya saja, tetapi semua deskripsi pekerjaan MLE yang saya lihat sejauh ini menyebutkan perlunya latar belakang AI
  • Artikel yang sangat bagus. Kuis inline (QnA) yang tampaknya dibuat AI sangat berguna untuk menguji pemahaman. Saya berharap fitur ini ada di semua tutorial

  • Saya penasaran apakah semua tutorial CUDA ditujukan untuk AI, atau ada juga misalnya untuk komputasi ilmiah umum. Sepertinya akan menyenangkan mencoba hal-hal seperti aliran udara di atas sayap untuk high-performance computing

  • Terima kasih sudah membagikannya, saya menikmati membacanya. Ada sedikit pertanyaan terkait: saya penasaran apakah ada wawasan tentang bagaimana DeepSeek membuat eksekusinya lebih efisien dengan melewati CUDA

    • Saya selalu terkejut bahwa CUDA, sebagai pustaka inti yang dikembangkan selama sangat lama, masih punya ruang untuk perbaikan. Terutama sampai-sampai tim pengembang baru bisa menutup kesenjangan itu sendiri
  • Jika Jensen memberi, Guido mengambil

  • Buku ini: "Programming Massively Parallel Processors" tampaknya dibuat khusus untuk orang yang berpindah dari arsitektur CPU ke GPU

  • Juga, silakan lihat https://github.com/rust-gpu/rust-gpu dan https://github.com/rust-gpu/rust-cuda

  • Tautan terkait: https://sakana.ai/ai-cuda-engineer/ dan https://reddit.com/r/MachineLearning/…

  • Saya penasaran apakah ada yang punya gambaran tentang apa yang berubah belakangan ini sehingga simulasi yang dulu hanya bisa dilakukan di CPU kini bisa dijalankan sepenuhnya di GPU (misalnya isaac sim)

  • Karena ini ada di situs web PySpur, saya penasaran apakah ada yang punya pengalaman dengan alat UI untuk agen AI seperti PySpur dan n8n. Saya sedang mencari sesuatu yang bisa membantu membuat prototipe beberapa ide untuk bersenang-senang. Karena harus self-hosting ($), saya lebih suka sesuatu yang relatif mudah dikonfigurasi seperti Open Hands