>_ DevTrendspl

Język

Strona główna

Języki

Sekcje

Frontend Backend Mobilne DevOps AI / ML GameDev Blockchain Systemy wbudowane Bezpieczeństwo
Python

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:

  1. Dostrajanie modeli wizyjno-językowych (Qwen2.5-VL, Qwen3-VL) na długich dokumentach, skanach książek i zrzutach ekranu interfejsu.
  2. Trenowanie rzadkich architektur Mixture-of-Experts z dystrybucją ekspertów między GPU (Expert Parallelism).
  3. Eksperymenty z dyfuzją do generowania wideo opartego na modelach WanVideo lub SiT.
  4. 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