openaigpt-oss:运行指南

运行并微调 OpenAI 的新开源模型!

OpenAI 发布了“gpt-oss-120b” 和“gpt-oss-20b”,这是两个在 Apache 2.0 许可证下发布的 SOTA 开放语言模型。这两个 128k 上下文模型在推理、工具使用和智能体任务上都优于同等规模的开放模型。你现在可以使用 Unsloth 在本地运行并微调它们!

运行 gpt-oss-20b运行 gpt-oss-120b微调 gpt-oss

微调 gpt-oss-20b,免费使用我们的 Colab 笔记本arrow-up-right

使用以下方式训练 强化学习, gpt-oss-120b 可媲美 o4-mini,而 gpt-oss-20b 可媲美 o3-mini。两者在函数调用和 CoT 推理方面都表现出色,超越了 o1 和 GPT-4o。

为了获得最佳性能,请确保你的总可用内存(统一内存 + VRAM + 系统 RAM)大于你正在下载的量化模型文件大小。如果不满足,llama.cpp 仍然可以通过 SSD/HDD 卸载运行,但推理速度会更慢。

gpt-oss - Unsloth GGUF:

circle-check

📜Unsloth 对 gpt-oss 的修复

circle-info

我们的一些修复已上游合并到 Hugging Face 上 OpenAI 的官方模型中。 查看arrow-up-right

OpenAI 发布了一个名为以下内容的独立解析与分词库 Harmonyarrow-up-right ,它允许用户将对话分词为 OpenAI 为 gpt-oss 偏好的格式。

推理引擎通常改用 jinja 聊天模板,而不是 Harmony 包;在与 Harmony 直接比较后,我们发现其中存在一些问题。如果你看下面,上面的是来自 Harmony 的正确渲染形式。下面的是当前 jinja 聊天模板渲染出来的版本。两者有不少差异!

我们还编写了一些函数,使你可以在不使用 jinja 聊天模板的情况下直接使用 OpenAI 的 Harmony 库——如果你愿意的话,你可以像下面这样直接解析普通对话:

然后使用 encode_conversations_with_harmony 函数,来自 Unsloth:

Harmony 格式包含多个有趣的特性:

  1. reasoning_effort = "medium" 你可以选择 low、medium 或 high,这会改变 gpt-oss 的推理预算——通常设置越高,模型准确性越好。

  2. developer_instructions 就像一个可添加的系统提示词。

  3. model_identity 最好保持不变——你可以编辑它,但我们不确定自定义内容是否能正常工作。

我们发现当前的 jinja 聊天模板存在多个问题(整个生态中有多种实现):

  1. 函数和工具调用使用以下方式渲染 tojson,如果它是 dict 还好,但如果它是字符串,引号和其他 符号会被加上反斜杠转义.

  2. 存在一些 额外的换行 ,出现在 jinja 模板的某些边界处。

  3. 模型的工具调用思考内容应使用 analysis 标签,而不是 final 标签.

  4. 其他聊天模板似乎根本没有使用 <|channel|>final ——最终的助手消息应该使用它。你不应将其用于思考轨迹或工具调用。

我们用于 GGUF、BnB 和 BF16 上传版本以及所有版本的聊天模板都已修复!例如,当比较我们的格式和 Harmony 的格式时,我们不会得到任何不同的字符:

🔢 精度问题

我们在 Tesla T4 和 float16 机器上发现了多个精度问题,主要是因为该模型使用 BF16 训练,因此存在异常值和溢出。MXFP4 实际上并不受 Ampere 及更早 GPU 的支持,因此 Triton 提供了 tl.dot_scaled 用于 MXFP4 矩阵乘法。它会在内部即时将矩阵上转换为 BF16。

我们还制作了一个 MXFP4 推理笔记本arrow-up-right ,可在 Tesla T4 Colab 上使用!

circle-info

软件仿真arrow-up-right 可以让你面向不原生支持微缩放操作的硬件架构。目前在这种情况下,微缩放的 lhs/rhs 会预先上转换为 bf16 元素类型以进行点积计算,

我们发现,如果你将 float16 用作混合精度 autocast 数据类型,一段时间后会出现无穷大。为了解决这个问题,我们发现将 MoE 以 bfloat16 运行,然后保持为 bfloat16 或 float32 精度会更好。如果旧 GPU 甚至不支持 bfloat16(例如 T4),则会使用 float32。

