HuggingFace 的復(fù)現(xiàn)計(jì)劃圍繞三個(gè)核心問題展開:

數(shù)據(jù)收集問題:如何策劃推理專用數(shù)據(jù)集?這涉及到數(shù)據(jù)的質(zhì)量控制、多樣性保證以及規(guī)模擴(kuò)展。
模型訓(xùn)練問題:如何在不同規(guī)模和架構(gòu)的模型上找到最優(yōu)超參數(shù)?這需要系統(tǒng)性的實(shí)驗(yàn)和驗(yàn)證。
擴(kuò)展性問題:在訓(xùn)練推理模型時(shí),計(jì)算資源和數(shù)據(jù)之間的權(quán)衡該如何把握?這關(guān)系到模型的實(shí)用性和可復(fù)現(xiàn)性。
為解決這些問題,HuggingFace 設(shè)計(jì)了一個(gè)三階段的復(fù)現(xiàn)策略,這個(gè)策略被清晰地記錄在項(xiàng)目的 README 中:

Step 1: replicate the R1-Distill models by distilling a high-quality corpus from DeepSeek-R1.
Step 2: replicate the pure RL pipeline that DeepSeek used to create R1-Zero.
Step 3: show we can go from base model → SFT → RL via multi-stage training.
這個(gè)策略不僅是對(duì) DeepSeek-R1 的復(fù)現(xiàn),更是對(duì)整個(gè)推理模型訓(xùn)練過程的系統(tǒng)性探索。
HuggingFace 通過這個(gè)項(xiàng)目,希望為開源社區(qū)提供一個(gè)完整的、可復(fù)現(xiàn)的訓(xùn)練方案,讓更多研究者和開發(fā)者能夠參與到推理模型的改進(jìn)中來。


HuggingFace 的三階段復(fù)現(xiàn)策略

DeepSeek-R1 的復(fù)現(xiàn)過程堪稱一場精心策劃的工程探索。HuggingFace 團(tuán)隊(duì)設(shè)計(jì)的三階段策略不僅體現(xiàn)了技術(shù)上的深思熟慮,更展示了工程實(shí)踐的嚴(yán)謹(jǐn)性。

Stage 1: 知識(shí)提取

第一階段的核心任務(wù)是從 DeepSeek-R1 中提取高質(zhì)量的推理數(shù)據(jù)。這個(gè)過程使用了 HuggingFace 自研的 Distilabel 工具,其實(shí)現(xiàn)代碼展示了這一過程的精髓:

def build_distilabel_pipeline(
model: str,
prompt_template: str = “{{ instruction }}”,
temperature: Optional[float] = None,
max_new_tokens: int = 8192,
num_generations: int = 1,
) -> Pipeline:
generation_kwargs = {“max_new_tokens”: max_new_tokens}
if temperature is not None:
generation_kwargs[“temperature”] = temperature
with Pipeline().ray() as pipeline:
TextGeneration(
llm=OpenAILLM(
model=model,
generation_kwargs=generation_kwargs,
),
template=prompt_template,
num_generations=num_generations,
)
return pipeline
這段代碼展示了如何構(gòu)建一個(gè)數(shù)據(jù)生成管道,通過精心設(shè)計(jì)的 prompt 模板和參數(shù)控制,從原始模型中提取高質(zhì)量的推理樣本。特別注意的是溫度參數(shù)(temperature)的控制,它直接影響生成數(shù)據(jù)的多樣性和質(zhì)量。

Stage 2: 強(qiáng)化學(xué)習(xí)路徑

第二階段實(shí)現(xiàn)了純強(qiáng)化學(xué)習(xí)訓(xùn)練流程。這里的核心是 GRPO (Group Relative Policy Optimization) 算法的實(shí)現(xiàn)。項(xiàng)目中的 grpo.py 展示了這一復(fù)雜過程:

