Jak dostroić sieć neuronową 8B na laptopie z kartą graficzną 4 GB
Każdy, kto próbował kiedykolwiek dostroić LLM samodzielnie, zna ten rytuał: konfigurujesz środowisko, walczysz z wersjami CUDA, dobierasz rozmiar batcha, łapiesz niekończące się błędy CUDA out of memory i w końcu wynajmujesz H100 w chmurze tylko po to, żeby uruchomić kilka epok na małym zbiorze danych. W pewnym momencie konfigurowanie skryptów i bawienie się z serwerami zaczyna zabierać więcej czasu niż przygotowanie danych i analiza wyników.
Ostatnio natknąłem się na repozytorium Soup autorstwa Alpamisa Makazhana. Autor postawił ambitny cel: zredukować całą ścieżkę dostrajania do jednego polecenia konsolowego i prostego pliku YAML. Najciekawsze w projekcie jest możliwość dostrojenia modelu Llama 3.1 z 8 miliardami parametrów na mobilnym RTX 3050 z zaledwie 4 GB pamięci wideo.
Brzmi jak chwyt marketingowy, ale pod maską kryje się ciekawa inżynieria i otwarty preprint z benchmarkami. Przyjrzyjmy się, jak to działa i jak sprawuje się w praktyce.
Co potrafi Soup
Essencjonalnie Soup to opakowanie CLI wokół popularnego stosu ML (PyTorch, Transformers, PEFT, TRL). Główna idea polega na przejęciu rutynowych zadań: wykrywanie dostępnego sprzętu, kwantyzacja, automatyczne dostrajanie rozmiaru batcha i formatowanie zbiorów danych.
Narzędzie obejmuje cały przepływ pracy z modelem:
- inicjuje szablony dla różnych zadań (czat, kod, wywoływanie narzędzi, klasyfikacja);
- automatycznie wykrywa formaty danych (Alpaca, ShareGPT, ChatML) z plików JSONL, Parquet lub CSV;
- uruchamia trening z metodami SFT, DPO, ORPO, SimPO lub KTO;
- testuje wynik pod kątem regresji i scala adaptery LoRA z wagami modelu;
- eksportuje model do formatu GGUF do uruchomienia w Ollama lub llama. cpp.
Do podstawowego użycia nie potrzebujesz nawet PyTorch: lekka wersja CLI instaluje się w kilka sekund i pomaga przeglądać dane. A jeśli potrzebujesz samego treningu, pełny stos zostaje pobrany.
# Установка пакета с зависимостями для обучения
pip install "soup-cli[train]"
# Создание конфига через мастер или из готового шаблона
soup init --template chat
# Запуск процесса
soup train
Jak model 8B mieści się w 4 GB pamięci wideo
Zwykle model z 8 miliardami parametrów nawet w skwantyzowanej formie 4-bitowej (NF4) wymaga około 5-6 GB VRAM tylko do załadowania do pamięci. Jeśli dodasz kontekst, aktywacje i adaptery LoRA, karta z 4 GB nieuchronnie wyrzuci błąd braku pamięci.
Autor Soup wykorzystał technikę strumieniowania warstw.
Model bazowy nie jest trzymany całkowicie w pamięci wideo. Jest przechowywany w RAM komputera (lub nawet odczytywany bezpośrednio z szybkiego dysku NVMe) i przekazywany do GPU warstwa po warstwie. Tylko trenowalne adaptery LoRA i bieżąca warstwa dekodera są trwale przechowywane w VRAM.
W testach na laptopie RTX 3050 z 4 GB VRAM, model Llama-3.1-8B-Instruct z kwantyzacją NF4 wykazał szczytowe zużycie pamięci zaledwie 3,32 GB przy prędkości około 119 tokenów na sekundę. Obliczenia dają bitowo identyczne wyniki do konwencjonalnego treningu rezydentnego.
Strumieniowanie warstw włącza się dosłownie jedną linią w konfiguracji soup.yaml:
base: meta-llama/Llama-3.1-8B-Instruct
task: sft
data:
train: ./data/train.jsonl
format: alpaca
training:
stream_layers: true # стриминг слоев из RAM
quantization: 4bit # NF4 квантование
batch_size: 4
stream_source: auto # RAM или NVMe
lora:
r: 64
alpha: 16
output: ./output
W wersjach 0.72+ strumieniowanie warstw zostało rozszerzone nie tylko na klasyczny SFT, ale także na metody wyrównywania jak DPO i ORPO. W przypadku DPO potrzebny jest model bazowy do porównania, co zwykle podwaja zużycie pamięci. Tutaj narzędzie wykorzystuje to samo strumieniowanie warstw z wyłączonym adapterem, bez tworzenia duplikatu w pamięci.
Kontrola jakości i ochrona przed ukrytymi błędami
Typowy problem dostrajania: model wydaje się nauczyć odpowiadać na twoje konkretne pytania, ale całkowicie zapomniał, jak wywoływać funkcje lub zaczął wyprowadzać uszkodzony JSON.
Soup ma wbudowane narzędzie weryfikacyjne soup ship. To wewnętrzna bramka jakości z zestawem testów (arytmetyka, przestrzeganie schematu JSON, wywoływanie narzędzi, bezpieczeństwo), która uruchamia zarówno oryginalny, jak i dostrojony model.
soup ship --base ./base --adapter ./my-lora --task-eval my_task.jsonl
Polecenie zwraca konkret werdyktu: SHIP lub DON'T SHHIP. Na przykład, jeśli adapter poprawił odpowiedzi w docelowym zadaniu, ale zepsuł składnię wywoływania narzędzi, narzędzie zakończy działanie z niezerowym kodem i pokaże, gdzie wystąpiła regresja.
Eksport i użycie
Gdy adapter jest wytrenowany i zweryfikowany, możesz go spakować do żądanego formatu od razu:
# Проверить ответы в интерактивном режиме
soup chat --model ./output
# Влить LoRA в базовые веса
soup merge --adapter ./output
# Сконвертировать в GGUF для Ollama
soup export --model ./output --format gguf --quant q4_k_m
# Или поднять локальный API-сервер с OpenAI-совместимыми ручками
soup serve --model ./output
Jeśli potrzebujesz uruchomić trening na zdalnej maszynie lub w izolacji bez ręcznego instalowania sterowników, projekt ma gotowy obraz Docker na GitHub Packages (GHCR).
Kto znajdzie ten projekt przydatny
Soup jest skierowany do deweloperów, którzy potrzebują szybkiego cyklu eksperymentowania bez zagłębiania się w tajniki rozproszonego treningu.
Projekt zdecydowanie warto wypróbować, jeśli:
- Chcesz eksperymentować z małymi modelami (Qwen 2.5, Llama 3.1, Gemma) na domowym PC lub laptopie.
- Szukasz gotowej ścieżki: od surowego zbioru danych do pliku GGUF do użytku lokalnego.
- Masz dość pisania tych samych skryptów opartych na HuggingFace TRL dla typowych zadań SFT.
Ograniczenia: wymagany jest Python 3.10–3.12 (kompilacje PyTorch dla 3.13 są obecnie niestabilne). Pełne pre-trenowanie od zera na ogromnych klastrach przez Soup nie jest zalecane — użyj do tego bezpośrednio Megatron lub DeepSpeed. Ale dla stosowanego dostrajania i prototypowania na konsumenckich GPU, to wygodne i dobrze przemyślane narzędzie.
Powiązane projekty