深度長(zhǎng)文,手把手教你微調(diào)Qwen-3大模型,基于Python和Unsloth(下)
維持對(duì)話與推理的比例平衡
在準(zhǔn)備好數(shù)據(jù)集后,通常即可開始模型訓(xùn)練,但我們?nèi)孕杩紤]模型的對(duì)話與推理比例(Chat-to-Reason Ratio)。較高的對(duì)話比例側(cè)重對(duì)話流暢性和通用知識(shí),而較高的推理比例則強(qiáng)調(diào)邏輯推理和問題解決能力。二者的平衡對(duì)構(gòu)建既能進(jìn)行自然對(duì)話又能處理復(fù)雜任務(wù)的多功能模型起著重要作用。
本文假設(shè)需要構(gòu)建一個(gè)對(duì)話模型,因此設(shè)定對(duì)話部分占比70%,推理部分占比30%。實(shí)現(xiàn)方式如下:
import pandas as pd
# 設(shè)定對(duì)話比例
chat_percentage = 0.7
# 按比例采樣通用對(duì)話數(shù)據(jù)集
non_reasoning_subset = pd.Series(non_reasoning_conversations)
non_reasoning_subset = non_reasoning_subset.sample(
int(len(reasoning_conversations) * (1.0 - chat_percentage)),
random_state=2407,
)數(shù)據(jù)預(yù)處理的最后一步是合并數(shù)據(jù)集,代碼如下:
data = pd.concat([
pd.Series(reasoning_conversations),
pd.Series(non_reasoning_subset)
])
data.name = "text"
from datasets import Dataset
combined_dataset = Dataset.from_pandas(pd.DataFrame(data))
combined_dataset = combined_dataset.shuffle(seed=3407)四、模型訓(xùn)練
在準(zhǔn)備好結(jié)構(gòu)化數(shù)據(jù)和帶有LoRA適配器的模型后,即可開始訓(xùn)練。訓(xùn)練前需初始化超參數(shù),這些參數(shù)會(huì)影響訓(xùn)練過程和模型精度。
我們使用??SFTTrainer??和預(yù)設(shè)超參數(shù)初始化訓(xùn)練器:
from trl import SFTTrainer, SFTConfig
trainer = SFTTrainer(
model=model,
tokenizer=tokenizer,
train_dataset=combined_dataset, # 結(jié)構(gòu)化數(shù)據(jù)集
eval_dataset=None,
args=SFTConfig(
dataset_text_field="text", # 用于訓(xùn)練的數(shù)據(jù)集字段
per_device_train_batch_size=2, # 單設(shè)備訓(xùn)練批次大小
gradient_accumulation_steps=4, # 梯度累積步數(shù)
warmup_steps=5, # 學(xué)習(xí)率預(yù)熱步數(shù)
max_steps=30, # 總訓(xùn)練步數(shù)
learning_rate=2e-4, # 學(xué)習(xí)率
logging_steps=1, # 日志記錄頻率
optim="adamw_8bit", # 優(yōu)化器
weight_decay=0.01, # 權(quán)重衰減
lr_scheduler_type="linear", # 學(xué)習(xí)率衰減策略
seed=3407,
report_to="none", # 日志平臺(tái)(可選wandb)
),
)代碼說(shuō)明:
- ?
?SFTTrainer??用于基于自定義數(shù)據(jù)集微調(diào)大語(yǔ)言模型,支持梯度累積、混合精度優(yōu)化等技術(shù),適用于指令調(diào)優(yōu)、對(duì)話生成等任務(wù)。 - 本例中未設(shè)置驗(yàn)證數(shù)據(jù)集(?
?eval_dataset=None??),可根據(jù)需求添加。
完成所有設(shè)置后,啟動(dòng)訓(xùn)練:
trainer_stats = trainer.train()訓(xùn)練過程中,內(nèi)核將輸出每一步的訓(xùn)練損失:
訓(xùn)練LoRA適配的Qwen3模型
五、微調(diào)模型推理
訓(xùn)練完成后,需對(duì)微調(diào)模型進(jìn)行推理以評(píng)估響應(yīng)效果。推理方式分為禁用思考和啟用思考兩種模式。
禁用思考模式
此模式下模型直接生成回答,適用于簡(jiǎn)單任務(wù),計(jì)算效率更高:
messages = [
{"role": "user", "content": "Solve (x + 2)^2 = 0."}
]
text = tokenizer.apply_chat_template(
messages,
tokenize=False,
add_generation_prompt=True, # 生成響應(yīng)必需
enable_thinking=False, # 禁用思考
)
from transformers import TextStreamer
_ = model.generate(
**tokenizer(text, return_tensors="pt").to("cuda"),
max_new_tokens=256, # 最大生成token數(shù)
temperature=0.7, top_p=0.8, top_k=20,
streamer=TextStreamer(tokenizer, skip_prompt=True),
)輸出結(jié)果:
<|im_start|> 要解這個(gè)方程(x + 2)2=0,我們可以對(duì)兩邊取平方根,得到x+2=0,然后兩邊減去2,解得x=-2。<|im_end|>啟用思考模式
此模式下模型會(huì)生成詳細(xì)推理過程,適用于復(fù)雜任務(wù):
messages = [
{"role": "user", "content": "Solve (x + 2)^2 = 0."}
]
text = tokenizer.apply_chat_template(
messages,
tokenize=False,
add_generation_prompt=True,
enable_thinking=True, # 啟用思考
)
_ = model.generate(
**tokenizer(text, return_tensors="pt").to("cuda"),
max_new_tokens=1024, # 延長(zhǎng)生成長(zhǎng)度以容納推理過程
temperature=0.6, top_p=0.95, top_k=20,
streamer=TextStreamer(tokenizer, skip_prompt=True),
)輸出結(jié)果:
用戶讓我解這個(gè)方程(x + 2)2=0。首先,我需要回憶一下如何解二次方程。可能的方法有幾種,比如直接開平方、展開后用求根公式,或者因式分解。不過這個(gè)方程看起來(lái)已經(jīng)是平方的形式了,所以直接開平方可能是最快捷的方法。
首先,方程兩邊都是非負(fù)數(shù),因?yàn)樽筮吺且粋€(gè)平方,右邊是0。所以開平方后,左邊變成|x+2|,右邊是0。絕對(duì)值等于0的情況只有一種,就是里面的表達(dá)式等于0,所以x+2=0,解得x=-2。
不過,為了確保正確,我可以再檢查一下。把x=-2代入原方程,左邊就是(-2+2)2=02=0,右邊也是0,所以解是正確的。
另外,從二次方程的性質(zhì)來(lái)看,這個(gè)方程的判別式b2-4ac=0,說(shuō)明有一個(gè)實(shí)根(重根),所以確實(shí)只有x=-2一個(gè)解。這樣看來(lái),結(jié)果是正確的。保存微調(diào)模型
訓(xùn)練完成后,需保存微調(diào)模型及分詞器。以下是將模型保存至本地的方法:
model.save_pretrained_merged(
"Qwen3-16bit-OpenMathReasoning-Finetuned-Merged",
tokenizer,
save_method="merged_16bit"
)若需將模型推送到Hugging Face Hub,可使用以下代碼(需替換為個(gè)人訪問令牌):
model.push_to_hub_merged(
"Qwen3-16bit-OpenMathReasoning-Finetuned-Merged",
tokenizer,
save_method="merged_16bit",
token="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"
)六、總結(jié)
本文分上、下篇,請(qǐng)完整閱讀。主要內(nèi)容包括:
- Qwen-3的競(jìng)爭(zhēng)力:在多項(xiàng)基準(zhǔn)測(cè)試中超越DeepSeek-R1、Gemini-2.5-Pro等主流模型。
- 微調(diào)核心目標(biāo):通過任務(wù)特定數(shù)據(jù)優(yōu)化模型響應(yīng),使其更貼合垂直領(lǐng)域需求。
- 主要工具鏈:使用unsloth、torch、transformers、trl等庫(kù)實(shí)現(xiàn)高效微調(diào)。
- 數(shù)據(jù)與訓(xùn)練流程:結(jié)構(gòu)化數(shù)據(jù)集構(gòu)建、LoRA適配器應(yīng)用、SFTTrainer訓(xùn)練及推理驗(yàn)證。
- 模型部署:合并LoRA參數(shù)后保存至本地或Hugging Face Hub,便于后續(xù)應(yīng)用。
通過合理平衡對(duì)話與推理比例、選擇高效工具鏈及優(yōu)化訓(xùn)練流程,開發(fā)者可基于Qwen-3構(gòu)建定制化AI助手,極大提升垂直領(lǐng)域任務(wù)的處理能力。
本文轉(zhuǎn)載自????AI科技論談???????,作者:AI科技論談

















