☰
CoreNet 中的 OpenELM:高效语言模型家族的预训练、指令微调与参数高效微调实践指南
2026/10/2 1:57:12 网站建设 项目流程
  • 深度学习
  • 计算机视觉
  • NLP
  • 多模态
  • 模型训练
  • 大模型

【免费下载链接】corenet

CoreNet: A library for training deep neural networks

项目地址:https://gitcode.com/GitHub_Trending/co/corenet
点击查看免费下载

本文以 CoreNet 开源仓库中的 OpenELM 项目文档与源码为据,系统讲解 OpenELM(270M / 450M / 1.1B / 3B 四档规模)在 CoreNet 框架下的完整训练与微调链路:包括公共语料预训练的数据集组织方式、多节点分布式训练命令、基于 DPO 的指令微调,以及 LoRA / DoRA 参数高效微调与 LLM Adapters 基准评估。读者读完可掌握如何从语料准备出发,完整复现 OpenELM 的预训练、指令微调与 PEFT 评估流程,并能看懂 CoreNet 中对应的 YAML 配置与模型源码实现。

一、OpenELM 项目概览

OpenELM 是 CoreNet 仓库中提供的高效语言模型家族,其核心特点在于层间参数分配不均匀:通过让每个 Transformer 层的注意力(QKV)与前馈网络(FFN)维度按不同的乘数变化,实现比均匀分配更高的参数利用效率。该工作对应的论文为 arXiv 2404.14619,完整引用信息见文末。

在 projects/openelm/ 目录下,项目同时提供了以下四类能力与配套文档:

  1. 预训练(Pre-training):README-pretraining.md,覆盖语料准备与多节点训练;
  2. 评估(Evaluation):基于 HuggingFace 生态的评估说明,以及仓库内的 LLM Adapters 评估脚本;
  3. 指令微调(Instruction Tuning):README-instruct.md,基于 Alignment Handbook 的 DPO 微调;
  4. 参数高效微调(PEFT):README-peft.md,LoRA / DoRA 微调与评估。

此外,mlx_examples/open_elm/README.md 提供了将模型转换到 Apple MLX 框架并在 Apple Silicon 上运行推理的完整方案。

模型家族配置:源码级事实

从源码结构看,OpenELM 各规模的模型结构定义在 general_gpt.py 的SUPPORTED_MODELS中,具体配置如下:

模型Transformer 层数模型维度Head 维度GQA 组数FFN 乘数QKV 乘数
OpenELM-270M161280644(0.5, 4.0)(0.5, 1.0)
OpenELM-450M201536644(0.5, 4.0)(0.5, 1.0)
OpenELM-1.1B282048644(0.5, 4.0)(0.5, 1.0)
OpenELM-3B3630721284(0.5, 4.0)(0.5, 1.0)

其中ffn_multipliers=(0.5, 4.0)与qkv_multipliers=(0.5, 1.0)的含义是:各层乘数从起始值到结束值线性插值(对应源码中np.linspace的层间缩放逻辑,即论文中 block-wise scaling),从而使不同层拥有不同宽度的注意力与 FFN。所有模型均启用 QK 归一化(normalize_qk_projections=True)并共享输入输出投影层(share_input_output_layers=True),使用 RMSNorm 归一化与 RoPE 位置编码,上下文长度为 2048。

二、Tokenizer:基于 LLaMA SentencePiece 模型

OpenELM 实验统一使用LLaMA v1/v2 的 SentencePiece tokenizer(即 Llama 官方词表),需自行从 Meta 官方渠道下载tokenizer.model文件。

在 CoreNet 的训练配置中,tokenizer 通过text_tokenizer段配置为sentence_piece,并开启了 NFC 归一化、句首(SOT)与句尾(EOT)token 追加:

text_tokenizer: name: "sentence_piece" sentence_piece: enable_nfc_normalization: true append_sot_token: true append_eot_token: true # model_path: <PATH_OF_LLAMA_SPM_MODEL>

配置中还有一个值得注意的细节:虽然原始词表大小为 32001(含 padding token),但分类层(lm_head)的vocab_size被设置为 32128,这是为了让维度更适配硬件(对齐计算友好),该设置在配置文件中以锚点变量_anchor_vocab_size定义。

三、预训练:从语料准备到多节点训练

3.1 数据集构成

