Peluncuran terbaru dari go-attention, sebuah implementasi murni Go untuk mekanisme attention dan layer transformer, telah memicu perdebatan signifikan di dalam komunitas pengembang tentang keterbatasan kinerja Go untuk tugas-tugas yang membutuhkan komputasi intensif seperti machine learning.
Meskipun perpustakaan ini bertujuan menyediakan implementasi yang bersih tanpa ketergantungan eksternal, umpan balik komunitas menunjukkan bahwa perpustakaan ini mungkin menghadapi tantangan kinerja yang substansial dibandingkan dengan alternatif dalam bahasa pemrograman yang memiliki dukungan lebih baik untuk akselerasi perangkat keras.
Kekhawatiran Kinerja Mendominasi Diskusi
Para pengembang dalam komunitas telah mengangkat kekhawatiran serius tentang implikasi kinerja dari implementasi mekanisme attention dalam Go murni. Beberapa komentator menunjukkan bahwa Go tidak memiliki dukungan SIMD (Single Instruction, Multiple Data) native, yang sangat penting untuk operasi vektor dan matriks yang menjadi tulang punggung model transformer. Seorang pengembang mencatat bahwa Go tidak dapat diterima kecepatannya ketika berkaitan dengan matematika dan tanpa instruksi CPU SIMD, implementasi tersebut bisa menjadi lebih lambat beberapa kali lipat dibandingkan dengan kode yang setara di C, C++, Rust, atau bahkan Python dan Java (yang biasanya memanggil pustaka C/C++ yang dioptimalkan).
Ketiadaan dukungan GPU/CUDA dalam perpustakaan ini juga disorot sebagai keterbatasan signifikan, karena implementasi transformer modern sangat bergantung pada akselerasi GPU untuk kinerja praktis. Beberapa pengembang menyarankan bahwa menggunakan binding Go untuk pustaka yang sudah mapan seperti llama.cpp akan menjadi pendekatan yang lebih pragmatis untuk kasus penggunaan produksi.
Keterbatasan Kinerja yang Disoroti oleh Komunitas:
- Kurangnya dukungan SIMD (Single Instruction, Multiple Data) asli
- Tidak ada akselerasi GPU/CUDA
- Kode skalar yang beroperasi pada nilai fp64 tunggal
- Berpotensi "lebih lambat beberapa kali lipat" dibandingkan implementasi C/C++/Rust
Alternatif yang Disarankan:
- Menggunakan binding Go untuk llama.cpp
- Mengimplementasikan bagian kritis dalam assembly Go (Goasm)
- Menggunakan paket khusus seperti viterin/vek atau kelindar/simd
- Menggunakan Go sebagai generator kode JIT dengan cgo
Pendekatan Alternatif dan Solusi Sementara
Beberapa pengembang menawarkan solusi potensial untuk masalah kinerja ini. Salah satu saran melibatkan penggunaan dukungan assembly Go (Goasm) untuk mengimplementasikan operasi matematika kritis. Yang lain menyebutkan paket Go yang sudah ada seperti viterin/vek atau kelindar/simd yang dapat membantu meningkatkan kinerja melalui pemanfaatan SIMD yang lebih baik.
Pendekatan alternatif yang menarik diusulkan oleh seorang pengembang yang menjelaskan penggunaan Go sebagai generator kode JIT, menghubungkan hasil secara dinamis, dan melompat ke dalamnya dengan cgo untuk mencapai kinerja yang lebih baik yang dengan mudah memenuhi unit matematika vektor CPU. Ini menyoroti solusi kreatif yang sedang dieksplorasi pengembang untuk mengatasi keterbatasan kinerja native Go untuk operasi matematika.
Nilai Edukasi Meskipun Ada Masalah Kinerja
Meskipun ada kekhawatiran kinerja, beberapa anggota komunitas menghargai nilai edukasi dari implementasi tersebut. Seorang komentator mencatat bahwa perpustakaan ini memberikan kesempatan untuk mempelajari [mekanisme attention] pada tingkat implementasi dibandingkan dengan hanya membaca blog. Ini menunjukkan bahwa meskipun perpustakaan ini mungkin tidak cocok untuk beban kerja produksi, perpustakaan ini memiliki tujuan penting dalam membuat algoritma ini lebih mudah diakses dan dipahami oleh pengembang Go.
Ketika menganalisis kode dengan alat seperti Ghidra, pengembang mengkonfirmasi bahwa implementasi dikompilasi menjadi kode skalar yang beroperasi pada nilai fp64 tunggal, memperkuat kekhawatiran kinerja. Konsensusnya tampaknya adalah bahwa meskipun perpustakaan ini mungkin berguna untuk pembelajaran dan pembuatan prototipe, aplikasi produksi kemungkinan akan memerlukan pendekatan alternatif yang dapat memanfaatkan akselerasi perangkat keras.
Diskusi seputar go-attention mencerminkan ketegangan yang lebih luas dalam ekosistem Go antara penekanan bahasa pada kesederhanaan dan keterbacaan versus tuntutan kinerja domain komputasi intensif seperti machine learning. Seperti yang dikatakan oleh seorang pengembang:
Tanpa menggunakan instruksi CPU SIMD, ini akan menjadi sangat mahal.
Perdebatan ini juga menyentuh minat yang berkembang dalam mengimplementasikan primitif machine learning dalam bahasa selain Python, karena pengembang berusaha mengintegrasikan kemampuan ini ke dalam tumpukan teknologi yang ada tanpa overhead interoperabilitas lintas bahasa.
Referensi: go-attention: Mekanisme attention penuh dan transformer dalam Go murni