在 GCP 上使用第 5 代至强处理器对语言模型性能进行基准测试

发布于 2024 年 12 月 17 日
在 GitHub 上更新

TL;DR: 我们在两个基于 Google Cloud Compute Engine Xeon 的 CPU 实例(N2 和 C4)上,对两种代表性的代理 AI 工作负载组件(文本嵌入和文本生成)进行了基准测试。结果一致表明,在文本嵌入方面,C4 的吞吐量比 N2 高 10 到 24 倍;在文本生成方面,C4 的吞吐量比 N2 高 2.3 到 3.6 倍。考虑到价格,C4 的每小时价格约为 N2 的 1.3 倍,从这个意义上讲,在文本嵌入方面,C4 在总拥有成本 (TCO) 上比 N2 具有 7 到 19 倍的优势,在文本生成方面具有 1.7 到 2.9 倍的 TCO 优势。结果表明,可以将轻量级代理 AI 解决方案完全部署在 CPU 上。

引言

人们相信人工智能的下一个前沿是代理 AI。这种新范式使用 感知-推理-行动 管道,将 LLM 复杂的推理和迭代规划能力与强大的上下文理解增强功能相结合。上下文理解能力由向量数据库和传感器输入等工具提供,以创建更具上下文感知能力的 AI 系统,这些系统可以自主解决复杂的多步骤问题。此外,LLM 的函数调用能力使得 AI 代理能够直接采取行动,远远超出了聊天机器人提供的聊天功能。代理 AI 为提高各行业的生产力和运营带来了令人兴奋的前景。

人们正在将越来越多的工具引入代理 AI 系统,其中大多数工具现在都在 CPU 上运行,这带来了一个担忧,即在这种范式中,主机-加速器之间的流量开销将不可忽略。与此同时,模型构建者和供应商正在构建更小但功能强大的小型语言模型 (SLM),最新的例子是 Meta 的 1B 和 3B llama3.2 模型,它们具有先进的多语言文本生成和工具调用能力。此外,CPU 正在发展并开始提供更多的 AI 支持,英特尔在其第四代至强 CPU 中引入了新的 AI 张量加速器——英特尔高级矩阵扩展 (AMX)。将这三条线索结合起来,看看 CPU 承载整个代理 AI 系统(尤其是当它使用 SLM 时)的潜力将是很有趣的。

在这篇文章中,我们将对代理 AI 的两个代表性组件进行基准测试:文本嵌入和文本生成,并比较 CPU 在这两个组件上的代际性能提升。我们选择了 Google Cloud Compute Engine C4 实例和 N2 实例进行比较。其背后的逻辑是:C4 采用 第 5 代英特尔至强处理器(代号 Emerald Rapids),这是 Google Cloud 上可用的最新一代至强 CPU,它集成了英特尔 AMX 以提升 AI 性能;而 N2 采用 第 3 代英特尔至强处理器(代号 Ice Lake),这是 Google Cloud 上上一代至强 CPU,它只有 AVX-512 而没有 AMX。我们将展示 AMX 的优势。

我们将使用 Hugging Face 的统一基准测试库 optimum-benchmark 来测量性能,该库支持多后端和多设备。基准测试在 optimum-intel 后端运行。optimum-intel 是 Hugging Face 的加速库,用于加速英特尔架构(CPU、GPU)上的端到端管道。我们的基准测试用例如下:

  • 对于文本嵌入,我们使用 WhereIsAI/UAE-Large-V1 模型,输入序列长度为 128,批量大小从 1 扫到 128
  • 对于文本生成,我们使用 meta-llama/Llama-3.2-3 模型,输入序列长度为 256,输出序列长度为 32,批量大小从 1 扫到 64

创建实例

N2

访问 Google Cloud 控制台,并在您的项目下点击 创建虚拟机。然后,按照以下步骤创建一个 96 核的实例,它对应一个英特尔 Ice Lake CPU 插槽。

  1. 机器配置 选项卡中选择 N2,并将 机器类型 指定为 n2-standard-96。然后您需要按以下图片设置 CPU 平台替代文本
  2. 操作系统和存储 选项卡配置如下:alt text
  3. 其他配置保持默认
  4. 点击 创建 按钮

现在,您拥有一个 N2 实例。

C4

按照以下步骤创建一个 96 核的实例,它对应一个英特尔 Emerald Rapids 插槽。请注意,本文中我们使用 C4 和 N2 相同的 CPU 核心数,以确保进行同核数基准测试。

  1. 机器配置 选项卡中选择 C4,并将 机器类型 指定为 c4-standard-96。您还可以设置 CPU 平台 并开启全核睿频以使性能更稳定:替代文本
  2. 操作系统和存储 配置与 N2 相同
  3. 其他配置保持默认
  4. 点击 创建 按钮