OpenELM 的预训练数据全部来自公开语料,包括RefinedWeb、PILE、RedPajama 的子集以及 Dolma v1.6 的子集。文档明确提示:使用前需逐一接受每个数据集的许可协议。

以 openelm_270M.yaml 中的general_lm数据配置为骨架,各语料的组织方式如下:

  • RefinedWeb:从 HuggingFace 下载(共 5535 个 parquet 文件),建议重命名为refinedweb-{file_id:05d}-of-05534.parquet格式,text_key为content;
  • RedPajama:按子集组织为LOCATION/REDPAJAMA_SUBSET_NAME/REDPAJAMA_SUBSET_NAME-FILE_ID-TOTAL_FILES.jsonl格式,例如arxiv/arxiv-{file_id:05d}-00099.jsonl(100 个文件、file_id_range: [0, 100])、book、github、stackexchange、wikipedia、c4等子集,text_key为text;
  • PILE:1650 个 parquet 文件,重命名为pile-{file_id:05d}-of-01650.parquet,text_key为text;
  • Dolma v1.6:json.gz 格式,按子集组织,如books/books-{file_id:04d}.json.gz、pes2o、reddit、stack、wiki等,text_key为text。

每个数据子集在train_data_info列表中用一个字典描述,核心字段是file_name(模板字符串,支持{file_id:05d}形式的零填充占位符)、text_key(文本字段名)和file_id_range(起止文件编号),示意如下:

