exporters

GitHub
694 52 简单 1 次阅读 5天前Apache-2.0语言模型开发框架
AI 解读 由 AI 自动生成,仅供参考

exporters 是 Hugging Face 团队推出的一款开源工具,旨在帮助开发者将基于 PyTorch、TensorFlow 或 JAX 构建的 Transformers 模型轻松转换为苹果生态专用的 Core ML 格式。它主要解决了大语言模型和视觉模型从训练环境部署到 iOS、macOS 等移动端设备时的格式兼容难题,让算法工程师无需手动编写复杂的转换脚本,即可实现模型的端侧推理。

这款工具特别适合需要在苹果设备上部署 AI 应用的移动开发者和机器学习研究人员。其核心亮点在于与 Hugging Face Transformers 库的深度集成,内置了针对 BERT、GPT-2、ViT、MobileBERT 等多种主流架构的预置配置,支持一键导出。此外,exporters 还提供了一个无需代码的在线转换空间,用户可先在线验证模型兼容性,成功后再下载权重,极大降低了尝试门槛。需要注意的是,由于 Transformer 模型通常较大,官方建议结合 Optimum 工具先对模型进行优化,以确保在移动设备上的运行效率。

使用场景

某移动端开发团队计划将 Hugging Face 上的 DistilBERT 模型集成到 iOS 应用中,以实现离线的实时情感分析功能。

没有 exporters 时

  • 开发者需手动编写复杂的 Python 脚本调用 coremltools,反复调试输入输出张量的形状与类型匹配。
  • 面对 Transformer 特有的动态轴(如变长序列),缺乏预设配置导致转换过程频繁报错,排查耗时极长。
  • 每次尝试新模型架构都需重新研究底层转换逻辑,无法直接复用社区已有的最佳实践。
  • 缺乏与 Hugging Face Hub 的无缝衔接,下载权重、预处理和格式转换步骤割裂,工作流繁琐且易出错。

使用 exporters 后

  • 仅需一行命令行指令(如 python -m exporters.coreml --model=distilbert-base-uncased)即可自动完成高质量转换。
  • 内置针对 DistilBERT 等主流架构的专用配置文件,自动处理动态轴和算子映射,显著提升转换成功率。
  • 轻松切换不同模型进行实验,无需关心底层 Core ML 细节,让团队能专注于业务逻辑而非格式适配。
  • 深度集成 Hugging Face 生态,支持直接从 Hub 拉取模型并导出,甚至可通过无代码 Space 预先验证可行性。

exporters 通过将复杂的模型转换流程标准化和自动化,让开发者能以最低成本将先进的 NLP 模型部署到苹果设备端。

运行环境要求

操作系统
  • Linux
  • macOS
GPU
  • 未说明(Core ML 模型针对 Apple Neural Engine、GPU 和 CPU 优化,但转换过程主要依赖 CPU
  • 未提及 NVIDIA GPU 或 CUDA 需求)
内存

未说明

依赖
notes虽然可以在 Linux 上运行导出功能,但强烈建议使用 macOS,因为模型验证步骤需要 Core ML 框架(仅在 macOS 上可用)。导出的模型格式为 mlpackage,要求至少 iOS 15、macOS 12.0 和 Xcode 13。Transformer 模型通常较大,可能不适合移动设备,建议先使用 Optimum 进行优化。
python未说明
transformers
coremltools
exporters hero image

快速开始

🤗 Exporters

👷 开发中 👷

这个包允许你将 🤗 Transformers 模型导出为 Core ML 格式。

对于将模型转换为 TFLite 格式,我们建议使用 Optimum

何时使用 🤗 Exporters

🤗 Transformers 模型可以用 PyTorch、TensorFlow 或 JAX 实现。然而,在部署时,你可能希望使用不同的框架,例如 Core ML。这个库可以轻松地将 Transformers 模型转换为这种格式。

Exporters 包的目标是比使用 coremltools 编写自己的转换脚本更加方便,并且与 🤗 Transformers 库和 Hugging Face Hub 紧密集成。

为了更便捷的方式,Exporters 提供了一个 无需代码的 Transformers 到 Core ML 转换 Space。你可以无需安装任何东西就试用它,以检查你感兴趣的模型是否可以被转换。如果转换成功,转换后的 Core ML 权重将会被推送到 Hub。如需更多灵活性和关于转换过程的详细信息,请继续阅读。

注意:请记住,Transformer 模型通常非常大,并不总是适合在移动设备上使用。最好先使用 🤗 Optimum 对模型进行 推理优化

安装

克隆这个仓库:

$ git clone https://github.com/huggingface/exporters.git

