Padding dapat menghabiskan sebagian besar batch training ketika panjang sequence bervariasi. Sequence packing mengurangi pemborosan ini dengan menempatkan beberapa sampel pendek ke dalam satu blok token. Secara aritmetika ini menarik: lebih banyak token non-padding dapat dimuat ke tensor dengan panjang tetap yang sama.
Packing juga mengubah struktur yang dilihat attention. Causal mask standar hanya mencegah token memperhatikan posisi setelahnya. Mask tersebut tidak mengetahui bahwa dua span yang bersebelahan berasal dari sampel berbeda. Tanpa batas tambahan, token pada span kedua dapat memperhatikan token dari span pertama.
Ini menciptakan konteks yang tidak ada pada kedua sampel asli.
Causal mask tidak mengisolasi sampel yang dipack
Pertimbangkan dua sampel yang telah ditokenisasi dan dipack ke satu baris:
[A0 A1 A2 B0 B1 B2]Causal attention biasa mengizinkan setiap posisi memperhatikan dirinya sendiri dan posisi sebelumnya. Dengan mask tersebut, B0 dapat memperhatikan A0, A1, dan A2; B1 juga dapat memperhatikan token-token itu serta B0.
Untuk sampel training yang independen, edge lintas sampel tersebut bersifat artifisial. Model menerima informasi dari prefix yang tidak terkait ketika memprediksi token pada sampel B.
Packed mask sebaliknya mempertahankan struktur kausal di dalam setiap sampel sambil memblokir edge antar-sampel. Secara konseptual, matriks attention yang diizinkan memiliki blok lower-triangular terpisah:
A A A . . .
A A A . . .
A A A . . .
. . . B . .
. . . B B .
. . . B B BRepresentasi persisnya bergantung pada implementasi attention. Sebagian kernel menerima mask eksplisit, sementara yang lain merepresentasikan sequence dengan panjang bervariasi melalui offset atau panjang kumulatif. Invariannya sama: posisi dari satu sampel independen tidak boleh menjadi konteks yang dapat digunakan oleh sampel lain.
Penanganan posisi adalah keputusan terpisah
Isolasi attention dan penetapan posisi menyelesaikan masalah yang berbeda. Memblokir attention lintas sampel mencegah aliran informasi melintasi batas. Position ID menentukan koordinat posisi yang diberikan di dalam setiap span yang dipack.
Sebuah sistem dapat mereset position ID pada setiap batas sampel:
tokens: A0 A1 A2 B0 B1 B2
position_id: 0 1 2 0 1 2Implementasi lain dapat mempertahankan posisi dari baris hasil packing. Apakah reset tepat dilakukan bergantung pada mekanisme posisi model dan konfigurasi training. Keputusan ini tidak boleh disimpulkan hanya dari keberadaan packed attention mask.
Perbedaan ini penting saat debugging. Position ID yang benar tidak dapat mengompensasi mask yang membocorkan konteks, dan block mask yang benar tidak membuktikan bahwa penanganan posisi sesuai dengan semantik model yang dimaksudkan.
Batas loss perlu diperiksa secara terpisah
Packing juga dapat menyingkap kesalahan dalam konstruksi target. Untuk prediksi next-token, label biasanya disejajarkan agar setiap posisi memprediksi token berikutnya. Jika pergeseran tersebut diterapkan ke seluruh baris hasil packing tanpa menghormati batas sampel, token terakhir sampel A dapat diberi token pertama sampel B sebagai target.
Transisi itu sintetis.
Posisi batas tersebut seharusnya dikeluarkan dari loss, atau label dibentuk per sampel sebelum packing dengan cara yang mempertahankan pengecualian itu. Detail yang dibutuhkan bergantung pada data pipeline, tetapi target validasinya konkret: tidak boleh ada target prediksi yang menyeberang dari satu sampel independen ke sampel lain kecuali kontinuitas tersebut memang disengaja.
Attention mask dan loss mask dengan demikian melindungi edge yang berbeda. Attention mask mengendalikan posisi input mana yang dapat digunakan sebuah query. Loss mask mengendalikan prediksi mana yang berkontribusi pada objective.
Packing mengubah penghitungan token
Batch dengan bentuk tensor yang sama dapat memuat jauh lebih banyak token training setelah packing karena posisi padding digantikan oleh token nyata. Membandingkan run hanya berdasarkan optimizer step karena itu dapat menyembunyikan perubahan jumlah data yang diproses.
Penghitungan berbasis token membuat perbedaan tersebut terlihat. Kuantitas yang berguna mencakup jumlah token non-padding yang masuk ke model dan jumlah token target yang berkontribusi pada loss. Kedua hitungan ini dapat berbeda ketika target pada batas atau posisi lain dikeluarkan.
Packing juga mengubah berapa banyak sampel berbeda yang dapat berbagi satu baris tensor. Hal ini tidak boleh disamakan dengan memperbesar konteks model untuk satu sampel. Dengan isolasi yang benar, setiap sampel tetap hanya dapat mengakses span miliknya yang diizinkan.
Pengujian batas menangkap error yang dapat lolos dari aggregate loss
Bug packing mungkin tidak menghasilkan tensor invalid atau kegagalan numerik yang jelas. Attention lintas sampel tetap merupakan attention yang valid secara matematis, dan target lintas batas tetap berupa token ID yang valid. Training dapat terus berjalan sambil memakai informasi yang tidak semestinya.
Pengujian deterministik kecil lebih mudah mengungkap masalah. Buat dua sampel pendek dengan token ID yang mudah dikenali, pack keduanya, lalu periksa permission attention dan label yang dihasilkan. Setiap edge attention yang diizinkan harus tetap berada di dalam sampel asal, dan setiap edge next-token yang disupervisi juga harus tetap berada di dalam sampel tersebut.
Pemeriksaan lain yang berguna adalah mengubah sampel A sambil mempertahankan sampel B. Dengan inference deterministik dan attention yang terisolasi dengan benar, hidden state untuk B tidak semestinya berubah hanya karena token yang tidak terkait sebelum batasnya berubah, dengan tetap memperhitungkan konfigurasi model dan kernel yang diuji.
Sequence packing karena itu bukan sekadar optimasi penyimpanan. Packing menulis ulang layout sebuah batch sambil mengandalkan mask, offset, label, dan metadata posisi untuk mempertahankan semantik sampel independen. Optimasi ini hanya valid jika batas-batas tersebut tetap bertahan setelah penulisan ulang.