Jak trenować ciężkie modele multimodalne bez zoo skryptów
Jeśli kiedykolwiek próbowałeś dostroić świeży model multimodalny jak Qwen2.5-VL lub uruchomić pretraining generatora wideo opartego na dyfuzji, prawdopodobnie pamiętasz to uczucie rozpaczy. W jednym repozytorium trenowanie crashuje z powodu konfliktów wersji PyTorch i FlashAttention. W innym autor napisał własny pipeline danych, który ładuje 500 GB obrazów bezpośrednio do RAM. W trzecim FSDP zawiesza się na drugim kroku optymalizacji.
Każda nowa architektura przynosi własny skrypt trenowania, własne triki oszczędzające pamięć i własne obejścia dla równoległości. Zespół z laboratorium EvolvingLMMs-Lab postanowił zebrać całe to rozproszone doświadczenie w jednym miejscu. Tak powstało repozytorium lmms-engine.
To modularny silnik do skalowalnego trenowania modeli multimodalnych. Obsługuje brudną robotę rozproszonego trenowania, pakowania sekwencji i niskopoziomowych optymalizacji kerneli, zostawiając ci tylko konfigurację i dane.
Co w środku i dla kogo to jest
Framework został opracowany głównie dla badaczy i inżynierów ML pracujących z ciężkimi sieciami multimodalnymi. Podczas gdy zwykłe tekstowe LLM można wygodnie dostrajać narzędziami takimi jak Axolotl czy LLaMA-Factory, obrazy, audio i wideo to zupełnie inna historia.
Dane wejściowe multimodalne tworzą ogromne długości kontekstu. Pojedyncza klatka wysokiej rozdzielczości lub kilka sekund wideo łatwo rozrasta się do dziesiątek tysięcy tokenów wizualnych. W tym momencie standardowy Data Parallel szybko uderza w limity pamięci GPU.
Silnik rozwiązuje to kombinacją nowoczesnych technik równoległości i optymalizacji na poziomie GPU. Lista wspieranych modeli jest imponująca:
- Modele wizyjno-językowe: Qwen2.5-VL, Qwen3-VL, Qwen3-VL MoE, LLaVA-OneVision
- Multimodalne MoE z obsługą audio i wideo: Qwen2.5-Omni, Qwen3-Omni MoE, Aero
- Architektury generatywne i dyfuzyjne: WanVideo (1.3B i 14B parametrów), SiT (Scalable Interpolant Transformers), dLLM
- Uniwersalne systemy rozumienia i generowania obrazów: BAGEL
Cztery inżynieryjne rozwiązania pod maską
Twórcy projektu wyraźnie inspirowali się ideą minimalizmu: kod jest napisany zwięźle, bez niepotrzebnej abstrakcyjnej magii, w czystym PyTorch z integracjami z najnowszymi bibliotekami.
1. FSDP2 i równoległość sekwencji Ulysses
Do dystrybucji wag silnik opiera się na świeżej implementacji Fully Sharded Data Parallel v2 (FSDP2) opartej na DTensor. W przeciwieństwie do starego FSDP, druga wersja znacznie lepiej komponuje się z innymi typami równoległości.
Gdy ponad 10 000 tokenów wizualnych trafia do kontekstu, pamięć GPU kończy się natychmiast. W tym miejscu wkracza Ulysses Sequence Parallel (USP). Dzieli sekwencję tokenów na kilka GPU w jednym węźle. W konfiguracji ustawia się to jedną linią:
trainer_args:
sp_ulysses_degree: 2
2. Pakowanie sekwencji bez niepotrzebnego paddingu
Klasyczny ból głowy w trenowaniu multimodalnym to różne rozmiary obrazów i tekstów w jednej partii. Jeśli paddingujesz krótkie próbki tokenami paddingu, GPU spędza nawet połowę czasu na bezużytecznych obliczeniach zerowych.
Autorzy zaimplementowali pakowanie first-fit bin w połączeniu z FlashAttention use_rmpad. Dane są pakowane w gęste długie sekwencje bez czasu jałowego. Według benchmarków autorów, przy dostrajaniu Qwen2.5-VL, metryka efektywności obliczeniowej (MFU) skacze z 20-25% do imponujących 35-40%.
dataset_config:
packing: true
packing_strategy: first_fit
packing_length: 32000
trainer_args:
use_rmpad: true
use_liger_kernel: true
3. Optymalizator Muon i kernele Triton z Liger
Zamiast znanego AdamW, projekt oferuje Muon. Ten optymalizator stosuje ortogonalizację Newtona-Schulza przez kernele Triton do dwuwymiarowych macierzy wag. Zbiega się szybciej niż AdamW i wymaga mniej pamięci.
Jednocześnie silnik może na bieżąco zamieniać standardowe warstwy modelu na fused kernele z biblioteki Liger Kernel firmy LinkedIn. CrossEntropy, RMSNorm, RoPE i SwiGLU są łączone w pojedyncze operacje, redukując około 30% szczytowego zużycia VRAM bez utraty dokładności.
4. Strumieniowe ładowanie terabajtowych zbiorów danych
Ładowanie ogromnych tablic wideo i obrazów do pamięci przed rozpoczęciem epoki jest niemożliwe. Pipeline danych w lmms-engine jest zbudowany na bazie IterableDataset. Dane są odczytywane strumieniowo z formatów Arrow, JSONL lub Parquet, więc trenowanie rozpoczyna się natychmiast bez czekania na indeksowanie plików o rozmiarze terabajtów.
Jak działa uruchamianie i rozszerzanie
Instalacja projektu odbywa się poprawnie przez menedżer pakietów uv, choć autorzy udostępniają również gotowy obraz Docker z preinstalowanym CUDA, FlashAttention i zależnościami.
git clone https://github.com/EvolvingLMMs-Lab/lmms-engine.git
cd lmms-engine
uv pip install -e ".[all]"
uv pip install flash-attn --no-build-isolation
uv pip install liger-kernel
Trenowanie uruchamia się przez standardowe torchrun:
torchrun --nproc_per_node=8 --nnodes=1 --node_rank=0 \
--master_addr=127.0.0.1 --master_port=12355 \
-m lmms_engine.launch.cli config_yaml=examples/qwen3_vl/example_config.yaml
Jeśli musisz dodać własny specyficzny format danych lub niestandardowy procesor cech, nie będziesz musiał przepisywać wnętrzności trainera. Kod używa wzorca fabryki z rejestracją przez dekoratory:
from lmms_engine.datasets import register_dataset, BaseDataset
@register_dataset("my_custom_dataset")
class MyCustomDataset(BaseDataset):
def __init__(self, config):
super().__init__(config)
def __getitem__(self, idx):
# Ваша логика чтения картинки или видео
return item
Gdzie projekt sprawdza się najlepiej
Silnik został opracowany pod kątem konkretnych ciężkich scenariuszy:
- Dostrajanie modeli wizyjno-językowych (Qwen2.5-VL, Qwen3-VL) na długich dokumentach, skanach książek i zrzutach ekranu interfejsu.
- Trenowanie rzadkich architektur Mixture-of-Experts z dystrybucją ekspertów między GPU (Expert Parallelism).
- Eksperymenty z dyfuzją do generowania wideo opartego na modelach WanVideo lub SiT.
- Pretraining lekkich modeli z rekurencyjną i liniową uwagą (FLA / DGN).
Czy warto spróbować
Jeśli twoim zadaniem jest szybka modyfikacja LoRA na tekstowej Llamie, lmms-engine może wydawać się przerostem formy nad treścią. Ale jeśli uderzyłeś w sufit pamięci podczas trenowania sieci multimodalnych, masz dość ręcznego łączenia FSDP2 z długimi sekwencjami wideo lub chcesz wycisnąć maksymalne FLOPS ze swoich istniejących klastrów, ten silnik zaoszczędzi ci tygodnie kodowania.
Najłatwiejszy sposób na start to gotowe skrypty w folderze examples/: zawierają przetestowane w boju konfiguracje dla większości nowoczesnych architektur.
Powiązane projekty