
推理引擎大模型【免费下载链接】FlexGenRunning large language models on a single GPU for throughput-oriented scenarios.项目地址https://gitcode.com/gh_mirrors/fl/FlexGen点击查看免费下载本指南基于 distillation 目录 中的 Distil* 蒸馏项目展开它是 FlexGen 仓库benchmark/third_party/transformers下随附的第三方参考实现完整覆盖知识蒸馏训练小模型DistilBERT / DistilRoBERTa / DistilGPT2 / DistilmBERT的全部流程。读完本文你将掌握Distil* 模型家族的架构特点与性能收益、预训练模型的加载与推理方式、从数据二值化到单卡/分布式训练的完整命令链、五种蒸馏损失加权机制以及教师模型分层初始化transfer learning的实操技巧。一、Distil* 是什么知识蒸馏与小模型的诞生Distil* 是一类以 DistilBERT 为起点逐步扩展的压缩模型家族名称源自 Distilled-BERT蒸馏 BERT。核心思想是知识蒸馏Knowledge Distillation用一个训练好的大模型作为teacher教师指导一个更小的模型student学生学习使学生以更小的体积逼近教师的预测能力。以bert-base-uncased为教师训练出的 DistilBERT 具有以下量化收益参数量减少 40%66M 参数对 110M 参数推理速度快 60%GLUE 基准上保留 97% 的原始性能。因此 DistilBERT 是把大规模预训练 Transformer 投入生产环境时的实用选择体积小、速度快、成本低、精度损失可控。该方法随后被推广到更多架构官方发布了多组蒸馏权重GPT2 → DistilGPT2在 WikiText-103 测试集上GPT2 困惑度 16.3DistilGPT2 微调后为 21.1RoBERTa-base → DistilRoBERTaGLUE 上保留 95% 性能速度快 2 倍体积小 35%bert-base-german-dbmdz-cased → German DistilBERT在德语 NERCoNLL-2003上保留 99% 性能bert-base-multilingual-cased → DistilmBERTXNLI 上保留 92% 性能速度快 2 倍体积小 25%支持 104 种语言。方法论细节与完整实验请参见 2019 年 NeurIPS EMC^2 Workshop 论文《DistilBERT, a distilled version of BERT: smaller, faster, cheaper and lighter》Sanh, Debut, Chaumond, Wolf其中采用的蒸馏损失与早期博客版本不同报告对比结果时以论文为准。二、官方预训练 Distil* 模型一览Transformers 内置了以下预训练 Distil* 检查点截至该文档发布时官方仅提供英语与德语版本多语言版 DistilmBERT 已随更新发布模型检查点说明结构distilbert-base-uncased以bert-base-uncased为教师在 BERT 同源数据Toronto Book Corpus 英文 Wikipedia 拼接上蒸馏66M 参数6 层 / 768 维 / 12 头distilbert-base-uncased-distilled-squad在 SQuAD 1.0 上做第二轮知识蒸馏微调dev 集 F1 86.9教师bert-base-uncased为 88.5同上distilbert-base-cased以bert-base-cased为教师的英文模型65M 参数6 层 / 768 维 / 12 头distilbert-base-cased-distilled-squad在 SQuAD 1.0 上蒸馏微调dev 集 F1 87.1教师bert-base-cased为 88.7同上distilbert-base-german-cased以bert-base-german-dbmdz-cased为教师、用约一半 BERT 数据量蒸馏的德语模型CoNLL-2003 测试集 NER F1 83.49教师 84.52GermEval 2014 测试集 F1 85.23教师 86.89同上distilgpt2以gpt2最小版为教师、在 OpenWebTextCorpus 上蒸馏82M 参数GPT2 为 124M平均速度快 2 倍6 层 / 768 维 / 12 头distilroberta-base以roberta-base为教师、仅用 OpenWebTextCorpus 蒸馏训练数据约为教师的 1/482M 参数RoBERTa-base 为 125M平均速度快 2 倍6 层 / 768 维 / 12 头distilbert-base-multilingual-cased以bert-base-multilingual-cased为教师、在 104 种语言的 Wikipedia 拼接数据上蒸馏134M 参数mBERT-base 为 177M平均速度快 2 倍支持 104 种语言6 层 / 768 维 / 12 头其中 SQuAD 模型体现了二次蒸馏的典型用法先在通用语料上蒸馏预训练再在任务数据上以知识蒸馏方式进行微调。三、基准表现GLUE 与 XNLIGLUE dev 集结果官方发布ModelMacro-scoreCoLAMNLIMRPCQNLIQQPRTESST-2STS-BWNLIBERT-base-uncased79.556.384.788.691.889.669.392.789.053.5DistilBERT-base-uncased77.051.382.187.589.288.559.991.386.956.3BERT-base-cased78.258.283.987.891.089.266.191.789.246.5DistilBERT-base-cased75.947.281.585.688.287.860.690.485.556.3RoBERTa-base (reported)83.2/86.4263.687.690.292.891.978.794.891.257.73DistilRoBERTa179.0/82.3259.384.086.690.889.467.992.588.352.11DistilRoBERTa 未使用 MNLI 检查点直接在预训练 DistilRoBERTa 上进行迁移微调2不含 WNLI 的 Macro-score3该分数为官方自行计算以补全对比。XNLI 测试集结果零样本设置6 种语言在英语数据上训练、直接评估目标语言部分zero-shotModelEnglishSpanishChineseGermanArabicUrdumBERT base cased (computed)82.174.669.172.366.458.5mBERT base uncased (reported)81.474.363.870.562.158.3DistilmBERT78.269.164.066.359.154.7可见多语言蒸馏模型在各语言上均以较小体积接近 mBERT 水平。四、环境准备Setup蒸馏训练代码要求Python 3.6。仓库内提供了依赖清单 requirements.txtpip install -r requirements.txt依赖内容如下transformers模型与 tokenizer 基础库gitpython3.0.2训练时记录仓库 commit 信息写入git_log.jsontensorboard1.14.0、tensorboardX1.8训练日志可视化psutil5.6.6记录显存/内存使用scipy1.4.1科学计算依赖。重要提示训练脚本已适配 PyTorch v1.2.0相比 v1.1.0 存在破坏性变更例如 distiller.py 中掩码张量由torch.uint8调整为torch.bool、标签由-1调整为-100。五、快速上手加载并运行 Distil* 模型使用 DistilBERT 与使用 BERT 几乎完全一致。DistilBERT 共享 BERT 的bert-base-uncasedtokenizer官方在DistilBertTokenizer名下提供同一 tokenizer 的入口以保持库内命名一致from transformers import DistilBertTokenizer, DistilBertModel import torch tokenizer DistilBertTokenizer.from_pretrained(distilbert-base-cased) model DistilBertModel.from_pretrained(distilbert-base-cased) input_ids torch.tensor(tokenizer.encode(Hello, my dog is cute)).unsqueeze(0) outputs model(input_ids) last_hidden_states outputs[0] # 元组第一个元素即最后一层隐状态其他 Distil* 模型只需换成对应基类与检查点# DistilBERT uncased model DistilBertModel.from_pretrained(distilbert-base-uncased) # DistilGPT2 model GPT2Model.from_pretrained(distilgpt2) # DistilRoBERTa model RobertaModel.from_pretrained(distilroberta-base) # DistilmBERT多语言 model DistilBertModel.from_pretrained(distilbert-base-multilingual-cased)从源码结构看train.py 中维护的MODEL_CLASSES映射distilbert/roberta/bert/gpt2分别对应DistilBertForMaskedLM、RobertaForMaskedLM、BertForMaskedLM、GPT2LMHeadModel印证了这套模型族的统一加载约定。六、训练 Distil*从数据到权重的完整实战下面以训练 DistilBERT 为例完整走一遍官方流程。A. 准备数据二值化与 token 计数官方发布权重的训练数据是 Toronto Book Corpus 与英文 Wikipedia 的拼接与英文 BERT 训练数据一致。为了避免重复处理数据官方在训练前一次性完成预处理。假设你已有一个文本文件dump.txt每行包含一条序列序列由一句或几句连贯句子组成。第一步二值化数据——将文本 tokenize 并映射为词表索引python scripts/binarized_data.py \ --file_path data/dump.txt \ --tokenizer_type bert \ --tokenizer_name bert-base-uncased \ --dump_file data/binarized_textbinarized_data.py 的实现要点--tokenizer_type支持bert/roberta/gpt2三种分别使用BertTokenizer、RobertaTokenizer、GPT2Tokenizer并在每条序列前后自动拼接 BOS/SEP 特殊 tokenBERT 为[CLS]/[SEP]RoBERTa 为s//sGPT2 为|endoftext|输出文件名为{dump_file}.{tokenizer_name}.pickle例如data/binarized_text.bert-base-uncased.pickle根据词表大小自动选择存储类型词表小于 2^16 时用np.uint16否则用np.int32以压缩存储数据会被随机打乱后以 pickle 协议导出。第二步统计 token 出现次数——蒸馏实现的 MLM 掩码损失沿用了 XLM 的方案用平滑因子对掩码概率加权让稀有词获得更高掩码概率。因此需要先统计每个 token 的出现频次python scripts/token_counts.py \ --data_file data/binarized_text.bert-base-uncased.pickle \ --token_counts_dump data/token_counts.bert-base-uncased.pickle \ --vocab_size 30522token_counts.py 用collections.Counter统计全部 token id 频次按--vocab_size展开为定长数组后 dump。该频次数组在训练时会被 train.py 读取并计算token_probs max(counts, 1) ** -mlm_smoothing同时把特殊 token 的概率置零不预测特殊 token。B. 训练单 GPU 启动数据预处理完成后蒸馏训练非常直接python train.py \ --student_type distilbert \ --student_config training_configs/distilbert-base-uncased.json \ --teacher_type bert \ --teacher_name bert-base-uncased \ --alpha_ce 5.0 --alpha_mlm 2.0 --alpha_cos 1.0 --alpha_clm 0.0 --mlm \ --freeze_pos_embs \ --dump_path serialization_dir/my_first_training \ --data_file data/binarized_text.bert-base-uncased.pickle \ --token_counts data/token_counts.bert-base-uncased.pickle \ --force # 若 dump_path 已存在则覆盖默认情况下该命令只使用单张 GPU即使集群有更多 GPU。其余可调参数请查看 train.py或运行python train.py --help。init_gpu_params 会依据n_gpu自动判定单卡/多卡模式并初始化进程组主进程is_master会创建dump_path、写入parameters.json完整超参数存档与git_log.jsongit commit 记录。C. 训练分布式训练单节点 4 卡示例DistilBERT 训练语料庞大官方强烈建议使用分布式训练。以下为单节点 4 卡示例export NODE_RANK0 export N_NODES1 export N_GPU_NODE4 export WORLD_SIZE4 export MASTER_PORTAN_OPEN_PORT export MASTER_ADDRI.P. pkill -f python -u train.py python -m torch.distributed.launch \ --nproc_per_node$N_GPU_NODE \ --nnodes$N_NODES \ --node_rank $NODE_RANK \ --master_addr $MASTER_ADDR \ --master_port $MASTER_PORT \ train.py \ --force \ --n_gpu $WORLD_SIZE \ --student_type distilbert \ --student_config training_configs/distilbert-base-uncased.json \ --teacher_type bert \ --teacher_name bert-base-uncased \ --alpha_ce 0.33 --alpha_mlm 0.33 --alpha_cos 0.33 --alpha_clm 0.0 --mlm \ --freeze_pos_embs \ --dump_path serialization_dir/my_first_training \ --data_file data/binarized_text.bert-base-uncased.pickle \ --token_counts data/token_counts.bert-base-uncased.pickle注意分布式示例中三个 alpha 权重被均分为 0.33总和为 1与单卡示例5.0/2.0/1.0形成对照。多节点场景只需相应调整N_NODES、NODE_RANK、WORLD_SIZE与MASTER_ADDRutils.py 会校验WORLD_SIZE N_NODES * N_GPU_NODE等约束。D. 关键技巧教师分层初始化Transfer Learning从教师模型的若干层初始化学生权重对蒸馏质量至关重要。官方实验正是从教师BERT 自身的若干层初始化学生模型再开始蒸馏训练。BERT → DistilBERT 使用 extract_distilbert.pypython scripts/extract_distilbert.py \ --model_type bert \ --model_name bert-base-uncased \ --dump_checkpoint serialization_dir/tf_bert-base-uncased.pth其核心逻辑是把教师 12 层中编号[0, 2, 4, 7, 9, 11]的 6 层依次复制为学生 6 层的参数embedding、attention q/k/v、FFN、LayerNorm、vocab_projector输出投影等生成一个可直接加载的学生初始化 checkpoint。RoBERTa → DistilRoBERTa、GPT2 → DistilGPT2 使用 extract.py它同样抽取[0, 2, 4, 7, 9, 11]六层并针对 GPT2 结构复制ln_1、attn.c_attn、attn.c_proj、ln_2、mlp.c_fc、mlp.c_proj等参数。生成 checkpoint 后在训练命令中追加初始化参数即可python train.py ... --student_pretrained_weights serialization_dir/tf_bert-base-uncased.pth ...train.py 会通过student_model_class.from_pretrained(..., configstu_architecture_config)加载该初始化权重同时训练前的sanity_checkstrain.py会强制校验学生/教师词表大小、隐层维度、最大位置编码一致。Happy distillation!七、训练损失与优化细节源码级解析蒸馏训练的核心引擎是 distiller.py 中的Distiller类。每一步前向同时运行学生与教师教师处于torch.no_grad()的 eval 模式见train()与step()然后组合多种损失损失项权重参数默认值说明蒸馏损失CE--alpha_ce0.5学生 log-softmax 与教师 softmax 之间的 KL 散度KLDivLoss按temperature缩放后乘以temperature ** 2补偿MLM 损失--alpha_mlm0.0掩码语言建模损失需与--mlm配合CLM 损失--alpha_clm0.5因果语言建模损失GPT2 类模型需在--mlm关闭时使用MSE 损失--alpha_mse0.0学生与教师 logits 的均方误差余弦嵌入损失--alpha_cos0.0学生与教师最后一层隐状态的余弦相似度CosineEmbeddingLosstarget 恒为 1temperature默认 2.0--restrict_ce_to_mask可让蒸馏损失只在 MLM 掩码位置计算否则在全部非 padding 位置计算。MLM 掩码策略见prepare_batch_mlm以--mlm_mask_prop默认 0.15比例选取被预测 token选取概率按token_probs即频次平滑因子加权稀有词更可能被选中对被选中的 token按--word_mask0.8/--word_keep0.1/--word_rand0.1比例分别替换为[MASK]、保留原词、随机替换。优化器与调度见Distiller.__init__使用AdamWbetas(0.9, 0.98)参数按是否含bias/LayerNorm.weight分组建权衰减warmup 步数 总优化步数 ×--warmup_prop默认 0.05配合get_linear_schedule_with_warmup默认--gradient_accumulation_steps 50、--learning_rate 5e-4、--max_grad_norm 5.0、--n_epoch 3、--batch_size 5。fp16 支持--fp16依赖 NVIDIA apexamp.initialize--fp16_opt_level默认O1教师模型转为 half学生以混合精度训练fp16 模式下批次与序列长度会被round_batch对齐到 8 的倍数参见 distiller.py 中round_batch。其他训练钩子--freeze_pos_embs冻结位置嵌入仅 roberta/gpt2 学生生效train.py--freeze_token_type_embds冻结 token type 嵌入仅 robertaTensorBoard 记录参数均值/方差、梯度统计、各类损失、学习率与内存占用--checkpoint_interval默认 4000周期保存 checkpoint每轮结束保存model_epoch_{i}.pth训练结束保存pytorch_model.bin。八、学生模型配置解析训练时通过--student_config指定学生架构 JSON。以 distilbert-base-uncased.json 为例{ activation: gelu, attention_dropout: 0.1, dim: 768, dropout: 0.1, hidden_dim: 3072, initializer_range: 0.02, max_position_embeddings: 512, n_heads: 12, n_layers: 6, sinusoidal_pos_embds: true, tie_weights_: true, vocab_size: 30522 }关键字段与教师 BERT 的关系n_layers从 12 压缩为 6与初始化抽取的 6 层一一对应dim/hidden_dim/n_heads/vocab_size与教师保持一致这是sanity_checks强制约束的蒸馏前提。仓库内还提供其他学生配置可直接对照使用distilbert-base-cased.jsoncased 变体distilbert-base-multilingual-cased.json多语言版vocab_size为 119547distilgpt2.jsonGPT2 学生采用n_embd768、n_head12、n_layer6、n_positions1024、vocab_size50257、layer_norm_epsilon1e-5等 GPT2 风格字段distilroberta-base.jsonRoBERTa 学生。九、任务级蒸馏微调与其他配套脚本除预训练蒸馏外该目录还提供任务级二次蒸馏示例 run_squad_w_distillation.py用于在 SQuAD 问答任务上以知识蒸馏方式微调官方发布的*-distilled-squad检查点即由此类流程产生。配套的数据与工具脚本总结文件作用scripts/binarized_data.py文本 → token 序列二值化输出 picklescripts/token_counts.py统计 token 频次供 MLM 平滑掩码使用scripts/extract.py抽取 RoBERTa/GPT2 教师层生成学生初始化 checkpointscripts/extract_distilbert.py抽取 BERT 教师层生成 DistilBERT 初始化 checkpointtrain.py蒸馏训练主入口单卡/分布式distiller.py蒸馏引擎损失组合、MLM/CLM 批处理、优化器与调度lm_seqs_dataset.py语言建模序列数据集封装grouped_batch_sampler.py按序列长度分组的 batch samplerutils.pyGPU/分布式初始化、随机种子、git 日志工具十、引用若本资源对你有帮助请引用官方论文inproceedings{sanh2019distilbert, title{DistilBERT, a distilled version of BERT: smaller, faster, cheaper and lighter}, author{Sanh, Victor and Debut, Lysandre and Chaumond, Julien and Wolf, Thomas}, booktitle{NeurIPS EMC^2 Workshop}, year{2019} }小结Distil* 项目展示了知识蒸馏在工业落地中的完整范式以教师模型的软标签与隐状态为监督信号把 12 层大模型压缩为 6 层小模型换取 40% 的参数削减、60% 的速度提升与 97% 的 GLUE 精度保留。结合本仓库 distillation 目录 的完整脚本你可以从原始文本出发完成数据二值化、token 计数、教师分层抽取、单卡或分布式蒸馏训练、SQuAD 二次微调的全链路并将产出的轻量模型直接通过 Transformers 的from_pretrained接口部署到生产环境。赞分享推理引擎大模型【免费下载链接】FlexGenRunning large language models on a single GPU for throughput-oriented scenarios.项目地址https://gitcode.com/gh_mirrors/fl/FlexGen点击查看免费下载相关推荐unilm 仓库 MiniLM 实战指南自注意力蒸馏压缩预训练模型NLU/NLG 微调全流程unilm 仓库 MiniLM 实战指南自注意力蒸馏压缩预训练模型NLU/NLG 微调全流程 MiniLM 是 unilm 仓库中的轻量级预训练模型系列其UI组件前端OpCore-Simplify 快速上手指南不手写配置也能生成可用的 OpenCore EFIOpCore Simplify 快速上手指南不手写配置也能生成可用的 OpenCore EFI OpCore Simplify 是一款黑苹果场景下的图形化 O开发工具CLIPaddleOCR 模型自动压缩实战基于 PaddleSlim 的量化训练与蒸馏全流程PaddleOCR 模型自动压缩实战基于 PaddleSlim 的量化训练与蒸馏全流程 本篇围绕 PaddleOCR 仓库 deploy/slim/auto_人工智能计算机视觉深度学习上一篇如何快速掌握FanControlWindows风扇控制的终极指南下一篇开源社区建设利器contributing-template在大型项目中的应用创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考