现在,您拥有一个 C4 实例。

设置环境

请按照以下步骤轻松设置环境。为确保可复现性,我们列出了命令中使用的版本和提交。

  1. SSH 连接到实例
  2. $ git clone https://github.com/huggingface/optimum-benchmark.git
  3. $ cd ./optimum-benchmark
  4. $ git checkout d58bb2582b872c25ab476fece19d4fa78e190673
  5. $ cd ./docker/cpu
  6. $ sudo docker build . -t <your_docker_image_tag>
  7. $ sudo docker run -it --rm --privileged -v /home/<your_home_folder>:/workspace <your_docker_image_tag> /bin/bash

现在我们进入容器,执行以下步骤

  1. $ pip install "optimum-intel[ipex]"@git+https://github.com/huggingface/optimum-intel.git@6a3b1ba5924b0b017b0b0f5de5b10adb77095b
  2. $ pip install torch==2.3.1 torchvision torchaudio --index-url https://download.pytorch.org/whl/cpu
  3. $ python -m pip install intel-extension-for-pytorch==2.3.10
  4. $ cd /workspace/optimum-benchmark
  5. $ pip install .[ipex]
  6. $ export OMP_NUM_THREADS=48
  7. $ export KMP_AFFINITY=granularity=fine,compact,1,0
  8. $ export KMP_BLOCKTIME=1
  9. $ pip install huggingface-hub
  10. $ huggingface-cli login,然后输入您的 Hugging Face token 以访问 llama 模型

基准测试

文本嵌入

您需要将 optimum-benchmark 目录中的 examples/ipex_bert.yaml 更新如下,以基准测试 WhereIsAI/UAE-Large-V1。我们将 numa 绑定更改为 0,1,因为 N2 和 C4 每个插槽都有 2 个 NUMA 域,您可以使用 lscpu 再次检查。

--- a/examples/ipex_bert.yaml
+++ b/examples/ipex_bert.yaml
@@ -11,8 +11,8 @@ name: ipex_bert
 launcher:
   numactl: true
   numactl_kwargs:
-    cpunodebind: 0
-    membind: 0
+    cpunodebind: 0,1
+    membind: 0,1
 
 scenario:
   latency: true
@@ -26,4 +26,4 @@ backend:
   no_weights: false
   export: true
   torch_dtype: bfloat16
-  model: bert-base-uncased
+  model: WhereIsAI/UAE-Large-V1

然后,运行基准测试:$ optimum-benchmark --config-dir examples/ --config-name ipex_bert

文本生成

您可以按如下所示更新 examples/ipex_llama.yaml 以对 meta-llama/Llama-3.2-3 进行基准测试。

--- a/examples/ipex_llama.yaml
+++ b/examples/ipex_llama.yaml
@@ -11,8 +11,8 @@ name: ipex_llama
 launcher:
   numactl: true
   numactl_kwargs:
-    cpunodebind: 0
-    membind: 0
+    cpunodebind: 0,1
+    membind: 0,1
 
 scenario:
   latency: true
@@ -34,4 +34,4 @@ backend:
   export: true
   no_weights: false
   torch_dtype: bfloat16
-  model: TinyLlama/TinyLlama-1.1B-Chat-v1.0
+  model: meta-llama/Llama-3.2-3B

然后,运行基准测试:$ optimum-benchmark --config-dir examples/ --config-name ipex_llama

结果与结论

文本嵌入结果

在文本嵌入基准测试案例中,GCP C4 实例的吞吐量比 N2 高约 10 倍至 24 倍。替代文本

文本生成结果

C4 实例在文本生成基准测试中始终表现出比 N2 高约 2.3 倍至 3.6 倍的吞吐量。在批量大小为 1 到 16 的情况下,吞吐量提高了 13 倍,而延迟没有显著降低。这使得并发查询服务成为可能,而无需牺牲用户体验。替代文本

结论

在这篇文章中,我们对 Google Cloud Compute Engine CPU 实例(C4 和 N2)上的两个代表性代理 AI 工作负载进行了基准测试。结果显示,得益于 Intel Xeon CPU 上 AMX 和内存能力的改进,性能得到了显著提升。Intel 在一个月前发布了 带有 P 核的 Xeon 6 处理器(代号 Granite Rapids),它在 Llama 3 中提供了约 2 倍的性能提升。我们相信,有了新的 Granite Rapids CPU,我们可以探索将轻量级代理 AI 解决方案完全部署在 CPU 上,以避免密集的宿主-加速器流量开销。一旦 Google Cloud Compute Engine 提供 Granite Rapids 实例,我们将对其进行基准测试并报告结果。

感谢阅读!

社区

注册登录 发表评论