⚡教程:如何微调 gpt-oss
学习逐步如何使用 Unsloth 在本地训练 OpenAI gpt-oss。
🌐 Colab gpt-oss 微调
5
数据准备

tokenizer.apply_chat_template(
text,
tokenize = False,
add_generation_prompt = False,
reasoning_effort = "medium",
)from unsloth.chat_templates import standardize_sharegpt
dataset = standardize_sharegpt(dataset)
dataset = dataset.map(formatting_prompts_func, batched = True,)print(dataset[0]['text'])
8
保存/导出你的模型
model.save_pretrained_merged(save_directory, tokenizer, save_method="mxfp4)model.push_to_hub_merged(repo_name, tokenizer=tokenizer, token= hf_token, save_method="mxfp4")✨ 保存到 Llama.cpp
apt-get update apt-get install pciutils build-essential cmake curl libcurl4-openssl-dev -y git clone https://github.com/ggml-org/llama.cpp cmake llama.cpp -B llama.cpp/build \\ -DBUILD_SHARED_LIBS=OFF -DGGML_CUDA=ON -DLLAMA_CURL=ON cmake --build llama.cpp/build --config Release -j --clean-first --target llama-cli llama-gguf-split cp llama.cpp/build/bin/llama-* llama.cppython3 llama.cpp/convert_hf_to_gguf.py gpt-oss-finetuned-merged/ --outfile gpt-oss-finetuned-mxfp4.ggufllama.cpp/llama-cli --model gpt-oss-finetuned-mxfp4.gguf \ --jinja -ngl 99 --threads -1 --ctx-size 16384 \ --temp 1.0 --top-p 1.0 --top-k 0 \ -p "生命和宇宙的意义是"

🖥️ 本地 gpt-oss 微调
1
确保你的设备是
try: import numpy; install_numpy = f"numpy=={numpy.__version__}"
!pip install --upgrade -qqq uv
except: install_numpy = "numpy"
"torch>=2.8.0" "triton>=3.4.0" {install_numpy} \
!uv pip install -qqq \
torchvision bitsandbytes \
"unsloth_zoo[base] @ git+https://github.com/unslothai/unsloth-zoo" \
"unsloth[base] @ git+https://github.com/unslothai/unsloth" \
git+https://github.com/huggingface/transformers \
(因为对于 QLoRA 微调没有其他版本可用)。配置以下参数:
git+https://github.com/triton-lang/triton.git@05b2c186c1b6c9a08375389d5efe9cb4c401c075#subdirectory=python/triton_kernels2
配置 gpt-oss 和推理努力(Reasoning Effort)
from unsloth import FastLanguageModel
import torch
max_seq_length = 1024
dtype = None
fourbit_models = [
"unsloth/gpt-oss-20b-unsloth-bnb-4bit", # 使用 bitsandbytes 4bit 量化的 20B 模型
"unsloth/gpt-oss-120b-unsloth-bnb-4bit",
"unsloth/gpt-oss-20b", # 使用 MXFP4 格式的 20B 模型
"unsloth/gpt-oss-120b",
] # 更多模型见 https://huggingface.co/unsloth
model_name = "unsloth/gpt-oss-20b",
model, tokenizer = FastLanguageModel.from_pretrained(
dtype = dtype, # None 自动检测
max_seq_length = max_seq_length, # 可为长上下文选择任意值!
r = 8, # 选择任意大于 0 的数!建议 8、16、32、64、128
load_in_4bit = True, # 4 位量化以降低内存
full_finetuning = False, # 【新】现已支持全量微调!
# token = "hf_...", # 使用 gated 模型时请提供
)3
微调超参数(LoRA)
model = FastLanguageModel.get_peft_model(
model,
# [新增] "unsloth" 使用 30% 更少的显存,支持 2 倍更大的批量大小!
target_modules = ["q_proj", "k_proj", "v_proj", "o_proj",
"gate_proj", "up_proj", "down_proj",],
lora_alpha = 16,
lora_dropout = 0,# 支持任意值,但 = 0 已优化
bias = "none",# 支持任意,但 = "none" 已优化
这是 OpenAI 微调手册中引用的相同数据集。使用多语言数据集的目标是帮助模型学习并泛化跨多种语言的推理模式。
use_gradient_checkpointing = "unsloth",# 对于非常长上下文可为 True 或 "unsloth"
random_state = 3407,
use_rslora = False,# 我们支持秩稳定的 LoRA
loftq_config = None,# 以及 LoftQ
)4
数据准备
convos = examples["messages"]
texts = [tokenizer.apply_chat_template(convo, tokenize = False, add_generation_prompt = False) for convo in convos]
return { "text" : texts, }
pass
dataset = load_dataset("HuggingFaceH4/Multilingual-Thinking", split="train")
from datasets import load_dataset
from trl import SFTConfig, SFTTrainer
数据集tokenizer.apply_chat_template(
text,
tokenize = False,
add_generation_prompt = False,
reasoning_effort = "medium",
)from unsloth.chat_templates import standardize_sharegpt
dataset = standardize_sharegpt(dataset)
dataset = dataset.map(formatting_prompts_func, batched = True,)print(dataset[0]['text'])
5
训练模型
trainer = SFTTrainer(
tokenizer = tokenizer,
model = model,
args = SFTConfig(
train_dataset = dataset,
max_steps = 30,
per_device_train_batch_size = 1,
gradient_accumulation_steps = 4,
warmup_steps = 5,
# num_train_epochs = 1, # 为一次完整训练设置该项。
推理:运行你的训练模型
替换。将其设置为 1 表示对数据集进行 1 次完整遍历。我们通常建议 1 到 3 次遍历,不要更多,否则您会对微调产生过拟合。
logging_steps = 1,
optim = "adamw_8bit",
weight_decay = 0.01,
lr_scheduler_type = "linear",
seed = 3407,
output_dir = "outputs",
report_to = "none", # 用于 WandB 等时设置
),
)
6
messages = [
{"role": "system", "content": "推理语言:法语\n\n你是一个能解决数学问题的有用助手。"},
{"role": "user", "content": "解 x^5 + 3x^4 - 10 = 3。"},
inputs = tokenizer.apply_chat_template(
]
messages,
add_generation_prompt = True,
return_tensors = "pt",
return_dict = True,
).to(model.device)
reasoning_effort = "medium",
_ = model.generate(**inputs, max_new_tokens = 2048, streamer = TextStreamer(tokenizer))
from transformers import TextStreamer
保存并导出你的模型
7
要保存你的微调模型,它可以在 LoRA 合并过程中导出为 Safetensors 格式,使用我们新的
model.push_to_hub_merged(repo_name, tokenizer=tokenizer, token= hf_token)转换并量化合并后的模型:✨ 保存到 Llama.cpp
apt-get update apt-get install pciutils build-essential cmake curl libcurl4-openssl-dev -y git clone https://github.com/ggml-org/llama.cpp cmake llama.cpp -B llama.cpp/build \\ -DBUILD_SHARED_LIBS=OFF -DGGML_CUDA=ON -DLLAMA_CURL=ON cmake --build llama.cpp/build --config Release -j --clean-first --target llama-cli llama-gguf-split cp llama.cpp/build/bin/llama-* llama.cpllama.cpp/llama-quantize gpt-oss-finetuned.gguf gpt-oss-finetuned-Q8_0.gguf Q8_0 llama.cpp/llama-cli --model gpt-oss-finetuned-Q8_0.gguf \🏁 就是这样! --jinja -ngl 99 --threads -1 --ctx-size 16384 \ --temp 1.0 --top-p 1.0 --top-k 0 \ -p "生命和宇宙的意义是"
你已经使用 Unsloth 对 gpt-oss 进行了微调。我们目前正在开发 RL 和 GRPO 的实现,以及改进模型保存和运行的功能,敬请关注。
❓常见问题(FAQ)
1. 我可以将模型导出以便以后在 Hugging Face、llama.cpp GGUF 或 vLLM 中使用吗?
2. 我可以对 gpt-oss 进行 fp4 或 MXFP4 训练吗?
3. 我可以在训练后将模型导出为 MXFP4 格式吗?
4. 我可以对 gpt-oss 做强化学习(RL)或 GRPO 吗?
最后更新于
这有帮助吗?










