导出器
可以通过对 HfExporter 进行子类化,向 Transformers 添加新的导出后端。
了解如何在 Exporters 指南中使用内置的导出器。
AutoHfExporter
自动 HF 导出器类,负责根据 ExportConfig 自动实例化为正确的 HfExporter。
从附带导出配置的预训练模型/检查点加载一个导出器实例。
尚未实现 — 用于一等“导出配方”工作流的占位符。
核心思路:模型所有者在 Hub 上发布权重的同时,也发布一个 export_config.json(或在 config.json 中提供一个 export_config 字段)。该文件记录了所有者已针对其架构验证过的配置——目标格式(dynamo / onnx / executorch)、精确的动态形状规格(例如 text_ids 动态至 4096,图像 tile 固定为 448,边缘部署时 batch=1)、strict 标志、ONNX opset、prefill 与 decode 的布局、ExecuTorch 后端选择,以及目前仅存在于 README 或私有 notebook 中的其他任何配置项。
随后,消费者只需一次调用即可获取经过所有者验证的导出:
exporter = AutoHfExporter.from_pretrained("org/model-name")
program = exporter.export(model, inputs)与 [register_export_input_preparer] 注册表协同工作:所有者通过 export_config.json 提供形状规范,transformers 则为该架构提供依赖数据的预计算项(cu_seqlens、视觉位置 ID、窗口索引等)。两者共同覆盖了导出新模型的两个难点——确定正确的形状契约以及准备正确的输入——从而让下游用户无需从零开始重新推导这两者(也避免了因处理不当而在生产环境中出现问题)。
如果提供的字典描述了一个同时注册了配置类和导出器类的 export_format,则返回 True。当该格式完全缺失、未知或仅部分注册时,会发出包含可操作建议的警告。
AutoExportConfig
Auto-HF 导出配置类,负责根据存储在字典中的导出配置,自动分发到正确的导出配置。
HfExporter
所有 Transformers 导出器的抽象基类。
子类化并实现 ~HfExporter.export 以添加新的导出后端。
导出
< source >( model: PreTrainedModelsample_inputs: MutableMapping[str, torch.Tensor | Cache]config: ExportConfigMixin )
参数
- model (PreTrainedModel) — 要导出的模型。
- sample_inputs (
dict[str, torch.Tensor | Cache]) — Forward kwargs — 即传递给model(**sample_inputs)的参数。这些参数在追踪期间直接用作示例输入。对于自回归解码步骤的导出,这意味着您需要包含past_key_values、cache_position等。如果您只有生成式输入,请改用~HfExporter.export_for_generation— 它会为您运行model.generate并导出每个阶段。 - config (
ExportConfigMixin) — 后端特定配置。
导出模型并返回特定于后端的程序对象。
export_for_generation
< source >( model: PreTrainedModelsample_inputs: MutableMapping[str, torch.Tensor | Cache]config: ExportConfigMixin | dict[str, ExportConfigMixin]generation_config: GenerationConfig | None = Nonemulti_token_decode: bool = False ) → dict[str, Any]
参数
- model (PreTrainedModel) —
要导出的生成式模型。必须支持
model.generate(**sample_inputs)。 - sample_inputs (
dict[str, torch.Tensor | Cache]) — Generate 关键字参数 — 即传递给model.generate(**sample_inputs)的参数 (通常为input_ids+attention_mask,对于多模态模型还包括pixel_values/input_features等模态输入)。各阶段的 forward 关键字参数会在内部自动捕获。 - config (
ExportConfigMixin或dict[str, ExportConfigMixin]) — 后端特定配置。传入单个配置以应用于所有组件,或传入以组件名称为键的dict(例如"image_encoder"、"language_model"、"lm_head"、"decode")以按组件进行覆盖——dict 中必须包含所有组件名称。 - generation_config (GenerationConfig, 可选) —
转发至
generate()捕获(默认使用模型自身的配置)。传入一个包含cache_implementation="static"的配置,即可针对固定大小的StaticCache进行导出。 - multi_token_decode (
bool,可选,默认为False) —decode组件是否一次处理多个查询 token——即动态查询轴(在空缓存上执行 prefill,否则为基于 past 的续写)——而非经典的单 token 步进(参见 decompose_for_generation())。仅在动态形状导出(config.dynamic=True)下保持动态。
返回值
dict[str, Any]
{component_name: backend_specific_artifact} — 键与
decompose_for_generation() 相同。值为
~HfExporter.export 针对具体后端(ExportedProgram、
ONNXProgram、ExecutorchProgramManager)返回的内容。
分解生成模型,并独立导出每个组件。
Thin wrapper around decompose_for_generation() that calls ~HfExporter.export on every returned (submodel, forward_inputs) pair. If you need
the intermediate (submodel, forward_inputs) pairs (for verification, custom inputs,
skipping a stage, …), call decompose_for_generation() directly.
检查 required_packages 是否已安装,并在版本与 tested_versions 存在偏差时发出警告。
DynamoExporter
用于将 PreTrainedModel 转换为 ExportedProgram 的导出器。
示例:
>>> from transformers.exporters.exporter_dynamo import DynamoExporter, DynamoConfig
>>> exporter = DynamoExporter()
>>> exported = exporter.export(model, inputs, config=DynamoConfig(dynamic=True))
>>> outputs = exported.module()(**inputs)导出
< source >( model: PreTrainedModelsample_inputs: MutableMapping[str, Any]config: DynamoConfig | dict[str, Any] )
OnnxExporter
用于将 PreTrainedModel 转换为 ONNX ONNXProgram 的导出器。
示例:
>>> from transformers.exporters.exporter_onnx import OnnxExporter, OnnxConfig
>>> exporter = OnnxExporter()
>>> onnx_program = exporter.export(model, inputs, config=OnnxConfig(dynamic=True))
>>> outputs = onnx_program(**inputs) # run in-memory
>>> exporter.export(model, inputs, config=OnnxConfig(output_path="model.onnx")) # save to disk导出
< source >( model: PreTrainedModelsample_inputs: MutableMapping[str, Any]config: OnnxConfig | dict[str, Any] )
ExecutorchExporter
用于将 PreTrainedModel 转换为 ExecuTorch ExecutorchProgramManager 的导出器。
示例:
>>> from transformers.exporters.exporter_executorch import ExecutorchExporter, ExecutorchConfig
>>> exporter = ExecutorchExporter()
>>> et_program = exporter.export(model, inputs, config=ExecutorchConfig(backend="xnnpack"))
>>> et_program.write_to_file("model.pte")导出
< source >( model: PreTrainedModelsample_inputs: MutableMapping[str, Any]config: ExecutorchConfig | dict[str, Any] )
将模型导出到 ExecuTorch,并应用后端准备和 torch 算子补丁。
DynamoConfig
class transformers.exporters.DynamoConfig
< source >( export_format: ExportFormat = <ExportFormat.DYNAMO: 'dynamo'>dynamic: bool = Falsestrict: bool = Falsedynamic_shapes: dict[str, Any] | None = Noneprefer_deferred_runtime_asserts_over_guards: bool = Falsequantizer: ExportQuantizer | None = None )
参数
- dynamic(bool,可选,默认为 False) — 是否以动态(符号)形状进行导出。当 True 且未设置 dynamic_shapes 时,所有张量维度将自动设置为 Dim.AUTO。
- strict (bool,可选,默认为 False) — 是否启用 torch.export 的严格模式。该模式会执行完整的符号追踪并捕获更多错误,但速度更慢,且在复杂模型上更容易失败。
- dynamic_shapes (dict[str, Any],可选) — 传递给 torch.export 的显式逐输入动态形状规范。其优先级高于 dynamic。
- prefer_deferred_runtime_asserts_over_guards (bool,可选,默认为 False) —
当 True 时,数据依赖的形状守卫会以运行时断言的形式输出到导出的图中,而不是在追踪阶段因守卫无法在整个符号形状范围内成立而导致导出失败。大多数 Transformer LLM 在使用细粒度的
Dim(min=, max=)边界时,需要将其设置为 True。如果使用dynamic=True/Dim.AUTO,则无需设置,因为torch.export会推断形状关系,而不是将其与用户声明的边界进行验证。 - quantizer ([~exporters.quantizers.ExportQuantizer],可选) — 导出期间应用的训练后量化:针对每个后端,在 FX 图上使用 [~exporters.quantizers.PT2EQuantizer] 或 [~exporters.quantizers.NNCFTorchFXQuantizer],在转换后的 ONNX 模型上使用 [~exporters.quantizers.OnnxRuntimeQuantizer],或在转换后的 OpenVINO / ONNX 模型上使用 [~exporters.quantizers.NNCFOpenVINOQuantizer] / [~exporters.quantizers.NNCFOnnxQuantizer]。
用于通过 torch.export 导出模型的配置类。
OnnxConfig
class transformers.exporters.OnnxConfig
< source >( export_format: ExportFormat = <ExportFormat.ONNX: 'onnx'>dynamic: bool = Falsestrict: bool = Falsedynamic_shapes: dict[str, Any] | None = Noneprefer_deferred_runtime_asserts_over_guards: bool = Falsequantizer: ExportQuantizer | None = Noneoutput_path: str | PathLike | None = Noneopset_version: int | None = Noneexternal_data: bool = Trueoptimize: bool = Trueexport_params: bool = Truekeep_initializers_as_inputs: bool = False )
参数
- output_path (
str或PathLike,可选) —.onnx文件的输出路径。当None(默认值)时,导出的模型将作为ONNXProgram保留在内存中,而不会写入磁盘。 - opset_version (
int, 可选) — 要使用的 ONNX opset 版本。默认值为已安装的onnxscript版本所支持的最新 opset。 - external_data (
bool,可选,默认为True) — 将大型权重张量存储在单独的.onnx_data伴随文件中,而不是嵌入到 protobuf 中。对于权重超过 2 GB protobuf 限制的模型,此选项是必需的。 - optimize (
bool,可选,默认为True) — 对导出的图运行onnxscript优化通道(常量折叠、死代码消除等)。如果模型触发了上游onnxscript优化器的 bug,请禁用此选项。 - export_params (
bool,可选,默认为True) — 将模型权重嵌入 ONNX 图中。设置为False可导出一个不含权重的图(权重必须在运行时提供)。 - keep_initializers_as_inputs (
bool,可选,默认为False) — 将权重初始化器暴露为显式的图输入。某些较旧的 ONNX 运行时(opset < 9)需要此设置。
用于通过 torch.onnx.export 将模型导出为 ONNX 的配置类。
继承 DynamoConfig 的所有字段(dynamic、strict、dynamic_shapes、prefer_deferred_runtime_asserts_over_guards)。
ExecutorchConfig
class transformers.exporters.ExecutorchConfig
< source >( export_format: ExportFormat = <ExportFormat.EXECUTORCH: 'executorch'>dynamic: bool = Falsestrict: bool = Falsedynamic_shapes: dict[str, Any] | None = Noneprefer_deferred_runtime_asserts_over_guards: bool = Falsequantizer: ExportQuantizer | None = Nonebackend: str = 'xnnpack'alloc_graph_input: bool = Truealloc_graph_output: bool = Truealloc_mutable_buffers: bool = True )
参数
- backend (
str, 可选, 默认为"xnnpack") — 目标 ExecuTorch 后端。支持的取值:"xnnpack"— 通过 XNNPACK 库进行 CPU 推理(默认;可在任何地方运行)。"cuda"— 通过 ExecuTorch CUDA 后端进行 GPU 推理。"mlx"— 在 Apple Silicon 上通过 ExecuTorch MLX 后端进行 GPU 推理。
- alloc_graph_input (
bool,可选,默认为True) — 内存规划阶段是否为图输入保留 arena 内存。当设置为False时,运行时将直接使用调用方提供的输入缓冲区,而不是将其复制到 arena 中——因此,就地执行的USER_INPUT_MUTATION(例如对StaticCache的写入)会作用于调用方的张量,而非 arena 中的副本。 - alloc_graph_output (
bool,可选,默认为True) — 内存规划阶段是否为图输出保留 arena 内存。当设置为False时,调用方必须在运行时绑定输出缓冲区(Method::set_output_data_ptr);将输出绑定到其被修改的输入缓冲区可以避免复制出的往返开销。 - alloc_mutable_buffers (
bool,可选,默认为True) — 内存规划阶段是否为可变缓冲区(驻留于模型中的状态)保留 arena 内存。该参数会传递给MemoryPlanningPass。
用于将模型导出为 ExecuTorch 格式的配置类。
继承 DynamoConfig 的所有字段(dynamic、strict、dynamic_shapes、prefer_deferred_runtime_asserts_over_guards)。
OpenVINOConfig
class transformers.exporters.OpenVINOConfig
< source >( export_format: ExportFormat = <ExportFormat.OPENVINO: 'openvino'>dynamic: bool = Falsestrict: bool = Falsedynamic_shapes: dict[str, Any] | None = Noneprefer_deferred_runtime_asserts_over_guards: bool = Falsequantizer: ExportQuantizer | None = Noneoutput_path: str | PathLike | None = Nonecompress_to_fp16: bool = Truestateful: bool = True )
参数
- output_path (str 或 PathLike,可选) —
.xml 文件的输出路径(对应的 .bin 文件将写入同一位置)。当
None(默认值)时,转换后的模型将作为
openvino.Model保留在内存中。 - compress_to_fp16 (bool,可选,默认为 True) —
保存时将浮点权重压缩为 FP16——在大多数模型上对精度影响可忽略不计,同时可将磁盘占用减半。仅在设置了
output_path时生效。 - stateful (bool, optional, defaults to True) —
Fold round-tripped state tensors (KV cache, SSM states, …) into internal OV
variables (
ReadValue/Assign`). The runtime then carries state across `infer()` calls instead of marshalling cache tensors through inputs/outputs on every step, and a fused `beam_idxinput reorders state in-graph for beam search. No-op for models without round-tripped state (encoders, prefill-only exports). Set it to False for targets that take no stateful model, such as the NPU plugin.
用于通过 openvino.convert_model 将模型导出为 OpenVINO IR 的配置类。
继承自 [DynamoConfig] 的所有字段(dynamic、strict、dynamic_shapes、prefer_deferred_runtime_asserts_over_guards)。
量化器
class transformers.exporters.ExportQuantizer
< source >( calibration_dataset: Iterable[dict[str, Any]] | None = None )
在导出期间应用的训练后量化器的基类。
量化器会声明其支持的导出格式以及所需的依赖包(包括经过测试的版本,与导出器类似),并说明它是在任何转换之前对 torch.export FX 图进行量化(因此所有后端都会接收该结果),还是对后端转换后的模型(onnx_ir.Model、openvino.Model)进行量化。导出器会预先针对导出进行验证,然后使用该模型及导出的示例输入调用 ~ExportQuantizer.quantize。请继承该类并实现 quantize 以添加新的量化方法;CalibrationSet 用于将校准样本映射到模型自身的输入。
对 model(若 quantizes_fx_graph 为真,则为 FX 图,否则为后端模型)进行量化并返回结果,
校准数据使用 calibration_dataset,若其不存在,则使用导出时的 sample_inputs。
如果此量化器无法在 export_format 导出上运行,或其所需的包缺失或版本过旧,则抛出异常;如果版本与其测试所用版本不一致,则发出警告。
一个在 calibration_dataset 上进行校准的该量化器的副本。
class transformers.exporters.quantizers.CalibrationSet
< source >( calibration_dataset: Iterable[dict[str, Any]] | Nonesample_inputs: dict[str, Any]transform: Callable[[dict[str, Any]], Any] )
作为模型输入的校准样本的可重复迭代视图。
这些样本是量化器的 calibration_dataset,或者在量化器没有提供样本时,是导出自身的 sample_inputs(读取时会发出一次警告)。它们可以是任意映射,例如分词器的 BatchEncoding。transform 会将每个前向传播关键字参数样本映射为量化模型所接受的内容(即被追踪的关键字参数、ONNX 输入或 OpenVINO 端口输入),该过程是惰性的,每次遍历都会逐个样本进行处理。
class transformers.exporters.PT2EQuantizer
< source >( quantizer: Anycalibration_dataset: Iterable[dict[str, Any]] | None = None )
参数
- quantizer (
torchao.quantization.pt2e.quantizer.Quantizer) — 用于标注图的 PT2E 量化器。其量化/反量化算子必须是目标后端所支持的算子:inductor、ONNX (QDQ) 或 OpenVINO 使用X86InductorQuantizer,ExecuTorch 使用XNNPACKQuantizer。 - calibration_dataset (
Iterable[dict], 可选) — 观测器用于校准的输入字典(参见ExportQuantizer),每次前向传播对应一个。若需基于批次进行校准,请传入一个DataLoader,将样本整理为批处理输入字典,而不是传入单个样本的列表。
使用 PyTorch 2 Export (PT2E) 量化 对 FX 图进行量化:prepare_pt2e 会插入观测器,校准集驱动这些观测器,随后 convert_pt2e 将它们替换为量化/反量化算子。支持所有导出后端。
示例:
>>> from torchao.quantization.pt2e.quantizer.x86_inductor_quantizer import (
... X86InductorQuantizer,
... get_default_x86_inductor_quantization_config,
... )
>>> from transformers.exporters import DynamoConfig, PT2EQuantizer
>>> x86 = X86InductorQuantizer().set_global(get_default_x86_inductor_quantization_config())
>>> DynamoConfig(quantizer=PT2EQuantizer(x86, calibration_dataset=samples))class transformers.exporters.OnnxRuntimeQuantizer
< source >( config: OnnxRuntimeStaticConfig | OnnxRuntimeDynamicConfig | None = Nonecalibration_dataset: Iterable[dict[str, Any]] | None = None )
使用 ONNX Runtime 自带的工具(onnxruntime.quantization)对转换后的 ONNX 模型进行量化:使用 OnnxRuntimeStaticConfig(默认)的 quantize_static,或使用 OnnxRuntimeDynamicConfig 的 quantize_dynamic。
示例:
>>> from transformers.exporters import (
... OnnxConfig,
... OnnxRuntimeDynamicConfig,
... OnnxRuntimeQuantizer,
... OnnxRuntimeStaticConfig,
... )
>>> static = OnnxRuntimeStaticConfig(per_channel=True)
>>> OnnxConfig(quantizer=OnnxRuntimeQuantizer(static, calibration_dataset=samples))
>>> OnnxConfig(quantizer=OnnxRuntimeQuantizer(OnnxRuntimeDynamicConfig()))类 transformers.exporters.OnnxRuntimeStaticConfig
< source >( quant_format: Any = Noneop_types_to_quantize: list[str] | None = Noneper_channel: bool | None = Nonereduce_range: bool | None = Noneactivation_type: Any = Noneweight_type: Any = Nonenodes_to_quantize: list[str] | None = Nonenodes_to_exclude: list[str] | None = Nonecalibrate_method: Any = Nonecalibration_providers: list[str] | None = Noneextra_options: dict[str, Any] | None = None )
onnxruntime.quantization.quantize_static 的参数:int8 激活值和权重(默认采用 QDQ 格式),基于量化器的 calibration_dataset 进行校准。将某个字段保留为 None 即可沿用 ONNX Runtime 的默认值。各项参数的详细说明请参见 quantize_static。
类 transformers.exporters.OnnxRuntimeDynamicConfig
< source >( op_types_to_quantize: list[str] | None = Noneper_channel: bool | None = Nonereduce_range: bool | None = Noneweight_type: Any = Nonenodes_to_quantize: list[str] | None = Nonenodes_to_exclude: list[str] | None = Noneextra_options: dict[str, Any] | None = None )
onnxruntime.quantization.quantize_dynamic 的参数:int8 权重,激活值在运行时进行量化,无需校准。将某个字段保留为 None 即可沿用 ONNX Runtime 的默认值。各项参数的详细说明请参见 quantize_dynamic。
class transformers.exporters.NNCFOpenVINOQuantizer
< source >( config: NNCFQuantizationConfig | NNCFWeightCompressionConfig | None = Nonecalibration_dataset: Iterable[dict[str, Any]] | None = None )
使用 NNCF 对转换后的 OpenVINO 模型进行量化:使用 nncf.quantize 和 NNCFQuantizationConfig(默认),或使用 nncf.compress_weights 和 NNCFWeightCompressionConfig。
示例:
>>> import nncf
>>> from transformers.exporters import NNCFOpenVINOQuantizer, NNCFWeightCompressionConfig, OpenVINOConfig
>>> OpenVINOConfig(quantizer=NNCFOpenVINOQuantizer(calibration_dataset=samples))
>>> OpenVINOConfig(
... quantizer=NNCFOpenVINOQuantizer(NNCFWeightCompressionConfig(mode=nncf.CompressWeightsMode.INT4_SYM))
... )class transformers.exporters.NNCFOnnxQuantizer
< source >( config: NNCFQuantizationConfig | NNCFWeightCompressionConfig | None = Nonecalibration_dataset: Iterable[dict[str, Any]] | None = None )
使用 NNCF 的 ONNX 后端对转换后的 ONNX 模型进行量化:使用 nncf.quantize 和 NNCFQuantizationConfig(默认,int8 QDQ),或使用 nncf.compress_weights 和 NNCFWeightCompressionConfig(int4,作为 ONNX Runtime 的 MatMulNBits)。
示例:
>>> import nncf
>>> from transformers.exporters import NNCFOnnxQuantizer, NNCFWeightCompressionConfig, OnnxConfig
>>> OnnxConfig(quantizer=NNCFOnnxQuantizer(calibration_dataset=samples))
>>> OnnxConfig(quantizer=NNCFOnnxQuantizer(NNCFWeightCompressionConfig(mode=nncf.CompressWeightsMode.INT4_SYM)))类 transformers.exporters.NNCFTorchFXQuantizer
< source >( config: NNCFQuantizationConfig | NNCFWeightCompressionConfig | None = Nonecalibration_dataset: Iterable[dict[str, Any]] | None = None )
通过 NNCF 的 TorchFX 后端对 torch.export FX 图进行量化:使用 nncf.quantize 配合 NNCFQuantizationConfig(默认使用 quantize/dequantize 算子),或使用 nncf.compress_weights 配合 NNCFWeightCompressionConfig。与 PT2EQuantizer 类似,它在任何转换之前运行,因此所有后端都会接收其结果。ExecuTorch 仅降低仅权重(weight-only)的结果:XNNPACK 不会委托 quantize/dequantize 算子,且 ExecuTorch 没有针对这些算子的内核。
class transformers.exporters.NNCFQuantizationConfig
< source >( mode: Any = Nonepreset: Any = Nonetarget_device: Any = Nonesubset_size: int | None = Nonefast_bias_correction: bool | None = Nonemodel_type: Any = Noneignored_scope: Any = Noneadvanced_parameters: Any = None )
nncf.quantize 的参数:对量化器的 calibration_dataset 进行校准后的 int8 激活值和权重。
除 model_type 外,将字段保留为 None 会沿用 NNCF 的默认值;model_type 的默认值为 nncf.ModelType.TRANSFORMER。
有关每个参数的详细信息,请参阅 nncf.quantize。
class transformers.exporters.NNCFWeightCompressionConfig
< source >( mode: Any = Noneratio: float | None = Nonegroup_size: int | None = Noneignored_scope: Any = Noneall_layers: bool | None = Nonesensitivity_metric: Any = Nonesubset_size: int | None = Noneawq: bool | None = Nonescale_estimation: bool | None = Nonegptq: bool | None = Nonelora_correction: bool | None = Nonebackup_mode: Any = Nonecompression_format: Any = Noneadvanced_parameters: Any = None )
nncf.compress_weights 的参数:仅针对权重的 int8 或 int4 量化,其中 int4 模式支持数据感知方法(AWQ、scale estimation、GPTQ)。int8 模式无需数据;其他模式则基于量化器的 calibration_dataset 进行校准。gptq 和 lora_correction 仅适用于 OpenVINO。将某个字段保留为 None 时,将沿用 NNCF 的默认值。有关每个参数的详细说明,请参阅 nncf.compress_weights。
实用工具
export_for_generation 底层函数,适用于需要在分解模型和导出各个组件之间进行干预的场景。
transformers.exporters.utils.get_leaf_tensors
< source >( obj: Any ) → dict[str, torch.Tensor]
递归地从可能嵌套的结构中获取所有叶张量。
transformers.exporters.utils.prepare_for_export
< source >( model: PreTrainedModel | torch.nn.Moduleinputs: MutableMapping[str, Any] )
配置用于导出的模型和输入。会就地修改 model 和 inputs,
并返回 (model, inputs, output_flags),其中 output_flags 保存了从 inputs 中弹出的
use_cache、return_dict 等值(在跟踪期间,patch_model_config 会将其可逆地应用到 model.config 上)。
- 移除标签输入(
labels、future_values)——不支持损失计算。 - 从
inputs中弹出输出标志(use_cache、return_dict、……),使其不会作为被追踪的 kwargs 出现;这些值会被返回,供 trace 块应用到model.config上。 - 预先计算通过
@register_export_input_preparer注册的数据依赖型视觉/音频 kwargs,并将其写入inputs。 - 将输入张量转换为与模型的
dtype/device相匹配。
transformers.exporters.utils.decompose_prefill_decode
< source >( model: PreTrainedModelinputs: dict[str, Any]generation_config: Any = Nonemulti_token_decode: bool = False ) → dict[str, tuple[torch.nn.Module, dict]]
返回值
dict[str, tuple[torch.nn.Module, dict]]
{"prefill": (model, prefill_inputs), "decode": (model, decode_inputs)}.
运行 model.generate() 并捕获 prefill 和 decode 的输入。
复用完整的生成机制,使每种架构(仅解码器、SSM、编码器-解码器、多模态等)都能获得正确的输入,而无需重新实现循环。
generation_config 会转发给 generate()(默认使用模型自身的配置),因此捕获的输入会使用 generate() 构建的缓存。传入一个包含 cache_implementation="static" 和 max_cache_len=N 的配置,即可在解码输入中捕获一个 静态大小 的缓存——这是静态缓存导出的基础。max_cache_len 独立于捕获过程来设定缓存大小,因此导出的解码将使用固定大小的 [..., N, ...] 缓存,而不是不断增长的缓存。
当 multi_token_decode 为真时,decode 组件会被捕获为 多 token 解码——即将两个连续的解码步骤合并(参见 _merge_decode_calls),从而使其查询序列轴保持符号化(单 token 解码会将该轴特化为 1)。随后,它既能处理单个 token(常规解码),也能处理多个 token(基于过去状态的续写,或在缓存为空时的普通预填充)。否则,decode 即为经典的单 token 解码。
transformers.exporters.utils.decompose_multimodal
< source >( model: PreTrainedModelinputs: dict[str, Any] ) → dict[str, tuple[torch.nn.Module, dict]]
返回值
dict[str, tuple[torch.nn.Module, dict]]
每个检测到的子模块(图像/音频编码器、投影器、语言模型、lm_head)对应一个 name: (module, inputs) 条目。
引发
ValueError
ValueError— 如果在模型中未找到任何已知的多模态子模块。
通过单次前向传播捕获每个多模态子模块的输入。
通过属性名称(视觉塔、投影器、语言模型、lm_head 等)检测所有已知的多模态子模块,并在一次 model(**inputs) 调用中捕获它们的 forward kwargs。
每个子模块都会作为独立的 name: (module, inputs) 条目返回,以便进行独立导出。Token 合并步骤(例如多模态模型中的 masked_scatter)被有意排除在导出的图之外——调用方有责任在运行解码器之前,根据编码器输出组装 inputs_embeds。
transformers.exporters.utils.decompose_for_generation
< source >( model: PreTrainedModelinputs: dict[str, Any]generation_config: Any = Nonemulti_token_decode: bool = False ) → `{component_name
参数
- model — 生成式模型。必须支持
model.generate(**inputs)。 - inputs — Generate 关键字参数 — 即传递给
model.generate(**inputs)的内容。 - generation_config — 可选的
GenerationConfig,在捕获期间转发给generate()。传入一个包含cache_implementation="static"+max_cache_len=N的配置,以针对静态大小的缓存进行导出(参见decompose_prefill_decode)。 - multi_token_decode — 当
True时,将decode组件捕获为多 token 解码(动态查询序列轴:一次处理多个 token —— 基于过去状态的续写,或在缓存为空时执行普通的 prefill);单 token 解码无法保持动态(参见decompose_prefill_decode)。
返回值
`{component_name
(submodel, forward_inputs)}. Keys are “prefill”/“decode”for plain generative models and”/“multi_modal_projector”/“language_model”/“lm_head”/“decode”` for multi-modal generative models.
将生成式模型分解为可独立导出的 (model, forward_inputs) 对。
运行 decompose_prefill_decode,以从真实的 model.generate(**inputs, max_new_tokens=2) 中捕获 prefill 和 decode 的前向 kwargs。如果 prefill 是多模态的(根据 is_multimodal),则通过 decompose_multimodal 将其进一步拆分为每个子模块(视觉/音频编码器、projector、语言模型、lm_head)各一个条目。
如果模型是多模态模型,包含模态编码器和语言模型,则返回 True。
非PreTrainedModel(例如裸的nn.Module)没有标准的get_encoder/get_decoder访问器,并且显然不是多模态的,因此会直接短路返回False。