我们还会将 float16 机器上所有操作(例如路由器)的精度改为 float32。

🖥️ 运行 gpt-oss

下面是关于该模型 20B120B 变体的指南。

circle-info

任何比 F16 更小的量化,包括 2-bit,精度损失都很小,因为只有部分组件(例如注意力层)使用较低位宽,而大多数仍保持全精度。这就是为什么它们的大小与 F16 模型接近;例如,2-bit(11.5 GB)版本的表现几乎与完整 16-bit(14 GB)版本相同。一旦 llama.cpp 为这些模型支持更好的量化,我们会尽快上传。

这些 gpt-oss 模型来自 OpenAI,包含一项功能,允许用户调整模型的“推理强度”。这让你能够在模型性能与响应速度(延迟)之间进行权衡,而这种权衡取决于模型用于思考的 token 数量。

这些 gpt-oss 模型提供了三个不同的推理强度级别供你选择:

  • :针对需要非常快速响应且不需要复杂多步推理的任务进行了优化。

  • :在性能与速度之间取得平衡。

  • :为需要强推理能力的任务提供最佳推理表现,但会带来更高的延迟。

⚙️ 推荐设置

OpenAI 为两个模型都推荐以下推理设置:

temperature=1.0, top_p=1.0, top_k=0

  • Temperature 设为 1.0

  • Top_K = 0(或可尝试 100 以获得可能更好的结果)

  • Top_P = 1.0

  • 推荐最小上下文:16,384

  • 最大上下文窗口长度:131,072

聊天模板:

句子/生成结束 token:EOS 是 <|return|>

运行 gpt-oss-20B

为了让我们的动态 4-bit 量化达到每秒 6+ token 的推理速度,至少需要 14GB 统一内存 (VRAM 和 RAM 合计)或单独 14GB 系统 RAM 。经验法则是,你的可用内存应与所使用模型的大小相当或更大。GGUF 链接: unsloth/gpt-oss-20b-GGUFarrow-up-right

注意: 该模型可以在小于其总大小的内存上运行,但这会降低推理速度。只有在追求最快速度时才需要最大内存。

circle-info

请遵循 上述最佳实践。它们与 120B 模型相同。

目前你可以在 Google Colab、Docker、LM Studio 或 llama.cpp 上运行该模型。见下文:

你可以使用我们的 Google Colab 笔记本arrow-up-right

🦥 Unsloth Studio 指南

在本教程中,我们将使用 Unsloth Studio,这是我们用于运行和训练 LLM 的全新 Web UI。借助 Unsloth Studio,你可以在本地于 Mac、Windows和 Linux 上运行模型,并且可以:

1

安装 Unsloth

在终端中运行:

MacOS、Linux、WSL:

Windows PowerShell:

2

启动 Unsloth

MacOS、Linux、WSL、Windows:

然后打开 http://localhost:8888 在浏览器中。

3

搜索并下载 gpt-oss-20b

首次启动时,你需要创建一个密码来保护你的账户,并在之后重新登录。随后你会看到一个简短的入门向导,用于选择模型、数据集和基本设置。你可以随时跳过它。

然后前往 Studio Chat 标签页,在搜索栏中搜索 gpt-oss,并下载你想要的模型和量化版本。

4

运行 gpt-oss-20b

使用 Unsloth Studio 时,推理参数应会自动设置好,不过你仍然可以手动更改。你还可以编辑上下文长度、聊天模板和其他设置。

如需更多信息,你可以查看我们的 Unsloth Studio 推理指南.

🐋 Docker:运行 gpt-oss-20b 教程

如果你已经安装了 Docker Desktop,你只需要运行下面的命令即可完成:

Llama.cpp:运行 gpt-oss-20b 教程

  1. 获取最新版 llama.cpp ,可在 GitHub 这里arrow-up-right找到。你也可以按照下面的构建说明进行操作。如果你没有 GPU,或者只想进行 CPU 推理,请将 -DGGML_CUDA=ON 改为 -DGGML_CUDA=OFF对于 Apple Mac / Metal 设备,设置 -DGGML_CUDA=OFF ,然后像平常一样继续——Metal 支持默认已开启。

  1. 你可以直接通过 Hugging Face 拉取:

  2. 通过以下方式下载模型(安装 pip install huggingface_hub hf_transfer 之后)。如果下载卡住,请参见 Hugging Face Hub,XET 调试

运行 gpt-oss-120b:

