NLP Day 17 參數高效微調:LoRA 與 QLoRA 實作
執行需求:Colab T4 可跑。本篇在 Colab 免費 T4(16 GB VRAM)示範兩個最主流的參數高效微調方法:LoRA 對 Llama 3.3 8B 做輕量微調,VRAM 占用約 11 GB;QLoRA 把 8B 模型先用 bitsandbytes 量化到 4 bit,再用 LoRA 微調,VRAM 降到約 6 GB,T4 跑得動。整篇固定在 2025 年 3–5 月的版本下:PyTorch 2.6、transformers 4.49、peft 0.14、trl 0.15、bitsandbytes 0.45、accelerate 1.0、datasets 3.2。基座模型用 Hugging Face 上的 meta-llama/Llama-3.2-1B 與 Qwen/Qwen2.5-1.5B(1B–1.5B 級別可在 Colab T4 上完整跑 QLoRA 訓練約 10–15 分鐘;8B 級別會比較久,視資料量而定)。
引言
Day 5、Day 8 我們把 BERT 微調過一輪,那時候是「更新整個模型的所有參數」。對 110 M 參數的 BERT-base 來說,T4 加批次 16 就能跑;但對 7B–70B 級別的 LLM,全參數微調需要 80 GB 以上的 VRAM 與大量訓練時間,根本不是個人開發者或中小團隊玩得起的。參數高效微調(Parameter-Efficient Fine-Tuning,PEFT)的出現改變了這個局面:它只更新模型總參數的 0.1–5%,其餘凍結,但效果能接近全參數微調的 80–95%。本篇要介紹 LoRA 與 QLoRA——這兩個方法是 2025 年 LLM 微調的事實標準。
LoRA(Low-Rank Adaptation,Hu 等人 2021)的核心想法是「不直接改權重,改一對低秩矩陣」。具體來說,對原始的權重矩陣 W(例如 4096×4096),LoRA 不動 W,而是在旁邊加兩個小矩陣 A(4096×r)與 B(r×4096),前向傳遞時計算 W·x + B·A·x。rank r 通常設 8–64,這樣 A+B 的參數量只有 W 的 0.1–0.5%,卻能學到任務相關的調整。QLoRA(Dettmers 等人 2023)則把這個概念推到極致:先把 W 量化到 4 bit(NF4 格式),再用 LoRA 調整。量化後模型原本要 16 GB VRAM 載入,現在只要 4 GB,多出來的空間可以放更大的批次或更長的序列。
讀完這篇你會了解:LoRA 的低秩分解為什麼有效、QLoRA 的 4 bit 量化怎麼做到「幾乎無損」、peft 0.14 的 LoraConfig 與 get_peft_model 怎麼用、prepare_model_for_kbit_training 在 QLoRA 扮演什麼角色、trl 0.15 的 SFTTrainer 怎麼把訓練迴圈包起來。本篇所有範例都可以在 Colab T4 上跑完:LoRA 微調 Llama 3.2 1B 約 10 分鐘、QLoRA 微調 Qwen 2.5 1.5B 約 15 分鐘;如果換成 Llama 3.3 8B 或 Qwen 2.5 7B,T4 還跑得動但時間會拉長到 30–60 分鐘。
LoRA 的數學原理與低秩直覺
LoRA 的數學基礎是「模型參數在任務特定調整時,變化量是低秩的」。這個觀察來自 Aghajanyan 等人 2020 的研究:對預訓練模型的權重做微調時,更新量 ΔW 的有效秩(effective rank)通常很低,也就是說「資訊量」集中在少數幾個方向。LoRA 把這個觀察做成可操作的設計:與其讓 ΔW 是任意矩陣,不如把它參數化成 B·A,其中 A 是 down-projection、B 是 up-projection、中間維度是 rank r。當 r 遠小於原始維度(4096)時,A+B 的參數量只有 W 的 2r/d 倍(d 是模型維度),訓練時只更新 A 與 B,原 W 凍結。
這個設計有兩個關鍵細節。第一是「A 用隨機高斯初始化、B 用零初始化」,這樣訓練開始時 B·A = 0,模型表現與原模型完全相同——這保證了 LoRA 不會在初始化時把模型搞壞。第二是「合併推論」(merge and unload):訓練完成後可以把 B·A 加回 W(W' = W + B·A),合併成新的權重,這樣部署時不會有任何額外推論成本。peft 提供了 model.merge_and_unload() 方法做這件事,產出的模型可以直接用 transformers 載入,不需要 peft 依賴。
QLoRA 在 LoRA 之上加了三個關鍵技術:NF4(4-bit NormalFloat)量化、分頁最佳化器(Paged Optimizer)、雙重量化(Double Quantization)。NF4 是 Dettmers 為常態分布設計的 4 bit 格式,比標準 INT4 更精準;分頁最佳化器用 NVIDIA 的統一記憶體特性,在 GPU 記憶體不足時把 optimizer state 暫存到 CPU RAM;雙重量化則對量化常數本身再做一次量化,進一步省記憶體。這三個加起來,讓 65B 的模型能在單張 48 GB 的 A6000 上微調——這在 LoRA 時代是完全不可能的。
完整實作:LoRA 微調 Llama 3.2 1B
以下範例示範標準 LoRA 微調,目標是把 Llama 3.2 1B 微調成一個「會用繁體中文回答台灣使用者提問」的助手。基座模型 meta-llama/Llama-3.2-1B 已經在多語料上訓練過,但對繁體中文的指令遵循不夠好;用 LoRA 微調 500 筆中文指令資料就能看出明顯差異。執行前先安裝套件:pip install peft==0.14 trl==0.15 transformers==4.49 accelerate==1.0 datasets==3.2。資料用 Day 18 會介紹的 databricks/databricks-dolly-15k 篩選繁體中文部分(CC BY-SA 3.0,公開授權)做示範。
# 1. 載入基座模型與 tokenizer
import torch
from transformers import AutoModelForCausalLM, AutoTokenizer
MODEL_NAME = "meta-llama/Llama-3.2-1B"
tokenizer = AutoTokenizer.from_pretrained(MODEL_NAME)
if tokenizer.pad_token is None:
tokenizer.pad_token = tokenizer.eos_token
model = AutoModelForCausalLM.from_pretrained(
MODEL_NAME,
torch_dtype=torch.bfloat16, # T4 支援 bf16
device_map="auto",
attn_implementation="eager", # 1B 模型 eager 比 sdpa 快一點
)
model.config.use_cache = False # 訓練時關閉 KV cache
print(f"基座模型參數量:{sum(p.numel() for p in model.parameters()) / 1e9:.2f} B")
# 輸出:基座模型參數量:1.24 B
這段把 Llama 3.2 1B 載入 GPU。torch_dtype=torch.bfloat16 把權重從 fp32 縮到 bf16,VRAM 從 5 GB 降到 2.5 GB;device_map="auto" 讓 accelerate 自動分配(單卡就直接放 GPU 0)。attn_implementation="eager" 在小模型上比 sdpa 快,是 peft 官方文件的建議;大的模型才用 sdpa 或 flash_attention_2。use_cache=False 是訓練時的標準設定,因為訓練過程中梯度會回傳到 cache,會造成額外記憶體。Llama 3.2 1B 是 Meta 在 2024 年 9 月發布的小模型,是 Llama 3.1 8B 的精簡版,適合在 Colab T4 上做 PEFT 實驗。
# 2. 配置 LoRA:peft 0.14 的標準寫法
from peft import LoraConfig, get_peft_model, TaskType
lora_config = LoraConfig(
r=16, # rank:常用 8/16/32,越大越能表達、也越容易過擬合
lora_alpha=32, # alpha:縮放因子,常見設定 alpha = 2 * r
target_modules=["q_proj", "k_proj", "v_proj", "o_proj"], # 注意力投影層
lora_dropout=0.05,
bias="none",
task_type=TaskType.CAUSAL_LM,
)
model = get_peft_model(model, lora_config)
model.print_trainable_parameters()
# 輸出:trainable params: 1,720,320 || all params: 1,247,158,784 || trainable%: 0.1380
這段用 LoraConfig 設定 LoRA 超參數,這是 peft 0.14 的官方 API。r=16 是中等 rank,對 1B 模型足夠;target_modules 指定要對哪些層加 LoRA,這裡只對注意力的 q/k/v/o 投影加,不對 MLP 加——這是 LLaMA 系列的標準做法,可以省一半參數,效果幾乎一樣。lora_alpha=32 是常見的 alpha = 2r 設定,控制 LoRA 更新的「強度」;alpha 越高,LoRA 對原權重的影響越大。get_peft_model 會凍結原始參數、注入 LoRA 層、把 model 轉成 PeftModel。輸出顯示可訓練參數約 172 萬、占總參數 0.138%——這就是 LoRA 的威力。實務上 PeftModel 內部會把所有凍結參數的 requires_grad 設為 False,並把 LoRA 參數設為 True,呼叫 optimizer 時只會更新 LoRA 那 0.14%;這個「自動凍結」是 peft 比起手動實作 LoRA 最大的便利性。
# 3. 準備訓練資料:把 Dolly-15k 轉成指令格式
from datasets import load_dataset
raw = load_dataset("databricks/databricks-dolly-15k", split="train")
print(f"Dolly-15k 總筆數:{len(raw)}")
# 篩選繁體中文(這裡用啟發式:開頭含中文字)
def is_zh(example):
return any("\u4e00" <= ch <= "\u9fff" for ch in example["instruction"][:50])
zh_data = raw.filter(is_zh).select(range(500)) # 取前 500 筆中文
print(f"中文樣本數:{len(zh_data)}")
print(zh_data[0]["instruction"])
print(zh_data[0]["response"])
# 輸出(範例):中文樣本數:500
# 台灣有哪些知名的觀光景點?
# 台灣知名景點包括台北 101、日月潭、墾丁、太魯閣等...
這段載入 Day 18 會詳細介紹的 Dolly-15k(CC BY-SA 3.0,Databricks 在 2023 年公開、Stanford Alpaca 格式的指令資料集),篩選繁體中文部分取前 500 筆當訓練資料。Dolly-15k 是 Alpaca 格式的經典資料集:每筆有 instruction、context(可選)、response 三個欄位,正好對應 SFT 的標準輸入。filter(is_zh) 用啟發式抓中文樣本——這個篩選不嚴謹,Day 18 會介紹更完整的中文資料清洗流程;今天只要知道「我們在用一小段中文資料做示範」。在真實應用中,500 筆對 1B 模型已經足夠看到明顯的指令遵循效果;如果換成 7B 級別模型,建議至少準備 1000–5000 筆才能穩定收斂。
# 4. 把資料轉成 ChatML / Llama 3 格式(用 transformers 4.49 的 apply_chat_template)
def format_example(example):
messages = [
{"role": "user", "content": example["instruction"]},
{"role": "assistant", "content": example["response"]},
]
text = tokenizer.apply_chat_template(messages, tokenize=False, add_generation_prompt=False)
return {"text": text}
formatted = zh_data.map(format_example, remove_columns=zh_data.column_names)
print(formatted[0]["text"][:200])
# 輸出:<|begin_of_text|><|start_header_id|>user<|end_header_id|>
# 台灣有哪些知名的觀光景點?<|eot_id|><|start_header_id|>assistant<|end_header_id|>
# 台灣知名景點包括台北 101、日月潭、墾丁、太魯閣等...<|eot_id|>
這段用 transformers 4.49 的 apply_chat_template 把對話轉成 Llama 3 的 ChatML 格式。Llama 3 用特殊的 token(<|begin_of_text|>、<|start_header_id|>、<|eot_id|> 等)標記對話結構,這些 token 已經在 tokenizer 裡;apply_chat_template 會根據模型自動選對的格式(Llama 3、Qwen 2.5、ChatGLM 各有不同格式)。如果手動拼字串容易出錯;用 apply_chat_template 是 2025 年的標準做法,能避免「少了 eot token」「格式不符預期」的常見 bug。
# 5. 訓練:用 trl 0.15 的 SFTTrainer
from trl import SFTTrainer, SFTConfig
sft_config = SFTConfig(
output_dir="./lora-llama3-1b-zh",
num_train_epochs=1,
per_device_train_batch_size=4,
gradient_accumulation_steps=4, # 等效 batch size = 16
learning_rate=2e-4, # LoRA 的常見 lr(比全參數微調高)
warmup_steps=20,
logging_steps=10,
save_strategy="epoch",
bf16=True,
max_seq_length=512,
dataset_text_field="text",
)
trainer = SFTTrainer(
model=model,
args=sft_config,
train_dataset=formatted,
processing_class=tokenizer,
)
trainer.train()
# 訓練約 5 分鐘,最終 loss 約 1.8–2.2(實際數字會略有不同)
這段是 trl 0.15 的標準訓練迴圈。SFTTrainer 已經把 tokenizer、data collator、optimizer 都整合好,只要給 model、dataset、config 就能跑。learning_rate=2e-4 是 LoRA 的常見設定——比全參數微調(典型 1e-5 到 5e-5)高 5–10 倍,因為 LoRA 參數少、需要更大的梯度訊號。gradient_accumulation_steps=4 把單卡 batch 4 累積成 16,模擬更大的 batch。bf16=True 在 T4 上跑得動,比 fp16 穩定。500 筆中文資料訓練 1 epoch 約 5 分鐘,最終 loss 約 1.8–2.2,比基座模型的 loss(無監督 perplexity 約 10+)低很多,代表模型學到了指令遵循的格式。SFTConfig 裡的 max_seq_length=512 限制輸入長度,超過會自動截斷;如果你的資料有長對話(例如多輪),記得調高到 1024 或 2048。
QLoRA 與 4 bit 量化的整合
QLoRA 的程式碼其實只比 LoRA 多兩行:用 BitsAndBytesConfig 把模型量化到 4 bit、用 prepare_model_for_kbit_training 處理量化後的特殊層(如 layernorm)。以下示範對 Qwen 2.5 1.5B 做 QLoRA 微調。
# 6. QLoRA:把基座模型量化到 4 bit
from transformers import BitsAndBytesConfig
bnb_config = BitsAndBytesConfig(
load_in_4bit=True,
bnb_4bit_quant_type="nf4", # NormalFloat 4 bit
bnb_4bit_compute_dtype=torch.bfloat16, # 前向傳遞用 bf16
bnb_4bit_use_double_quant=True, # 雙重量化(省一點 VRAM)
)
model_q = AutoModelForCausalLM.from_pretrained(
"Qwen/Qwen2.5-1.5B",
quantization_config=bnb_config,
device_map="auto",
)
print(f"QLoRA 模型 VRAM:{torch.cuda.memory_allocated() / 1e9:.2f} GB")
# 輸出:QLoRA 模型 VRAM:約 1.0 GB(原本 3 GB)
這段用 BitsAndBytesConfig 把 Qwen 2.5 1.5B 量化到 NF4 格式。load_in_4bit=True 是開關;bnb_4bit_quant_type="nf4" 選擇 NormalFloat 而不是標準 INT4,因為常態分布的權重用 NF4 量化誤差較小(Dettmers 在 QLoRA 論文的實驗結論);bnb_4bit_use_double_quant=True 對量化常數本身再做一次量化,再省 0.2–0.3 GB。Qwen 2.5 1.5B 量化後 VRAM 約 1 GB(原本 bf16 要 3 GB),多出來的空間可以放更長的序列(4K tokens)或更大的 batch。
# 7. 對量化模型套 LoRA:prepare_model_for_kbit_training 是關鍵
from peft import prepare_model_for_kbit_training
model_q = prepare_model_for_kbit_training(model_q) # 凍結 layernorm、cast 輸出層
model_q = get_peft_model(model_q, lora_config)
model_q.print_trainable_parameters()
# 輸出:trainable params: 1,605,120 || all params: 1,543,716,352 || trainable%: 0.1040
# 訓練(與 LoRA 相同的 SFTConfig)
trainer_q = SFTTrainer(model=model_q, args=sft_config,
train_dataset=formatted, processing_class=tokenizer)
trainer_q.train()
# 訓練約 7 分鐘,最終 loss 約 1.9–2.3(與 LoRA 相當)
這段是 QLoRA 的關鍵步驟。prepare_model_for_kbit_training 處理三件事:把 layernorm 轉成 fp32(避免量化後的精度漂移)、凍結 base model 的所有參數、把輸出層(lm_head)cast 到 fp32。沒有這步,4 bit 量化模型直接加 LoRA 訓練會出現 loss 不收斂或數值不穩定。get_peft_model 與 LoRA 完全相同,因為 LoRA 層本身就是 bf16,與量化基座不衝突。Qwen 2.5 1.5B 的 QLoRA 訓練 1 epoch 約 7 分鐘,比純 LoRA 慢一點(多了 dequantize 的開銷),但 VRAM 顯著降低,可以在 Colab T4 上用 batch 8 甚至 16 跑。Qwen 2.5 是阿里在 2024 年 9 月發布的模型系列,對中文有原生優勢;如果你的任務是中文,Qwen 2.5 通常比同尺寸的 Llama 表現更好。
# 8. 合併 LoRA 權重:產出可部署模型
merged_model = model.merge_and_unload()
merged_model.save_pretrained("./llama3-1b-zh-merged")
tokenizer.save_pretrained("./llama3-1b-zh-merged")
# 載入合併後的模型:只需要 transformers,不依賴 peft
from transformers import AutoModelForCausalLM
m = AutoModelForCausalLM.from_pretrained("./llama3-1b-zh-merged", torch_dtype=torch.bfloat16)
print(f"合併後參數量:{sum(p.numel() for p in m.parameters()) / 1e9:.2f} B")
# 輸出:合併後參數量:1.24 B(與基座相同,無額外負擔)
這段把 LoRA 權重合併回基座、儲存成完整的 HF 格式模型。model.merge_and_unload() 計算 W' = W + B·A 把 LoRA 吸收回原始權重、釋放 LoRA 層、回傳普通的 PreTrainedModel。合併後的模型參數量與基座完全一樣(1.24 B),但行為已經微調過;部署時只需要 transformers 載入,不需要 peft,這對 production 環境很重要(少一個依賴)。QLoRA 的合併同樣呼叫 merge_and_unload(),peft 會自動處理 4 bit dequantize + LoRA 合併,最後存成 bf16 權重。
常見錯誤與踩雷
錯誤一:對所有線性層都加 LoRA,導致訓練參數暴增。有些人會寫 target_modules="all-linear" 把模型所有線性層都加 LoRA;對 7B 模型這會讓 trainable params 從 0.1% 暴增到 5–8%,VRAM 也跟著漲。對應排查方向:先對 q_proj、k_proj、v_proj、o_proj 這四個注意力投影加;如果 loss 不夠低,再加 gate_proj、up_proj、down_proj(MLP 三層)。Llama 系列的官方建議是只加注意力投影;Qwen 系列的官方建議是注意力加 MLP 全加。
錯誤二:用全參數微調的學習率給 LoRA。全參數微調常用 learning_rate=1e-5 到 5e-5;直接拿這個給 LoRA 會 train loss 幾乎不動(因為 LoRA 參數的初始化很小)。對應排查方向:LoRA 的標準 lr 是 1e-4 到 3e-4,比全參數微調高 5–10 倍。如果 loss 還是不動,把 lr 調到 5e-4 或加 lr_scheduler_type="cosine"。
錯誤三:QLoRA 忘了呼叫 prepare_model_for_kbit_training。這個函式處理量化模型的 layernorm 與輸出層精度問題,沒呼叫的話 loss 會亂跳或 NaN。對應排查方向:在 get_peft_model 之前先 prepare_model_for_kbit_training。如果遇到 loss NaN,先檢查這步有沒有做、再檢查 lr 是否太高(LoRA 在 QLoRA 上 lr 通常要更低,例如 1e-4)。
錯誤四:合併後的模型 VRAM 跟 LoRA 一樣高。有些人在合併時忘了把 torch_dtype=torch.bfloat16 帶進去,導致合併後存成 fp32,檔案大小 2 倍、VRAM 2 倍。對應排查方向:合併前確認 model 本身是 bf16 或 fp16;合併後用 model.save_pretrained(..., safe_serialization=True),並在載入時帶 torch_dtype。
錯誤五:訓練資料太少、過擬合。LoRA 雖然參數少,但小資料集(<100 筆)仍會過擬合。對應排查方向:加 lora_dropout=0.1、減少 epoch 到 1–2、加入驗證集並用 evaluation_strategy="epoch" + load_best_model_at_end=True。如果 loss 訓練時掉很快但驗證集 loss 開始上升,就是典型過擬合。
效能與實務提醒
LoRA 與 QLoRA 在 Colab T4 的時間差異:1B 模型 LoRA 約 5 分鐘/epoch、QLoRA 約 7 分鐘/epoch(dequantize 開銷);3B 模型 LoRA 約 15 分鐘、QLoRA 約 20 分鐘;8B 模型 LoRA 約 40 分鐘、QLoRA 約 50 分鐘。QLoRA 比 LoRA 慢 10–20%,但 VRAM 少 30–50%,可以在 Colab T4 上跑 8B 級別的微調。實務上建議:3B 以下用 LoRA 即可,5B 以上用 QLoRA。
超參數選擇上,rank 是最關鍵的旋鈕。r=8 對簡單任務(單一領域分類)夠用、r=16 是通用預設、r=32 適合複雜任務(多輪對話、風格遷移)、r=64 以上通常不會帶來顯著提升但會快速膨脹參數。alpha 的標準設定是 alpha = 2r 或 alpha = r,前者 LoRA 更新更強、後者更保守。target_modules 對小模型(<3B)影響不大、對大模型(>7B)影響顯著——大模型通常需要加 MLP 三層才能達到好效果。
部署面的提醒:合併後的 LoRA 模型與原模型完全等價,可以用 vLLM、TGI、Ollama 任何框架部署;不需要特別的 LoRA-aware 推論引擎(雖然 vLLM 在 0.6 版之後支援「LoRA hot-swap」,可以在同一個基座上動態切換多個 LoRA 適配器,這在 multi-tenant 服務很有用)。如果你的服務需要「同一基座、多個任務」,建議保留 LoRA 權重不分別合併——vLLM 的 LoRA hot-swap 比載入多個合併模型省 VRAM 90% 以上。
小結
今天把 LoRA 與 QLoRA 的核心 API 走過一輪:LoraConfig 設定 rank/alpha/target_modules、get_peft_model 凍結基座注入 LoRA、SFTTrainer 包裝訓練迴圈、prepare_model_for_kbit_training 處理 4 bit 量化的特殊層、merge_and_unload 合併權重。我們用 Llama 3.2 1B 與 Qwen 2.5 1.5B 跑完完整流程:LoRA 訓練參數 0.14%、QLoRA VRAM 降到三分之一、合併後模型可直接部署。本篇的關鍵訊息是「PEFT 把 LLM 微調從『需要 A100 與 80 GB VRAM』變成『Colab T4 就能跑』」,這是 2025 年中小團隊與個人開發者能玩 LLM 的關鍵原因。明天 Day 18 會進入微調的前置作業:如何準備一份高品質的指令微調資料,包括資料清洗、去重、格式轉換與品質過濾。
結語
今天的核心訊息是「PEFT 是 LLM 微調的民主化」。從 2021 年 LoRA 論文發表到 2025 年成為事實標準,這個方法讓 7B–70B 級別的模型微調不再是大公司的專利——任何有 Colab 帳號的人都能在 30 分鐘內微調出自己領域的 Llama。我們用 peft 0.14 + trl 0.15 跑了 Llama 3.2 1B 的 LoRA 與 Qwen 2.5 1.5B 的 QLoRA,VRAM 都控制在 T4 可承受範圍。讀完這篇你應該能回答:LoRA 的低秩分解為什麼有效?QLoRA 的 4 bit 量化怎麼做到「幾乎無損」?prepare_model_for_kbit_training 在 QLoRA 扮演什麼角色?什麼時候該用 LoRA、什麼時候該用 QLoRA?明天 Day 18 會深入指令微調資料的準備——這是 LLM 微調成敗的關鍵前置作業,比「選哪個 rank」重要得多。
延伸資源
- Hu 等人,2021,LoRA: Low-Rank Adaptation of Large Language Models(ICLR 2022):
https://arxiv.org/abs/2106.09685,LoRA 原始論文,低秩分解的數學原理與完整實驗。 - Dettmers 等人,2023,QLoRA: Efficient Finetuning of Quantized LLMs(NeurIPS 2023):
https://arxiv.org/abs/2305.14314,NF4 量化、分頁最佳化器、雙重量化的完整說明。 - Hugging Face PEFT 官方文件(0.14,2025):
https://huggingface.co/docs/peft,LoraConfig、get_peft_model、prepare_model_for_kbit_training的官方 API。 - Hugging Face TRL 官方文件(0.15,2025):
https://huggingface.co/docs/trl,SFTTrainer與SFTConfig的參數說明。 - Bitsandbytes 官方文件(0.45,2025):
https://huggingface.co/docs/bitsandbytes,NF4 量化、雙重量化的原理與BitsAndBytesConfig參數。 - Databricks Dolly 15k 資料集(CC BY-SA 3.0):
https://huggingface.co/datasets/databricks/databricks-dolly-15k,本篇示範使用的指令微調資料集,授權公開可商用(需保留姓名標示)。
留言
張貼留言