def accuracy_reward(completions, solution, **kwargs):
“””Reward function that checks if the completion matches the ground truth.”””
contents = [completion[0][“content”] for completion in completions]
rewards = []
for content, sol in zip(contents, solution):
gold_parsed = parse(sol, extraction_mode=”first_match”,
extraction_config=[LatexExtractionConfig()])
reward = float(verify(gold_parsed, answer_parsed))
rewards.append(reward)
return rewards
這個(gè)獎(jiǎng)勵(lì)函數(shù)設(shè)計(jì)展示了如何評(píng)估模型輸出的質(zhì)量,特別是在數(shù)學(xué)推理這樣需要精確匹配的場景中。通過結(jié)合 latex2sympy2 和數(shù)學(xué)驗(yàn)證工具,實(shí)現(xiàn)了對(duì)推理過程的精確評(píng)估。

Stage 3: 完整訓(xùn)練復(fù)現(xiàn)

第三階段整合了前兩個(gè)階段的成果,實(shí)現(xiàn)了完整的訓(xùn)練流程。這個(gè)階段的關(guān)鍵是監(jiān)督微調(diào)(SFT)和強(qiáng)化學(xué)習(xí)(RL)的有機(jī)結(jié)合。在 sft.py 中,我們可以看到這一過程的具體實(shí)現(xiàn):

def main(script_args, training_args, model_args):
trainer = SFTTrainer(
model=model_args.model_name_or_path,
args=training_args,
train_dataset=dataset[script_args.dataset_train_split],
eval_dataset=dataset[script_args.dataset_test_split],
peft_config=get_peft_config(model_args),
)
trainer.train()
這段代碼展示了如何使用 HuggingFace 的 TRL (Transformer Reinforcement Learning) 庫來實(shí)現(xiàn)監(jiān)督微調(diào)。特別值得注意的是,代碼中集成了 PEFT (Parameter-Efficient Fine-Tuning) 配置,這使得訓(xùn)練過程更加高效。

整個(gè)三階段策略的實(shí)現(xiàn)依賴于精心設(shè)計(jì)的分布式訓(xùn)練框架。項(xiàng)目使用 DeepSpeed 作為底層引擎,支持多種并行策略:

  1. DDP (DistributedDataParallel) 模式
  2. ZeRO-2 優(yōu)化
  3. ZeRO-3 優(yōu)化

這些策略的配置文件 (configs/zero3.yaml) 展示了具體的實(shí)現(xiàn)細(xì)節(jié):

deepspeed_config:
zero_stage: 3
zero3_init_flag: true
zero3_save_16bit_model: true
distributed_type: DEEPSPEED
mixed_precision: bf16


HuggingFace 的工程實(shí)踐創(chuàng)新

HuggingFace 在 Open-R1 項(xiàng)目中展示了高水平的工程實(shí)踐,這些創(chuàng)新不僅確保了復(fù)現(xiàn)的可靠性,更為整個(gè)開源社區(qū)提供了寶貴的技術(shù)范例。

分布式訓(xùn)練框架

項(xiàng)目的分布式訓(xùn)練實(shí)現(xiàn)是一個(gè)顯著亮點(diǎn)。通過深度整合 DeepSpeed,Open-R1 實(shí)現(xiàn)了高效的大規(guī)模模型訓(xùn)練。觀察項(xiàng)目的 Slurm 配置文件,我們可以看到這種優(yōu)化的具體實(shí)現(xiàn):


這個(gè)配置不僅處理了基本的資源分配,還通過環(huán)境變量優(yōu)化了通信效率。特別是 NCCL_ASYNC_ERROR_HANDLING=1 的設(shè)置,有效防止了分布式訓(xùn)練中常見的通信死鎖問題。

在并行策略方面,項(xiàng)目提供了三種配置選項(xiàng):

  1. DDP 配置(configs/ddp.yaml):

distributed_type: MULTI_GPU

mixed_precision: bf16
num_processes: 8

  1. ZeRO-2 配置(configs/zero2.yaml):

deepspeed_config:
#
zero_stage: 2
offload_optimizer_device: none

  1. ZeRO-3 配置(configs):

deepspeed_config:
zero_stage: 3
zero3_init_flag: true
這種靈活的配置體系允許研究者根據(jù)具體硬件條件選擇最適合的訓(xùn)練策略。