为了让我们的 1-bit 量化达到每秒 6+ token 的推理速度,我们建议至少具备 66GB 统一内存 (VRAM 和 RAM 合计)或单独 66GB 系统 RAM 。经验法则是,你的可用内存应与所使用模型的大小相当或更大。GGUF 链接: unsloth/gpt-oss-120b-GGUFarrow-up-right

注意: 该模型可以在小于其总大小的内存上运行,但这会降低推理速度。只有在追求最快速度时才需要最大内存。

circle-info

请遵循 上述最佳实践。它们与 20B 模型相同。

🦥 Unsloth Studio 指南

在本教程中,我们将使用 Unsloth Studio,这是我们用于运行和训练 LLM 的全新 Web UI。借助 Unsloth Studio,你可以在本地于 Mac、Windows和 Linux 上运行模型,并且可以:

1

安装 Unsloth

MacOS、Linux、WSL:

Windows PowerShell:

2

设置 Unsloth Studio(一次性)

安装过程会自动安装 Node.js(通过 nvm)、构建前端、安装所有 Python 依赖,并构建带 CUDA 支持的 llama.cpp。

circle-exclamation
circle-info

WSL 用户: 系统会提示你输入 sudo 密码以安装构建依赖(cmake, git, libcurl4-openssl-dev).

3

启动 Unsloth

MacOS、Linux、WSL:

Windows Powershell:

然后打开 http://localhost:8888 在浏览器中。

4

搜索并下载 gpt-oss-120b

首次启动时,你需要创建一个密码来保护你的账户,并在之后重新登录。随后你会看到一个简短的入门向导,用于选择模型、数据集和基本设置。你可以随时跳过它。

然后前往 Studio Chat 标签页,在搜索栏中搜索 gpt-oss,并下载你想要的模型和量化版本。

5

运行 gpt-oss-120b

使用 Unsloth Studio 时,推理参数应会自动设置好,不过你仍然可以手动更改。你还可以编辑上下文长度、聊天模板和其他设置。

如需更多信息,你可以查看我们的 Unsloth Studio 推理指南.

📖 Llama.cpp:运行 gpt-oss-120b 教程

对于 gpt-oss-120b,我们将专门使用 Llama.cpp 来进行优化推理。

circle-check
  1. 获取最新版 llama.cpp ,可在 GitHub 这里arrow-up-right找到。你也可以按照下面的构建说明进行操作。如果你没有 GPU,或者只想进行 CPU 推理,请将 -DGGML_CUDA=ON 改为 -DGGML_CUDA=OFF

  2. 你可以直接使用 llama.cpp 下载模型,但我通常建议使用 huggingface_hub 要直接使用 llama.cpp,请执行:

  3. 或者,通过以下方式下载模型(安装 pip install huggingface_hub hf_transfer 之后)。你可以选择 UD-Q2_K_XL,或其他量化版本..

  4. 以对话模式运行模型,并尝试任意提示词。

  5. 编辑 --threads -1 以设置 CPU 线程数, --ctx-size 262114 用于上下文长度, --n-gpu-layers 99 用于将若干层卸载到 GPU。如果你的 GPU 显存不足,请尝试调整它。如果你只进行 CPU 推理,也请移除它。

circle-check

🛠️ 提升生成速度

如果你有更多 VRAM,可以尝试卸载更多的 MoE 层,或者直接卸载整个层。

通常, -ot ".ffn_.*_exps.=CPU" 会将所有 MoE 层卸载到 CPU!这实际上可以让你将所有非 MoE 层放进 1 张 GPU 中,从而提高生成速度。如果你有更多 GPU 容量,可以自定义正则表达式以适配更多层。

如果你的 GPU 内存稍多一些,试试 -ot ".ffn_(up|down)_exps.=CPU" 这会卸载 up 和 down 投影的 MoE 层。

试试 -ot ".ffn_(up)_exps.=CPU" 如果你的 GPU 内存更多。这只会卸载 up 投影的 MoE 层。

你也可以自定义正则,例如 -ot "\.(6|7|8|9|[0-9][0-9]|[0-9][0-9][0-9])\.ffn_(gate|up|down)_exps.=CPU" 表示卸载 gate、up 和 down 的 MoE 层,但只从第 6 层开始。

