字节跳动 Seed 团队正式发布了 Seed-OSS 系列开源大型语言模型,提供强大的长上下文、推理、代理和通用功能,以及对开发者友好的多功能特性。
 

模型合集:

https://modelscope.cn/collections/Seed-OSS-93213ae8624640

项目地址:

https://github.com/ByteDance-Seed/seed-oss

01.模型介绍

Seed-OSS 系列开源的三个模型均以 Apache-2.0 许可证发布,允许研究人员和企业开发者自由使用、修改和再分发,具有以下亮点:

  • 灵活的推理预算控制:允许用户根据需要灵活调整推理长度,这种对推理长度的动态控制能力,可在实际应用场景中提升推理效率;
  • 增强推理能力:在保持平衡且优秀的通用能力的同时,针对推理任务进行了特别优化;
  • 智能体能力:在涉及工具使用和问题解决等智能体任务中表现突出;
  • 研究友好:考虑到在预训练中加入合成指令数据可能会影响后续研究,字节同时发布了含有与不含指令数据的预训练模型,为研究社区提供了更多样化的选择;
  • 原生长上下文:在训练中原生支持最长 512K 的上下文窗口。

 

模型评测

Seed-OSS 系列尽管只用了12T token进行训练,依然在多个主流开源基准测试中表现出色,基准测试结果显示,Seed-OSS-36B 位列当前强性能的开源大模型之列。

Seed-OSS-36B-Base

含合成数据版本的 Base 模型在 MMLU-Pro 上取得 65.1 得分,在 MATH 上取得 81.7 得分。非合成基础版本虽然在许多方面略微落后,但也具有竞争力。

Seed-OSS-36B-Instruct

Instruct 版本在多个领域都取得了 SOTA 成绩

  • 数学与推理:Seed-OSS-36B-Instruct 在 AIME24 上取得 91.7% 的成绩,在 BeyondAIME 上取得 65,均代表开源领域的最新 SOTA 水平。
  • 代码能力:在 LiveCodeBench v6 上,Instruct 模型得分 67.4,同样刷新 SOTA 纪录。
  • 长上下文处理:在 RULER(128K 上下文长度)测试中,该模型达到 94.6,创下开源模型的最高分。


 

思考预算

用户可以灵活指定模型的推理预算。下图展示了在不同任务中,随着推理预算变化而产生的性能曲线。对于较简单的任务(如 IFEval),模型的思维链较短,随着推理预算的增加,分数会出现一定波动。而在更具挑战性的任务(如 AIME 和 LiveCodeBench)中,模型的思维链较长,分数则会随着推理预算的增加而提升。

模型在运行过程,会提醒用户 token 使用情况:

<seed:think>
Got it, let's try to solve this problem step by step. The problem says ... ...
<seed:cot_budget_reflect>I have used 129 tokens, and there are 383 tokens remaining for use.</seed:cot_budget_reflect>
Using the power rule, ... ...
<seed:cot_budget_reflect>I have used 258 tokens, and there are 254 tokens remaining for use.</seed:cot_budget_reflect>
Alternatively, remember that ... ...
<seed:cot_budget_reflect>I have used 393 tokens, and there are 119 tokens remaining for use.</seed:cot_budget_reflect>
Because if ... ...
<seed:cot_budget_reflect>I have exhausted my token budget, and now I will start answering the question.</seed:cot_budget_reflect>
</seed:think>
To solve the problem, we start by using the properties of logarithms to simplify the given equations: (full answer omitted).

如果未设置推理预算(默认模式),Seed-OSS 将以无限长度启动推理。如果指定了推理预算,官方建议用户优先选择 512 的整数倍数(如 512、1K、2K、4K、8K 或 16K),因为模型已在这些区间上进行了大量训练。当推理预算为 0 时,模型会被指示直接输出答案;对于低于 512 的预算,官方也建议统一设为 0。

02.模型推理

安装环境

pip install git+ssh://git@github.com/Fazziekey/transformers.git@seed-oss

推理代码


from modelscope import AutoModelForCausalLM, AutoTokenizer
import os
import re
model_name_or_path = "ByteDance-Seed/Seed-OSS-36B-Instruct"
tokenizer = AutoTokenizer.from_pretrained(model_name_or_path)
model = AutoModelForCausalLM.from_pretrained(model_name_or_path, device_map="auto")  # You may want to use bfloat16 and/or move to GPU here
messages = [
    {"role": "user", "content": "How to make pasta?"},
]
tokenized_chat = tokenizer.apply_chat_template(
  messages, 
  tokenize=True, 
  add_generation_prompt=True, 
  return_tensors="pt", 
  thinking_budget=512 # control the thinking budget
)
outputs = model.generate(tokenized_chat.to(model.device), max_new_tokens=2048)
output_text = tokenizer.decode(outputs[0])