評(píng)估系統(tǒng)

評(píng)估系統(tǒng)的設(shè)計(jì)同樣體現(xiàn)了它在工程上的創(chuàng)新。在 evaluate.py 中,我們可以看到一個(gè)精心設(shè)計(jì)的評(píng)估框架:

latex_gold_metric = multilingual_extractive_match_metric(
language=Language.ENGLISH,
fallback_mode=”first_match”,
precision=5,
gold_extraction_target=(LatexExtractionConfig(),),
pred_extraction_target=(ExprExpractionConfig(), LatexExtractionConfig()),
aggregation_function=max,
)
這個(gè)評(píng)估系統(tǒng)的特點(diǎn)在于:

  1. 支持多種評(píng)估指標(biāo)的靈活組合
  2. 實(shí)現(xiàn)了嚴(yán)格的數(shù)學(xué)表達(dá)式匹配
  3. 提供了詳細(xì)的評(píng)估報(bào)告功能

數(shù)據(jù)處理管線

數(shù)據(jù)處理是整個(gè)項(xiàng)目的基礎(chǔ)設(shè)施之一。項(xiàng)目實(shí)現(xiàn)了一個(gè)強(qiáng)大的數(shù)據(jù)生成和處理管線,其核心在 generate.py 中:

def build_distilabel_pipeline(
model: str,
base_url: str = “http://localhost:8000/v1”,
prompt_template: str = “{{ instruction }}”,
input_batch_size: int = 64,
):
with Pipeline().ray() as pipeline:
TextGeneration(
llm=OpenAILLM(
base_url=base_url,
model=model,
generation_kwargs=generation_kwargs,
),
template=prompt_template,
input_batch_size=input_batch_size,
)
return pipeline
這個(gè)數(shù)據(jù)處理管線的創(chuàng)新點(diǎn)在于:

最重要的是,整個(gè)處理流程都是可配置的,這為后續(xù)的研究和改進(jìn)提供了便利。

圖片
核心代碼實(shí)現(xiàn)剖析

深入分析 Open-R1 的源代碼,我們可以看到一個(gè)結(jié)構(gòu)清晰、模塊化程度高的工程實(shí)現(xiàn)。這種實(shí)現(xiàn)不僅保證了代碼的可維護(hù)性,也為整個(gè)復(fù)現(xiàn)過程提供了可靠的技術(shù)支撐。

項(xiàng)目結(jié)構(gòu)設(shè)計(jì)

整個(gè)項(xiàng)目采用了典型的 Python 工程結(jié)構(gòu),主要代碼集中在 src/open_r1 目錄下:

src/open_r1/
├── sft.py # 監(jiān)督微調(diào)實(shí)現(xiàn)
├── grpo.py # GRPO算法核心
├── generate.py # 數(shù)據(jù)生成模塊
└── evaluate.py # 評(píng)估系統(tǒng)實(shí)現(xiàn)
這種組織結(jié)構(gòu)反映了項(xiàng)目的核心關(guān)注點(diǎn):訓(xùn)練、優(yōu)化、數(shù)據(jù)生成和評(píng)估。讓我們逐個(gè)分析這些模塊。

監(jiān)督微調(diào)實(shí)現(xiàn)

sft.py 實(shí)現(xiàn)了監(jiān)督微調(diào)的核心邏輯。特別值得注意的是其參數(shù)配置和訓(xùn)練流程:

def main(script_args, training_args, model_args):
quantization_config = get_quantization_config(model_args)
model_kwargs = dict(
revision=model_args.model_revision,
trust_remote_code=model_args.trust_remote_code,
attn_implementation=model_args.attn_implementation,
torch_dtype=model_args.torch_dtype,
use_cache=False if training_args.gradient_checkpointing else True,
)
這段代碼展示了如何處理模型量化和高級(jí)特性配置。特別是:

GRPO 算法實(shí)現(xiàn)

grpo.py 中,我們看到了 GRPO 算法的核心實(shí)現(xiàn):

