21 lutego, 2025

Optymalizacja Llama 3.2 3B Instruct do generowania kodu w Pythonie – Kompletny przewodnik z Unsloth

Fine-tuning modelu Llama 3.2 3B Instruct – przewodnik krok po kroku

Sztuczna inteligencja i modele językowe zyskują na popularności, a ich dostosowywanie do konkretnych zastosowań, takich jak analiza kodu, staje się coraz bardziej powszechne. W tym przewodniku przeprowadzimy Cię przez proces konfiguracji i fine-tuningu modelu Llama 3.2 3B Instruct przy użyciu specjalnie przygotowanego zbioru danych w języku Python. Dzięki temu zrozumiesz, jak personalizować duże modele językowe pod kątem zadań związanych z programowaniem oraz jakie narzędzia i konfiguracje są niezbędne do wykorzystania biblioteki Unsloth w procesie fine-tuningu.

Instalacja wymaganych zależności

Zanim rozpoczniemy fine-tuning, musimy zainstalować wszystkie niezbędne biblioteki. W tym celu uruchamiamy następujące polecenia:

python
!pip install "unsloth[colab-new] @ git+https://github.com/unslothai/unsloth.git"
!pip install "git+https://github.com/huggingface/transformers.git"
!pip install -U trl
!pip install --no-deps trl peft accelerate bitsandbytes
!pip install torch torchvision torchaudio triton
!pip install xformers
!python -m xformers.info
!python -m bitsandbytes

Powyższe komendy instalują oraz aktualizują kluczowe biblioteki, takie jak Unsloth, Transformers, xFormers i BitsAndBytes, które są wymagane do przeprowadzenia fine-tuningu modelu Llama 3.2 3B Instruct. Ostatnie dwie linie kodu służą do uruchomienia komend diagnostycznych, które sprawdzają poprawność instalacji.

Importowanie niezbędnych bibliotek

Po zainstalowaniu zależności możemy zaimportować kluczowe klasy i funkcje:

python
from unsloth import FastLanguageModel
from trl import SFTTrainer
from transformers import TrainingArguments
import torch
from datasets import load_dataset

Zaimportowane moduły pozwalają na trenowanie i dostosowywanie modelu, a także na wczytanie zbioru danych z platformy Hugging Face.

Wczytywanie zbioru danych w języku Python

Aby rozpocząć proces trenowania, musimy wczytać odpowiedni zbiór danych:

python
max_seq_length = 2048
dataset = load_dataset("user/Llama-3.2-Python-Alpaca-143k", split="train")

W powyższym kodzie ustawiliśmy maksymalną długość sekwencji na 2048 tokenów oraz pobraliśmy zbiór danych zapisany na profilu użytkownika w serwisie Hugging Face. Własne zbiory danych można przechowywać na swoim koncie, aby ułatwić dostęp w przyszłości.

Inicjalizacja modelu Llama 3.2 3B Instruct

Teraz możemy załadować model Llama 3.2 3B Instruct w wersji 4-bitowej, co pozwala na oszczędność pamięci:

python
model, tokenizer = FastLanguageModel.from_pretrained(
    model_name = "unsloth/Llama-3.2-3B-Instruct-bnb-4bit",
    max_seq_length = max_seq_length,
    dtype = None,
    load_in_4bit = True
)

Dzięki zastosowaniu 4-bitowej kwantyzacji, model zużywa mniej pamięci VRAM, co pozwala na jego trenowanie nawet na sprzęcie o ograniczonych zasobach.

Konfiguracja LoRA z Unsloth

Aby zoptymalizować proces fine-tuningu, użyjemy techniki LoRA (Low-Rank Adaptation):

python
model = FastLanguageModel.get_peft_model(
    model,
    r = 16,
    target_modules = ["q_proj", "k_proj", "v_proj", "o_proj",
                      "gate_proj", "up_proj", "down_proj"],
    lora_alpha = 16,
    lora_dropout = 0,
    bias = "none",
    use_gradient_checkpointing = "unsloth",
    random_state = 3407,
    use_rslora = False,
    loftq_config = None,
    max_seq_length = max_seq_length
)

Technika LoRA pozwala na efektywne dostrajanie modelu poprzez modyfikowanie tylko wybranych warstw, co znacząco zmniejsza wymagania sprzętowe i przyspiesza proces trenowania.

Montowanie Google Drive (opcjonalnie)

Jeśli korzystasz z Google Colab, warto zamontować dysk Google Drive, aby zapisywać tam wyniki trenowania:

python
from google.colab import drive
drive.mount("/content/drive")

Dzięki temu model i jego parametry zostaną zapisane na Twoim koncie Google Drive, co ułatwi ich późniejsze wykorzystanie.

Konfiguracja pętli trenowania

Następnie konfigurujemy proces trenowania modelu:

python
trainer = SFTTrainer(
    model = model,
    train_dataset = dataset,
    dataset_text_field = "text",
    max_seq_length = max_seq_length,
    tokenizer = tokenizer,
    args = TrainingArguments(
        per_device_train_batch_size = 2,
        gradient_accumulation_steps = 4,
        warmup_steps = 10,
        max_steps = 60,
        learning_rate = 2e-4,
        fp16 = not torch.cuda.is_bf16_supported(),
        bf16 = torch.cuda.is_bf16_supported(),
        logging_steps = 1,
        optim = "adamw_8bit",
        weight_decay = 0.01,
        lr_scheduler_type = "linear",
        seed = 3407,
        output_dir = "/content/drive/My Drive/Llama-3.2-3B-Instruct-bnb-4bit"
    ),
)

trainer.train()

W konfiguracji TrainingArguments określiliśmy m.in.:

Batch size wynoszący 2 na jedno urządzenie,
Liczbę kroków akumulacji gradientów ustawioną na 4, co pozwala efektywnie wykorzystać pamięć GPU,
Maksymalną liczbę kroków treningowych ustawioną na 60,
Współczynnik uczenia (learning rate) na poziomie 0.0002,
Typ optymalizatora: AdamW w wersji 8-bitowej, co zmniejsza zużycie pamięci.

Po skonfigurowaniu wartości hiperparametrów uruchamiamy proces trenowania poprzez wywołanie trainer.train().

Zapisywanie wytrenowanego modelu

Po zakończeniu procesu trenowania warto zapisać dostrojony model, aby można było go później wykorzystać:

python
model.save_pretrained("lora_model")  
tokenizer.save_pretrained("lora_model")

Model oraz tokenizer zostaną zapisane w lokalnym katalogu lora_model, skąd można je później załadować bez konieczności ponownego trenowania.

Podsumowanie

W tym przewodniku krok po kroku omówiliśmy proces fine-tuningu modelu Llama 3.2 3B Instruct do zadań związanych z analizą kodu w języku Python. Korzystając z biblioteki Unsloth, zastosowaliśmy technikę LoRA oraz 4-bitową kwantyzację, co pozwoliło na znaczną redukcję zużycia pamięci oraz optymalizację procesu trenowania. Wykorzystaliśmy również narzędzia Hugging Face do zarządzania zbiorami danych i konfiguracji trenowania.

Dzięki temu przewodnikowi możesz dostosować duże modele językowe do własnych potrzeb, tworząc efektywne rozwiązania w zakresie generowania i analizy kodu.