Fine-Tuning Modelu Mistral 7B za pomocą QLoRA – Kompleksowy Przewodnik
Wprowadzenie
W świecie modeli językowych fine-tuning odgrywa kluczową rolę w dostosowywaniu modeli do konkretnych zadań. Jednym z ciekawszych sposobów optymalizacji procesów trenowania jest użycie techniki QLoRA, która pozwala na efektywne wykorzystanie ograniczonych zasobów GPU. Poniżej przedstawiamy kompletny przewodnik dotyczący dostosowywania modelu Mistral 7B za pomocą QLoRA i narzędzia Axolotl.
—
Krok 1: Przygotowanie Środowiska i Instalacja Axolotl
Na początek konieczne jest sprawdzenie dostępności karty graficznej oraz jej pamięci. Następnie instalujemy Git LFS, które umożliwia obsługę dużych plików modelu, takich jak Mistral 7B. Kolejnym krokiem jest sklonowanie repozytorium Axolotl z GitHuba i instalacja go w trybie edytowalnym, co pozwala na korzystanie z jego narzędzi w dowolnym miejscu.
Jeżeli istnieje potrzeba użycia konkretnej wersji PyTorch, warto ją zainstalować przed Axolotl. Na zakończenie wracamy do katalogu /content
, aby uporządkować ścieżki oraz pliki.
bash
# Sprawdzenie dostępności karty graficznej
!nvidia-smi
# Instalacja Git LFS do obsługi dużych plików modelu
!sudo apt-get -y install git-lfs
!git lfs install
# Klonowanie repozytorium Axolotl i instalacja
!git clone https://github.com/OpenAccess-AI-Collective/axolotl.git
%cd axolotl
!pip install -e .
# Powrót do katalogu głównego
%cd /content
—
Krok 2: Tworzenie Minimalnego Zbioru Danych oraz Konfiguracji QLoRA
Aby przeprowadzić fine-tuning, najpierw musimy przygotować niewielki zbiór danych wejściowych w formacie JSONL, zawierający przykładowe instrukcje oraz odpowiedzi modelu. Następnie tworzymy plik konfiguracyjny YAML, który wskazuje bazowy model Mistral 7B oraz definiuje parametry QLoRA, takie jak liczba bitów dla kwantyzacji, dropout czy długość sekwencji.
python
import os
# Tworzenie katalogu na dane
os.makedirs("data", exist_ok=True)
# Tworzenie przykładowego zestawu instrukcji
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')
# Definiowanie konfiguracji QLoRA dla modelu Mistral 7B
config_text = """
base_model: mistralai/mistral-7b-v0.1
tokenizer: mistralai/mistral-7b-v0.1
# Użycie QLoRA do minimalizacji zużycia 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
"""
# Zapis konfiguracji do pliku YAML
with open("qlora_mistral_7b.yml", "w") as f:
f.write(config_text)
print("Zbiór danych i konfiguracja QLoRA zostały utworzone.")
—
Krok 3: Fine-Tuning Modelu z Wykorzystaniem Axolotl
Gdy wszystkie pliki są gotowe, możemy uruchomić proces trenowania modelu. Axolotl pobierze i załaduje wagę modelu Mistral 7B (około 13 GB), a następnie rozpocznie fine-tuning z użyciem QLoRA. Dzięki kwantyzacji do 4-bitowej precyzji znacząco obniżamy zużycie pamięci GPU.
bash
!axolotl --config /content/qlora_mistral_7b.yml
Podczas treningu będziemy mogli śledzić logi, które zawierają m.in. informacje o postępie oraz wartości funkcji straty. Jeśli wystąpią błędy związane z brakiem pamięci (OOM – Out Of Memory), można zmniejszyć maksymalną długość sekwencji (PLACEHOLDER3b9c6b5aaf67a7e9) lub parametr PLACEHOLDERcbc78479fcfde52f.
—
Krok 4: Testowanie Dostosowanego Modelu
Po zakończeniu fine-tuningu należy sprawdzić, czy model został prawidłowo dostosowany. W tym celu wczytujemy bazowy model Mistral 7B, nakładamy na niego wytrenowane wagi LoRA i generujemy przykładową odpowiedź na pytanie dotyczące różnic między komputerami klasycznymi a kwantowymi.
python
import torch
from peft import PeftModel
from transformers import AutoModelForCausalLM, AutoTokenizer
# Ścieżki do modelu bazowego i wynikowego
base_model_path = "mistralai/mistral-7b-v0.1"
output_dir = "/content/mistral-7b-qlora-output"
# Ładowanie modelu i tokenizera
print("nŁadowanie modelu bazowego oraz tokenizera...")
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
)
# Nakładanie wag LoRA
print("nŁadowanie adaptera QLoRA...")
model = PeftModel.from_pretrained(base_model, output_dir, device_map="auto", torch_dtype=torch.float16)
model.eval()
# Przykładowe zapytanie
prompt = "Jakie są główne różnice między komputerami klasycznymi a kwantowymi?"
inputs = tokenizer(prompt, return_tensors="pt").to("cuda")
# Generowanie odpowiedzi
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=== Odpowiedź modelu ===")
print(response)
—
Podsumowanie
Powyższy przewodnik pokazuje, jak w kilku krokach dostosować model językowy Mistral 7B przy użyciu techniki QLoRA i narzędzia Axolotl. Fine-tuning w ten sposób jest niezwykle efektywny, szczególnie w środowiskach o ograniczonych zasobach sprzętowych. Dzięki temu możemy uzyskać spersonalizowany model zdolny do generowania odpowiedzi dostosowanych do specyficznych zastosowań.
Teraz można eksperymentować z większym zestawem danych, modyfikować hiperparametry lub wypróbować inne modele open-source, aby jeszcze bardziej zoptymalizować proces trenowania.