Character.AI 正在致力于构建通用人工智能(AGI),旨在将大型语言模型(LLM)融入日常生活,以提升工作效率和娱乐体验,并在教育、辅导、支持、头脑风暴、创意写作等方面为人们提供帮助。为了实现这一目标,高效地进行“推断”(即LLM生成回复的过程)在全球范围内至关重要。作为一家全栈AI公司,Character.AI 从零开始设计模型架构、推断栈和产品,以优化推断的效率、成本效益和可扩展性。原文戳这里

  1. 高效的架构设计:Character.AI 通过以下技术,将注意力键值(KV)缓存大小减少了20倍以上,同时没有降低质量:

    • 使用多查询注意力(Multi-Query Attention)。
    • 采用混合注意力范围,将局部注意力(Local attention)与全局注意力层交织。
    • 在相邻的注意力层之间共享KV缓存。
  2. 状态缓存:Character.AI 开发了一种在对话回合之间在主机内存上缓存注意力KV的高效系统。通过这种系统,可以实现95%的缓存率,进一步降低推断成本。

  3. 量化训练和推断:公司使用int8量化技术对模型权重、激活和注意力KV缓存进行量化,并实现了定制的int8内核以支持矩阵乘法和注意力计算。与常见的“后训练量化”技术不同,Character.AI 直接以int8精度训练模型,消除了训练/推断不匹配的风险,同时显著提高了训练效率。

  4. 成本效益:自2022年底以来,Character.AI 将推断成本降低了33倍。与使用领先的商业API相比,使用Character.AI的系统至少可以节省13.5倍的支出。

  5. 未来展望:Character.AI 感到兴奋的是,继续构建一个将LLM作为全球创新驱动力和增强体验的未来。公司承诺将继续推动AI的可能极限,致力于创建一个高效、可扩展的AI系统成为每一次互动核心的未来。

Character.AI 的 AI 推理优化

在 Character.AI,我们正在朝着实现通用人工智能 (AGI) 的目标迈进。在这个未来中,大语言模型 (LLMs) 将会提升我们的日常生活,从提高业务生产力到提供娱乐服务,并在教育、指导、支持、头脑风暴、创意写作等各方面帮助人们。

为了在全球范围内实现这一目标,必须实现高度高效的“推理”——即 LLMs 生成回复的过程。作为一家全栈 AI 公司,Character.AI 从零开始设计了模型架构、推理栈和产品,这为优化推理效率、降低成本并扩大规模提供了独特的机会,以满足快速增长的全球用户需求。

目前,我们每秒处理超过 20,000 次推理查询。为了让大家了解这一规模,可以参考一下,据第三方估计,Google 搜索每秒处理大约 105,000 次查询 (Statista, 2024),我们处理的查询量大约是它的 20%。

我们能够在如此大规模下稳定提供 LLM 服务,是因为我们在服务栈中开发了许多关键创新。在这篇博客文章中,我们将分享过去两年中开发并最近采用的一些技术和优化方法。

内存高效的架构设计

LLM 推理的关键瓶颈在于注意力键值 (KV) 缓存的大小。KV 缓存的大小不仅决定了 GPU 上可以容纳的最大批次大小,还影响了注意力层的 I/O 成本。我们采用了以下技术,在不影响质量的前提下,将 KV 缓存大小减少了 20 倍以上。通过这些技术,GPU 内存不再是服务大批量请求的瓶颈。

1. 多查询注意力。我们在所有注意力层中采用了多查询注意力 (Shazeer, 2019)。相比大多数开源模型采用的分组查询注意力,这项技术将 KV 缓存大小减少了 8 倍。

2. 混合注意力范围。我们交替使用局部注意力 (Beltagy et al., 2020) 和全局注意力层。局部注意力通过滑动窗口进行训练,将复杂度从 O(长度2) 降低到 O(长度)。我们发现,将大多数注意力层的注意力范围缩小到 1024 对评估指标(包括长上下文 needle-in-haystack 基准测试)没有显著影响。在我们的生产模型中,每六层中只有一层使用全局注意力。

3. 跨层 KV 共享。我们在相邻的注意力层之间共享 KV 缓存,这进一步将 KV 缓存大小减少了 2-3 倍。对于全局注意力层,我们在多个全局层之间共享 KV 缓存,因为在长上下文使用情况下,全局注意力层占用了大部分 KV 缓存空间。类似于最近的一篇文章 (Brandon et al., 2024),我们发现跨层共享 KV 不会降低模型质量。

图 1. 左图:标准 Transformer 设计,其中每个注意力都是全局注意力。右图:我们生产模型中的注意力设计。蓝色方块表示全局注意力,绿色方块表示局部注意力,曲线表示 KV 共享。对于全局注意力层,我们在多个非相邻层之间共享 KV。这张图仅展示了完整模型中的一部分层。

有状态缓存

我们的关键创新之一是一个高效的系统,用于在聊天轮次之间将注意力 KV 缓存在主机内存中。在 Character.AI 上,大多数聊天都是长对话;平均每条消息有 180 条对话历史。随着对话变长,每次都重新填充 KV 缓存将会非常昂贵。

为了解决这个问题,我们开发了一个轮次间缓存系统。对于每个预填充的前缀和生成的消息,我们将 KV 值缓存到主机内存,并在后续查询中检索它们。类似于 RadixAttention (Zheng et al., 2023),我们将缓存的 KV 张量组织在一个具有树结构的 LRU 缓存中。缓存的 KV 值通过前缀 Token 的滚动哈希进行索引。对于每个新查询,我们会计算上下文的每个前缀的滚动哈希,并检索最长匹配的缓存。这使得即使是部分匹配的消息也可以重用缓存。

在服务器层面,我们使用粘性会话将同一对话的查询路由到同一台服务器。由于我们的 KV 缓存大小较小,每台服务器可以同时缓存数千个对话。我们的系统实现了 95% 的缓存命中率,进一步降低了推理成本。

图 2. 蓝色方块表示主机内存上的缓存张量。绿色和黄色方块表示 CUDA 内存上的 KV 缓存。当一个新查询到达时,它会检索最长匹配前缀的 KV 缓存。我们的滚动哈希系统允许检索部分匹配消息的缓存。

训练和服务的量化

我们在模型权重、激活和注意力 KV 缓存上使用 int8 量化。为了支持这一点,我们为矩阵乘法和注意力实现了定制的 int8 内核。不同于常用的“训练后量化”技术,我们在 int8 精度下原生训练模型,消除了训练与服务不匹配的风险,同时显著提高了训练效率。量化训练本身是一个复杂的话题,我们将在未来的文章中深入讨论。

共同构建未来

高效的推理对于扩展 AI 系统并将其无缝集成到我们的日常生活中至关重要。综合以上创新,我们实现了前所未有的效率,并将推理成本降到了一个使大规模提供 LLM 服务变得更加容易的水平。与 2022 年底相比,我们将服务成本降低了 33 倍。如果我们今天使用领先的商业 API 来处理我们的流量,成本将至少是我们系统的 13.5 倍。

然而,这只是一个开始。在 Character.AI,我们非常期待继续构建一个由 LLM 驱动创新并提升全球用户体验的未来。加入我们,在这段激动人心的旅程中,我们将继续突破 AI 的可能性。一起,我们正在创造一个高效且可扩展的 AI 系统成为每次互动核心的未来。