将其作为 Python 包安装:

$ cd exporters
$ pip install -e .

完成!

注意:Core ML 导出器可以在 Linux 上使用,但推荐使用 macOS。

Core ML

Core ML 是 Apple 的软件库,用于在设备上快速运行神经网络和其他类型的机器学习模型。它可以在 macOS、iOS、tvOS 和 watchOS 上使用,并针对 CPU、GPU 和 Apple Neural Engine 进行了优化。尽管 Core ML 框架是专有的,但 Core ML 文件格式是一种开放格式。

Core ML 导出器使用 coremltools 将 PyTorch 或 TensorFlow 模型转换为 Core ML 格式。

exporters.coreml 包允许你通过配置对象将模型检查点转换为 Core ML 模型。这些配置对象已经为许多模型架构准备好了,并且设计为易于扩展到其他架构。

预置的配置包括以下架构:

  • BEiT
  • BERT
  • ConvNeXT
  • CTRL
  • CvT
  • DistilBERT
  • DistilGPT2
  • GPT2
  • LeViT
  • MobileBERT
  • MobileViT
  • SegFormer
  • SqueezeBERT
  • Vision Transformer (ViT)
  • YOLOS

在此处查看以获取支持的完整模型列表。

将模型导出为 Core ML

exporters.coreml 包可以从命令行作为 Python 模块使用。要使用预置配置导出检查点,请执行以下操作:

python -m exporters.coreml --model=distilbert-base-uncased exported/

这会导出由 --model 参数定义的检查点的 Core ML 版本。在本例中是 distilbert-base-uncased,但它可以是 Hugging Face Hub 上的任何检查点,也可以是本地存储的检查点。

生成的 Core ML 文件将保存到 exported 目录中,名为 Model.mlpackage。你也可以指定一个文件名,而不是目录,例如 DistilBERT.mlpackage

转换过程中输出大量警告信息和其他日志信息是正常现象,可以安全地忽略。如果一切顺利,导出应该以以下日志结束:

正在验证 Core ML 模型...
	-[✓] Core ML 模型输出名称与参考模型匹配 ({'last_hidden_state'})
	- 验证 Core ML 模型输出 "last_hidden_state":
		-[✓] (1, 128, 768) 与 (1, 128, 768) 匹配
		-[✓] 所有值接近(atol: 0.0001)
一切正常,模型已保存至:exported/Model.mlpackage

注意:虽然在 Linux 上也可以将模型导出为 Core ML,但验证步骤只能在 Mac 上执行,因为它需要 Core ML 框架来运行模型。

生成的文件是 Model.mlpackage。该文件可以添加到 Xcode 项目中,并加载到 macOS 或 iOS 应用程序中。

导出的 Core ML 模型使用 mlpackage 格式,模型类型为 ML Program。这种格式于 2021 年推出,至少需要 iOS 15、macOS 12.0 和 Xcode 13。我们更倾向于使用这种格式,因为它代表了 Core ML 的未来。Core ML 导出器也可以生成旧的 .mlmodel 格式,但不推荐使用。

对于 Hub 上的 TensorFlow 检查点,过程相同。例如,你可以从 Keras 组织导出一个纯 TensorFlow 检查点,如下所示:

python -m exporters.coreml --model=keras-io/transformers-qa exported/

要导出本地存储的模型,你需要将模型的权重和分词器文件存储在一个目录中。例如,我们可以加载并保存一个检查点,如下所示:

>>> from transformers import AutoTokenizer、AutoModelForSequenceClassification

>>> # 从 Hub 加载分词器和 PyTorch 权重
>>> tokenizer = AutoTokenizer.from_pretrained("distilbert-base-uncased")
>>> pt_model = AutoModelForSequenceClassification.from_pretrained("distilbert-base-uncased")
>>> # 保存到磁盘
>>> tokenizer.save_pretrained("local-pt-checkpoint")
>>> pt_model.save_pretrained("local-pt-checkpoint")

一旦检查点被保存,你可以通过将 --model 参数指向包含检查点文件的目录来将其导出为 Core ML:

python -m exporters.coreml --model=local-pt-checkpoint exported/

为不同模型拓扑选择功能

每个现成的配置都带有一组 功能,使您可以为不同类型的拓扑或任务导出模型。如下表所示,每种功能都与一个不同的自动类相关联:

功能 自动类
default, default-with-past AutoModel
causal-lm, causal-lm-with-past AutoModelForCausalLM
ctc AutoModelForCTC
image-classification AutoModelForImageClassification
masked-im AutoModelForMaskedImageModeling
masked-lm AutoModelForMaskedLM
multiple-choice AutoModelForMultipleChoice
next-sentence-prediction AutoModelForNextSentencePrediction
object-detection AutoModelForObjectDetection
question-answering AutoModelForQuestionAnswering
semantic-segmentation AutoModelForSemanticSegmentation
seq2seq-lm, seq2seq-lm-with-past AutoModelForSeq2SeqLM
sequence-classification AutoModelForSequenceClassification
speech-seq2seq, speech-seq2seq-with-past AutoModelForSpeechSeq2Seq
token-classification AutoModelForTokenClassification

对于每种配置,您可以通过 FeaturesManager 查看支持的功能列表。例如,对于 DistilBERT,我们可以这样做:

>>> from exporters.coreml.features import FeaturesManager

>>> distilbert_features = list(FeaturesManager.get_supported_features_for_model_type("distilbert").keys())
>>> print(distilbert_features)
['default', 'masked-lm', 'multiple-choice', 'question-answering', 'sequence-classification', 'token-classification']

然后,您可以将这些功能之一传递给 exporters.coreml 包中的 --feature 参数。例如,要导出一个文本分类模型,我们可以从 Hub 中选择一个微调过的模型并运行:

python -m exporters.coreml --model=distilbert-base-uncased-finetuned-sst-2-english \
                           --feature=sequence-classification exported/

这将显示以下日志:

Validating Core ML model...
	- Core ML model is classifier, validating output
		-[✓] predicted class NEGATIVE matches NEGATIVE
		-[✓] number of classes 2 matches 2
		-[✓] all values close (atol: 0.0001)
All good, model saved at: exported/Model.mlpackage

请注意,在这种情况下,导出的模型是一个 Core ML 分类器,它除了输出概率字典外,还会预测得分最高的类别名称,而不是我们之前在 distilbert-base-uncased 检查点中看到的 last_hidden_state。这是预期的行为,因为该微调过的模型具有序列分类头。

带有 with-past 后缀的功能(例如 causal-lm-with-past)对应于具有预计算隐藏状态(注意力块中的键和值)的模型拓扑,这些状态可用于快速自回归解码。

配置导出选项

要查看所有可能的选项,请在命令行中运行以下命令:

python -m exporters.coreml --help

导出模型至少需要以下参数:

  • -m <model>:来自 Hugging Face Hub 的模型 ID,或用于加载模型的本地路径。
  • --feature <task>:模型应执行的任务,例如 "image-classification"。请参阅上表以了解可能的任务名称。
  • <output>:存储生成的 Core ML 模型的路径。

输出路径可以是一个文件夹,在这种情况下文件将被命名为 Model.mlpackage,或者您也可以直接指定文件名。

还可以提供以下附加参数:

  • --preprocessor <value>:使用哪种类型的预处理器。auto 会尝试自动检测。可能的值有:auto(默认)、tokenizerfeature_extractorprocessor
  • --atol <number>:验证模型时使用的绝对差异容差。默认值为 1e-4。
  • --quantize <value>:是否对模型权重进行量化。可能的量化选项有:float32 表示不进行量化(默认),或 float16 表示 16 位浮点数。
  • --compute_units <value>:是否针对 CPU、GPU 和/或神经引擎优化模型。可能的值有:all(默认)、cpu_and_gpucpu_onlycpu_and_ne

使用导出的模型

在应用程序中使用导出的模型就像使用任何其他 Core ML 模型一样。将模型添加到 Xcode 后,它会自动生成一个 Swift 类,让您可以在应用程序内进行预测。

根据所选的导出选项,您可能仍然需要对输入和输出张量进行预处理或后处理。

对于图像输入,无需进行任何预处理,因为 Core ML 模型已经会对像素进行归一化处理。对于分类器模型,Core ML 模型会将预测结果输出为概率字典。而对于其他模型,您可能需要做更多的工作。

Core ML 没有分词器的概念,因此文本模型仍然需要手动对输入数据进行分词。这里有一个示例说明如何在 Swift 中进行分词。

覆盖配置对象中的默认设置

Core ML 的一个重要目标是让开发者能够轻松地在应用中使用模型。在可能的情况下,Core ML 导出器会向模型添加额外的操作,从而避免您自行进行预处理和后处理。