def format_reward(completions, *kwargs): “””Reward function that checks if the completion has a specific format.””” pattern = r”^.?.*?$”
completion_contents = [completion[0][“content”] for completion in completions]
matches = [re.match(pattern, content) for content in completion_contents]
return [1.0 if match else 0.0 for match in matches]
這個(gè)獎(jiǎng)勵(lì)函數(shù)實(shí)現(xiàn)了一個(gè)巧妙的設(shè)計(jì):

評(píng)估系統(tǒng)的精確性

評(píng)估系統(tǒng)的實(shí)現(xiàn)展示了對(duì)數(shù)學(xué)驗(yàn)證的深入理解:

latex_gold_metric = multilingual_extractive_match_metric(
language=Language.ENGLISH,
fallback_mode=”first_match”,
precision=5,
gold_extraction_target=(LatexExtractionConfig(),),
pred_extraction_target=(ExprExpractionConfig(), LatexExtractionConfig()),
)
這個(gè)實(shí)現(xiàn)的關(guān)鍵特點(diǎn)是:

分布式訓(xùn)練配置

項(xiàng)目提供了完整的分布式訓(xùn)練支持,這在 DeepSpeed 配置文件中得到了充分體現(xiàn):

deepspeed_config:
deepspeed_multinode_launcher: standard
offload_optimizer_device: none
offload_param_device: none
zero3_init_flag: true
zero3_save_16bit_model: true
zero_stage: 3
這個(gè)配置體現(xiàn)了幾個(gè)關(guān)鍵的工程考量:


實(shí)踐指南與應(yīng)用

Open-R1 項(xiàng)目不僅是一個(gè)技術(shù)探索,更是一個(gè)實(shí)用的工程范例。本節(jié)將詳細(xì)介紹如何在實(shí)際環(huán)境中應(yīng)用這個(gè)項(xiàng)目。

環(huán)境配置要求

項(xiàng)目的環(huán)境配置體現(xiàn)了對(duì)現(xiàn)代深度學(xué)習(xí)工程實(shí)踐的深刻理解。從 setup.py 中我們可以看到核心依賴的設(shè)計(jì):

install_requires = [
“accelerate>=1.2.1”,
“bitsandbytes>=0.43.0”,
“transformers @ git+https://github.com/huggingface/transformers.git@main”,
“trl @ git+https://github.com/huggingface/trl.git@main”,
“vllm==0.6.6.post1”,
]
這里特別注意幾點(diǎn):

  1. 使用最新版本的 transformers 和 trl 庫
  2. 固定 vLLM 版本以確保穩(wěn)定性
  3. 采用 bitsandbytes 支持量化訓(xùn)練

硬件配置方面,項(xiàng)目優(yōu)化針對(duì)了高端計(jì)算環(huán)境:

完整訓(xùn)練流程示例

以下是一個(gè)典型的訓(xùn)練流程命令:

accelerate launch –config_file=configs/zero3.yaml src/open_r1/sft.py \
–model_name_or_path Qwen/Qwen2.5-1.5B-Instruct \
–dataset_name HuggingFaceH4/Bespoke-Stratos-17k \
–learning_rate 2.0e-5 \
–num_train_epochs 1 \
–packing \
–max_seq_length 4096 \
–per_device_train_batch_size 4 \
–gradient_checkpointing \
–bf16
這個(gè)命令行展示了幾個(gè)關(guān)鍵的訓(xùn)練參數(shù)選擇:

  1. 模型選擇:使用 Qwen 作為基礎(chǔ)模型
  2. 數(shù)據(jù)集:使用高質(zhì)量的 Bespoke-Stratos-17k
  3. 訓(xùn)練優(yōu)化:

模型評(píng)估實(shí)踐

評(píng)估過程的實(shí)現(xiàn)同樣值得關(guān)注:

MODEL=”deepseek-ai/DeepSeek-R1-Distill-Qwen-1.5B”
MODEL_ARGS=”pretrained=$MODEL,dtype=float16,tensor_parallel_size=8″
TASK=”aime24″
lighteval vllm $MODEL_ARGS “custom|$TASK|0|0” \
–custom-tasks src/open_r1/evaluate.py \
–use-chat-template \
–system-prompt=”Please reason step by step, and put your final answer within \boxed{}.”
這個(gè)評(píng)估流程的特點(diǎn)是:

