欢迎 GPT OSS,OpenAI 的全新开源模型家族!
GPT OSS 是 OpenAI 备受期待的开源权重版本,旨在实现强大的推理、代理任务和多功能开发者用例。它包含两个模型:一个参数量为 117B 的大模型 (gpt-oss-120b),和一个参数量为 21B 的小模型 (gpt-oss-20b)。两者都是专家混合(MoEs)模型,并使用 4 位量化方案 (MXFP4),从而实现快速推理(得益于更少的活跃参数,详见下文),同时保持资源使用率较低。大模型可以在单个 H100 GPU 上运行,而小模型在 16GB 内存内运行,非常适合消费级硬件和设备端应用。
为了使其对社区更好、更有影响力,这些模型在 Apache 2.0 许可证下获得许可,并附带一项最低使用政策。
我们旨在让我们的工具安全、负责任、民主地使用,同时最大限度地控制您如何使用它们。使用 gpt-oss,即表示您同意遵守所有适用法律。
根据 OpenAI 的说法,本次发布是他们对开源生态系统承诺的重要一步,符合其使人工智能惠及大众的既定使命。许多用例依赖于私有和/或本地部署,我们 Hugging Face 非常高兴能欢迎 OpenAI 加入社区。我们相信这些模型将是长期存在、富有启发性和影响力的模型。
目录
功能和架构概览
- 总参数量分别为 21B 和 117B,活跃参数量分别为 3.6B 和 5.1B。
- 使用 mxfp4 格式的 4 位量化方案。仅应用于 MoE 权重。如前所述,120B 模型适用于单个 80 GB GPU,20B 模型适用于单个 16GB GPU。
- 推理、纯文本模型;支持思维链和可调推理工作量级别。
- 指令遵循和工具使用支持。
- 使用 transformers、vLLM、llama.cpp 和 ollama 进行推理实现。
- Responses API 推荐用于推理。
- 许可证:Apache 2.0,附带小型补充使用政策。
架构
- 带有 SwiGLU 激活的 Token-choice MoE。
- 计算 MoE 权重时,对选定的专家进行 softmax(softmax-after-topk)。
- 每个注意力层使用 128K 上下文的 RoPE。
- 交替注意力层:全上下文和滑动 128 令牌窗口。
- 注意力层对每个头部使用一个学习型注意力汇聚,其中 softmax 的分母有一个额外的加性值。
- 它使用与 GPT-4o 和其他 OpenAI API 模型相同的分词器。
- 已整合一些新令牌以实现与 Responses API 的兼容性。
o3 和 o4-mini 相比(来源:OpenAI)。通过推理提供商进行 API 访问
OpenAI GPT OSS 模型可通过 Hugging Face 的推理提供商服务访问,允许您使用相同的 JavaScript 或 Python 代码向任何受支持的提供商发送请求。这与支持 OpenAI 官方演示的 gpt-oss.com 所用的基础设施相同,您可以在自己的项目中使用它。
以下是一个使用 Python 和超高速 Cerebras 提供商的示例。有关更多信息和附加片段,请查看模型卡中的推理提供商部分以及我们为这些模型制作的专用指南。
import os
from openai import OpenAI
client = OpenAI(
base_url="https://router.huggingface.co/v1",
api_key=os.environ["HF_TOKEN"],
)
completion = client.chat.completions.create(
model="openai/gpt-oss-120b:cerebras",
messages=[
{
"role": "user",
"content": "How many rs are in the word 'strawberry'?",
}
],
)
print(completion.choices[0].message)
推理提供商还实现了 OpenAI 兼容的 Responses API,这是用于聊天模型最先进的 OpenAI 接口,旨在实现更灵活和直观的交互。
以下是使用 Responses API 和 Fireworks AI 提供商的示例。有关更多详细信息,请查看开源的 responses.js 项目。
import os
from openai import OpenAI
client = OpenAI(
base_url="https://router.huggingface.co/v1",
api_key=os.getenv("HF_TOKEN"),
)
response = client.responses.create(
model="openai/gpt-oss-20b:fireworks-ai",
input="How many rs are in the word 'strawberry'?",
)
print(response)
本地推理
使用 Transformers
您需要安装最新版 transformers (v4.55 或更高版本),以及 accelerate 和 kernels。
pip install --upgrade accelerate transformers kernels
模型权重以 mxfp4 格式进行量化,该格式与 Hopper 或 Blackwell 系列 GPU 兼容。这包括 H100、H200 或 GB200 等数据中心显卡,以及 50xx 系列中最新的消费级 GPU。如果您拥有其中一款显卡,mxfp4 将在速度和内存消耗方面提供最佳结果。要使用它,您需要 triton 3.4 和 triton_kernels。如果这些库未安装(或者您没有兼容的 GPU),模型加载将回退到从量化权重解包的 bfloat16。
在我们的测试中,Triton 3.4 与最新的 PyTorch 版本 (2.7.x) 运行良好。您也可以选择安装 PyTorch 2.8——在撰写本文时,它是一个预发布版本(尽管它应该很快发布),但它是与 triton 3.4 一起准备的版本,因此它们可以稳定地协同工作。以下是如何安装 PyTorch 2.8(附带 triton 3.4)和 triton 内核:
# Optional step if you want PyTorch 2.8, otherwise just `pip install torch`
pip install torch==2.8.0 --index-url https://download.pytorch.org/whl/test/cu128
# Install triton kernels for mxfp4 support
pip install git+https://github.com/triton-lang/triton.git@main#subdirectory=python/triton_kernels
以下代码片段展示了 20B 模型的简单推理。在使用 mxfp4 时,它可在 16 GB GPU 上运行,或者在使用 bfloat16 时,大约需要 48 GB。
from transformers import AutoModelForCausalLM, AutoTokenizer
model_id = "openai/gpt-oss-20b"
tokenizer = AutoTokenizer.from_pretrained(model_id)
model = AutoModelForCausalLM.from_pretrained(
model_id,
device_map="auto",
torch_dtype="auto",
)
messages = [
{"role": "user", "content": "How many rs are in the word 'strawberry'?"},
]
inputs = tokenizer.apply_chat_template(
messages,
add_generation_prompt=True,
return_tensors="pt",
return_dict=True,
).to(model.device)
generated = model.generate(**inputs, max_new_tokens=100)
print(tokenizer.decode(generated[0][inputs["input_ids"].shape[-1]:]))
Flash Attention 3
这些模型使用了注意力汇聚(attention sinks),这是 vLLM 团队使其与 Flash Attention 3 兼容的技术。我们已将他们的优化内核打包并集成到 kernels-community/vllm-flash-attn3 中。在撰写本文时,这个超高速内核已在 PyTorch 2.7 和 2.8 的 Hopper 卡上进行了测试。我们预计未来几天将增加覆盖范围。如果您在 Hopper 卡(例如 H100 或 H200)上运行模型,您需要 pip install --upgrade kernels 并在您的代码片段中添加以下行:
from transformers import AutoModelForCausalLM, AutoTokenizer
model_id = "openai/gpt-oss-20b"
tokenizer = AutoTokenizer.from_pretrained(model_id)
model = AutoModelForCausalLM.from_pretrained(
model_id,
device_map="auto",
torch_dtype="auto",
+ # Flash Attention with Sinks
+ attn_implementation="kernels-community/vllm-flash-attn3",
)
messages = [
{"role": "user", "content": "How many rs are in the word 'strawberry'?"},
]
inputs = tokenizer.apply_chat_template(
messages,
add_generation_prompt=True,
return_tensors="pt",
return_dict=True,
).to(model.device)
generated = model.generate(**inputs, max_new_tokens=100)
print(tokenizer.decode(generated[0][inputs["input_ids"].shape[-1]:]))
如我们的上一篇博客文章所述,此代码片段将从kernels-community下载经过优化的预编译内核代码。transformers 团队已构建、打包并测试了代码,因此您可以完全安全地使用它。
其他优化
如果您拥有 Hopper GPU 或更高级别的 GPU,我们建议您出于上述原因使用 mxfp4。如果您还可以使用 Flash Attention 3,那么务必启用它!
如果您的 GPU 与
mxfp4不兼容,那么我们建议您使用 MegaBlocks MoE 内核以获得更好的速度提升。为此,您只需像这样调整您的推理代码:
from transformers import AutoModelForCausalLM, AutoTokenizer
model_id = "openai/gpt-oss-20b"
tokenizer = AutoTokenizer.from_pretrained(model_id)
model = AutoModelForCausalLM.from_pretrained(
model_id,
device_map="auto",
torch_dtype="auto",
+ # Optimize MoE layers with downloadable` MegaBlocksMoeMLP
+ use_kernels=True,
)
messages = [
{"role": "user", "content": "How many rs are in the word 'strawberry'?"},
]
inputs = tokenizer.apply_chat_template(
messages,
add_generation_prompt=True,
tokenize=True,
return_tensors="pt",
return_dict=True,
).to(model.device)
generated = model.generate(**inputs, max_new_tokens=100)
print(tokenizer.decode(generated[0][inputs["input_ids"].shape[-1]:]))
MegaBlocks 优化的 MoE 内核要求模型在
bfloat16上运行,因此内存消耗将高于在mxfp4上运行。如果可能,我们建议您使用mxfp4,否则通过use_kernels=True选择使用 MegaBlocks。
AMD ROCm 支持
OpenAI GPT OSS 已在 AMD Instinct 硬件上验证,我们很高兴地宣布在我们的内核库中初步支持 AMD 的 ROCm 平台,为 Transformers 中即将推出的优化 ROCm 内核奠定基础。MegaBlocks MoE 内核加速已可用于 AMD Instinct(例如 MI300 系列)上的 OpenAI GPT OSS,从而实现更好的训练和推理性能。您可以使用上面所示的相同推理代码进行测试。
AMD 还为用户准备了一个 Hugging Face Space,以便在 AMD 硬件上试用该模型。
可用优化总结
在撰写本文时,下表总结了我们根据 GPU 兼容性和测试提出的建议。我们预计 Flash Attention 3(带汇聚注意力)将兼容更多 GPU。
| mxfp4 | Flash Attention 3 (带汇聚注意力) | MegaBlocks MoE 内核 | |
|---|---|---|---|
| Hopper GPU (H100, H200) | ✅ | ✅ | ❌ |
| Blackwell GPU (GB200, 50xx, RTX Pro 6000) | ✅ | ❌ | ❌ |
| 其他 CUDA GPU | ❌ | ❌ | ✅ |
| AMD Instinct (MI3XX) | ❌ | ❌ | ✅ |
| 如何启用 | 安装 triton 3.4 + triton 内核 | 使用 kernels-community 中的 vllm-flash-attn3" | 使用内核 |
即使 120B 模型可以放在单个 H100 GPU 上(使用 mxfp4),您也可以使用 accelerate 或 torchrun 轻松地在多个 GPU 上运行它。Transformers 提供了一个默认的并行化方案,您还可以利用优化的注意力内核。以下代码片段可以在具有 4 个 GPU 的系统上通过 torchrun --nproc_per_node=4 generate.py 运行。
from transformers import AutoModelForCausalLM, AutoTokenizer
from transformers.distributed import DistributedConfig
import torch
model_path = "openai/gpt-oss-120b"
tokenizer = AutoTokenizer.from_pretrained(model_path, padding_side="left")
device_map = {
"tp_plan": "auto", # Enable Tensor Parallelism
}
model = AutoModelForCausalLM.from_pretrained(
model_path,
torch_dtype="auto",
attn_implementation="kernels-community/vllm-flash-attn3",
**device_map,
)
messages = [
{"role": "user", "content": "Explain how expert parallelism works in large language models."}
]
inputs = tokenizer.apply_chat_template(
messages,
add_generation_prompt=True,
return_tensors="pt",
return_dict=True,
).to(model.device)
outputs = model.generate(**inputs, max_new_tokens=1000)
# Decode and print
response = tokenizer.decode(outputs[0])
print("Model response:", response.split("<|channel|>final<|message|>")[-1].strip())
OpenAI GPT OSS 模型经过广泛训练,以利用工具作为其推理工作的一部分。我们为 transformers 制作的聊天模板提供了很大的灵活性,请查看本帖中后面专门的部分。
Llama.cpp
Llama.cpp 提供原生 MXFP4 支持和 Flash Attention,从发布第一天起,即可在 Metal、CUDA 和 Vulkan 等各种后端上提供最佳性能。
要安装它,请按照 llama.cpp Github 仓库中的指南进行操作。
# MacOS
brew install llama.cpp
# Windows
winget install llama.cpp
推荐的方法是通过 llama-server 使用它
llama-server -hf ggml-org/gpt-oss-120b-GGUF -c 0 -fa --jinja --reasoning-format none
# Then, access https://:8080
我们支持 120B 和 20B 模型。欲了解更多详细信息,请访问此 PR 或 GGUF 模型集合。
vLLM
如前所述,vLLM 开发了支持注意力汇聚的优化 Flash Attention 3 内核,因此您将在 Hopper 卡上获得最佳结果。聊天完成和 Responses API 都受支持。您可以使用以下代码片段安装并启动服务器,该片段假设使用 2 个 H100 GPU:
vllm serve openai/gpt-oss-120b --tensor-parallel-size 2
或者,直接在 Python 中使用,例如:
from vllm import LLM
llm = LLM("openai/gpt-oss-120b", tensor_parallel_size=2)
output = llm.generate("San Francisco is a")
transformers serve
您可以使用 transformers serve 在本地试验模型,无需其他依赖项。您只需启动服务器:
transformers serve
然后,您可以使用 Responses API 发送请求。
# responses API
curl -X POST https://:8000/v1/responses \
-H "Content-Type: application/json" \
-d '{"input": [{"role": "system", "content": "hello"}], "temperature": 1.0, "stream": true, "model": "openai/gpt-oss-120b"}'
您也可以使用标准 Completions API 发送请求。
# completions API
curl -X POST https://:8000/v1/chat/completions \
-H "Content-Type: application/json" \
-d '{"messages": [{"role": "system", "content": "hello"}], "temperature": 1.0, "max_tokens": 1000, "stream": true, "model": "openai/gpt-oss-120b"}'
微调
GPT OSS 模型已完全集成到 trl 中。我们开发了一些使用 SFTTrainer 的微调示例,以帮助您入门:
- OpenAI cookbook 中有一个 LoRA 示例,展示了如何微调模型以支持多语言推理。
- 一个基本的微调脚本,您可以根据需要进行调整。
部署到 Hugging Face 合作伙伴
Azure
Hugging Face 与 Azure 合作,通过 Azure AI 模型目录,将最流行的开源模型(涵盖文本、视觉、语音和多模态任务)直接引入客户环境,以实现安全部署到托管在线端点,利用 Azure 的企业级基础设施、自动扩缩和监控。
GPT OSS 模型现已在 Azure AI 模型目录中提供(GPT OSS 20B,GPT OSS 120B),可部署到在线端点进行实时推理。
Dell
戴尔企业中心是一个安全的在线门户,它简化了使用戴尔平台在本地训练和部署最新开放 AI 模型的过程。它与戴尔合作开发,提供优化的容器、对戴尔硬件的原生支持以及企业级安全功能。
GPT OSS 模型现已在 戴尔企业中心 上提供,可使用戴尔平台在本地部署。
模型评估
GPT OSS 模型是推理模型:因此,它们在评估时需要非常大的生成大小(新令牌的最大数量),因为它们的生成将首先包含推理,然后才是实际答案。使用过小的生成大小可能会在推理过程中中断预测,从而导致误报。在计算指标之前,应从模型答案中删除推理轨迹,以避免解析错误,尤其是在数学或指令评估中。
以下是关于如何使用 lighteval 评估模型(您需要从源代码安装)的示例。
git clone https://github.com/huggingface/lighteval
pip install -e .[dev] # make sure you have the correct transformers version installed!
lighteval accelerate \
"model_name=openai/gpt-oss-20b,max_length=16384,skip_special_tokens=False,generation_parameters={temperature:1,top_p:1,top_k:40,min_p:0,max_new_tokens:16384}" \
"extended|ifeval|0|0,lighteval|aime25|0|0" \
--save-details --output-dir "openai_scores" \
--remove-reasoning-tags --reasoning-tags="[('<|channel|>analysis<|message|>','<|end|><|start|>assistant<|channel|>final<|message|>')]"
对于 20B 模型,这将为您提供 IFEval(严格提示)的 69.5(+/-1.9)和 AIME25(pass@1 中)的 63.3(+/-8.9),这些分数对于此大小的推理模型来说都在预期范围内。
如果您想编写自定义评估脚本,请注意为了正确过滤掉推理标签,您需要在分词器中使用 skip_special_tokens=False,以便在模型输出中获取完整的追踪(使用与上述示例相同的字符串对过滤推理)——您可以在下面了解原因。
聊天和聊天模板
OpenAI GPT OSS 在其输出中使用“通道”的概念。大多数情况下,您会看到一个“分析”通道,其中包含不打算发送给最终用户的内容,例如思维链,以及一个“最终”通道,其中包含实际打算向用户显示的消息。
假设没有使用工具,模型输出的结构如下:
<|start|>assistant<|channel|>analysis<|message|>CHAIN_OF_THOUGHT<|end|><|start|>assistant<|channel|>final<|message|>ACTUAL_MESSAGE
大多数时候,您应该忽略除 <|channel|>final<|message|> 后面的文本以外的所有内容。只有此文本应作为助理消息附加到聊天中,或显示给用户。然而,此规则有两个例外:在训练期间或模型调用外部工具时,您可能需要将分析消息包含在历史记录中。
训练时:如果您正在为训练格式化示例,通常会希望在最终消息中包含思维链。正确的做法是在 thinking 键中进行。
chat = [
{"role": "user", "content": "Hi there!"},
{"role": "assistant", "content": "Hello!"},
{"role": "user", "content": "Can you think about this one?"},
{"role": "assistant", "thinking": "Thinking real hard...", "content": "Okay!"}
]
# add_generation_prompt=False is generally only used in training, not inference
inputs = tokenizer.apply_chat_template(chat, add_generation_prompt=False)
您可以随意在先前的对话轮次中或在进行推理而非训练时包含思考键,但它们通常会被忽略。聊天模板只会包含最新的思维链,并且只在训练时(当 add_generation_prompt=False 且最后一轮是助手轮次时)才包含。
我们这样做是有一个微妙的原因的:OpenAI gpt-oss 模型是在多轮数据上训练的,除了最后一条思维链之外,所有思维链都被删除了。这意味着当您想要微调 OpenAI gpt-oss 模型时,您应该也这样做。
- 让聊天模板丢弃除最后一条之外的所有思维链
- 除了最终的助手回复之外,所有对话轮次都要遮盖标签,否则您将在没有思维链的情况下训练它,这将导致它生成不带思维链的回复。这意味着您无法将整个多轮对话作为一个单独的样本进行训练;相反,您必须将其分解为每个助手回复一个样本,并且每次只取消遮盖最终的助手回复,以便模型可以从每个对话轮次中学习,同时仍然只在最终消息中正确地看到思维链。
系统和开发者消息
OpenAI GPT OSS 比较特殊,因为它在聊天开始时区分“系统”消息和“开发者”消息,但大多数其他模型只使用“系统”消息。在 GPT OSS 中,系统消息遵循严格的格式,包含当前日期、模型身份和要使用的推理工作级别等信息,而“开发者”消息则更自由,这使得它(非常令人困惑地)与大多数其他模型的“系统”消息相似。
为了使 GPT OSS 更易于与标准 API 配合使用,聊天模板将把角色为“system”或“developer”的消息视为开发者消息。如果您想修改实际的系统消息,可以将特定参数 model_identity 或 reasoning_effort 传递给聊天模板。
chat = [
{"role": "system", "content": "This will actually become a developer message!"}
]
tokenizer.apply_chat_template(
chat,
model_identity="You are OpenAI GPT OSS.",
reasoning_effort="high" # Defaults to "medium", but also accepts "high" and "low"
)
使用 Transformers 进行工具使用
GPT OSS 支持两种工具:“内置”工具 browser 和 python,以及用户提供的自定义工具。要启用内置工具,请将其名称以列表形式传递给聊天模板的 builtin_tools 参数,如下所示。要传递自定义工具,您可以将其作为 JSON schema 或带有类型提示和文档字符串的 Python 函数,使用 tools 参数。有关更多详细信息,请参阅 聊天模板工具文档,或者您可以直接修改以下示例:
def get_current_weather(location: str):
"""
Returns the current weather status at a given location as a string.
Args:
location: The location to get the weather for.
"""
return "Terrestrial." # We never said this was a good weather tool
chat = [
{"role": "user", "content": "What's the weather in Paris right now?"}
]
inputs = tokenizer.apply_chat_template(
chat,
tools=[weather_tool],
builtin_tools=["browser", "python"],
add_generation_prompt=True,
return_tensors="pt"
)
如果模型选择调用工具(通过以 <|call|> 结尾的消息指示),那么您应该将工具调用添加到聊天中,调用工具,然后将工具结果添加到聊天中并再次生成。
tool_call_message = {
"role": "assistant",
"tool_calls": [
{
"type": "function",
"function": {
"name": "get_current_temperature",
"arguments": {"location": "Paris, France"}
}
}
]
}
chat.append(tool_call_message)
tool_output = get_current_weather("Paris, France")
tool_result_message = {
# Because GPT OSS only calls one tool at a time, we don't
# need any extra metadata in the tool message! The template can
# figure out that this result is from the most recent tool call.
"role": "tool",
"content": tool_output
}
chat.append(tool_result_message)
# You can now apply_chat_template() and generate() again, and the model can use
# the tool result in conversation.
致谢
这对于社区来说是一个重要的版本,为了在生态系统中全面支持新模型,各个团队和公司付出了巨大的努力。
这篇博客文章的作者是从为文章本身贡献内容的人中挑选出来的,并不代表对项目的投入程度。除了作者列表之外,还有其他人为内容审阅做出了重要贡献,包括 Merve 和 Sergio。谢谢你们!
集成和启用工作涉及数十人。不分先后,我们要特别感谢开源团队的 Cyril、Lysandre、Arthur、Marc、Mohammed、Nouamane、Harry、Benjamin、Matt。TRL 团队的 Ed、Lewis 和 Quentin 都参与其中。我们还要感谢评估团队的 Clémentine,以及内核团队的 David 和 Daniel。在商业合作方面,Simon、Alvaro、Jeff、Akos、Alvaro 和 Ivar 做出了重要贡献。Hub 和产品团队贡献了推理提供商支持、llama.cpp 支持以及许多其他改进,这都要归功于 Simon、Célina、Pierric、Lucain、Xuan-Son、Chunte 和 Julien。Magda 和 Anna 参与了法律团队的工作。
Hugging Face 的作用是让社区有效地使用这些模型。我们感谢 vLLM 等公司推动了该领域的发展,并珍视我们与推理提供商的持续合作,以提供更简单的方式来构建它们。
当然,我们深切感谢 OpenAI 决定向整个社区发布这些模型。期待未来更多精彩!

