逐行剖析StableVicuna-13B的apply_delta.py:Delta权重合并进基座模型的5个关键步骤 逐行剖析StableVicuna-13B的apply_delta.pyDelta权重合并进基座模型的5个关键步骤【免费下载链接】stable-vicuna-13b-delta项目地址: https://ai.gitcode.com/hf_mirrors/ai-gitcode/stable-vicuna-13b-deltaStableVicuna-13B 是一款基于 LLaMA-13B、经 PPO 强化学习RLHF微调的开源对话大模型但模型仓库中只提供了 Delta增量权重无法直接加载使用。本文逐行剖析仓库中的 apply_delta.py 合并脚本带你完整看懂Delta 权重合并进基座模型的 5 个关键步骤零基础也能把这份 13B 对话大模型跑起来。一、为什么 StableVicuna-13B 只发布Delta 权重在 2023 年发布 Vicuna 系列模型时普遍采用Delta 权重权重差值的方式开源基座模型BaseMeta 的 LLaMA-13B 权重Delta 模型StableVicuna-13B 与 LLaMA-13B 之间的差值即Delta 微调后权重 − 基座权重这样做的好处是单份文件体积更小、便于传播。代价是Delta 权重本身不是一个完整模型必须通过一个公式还原出可运行的完整模型最终模型权重 LLaMA-13B 基座权重 StableVicuna-13B Delta 权重apply_delta.py这个只有 50 行出头的 Python 脚本做的就是这件事——把 Delta 权重逐参数加回基座模型保存出可以直接聊天的完整模型。下面开始逐行剖析。二、合并前的准备3 组关键文件在运行脚本前你需要准备好 3 组文件缺一不可文件作用本仓库对应文件LLaMA-13B 基座权重合并时的底座需自行申请获取--base-model-path指向它StableVicuna-13B Delta 权重待合并的增量权重pytorch_model-00001-of-00003.bin等 3 个分片Delta 模型的 Tokenizer决定最终模型的词表tokenizer.json、tokenizer.model等本仓库的权重被切分为 3 个分片文件pytorch_model-00001-of-00003.bin~pytorch_model-00003-of-00003.bin每个参数属于哪个分片都记录在 pytorch_model.bin.index.json 的weight_map中总大小为26,031,754,240 字节约 26GBfloat16 精度。模型结构信息可以从 config.json 中确认model_type为llama、hidden_size5120、num_hidden_layers40、vocab_size32001——这个 32001 的词表大小后面第 3 步会用到。如果你需要完整拉取本仓库的 Delta 权重git clone https://gitcode.com/hf_mirrors/ai-gitcode/stable-vicuna-13b-delta.git三、逐行剖析Delta 权重合并的 5 个关键步骤整个合并逻辑集中在apply_delta.py的apply_delta()函数里按顺序恰好分为5 个关键步骤。步骤 1加载 LLaMA-13B 基座模型第 14-15 行base AutoModelForCausalLM.from_pretrained( base_model_path, torch_dtypetorch.float16, low_cpu_mem_usageTrue)两行配置藏着两个关键细节torch_dtypetorch.float16以16 位浮点加载13B 参数的模型占用约 26GB 显存/内存比 float32 省一半这也是 config.json 中torch_dtype: float16所要求的精度low_cpu_mem_usageTrue低内存占用模式避免先创建全零张量再拷贝权重显著减少加载过程中的内存峰值。步骤 2加载 Delta 权重与 Delta Tokenizer第 17-19 行delta AutoModelForCausalLM.from_pretrained(delta_path, ...) delta_tokenizer AutoTokenizer.from_pretrained(delta_path)这一步把 StableVicuna-13B 的 Delta 权重即本仓库的pytorch_model-*.bin三个分片读入内存同时加载配套的 Tokenizer。注意最终模型使用的词表来自 Delta 仓库因为微调时模型可能在词表上做了扩充第 5 步保存时用的就是它。步骤 3对齐词表扩展并清零嵌入层第 21-29 行这是新手最容易忽略的一步。看这 3 行核心代码num_new_tokens base_tokenizer.add_special_tokens(dict(pad_token[PAD])) base.resize_token_embeddings(len(base_tokenizer)) input_embeddings[-num_new_tokens:] 0 output_embeddings[-num_new_tokens:] 0为什么要这么处理对比一下两边的词表就能明白LLaMA-13B 基座模型的词表大小是32000而 Delta 仓库的 config.json 里vocab_size是32001多出来的 1 个词正是 added_tokens.json 中记录的[PAD]: 32000。如果直接把 Delta 权重加到词表规模不一致的基座上嵌入矩阵的形状对不上合并必然报错。所以脚本给基座 Tokenizer 补上[PAD]特殊 token把输入/输出嵌入层扩展到 32001 行并将新增行的权重清零——这样后续加法运算时新行只会保留 Delta 侧学到的值不会被基座的随机值污染。步骤 4逐参数相加——Delta 合并的核心第 31-34 行for name, param in tqdm(base.state_dict().items(), descApplying delta): assert name in delta.state_dict() param.data delta.state_dict()[name]全文的灵魂就是最后这个param.data ...遍历基座模型state_dict()中的每一个参数40 层 Transformer 的注意力、MLP、LayerNorm……约 130 亿个权重找到 Delta 侧同名参数逐元素相加。assert则是一层保险只要基座里有一个参数在 Delta 中不存在立即报错终止防止半合并的坏模型。跑完这一轮base变量里装的就是完整的 StableVicuna-13B 了。步骤 5保存最终模型与 Tokenizer第 36-38 行base.save_pretrained(target_model_path) delta_tokenizer.save_pretrained(target_model_path)合并后的权重以标准 HuggingFace 格式保存到--target-model-path指定的目录并配上 Delta 仓库的 Tokenizer。从此之后这个目录就可以像普通 LLaMA 模型一样被transformers直接加载不再需要任何 DeltaREADME.md 中的示例即演示了加载后直接对话的用法。四、一行命令跑完全流程命令行参数说明第 41-49 行apply_delta.py通过argparse暴露 3 个必填参数使用方式非常简单python3 apply_delta.py \ --base-model-path /path/to/model_weights/llama-13b \ --target-model-path stable-vicuna-13b \ --delta-path CarperAI/stable-vicuna-13b-delta参数含义--base-model-pathLLaMA-13B 基座权重的本地路径--target-model-path合并结果完整 StableVicuna-13B的保存路径--delta-pathDelta 权重路径本地目录或可下载的仓库名⚠️内存提示脚本会把基座≈26GB和 Delta≈26GB同时载入内存建议准备64GB 以上内存的机器执行合并合并过程只需在 CPU 上完成不依赖 GPU。五、常见问题与小结Q1合并后的模型可以再次用 Delta 覆盖吗可以。整个过程是纯参数运算不依赖原基座之外的任何训练数据重复执行只会得到相同结果。Q2为什么必须用 Delta 仓库的 Tokenizer而不是基座的因为词表不同32000 vs 32001。用错词表会导致生成的文本出现乱码或缺少[PAD]处理。Q3输出模型是完整模型还缺 Delta 吗不缺。合并后的target-model-path是自包含的完整 StableVicuna-13B可独立部署、继续微调或量化压缩。小结apply_delta.py虽然只有约 50 行但完整展示了开源社区最经典的Delta 权重合并范式加载基座 → 加载增量 → 对齐词表与嵌入 → 逐参数相加 → 保存完整模型。理解了这 5 个关键步骤你再遇到 Vicuna、Alpaca 等任何 Delta 格式的大模型都能用同样的思路快速还原出可运行的完整权重。【免费下载链接】stable-vicuna-13b-delta项目地址: https://ai.gitcode.com/hf_mirrors/ai-gitcode/stable-vicuna-13b-delta创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考