03.模型微调

魔搭官方微调框架SWIFT已经支持了Seed-oss系列模型的推理和微调。首先需要安装main分支的SWIFT框架:

pip install git+https://github.com/modelscope/ms-swift.git

接下来,按照模型介绍我们需要安装特殊版本的transformers:

pip install git+https://github.com/Fazziekey/transformers.git@seed-oss

安装完成后,我们先看下使用SWIFT进行推理的流程

THINKING_BUDGET=0 \
swift infer \
  --model ByteDance-Seed/Seed-OSS-36B-Instruct \
  --infer_backend pt

来问个问题:

<<< 计算y=x在0-1区间内的定积分
The current thinking budget is 0, so I will directly start answering the question.</seed:cot_budget_reflect>
</seed:think>要计算函数\(y=x\)在区间\([0,1]\)上的定积分,步骤如下:

### **步骤1:确定原函数**  
根据积分基本公式,\(\int x^n dx = \frac{x^{n+1}}{n+1} + C\)(\(n\neq-1\))。对于\(y=x\)(即\(x^1\)),其原函数为:  
\[F(x) = \frac{x^2}{2} + C\]

### **步骤2:应用牛顿-莱布尼茨公式**  
定积分\(\int_a^b f(x)dx = F(b) - F(a)\),代入\(a=0\),\(b=1\):  
\[
\int_0^1 x dx = F(1) - F(0) = \left(\frac{1^2}{2} + C\right) - \left(\frac{0^2}{2} + C\right) = \frac{1}{2} - 0 = \frac{1}{2}
\]

### **几何意义验证**  
\(y=x\)在\([0,1]\)上的图像是直角三角形,底和高均为1,面积为\(\frac{1}{2}\times1\times1=\frac{1}{2}\),与积分结果一致。

**答案:\(\boxed{\frac{1}{2}}\)**

上面是在没有thinking_budget的条件下的推理,接下来我们试一下有thinking_budget下的推理:

THINKING_BUDGET=1024 \
swift infer \
  --model ByteDance-Seed/Seed-OSS-36B-Instruct \
  --infer_backend pt
<<< 计算y=x在0-1区间内的定积分
<seed:think>
用户现在需要计算y=x在0到1区间的定积分,首先我得回忆一下定积分的定义或者几何意义吧。首先,定积分的几何意义的话,y=x是一条直线,过原点和(1,1),那在0到1之间,它和x轴围成的图形应该是一个三角形吧?对,因为x从0到1,y从0到x,所以这个区域是一个直角三角形,直角边的长度都是1,因为当x=1时y=1,所以两条直角边分别是x轴上从0到1,y轴上从0到1,那三角形面积就是(底×高)/2,这里底和高都是1,所以面积就是1/2,那定积分的结果应该就是1/2?不过可能用户需要用定义或者牛顿-莱布尼茨公式来算,不能只靠几何意义吧?
<seed:cot_budget_reflect>I have used 261 tokens, and there are 763 tokens remaining for use.</seed:cot_budget_reflect>

先想想牛顿-莱布尼茨公式,这个公式说如果F(x)是f(x)的原函数,那么定积分从a到b就是F(b)-F(a)。这里f(x)=x,它的原函数是什么呢?x的原函数应该是(1/2)x²,因为导数(1/2)x²的导数是x,对吧?那F(1)=(1/2)(1)²=1/2,F(0)=(1/2)(0)²=0,所以F(1)-F(0)=1/2-0=1/2,这样就得到结果了。

那如果用定义算的话,定积分是积分和的极限,把区间[0,1]分成n个小区间,每个小区间的长度Δx=(1-0)/n=1/n,取每个小区间的右端点ξi=i/n(i=1,2,...,n),那积分和就是Σf(ξi)Δx=Σ(i/n)(1/n)=Σi/n²,而Σi从1到n是n(n+1)/2,所以积分和就是[n(n+1)/2]/n²=(n+1)/(2n),当n→∞时,极限是(1+1/n)/2→1/2,这样也得到1/2。
<seed:cot_budget_reflect>I have used 560 tokens, and there are 464 tokens remaining for use.</seed:cot_budget_reflect>

