ARTICLE DETAIL

资讯详情

深耕编程入门与网站建设的一线实战洞察。

FastChat 与 Vicuna 权重版本指南:兼容性对照、Prompt 模板原理与 Delta 权重合并实操

FastChat 与 Vicuna 权重版本指南:兼容性对照、Prompt 模板原理与 Delta 权重合并实操 FastChat 与 Vicuna 权重版本指南兼容性对照、Prompt 模板原理与 Delta 权重合并实操【免费下载链接】FastChatAn open platform for training, serving, and evaluating large language models. Release repo for Vicuna and Chatbot Arena.项目地址: https://gitcode.com/GitHub_Trending/fa/FastChat本文围绕 FastChat 仓库中的 Vicuna 权重版本说明 展开系统梳理 Vicuna v0/v1.1/v1.3/v1.5 四个权重版本的基座模型、训练数据与 FastChat 版本兼容性结合 fastchat/conversation.py 的模板注册源码和 fastchat/model/apply_delta.py 的权重合并实现帮助你在部署 Vicuna 时正确选择权重版本、构造匹配的 Prompt 模板并在低内存环境下完成 delta 权重转换。一、Vicuna 权重版本总览与兼容性对照docs/vicuna_weights_version.md 给出的核心是一张权重版本对照表它是选择权重时最重要的参考依据。完整信息如下权重版本可用规格基座模型发布日期微调数据量要求的 FastChat 版本v1.57B、7B-16k、13B、13B-16kLlama 22023-08-01370M tokens0.2.21v1.37B、13B、33BLlama 12023-06-22370M tokens0.2.1v1.17B、13BLlama 12023-04-12-0.2.1v07B-delta、13B-deltaLlama 12023-03-30-0.1.10各权重均以lmsys/vicuna-*形式的 Hugging Face 模型仓库发布如 v1.5 的 7B 对应lmsys/vicuna-7b-v1.5v0 对应lmsys/vicuna-7b-delta-v0文档中的表格链接指向这些仓库。当前仓库的 pyproject.toml 显示 FastChat 自身版本为0.2.36满足 v1.5 及之后所有版本的兼容性要求也就是说用当前代码库部署 v1.5 权重是官方支持的组合。需要注意两点版本语义v0 是上限兼容而非下限兼容表格中 v0 对应0.1.10即该 delta 权重只能在旧版 FastChat 上使用新代码已不再为其提供推理路径v1.5 引入了 16K 上下文规格文档在 Updates 一节说明v1.5 的 16k 版本是通过线性 RoPE scaling将上下文长度扩展到 16K 的变体与标准版权重不通用加载前需确认权重与期望上下文长度匹配。二、各版本权重的关键变更文档的 Updates 小节记录了三个主要版本的演进动因这些变更直接决定了模板与训练配置的差异v1.5基座模型切换为 Llama 2提供使用线性 RoPE scaling 的 16K 上下文长度版本。v1.3相比前序版本使用两倍的 ShareGPT 数据量进行训练直接发布合并后的完整权重merged weights不再以 delta 权重形式发布。v1.1重构了分词与分隔符分隔符从###改为 EOS token/s。文档明确指出这一改动让判定生成停止条件变得更容易并提升了对其他推理库的兼容性修复了监督微调SFT的损失计算方式以改善模型质量。从这条演进线索可以看出v0 → v1.1 是模板层面的断层###体系 →/s体系因此两套权重必须使用各自的 Prompt 模板混用会导致对话格式错乱v1.1 → v1.3 → v1.5 则是数据量与基座模型的升级模板保持稳定。三、Prompt 模板文档示例与 FastChat 源码实现3.1 v1.1/v1.3/v1.5 的模板格式与注册源码文档给出的 v1.1 及之后权重的示例 Prompt 为A chat between a curious user and an artificial intelligence assistant. The assistant gives helpful, detailed, and polite answers to the users questions. USER: Hello! ASSISTANT: Hello!/s USER: How are you? ASSISTANT: I am good./s在 FastChat 中该模板以vicuna_v1.1的名字注册于 fastchat/conversation.py# Vicuna v1.1 template register_conv_template( Conversation( namevicuna_v1.1, system_messageA chat between a curious user and an artificial intelligence assistant. The assistant gives helpful, detailed, and polite answers to the users questions., roles(USER, ASSISTANT), sep_styleSeparatorStyle.ADD_COLON_TWO, sep , sep2/s, ) )对照示例 Prompt 可以看出逐字段对应关系system_message首行的任务描述与示例第一句完全一致roles(USER, ASSISTANT)角色标签对应示例中的USER:/ASSISTANT:前缀sep_styleSeparatorStyle.ADD_COLON_TWO交替使用两种分隔符的排版风格sep 用户消息后接一个空格、sep2/s助手消息后接 EOS token。生成逻辑由Conversation.get_prompt()的ADD_COLON_TWO分支实现见 fastchat/conversation.pyelif self.sep_style SeparatorStyle.ADD_COLON_TWO: seps [self.sep, self.sep2] ret system_prompt seps[0] for i, (role, message) in enumerate(self.messages): if message: ... ret role : message seps[i % 2] else: ret role : return ret即消息列表按下标奇偶交替取sep/sep2USER 消息偶数下标结尾补空格ASSISTANT 消息奇数下标结尾补/s最终消息置为None时只输出role:前缀等待模型续写——这正是 v1.1 用 EOS 作为停止判定的机制来源生成遇到/s即截断比 v0 匹配字符串###更稳健。仓库末尾的自测入口 fastchat/conversation.py 还演示了如何打印该模板的实际 Promptconv get_conv_template(vicuna_v1.1) conv.append_message(conv.roles[0], Hello!) conv.append_message(conv.roles[1], Hi!) conv.append_message(conv.roles[0], How are you?) conv.append_message(conv.roles[1], None) print(conv.get_prompt())可直接运行python3 -m fastchat.conversation验证输出是否与文档示例一致。3.2 v0 的模板格式文档给出的 v0 示例为A chat between a curious human and an artificial intelligence assistant. The assistant gives helpful, detailed, and polite answers to the humans questions. ### Human: Hello! ### Assistant: Hello! ### Human: How are you? ### Assistant: I am good.v0 使用###作为每行消息前缀且停止条件为字符串###即stop_str###。从当前仓库的源码结构看这种格式对应的注册项是 fastchat/conversation.py 中的zero_shot模板namezero_shot, system_messageA chat between a curious human and an artificial intelligence assistant. The assistant gives helpful, detailed, and polite answers to the humans questions., roles(Human, Assistant), sep_styleSeparatorStyle.ADD_COLON_SINGLE, sep\n### , stop_str###,其sep\n### 与stop_str###的组合正好复现了文档中 v0 示例的### Human:/### Assistant:行格式。由于 v0 权重已被标注仅兼容0.1.10保留这套模板主要是为了历史权重与数据复现新部署应使用vicuna_v1.1模板。3.3 在模型服务中选择模板模板不只是文档概念而是运行时参数。fastchat/serve/model_worker.py 中ModelWorker构造函数接收conv_template参数并传递给基类命令行入口 fastchat/serve/model_worker.py 通过args.conv_template注入Controller 侧按模型下发该参数。因此启动 worker 时显式指定--model-name对应的模板名Vicuna 系列对应vicuna_v1.1是保证推理格式正确的一环。四、应用 Delta 权重仅 v0 需要由于 LLaMA 模型协议的限制Vicuna v0 以 delta增量权重发布需要叠加到原始 LLaMA 权重上才能得到可用的 Vicuna 权重。v1.3 起官方直接发布合并权重v1.1 的 delta 合并命令与 v0 相同只是 delta 仓库不同。完整步骤按 Hugging Face 官方文档将原始 LLaMA 权重转为 Hugging Face 格式使用仓库自带的fastchat.model.apply_delta脚本delta 权重会从lmsys官方账号自动下载。4.1 标准合并命令Vicuna-7B约需 30 GB 内存python3 -m fastchat.model.apply_delta \ --base-model-path /path/to/llama-7b \ --target-model-path /path/to/output/vicuna-7b \ --delta-path lmsys/vicuna-7b-delta-v1.1Vicuna-13B约需 60 GB 内存python3 -m fastchat.model.apply_delta \ --base-model-path /path/to/llama-13b \ --target-model-path /path/to/output/vicuna-13b \ --delta-path lmsys/vicuna-13b-delta-v1.1其中/path/to/*需替换为真实路径v0 权重则把--delta-path换成对应的lmsys/vicuna-7b-delta-v0/lmsys/vicuna-13b-delta-v0仓库。4.2 源码实现解析命令对应实现是 fastchat/model/apply_delta.py 的apply_delta()核心为 fastchat/model/apply_delta.pydef apply_delta(base_model_path, target_model_path, delta_path): print(fLoading the delta weights from {delta_path}) delta_tokenizer AutoTokenizer.from_pretrained(delta_path, use_fastFalse) delta AutoModelForCausalLM.from_pretrained( delta_path, torch_dtypetorch.float16, low_cpu_mem_usageTrue ) ... print(Applying the delta) for name, param in tqdm(base.state_dict().items(), descApplying delta): assert name in delta.state_dict() param.data delta.state_dict()[name] ... base.save_pretrained(target_model_path) delta_tokenizer.save_pretrained(target_model_path)实现要点基座模型与 delta 均以torch.float16low_cpu_mem_usageTrue加载逐参数执行base delta并用assert保证 delta 中必须包含基座的全部参数名保存时写回的是基座模型本体base.save_pretrained而 tokenizer 取自delta 侧delta_tokenizer.save_pretrained——这与第五节 FAQ 中转换后目录里应有 delta 侧的special_tokens_map.json的验证方法直接呼应。CLI 参数定义见 fastchat/model/apply_delta.py--base-model-path、--target-model-path、--delta-path均必填另有一个可选开关--low-cpu-mem。4.3 低内存Low CPU Memory合并文档给出两种降低内存需求的方法其中第一种由源码直接实现追加--low-cpu-mem参数将大权重文件切分为小文件并用磁盘做临时存储文档称峰值内存可保持在 16 GB 以下该参数在 fastchat/model/apply_delta.py 的 help 文本中也说明用于把内存压到 10 GB 以下创建大 swap 文件依赖操作系统自动把磁盘作为虚拟内存使用。--low-cpu-mem路径进入apply_delta_low_cpu_mem()见 fastchat/model/apply_delta.py其策略是split_files()fastchat/model/apply_delta.py按split_size 4 * GB第 78 行把pytorch_model-*.bin分片切到临时目录逐分片加载基座权重从 delta 分片中查找同名参数并原地累加累加完成后逐分片写回目标目录循环中反复调用gc.collect()释放内存额外生成pytorch_model.bin.index.json含weight_map与metadata.total_size保证多分片权重可被 Transformers 正常加载最后同样保存 delta 侧的 tokenizer 与 config 到目标目录。五、FAQTokenizer 相关问题排查文档 FAQ 针对一类高频问题给出了明确判断标准应用 delta 之后转换出的权重目录中必须存在special_tokens_map.json文件其内容应与lmsys/vicuna-13b-delta-v0仓库中的同名文件一致该方法对 v0 与 v1.1 均适用。若该文件缺失可从同一 delta 仓库拷贝special_tokens_map.json与tokenizer_config.json到转换后的权重目录修复。文档同时给出根因层面的建议使用transformers4.28.0并用该版本重新执行基座 LLaMA 权重的格式转换——部分 tokenizer 异常与基座模型转换方式有关并非 FastChat 或 Vicuna 权重本身的问题文档特别强调的版本约束v1.1 权重要求transformers4.28.0且fschat0.2.0按文档命令全新安装即可获得正确版本组合。六、实践要点小结选版本当前 FastChat0.2.36应优先选用 v1.5 合并权重需要 16K 上下文时选用 16k 规格v0 delta 权重仅用于历史复现。选模板v1.1 及以后权重使用vicuna_v1.1模板USER/ASSISTANT/s停止v0 权重使用###体系模板仓库中对应zero_shotstop_str###。做合并v0/v1.1 delta 权重用python3 -m fastchat.model.apply_delta合并7B 约 30 GB 内存、13B 约 60 GB 内存内存不足时加--low-cpu-mem走 4 GB 分片 磁盘暂存路径。验产物合并后检查权重目录是否含 delta 侧的special_tokens_map.json与tokenizer_config.json缺失则按 FAQ 补拷。相关源码入口fastchat/model/apply_delta.pydelta 合并、fastchat/conversation.py模板注册与 Prompt 组装、fastchat/serve/model_worker.py推理服务与conv_template参数、pyproject.tomlFastChat 版本信息。【免费下载链接】FastChatAn open platform for training, serving, and evaluating large language models. Release repo for Vicuna and Chatbot Arena.项目地址: https://gitcode.com/GitHub_Trending/fa/FastChat创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表