Powrót do strony głównej

ruGPT3XL z kontekstem 8k: sparse attention

Artykuł opisuje przywrócenie sparse attention w ruGPT3XL i rozszerzenie kontekstu do 8k tokenów. Użyto tiling pozycyjnych embeddingów, mieszany zbiór danych gazeta i etapowe dalsze trenowanie. Osiągnięto PPL 13.00 przy 8192 tokenach z minimalną regresją na bazowym kontekście.

ruGPT3XL 8k kontekst: od 2k do rzeczywistości
Advertisement 728x90

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) |

Google AdInline article slot

|----------------|--------------|

| ruGPT3Small | — |

| ruGPT3Medium | 25.2 |

Google AdInline article slot

| ruGPT3Large | 16.8 |

| ruGPT3XL (dense)| 50.1 |

| ruGPT3XL (sparse)| 11.68 |

Google AdInline article slot

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.compile z 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

Advertisement 728x90

Czytaj dalej