掘金 人工智能 前天 09:58
AI模型格式全解析:掌握常见的AI模型格式,开启智能之旅
index_new5.html
../../../zaker_core/zaker_tpl_static/wap/tpl_guoji1.html

 

本文深入探讨了当前常见的AI模型格式,包括GGUF、PyTorch、Safetensors和ONNX,分析了它们的优缺点及适用场景。从快速加载的GGUF到安全高效的Safetensors,再到跨平台通用的ONNX,文章为开发者提供了选择模型格式的实用指南,助力AI模型在不同环境下的部署和应用。

🧠 GGUF 格式是为快速加载和保存模型设计的,尤其适用于语言模型。 它通过与mmap()的兼容性实现快速加载,并提供灵活的量化方案,但主要用于模型服务和开源社区内的模型共享。

💾 PyTorch 格式是 PyTorch 的默认序列化格式,保存模型的状态字典,包含学习参数和元数据。 尽管它在 Python 和 PyTorch 环境中适用,但存在安全性和效率方面的局限性,例如安全性风险以及不支持延迟加载或部分数据加载。

🛡️ Safetensors 格式解决了 PyTorch 格式的安全问题,采用受限的反序列化过程以防止代码执行漏洞。 此外,Safetensors 支持延迟加载和部分数据加载,并支持量化张量,广泛用于模型的共享、训练、微调和部署,是 Hugging Face 库的默认格式。

🌐 ONNX 格式提供了一种与供应商无关的模型表示方法,包含模型的计算图,使得模型在不同框架之间转换时更加灵活。 ONNX 格式可以轻松部署在各种平台和设备上,尤其适用于移动设备和边缘设备,但对量化张量的支持有限。

过去两年,开源 AI 社区一直在热烈讨论新 AI 模型的开发。每天都有越来越多的模型在 Hugging Face 上发布,并被用于实际应用中。然而,开发者在使用这些模型时面临的一个挑战是 模型格式的多样性

在本文中,我们将探讨当下常见的 AI 模型格式,包括:

我们将分析每种格式的 优缺点,并提供 使用建议,帮助你选择最适合的格式。

GGUF

GGUF 最初是为 llama.cpp 项目开发的。GGUF 是一种二进制格式,旨在实现快速的模型加载和保存,并易于阅读。模型通常使用 PyTorch 或其他框架开发,然后转换为 GGUF 格式以与 GGML 一起使用。

llama.cpphttps://github.com/ggml-org/llama.cpp

随着时间的推移,GGUF 已成为开源社区中共享 AI 模型最流行的格式之一。它得到了许多知名推理运行时的支持,包括 llama.cpp 、 ollama 和 vLLM 。

目前,GGUF 主要用于语言模型。虽然也可以将其用于其他类型的模型,例如通过 stable-diffusion.cpp 实现的扩散模型,但这并不像在语言模型中的应用那样普遍。

stable-diffusion.cpphttps://github.com/leejet/stable-diffusion.cpp

GGUF 文件包含以下部分:

Diagram by @mishig25 (GGUF v3)github.com/mishig25

GGUF 格式和 GGML 库还提供了灵活的 量化方案,能够在保持良好精度的同时实现高效的模型存储。一些最常见的量化方案包括:

 

GGUF 格式的 Llama-3.1 8B 模型示例,链接 hf.co/bartowski/M…

让我们回顾一下 GGUF 的优缺点:

优点:

缺点:

GGUF 主要用于生产环境中的 模型服务,其中快速加载时间至关重要。它也用于开源社区内的 模型共享,因为其格式简单,便于分发。

有用资源:

PyTorch (.pt/.pth)

.pt/.pth 扩展名代表 PyTorch 的默认序列化格式,存储包含学习参数 (权重、偏置) 、优化器状态和训练元数据的模型状态字典。

PyTorch 模型可以保存为两种格式:

PyTorch 格式基于 Python 的 pickle 模块,该模块用于序列化 Python 对象。为了理解 pickle 的工作原理,让我们看以下示例:docs.python.org/3/library/p…

import picklemodel_state_dict = { "layer1""hello""layer2""world" }pickle.dump(model_state_dict, open("model.pkl""wb"))

