Auto Classes 系统是 Transformers 库的核心架构组件,它提供了一个统一且简化的 API,可以根据模型类型和配置动态加载相应的实现类。该系统使用户能够通过一致的接口处理数百种模型架构,而无需了解每种模型的具体实现细节。
Auto Classes 系统有几个关键目的:
本页面专门介绍 Auto Classes 架构及其内部工作原理。有关使用特定模型实现的信息,请参阅其各自的文档页面。
Auto Classes 系统围绕 _BaseAutoModelClass 和 _LazyAutoMapping 构建,它们根据模型配置动态实例化相应的实现类。该系统通过 _LazyModule 使用延迟加载来优化导入性能。
该库为不同组件提供了多个 Auto Classes:
| Auto Class | 基类 | 目的 | 映射字典 |
|---|---|---|---|
AutoConfig | _BaseAutoModelClass | 配置加载 | CONFIG_MAPPING_NAMES |
AutoModel | _BaseAutoModelClass | 基础模型加载 | MODEL_MAPPING_NAMES |
AutoModelForCausalLM | _BaseAutoModelClass | 因果语言模型 | MODEL_FOR_CAUSAL_LM_MAPPING_NAMES |
AutoModelForSequenceClassification | _BaseAutoModelClass | 序列分类 | MODEL_FOR_SEQUENCE_CLASSIFICATION_MAPPING_NAMES |
AutoTokenizer | _LazyAutoMapping | 分词器加载 | TOKENIZER_MAPPING_NAMES |
AutoProcessor | _LazyAutoMapping | 多模态处理器 | PROCESSOR_MAPPING_NAMES |
AutoImageProcessor | _LazyAutoMapping | 图像处理器 | IMAGE_PROCESSOR_MAPPING_NAMES |
来源: src/transformers/models/auto/auto_factory.py21-26 src/transformers/models/auto/modeling_auto.py32-357 src/transformers/models/auto/configuration_auto.py36-387 src/transformers/models/auto/tokenization_auto.py57-58 src/transformers/models/auto/processing_auto.py52-53 src/transformers/models/auto/image_processing_auto.py57-58
来源: src/transformers/models/auto/auto_factory.py21-26 src/transformers/configuration_utils.py25 src/transformers/models/auto/configuration_auto.py473-506
Auto Classes 系统使用 OrderedDict 映射来将模型类型链接到实现类名称。每个映射包含数百个模型类型条目,这些条目由 _LazyAutoMapping 使用以动态加载正确的类。
| 模型类型 | 配置 | 基础模型 | 因果 LM | 分词器 |
|---|---|---|---|---|
"bert" | "BertConfig" | "BertModel" | "BertLMHeadModel" | ("BertTokenizer", "BertTokenizerFast") |
"llama" | "LlamaConfig" | "LlamaModel" | "LlamaForCausalLM" | ("LlamaTokenizer", "LlamaTokenizerFast") |
"gpt2" | "GPT2Config" | "GPT2Model" | "GPT2LMHeadModel" | ("GPT2Tokenizer", "GPT2TokenizerFast") |
"whisper" | "WhisperConfig" | "WhisperModel" | 不适用 | ("WhisperTokenizer", "WhisperTokenizerFast") |
来源: src/transformers/models/auto/configuration_auto.py36-387 src/transformers/models/auto/modeling_auto.py32-357 src/transformers/models/auto/modeling_auto.py534-531 src/transformers/models/auto/tokenization_auto.py57-673 src/transformers/utils/import_utils.py51 src/transformers/__init__.py1018-1022
Transformers 库使用 _LazyModule 来推迟到第一次访问时才进行导入,从而优化启动时间。该系统维护一个 _import_structure 字典,将模块名称映射到其可导出的对象。
_LazyModule:自定义模块类,实现 __getattr__ 以按需导入。_import_structure:将模块路径映射到可导出对象列表的字典。define_import_structure():从文件系统结构构建导入映射的函数。sys.modules 替换:主 transformers 模块被替换为 _LazyModule 实例。来源: src/transformers/__init__.py1023-1029 src/transformers/utils/import_utils.py51 src/transformers/__init__.py57-280 src/transformers/utils/_LazyModule
Auto Classes 是使用自动工厂系统生成的,该系统根据映射创建必要的类。这是通过 _BaseAutoModelClass 及类似的基础类以及 auto_class_update 函数完成的。
来源: src/transformers/models/auto/auto_factory.py
Auto Classes 系统使用 OptionalDependencyNotAvailable 异常和虚拟对象进行条件导入,以优雅地处理多种框架。
| 框架 | Auto Classes | 虚拟对象 | 映射名称 |
|---|---|---|---|
| PyTorch | AutoModel, AutoModelForCausalLM | dummy_pt_objects | MODEL_MAPPING_NAMES |
| TensorFlow | TFAutoModel, TFAutoModelForCausalLM | dummy_tf_objects | TF_MODEL_MAPPING_NAMES |
| Flax | FlaxAutoModel, FlaxAutoModelForCausalLM | dummy_flax_objects | FLAX_MODEL_MAPPING_NAMES |
当框架不可用时,虚拟类会引发有用的错误消息。
来源:src/transformers/__init__.py341-348 src/transformers/__init__.py473-479 src/transformers/__init__.py520-528 src/transformers/utils/dummy_pt_objects.py573-577 src/transformers/utils/dummy_tf_objects.py5-9 src/transformers/models/auto/modeling_tf_auto.py28-29
当调用from_pretrained()时,系统会加载配置,提取model_type,通过映射解析实现类,然后实例化。
解析过程使用几个关键函数
PretrainedConfig.from_pretrained():从Hub或本地路径加载模型配置get_values(mapping):从延迟映射字典中提取类名model_type_to_module_name():将模型类型转换为用于导入的模块路径getattr(module, class_name):动态导入特定的模型类来源:src/transformers/models/auto/auto_factory.py21-26 src/transformers/models/auto/configuration_auto.py473-506 src/transformers/configuration_utils.py25 src/transformers/models/auto/configuration_auto.py653-672
最常见的用法模式是使用Auto类加载预训练模型
对于TensorFlow或Flax模型
有针对不同任务的专用Auto类
| 任务 | Auto Class |
|---|---|
| 文本分类 | AutoModelForSequenceClassification |
| 问答 | AutoModelForQuestionAnswering |
| 因果语言建模 | AutoModelForCausalLM |
| 掩码语言建模 | AutoModelForMaskedLM |
| 图像分类 | AutoModelForImageClassification |
| 语音识别 | AutoModelForSpeechSeq2Seq |
| 还有更多... |
来源:src/transformers/models/auto/modeling_auto.py1349-3018
from_pretrained()接口_LazyModule将初始导入时间从几秒缩短到几毫秒OrderedDict映射提供可预测的模型解析要添加新的模型架构,开发人员必须更新多个映射字典
CONFIG_MAPPING_NAMES中,位于src/transformers/models/auto/configuration_auto.py36-387TOKENIZER_MAPPING_NAMES,位于src/transformers/models/auto/tokenization_auto.py57-673_import_structure位于src/transformers/__init__.py57-280对于第三方模型,系统通过以下方式支持trust_remote_code=True
get_class_from_dynamic_module():下载和导入外部模型代码resolve_trust_remote_code():验证信任设置和用户权限来源:src/transformers/models/auto/configuration_auto.py25-27 src/transformers/dynamic_module_utils.py25-26 utils/check_repo.py46-47 utils/check_copies.py15-32
Auto Classes系统提供了一个强大而灵活的架构,简化了Transformers库中提供的各种模型的使用,同时保持了库的性能和可扩展性。