如果你有自己的 PyTorch 模型且该模型是大型语言模型(LLM),本文档将展示如何手动将其导出并适配到 ExecuTorch,其中包含许多与之前的 指南中相同的优化。
本文档提供一个实际示例以利用 ExecuTorch 导入自定义 LLM。主要目标是提供:关于如何将 ExecuTorch 与自定义 LLM 集成的指南。
方法适用于其他语言模型 ,因为 ExecuTorch 具有模型无关性。PyTorch – Exporting custom LLMs
首先,需要下载 ExecuTorch 仓库并安装依赖项。ExecuTorch 建议使用 Python 3.10 并使用 Conda 来管理环境。
可以参考另一篇文档:[ExecuTorch 系列] 1. 从源码构建 ExecuTorch
我这里安装的 python 版本是 3.12.12。
文档示例使用 Karpathy 的 nanoGPT,教程同样适用于其他大语言模型,因为 ExecuTorch 是模型不变的。
使用 ExecuTorch 运行模型有两个步骤:
- 导出模型:将模型预处理为适合 ExecuTorch Runtime 执行的 格式。
- 运行:加载模型文件并使用 ExecuTorch Runtime 运行。
导出到 ExecuTorch (基础版)
首先,需要下载 nanoGPT 模型和相应的分词器词汇表:
然后,创建一个名为 的文件,其中包含以下内容:
然后,通过执行该文件,在当前目录下得到导出后的模型:
gpt 教程
后端委派 (Backend Delegation)
ExecuTorch 为多个不同目标提供了专用后端,包括但不限于通过 XNNPACK 后端实现 x86 和 ARM CPU 加速,通过 Core ML 后端和 Metal Performance Shader(MPS)后端实现苹果加速,以及通过 Vulkan 后端实现 GPU 加速。
为了在导出期间将模型委托给特定的后端,ExecuTorch 使用了函数。该函数接收来自的导出程序以及一个特定于后端的分区器对象。分区器会识别计算图中可由目标后端优化的部分。在内部,导出的程序会被转换为边缘方言程序。之后,分区器会将兼容的图部分委托给后端以进行加速和优化。任何未被委托的图部分都由 ExecuTorch 的默认算子实现来执行。
也就是说,要将导出的模型委托给特定后端,我们需要先从 ExecuTorch 代码库导入其分区器和边缘编译配置,然后调用。
如下示例,说明如何将 nanoGPT 委派给 XNNPACK:
量化
具体请参考:Quantization
更多请参考:ExecuTorch 中的量化
Runtime 的调用
ExecuTorch 提供了一组 Runtime API 和类型来加载和运行模型。
创建一个名为 的文件,其中包含以下内容:
将以下文件下载到与 相同的目录中:
构建 ExecuTorch
要使用 ExecuTorch Runtime 运行 LLM,还需要构建 ExecuTorch Runtime,具体内容可以参考: [ExecuTorch 系列] 1. 从源码构建 ExecuTorch 。ExecuTorch 使用 CMake 构建系统。
构建示例代码
创建一个名为 的文件,其中包含以下内容:
完成上述准备工作后,完整目录应包含以下文件:
最后,我们只需要构建示例工程:
运行
成功构建后,在 目录下生成了可执行文件,我们把生成的模型和词汇表文件放入 目录。
运行测试代码:
在我的电脑上跑效果不太好,生成回复的速度非常慢,回答也不准确。
据文档中描述:此时,它可能会运行得非常缓慢。这是因为 ExecuTorch 没有被告知要针对特定的硬件后端 (delegation),并且它以 32 位浮点数 (无量化) 执行所有计算。
- nanoGPT: karpathy/nanoGPT
- ExecuTorch: pytorch/executorch
- 语雀 – 从源码构建 ExecuTorch
- PyTorch – Executorch 中的 LLM 简介
- PyTorch – 将 LLM 部署到 ExecuTorch
- PyTorch – Deploying LLMs to ExecuTorch
- PyTorch – Exporting custom LLMs
发布者:Ai探索者,转载请注明出处:https://javaforall.net/273973.html原文链接:https://javaforall.net