具体来说:

  • 图像模型会自动在模型内部执行像素归一化操作,因此您无需再对图像进行预处理,除非需要调整大小或裁剪。

  • 对于分类模型,会添加一个 softmax 层,并将标签包含在模型文件中。Core ML 会区分分类模型与其他类型的神经网络。对于每个输入样本仅输出单个分类预测的模型,Core ML 会使其直接输出获胜的类别标签以及概率字典,而不是原始的 logits 张量。在可行的情况下,导出器会使用这种特殊的分类模型类型。

  • 其他模型虽然也会输出 logits,但并不符合 Core ML 对分类模型的定义,例如 token-classification 任务会为序列中的每个标记输出一个预测。在这种情况下,导出器同样会添加一个 softmax 层,将 logits 转换为概率。标签名称会被添加到模型的元数据中。Core ML 会忽略这些标签名称,但您可以通过编写几行 Swift 代码来获取它们。

  • semantic-segmentation 模型会将输出图像上采样回原始的空间尺寸,并应用 argmax 操作以获得预测的类别标签索引。它不会自动应用 softmax。

Core ML 导出器之所以做出这些选择,是因为这些设置通常是您最常需要的。如果您想覆盖上述任何默认设置,就必须创建配置对象的子类,然后通过编写一段简短的 Python 程序将模型导出为 Core ML 格式。

示例:为了防止 MobileViT 语义分割模型对输出图像进行上采样,您可以创建 MobileViTCoreMLConfig 的子类,并重写 outputs 属性,将 do_upsample 设置为 False。此外,您还可以为该输出设置其他选项,如 do_argmaxdo_softmax

from collections import OrderedDict
from exporters.coreml.models import MobileViTCoreMLConfig
from exporters.coreml.config import OutputDescription

class MyCoreMLConfig(MobileViTCoreMLConfig):
    @property
    def outputs(self) -> OrderedDict[str, OutputDescription]:
        return OrderedDict(
            [
                (
                    "logits",
                    OutputDescription(
                        "classLabels",
                        "每个像素的分类得分",
                        do_softmax=True,
                        do_upsample=False,
                        do_argmax=False,
                    )
                ),
            ]
        )

config = MyCoreMLConfig(model.config, "semantic-segmentation")

在这里,您还可以将输出名称从 classLabels 更改为其他名称,或者修改输出描述(“每个像素的分类得分”)。

同样,您也可以更改模型输入的属性。例如,对于文本模型,默认的序列长度介于 1 到 128 个标记之间。如果要将 DistilBERT 模型的输入序列长度固定为 32 个标记,可以按如下方式重写配置对象:

from collections import OrderedDict
from exporters.coreml.models import DistilBertCoreMLConfig
from exporters.coreml.config import InputDescription

class MyCoreMLConfig(DistilBertCoreMLConfig):
    @property
    def inputs(self) -> OrderedDict[str, InputDescription]:
        input_descs = super().inputs
        input_descs["input_ids"].sequence_length = 32
        return input_descs

config = MyCoreMLConfig(model.config, "text-classification")

使用固定的序列长度通常会生成更简单、也可能更快的 Core ML 模型。然而,对于许多模型而言,输入需要具备灵活的长度。在这种情况下,您可以为 sequence_length 指定一个元组来设置最小和最大长度。使用 (1, -1) 表示序列长度没有上限。(注意:如果将 sequence_length 设置为固定值,则批处理大小将被固定为 1。)

要了解您感兴趣的模型有哪些可用的输入和输出选项,只需创建其 CoreMLConfig 对象,并检查 config.inputsconfig.outputs 属性即可。

并非所有输入或输出都是必需的:例如,在文本模型中,您可以移除 attention_mask 输入。如果没有这个输入,注意力掩码将始终假定为全 1(即无填充)。然而,如果任务需要 token_type_ids 输入,则必须同时提供 attention_mask 输入。

移除输入和/或输出的操作可以通过创建 CoreMLConfig 的子类并重写 inputsoutputs 属性来实现。

默认情况下,模型会以 ML Program 格式生成。通过将 use_legacy_format 属性重写为返回 True,即可使用较旧的 NeuralNetwork 格式。不过,这种方法并不推荐,仅作为无法转换为 ML Program 格式的模型的临时解决方案。

一旦您获得了修改后的 config 实例,就可以按照下文“导出模型”部分的说明将其用于模型导出。

需要注意的是,配置对象并不能涵盖所有内容。转换后模型的行为还受到模型的分词器或特征提取器的影响。例如,若要使用不同的输入图像尺寸,您需要使用具有不同缩放或裁剪设置的特征提取器来进行转换,而不是使用默认的特征提取器。

导出不支持架构的模型

如果您希望导出一个其架构未被该库原生支持的模型,主要需遵循以下三个步骤:

  1. 实现自定义的 Core ML 配置。
  2. 将模型导出为 Core ML 格式。
  3. 验证 PyTorch 模型与导出模型的输出是否一致。