这些 最新的 llama.cpp 发布版arrow-up-right 还引入了高吞吐模式。使用 llama-parallel。阅读更多相关内容 这里arrow-up-right。你还可以 将 KV 缓存量化为 4 位 ,例如以减少 VRAM / RAM 数据移动,这也可以加快生成过程。

🦥 使用 Unsloth 微调 gpt-oss

circle-check

Unsloth 的 gpt-oss 微调速度快 1.5 倍,VRAM 使用减少 70%,并支持长 10 倍的上下文长度。gpt-oss-20b 的 QLoRA 训练可适配 14GB VRAM,gpt-oss-120b 可在 65GB VRAM 上运行。

  • QLoRA 要求: gpt-oss-20b = 14GB VRAM • gpt-oss-120b = 65GB VRAM。

  • BF16 LoRA 要求: gpt-oss-20b = 44GB VRAM • gpt-oss-120b = 210GB VRAM。

阅读我们关于微调 gpt-oss 的分步教程:

openai教程:如何微调 gpt-osschevron-right
circle-check

用于微调 gpt-oss 的免费 Unsloth 笔记本:

强化学习(GRPO)

Unsloth 现在支持 gpt-oss 的 RL!我们制作了两个笔记本,更多细节请阅读我们专门介绍 gpt-oss RL 的博客: gpt-oss RL

💾新功能:gpt-oss 训练后保存到 GGUF、vLLM

你现在可以对 gpt-oss 进行 QLoRA 微调,并直接将模型保存、导出或合并到 llama.cpp, vLLM,或 HF ——不再局限于 Unsloth。我们希望很快会发布一个免费笔记本。

此前,任何经过 QLoRA 微调的 gpt-oss 模型都只能在 Unsloth 中运行。我们通过在 LoRA 合并过程中引入 按需对 MXFP4 进行反量化 基础模型(如 gpt-oss),从而移除了这一限制。这使得你能够 以 bf16 格式导出你微调后的模型.

在微调你的 gpt-oss 模型后,你现在可以通过 单条命令:

将模型合并后直接推送到 hugging-face hub,如果你更喜欢这种方式,可以使用:

💡让高效的 gpt-oss 微调真正可用

我们发现,虽然 MXFP4 效率很高,但它并不原生支持对 gpt-oss 进行训练。为了解决这一限制,我们通过模拟以下方式,为 MXFP4 层专门实现了自定义训练函数: Bitsandbytes NF4 量化。

我们直接使用了 OpenAI 的 Triton Kernels 库来支持 MXFP4 推理。不过对于微调/训练,MXFP4 内核尚不支持训练,因为反向传播还没有实现。我们正在积极在 Triton 中实现它!有一个名为 W_TRANSPOSE 的标志,如文中提到 这里arrow-up-right,应当被实现。导数可以通过权重矩阵的转置来计算,因此我们必须实现转置操作。

如果你想使用 Unsloth 以外的任何库来训练 gpt-oss,你需要在训练前先将权重上转换为 bf16。不过,这种方法会 显著增加 VRAM 占用和训练时间,增幅可高达 300% 的额外内存使用! 所有其他训练方法在训练 20b 模型时都至少需要 65GB VRAM,而 Unsloth 只需要 14GB VRAM(减少 80%)。

由于两个模型都采用了 MoE 架构,20B 模型每个 token 会从 32 个专家中选择 4 个,而 120B 模型每个 token 会从 128 个专家中选择 4 个。在训练和发布时,权重以 MXFP4 格式存储为 nn.Parameter 对象,而不是 nn.Linear 层,这使量化变得复杂,尤其是因为 MoE/MLP 专家部分大约占据了 20B 参数中的 19B。

为了启用 BitsandBytes 量化和内存高效微调,我们将这些参数转换为了 nn.Linear 层。尽管这会让操作稍微变慢,但它允许在内存有限的 GPU 上进行微调,这是值得的权衡。

数据集微调指南

尽管 gpt-oss 仅支持推理,你仍然可以使用非推理 数据集对其进行微调,但这可能会影响它的推理能力。如果你想保持其推理能力(可选),可以混合使用直接答案和思维链示例。请至少在数据集中使用 75% 推理25% 非推理 ,以使模型保留其推理能力。

我们的 gpt-oss-20b 对话笔记本使用的是 OpenAI 的示例数据集,即 Hugging Face 的 Multilingual-Thinking 数据集。使用该数据集的目的是让模型能够学习并发展这四种不同语言中的推理能力。

最后更新于

这有帮助吗?