Rozszerzenie kontekstu ruGPT3XL do 8k tokenów: sparse attention i dalsze uczenie
Deweloperzy pomyślnie zaadaptowali ruGPT3XL z Megatron-LM do formatu HuggingFace z obsługą GGUF w llama.cpp. Testy wykazały degradację Perplexity (PPL) do 50.1 na zbiorze danych gazeta zamiast oczekiwanych 12.05. Przyczyną była zamiana sparse attention na dense nn.MultiheadAttention z GPT-2.
Przywracanie oryginalnego mechanizmu z Megatron-LM obniżyło PPL do 11.68. Korelacja z deklarowanymi metrykami oryginalnego modelu osiągnęła R=0.93.
Porównanie PPL na gazeta
| Model | PPL (gazeta) |
|----------------|--------------|
| ruGPT3Small | — |
| ruGPT3Medium | 25.2 |
| ruGPT3Large | 16.8 |
| ruGPT3XL (dense)| 50.1 |
| ruGPT3XL (sparse)| 11.68 |
Mechanizm sparse attention w ruGPT3XL
Sparse attention wykorzystuje alternating-pattern z pracy "Generating Long Sequences with Sparse Transformers" (arXiv:1904.10509):
- Warstwy parzyste (0,2,4…): block-sparse attention. Każdy token widzi lokalne okno 128 tokenów + globalne bloki w regularnych odstępach. Różne głowy używają różnych pozycji globalnych.
- Warstwy nieparzyste (1,3,5…): standardowy causal dense attention.
Zapewnia to niemal liniowy wzrost pamięci zamiast kwadratowego. Przy 4x zwiększeniu kontekstu pamięć na KV-cache i aktywacje rośnie 3-4 razy.
W llama.cpp dodano architekturę LLM_ARCH_RUGPT3XL (PR #21161) z pełną obsługą sparse attention. Naprawiono błąd maski dla batchy >1 podczas uczenia.
Optymalizacja przez Triton i SDPA
Implementacja przez matmul + softmax + matmul (eager mode) daje ~6280 tok/s na RTX 4090.
Przyspieszenie:
F.scaled_dot_product_attention(SDPA): +40% (~8800 tok/s).- SDPA ze zwiększonym batchem (5×2048): kolejne +25%.
torch.compilez Inductor: ×1.85 do baseline (~11600 tok/s), generuje jądra Triton.
Strategia rozszerzenia kontekstu do 8k
Ograniczenia architektury:
- Learned Absolute Positional Embeddings (nn.Embedding(2048,2048)) nie ekstrapolują.
- Siatka sparse attention zależy od
max_position_embeddings // sparse_block_size.
Zasady dalszego uczenia
- Tiling pozycyjnych embeddingów: Cykliczne duplikowanie 0-2047 dla nowych pozycji. Zachowuje stabilność na krótkim kontekście.
- Mieszany zbiór danych: 60% długich przykładów (gazeta przez EOS), 40% krótkich chunków.
- Stopniowe rozszerzanie: 2k→4k (2.6h), następnie 4k→8k (3.9h) na RTX 4090.
Parametry: gazeta train, 3 epoki, lr=5e-6 cosine decay, bfloat16, gradient checkpointing. Rozwiązano OOM przez PYTORCH_CUDA_ALLOC_CONF=expandable_segments:True (38.5 GB pik).
Model: evilfreelancer/ruGPT3XL-8k.
Wyniki PPL na gazeta test
| Model | 2048 | 4096 | 8192 |
|----------------|------|------|------|
| ruGPT3XL base | 11.68| — | — |
| ruGPT3XL-4k | 11.75| 12.04| — |
| ruGPT3XL-8k | 11.77| 11.99| 13.00 |
Minimalna regresja na 2k, model zachowuje jakość.
Co jest ważne
- Sparse attention kluczowe: dense-implementacja daje PPL 50.1 zamiast 11.68.
- Tiling APE efektywny: pozwala dalej uczyć bez degradacji podstawowego kontekstu.
- 8k realne na RTX 4090: 38.5 GB z expandable_segments.
- Stopniowe podejście minimalizuje overfit: 2k→4k→8k w 6.5 godzin.
- Triton/SDPA przyspieszają 1.85x: torch.compile generuje zoptymalizowane jądra.
— Editorial Team
Brak komentarzy.