分布式Llama
在开源LLM模型和闭源LLM模型的竞争中,开源模型最大的优势是可以本地运行。你不需要依赖外部提供商,也不需要支付额外的费用,除了电力和硬件成本。然而,随着模型规模的增大,这一优势开始减弱。运行需要大量内存的巨大模型并不容易。幸运的是,张量并行和分布式推理可能会有所帮助。
张量并行大多数大型语言模型(LLM)的计算涉及矩阵乘法,这占了所有计算的大约97-98%。矩阵乘法很容易在多个CPU/GPU核心上并行化。同样的方法也可以在多个设备上进行。设备可以这样划分,每个设备只计算矩阵乘法的一部分。如果一个设备可以在n
秒内计算出矩阵乘法,那么两个设备应该可以在n / 2
秒内完成计算!这就是张量并行化。
张量并行计算,计算时间
这听起来很有前景,但主要的瓶颈在于同步。我们可以加快乘法运算的速度,但在某个时刻,我们需要同步神经网络的状态。这会花费时间。专业的AI集群使用高级链接在GPU之间通信(如NVLink),以实现非常高的传输速度。然而,家用设备的以太网速度较慢。令人惊讶的是,如果模型执行器的架构设计为减少传输大小,那么同步LLM所需的数据量可以非常低。例如,如果集群由2个设备组成,那么将量化后的Llama 3 8B转换为Q40格式(6.3GB)时,每令牌只需要1MB的数据来同步。这非常低。
这里就是了。张量并行可以加速推理,但同步会减慢速度。这两个因素的结合将决定最终的性能。如果你有8个设备,并且可以通过快速链接将它们连接起来,你将会观察到显著的速度提升(通过USB4进行同步看起来非常有前景,你可以实现从10到20 Gbps的速度)。
那么,我们如何在家运行大型模型呢?你需要一个实现这些想法的项目。让我来介绍Distributed Llama项目。
分布式Llama分布式Llama是一个项目,允许你在多个设备上运行LLM模型。它使用张量并行技术,并针对所需同步的数据量较少进行了优化。分布式Llama区分了你可以在设备上运行的两种类型的节点:
- 根节点 — 作为集群根节点的应用程序,负责协调整个集群。
- 工作节点 — 作为工作进程的应用程序,执行根节点的指令。
目前,Distributed Llama仅支持CPU推理,但将来会有所改变。
AI 集群拓扑,4 个设备,总内存 256 GB RAM
所以,如果你的家庭集群由4个设备组成,你应该在第一个设备上运行根节点,并在其余设备上运行3个工作节点。分布式Llama在所有设备之间分配内存使用。例如,如果一个LLM模型需要238GB的内存,那么每个节点应该有 238 GB /n
的内存。例外是根节点,它需要比 238 GB /n
多出几个百分点的内存,因为它需要在内存中保留一些额外的层。
为了运行Llama 3.1 405B,我们需要克隆Distributed 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模型下载到根设备并转换为Distributed Llama格式。你可以手动进行转换,或者直接从Huggingface下载预转换的权重。使用Distributed Llama仓库中的launch.py
脚本,你可以通过执行一个命令来下载模型和分词器。所有文件将被放置在models
文件夹中。
launch.py llama3_1_405b_instruct_q40
确保您已经在Huggingface上接受了[Llama 3.1许可证](http://launch.py llama3_1_405b_instruct_q40)。确保您的磁盘上有大约240GB的空闲空间。
现在你可以在根节点上运行推理。
./dllama inference \
--model models/llama3_1_405b_instruct_q40/dllama_model_llama3_1_405b_instruct_q40.m \
--tokenizer models/llama3_1_405b_instruct_q40/dllama_tokenizer_llama3_1_405b_instruct_q40.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 服务,你应该构建 dllama-api
应用程序,并在根设备上运行它而不是 dllama inference
。
./dllama-api \
--model models/llama3_1_405b_instruct_q40/dllama_model_llama3_1_405b_instruct_q40.m \
--tokenizer models/llama3_1_405b_instruct_q40/dllama_tokenizer_llama3_1_405b_instruct_q40.t \
--buffer-float-type q80 \
--max-seq-len 2048 \
--nthreads 4
分布式Llama还支持--kv-cache-storage disk
参数,该参数通过将KV缓存移动到磁盘来减少RAM的使用。Llama 3.1模型需要大约34GB的RAM来在内存中存储完整的上下文(F32)(131k令牌)。通过设置此参数,您可以减少RAM的使用,但需要额外的磁盘空间。请注意,KV缓存会在所有节点之间分配,因此您需要为每个节点设置此选项。
第二个减少RAM使用的方法是使用 --max-seq-len 2048
参数。如果你不需要完整的上下文大小,可以将其减小,这将同时减少内存消耗。
就这样!别忘了在 GitHub 上分享你的结果。
共同學習,寫下你的評論
評論加載中...
作者其他優質文章