Przekształcenie i odnowienie ruGPT-3 XL do nowoczesnych frameworków
Programiści napotkali problem z uruchomieniem przestarzałej modelu językowego ai-forever/rugpt3xl (1,3 mld parametrów) z 2021 roku. Model, który został wytrenowany od podstaw na rosyjskim korpusie jako modyfikacja GPT-2, przechowywany jest w formacie checkpointa Megatron-LM, wymagającym PyTorch 1.7 i transformers 3.5. Przekonwertowanie do formatu Hugging Face umożliwia wykorzystanie go z nowoczesnymi narzędziami do inference oraz fine-tuning.
Proces obejmuje wyodrębnienie wag z pliku mp_rank_00_model_states.pt, mapowanie ich na strukturę GPT2Model oraz tworzenie niestandardowych klas dla biblioteki transformers.
Struktura wag: Megatron-LM vs HuggingFace
Oryginalne wagi używają połączonej projekcji QKV [6144, 2048], którą należy rozdzielić na osobne Q, K, V o rozmiarze [2048, 2048]. Pełne mapowanie:
| Megatron-LM | HuggingFace |
|-------------|-------------|
| word_embeddings.weight | model.embed_tokens.weight |
| position_embeddings.weight | model.embed_positions.weight |
| transformer.layers.{i}.input_layernorm. | model.layers.{i}.input_layernorm. |
| transformer.layers.{i}.attention.query_key_value.weight | model.layers.{i}.self_attn.{q,k,v}_proj.weight |
| transformer.layers.{i}.attention.query_key_value.bias | model.layers.{i}.self_attn.{q,k,v}_proj.bias |
| transformer.layers.{i}.attention.dense. | model.layers.{i}.self_attn.o_proj. |
| transformer.layers.{i}.post_attention_layernorm. | model.layers.{i}.post_attention_layernorm. |
| transformer.layers.{i}.mlp.dense_h_to_4h. | model.layers.{i}.mlp.up_proj. |
| transformer.layers.{i}.mlp.dense_4h_to_h. | model.layers.{i}.mlp.down_proj. |
| transformer.final_layernorm. | model.norm. |
| - | lm_head.weight (kopia embed_tokens) |
Skrypt convert.py konwertuje checkpoint do formatu safetensors kompatybilnego z transformers.
Niestandardowe klasy modelu
Stworzono nowe klasy bez zależności od Megatron-LM i DeepSpeed:
- RuGPT3XLConfig: dziedziczy po
PretrainedConfigz parametrami (vocab_size=50264, hidden_size=2048, num_layers=24). - RuGPT3XLAttention: uwielokrotna uwaga z osobnymi Q/K/V i
DynamicCache. - RuGPT3XLMLP: blok MLP (up_proj → GELU → down_proj).
- RuGPT3XLDecoderLayer: warstwa dekodera (pre-LN → uwaga → post-LN → MLP).
- RuGPT3XLModel: embeddingi + 24 warstwy + finalna LN.
- RuGPT3XLForCausalLM: z lm_head.
Kluczowe ulepszenia:
- Standardowa metoda
forward()dla SFTTrainer/LoRA. - Cache KV przez
DynamicCache. - Gradient checkpointing.
- Działanie na CPU/GPU przy użyciu
device_map="auto".
Model jest dostępny na Hugging Face jako evilfreelancer/ruGPT3XL.
Wyniki testowania
Generowanie na RTX 4090 (float16):
- Średnia prędkość: 66,7 tokenów/s (batch_size=1).
- Zachowuje kontekst przy długich promptach.
- Generuje rzeczywiste teksty (przepisy, historia) z dużą precyzją.
Benchmark MERA (ogólny wynik 0,198):
- PARus (zdrowy rozsądek): 0,500
- ruHateSpeech: 0,558
- BPS (kod/matematyka): 0,528
- RWSD (rozumowanie): 0,488
- ruTiE (dialog): 0,502
- ruMMLU: 0,252
Matematyka i kod są bliskie baseline’owi – jak się spodziewano dla modelu bazowego bez dostosowania do instrukcji.
Konwersja do GGUF dla llama.cpp
Po konwersji do formatu HF, konwerter convert_hf_to_gguf.py został dostosowany do ruGPT-3 XL. Model działa w llama.cpp bez zależności od Megatron, wspierając cache KV i nowoczesne inference.
To pozwala na fine-tuning na własnych zbiorach danych za pomocą LoRA lub SFT, integrację do pipeline’ów oraz testowanie na urządzeniach krawędziowych.
Co ważne
- Kompatybilność: model działa z transformers ≥4.x, bez starego stosu.
- Wydajność: 66,7 t/s na RTX 4090, cache KV do generacji.
- Dostępność do uczenia: gotowość do LoRA/SFTTrainer, gradient checkpointing.
- Benchmarki: silny w zdrowym rozsądku i hate speech (0,5+), słaby w matematyce i kodzie.
- Formaty: HF + GGUF dla szerokiej ekosystemu.
— Editorial Team
Brak komentarzy.