在實(shí)際應(yīng)用中,需要特別注意的最佳實(shí)踐包括:

  1. 數(shù)據(jù)準(zhǔn)備階段:
  1. 訓(xùn)練過程中:
  1. 評(píng)估階段:


HuggingFace 的開源貢獻(xiàn)

HuggingFace 通過 Open-R1 項(xiàng)目展示了開源合作的典范。這種貢獻(xiàn)不僅體現(xiàn)在代碼層面,更體現(xiàn)在整個(gè) AI 開源生態(tài)的建設(shè)上。

技術(shù)層面的開源貢獻(xiàn)

項(xiàng)目采用 Apache 2.0 許可證,這一選擇充分體現(xiàn)了 HuggingFace 對(duì)開源社區(qū)的承諾。正如項(xiàng)目文檔中所述:

The goal of Open-R1 is to build these last missing pieces so that the whole research and industry community can build similar or better models using these recipes and datasets.

主要貢獻(xiàn)體現(xiàn)在三個(gè)層面:

  1. 代碼實(shí)現(xiàn)的完整性

def build_distilabel_pipeline(
model: str,
prompt_template: str = “{{ instruction }}”,
temperature: Optional[float] = None,
max_new_tokens: int = 8192,
) -> Pipeline:
# 完整的實(shí)現(xiàn)細(xì)節(jié)
# 清晰的文檔注釋
# 靈活的配置選項(xiàng)

  1. 技術(shù)文檔的系統(tǒng)性:
  1. 工具鏈的標(biāo)準(zhǔn)化:

生態(tài)建設(shè)

HuggingFace 在生態(tài)建設(shè)方面的貢獻(xiàn)特別值得關(guān)注。項(xiàng)目通過多個(gè)方面推動(dòng)了開源生態(tài)的發(fā)展:

  1. 數(shù)據(jù)集共享

dataset = load_dataset(“HuggingFaceH4/Bespoke-Stratos-17k”)
這種標(biāo)準(zhǔn)化的數(shù)據(jù)集訪問方式大大降低了研究者的入門門檻。

  1. 模型復(fù)用機(jī)制

tokenizer = AutoTokenizer.from_pretrained(
model_args.model_name_or_path,
trust_remote_code=model_args.trust_remote_code,
use_fast=True
)
標(biāo)準(zhǔn)化的模型加載接口促進(jìn)了模型的共享和復(fù)用。

  1. 評(píng)估基準(zhǔn)的統(tǒng)一

TASKS_TABLE = []
TASKS_TABLE.append(aime24)
TASKS_TABLE.append(math_500)
統(tǒng)一的評(píng)估基準(zhǔn)確保了不同實(shí)現(xiàn)之間的可比性。

社區(qū)互動(dòng)

項(xiàng)目設(shè)置了完整的社區(qū)互動(dòng)機(jī)制:

  1. 問題追蹤

.github/dependabot.yml

updates:

  1. 自動(dòng)化測試

name: Quality
on:
push:
branches:
– main
pull_request:
branches:
– main

  1. 代碼質(zhì)量控制

quality: black –check –line-length 119 –target-version py310 $(check_dirs) setup.py isort –check-only $(check_dirs) setup.py flake8 –max-line-length 119 $(check_dirs) setup.py
這些機(jī)制確保了項(xiàng)目的長期可維護(hù)性和社區(qū)參與的可持續(xù)性。


未來展望

隨著 Open-R1 項(xiàng)目的深入發(fā)展,我們可以看到多個(gè)潛在的技術(shù)演進(jìn)方向和應(yīng)用可能。這些發(fā)展方向?qū)⑸羁逃绊?AI 推理能力的未來發(fā)展。

技術(shù)迭代方向

  1. 模型架構(gòu)優(yōu)化