或者用黎曼积分的定义,不管怎么分区间,只要分割越来越细,积分和都趋向1/2,所以结果就是1/2。应该没问题吧?主要就是这几种方法,几何意义最直观,牛顿-莱布尼茨最方便,定义法虽然麻烦但能理解本质。用户可能是刚开始学定积分,所以可能需要把这几种方法都提一下?不过问题只是计算,可能直接用牛顿-莱布尼茨最快,但最好还是确认一下原函数对不对,(1/2)x²的导数确实是x,没错,所以F(1)-F(0)=1/2,正确。几何意义上三角形面积也是1/2,两种方法一致,应该没问题。</seed:think>要计算函数\(y=x\)在区间\([0,1]\)上的定积分\(\int_{0}^{1}x\,\text{d}x\),可通过以下方法求解:


### **方法一:几何意义**  
函数\(y=x\)是过原点的直线,在区间\([0,1]\)上,它与\(x\)轴、\(x=1\)围成的图形是**直角三角形**:  
- 直角顶点在\((0,0)\),两条直角边分别沿\(x\)轴(长度1)和\(y\)轴(长度1),  
- 三角形面积公式:\(S=\frac{1}{2}\times底\times高=\frac{1}{2}\times1\times1=\frac{1}{2}\)。  

定积分的几何意义是曲边梯形的面积,故\(\int_{0}^{1}x\,\text{d}x=\frac{1}{2}\)。


### **方法二:牛顿-莱布尼茨公式**  
若\(F(x)\)是\(f(x)=x\)的原函数,则\(\int_{a}^{b}f(x)\,\text{d}x=F(b)-F(a)\)。  