在本节中,我们将以 DistilBERT 的实现为例,展示每个步骤的具体操作。

实现自定义 Core ML 配置

TODO:尚未编写此部分,因为实现尚未完成。

首先从配置对象开始。我们提供了一个抽象类 CoreMLConfig,您应从中继承。

from exporters.coreml import CoreMLConfig

TODO:此处需要涵盖的内容:

  • modality 属性
  • 如何实现自定义算子,并附上关于此主题的 coremltools 文档链接
  • 解码器模型(use_past)和编码器-解码器模型(seq2seq

导出模型

一旦您实现了 Core ML 配置,下一步就是导出模型。我们可以使用 exporters.coreml 包提供的 export() 函数。该函数需要 Core ML 配置、基础模型以及文本模型的分词器或视觉模型的特征提取器作为输入:

from transformers import AutoConfig, AutoModelForSequenceClassification, AutoTokenizer
from exporters.coreml import export
from exporters.coreml.models import DistilBertCoreMLConfig

model_ckpt = "distilbert-base-uncased"
base_model = AutoModelForSequenceClassification.from_pretrained(model_ckpt, torchscript=True)
preprocessor = AutoTokenizer.from_pretrained(model_ckpt)

coreml_config = DistilBertCoreMLConfig(base_model.config, task="text-classification")
mlmodel = export(preprocessor, base_model, coreml_config)

注意:为了获得最佳效果,在加载模型时请将 torchscript=True 参数传递给 from_pretrained 方法。这会使模型为 PyTorch 跟踪做好准备,而这是 Core ML 转换所必需的。

export() 函数还可接受以下附加选项:

  • quantize:使用 "float32" 表示不进行量化(默认值),使用 "float16" 则将权重量化为 16 位浮点数。
  • compute_units:指定是否针对 CPU、GPU 和/或神经网络引擎优化模型。默认值为 coremltools.ComputeUnit.ALL

若要导出带有预计算隐藏状态(注意力块中的键和值)的模型,以实现快速的自回归解码,可在创建 CoreMLConfig 对象时传入 use_past=True 参数。

Core ML 导出工具通常会打印大量警告和信息消息,例如:

TracerWarning: 将张量转换为 Python 布尔值可能会导致跟踪结果不正确。我们无法记录 Python 值的数据流,因此在未来该值将被视为常量。这意味着跟踪可能无法推广到其他输入!

这些消息是正常的,属于转换过程的一部分。如果确实存在问题,转换器会抛出错误。

如果导出成功,export() 函数的返回值将是一个 coremltools.models.MLModel 对象。您可以运行 print(mlmodel) 来查看 Core ML 模型的输入、输出及元数据。

您还可以选择填写模型的元数据:

mlmodel.short_description = "您的优秀模型"
mlmodel.author = "您的姓名"
mlmodel.license = "在此填写版权信息"
mlmodel.version = "1.0"

最后,保存模型。您可以在 Xcode 中打开生成的 .mlpackage 文件并进行检查。

mlmodel.save("DistilBert.mlpackage")

注意:如果使用的配置对象的 use_legacy_format 方法返回 True,则可以将模型保存为 ModelName.mlmodel,而非 .mlpackage

导出解码器模型

基于解码器的模型可以使用包含预计算隐藏状态(自注意力块中的键和值)的 past_key_values 输入,从而实现更快的序列解码。此功能可通过在 Transformer 模型中设置 use_cache=True 来启用。

要在 Core ML 导出过程中启用此功能,请在创建 CoreMLConfig 对象时设置 use_past=True 参数:

coreml_config = CTRLCoreMLConfig(base_model.config,task="text-generation",use_past=True)

# 或者:
coreml_config = CTRLCoreMLConfig.with_past(base_model.config, task="text-generation")

这会为模型添加多个新的输入和输出,名称如 past_key_values_0_keypast_key_values_0_value 等(输入)以及 present_key_values_0_keypresent_key_values_0_value 等(输出)。

启用此选项会使模型使用起来不太方便,因为你需要跟踪许多额外的张量,但确实能显著加快序列推理速度。

必须以 is_decoder=True 加载 Transformers 模型,例如:

base_model = BigBirdForCausalLM.from_pretrained("google/bigbird-roberta-base", torchscript=True, is_decoder=True)

TODO:在 Core ML 中如何使用此功能的示例。past_key_values 张量会随着时间推移不断增大。attention_mask 张量的大小必须等于 past_key_values 的大小加上新的 input_ids

导出编码器-解码器模型

TODO:正确撰写本节内容

你需要将模型导出为两个独立的 Core ML 模型:编码器和解码器。

按如下方式导出模型:

coreml_config = TODOCoreMLConfig(base_model.config, task="text2text-generation", seq2seq="encoder")
encoder_mlmodel = export(preprocessor, base_model.get_encoder(), coreml_config)

coreml_config = TODOCoreMLConfig(base_model.config, task="text2text-generation", seq2seq="decoder")
decoder_mlmodel = export(preprocessor, base_model, coreml_config)

当使用 seq2seq 选项时,Core ML 模型中的序列长度始终是无界的。配置对象中指定的 sequence_length 将被忽略。

这也可以与 use_past=True 结合使用。TODO:说明如何使用。

验证模型输出

最后一步是验证基础模型和导出模型的输出在一定绝对误差范围内是否一致。你可以使用 exporters.coreml 包提供的 validate_model_outputs() 函数,具体操作如下。

首先启用日志记录:

from exporters.utils import logging
logger = logging.get_logger("exporters.coreml")
logger.setLevel(logging.INFO)

然后验证模型:

from exporters.coreml import validate_model_outputs

validate_model_outputs(
    coreml_config, preprocessor, base_model, mlmodel, coreml_config.atol_for_validation
)

注意:validate_model_outputs 只能在 Mac 计算机上运行,因为它依赖 Core ML 框架来对模型进行预测。

该函数使用 CoreMLConfig.generate_dummy_inputs() 方法为基础模型和导出模型生成输入,并且可以在配置中定义绝对误差容差。我们通常发现数值一致性在 1e-6 到 1e-4 范围内,不过只要小于 1e-3 一般都可以接受。

如果验证失败并出现类似以下错误,则并不一定意味着模型有问题:

ValueError: 参考模型和 Core ML 导出模型的输出值不匹配:最大绝对差异为:0.12345

比较是基于绝对差异值进行的,在这个例子中为 0.12345,远大于默认容差值 1e-4,因此报告了错误。然而,激活值的量级也很重要。对于激活值在 1e+3 左右的模型,最大绝对差异 0.12345 通常是可接受的。

如果验证因该错误而失败,且你不确定是否真的是问题,可以对一个随机输入张量调用 mlmodel.predict(),并查看输出张量中最大的绝对值。

向 🤗 Transformers 贡献新配置

我们正致力于扩展现成配置集,并欢迎社区贡献!如果你想为库贡献自己的新增内容,你需要:

  • models.py 文件中实现 Core ML 配置
  • 将模型架构及相应特性纳入 [~coreml.features.FeatureManager]
  • 将你的模型架构添加到 test_coreml.py 中的测试用例中

故障排除:如果 Core ML Exporters 无法用于你的模型怎么办?

你希望导出的模型可能无法通过 Core ML Exporters 转换,甚至直接使用 coremltools 也无法成功。在运行这些自动化转换工具时,转换过程很可能因难以理解的错误信息而中断。或者,转换看似成功,但导出的模型却无法正常工作或产生错误的输出。

导致转换错误的常见原因包括:

  • 你为转换器提供了错误的参数。task 参数应与所选模型架构匹配。例如,“feature-extraction”任务仅适用于 AutoModel 类型的模型,而不应用于 AutoModelForXYZ。此外,seq2seq 参数用于区分编码器-解码器模型与仅编码器或仅解码器模型。如果传递了无效的参数值,可能会在转换过程中引发错误,也可能生成一个虽然能运行但执行错误操作的模型。

  • 模型执行了 Core ML 或 coremltools 不支持的操作。也可能是 coremltools 存在 bug,或者无法处理特别复杂的模型。

如果 Core ML 导出因后者失败,你有几种选择:

  1. CoreMLConfigpatch_pytorch_ops() 函数中实现缺失的算子。

  2. 修改原始模型。这需要对模型的工作原理有深入的理解,操作并不简单。不过有时只需将某些值硬编码,而不是让 PyTorch 或 TensorFlow 根据张量形状自动计算它们。

  3. 修复 coremltools。有时可以通过修改 coremltools 来忽略该问题。

  4. 放弃自动化转换,转而使用 MIL 从头构建模型(MIL 文档)。MIL 是 coremltools 内部用来表示模型的中间语言,它在很多方面类似于 PyTorch。

  5. 提交一个问题,我们会尽力解决。😀

已知问题

Core ML 导出器会以 mlpackage 格式导出模型。遗憾的是,对于某些模型,生成的 ML 程序并不正确。在这种情况下,建议通过将配置对象的 use_legacy_format 属性设置为 True,将模型转换为较旧的 NeuralNetwork 格式。在某些硬件上,旧格式的运行效率也可能更高。如果您不确定该使用哪种格式,可以分别以两种格式导出模型,并对比两个版本。

已知需要使用 use_legacy_format=True 导出的模型包括:GPT2、DistilGPT2。

当使用 GPT2 或 GPT-Neo 时,如果启用灵活的输入序列长度功能,转换过程会变得极其缓慢,并且会分配超过 200 GB 的内存。这显然是 coremltools 或 Core ML 框架中的一个 bug,因为所分配的内存实际上并不会被使用(计算机不会开始进行交换)。尽管经过数分钟后转换最终会成功,但生成的模型可能并非 100% 正确。随后加载该模型同样需要很长时间,并会再次进行类似的内存分配;进行预测时也是如此。从理论上讲,只要您有足够的耐心,转换确实能够成功,但这样的模型实际上并不可用。

将模型推送到 Hugging Face Hub

Hugging Face Hub 也可以托管您的 Core ML 模型。您可以使用 huggingface_hub从 Python 中将转换后的模型上传到 Hub。

首先,使用以下命令登录您的 Hugging Face 账户:

huggingface-cli login

登录完成后,按照如下方式将 mlpackage 保存到 Hub:

from huggingface_hub import Repository

with Repository(
        "<model name>", clone_from="https://huggingface.co/<user>/<model name>",
        use_auth_token=True).commit(commit_message="add Core ML model"):
    mlmodel.save("<model name>.mlpackage")

请确保将 <model name> 替换为您的模型名称,将 <user> 替换为您的 Hugging Face 用户名。

常见问题

相似工具推荐

openclaw

OpenClaw 是一款专为个人打造的本地化 AI 助手,旨在让你在自己的设备上拥有完全可控的智能伙伴。它打破了传统 AI 助手局限于特定网页或应用的束缚,能够直接接入你日常使用的各类通讯渠道,包括微信、WhatsApp、Telegram、Discord、iMessage 等数十种平台。无论你在哪个聊天软件中发送消息,OpenClaw 都能即时响应,甚至支持在 macOS、iOS 和 Android 设备上进行语音交互,并提供实时的画布渲染功能供你操控。 这款工具主要解决了用户对数据隐私、响应速度以及“始终在线”体验的需求。通过将 AI 部署在本地,用户无需依赖云端服务即可享受快速、私密的智能辅助,真正实现了“你的数据,你做主”。其独特的技术亮点在于强大的网关架构,将控制平面与核心助手分离,确保跨平台通信的流畅性与扩展性。 OpenClaw 非常适合希望构建个性化工作流的技术爱好者、开发者,以及注重隐私保护且不愿被单一生态绑定的普通用户。只要具备基础的终端操作能力(支持 macOS、Linux 及 Windows WSL2),即可通过简单的命令行引导完成部署。如果你渴望拥有一个懂你

349.3k|★★★☆☆|昨天
Agent开发框架图像

stable-diffusion-webui

stable-diffusion-webui 是一个基于 Gradio 构建的网页版操作界面,旨在让用户能够轻松地在本地运行和使用强大的 Stable Diffusion 图像生成模型。它解决了原始模型依赖命令行、操作门槛高且功能分散的痛点,将复杂的 AI 绘图流程整合进一个直观易用的图形化平台。 无论是希望快速上手的普通创作者、需要精细控制画面细节的设计师,还是想要深入探索模型潜力的开发者与研究人员,都能从中获益。其核心亮点在于极高的功能丰富度:不仅支持文生图、图生图、局部重绘(Inpainting)和外绘(Outpainting)等基础模式,还独创了注意力机制调整、提示词矩阵、负向提示词以及“高清修复”等高级功能。此外,它内置了 GFPGAN 和 CodeFormer 等人脸修复工具,支持多种神经网络放大算法,并允许用户通过插件系统无限扩展能力。即使是显存有限的设备,stable-diffusion-webui 也提供了相应的优化选项,让高质量的 AI 艺术创作变得触手可及。

162.1k|★★★☆☆|2天前
开发框架图像Agent

everything-claude-code

everything-claude-code 是一套专为 AI 编程助手(如 Claude Code、Codex、Cursor 等)打造的高性能优化系统。它不仅仅是一组配置文件,而是一个经过长期实战打磨的完整框架,旨在解决 AI 代理在实际开发中面临的效率低下、记忆丢失、安全隐患及缺乏持续学习能力等核心痛点。 通过引入技能模块化、直觉增强、记忆持久化机制以及内置的安全扫描功能,everything-claude-code 能显著提升 AI 在复杂任务中的表现,帮助开发者构建更稳定、更智能的生产级 AI 代理。其独特的“研究优先”开发理念和针对 Token 消耗的优化策略,使得模型响应更快、成本更低,同时有效防御潜在的攻击向量。 这套工具特别适合软件开发者、AI 研究人员以及希望深度定制 AI 工作流的技术团队使用。无论您是在构建大型代码库,还是需要 AI 协助进行安全审计与自动化测试,everything-claude-code 都能提供强大的底层支持。作为一个曾荣获 Anthropic 黑客大奖的开源项目,它融合了多语言支持与丰富的实战钩子(hooks),让 AI 真正成长为懂上

143.9k|★★☆☆☆|今天
开发框架Agent语言模型

ComfyUI

ComfyUI 是一款功能强大且高度模块化的视觉 AI 引擎,专为设计和执行复杂的 Stable Diffusion 图像生成流程而打造。它摒弃了传统的代码编写模式,采用直观的节点式流程图界面,让用户通过连接不同的功能模块即可构建个性化的生成管线。 这一设计巧妙解决了高级 AI 绘图工作流配置复杂、灵活性不足的痛点。用户无需具备编程背景,也能自由组合模型、调整参数并实时预览效果,轻松实现从基础文生图到多步骤高清修复等各类复杂任务。ComfyUI 拥有极佳的兼容性,不仅支持 Windows、macOS 和 Linux 全平台,还广泛适配 NVIDIA、AMD、Intel 及苹果 Silicon 等多种硬件架构,并率先支持 SDXL、Flux、SD3 等前沿模型。 无论是希望深入探索算法潜力的研究人员和开发者,还是追求极致创作自由度的设计师与资深 AI 绘画爱好者,ComfyUI 都能提供强大的支持。其独特的模块化架构允许社区不断扩展新功能,使其成为当前最灵活、生态最丰富的开源扩散模型工具之一,帮助用户将创意高效转化为现实。

107.9k|★★☆☆☆|昨天
开发框架图像Agent

markitdown

MarkItDown 是一款由微软 AutoGen 团队打造的轻量级 Python 工具,专为将各类文件高效转换为 Markdown 格式而设计。它支持 PDF、Word、Excel、PPT、图片(含 OCR)、音频(含语音转录)、HTML 乃至 YouTube 链接等多种格式的解析,能够精准提取文档中的标题、列表、表格和链接等关键结构信息。 在人工智能应用日益普及的今天,大语言模型(LLM)虽擅长处理文本,却难以直接读取复杂的二进制办公文档。MarkItDown 恰好解决了这一痛点,它将非结构化或半结构化的文件转化为模型“原生理解”且 Token 效率极高的 Markdown 格式,成为连接本地文件与 AI 分析 pipeline 的理想桥梁。此外,它还提供了 MCP(模型上下文协议)服务器,可无缝集成到 Claude Desktop 等 LLM 应用中。 这款工具特别适合开发者、数据科学家及 AI 研究人员使用,尤其是那些需要构建文档检索增强生成(RAG)系统、进行批量文本分析或希望让 AI 助手直接“阅读”本地文件的用户。虽然生成的内容也具备一定可读性,但其核心优势在于为机器

93.4k|★★☆☆☆|昨天
插件开发框架

LLMs-from-scratch

LLMs-from-scratch 是一个基于 PyTorch 的开源教育项目,旨在引导用户从零开始一步步构建一个类似 ChatGPT 的大型语言模型(LLM)。它不仅是同名技术著作的官方代码库,更提供了一套完整的实践方案,涵盖模型开发、预训练及微调的全过程。 该项目主要解决了大模型领域“黑盒化”的学习痛点。许多开发者虽能调用现成模型,却难以深入理解其内部架构与训练机制。通过亲手编写每一行核心代码,用户能够透彻掌握 Transformer 架构、注意力机制等关键原理,从而真正理解大模型是如何“思考”的。此外,项目还包含了加载大型预训练权重进行微调的代码,帮助用户将理论知识延伸至实际应用。 LLMs-from-scratch 特别适合希望深入底层原理的 AI 开发者、研究人员以及计算机专业的学生。对于不满足于仅使用 API,而是渴望探究模型构建细节的技术人员而言,这是极佳的学习资源。其独特的技术亮点在于“循序渐进”的教学设计:将复杂的系统工程拆解为清晰的步骤,配合详细的图表与示例,让构建一个虽小但功能完备的大模型变得触手可及。无论你是想夯实理论基础,还是为未来研发更大规模的模型做准备

90.1k|★★★☆☆|昨天
语言模型图像Agent