- Fenomena bahwa bahkan pada temperature=0, GPT-4 dan GPT-3.5-turbo menghasilkan output berbeda untuk input yang sama setiap kali dijalankan, sebuah perilaku tidak lazim yang tidak muncul pada model decoder dense yang ada sebelumnya
- Selama ini penyebab non-determinisme dijelaskan sebagai ketidakstabilan operasi floating point CUDA, tetapi penjelasan ini saja tidak cukup
- Dalam struktur batched inference dari arsitektur Sparse MoE, token dari sequence berbeda dalam batch yang sama saling bersaing memperebutkan slot buffer expert, sehingga memunculkan non-determinisme
- Dalam eksperimen pemanggilan berulang 30 kali, GPT-4 menghasilkan jauh lebih banyak output unik dibanding model lain, sehingga secara empiris mendukung hipotesis ini
- Fakta bahwa model bersifat deterministik hanya pada tingkat batch, bukan tingkat sequence menjadi penyebab utama masalah keandalan API GPT-4
Mengangkat masalah — mengapa output selalu berbeda meski temperature=0
- Sudah diketahui luas bahwa GPT-4/GPT-3.5-turbo bersifat non-deterministik bahkan pada temperature=0.0
- Pada model dense decoder-only, temp=0 berarti greedy sampling, dan ini seharusnya menghasilkan determinisme penuh
- Karena logit token berikutnya adalah fungsi murni dari sequence input dan bobot model saja
- Jawaban tim teknis dalam roundtable developer OpenAI World Tour
- Intinya: "Sejujurnya kami juga bingung. Mungkin ini bug sistem, atau non-determinisme dalam komputasi floating point yang dioptimalkan"
- Ada tanda tanya karena perilaku ini belum diperbaiki meski sudah dibahas sejak 2 tahun lalu
- Karena OpenAI menekankan reliability, kecil kemungkinan mereka sengaja mempertahankan non-determinisme, sehingga pada awalnya batasan hardware yang tak bisa diatasi dianggap sebagai penjelasan paling masuk akal
Hipotesis baru — petunjuk yang ditemukan di paper Soft MoE
- Ditemukan kaitan penting pada bagian 2.2 paper Soft MoE
- Di bawah batas kapasitas (capacity constraints), semua pendekatan Sparse MoE merutekan token dalam kelompok berukuran tetap dan memaksa atau mendorong keseimbangan di dalam kelompok itu
- Ketika kelompok tersebut memuat token dari sequence/input yang berbeda, token-token ini saling bersaing memperebutkan slot kosong pada buffer expert
- Akibatnya model menjadi non-deterministik pada tingkat sequence dan hanya deterministik pada tingkat batch, dan beberapa sequence input dapat memengaruhi prediksi akhir input lain
- Fakta bahwa GPT-4 adalah model Mixture of Experts sudah diketahui publik
- GPT-4 dilatih sebelum kuartal 2 tahun 2022, dan Sparse MoE sudah ada sebelum itu
- Hipotesis inti yang diajukan
- API GPT-4 di-host pada backend yang melakukan batched inference
- Faktor lain mungkin ikut berpengaruh, tetapi sebagian besar non-determinisme API berasal dari ketidakmampuan arsitektur Sparse MoE untuk memaksakan determinisme per sequence
Verifikasi — memastikan ini bukan masalah hardware
- Untuk menguji hipotesis, GPT-4 diminta langsung menulis skrip pengujian
- Untuk model chat (gpt-4, gpt-3.5-turbo) dan model completion (text-davinci-003/001, davinci-instruct-beta, davinci), prompt yang sama dipanggil berulang pada temperature=0, lalu dihitung jumlah output unik
- Masalah yang muncul saat menulis skrip
- Respons OpenAI API sangat lambat, sampai hampir 10 detik delay bahkan untuk pemanggilan 3.5 turbo, sehingga ditambahkan logging timestamp untuk memastikan ini bukan kesalahan lokal
- Beberapa model completion memotong respons terlalu cepat, sehingga dilakukan koreksi dengan memberi logit bias pada token EOS
- Pada token
<|im_end|>(100265) milik model chat, bias yang setara tidak bisa diterapkan karena API mengembalikan error key melebihi nilai maksimum 100257- Karena sebagian besar completion mencapai panjang max token dan model chat memang sudah jauh lebih non-deterministik, batasan ini dianggap bukan isu inti
Hasil empiris
- Tiga kali percobaan, kondisi N=30, max_tokens=128, output unik (rata-rata/30)
- gpt-4: 12, 11, 12 — rata-rata 11.67
- gpt-3.5-turbo: 4, 4, 3 — rata-rata 3.67
- text-davinci-003: 3, 2, 4 — rata-rata 3.00
- text-davinci-001: 2, 2, 2 — rata-rata 2.00
- davinci-instruct-beta: 1, 1, 1 — deterministik, output runtuh menjadi loop berulang
- davinci: 1, 1, 1 — deterministik, output runtuh menjadi loop berulang
- Hasil pada kondisi max_tokens=256 sebelum masalah logit_bias ditemukan
- gpt-4: 30, gpt-3.5-turbo: 9, text-davinci-003: 5, text-davinci-001: 2
Interpretasi hasil
- Jumlah output unik GPT-4 sangat tinggi secara tidak normal, sehingga pada output panjang model ini pada praktiknya hampir selalu non-deterministik
- Model lain yang tidak runtuh ke loop berulang juga tetap memiliki tingkat non-determinisme tertentu, selaras dengan klaim publik bahwa ketidakstabilan komputasi GPU menyebabkan sebagian unsur acak
- Pertanyaan yang masih tersisa
- Belum ada penjelasan jelas mengapa randomitas meningkat secara bertahap dari text-davinci-001 ke gpt-3.5-turbo
- Masih belum bisa sepenuhnya menyingkirkan kemungkinan bahwa non-determinisme kuat pada GPT-4 berasal hanya dari jumlah parameter yang besar, bukan MoE, tetapi fakta bahwa Turbo yang lebih cepat lebih non-deterministik daripada davinci bertentangan dengan penjelasan ini
Implikasi
Kita terlalu tertinggal
- Jika non-determinisme memang merupakan sifat bawaan dari batched inference Sparse MoE, maka hal ini seharusnya tampak jelas bagi orang yang bekerja di bidang tersebut
- Kenyataan bahwa sebagian besar pengguna GPT-4 tidak mengetahui penyebab ketidakstabilan API ini menunjukkan bahwa hipotesis tersebut salah, atau terlalu sedikit orang yang memahami model MoE sehingga penjelasan ini tidak pernah menjadi pembahasan umum
- Google Deepmind tampaknya mengetahui hal ini dan memperlakukannya sebagai hal sepele sampai hanya ditulis sekilas dalam paper, memberi alasan untuk lebih optimistis terhadap Deepmind dibanding organisasi lain yang hanya menangani model dense
Ada kemungkinan GPT-3.5-Turbo juga MoE
- Ada rumor bahwa 3.5-turbo berbagi arsitektur yang sama dengan GPT-4, hanya dengan jumlah parameter yang jauh lebih kecil
- Situasi saat ini, di mana dibutuhkan 70B parameter untuk mencapai performa setingkat Turbo, sulit dijelaskan dengan satu model dense tunggal jika mempertimbangkan skala trafik dan kecepatan yang ditangani OpenAI
- Turbo adalah satu-satunya model lain di API yang logprobs-nya dibatasi dan tidak dipublikasikan
- Penjelasan lama adalah untuk mencegah peningkatan akurasi distillation, tetapi contoh seperti Orca membuat alasan itu kurang meyakinkan
- Fakta bahwa OpenAI secara terbuka mengumumkan sedang mengintegrasikan logprobs ke ChatCompletions membuat interpretasi "secara inheren terlalu acak sehingga sulit direkayasa secara stabil" terasa lebih masuk akal daripada "mencegah distillation"
Kesimpulan
- Fakta bahwa model GPT OpenAI bersifat non-deterministik pada temperature=0 sudah diketahui semua orang
- Penyebab yang biasanya ditunjuk adalah ketidakakuratan komputasi floating point CUDA yang dioptimalkan
- Hipotesis lain yang diajukan: batched inference pada model Sparse MoE adalah penyebab mendasar non-determinisme API GPT-4, dan ini merupakan hipotesis yang lebih rapi dibanding penjelasan lama
- Secara empiris ditunjukkan bahwa pemanggilan API GPT-4 (dan beberapa model 3.5) jauh lebih non-deterministik dibanding model OpenAI lain
- Berdasarkan kecepatan, non-determinisme, dan penghapusan logprobs, diperkirakan GPT-3.5-turbo juga mungkin merupakan MoE
1 komentar
Komentar Hacker News
Error floating-point biasanya bersifat deterministik, jadi jika perhitungan yang sama dijalankan dua kali, hasilnya seharusnya sama hingga tingkat bit
Hasil baru bercabang jika ada status lain atau sumber entropi, seperti buffer yang tidak diinisialisasi ke 0 dengan benar, race condition, atau flag mode pembulatan yang tidak disetel secara konsisten
Melihat kualitas kode dadakan yang sering muncul di ekosistem AI/ML, rasanya ketiganya, bahkan mungkin lebih, bisa saja semuanya terjadi
Dalam kasus ini, urutan penjumlahan angka menjadi non-deterministik karena paralelisme GPU, dan hasilnya bisa sedikit berbeda
Sebaiknya hindari merendahkan kode orang lain untuk kode yang ditulis di atas sistem yang tidak kita pahami dengan baik
Hal yang sama juga bisa terjadi di CPU karena pemrosesan paralel, tetapi sebagian besar instruksi individual CPU bersifat deterministik, sedangkan CUDA menyediakan operasi primitif yang non-deterministik
Ini memang dirancang demikian karena lebih cepat daripada padanan yang deterministik, jadi masalahnya adalah ketika hal ini digambarkan seolah bug akibat kode buruk
Misalnya, beberapa operasi floating-point seperti penjumlahan atau perkalian tidak memenuhi sifat asosiatif, sehingga hasilnya bisa berubah tergantung urutan eksekusi yang menyelesaikan reduction
Dalam situasi paralel, ada implementasi yang membuat urutan reduction non-deterministik demi performa, sehingga hasil akhirnya juga menjadi non-deterministik
Hanya dengan pemanggilan
GetTimeOfDay()pun itu bisa terjadi, dan drift frekuensi clock antarprosesor juga bisa menimbulkan hal yang samahttps://forumgeom.fau.edu/FG2012volume12/FG201216.pdf
Saya tidak yakin sudah memahami kutipan dari makalah rujukannya dengan benar
Apakah maksudnya sebagian inferensi yang lebih efisien bergantung pada pencampuran token dari input yang sepenuhnya berbeda, misalnya dari input pengguna lain? Dan bergantung pada input lain yang kebetulan masuk dalam kelompok yang sama, rasio penugasan ke ‘expert’ berubah, dan hasil akhirnya juga berubah?
Jika begitu, ini bukan sekadar memasukkan non-determinisme, tetapi kualitas respons juga bisa dipengaruhi oleh jumlah permintaan simultan yang bersaing untuk penugasan expert yang sama
Misalnya, bagian sistem yang pandai menerjemahkan/menafsirkan bahasa Hindi bisa memberi hasil lebih buruk pada jam sibuk India karena lebih banyak input yang secara bersamaan memperebutkan kapasitas yang sama
Ini juga bisa menjadi penjelasan lain mengapa kualitas terasa menurun seiring waktu. Dulu tes tertentu mungkin stabil berhasil karena kemacetan pada expert terkait masih rendah, sedangkan sekarang penggunaan simultan meningkat sehingga tes yang sama tidak lagi mendapat cukup perhatian dari expert itu
Bisa juga muncul jebakan ketika suatu sub-expert awalnya tampil sangat mengesankan di domain tertentu, lalu penggunaan untuk domain itu meningkat, dan karena kemacetan baru, penggunaan peniru tidak lagi mendapat penugasan expert yang sama sehingga performa awal yang mengesankan itu menurun
Jika efeknya kuat dan OpenAI mengetahuinya tetapi tidak mengungkapkannya, ini bisa dilihat seperti umpan promosi: menarik pengguna dengan performa luar biasa yang tidak representatif dari sistem Mixture-of-Experts yang awalnya belum padat, lalu memberikan hasil berkualitas lebih rendah dari sistem yang jauh lebih padat
Kemungkinan batch-nya dikelompokkan secara berbeda. Saat 10 batch dibagi menjadi 2 grup berisi masing-masing 5, jawaban saya berubah tergantung apakah prompt saya masuk grup pertama atau grup kedua, dan jika posisinya sama di dalam batch, saya mendapat jawaban yang sama
Jika batch-nya sama, yakni sequence dan urutannya sama, maka keseluruhan batch bersifat deterministik, tetapi saat batch dicampur, determinisme itu hilang
Bahkan sekarang pun keandalan adalah salah satu hambatan utama yang menghalangi adopsi luas LLM dalam banyak alur kerja inti bisnis
Jika rumor bahwa GPT-4 pada dasarnya non-deterministik dan tidak stabil itu benar, kebanyakan perusahaan akan lebih baik melakukan fine-tuning pada LLM open source dengan performa serupa untuk domain tertentu
Model yang terspesialisasi untuk domain tertentu akan selalu berkinerja lebih baik daripada model umum, jadi dari sisi performa pun itu lebih menguntungkan
Jika GPT-3.5 adalah model MoE, bukankah ini sinyal yang cukup menjanjikan bagi kubu open source?
Jika muncul model MoE open source yang bagus, mungkin dalam bentuk varian dari model decoder yang sudah ada, itu berarti jauh lebih banyak pekerjaan bisa dilakukan dengan sumber daya yang jauh lebih sedikit
Saya tidak tahu apakah model MoE harus dilatih dari nol
Cara menurunkan rasio FLOPs:memori, misalnya Soft MoE, juga bisa membuat inferensi di CPU, atau setidaknya di Apple Silicon, menjadi jauh lebih bermakna
Jika sequence dalam sebuah batch bisa saling memengaruhi routing satu sama lain, rasanya ini membuka kemungkinan serangan side-channel yang aneh dan sulit diimplementasikan
Ini benar-benar pekerjaan yang luar biasa. Saya sudah lama sangat menentang MoE karena berbagai alasan, dan ini pertama kalinya saya melihat bukti yang meyakinkan, bukan sekadar tulisan Substack atau pengulangan rumor
Saya sama sekali tidak tahu bahwa GPT-4 bersifat nondeterministik, padahal saya memakainya sekitar 2 jam sehari
Saya jadi paham kenapa ini sulit disadari kalau hanya dilihat sekilas. Dalam ingatan, “rasanya” mirip dan banyak memakai kosakata serupa, tetapi bentuknya sepenuhnya berbeda, dengan beberapa kata kunci yang sama sementara yang lain berubah seperti frasa sinonim
Kalau melihat contoh gist yang ditautkan, output nondeterministiknya memang sangat mirip: https://gist.github.com/152334H/047827ad3740627f4d37826c867a...
Karena unsur acaknya pasti terbatas, setidaknya bagian ini tidak terlalu mengejutkan
Sepertinya OpenAI pada akhirnya akan menemukan cara untuk mengurangi keacakan ini. Apalagi mereka juga sudah berjanji secara terbuka akan menambahkan kembali logprobs ke ChatCompletions, jadi itu terasa makin masuk akal
Kalau Anda mengembangkan program dengan memanggil API berulang kali memakai input yang sama, akan sulit untuk tidak menyadari nondeterminisme
Menarik mengetahui wawasan apa yang didapat seseorang yang memakainya sebanyak itu, termasuk paket fitur yang keluar minggu ini
MoE berarti Mixture of Experts
Baru sekitar pertengahan tulisan singkatannya dijabarkan, nyaris seperti kebetulan; tampaknya pembaca yang dituju memang sudah tahu soal Mixture of Experts, dan saya bukan bagian dari itu
Model davinci-instruct-beta di GPT-3.0 sudah mengembalikan logprobs yang nondeterministik sejak awal 2021
Ini hanya dugaan, tetapi CUDA sendiri juga sering punya bug nondeterministik
text-davinci-001dantext-davinci-002dilatih dengan FeedMe dan SFT, sedangkantext-davinci-003memakai RLHFModel itu sendiri juga punya variasi yang lebih besar pada temperatur tinggi
davincidancode-davinci-002?Jika “token-token ini sering saling bersaing untuk mendapatkan slot yang tersedia di buffer expert”, apakah itu juga alasan ChatGPT sering hanya menaruh placeholder di tempat fungsi saat saya meminta kode yang panjang?
Kalau “token-token ini sering saling bersaing untuk mendapatkan slot yang tersedia di buffer expert”, apakah itu berarti hasilnya berubah ketika bebannya tinggi?
Apakah perasaan saya bahwa kualitas output kadang berubah-ubah juga bisa dijelaskan oleh beban tinggi?
MoE berarti Mixture of Experts