Seorang pembangun telah menemui kesesakan prestasi yang ketara dalam alat inferens LLM yang popular dan menemui penyelesaian yang mengejutkan mudah yang menggandakan kelajuan pemprosesan. Kejayaan ini tercapai selepas beberapa hari menyelesaikan masalah mengapa llama.cpp bergelut dengan pemprosesan kelompok manakala vLLM mengendalikan beban kerja yang sama dengan mudah.
Masalah Susun Atur Memori Tersembunyi
Isu ini bukanlah berkaitan dengan penggunaan GPU atau kuasa pengiraan, tetapi bagaimana data disusun dalam memori. Semasa menjalankan kedua-dua llama.cpp dan vLLM pada kad grafik RTX 4070 yang sama, pembangun menyedari bahawa llama.cpp mula ketinggalan teruk apabila memproses 8 atau lebih gesaan serentak, walaupun penggunaan GPU kelihatan normal. Sementara itu, vLLM mengendalikan beban kerja kelompok yang sama tanpa sebarang masalah.
Punca utama terletak pada cara setiap sistem menyusun data cache kunci-nilai dalam memori. Llama.cpp menggunakan susun atur memori rata yang berfungsi baik untuk gesaan tunggal tetapi mewujudkan corak akses memori yang tidak cekap apabila mengendalikan beberapa gesaan sekaligus. Ini memaksa GPU membuat bacaan memori yang bertaburan dan tidak berurutan yang membazirkan lebar jalur yang berharga.
Cache kunci-nilai: Teknik pengoptimuman memori yang menyimpan nilai perhatian yang telah dikira sebelum ini untuk mengelakkan pengiraan semula, penting untuk inferens model bahasa yang cekap.
Perbandingan Susun Atur Memori:
- Susun atur asal llama.cpp: [urutan, kepala, dimensi] - menyebabkan akses memori berjalur
- Susun atur yang dioptimumkan: [kepala, urutan, dimensi] - membolehkan pembacaan memori yang bersatu
- Peningkatan prestasi: Peningkatan kelajuan 2x dengan operasi yang sama
Penyelesaian Mudah Yang Mengubah Segalanya
Penyelesaian melibatkan pembentukan semula cara data disimpan dalam tensor memori. Dengan menukar susun atur daripada [urutan, kepala, dimensi] kepada [kepala, urutan, dimensi], pembangun menyelaraskan struktur data dengan cara pemproses berbilang aliran GPU secara semula jadi mahu mengakses memori. Perubahan yang kelihatan kecil ini membolehkan bacaan memori yang bergabung sepenuhnya tanpa lompatan berselang.
GPU tidak pernah menjadi kesesakan. ia adalah susun atur memori tidak sejajar dengan langkah akses yang dijangkakan SM.
Pengubahsuaian ini membawa corak akses memori llama.cpp lebih dekat dengan pendekatan vLLM, yang menggunakan cache kunci-nilai berhalaman dengan susun atur yang dioptimumkan untuk seni bina memori GPU. Ini menjelaskan mengapa vLLM berskala lebih baik dengan saiz kelompok yang lebih besar - ia direka dari awal untuk bekerja dengan cara GPU moden mengendalikan memori.
Pemproses berbilang aliran (SM): Unit pemprosesan teras dalam GPU NVIDIA yang melaksanakan pengiraan selari dengan paling cekap apabila mengakses lokasi memori yang bersebelahan.
Prestasi Enjin Inferens:
Alat | Pengendalian Saiz Kelompok | Susun Atur Memori | Penskalaan Prestasi |
---|---|---|---|
llama.cpp | Lemah melebihi kelompok 8 | Susun atur rata | Terhad |
vLLM | Cemerlang | Cache KV berselerak | Unggul |
sglang | Cemerlang | Dioptimumkan | Unggul |
Melampaui Dominasi NVIDIA
Walaupun pengoptimuman ini memfokuskan pada perkakasan NVIDIA, perbincangan yang lebih luas mendedahkan perkembangan menarik dalam landskap GPU. AMD Instinct MI300 menawarkan ciri prestasi yang berbeza dengan sehingga 160 TFLOPS prestasi FP32 yang dipasangkan dengan lebar jalur HBM3 sebanyak 6 TB/s. Ini mewujudkan titik rabung sekitar 27 FLOP setiap bait, kira-kira dua kali ganda daripada NVIDIA A100 pada 13 FLOP setiap bait.
Walau bagaimanapun, kelebihan ekosistem perisian NVIDIA kekal kukuh. Walaupun spesifikasi perkakasan AMD yang kompetitif dan pilihan memori dalam-pakej yang lebih besar (128-256 GB), kekurangan alat perisian yang matang mengekalkan kebanyakan pembangun dalam ekosistem NVIDIA.
Ciri-ciri Prestasi GPU:
- NVIDIA A100: 13 FLOPs/byte titik puncak
- AMD Instinct MI300: 27 FLOPs/byte titik puncak, 160 TFLOPS FP32, ~6 TB/s lebar jalur HBM3
- Kapasiti memori: AMD menawarkan 128-256 GB dalam pakej berbanding konfigurasi yang lebih kecil daripada NVIDIA
Gambaran Besar
Penemuan ini menyerlahkan pengajaran penting untuk pembangun AI: kesesakan prestasi sering tersembunyi di tempat yang tidak dijangka. Walaupun graf penggunaan GPU mungkin kelihatan sempurna, had sebenar boleh bersembunyi dalam corak akses memori atau pilihan susun atur data. Proses penyahpepijatan dua hari yang membawa kepada kejayaan ini menunjukkan betapa pentingnya melihat melampaui metrik peringkat permukaan apabila mengoptimumkan beban kerja AI.
Pengalaman pembangun juga menunjukkan nilai membandingkan enjin inferens yang berbeza. Dengan menjalankan beban kerja yang sama pada kedua-dua llama.cpp dan vLLM, mereka dapat mengenal pasti bahawa masalah itu bukanlah wujud pada perkakasan atau tugas itu sendiri, tetapi dalam cara satu alat menyusun struktur datanya.