Przewodnik po dostrajaniu Mistral 7B za pomocą QLoRA i Axolotl – efektywne trenowanie modeli LLM
Fine-Tuning Modelu Mistral 7B przy Użyciu QLoRA i Axolotl
W dzisiejszym artykule przyjrzymy się procesowi dostrajania modelu Mistral 7B przy użyciu techniki QLoRA oraz narzędzia Axolotl. Dzięki temu podejściu możliwe jest dostosowanie modelu do nowych zadań, nawet przy ograniczonych zasobach GPU. Przedstawimy krok po kroku proces instalacji Axolotl, utworzenia przykładowego zestawu danych, konfiguracji hiperparametrów LoRA, przeprowadzenia dostrajania oraz przetestowania wynikowego modelu.
—
Przygotowanie Środowiska i Instalacja Axolotl
Pierwszym krokiem jest sprawdzenie dostępnych zasobów sprzętowych oraz instalacja niezbędnych narzędzi. Aby obsługiwać duże pliki modelu, takie jak Mistral 7B, konieczne jest zainstalowanie Git LFS. Następnie klonujemy repozytorium Axolotl z GitHuba i instalujemy je w trybie edytowalnym, dzięki czemu możemy korzystać z jego funkcji w dowolnym miejscu systemu.
Poniżej znajduje się kod, który można uruchomić w środowisku Python:
python
# Sprawdzenie dostępności GPU
!nvidia-smi
# Instalacja Git LFS
!sudo apt-get -y install git-lfs
!git lfs install
# Klonowanie i instalacja Axolotl
!git clone https://github.com/OpenAccess-AI-Collective/axolotl.git
%cd axolotl
!pip install -e .
# Powrót do katalogu głównego
%cd /content
Opcjonalnie można również zainstalować konkretną wersję PyTorch przed instalacją Axolotl, jeśli jest to wymagane dla kompatybilności.
—
Tworzenie Przykładowego Zbioru Danych i Konfiguracja QLoRA
Aby przeprowadzić dostrajanie, potrzebujemy zestawu danych zawierającego przykładowe instrukcje i odpowiedzi. W tym celu tworzymy plik w formacie JSONL składający się z prostych zapytań i ich odpowiedzi.
python
import os
# Tworzenie katalogu na dane
os.makedirs("data", exist_ok=True)
# Tworzenie przykładowego zbioru danych
with open("data/sample_instructions.jsonl", "w") as f:
f.write('{"instruction": "Wyjaśnij, czym jest komputer kwantowy w prostych słowach.", "input": "", "output": "Komputery kwantowe wykorzystują kubity..."}n')
f.write('{"instruction": "Jaka jest stolica Francji?", "input": "", "output": "Stolicą Francji jest Paryż."}n')
Następnie konfigurujemy plik YAML wskazujący na model bazowy Mistral 7B, określający hiperparametry QLoRA oraz ustawienia treningowe.
yaml
base_model: mistralai/mistral-7b-v0.1
tokenizer: mistralai/mistral-7b-v0.1
# Użycie QLoRA dla oszczędności pamięci
train_type: qlora
bits: 4
double_quant: true
quant_type: nf4
lora_r: 8
lora_alpha: 16
lora_dropout: 0.05
target_modules:
- q_proj
- k_proj
- v_proj
data:
datasets:
- path: /content/data/sample_instructions.jsonl
val_set_size: 0
max_seq_length: 512
cutoff_len: 512
training_arguments:
output_dir: /content/mistral-7b-qlora-output
num_train_epochs: 1
per_device_train_batch_size: 1
gradient_accumulation_steps: 4
learning_rate: 0.0002
fp16: true
logging_steps: 10
save_strategy: "epoch"
evaluation_strategy: "no"
wandb:
enabled: false
Plik ten zawiera kluczowe parametry dostrajania, takie jak ilość epok, rozmiar partii treningowych oraz strategie zapisu modelu.
—
Proces Dostrajania Modelu
Po przygotowaniu środowiska i konfiguracji możemy uruchomić proces dostrajania modelu Mistral 7B. Axolotl automatycznie pobierze wagi modelu (około 13 GB) i rozpocznie trening przy użyciu QLoRA.
python
!axolotl --config /content/qlora_mistral_7b.yml
Podczas treningu pojawią się logi informujące o postępach, w tym wartości funkcji straty na kolejnych krokach. Jeśli wystąpią błędy związane z brakiem pamięci GPU (OOM – Out Of Memory), można zmniejszyć PLACEHOLDERc30e0f4ebedb3437 lub wartość PLACEHOLDER2ab75e5e3d4a897e.
—
Testowanie Dostosowanego Modelu
Po zakończeniu dostrajania możemy przetestować model, aby sprawdzić, jak dobrze przyswoił nowe informacje. Wczytujemy bazowy model Mistral 7B, a następnie nakładamy na niego wagi LoRA.
python
import torch
from peft import PeftModel
from transformers import AutoModelForCausalLM, AutoTokenizer
# Ścieżki do modelu bazowego i wyników dostrajania
base_model_path = "mistralai/mistral-7b-v0.1"
output_dir = "/content/mistral-7b-qlora-output"
# Wczytanie tokenizer-a i modelu bazowego
print("nŁadowanie modelu bazowego i tokenizer-a...")
tokenizer = AutoTokenizer.from_pretrained(base_model_path, trust_remote_code=True)
base_model = AutoModelForCausalLM.from_pretrained(base_model_path, device_map="auto", torch_dtype=torch.float16, trust_remote_code=True)
# Wczytanie wag LoRA
print("nŁadowanie wag QLoRA...")
model = PeftModel.from_pretrained(base_model, output_dir, device_map="auto", torch_dtype=torch.float16)
model.eval()
# Przykładowe zapytanie testowe
prompt = "Jakie są główne różnice między klasycznym a kwantowym komputerem?"
inputs = tokenizer(prompt, return_tensors="pt").to("cuda")
print("nGenerowanie odpowiedzi...")
with torch.no_grad():
outputs = model.generate(**inputs, max_new_tokens=128)
response = tokenizer.decode(outputs[0], skip_special_tokens=True)
print("n=== Wygenerowana odpowiedź ===")
print(response)
Kod ten pozwala na interakcję z modelem i uzyskanie odpowiedzi na przykładowe pytanie dotyczące komputerów kwantowych. Jest to kluczowy etap, który weryfikuje skuteczność przeprowadzonego dostrajania.
—
Podsumowanie
W artykule przedstawiliśmy kompletny proces dostrajania modelu Mistral 7B przy użyciu QLoRA i Axolotl. Pokazaliśmy, jak przygotować środowisko, utworzyć niewielki zbiór danych, skonfigurować hiperparametry oraz przeprowadzić trening. Dzięki zastosowaniu QLoRA możliwe jest oszczędne wykorzystanie zasobów GPU, co czyni ten proces bardziej dostępnym dla użytkowników z ograniczoną mocą obliczeniową.
Zachęcamy do eksperymentowania z różnymi zestawami danych i hiperparametrami, co pozwoli jeszcze bardziej zoptymalizować model do specyficznych zadań. Można również spróbować dostosować inne modele open-source w podobny sposób, aby osiągnąć lepsze wyniki w różnych zastosowaniach sztucznej inteligencji.