Swift Transformers 发布:在 Apple 设备上运行 On-Device LLMs
今日发布
Hugging Face 发布了 swift-transformers、swift-chat、已更新的 exporters、已更新的 transformers-to-coreml Space,以及 Llama 2 7B 和 Falcon 7B 的 Core ML 版本,以在 Apple 设备上启用设备端 LLMs。
swift-transformers 包是一个正在进行中的 Swift 库,旨在为文本生成提供类似 transformers 的 API。swift‑chat 应用演示了如何使用它。exporters Python 包和 transformers-to-coreml Space 已更新,以将 Llama 2 和 Falcon 等模型转换为 Core ML。可直接使用的 Core ML 模型(包括 Llama‑2-7b-chat-coreml 和 Falcon-7b-instruct)已在 Hub 上提供。
任务概览
在 Apple 设备上运行 LLM 包括将模型转换为 Core ML、针对速度和内存进行优化,以及提供 Swift‑友好的 API 用于分词、模型加载和文本生成。 转换是第一步,但优化和易用的 Swift 接口同样重要。本文将逐一介绍这些领域,指出哪些工具已经存在,哪些工作仍需完成。
转换为 Core ML
将 Llama 2 等模型转换为 Core ML 可以使用 transformers-to-coreml Space、exporters Python 包,或直接使用 coremltools 完成;在修复了 Llama 2 代码中的类型不匹配问题后,该过程成功。 推荐的做法是先尝试无代码的 transformers-to-coreml Space;如果失败,则使用 exporters 以获得更多控制;最后回退到 coremltools 以获得最大灵活性。对于 Llama 2,在解决之前的失败后,所有三种方法都能成功转换。
重要经验教训
如果必须使用 coremltools,请使用最新版本:7.0b1。尽管是 beta 版本,但它很稳定,包含修复,支持 PyTorch 2,并提供高级量化工具。 exporters 在转换文本生成任务时不再对输出应用 softmax,因为这之前对于某些生成算法是必要的。 exporters 现在默认对文本模型使用固定序列长度。灵活形状仅在 CPU 上运行,而不在 GPU 或 Neural Engine 上运行,因此 GPU/Neural Engine 执行需要固定形状。
优化
Core ML LLM 的关键优化策略包括缓存键值对、使用离散固定形状代替灵活输入,以及应用诸如 6‑bit 调色板量化或混合位量化之类的量化技术。 如果不使用缓存,模型会在每一步重新计算完整历史的注意力分数。使用离散形状可以避免灵活输入仅限于 CPU 的限制,并且结合缓存后可以实现更大的上下文大小。量化可以减小模型大小和资源使用;6‑bit 调色板量化和混合位量化被突出显示为有前景的方法。
swift-transformers
swift-transformers 包提供了 Swift‑原生的 tokenizers 模块、Hub‑感知的模型包装器以及基本的生成算法(贪婪和 top‑k 采样),适用于不断增长的模型集合。
分词器
Tokenization 将文本转换为模型就绪的 ID 并反之亦然;swift-transformers 目前支持 GPT、Falcon 和 Llama 模型使用的 BPE 分词器,其代码与 Hugging Face tokenizers 库镜像。 示例用法:
import Tokenizers
func testTokenizer() async throws {
let tokenizer = try await AutoTokenizer.from(pretrained: "pcuenq/Llama-2-7b-chat-coreml
let inputIds = tokenizer("Today she took a train to the West
assert(inputIds == [1, 20628, 1183, 3614, 263, 7945, 304, 278, 3122])
}
模型和 Hub 包装器
简单的 LanguageModel 协议包装一个用于文本生成的 Core ML 模型。Hub 模块使用在转换过程中添加到 Core ML 模型的自定义元数据字段从 Hub 下载分词器和配置文件(由 exporters 和 Space 自动添加)。
生成算法
实现了两种解码策略:贪婪解码(始终选择概率最高的 token)和 top‑k 采样(从最可能的 k 个 token 中随机采样,温度控制变异性)。此外,还计划实现 nucleus sampling 等方法。
支持的模型
到目前为止,该包已在 Llama 2、Falcon、StarCoder(GPT 的变体)以及 GPT 家族(包括 GPT2、distilgpt、GPT‑NeoX 和 GPT‑J)上进行了测试。
swift-chat
swift-chat 演示应用展示了如何在 Swift 项目中集成 swift-transformers,从 Hub 加载 Core ML 模型并运行带有自动元数据下载的文本生成。 选择模型后,应用将下载所需的配置文件,通过 Core ML 编译模型(缓存结果),并运行生成。UI 故意保持简单,尚未支持系统提示等功能。
缺失部分 / 未来工作
未来工作将添加编码器‑解码器模型支持、Unigram 和 WordPiece 分词器、额外的生成策略、键值缓存以及用于更大上下文的离散形状转换。 团队欢迎通过问题、拉取请求或对仓库的反馈进行贡献。
结论
这些工具为 Swift 开发者提供了在 Apple 应用中引入设备端 LLMs 的起点,团队邀请社区贡献以改进它们。