- \(f(x)=x\)的原函数为\(F(x)=\frac{1}{2}x^2\)(因\(F'(x)=x\)),  
- 代入得:\(\int_{0}^{1}x\,\text{d}x=F(1)-F(0)=\frac{1}{2}\times1^2-\frac{1}{2}\times0^2=\frac{1}{2}\)。


### **方法三:定积分定义(积分和极限)**  
将\([0,1]\)分成\(n\)等份,每个小区间长度\(\Delta x=\frac{1}{n}\),取右端点\(\xi_i=\frac{i}{n}\),则:  
\[
\int_{0}^{1}x\,\text{d}x=\lim_{n\to\infty}\sum_{i=1}^{n}f(\xi_i)\Delta x=\lim_{n\to\infty}\sum_{i=1}^{n}\left(\frac{i}{n}\cdot\frac{1}{n}\right)=\lim_{n\to\infty}\frac{1}{n^2}\sum_{i=1}^{n}i
\]  
利用\(\sum_{i=1}^{n}i=\frac{n(n+1)}{2}\),得:  
\[
\lim_{n\to\infty}\frac{1}{n^2}\cdot\frac{n(n+1)}{2}=\lim_{n\to\infty}\frac{n+1}{2n}=\frac{1}{2}
\]


**答案:\(\boxed{\frac{1}{2}}\)**

对比一下我们可以看到,在不同的thinking_budget下,模型的thinking部分的表现并不一样。这来源于模型的system字段不同:

You are an intelligent assistant that can answer questions in one step without the need for reasoning and thinking, that is, your thinking budget is 0. Next, please skip the thinking process and directly start answering the user\'s questions.\n'

以及

You are an intelligent assistant with reflective ability. In the process of thinking and reasoning, you need to strictly follow the thinking budget, which is 1024. That is, you need to complete your thinking within 1024 tokens and start answering the user's questions. You will reflect on your thinking process every 256 tokens, stating how many tokens have been used and how many are left.\n

在不同的thinking budget下,模型会使用不同的system字段,并在thinking部分不断自我提醒剩余toke

<seed:cot_budget_reflect>I have used 261 tokens, and there are 763 tokens remaining for use.</seed:cot_budget_reflect>

因此我们在训练时,也会遵循这种方式。SWIFT针对该模型支持的特性有:

  1. 支持THINKING_BUDGET环境变量手动指定thinking budget,默认没有值,既在推理时budget为0,训练时根据数据集行的最大thinking token自动指派budget
  2. 支持SEED_USE_THINKING=true/false环境变量针对非thinking数据集进行budget=0的空thinking改造,为false时不添加thinking部分,默认值true
  3. 支持SEED_USE_BUDGET_INTERVAL=true/false环境变量针对thinking部分自动添加<seed:cot_budget_reflect>部分,默认值false

 

下面我们给出一个完整的例子:


NPROC_PER_NODE=8 \
SEED_USE_BUDGET_INTERVAL=true \
swift sft \
    --model ByteDance-Seed/Seed-OSS-36B-Instruct \
    --dataset swift/Chinese-Qwen3-235B-Thinking-2507-Distill-data-110k-SFT#2000 \
    --train_type lora \
    --torch_dtype bfloat16 \
    --per_device_train_batch_size 2 \
    --learning_rate 1e-5 \
    --load_from_cache_file false \
    --deepspeed zero3 \
    --target_modules all-linear \
    --gradient_accumulation_steps 1 \
    --save_total_limit 2 \
    --save_only_model true \
    --logging_steps 5 \
    --max_length 2048 \
    --warmup_ratio 0.05 \
    --attn_impl flash_attn

看下生成后的一条数据样例:


[INFO:swift] [INPUT] <seed:bos>system
You are an intelligent assistant with reflective ability. In the process of thinking and reasoning, you need to strictly follow the thinking budget, which is 1024. That is, you need to complete your thinking within 1024 tokens and start answering the user's questions. You will reflect on your thinking process every 256 tokens, stating how many tokens have been used and how many are left.
<seed:eos><seed:bos>user
2004年,野餐有60个孩子。2005年,与2004年相比,有一半的孩子来参加野餐。2006年,与2005年相比,有2/3的孩子来参加野餐。2006年有多少孩子来参加野餐?<seed:eos><seed:bos>assistant
<seed:think>我现在要解决的问题是:2004年野餐有60个孩子,2005年比2004年少一半,2006年比2005年少2/3,问2006年有多少孩子。首先,我需要理清楚每年的变化情况,可能需要分步骤计算。
首先,2004年是60个孩子。2005年与2004年相比,有一半的孩子来参加,也就是2005年的人数是2004年的一半。那2005年的人数应该是60乘以1/2,对吧?60的一半是30,所以2005年有30个孩子。
<seed:cot_budget_reflect>I have used 327 tokens, and there are 697 tokens remaining for use.</seed:cot_budget_reflect>
接下来是2006年,题目说与2005年相比,有2/3的孩子来参加。这里需要注意,“有2/3的孩子”是指2006年的人数是2005年的2/3吗?还是说比2005年多了2/3?不过题目里说“与2005年相比,有2/3的孩子来参加”,通常这种说法应该是2006年的人数是2005年的2/3。比如,如果说“比去年少一半”,就是去年的一半,这里“有2/3”应该是指2006年的人数是2005年的2/3。
那2005年是30个孩子,2006年就是30乘以2/3。30乘2/3等于20,所以2006年应该有20个孩子。
不过我需要再确认一下题目中的描述是否正确。题目说“2005年,与2004年相比,有一半的孩子来参加野餐”,也就是2005年的人数是2004年的一半,即60×1/2=30,没错。
<seed:cot_budget_reflect>I have used 515 tokens, and there are 509 tokens remaining for use.</seed:cot_budget_reflect>
然后“2006年,与2005年相比,有2/3的孩子来参加野餐”,这里的“有2/3”应该是指2006年的人数是2005年的2/3,所以30×2/3=20。应该是对的。
可能需要注意的是,有时候可能会有歧义,比如“比2005年多2/3”或者“比2005年少2/3”,但题目里说的是“有2/3的孩子”,也就是数量是2005年的2/3,所以应该是正确的。
再检查一遍计算:2004年60,2005年60/2=30,2006年30×(2/3)=20。对的,结果应该是20。</seed:think>

2004年野餐有60个孩子。  
- **2005年**:与2004年相比,有一半的孩子参加,即 $60 \times \frac{1}{2} = 30$ 人。  
- **2006年**:与2005年相比,有 $\frac{2}{3}$ 的孩子参加,即 $30 \times \frac{2}{3} = 20$ 人。  

**答案:2006年有20个孩子来参加野餐。**<seed:eos>

可以看到,在原始数据集的基础上,增加了<seed:cot_budget_reflect> I have used 515 tokens, and there are 509 tokens remaining for use.</seed:cot_budget_reflect>部分。

如果使用了一个不带有<think>...</think>部分的数据集,会自动增加budget=0的描述,或者也可以使用原始数据集训练而不增加任何思考内容。

训练loss:

显存占用:

ms-swift开源地址:

https://github.com/modelscope/ms-swift

点击链接,直达模型链接~

https://modelscope.cn/collections/Seed-OSS-93213ae8624640

Logo

ModelScope旨在打造下一代开源的模型即服务共享平台,为泛AI开发者提供灵活、易用、低成本的一站式模型服务产品,让模型应用更简单!

更多推荐