The pickle.dump() 函数将 model_state_dict 字典序列化并保存到名为 model.pkl 的文件中。输出文件现在包含字典的二进制表示:

model.pkl hex view

要将序列化的字典加载回 Python,我们可以使用 pickle.load() 函数:

import picklemodel_state_dict = pickle.load(open("model.pkl""rb"))print(model_state_dict)# Output: {'layer1''hello''layer2''world'}

如你所见,pickle 模块提供了一种简单的方法来序列化 Python 对象。然而,它也有一些局限性:

如果你仅在 Python 和 PyTorch 环境中工作,PyTorch 格式可能是一个合适的选择。然而,近年来,AI 社区一直在转向更高效和安全的序列化格式,例如 GGUF 和 Safetensors。

有用资源:

Safetensors

由 Hugging Face 开发的 safetensors 解决了传统 Python 序列化方法 (如 PyTorch 使用的 pickle) 中存在的安全性和效率问题。该格式使用受限的反序列化过程来防止代码执行漏洞。hf.co/docs/safete…

一个 safetensors 文件包含:

 

Safetensors 格式结构图

优点:

缺点:

注意:虽然在理论上元数据可以保存在文件中,但在实践中,模型元数据通常存储在一个单独的 JSON 文件中。这既可能是优点也可能是缺点,具体取决于使用场景。

safetensors 格式是 Hugging Face 的 transformers 库使用的默认序列化格式。它在开源社区中广泛用于共享、训练、微调和部署 AI 模型。Hugging Face 上发布的新模型都以 safetensors 格式存储,包括 Llama、Gemma、Phi、Stable-Diffusion、Flux 等许多模型。hf.co/docs/transf…

有用资源:

ONNX

开放神经网络交换 (Open Neural Network Exchange,ONNX) 格式提供了一种与供应商无关的机器学习模型表示方法。它是 ONNX 生态系统 的一部分,该生态系统包括用于不同框架 (如 PyTorch、TensorFlow 和 MXNet) 之间互操作的工具和库。onnx.ai/

ONNX 模型以 .onnx 扩展名的单个文件保存。与 GGUF 或 Safetensors 不同,ONNX 不仅包含模型的张量和元数据,还包含模型的 计算图 。

在模型文件中包含计算图使得在处理模型时具有更大的灵活性。例如,当发布新模型时,你可以轻松地将其转换为 ONNX 格式,而无需担心模型的架构或推理代码,因为计算图已经保存在文件中。

ONNX 格式的计算图示例,由 Netron 生成netron.app/

优点:

缺点:

总体而言,如果你正在处理移动设备或浏览器内推理,ONNX 是一个不错的选择。

有用资源:

硬件支持

在选择模型格式时,重要的是要考虑模型将部署在哪种硬件上。下表显示了每种格式的硬件支持建议:

硬件GGUFPyTorchSafetensorsONNX
CPU✅ (最佳)🟡🟡
GPU
移动设备部署🟡 (通过 executorch)
Apple 芯片🟡✅ (通过 MLX 框架)

说明:

结论

在本文中,我们探讨了当今使用的一些常见 AI 模型格式,包括 GGUF、PyTorch、Safetensors 和 ONNX。每种格式都有其自身的优缺点,因此根据具体的用例和硬件需求选择合适的格式至关重要。

脚注

mmap: 内存映射文件是一种操作系统功能,允许将文件映射到内存中。这对于在不将整个文件加载到内存中的情况下读写大文件非常有益。

延迟加载 (lazy-loading): 延迟加载是一种技术,它将数据的加载推迟到实际需要时。这有助于在处理大型模型时减少内存使用并提高性能。

计算图 (computation graph): 在机器学习的上下文中,计算图是一种流程图,展示了数据如何通过模型流动以及每一步如何执行不同的计算 (例如加法、乘法或激活函数的应用)。

Fish AI Reader

Fish AI Reader

AI辅助创作,多种专业模板,深度分析,高质量内容生成。从观点提取到深度思考,FishAI为您提供全方位的创作支持。新版本引入自定义参数,让您的创作更加个性化和精准。

FishAI

FishAI

鱼阅,AI 时代的下一个智能信息助手,助你摆脱信息焦虑

联系邮箱 441953276@qq.com

相关标签

GGUF PyTorch Safetensors ONNX AI模型格式
相关文章