Skip to content

家用设备轻松搭建 AI 集群,畅跑 Llama 3.1 405B

作者:老余捞鱼

原创不易,转载请标明出处及原作者。

写在前面的话:本文主要介绍如何在家用设备上运行大型开源语言模型Llama 3.1 405B,首先我会解释构建人工智能集群来提高运行效率的原理,随后会演示如何通过Distributed Llama项目支持在多个设备上运行LLM模型,并会针对同步数据量进行优化。

在开源大型语言模型(open LLM models)和闭源大型语言模型(closed LLM models)之间的竞赛中,开源模型的最大优势在于您可以在本地运行它们。您不需要依赖外部提供商,也不需要支付额外的费用,只需承担电力和硬件成本。然而,随着模型大小的增加,这一优势开始减弱。运行需要大量内存的大型模型并不容易。幸运的是,使用张量并行(Tensor Parallism)和分布式推理(distributed inference)可能是一种可行的解决方案。

一、张量并行(Tensor Parallism)

在大型语言模型(LLMs)中,大多数计算涉及矩阵乘法,这大约占所有计算的97-98%。矩阵乘法很容易在多个CPU/GPU核心之间并行化。我们也可以在多个设备上执行相同的操作。设备可以这样分割,每个设备只计算矩阵乘法的一部分。如果一个设备可以在n秒内完成矩阵乘法计算,那么两个设备应该在n/2秒内完成计算!这就是张量并行

张量并行、计算时间

这是不是听起来非常棒,但主要瓶颈是同步。我们需要加快乘法运算,但在某些时候需要同步神经网络的状态,往往这需要较长时间。专业AI集群使用先进的链接(如NVLink)在GPU之间进行通信,以实现非常高的传输速度。然而,家用设备的以太网速度较慢。但令人惊讶的是,如果模型执行器的架构设计为减少传输大小,则同步LLM所需的数据量可能非常低。例如,如果集群由2个设备组成,那么将Llama 3 8B量化到Q40格式(6.3 GB)的模型仅需要每个标记1 MB的数据进行同步,这个数据量将是非常、非常低的。

在这里,张量并行加速了推理,但同步却拖慢了速度。这两个因素的组合将决定最终的性能。如果您有8个设备,并且可以用快速链接连接它们,您将观察到显著的加速(通过USB4进行同步在这里看起来非常有希望,您可以达到10到20 Gbps的速度)。

那么,我们如何在家中运行大型模型呢?您需要一个实现这些想法的项目。让我介绍一下分布式Llama项目。

二、分布式 Llama(Distributed Llama)

分布式Llama是一个允许您在多个设备上运行LLM模型的项目。它使用张量并行,并为同步所需的数据量进行了优化。分布式Llama区分了您可以在家用设备上运行的两种类型的节点:

  • 根节点 – 作为集群的根节点运行的应用程序,负责协调集群。
  • 工作节点 – 作为工作者运行的应用程序,执行来自根节点的指令。

目前,分布式Llama仅支持CPU推理,但随着后面的升级将会支持更多的方式。


人工智能集群拓扑结构,4 台设备,总内存 256 GB

因此,如果您的家用集群由4个设备组成,您应该在第一个设备上运行根节点,在其余设备上运行3个工作节点。分布式Llama在所有设备之间分配RAM使用量。例如,如果一个LLM模型需要230 GB的RAM,那么每个节点应该有230 GB / n 的RAM。根节点是个例外,因为它需要在内存中保留一些额外的层,所以需要比230 GB / n 多几个百分点的RAM。

8 x 树莓派4B 8GB

三、让 Llama 3.1 405B 跑起来

为了运行Llama 3.1 405B,我们需要克隆分布式Llama存储库,并在您要用于推理的所有设备上构建dllama应用程序。需要一个像G++这样的编译器或类似的工具。

git clone https://github.com/b4rtaz/distributed-llama.git
make dllama

然后,您需要将所有设备连接到同一个本地网络。为此,您可以使用任何以太网交换机。如前所述,同步时间是一个重要因素,因此您应该使用尽可能快的交换机。千兆以太网是最低要求。您还可以考虑通过USB4连接设备,并创建一个USB4网状网络。接下来,您需要在工作设备上运行工作节点:

./dllama worker --port 9998 --nthreads 4

–nthreads 参数定义了应该有多少个CPU核心用于处理。您应该将此参数设置为设备中的CPU核心数量。如您所见,工作节点不需要模型文件。这些文件仅对根节点是必需的。一开始,根节点会将模型的所有切片分发给工作节点。

在运行根节点之前,我们需要将Llama 3 405B模型下载到根设备,并将其转换为分布式Llama格式,您还需要准备一些存储空间来处理此操作(大约需要1.1 TB的可用空间)。

git lfs install
git clone https://huggingface.co/meta-llama/Meta-Llama-3.1-405B-Instruct

现在可以开始转换模型了,下面的命令将把模型量化为 Q40 格式。

cd distribured-llama/converter
python convert-hf.py path/to/Meta-Llama-3.1-405B-Instruct q40 meta-llama-3-405b

这个转换模型的过程大概需要几个小时时间,建议您在睡觉前或者上班前执行这个操作。接下来,您需要下载个已转换的标记器。如下:

wget https://huggingface.co/b4rtaz/Llama-3_1-8B-Q40-Instruct-Distributed-Llama/resolve/main/dllama_tokenizer_llama_3_1.t?download=true

这个过程完成后,您很快就可以下载转换成分布式 Llama 格式的模型了。

Distributed Llama running Llama 2 70B Q40 on 8 Raspberry Pi 4B devices

现在,在根节点上运行推理。

./dllama inference \
   --model dllama_model_meta-llama-3-405b_q40.m \
   --tokenizer dllama_tokenizer_llama_3_1.t \
   --buffer-float-type q80 \
   --prompt "Hello world" \
   --steps 64 \
   --nthreads 4 \
   --workers 10.0.0.1:9998 10.0.0.2:9998 10.0.0.3:9998

请注意,–workers 参数接受带有工作节点端口的IP地址。地址用空格分隔。此外,您可以通过设置–steps N 参数来定义您期望的单词预测数量。

还要注意的是,如果以后您要运行支持 /v1/chat/completions 端点的 API 服务(标准openai api格式),则应构建 dllama-api 应用程序并在根设备上运行,而不是 dllama inference。

./dllama-api \
  --model dllama_model_meta-llama-3-405b_q40.m \
  --tokenizer dllama_tokenizer_llama_3_1.t \
  --buffer-float-type q80 \
  --nthreads 4

分布式Llama还支持–kv-cache-storage disk参数,该参数通过将KV缓存移动到磁盘来减少RAM使用量。Llama 3.1 模型需要 ~34 GB 内存才能将完整上下文 (F32) 存储在内存中(131k 标记)。通过设置此参数,您可以减少RAM使用量,但需要额外的磁盘空间。请注意,KV缓存是在所有节点之间分割的,因此您需要为每个节点设置此选项。

到这里,我们通过家庭设备就完成了AI集群搭建的Llama 3.1 405B!如果您受此文启发,在此基础上有了创新,别忘了在 GitHub 上分享成果。


本文内容仅仅是技术探讨和学习,并不构成任何投资建议。
转发请注明原作者和出处。

Published inAI&Invest专栏

Be First to Comment

发表回复