# Tinh chỉnh một mô hình

Trọng số đã lượng tử hóa không thể được cập nhật trực tiếp bằng gradient, do đó bạn tinh chỉnh một mô hình đã lượng tử hóa bằng cách huấn luyện một adapter nhỏ trên các trọng số lượng tử hóa đã đóng băng. Việc huấn luyện một adapter [LoRA](https://huggingface.co/docs/peft/main/en/conceptual_guides/lora) trên một mô hình 4-bit được gọi là QLoRA, và nó cho phép bạn tinh chỉnh một mô hình mà nếu ở dạng bf16 sẽ không đủ bộ nhớ để chứa.

[Trainer](/docs/transformers/main/vi/main_classes/trainer#transformers.Trainer) kiểm tra mô hình trước khi huấn luyện để đảm bảo:

- Phương pháp lượng tử hóa hỗ trợ huấn luyện. Xem cột Fine-tune trong [Chọn một phương pháp](./selecting).
- Mô hình có một adapter có thể huấn luyện được gắn vào. Các phương pháp hỗ trợ huấn luyện nhận thức lượng hóa là ngoại lệ, được đề cập [bên dưới](#quantization-aware-training).
- Mô hình không được biên dịch bằng `torch.compile`.

## Huấn luyện một adapter

Cài đặt [PEFT](https://huggingface.co/docs/peft/index).

```bash
pip install -U peft
```

Tải mô hình bằng một phương thức hỗ trợ huấn luyện, gắn bộ thích ứng LoRA bằng [add_adapter()](/docs/transformers/main/vi/main_classes/peft#transformers.integrations.PeftAdapterMixin.add_adapter) và truyền mô hình vào [Trainer](/docs/transformers/main/vi/main_classes/trainer#transformers.Trainer). Ví dụ bên dưới sử dụng 4-bit [bitsandbytes](./bitsandbytes) và giả định `train_dataset` là một tập dữ liệu đã được token hóa.

```py
import torch
from peft import LoraConfig
from transformers import AutoModelForCausalLM, BitsAndBytesConfig, Trainer, TrainingArguments

quantization_config = BitsAndBytesConfig(
    load_in_4bit=True,
    bnb_4bit_quant_type="nf4",
    bnb_4bit_compute_dtype=torch.bfloat16,
)
model = AutoModelForCausalLM.from_pretrained(
    "Qwen/Qwen3-0.6B",
    quantization_config=quantization_config,
    device_map="auto",
)

lora_config = LoraConfig(r=16, lora_alpha=32, target_modules="all-linear", task_type="CAUSAL_LM")
model.add_adapter(lora_config)

trainer = Trainer(
    model=model,
    args=TrainingArguments(output_dir="qwen3-qlora", bf16=True),
    train_dataset=train_dataset,
)
trainer.train()
```

Chỉ trọng số adapter được huấn luyện. Trọng số cơ sở đã lượng tử hóa vẫn được giữ nguyên.

## Lưu adapter

[save_pretrained()](/docs/transformers/main/vi/main_classes/model#transformers.PreTrainedModel.save_pretrained) chỉ lưu các trọng số adapter, chỉ vài megabyte. Cách này hoạt động với mọi phương pháp, bao gồm cả những phương pháp không thể lưu trọng số đã lượng tử hóa.

```py
model.save_pretrained("qwen3-qlora-adapter")
```

Để sử dụng adapter, hãy tải mô hình cơ sở với cùng cấu hình lượng tử hóa và tải adapter lên trên nó. Xem [Tải adapter](../peft#loading-an-adapter) để biết chi tiết.

## Huấn luyện nhận thức lượng tử hóa

[BitNet](./bitnet) và [compressed-tensors](./compressed_tensors) có thể huấn luyện toàn bộ mô hình mà không cần adapter, miễn là trọng số vẫn ở dạng có thể huấn luyện.

- BitNet cần `linear_class="autobitlinear"` và `quantization_mode="online"` trong [BitNetQuantConfig](/docs/transformers/main/vi/main_classes/quantization#transformers.BitNetQuantConfig).
- compressed-tensors cần một checkpoint chưa được nén, hoặc `dequantize=True` trong [CompressedTensorsConfig](/docs/transformers/main/vi/main_classes/quantization#transformers.CompressedTensorsConfig). Các checkpoint sử dụng FP8 kernels không thể huấn luyện.

Xem [Các khái niệm về lượng tử hóa](./concept_guide) để biết cách huấn luyện nhận thức lượng tử hóa khác với lượng tử hóa sau huấn luyện.

