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.5 | 7B、7B-16k、13B、13B-16k | Llama 2 | 2023-08-01 | 370M tokens | >=0.2.21 |
| v1.3 | 7B、13B、33B | Llama 1 | 2023-06-22 | 370M tokens | >=0.2.1 |
| v1.1 | 7B、13B | Llama 1 | 2023-04-12 | - | >=0.2.1 |
| v0 | 7B-delta、13B-delta | Llama 1 | 2023-03-30 | - | <=0.1.10 |
各权重均以lmsys/vicuna-*形式的 Hugging Face 模型仓库发布(如 v1.5 的 7B 对应lmsys/vicuna-7b-v1.5,v0 对应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 user's 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( name="vicuna_v1.1", system_message="A chat between a curious user and an artificial intelligence assistant. " "The assistant gives helpful, detailed, and polite answers to the user's questions.", roles=("USER", "ASSISTANT"), sep_style=SeparatorStyle.ADD_COLON_TWO, sep=" ", sep2="</s>", ) )对照示例 Prompt 可以看出逐字段对应关系:
system_message:首行的任务描述,与示例第一句完全一致;roles=("USER", "ASSISTANT"):角色标签,对应示例中的USER:/ASSISTANT:前缀;sep_style=SeparatorStyle.ADD_COLON_TWO:交替使用两种分隔符的排版风格;sep=" "(用户消息后接一个空格)、sep2="</s>"(助手消息后接 EOS token)。
生成逻辑由Conversation.get_prompt()的ADD_COLON_TWO分支实现,见 fastchat/conversation.py:
elif 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/sep2:USER 消息(偶数下标)结尾补空格,ASSISTANT 消息(奇数下标)结尾补</s>,最终消息置为None时只输出role:前缀等待模型续写——这正是 v1.1 用 EOS 作为停止判定的机制来源:生成遇到</s>即截断,比 v0 匹配字符串###更稳健。
仓库末尾的自测入口 fastchat/conversation.py 还演示了如何打印该模板的实际 Prompt:
conv = 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 human's questions. ### Human: Hello! ### Assistant: Hello! ### Human: How are you? ### Assistant: I am good.v0 使用###作为每行消息前缀,且停止条件为字符串###(即stop_str="###")。从当前仓库的源码结构看,这种格式对应的注册项是 fastchat/conversation.py 中的zero_shot模板:
name="zero_shot", system_message="A chat between a curious human and an artificial intelligence assistant. " "The assistant gives helpful, detailed, and polite answers to the human's questions.", roles=("Human", "Assistant"), sep_style=SeparatorStyle.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.py:
def apply_delta(base_model_path, target_model_path, delta_path): print(f"Loading the delta weights from {delta_path}") delta_tokenizer = AutoTokenizer.from_pretrained(delta_path, use_fast=False) delta = AutoModelForCausalLM.from_pretrained( delta_path, torch_dtype=torch.float16, low_cpu_mem_usage=True ) ... print("Applying the delta") for name, param in tqdm(base.state_dict().items(), desc="Applying 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.float16+low_cpu_mem_usage=True加载,逐参数执行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 到目标目录。
五、FAQ:Tokenizer 相关问题排查
文档 FAQ 针对一类高频问题给出了明确判断标准:应用 delta 之后,转换出的权重目录中必须存在special_tokens_map.json文件,其内容应与lmsys/vicuna-13b-delta-v0仓库中的同名文件一致(该方法对 v0 与 v1.1 均适用)。若该文件缺失,可从同一 delta 仓库拷贝special_tokens_map.json与tokenizer_config.json到转换后的权重目录修复。
文档同时给出根因层面的建议:
- 使用
transformers>=4.28.0,并用该版本重新执行基座 LLaMA 权重的格式转换——部分 tokenizer 异常与基座模型转换方式有关,并非 FastChat 或 Vicuna 权重本身的问题; - 文档特别强调的版本约束:v1.1 权重要求
transformers>=4.28.0且fschat>=0.2.0,按文档命令全新安装即可获得正确版本组合。
六、实践要点小结
- 选版本:当前 FastChat(0.2.36)应优先选用 v1.5 合并权重;需要 16K 上下文时选用 16k 规格;v0 delta 权重仅用于历史复现。
- 选模板:v1.1 及以后权重使用
vicuna_v1.1模板(USER/ASSISTANT+</s>停止);v0 权重使用###体系模板(仓库中对应zero_shot,stop_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.py(delta 合并)、fastchat/conversation.py(模板注册与 Prompt 组装)、fastchat/serve/model_worker.py(推理服务与conv_template参数)、pyproject.toml(FastChat 版本信息)。
【免费下载链接】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),仅供参考