dataset: language_modeling: shuffle_data: true general_lm: train_data_info: [ { # "file_name": "LOCATION/refinedweb-{file_id:05d}-of-05534.parquet", "text_key": "content", "file_id_range": [0, 5534] }, # 更多子集同理追加,支持 jsonl / json.gz / parquet 三种格式 ]

3.2 预训练配置要点解读

以 270M 与 3B 两份配置为例,预训练阶段的几个关键配置段值得深入理解:

数据与上下文(dataset/language_modeling)

dataset: root_train: "" disable_val: true train_batch_size0: 16 workers: 4 persistent_workers: true pin_memory: true category: "language_modeling" name: "general_lm" language_modeling: sequence_length: 2048 # 上下文长度锚点 min_tokens_per_text: 256 # 过滤分词后不足 256 token 的文本,避免过度 padding min_characters_per_text: 200 # 过滤分词前不足 200 字符的文本 shuffle_data: true
  • 注释中说明了有效 batch size 的估算逻辑:16 条序列 × 8 张 A100/H100 80GB GPU × 16 节点 × 2048 token/序列 ≈ 每步 4M tokens;
  • 训练总 token 量约为1.4~1.5T(350k 步 × 4M tokens)。

损失(loss):使用语言建模交叉熵,设置ignore_index为 padding index(32000),并启用z-loss(use_z_loss: true),用于稳定大规模 softmax 的训练。

优化器与调度器(optim/scheduler)

optim: name: "adamw" weight_decay: 0.1 adamw: beta1: 0.9 beta2: 0.95 eps: 1.e-8 scheduler: is_iteration_based: true max_iterations: 350000 name: cosine warmup_init_lr: 1.e-06 warmup_iterations: 5000 # 约 20B tokens 预热(5000 × 4M tokens) cosine: max_lr: 0.0053 # 270M 配置 min_lr: 0.00053 # min_lr = 0.1 × max_lr

不同规模模型的学习率不同:270M 的max_lr为 5.3e-3,3B 的max_lr为 1.2e-3,均遵循 min_lr = 0.1 × max_lr 的余弦退火规则。

FSDP 配置(仅 3B 等较大模型使用):3B 配置中引入了fsdp训练流水线(train_eval_pipeline.name: "fsdp_train_eval_pipeline"),采用full_shard分片策略、参数与 buffer 使用 bfloat16、梯度归约使用 float32,并开启limit_all_gathers与activation_checkpointing。相比之下,270M/450M 配置不启用 FSDP 与激活检查点,而是通过增加节点数来容纳显存需求(这也是 270M 配置注释中"使用更多节点因为未启用 FSDP + 激活检查点"的由来)。

模型定义(model)

model: language_modeling: name: "general_gpt" general_gpt: model_name: "OpenELM-270M" # 对应 SUPPORTED_MODELS 中的键 vocab_size: 32128 max_context_length: 2048 padding_index: 32000

3.3 多节点分布式训练命令

OpenELM 预训练在多个节点、每节点多 GPU 的环境下进行。训练第i个节点时,按以下方式计算 rank 与 world size 并启动:

export CFG_FILE="PATH_TO_OPENELM_MODEL_CONFIGURATION_FILE" export RANK=<NODE_ID> * <NUM_GPUS_PER_NODE> export WORLD_SIZE=<NUM_NODES> * <NUM_GPUS_PER_NODE> corenet-train --common.config-file $CFG_FILE --ddp.rank $RANK --ddp.world-size $WORLD_SIZE --ddp.dist-url 'tcp://IP_OF_NODE0:FREEPORT'

各节点具体使用的 GPU 数与节点数,可参考 pretraining_configs/ 下各配置文件中的注释。

3.4 预训练检查点

文档提供了两类检查点:

  • 纯模型权重检查点(仅模型权重,适合评估或继续微调):文件命名为checkpoint_epoch_0_iter_{NNNNN}.pt,覆盖 50k / 100k / 150k / 200k / 250k / 300k / 330k / 335k / 340k / 345k / 350k 等迭代节点,另有checkpoint_average.pt(最后 5 个检查点的平均权重)与training_logs.txt(训练日志);
  • 完整训练检查点(包含模型与优化器状态,可用于恢复训练):文件命名为training_checkpoint_epoch_0_iter_{NNNNN}.pt,另有training_checkpoint_last.pt(训练结束时的完整状态)。

上述检查点均托管在 Apple 官方模型资源站点(docs-assets.developer.apple.com),可按照.../openelm/pretrained/{270M|450M|1.1B|3B}/目录结构与上述命名模式定位对应文件。结合配置文件中的save_interval_freq: 5000、save_all_checkpoints: true与auto_resume: true可知,训练过程每 5000 步保存检查点并支持自动恢复。

四、指令微调:基于 Alignment Handbook 的 DPO

OpenELM 的指令微调使用 Alignment Handbook 库,在UltraFeedback 偏好数据集上通过DPO(Direct Preference Optimization)完成。

4.1 操作步骤

# 进入 CoreNet 仓库目录 cd /path/to/corenet # 克隆并固定 Alignment Handbook 版本(70769f9 为 2024-04-11 的 main 分支) git clone https://github.com/huggingface/alignment-handbook.git hf-align cd hf-align && git checkout 70769f9 && cd .. # 安装依赖 pip install -e ./hf-align # 将 DPO recipe 复制到 Alignment Handbook 的 recipes 目录 cp projects/openelm/instruction_tuning/openelm-instruct.yaml hf-align/recipes/ # 准备模型、tokenizer 与输出目录 ckpt_dir=<your_converted_OpenELM_hf_model> local_tokenizer_dir=<your_downloaded_Llama-2-7b-hf-tokenizer> dpo_ckpt_dir=<your_output_checkpoint_dir> # 依据论文设置 lr、epochs、loss_type(见下表),例如 270M 模型: ep=5 lr=2e-5 loss_type=hinge accelerate launch --config_file hf-align/recipes/accelerate_configs/deepspeed_zero3.yaml \ hf-align/scripts/run_dpo.py hf-align/recipes/openelm-instruct.yaml \ --trust_remote_code=true \ --model_name_or_path=${ckpt_dir} \ --tokenizer_name_or_path=${local_tokenizer_dir} \ --output_dir=${dpo_ckpt_dir} \ --num_train_epochs=$ep \ --learning_rate=$lr \ --loss_type=$loss_type

训练结果输出在${dpo_ckpt_dir}/all_results.json。

4.2 各规模模型的指令微调超参数

超参数270M450M1.1B3B
训练 epochs58510
学习率2e-53e-55e-51e-4
损失函数hingehingesigmoidhinge

配套的 openelm-instruct.yaml 给出了完整的 DPO recipe 配置:chat_template定义了基于|user|/|system|/|assistant|标记的对话格式;数据侧加载csarron/argilla-ultrafeedback-binarized-preferences-cleaned数据集;训练侧使用adamw_torch优化器、余弦学习率调度(warmup_ratio: 0.1)、beta: 0.01、最大长度 1024(prompt 512)、梯度检查点开启并设置save_strategy: "steps"、save_steps: 100与eval_steps: 100。

五、参数高效微调(PEFT):LoRA 与 DoRA

OpenELM 的 PEFT 实验遵循LLM Adapters(arXiv 2304.01933)的评估设置:在 8 个常识推理数据集上联合微调(训练集规模约 17 万条,即 commonsense_170k),评估时采用log-likelihood(对数似然)而非正则解析来确定模型输出。

5.1 环境搭建

为保证与 LLM Adapters 的评估一致性,需要安装其辅助函数:

cd /path/to/corenet # 安装 LM Evaluation Harness(固定到指定 commit) git clone https://github.com/EleutherAI/lm-evaluation-harness.git cd lm-evaluation-harness git checkout 3196e907fa195b684470a913c7235ed7f08a4383 python3 -m pip install -e . -c ../requirements.txt cd .. # 安装 LLM Adapters(固定到指定 commit) git clone https://github.com/AGI-Edgerunners/LLM-Adapters.git cd LLM-Adapters git checkout 816657208af4db747803f87ba40a4c71383fed7a touch __init__.py python3 -m pip install -r requirements.txt -c ../requirements.txt cd .. # 安装 HuggingFace 相关依赖(固定版本) python3 -m pip install --upgrade \ transformers==4.36.2 \ datasets==2.19.0 \ accelerate==0.29.3 \ sentencepiece==0.2.0 \ -c requirements.txt

与预训练相同,这里同样使用 LLaMA v1/v2 的 SentencePiece tokenizer。

5.2 LoRA 微调训练

对 270M 模型执行 LoRA 微调的命令如下:

CFG_FILE="projects/openelm/peft_configs/openelm_lora_270M.yaml" WTS_FILE="https://docs-assets.developer.apple.com/ml-research/models/corenet/v0.1.0/openelm/pretrained/270M/checkpoint_average.pt" TOKENIZER_FILE="<PATH_TO_TOKENIZER_FILE>" DATASET_FILE="<PATH_TO_COMMONSENSE_170K>" corenet-train --common.config-file $CFG_FILE \ --model.language-modeling.pretrained $WTS_FILE \ --text-tokenizer.sentence-piece.model-path $TOKENIZER_FILE \ --dataset.language-modeling.commonsense-170k.path $DATASET_FILE

其中 commonsense_170k 数据集可从 LLM Adapters 的ft-training_set/commonsense_170k.json获取。若要改用 DoRA,只需将配置中的use_dora置为 True。

openelm_lora_270M.yaml 展示了 LoRA 适配器的完整定义,核心机制包括:

  • 适配目标:通过正则表达式将 LoRA 挂载到token_embedding(embedding 类型)、out_proj、qkv_proj与proj_\d(linear 类型)四类模块;
  • LoRA 超参数:r: 32、lora_alpha: 32、lora_dropout: 0.1、init_lora_weights: true,并支持use_rslora与use_dora开关;
  • 权重加载策略:rename_scopes_map将预训练权重中的token_embeddings.weight、qkv_proj.weight、out_proj.weight、proj_\d.weight映射到base_layer.weight(适配器包装后的基座层);ignore_missing_scopes: ".*lora.*"允许加载不含 LoRA 参数的预训练权重;freeze_modules: [".*base_layer.*", ".*norm.*"]冻结基座层与归一化层,仅训练适配器;
  • 训练设置:accum_freq: 2、train_batch_size0: 8、max_iterations: 4375(对应 3 个 epoch)、warmup_iterations: 1000、max_lr: 3e-4、weight_decay: 0。

5.3 评估

使用corenet-eval-llmadapters入口评估 LoRA 模型:

CFG_FILE="projects/openelm/peft_configs/openelm_lora_270M_eval.yaml" WTS_FILE="https://docs-assets.developer.apple.com/ml-research/models/corenet/v0.1.0/openelm/peft/openelm_lora_270M.pt" TOKENIZER_FILE="<PATH_TO_TOKENIZER_FILE>" corenet-eval-llmadapters --common.config-file $CFG_FILE \ --model.language-modeling.pretrained $WTS_FILE \ --text-tokenizer.sentence-piece.model-path $TOKENIZER_FILE

openelm_lora_270M_eval.yaml 中设置了lm_eval_wrapper.add_sot_token: true与llmadapters_evaluation.multiple_choice: true,其中数据集路径由llmadapters-evaluation.dataset-dir参数控制(默认值通常适用)。

文档给出的 270M LoRA 模型在 8 个常识推理基准上的预期结果:

boolqpiqasiqahellaswagwinograndearc-easyarc-challengeobqa
62.1450.0542.0224.8449.8826.6024.5728.00

评估其他预训练模型时,修改配置中的 backbone(model_name)即可;评估 DoRA 模型同样只需将use_dora置为 True。

5.4 PEFT 权重发布

文档同时发布了各规模模型的 LoRA 与 DoRA 适配器权重(托管于 Apple 官方资源站点,路径模式为.../openelm/peft/openelm_{lora|dora}_{270M|450M|1.1B|3B}.pt),可直接用于评估或部署,无需重新微调。

六、MLX 转换与 Apple Silicon 推理

mlx_examples/open_elm/ 提供了 OpenELM 的MLX 移植,MLX 是专为 Apple Silicon 优化的深度学习框架。该目录依赖 mlx_examples/requirements.txt 中的 MLX 依赖。

转换 PyTorch/CoreNet 检查点为 MLX 格式(支持 fp16/bf16 与 4-bit 量化,量化组大小 32/64):

PYTHONPATH=. python3 mlx_examples/open_elm/convert.py \ --input-checkpoint <PyTorch/CoreNet checkpoint> \ --config-yaml <CoreNet training configuration YAML> \ --tokenizer-path <path to tokenizer.model> \ --dtype="float16" \ --output-dir <output dir> # 增加 --quantize 标志即可输出 4-bit 量化检查点

转换产物为*.npz权重与config.json配置文件。推理示例:

PYTHONPATH=. python3 mlx_examples/open_elm/inference.py \ --model-dir <MLX model directory> \ --prompt "Once upon a time in a land far away" \ --max-tokens=1024

注意:MLX 检查点不含 tokenizer 模型文件,需将 Meta LLaMA2 的tokenizer.model放入模型目录。OpenELM-3B 在 MLX 上无论 16-bit 还是量化推理都应使用 BFloat16,因为它需要的激活范围大于其他规模。

七、偏置、风险与限制

OpenELM 系列模型以赋能开放研究社区为目标发布,基于公开数据集训练,不附带任何安全保证。模型可能对用户提示产生不准确、有害、有偏见或不当的输出。因此,用户与开发者在使用前必须进行充分的安全测试,并根据自身需求实现合适的过滤与防护机制。

八、引用

若研究工作受益于 OpenELM,建议按以下 BibTeX 引用:

@article{mehta2024openelm, title={OpenELM: An Efficient Language Model Family with Open Training and Inference Framework}, author = {Sachin Mehta and Mohammad Hossein Sekhavat and Qingqing Cao and Maxwell Horton and Yanzi Jin and Chenfan Sun and Iman Mirzadeh and Mahyar Najibi and Dmitry Belenko and Peter Zatloukal and Mohammad Rastegari}, year={2024}, eprint={2404.14619}, archivePrefix={arXiv}, primaryClass={cs.CL} }

结语:完整使用链路回顾

从仓库文档与源码可以梳理出 OpenELM 在 CoreNet 中的完整生命周期:① 下载 LLaMA tokenizer 并组织公共语料(RefinedWeb / PILE / RedPajama / Dolma v1.6)→ ② 参照 pretraining_configs/ 中四档规模的 YAML 配置,用corenet-train配合 DDP rank/world-size 参数做多节点预训练 → ③ 用 Alignment Handbook 的 DPO recipe 做指令微调,或用corenet-train+ LoRA/DoRA 配置做参数高效微调 → ④ 用corenet-eval-llmadapters在 8 个常识推理基准上评估 → ⑤ 通过 MLX convert 脚本部署到 Apple Silicon 设备。每一环节都能在 projects/openelm/ 下找到对应的配置与文档,在 general_gpt.py 中找到模型结构的源码实现,便于二次研究与复现。

  • 深度学习
  • 计算机视觉
  • NLP
  • 多模态
  • 模型训练
  • 大模型

【免费下载链接】corenet

CoreNet: A library for training deep neural networks

项目地址:https://gitcode.com/GitHub_Trending/co/corenet
点击查看免费下载

相关推荐

上一篇:智慧法院设备驱动开发终极指南:从Windows驱动程序到智能司法系统
下一篇:如何参与Bluetooth-jammer-esp32开源项目开发:社区贡献完整指南

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询