>_ DevTrendsit

Lingua

Home

Linguaggi

Sezioni

Frontend Backend Mobile DevOps AI / ML GameDev Blockchain Embedded Sicurezza
Python

Come fare Fine-Tuning di una Rete Neurale 8B su un Laptop con una GPU da 4 GB

Soup

Chiunque abbia mai provato a fare fine-tuning di un LLM da solo conosce questo rituale: configuri l'ambiente, combatti con le versioni di CUDA, regoli la batch size, catturi infiniti errori CUDA out of memory, e finisci per noleggiare un H100 nel cloud solo per eseguire un paio di epoche su un piccolo dataset. A un certo punto, configurare script e armeggiare con i server inizia a richiedere più tempo della preparazione dei dati e dell'analisi dei risultati.

Recentemente mi sono imbattuto nel repository Soup di Alpamis Makazhan. L'autore si è posto un obiettivo ambizioso: ridurre l'intera pipeline di tuning a un singolo comando console e un semplice file YAML. La cosa più interessante del progetto è la capacità di fare fine-tuning di un modello Llama 3.1 con 8 miliardi di parametri su un RTX 3050 mobile con appena 4 GB di memoria video.

Sembra un trucco di marketing, ma sotto il cofano c'è un'ingegneria interessante e una preprint aperta con benchmark. Analizziamo come funziona e come si comporta nella pratica.

soup train demo

Cosa può fare Soup

Essenzialmente, Soup è un wrapper CLI attorno a uno stack ML popolare (PyTorch, Transformers, PEFT, TRL). L'idea principale è prendersi carico della routine: rilevamento dell'hardware disponibile, quantizzazione, auto-tuning della batch size e formattazione dei dataset.

L'utility copre l'intero workflow del modello:

  • inizializza template per diversi task (chat, codice, tool-calling, classificazione);
  • rileva automaticamente i formati dati (Alpaca, ShareGPT, ChatML) da JSONL, Parquet o CSV;
  • esegue l'addestramento con metodi SFT, DPO, ORPO, SimPO o KTO;
  • testa il risultato per regressioni e unisce gli adapter LoRA nei pesi del modello;
  • esporta il modello in formato GGUF per l'esecuzione in Ollama o llama.cpp.

Per l'uso base, non serve nemmeno PyTorch: una versione CLI leggera si installa in un paio di secondi e aiuta a ispezionare i dati. E se hai bisogno dell'addestramento stesso, lo stack completo viene scaricato.

# Установка пакета с зависимостями для обучения
pip install "soup-cli[train]"

# Создание конфига через мастер или из готового шаблона
soup init --template chat

# Запуск процесса
soup train

Come un modello 8B entra in 4 GB di memoria video

Di solito, un modello con 8 miliardi di parametri anche in forma quantizzata a 4 bit (NF4) richiede circa 5-6 GB di VRAM solo per essere caricato in memoria. Se aggiungi il contesto, le attivazioni e gli adapter LoRA, una scheda con 4 GB inevitabilmente genererà un errore di memoria esaurita.

L'autore di Soup ha usato una tecnica di layer streaming.

Il modello base non viene mantenuto interamente nella memoria video. Viene memorizzato nella RAM del computer (o addirittura letto direttamente da un disco NVMe veloce) e passato alla GPU livello dopo livello. Solo gli adapter LoRA addestrabili e il livello decoder corrente vengono mantenuti permanentemente nella VRAM.

Nei test su un laptop RTX 3050 con 4 GB di VRAM, il modello Llama-3.1-8B-Instruct con quantizzazione NF4 ha mostrato un consumo di memoria di picco di soli 3,32 GB a una velocità di circa 119 token al secondo. I calcoli producono risultati bit-identici rispetto all'addestramento residente convenzionale.

Il layer streaming si attiva letteralmente con una singola riga nel config 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

Nelle versioni 0.72+, il layer streaming è stato esteso non solo al classico SFT ma anche ai metodi di allineamento come DPO e ORPO. Con DPO, hai bisogno del modello base per il confronto, il che di solito raddoppia l'utilizzo della memoria. Qui l'utility usa lo stesso streaming layer con l'adapter disabilitato, senza creare un duplicato in memoria.

Controlli di qualità e protezione dagli errori nascosti

Un problema comune del fine-tuning: il modello sembra aver imparato a rispondere alle tue domande specifiche, ma ha completamente dimenticato come chiamare funzioni o ha iniziato a produrre JSON corrotto.

Soup ha uno strumento di verifica integrato soup ship. Questo è un gate di qualità interno con una serie di test (aritmetica, aderenza allo schema JSON, tool calling, sicurezza) che esegue sia il modello originale che quello con fine-tuning.

soup ship --base ./base --adapter ./my-lora --task-eval my_task.jsonl

Il comando restituisce un verdetto specifico: SHIP o DON'T SHIP. Ad esempio, se l'adapter ha migliorato le risposte sul task target ma ha rotto la sintassi delle chiamate di strumenti, l'utility uscirà con un codice non zero e mostrerà dove è avvenuta la regressione.

Esportazione e utilizzo

Una volta che l'adapter è addestrato e verificato, puoi pacchettizzarlo nel formato desiderato direttamente:

# Проверить ответы в интерактивном режиме
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

Se hai bisogno di eseguire l'addestramento su una macchina remota o in isolamento senza installare manualmente i driver, il progetto ha un'immagine Docker pronta su GitHub Packages (GHCR).

A chi sarà utile questo progetto

Soup è rivolto agli sviluppatori che hanno bisogno di un ciclo di esperimenti rapido senza immergersi nelle profondità dell'addestramento distribuito.

Il progetto vale sicuramente la pena di provarlo se:

  1. Vuoi sperimentare con modelli piccoli (Qwen 2.5, Llama 3.1, Gemma) su un PC di casa o laptop.
  2. Stai cercando una pipeline pronta: dal dataset grezzo a un file GGUF per l'uso locale.
  3. Sei stanco di scrivere sempre gli stessi script basati su HuggingFace TRL per task SFT tipici.

Limitazioni: è richiesto rigorosamente Python 3.10–3.12 (le build PyTorch per 3.13 sono attualmente instabili). Il pre-addestramento completo da zero su cluster enormi tramite Soup non è raccomandato—usa Megatron o DeepSpeed direttamente per quello. Ma per il fine-tuning applicato e il prototipaggio su GPU consumer, questo è uno strumento comodo e ben pensato.

Progetti correlati