當(dāng)前的實(shí)現(xiàn)雖然已經(jīng)展現(xiàn)了出色的性能,但仍有優(yōu)化空間:

現(xiàn)有的獎(jiǎng)勵(lì)函數(shù)實(shí)現(xiàn)

def accuracy_reward(completions, solution, **kwargs):
rewards = []
for content, sol in zip(contents, solution):
reward = float(verify(gold_parsed, answer_parsed))
rewards.append(reward)
return rewards
未來可能的優(yōu)化方向包括:

  1. 訓(xùn)練效率提升

目前的訓(xùn)練配置顯示了效率提升的潛力:

deepspeed_config:
zero_stage: 3
zero3_init_flag: true
zero3_save_16bit_model: true
可能的改進(jìn)包括:

應(yīng)用領(lǐng)域拓展

Open-R1 項(xiàng)目開創(chuàng)性地展示了推理模型的訓(xùn)練方法,這種方法具有廣泛的應(yīng)用潛力。正如項(xiàng)目文檔中提到:

Note that we don’t want to stop at math datasets. There’s a lot of potential in exploring other areas, obvious one like code but also scientific fields such as medicine, where reasoning models could have significant impact.

  1. 跨領(lǐng)域遷移
    具體的應(yīng)用方向包括:
  1. 工程化提升

未來的工程改進(jìn)可能包括:

潛在的新評(píng)估指標(biāo)

class DomainSpecificMetric:
def init(self, domain_config):
self.config = domain_config
def evaluate(self, prediction, reference):
# 領(lǐng)域特定的評(píng)估邏輯
pass


總結(jié)

Open-R1 項(xiàng)目代表了 HuggingFace 在開源 AI 領(lǐng)域的重要貢獻(xiàn)。通過系統(tǒng)性地復(fù)現(xiàn) DeepSeek-R1,項(xiàng)目不僅展示了技術(shù)實(shí)現(xiàn)的可能性,更為整個(gè) AI 社區(qū)提供了寶貴的工程實(shí)踐經(jīng)驗(yàn)。

項(xiàng)目的核心價(jià)值體現(xiàn)在:

  1. 技術(shù)創(chuàng)新
  1. 工程實(shí)踐
  1. 生態(tài)貢獻(xiàn)

正如項(xiàng)目所展示的,開源合作正在推動(dòng) AI 技術(shù)的民主化,讓更多的研究者和開發(fā)者能夠參與到技術(shù)的演進(jìn)中來。這種開放和協(xié)作的精神,將繼續(xù)推動(dòng) AI 技術(shù)向更廣闊的領(lǐng)域發(fā)展。

通過 Open-R1 項(xiàng)目,我們不僅看到了當(dāng)前 AI 推理技術(shù)的發(fā)展?fàn)顟B(tài),更看到了未來的無限可能。這個(gè)項(xiàng)目將繼續(xù)激勵(lì)更多的創(chuàng)新和突破,推動(dòng) AI 技術(shù)向更高水平發(fā)展。

本文轉(zhuǎn)載自公眾號(hào)@HelloTech技術(shù)派

上一篇:

LLM之RAG實(shí)戰(zhàn)|? 高級(jí)RAG:通過使用LlamaIndex重新排序來提高檢索效率

下一篇:

如何獲取騰訊元寶PC端DeepSeek滿血版(完整指南)
#你可能也喜歡這些API文章!

我們有何不同?

API服務(wù)商零注冊(cè)

多API并行試用

數(shù)據(jù)驅(qū)動(dòng)選型,提升決策效率

查看全部API→
??

熱門場景實(shí)測,選對(duì)API

#AI文本生成大模型API

對(duì)比大模型API的內(nèi)容創(chuàng)意新穎性、情感共鳴力、商業(yè)轉(zhuǎn)化潛力

25個(gè)渠道
一鍵對(duì)比試用API 限時(shí)免費(fèi)

#AI深度推理大模型API

對(duì)比大模型API的邏輯推理準(zhǔn)確性、分析深度、可視化建議合理性

10個(gè)渠道
一鍵對(duì)比試用API 限時(shí)免費(fèi)