Am ales pentru a acest demers Platforma Nebius si Huggingface pentru inferenta.Platforma ofera un trial de 30 zile care-ti permite sa faci fine tunning pe un adaptor LoRA, in mod gratuit.
Antrenarea unui model AI
Din meniul din stanga Post-training se creeaza un Job de fine tunning care in esenta iti permite sa:
- alegi un Dataset pentru training (am ales Datasetul claude_mythos_distilled_25k pe care l-am descarcat de pe Huggingface WithinUsAI/claude_mythos_distilled_25k
- alegi un base model (am ales Meta Llama meta-llama/Llama-3.2-3B-Instruct )
In ultima etapa a configurarii Job-ului de fine tunning vei seta o integrare cu Huggingface care iti va permite sa upload-ezi rezultatul jobulu de fine-tunning direct pe Huggingface in sectiunea Modele.
De subliniat, rezultatul acestui Job va fi un adaptor PEFT/LoRA care va trebui aplicat peste un model de bază ( in cazul nostru Llamaa-3.2-3B-Instruct) ca sa functioneze. Deci ce se va incarca in Huggingface va fi un adaptor PEFT/LoRA.
Acest adaptor PEFT/LoRA va contine urmatoarele fisiere:
adapter_config.json
adapter_model.safetensors
chat_template.jinja
checkpoint.meta
tokenizer.json
tokenizer_config.json
Daca aplicam acest adaptor PEFT/LoRA pentru base modelul nostru Llama-3.2-3B-Instruct obtinem un model intreg (format GGUF) care se poate folosi direct.
Inferenta pe Huggingface cu Gradio
Mai departe vom face setarile pe Huggingface necesare pentru a putea utliza acest adaptor PEFT/LoRA peste modelul de baza, direct pe Huggingface.
In primul rand configuram fisierul README.md, setand urmatoarele:
- base_model: meta-llama/Llama-3.2-3B-Instruct
- pipeline_tag: text-generation
- datasets: WithinUsAI/claude_mythos_distilled_25k
- library_name: peft
Apoi, ne asiguram ca in fisierul adapter_config.json, avem la pozitia „base_model_name_or_path”: „meta-llama/Llama-3.2-3B-Instruct”.
Pentru a putea opera modelul nostru din Huggingface trebuie sa creem un Space ( alegeti Gradio dintre cele 3 optiuni).
In meniul Files creati un fisier numit Requirements.txt cu urmatorul continut:
gradio
transformers
torch
peft
accelerate
sentencepiece
protobuf
Editati continutul app.py pentru a utliza adaptorul nostru PEFT cu modelul de baza Llama-3.2-3B-Instruct, de data aceasta cel hostat de Huggingface. Continutul app.py va trebui sa arate astfel:
import gradio as gr
import torch
from transformers import AutoTokenizer, AutoModelForCausalLM
from peft import PeftModel
ADAPTER_ID = "doreloprisan/Llama-3.2-3B-Instruct-Mythos-distil-Mersi-ai"
BASE_MODEL_ID = "meta-llama/Llama-3.2-3B-Instruct"
tokenizer = AutoTokenizer.from_pretrained(ADAPTER_ID)
base_model = AutoModelForCausalLM.from_pretrained(
BASE_MODEL_ID,
torch_dtype=torch.float16 if torch.cuda.is_available() else torch.float32,
device_map="auto"
)
model = PeftModel.from_pretrained(base_model, ADAPTER_ID)
model.eval()
def chat(message, history):
messages = []
for user_msg, bot_msg in history:
messages.append({"role": "user", "content": user_msg})
messages.append({"role": "assistant", "content": bot_msg})
messages.append({"role": "user", "content": message})
prompt = tokenizer.apply_chat_template(
messages,
tokenize=False,
add_generation_prompt=True
)
inputs = tokenizer(prompt, return_tensors="pt").to(model.device)
with torch.no_grad():
outputs = model.generate(
**inputs,
max_new_tokens=300,
temperature=0.7,
top_p=0.9,
do_sample=True,
repetition_penalty=1.1,
pad_token_id=tokenizer.eos_token_id
)
response = tokenizer.decode(
outputs[0][inputs["input_ids"].shape[-1]:],
skip_special_tokens=True
)
return response.strip()
demo = gr.ChatInterface(
fn=chat,
title="Llama-3.2-3B-Instruct Mythos distil Mersi AI",
description="Chat demo pentru adaptorul PEFT/LoRA încărcat pe Hugging Face."
)
demo.launch()
Restartati Space-ul si va trebui sa functioneze fara probleme.
Nota:
- Este nevoie sa solicitati acces de la Meta pentru a utiliza modelul Llama
- Este nevoie sa setati din Settings ale Space-ului creat un Secret numit HF_TOKEN pentru acces la modelul Meta
Alte articole relevante
Cum faci Merge la modelul de baza cu adaptorul PEFT
Poti folosi urmatorul script in Google Colab pentru a face Merge intre base model (Llama-3.2-3B-Instruct) si adaptorul PEFT facut cu Nebius Tokenfactory.
!hf auth login
!pip install --upgrade torchao
import torch
from transformers import AutoTokenizer, AutoModelForCausalLM
from peft import PeftModel
BASE_MODEL = "meta-llama/Llama-3.2-3B-Instruct"
ADAPTER = "doreloprisan/Llama-3.2-3B-Instruct-Mythos-distil-Mersi-ai"
MERGED_OUTPUT = "Llama-3.2-3B-Instruct-Mythos-distil-Mersi-ai-GGUF"
tokenizer = AutoTokenizer.from_pretrained(BASE_MODEL, trust_remote_code=True)
base_model = AutoModelForCausalLM.from_pretrained(
BASE_MODEL,
torch_dtype=torch.bfloat16,
device_map="auto",
trust_remote_code=True,
)
model = PeftModel.from_pretrained(base_model, ADAPTER)
model = model.merge_and_unload()
model.save_pretrained(MERGED_OUTPUT, safe_serialization=True)
tokenizer.save_pretrained(MERGED_OUTPUT)
In final incarcam modelul (merged) inapoi in Huggingface
!hf upload doreloprisan/Llama-3.2-3B-Instruct-Mythos-distil-Mersi-ai-GGUF
Urmatorul pas este convertirea modelului Merged in format GGUF pentru a fi utilizat local.
Convertirea unui model in format GGUF pentru utilizare locala
Pentru a realiza aceasta conversie Huggingface recomanda Llama.cpp
Primul pas este instalarea Llama.cpp
git clone https://github.com/ggml-org/llama.cpp
cd llama.cpp
pip install -r requirements.txt
cmake -B build
cmake --build build --config Release -j
Ulterior trecem la convertirea modelului. Din interiorul folderului care contine llama.cpp rulam urmatoarea comanda:
python convert_hf_to_gguf.py ../Llama-3.2-3B-Instruct-Mythos-distil-Mersi-ai-GGUF \
--outfile ../Llama-3.2-3B-Instruct-Mythos-distil-Mersi-ai-f16.gguf \
--outtype f16
sau daca nu aveti calculator prea puternic:
python convert_hf_to_gguf.py ../Llama-3.2-3B-Instruct-Mythos-distil-Mersi-ai-GGUF \
–outfile ../Llama-3.2-3B-Instruct-Mythos-distil-Mersi-ai-bf16.gguf \
–outtype bf16
Astfel vom obine un fisier GGUF pe care -l incarcam in Huggingface.
Quantizeaza fisierul GGUF intr-un format mai mic
Formate recomandate:
Q4_K_M = cea mai buna alagere
Q5_K_M = calitate mai buna, mai mult RAM/VRAM
Q8_0 = calitatea cea mai buna, necesar de memeorie mult mai mare
Exemplu de comanda pentru Quantizare Q4_K_M
./build/bin/llama-quantize \
../Llama-3.2-3B-Instruct-Mythos-distil-Mersi-ai-f16.gguf \
../Llama-3.2-3B-Instruct-Mythos-distil-Mersi-ai-Q4_K_M.gguf \
Q4_K_M
Upload to Huggingface
hf upload doreloprisan/Llama-3.2-3B-Instruct-Mythos-distil-Mersi-ai-GGUF \
Llama-3.2-3B-Instruct-Mythos-distil-Mersi-ai-Q4_K_M.gguf
Testeaza modelul in format GGUF in llama.cpp si Ollama
./build/bin/llama-cli \
-m ../Llama-3.2-3B-Instruct-Mythos-distil-Mersi-ai-Q4_K_M.gguf \
-p „Scrie un cod de functie Python care verifica daca un numar este prim.” \
-n 300
FROM ./Llama-3.2-3B-Instruct-Mythos-distil-Mersi-ai-Q4_K_M.gguf
PARAMETER temperature 0.3
PARAMETER top_p 0.9
PARAMETER num_ctx 8192
ollama create modelul-coder -f Modelfile
ollama run modelul-coder