Tytuł: Błąd tkwił w jednej osi

Ukryty błąd w implementacji chunked-scan w PyTorch pozwala niektórym modelom hybrydowym „podglądać” przyszłe tokeny w sytuacjach, gdy brakuje szybkich, scalonych jąder (fused kernels), co kompromituje checkpointy takie jak Zamba2-1.2B i Nemotron-H-8B. Wada wynika z pojedynczej redukcji wykonanej wzdłuż niewłaściwej osi i ujawnia się na ścieżce wykonania, na której opiera się większość potoków CI oraz uruchomień na procesorach CPU.

Dlaczego ten błąd jest istotny

Modele hybrydowe i modele przestrzeni stanów (state-space models) nie zależą już wyłącznie od mechanizmu attention; wykorzystują one również rekurencje liniowe, skany (scans) i sploty (convolutions). Operacja maskowania, która blokuje przyszłe tokeny w macierzy attention, nie gwarantuje automatycznie przyczynowości (causality) dla tych dodatkowych operacji. Gdy brakuje szybkich, scalonych jąder, które normalnie poprawnie obsługiwałyby skan, PyTorch przełącza się na ścieżkę chunked-scan napisaną w czystym Pythonie. Ten mechanizm awaryjny (fallback) zawiera błąd pomylenia osi (axis-mixup), co pozwala informacjom z późniejszych pozycji przepływać wstecz podczas wnioskowania (inference).

Wyciek jest cichy. Nie powoduje awarii modelu ani nie zgłasza oczywistego błędu. Zamiast tego sprawia, że wartości loss i perplexity wydają się sztucznie niskie, ponieważ model w rzeczywistości „oszukuje” – widzi dokładnie te tokeny, które ma przewidzieć. Wszelkie późniejsze ewaluacje, które ufają tym metrykom, są zatem oparte na wadliwych fundamentach.

Jak odkryto problem

Badacze porównali dwa przejścia w przód (forward passes) przez ten sam model:

  1. Losowy ciąg tokenów.
  2. Identyczny ciąg z jednym zmienionym tokenem.

Mierzyli różnice w stanach ukrytych (hidden states) warstwa po warstwie. Inspekcja masek nie wykazała niczego, ale audyt warstwa po warstwie, polegający na wstrzykiwaniu błędów (fault injection), wykrył 192 na 192 wstrzyknięte błędy, co potwierdziło wyciek.

Szybki przegląd biblioteki transformers wykazał:

  • Zamba2-1.2B wykazuje wyciek, gdy rozmiar chunka (chunk size) jest ustawiony na 256.
  • Nemotron-H-8B wykazuje wyciek przy rozmiarze chunka 128.
  • Większość pozostałych checkpointów nie wykazała wycieku w tych samych warunkach.

Wada znajduje się w ścieżce kodu chunked-scan, która jest uruchamiana zawsze, gdy brakuje opcjonalnych, scalonych jąder. Dotyczy to:

  • Wszystkich uruchomień na CPU.
  • Środowisk GPU bez specyficznych pakietów fused-kernel.
  • Standardowych instalacji PyTorch, które nie zawierają dodatkowych zależności.

Ponieważ błąd pojawia się tylko wtedy, gdy brakuje tych jąder, może on wystąpić w środowiskach CI oraz na procesorach CPU.

Kto jest narażony i jakie są tego koszty

Każdy zespół, który trenuje, dotrenowuje (fine-tunes) lub ewaluuje modele hybrydowe bez użycia scalonych jąder, ryzykuje publikację zawyżonych wyników wydajności. Pozorny spadek wartości loss lub perplexity jest złudny; model w rzeczywistości „spojrzał w przyszłość”. Dla grup badawczych może to prowadzić do mylących twierdzeń o osiągnięciu wyników typu state-of-the-art. W przypadku wdrożeń komercyjnych może to powodować błędy w zadaniach generowania, których model tak naprawdę nigdy się nie nauczył.

Kontrargument

Niektórzy programiści argumentują, że poprawnie zastosowana maska przyczynowa (causal mask) jest wystarczająca, aby zapobiec wyciekowi przyszłych tokenów. Błąd obala to przekonanie: skany, sploty i niektóre warstwy normalizacji mogą całkowicie ominąć maskę. Pomylenie osi w chunked scan pokazuje, że przyczynowość musi być wymuszana wszędzie, gdzie przepływają dane, a nie tylko w macierzy attention.

Na co zwrócić uwagę w przyszłości

  • Higiena zależności: Zainstaluj szybkie pakiety fused-kernel na wszystkich węzłach treningowych i wnioskujących, szczególnie w potokach CI.
  • Skrypty audytowe: Przeprowadź dwuetapowy audyt zalecany przez odkrywców:
    • Wstrzyknij znany błąd do testowanego checkpointu jako kontrolę pozytywną.
    • Uruchamiaj sekwencje dłuższe niż rozmiar chunka lub okna modelu; krótkie sekwencje nigdy nie ujawnią wycieku.

Przeprowadzenie audytu na dowolnym hybrydowym lub state-space checkpointu z długością sekwencji przekraczającą rozmiar chunka wykaże, czy model jest nadal podatny na błąd.

Podsumowanie: Nawet model, który przechodzi każdy standardowy test, może po cichu oszukiwać, gdy ścieżka wykonania przełącza się na wadliwą implementację. Weryfikacja obecności szybkich, scalonych jąder oraz jawne testowanie wycieków poza maskami attention to obecnie niezbędne kroki przed zaufaniem metrykom jakiegokolwiek modelu hybrydowego.