4. 指令说明

通过以下指令启用模型权重共享相关功能:

./hmmstrip ((--strip | -s) | (--restore | -r)) -o OUT -i IN1 IN2 [IN3 ...]

指令参数说明如下:

  • 模式参数(必选,二选一)

    • --strip | -s:启用 Strip 模式。以 -i 参数中最后一个输入模型作为目标模型,对其执行权重共享处理,生成体积更小的共享模型文件。

    • --restore|-r:启用 Restore 模式。以 -i 参数中最后一个输入模型作为目标模型,恢复其共享模型中的权重数据,生成完整可执行的模型文件。

  • -o:指定输出文件的路径(.hmm 或 .hmms)。

  • -i:指定输入模型文件列表,至少需要提供两个模型文件。其中:

    • 前面的模型作为权重参考模型或权重源模型。

    • 列表中的最后一个模型为实际执行 Strip 或 Restore 操作的目标模型。

  • -h:显示帮助信息。

4.1. 注意事项

工具使用注意事项如下:

  • 文件后缀一致性: 所有输入模型文件与输出模型文件必须使用相同的文件后缀,即全部为 .hmm 或全部为 .hmms。不支持混合使用。

  • 输入模型顺序要求: -i 参数中输入模型的顺序具有明确语义,不可随意调整:

    • Strip模式:最后一个输入模型作为待Strip权重的目标模型。

    • Restore模式:最后一个输入模型作为待Restore的共享模型。

  • 编译参数一致性: 参与权重共享的所有模型,在通过 build_from_hmonnx 接口编译模型时,其接口参数设置必须完全一致。若编译参数不一致,可能导致权重无法正确共享或恢复失败。

  • 推理阶段加载顺序要求: 模型经过 Strip 处理后,在推理或部署阶段加载模型时,必须先加载未Strip的完整模型,再加载Strip后的共享模型。这是因为共享模型本身不包含完整权重数据,运行时依赖参考模型中的权重信息。

4.2. 示例

4.2.1. 生成共享模型

两个模型之间的权重共享

下面示例展示如何对目标模型执行权重共享处理,生成共享模型文件,以减少存储与内存占用。

指令示例如下:

./hmmstrip --strip -o decode.strip.hmm -i prefill.hmm decode.hmm

上面指令中,输入模型如下:

  • prefill.hmm:权重参考模型,包含完整权重数据。

  • decode.hmm:目标模型,将从中strip可共享权重。

指令生成一个仅包含差异权重信息的共享模型 decode.strip.hmm。该模型不再独立保存完整权重数据,运行时需依赖 prefill.hmm 提供共享权重。

在模型推理阶段,使用 Strip 处理后的共享模型时,必须先加载对应的权重参考模型,再加载共享权重模型。这是因为共享模型本身不包含完整的权重数据,其缺失的权重需要在运行时从参考模型中获取。

示例如下:

wm = tcim_lite.runtime.WeightManager()
opt = tcim_lite.runtime.Option(wm)
# 先加载完整的权重参考模型
m0 = tcim_lite.runtime.load('prefill.hmm', opt)
# 因为decode.strip.hmm的部分信息在prefill.hmm中,因此需最后加载decode.strip.hmm
m0 = tcim_lite.runtime.load('decode.strip.hmm', opt)

多参考模型

下面示例展示如何在多模型推理或分阶段执行场景中,目标模型可能同时与多个前序模型共享权重。

指令示例如下:

./hmmstrip --strip -o C.strip.hmm -i A.hmm B.hmm C.hmm

上面指令中,输入模型如下:

  • A.hmm:权重参考模型,包含完整权重数据。

  • B.hmm:权重参考模型。

  • C.hmm:目标模型,将从中strip可共享权重。

该指令会分析 C.hmm 与参考模型 A.hmmB.hmm 之间的权重关系,并将所有可与任一参考模型共享的权重数据从 C.hmm 中剥离,生成共享模型 C.strip.hmm

在模型推理阶段,使用 Strip 处理后的共享模型时,必须先加载对应的权重参考模型,再加载共享模型。这是因为共享模型本身不包含完整的权重数据,其缺失的权重需要在运行时从参考模型中获取。

示例如下:

wm = tcim_lite.runtime.WeightManager()
opt = tcim_lite.runtime.Option(wm)
# 先加载完整的权重参考模型
m0 = tcim_lite.runtime.load('A.hmm', opt)
m0 = tcim_lite.runtime.load('B.hmm', opt)
# 因为c.strip.hmm的部分信息在A.hmm和B.hmm中,因此需最后加载C.strip.hmm
m0 = tcim_lite.runtime.load('C.strip.hmm', opt)

4.2.2. 恢复共享模型

下面示例展示如何将共享模型恢复为包含完整权重的可执行模型文件。

指令示例如下:

./hmmstrip --restore -o decode.restore.hmm -i prefill.hmm decode.strip.hmm

上面指令中,输入模型如下:

  • prefill.hmm:权重源模型,包含完整权重数据。

  • decode.strip.hmm:共享模型,由 Strip 模式生成。

指令生成完整模型 decode.restore.hmm。该模型包含完整权重数据,可独立加载并用于推理。