FastChat 与 Vicuna 权重版本指南:兼容性对照、Prompt 模板原理与 Delta 权重合并实操
2026/9/6 20:57:52 网站建设 项目流程

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 tokens>=0.2.21
v1.37B、13B、33BLlama 12023-06-22370M tokens>=0.2.1
v1.17B、13BLlama 12023-04-12->=0.2.1
v07B-delta、13B-deltaLlama 12023-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 仓库不同。完整步骤:

  1. 按 Hugging Face 官方文档将原始 LLaMA 权重转为 Hugging Face 格式;
  2. 使用仓库自带的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.1

Vicuna-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)合并

文档给出两种降低内存需求的方法,其中第一种由源码直接实现:

  1. 追加--low-cpu-mem参数:将大权重文件切分为小文件并用磁盘做临时存储,文档称峰值内存可保持在 16 GB 以下(该参数在 fastchat/model/apply_delta.py 的 help 文本中也说明用于把内存压到 10 GB 以下);
  2. 创建大 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_mapmetadata.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.jsontokenizer_config.json到转换后的权重目录修复。

文档同时给出根因层面的建议:

  • 使用transformers>=4.28.0,并用该版本重新执行基座 LLaMA 权重的格式转换——部分 tokenizer 异常与基座模型转换方式有关,并非 FastChat 或 Vicuna 权重本身的问题;
  • 文档特别强调的版本约束:v1.1 权重要求transformers>=4.28.0fschat>=0.2.0,按文档命令全新安装即可获得正确版本组合。

六、实践要点小结

  • 选版本:当前 FastChat(0.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.jsontokenizer_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),仅供参考

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

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

立即咨询