在CPU上运行大型语言模型
#python #ai #machinelearning #chatgpt

ChatGPT is at capacity

在使用chatgpt时的某个时候,您可能会遇到上面显示的错误。这背后的原因在于需要大量计算资源来运行像chatgpt这样的大型语言模型。这些模型需要大量的计算能力,通常由称为Graphical Processing Units (GPUs)的专业硬件提供。

与常规程序不同,大型语言模型无法在Central Processing Units (CPUs)上有效运行。与操作这样的大规模语言模型相关的成本是很大的。这是一项费用,通常只有Google和Microsoft等大型公司才能负担得起。

语言模型必须考虑两项计算密集的任务:

  • 培训
  • 推理

培训是指导有关如何执行其预期任务的语言模型的过程。这是两者之间更加苛刻的过程。培训LLM会消耗时间和货币资源。

推论是训练有素的大语言模型的利用。每当您与Chatgpt互动时,都在推理模式下使用它。尽管计算量较少而不是培训,但由于GPU的大量要求,对LLM的推断仍然相对昂贵。特别是如果您在Chatgpt的规模上进行推断。

考虑到所有这些,您可能正在思考是否可以在CPU上运行大型语言模型是可行的。答案是肯定的,至少用于推论。在本文中,我们将深入研究最新的进步,技术和技术,使LLMS能够使用常规CPU进行操作。

介绍美洲驼

Meta's LLaMa in Jimmy neutron

Llama 大语言模型Meta ai 是Meta开发的轻巧有效的开源大语言模型。它旨在提供类似于其大小十倍的型号的性能。

大语言模型(LLM)的一个基本方面是它们的参数,在确定其性能中起着至关重要的作用。 Llama引入了各种具有不同参数计数的版本,包括具有70亿参数的变体和另一个具有约650亿个参数的变体。

从历史上看,增强LLM性能涉及增加参数数量。这遵守scaling law,该策略已证明在GPT系列之类的模型中成功。

但是,由于参数增加与计算需求之间的固有关系,该策略构成了挑战。随着参数计数的增长,计算工作负载也是如此,在模型复杂性和处理效率之间进行了权衡。

最近的研究表明,提高LLM性能的方法发生了变化。一个有效的替代方案不仅增加了参数的数量,涉及增加培训数据。美洲驼采用这种策略,依靠数据丰富来提高其性能。

Llama在LLM的领域中取得了突破性的成就。 Llama接受了2048年A100 GPUs的培训。骆驼的重大突破不是其训练,而是其推论步骤。在推断期间,可以在单个GPU上运行Llama模型,与其他需要多个GPU进行操作的LLM相比,这是一个明显的优势。

尽管这种单GPU功能非常出色,但与在CPU上运行相去甚远。为了使像Llama这样的轻量级LLM在CPU上运行,一种称为量化的聪明技术开始发挥作用。但是,在我们深入了解量化的概念之前,让我们首先了解LLM如何存储其参数。

LLMS参数如何存储

大语言模型(LLM)的参数通常被存储为浮点数。大多数LLM都使用32位浮点数,也称为单个精度。但是,该模型的某些层可能采用不同的数值精度水平,例如16位。

让我们执行一个简单的数学计算:

<数学=“ block”> 8 bits = 1 byte 32 = 4 >字节 8 \text{ bits} = 1 \text{ byte}\quad 32 \text{ bits} = 4 \text{ bytes}

There are 8 bits in one byte, which means 32 bits equals 4 bytes. Consider a LLaMa model with 7 billion parameters, where these parameters are stored as 32-bit floats. To calculate the total memory required, we can multiply 4 bytes by 7 billion:

4bytes×7billion=28 billion bytes 4 \, \text{bytes} \times 7 \, \text{billion} = \text{28 billion bytes}

28 billion bytes is equivalent to 28 gigabytes (GB).

This implies that utilizing the model would require a memory capacity of 28 gigabytes (GB). However, it's worth considering the limited memory capacity of consumer based CPU devices. Such devices typically do not possess memory sizes that can accommodate 28 GB. We need to reduce the memory consumption of the LLM, and this is where quantization becomes relevant.

什么是量化?

量化是降低LLM参数精度的过程。在这种情况下,它涉及采用现有参数,这些参数通常存储为32位浮点数,并将其转换为4位整数。精确度的降低显着降低了存储模型所需的内存消耗。虽然模型的性能可能会有较小的降解,但这种影响通常很小,通常可以忽略不计或不明显。

考虑浮点表示中的一个值数组:

<数学=“ block”> [ 0.333 0.98 < /mn> 0.234 ] [0.333, 0.98, 0.234]

When we apply quantization, these values are converted to integers:

[2,15,0] [2, 15, 0]

While the two sets of numbers are different, they retain their meaning. For instance, the second value remains the largest in both arrays, and the third value is still the smallest.

Quantization can be likened to expressing values in a manner similar to using percentages. For example, someone might express a need for "3200 out of the 10000 cans". This expression can be simplified by stating the need as "32 percent of the cans". Although the specific numerical values differ, the conveyed information remains identical. This analogy shows how quantization simplifies value representation while retaining their inherent meaning.

将4位量化应用于Llama7b

让我们对具有70亿参数的Llama模型应用4位量化,假设所有参数最初都存储为32位。

<数学=“ block”> 8 bits = 1 byte 4 = 0.5 0.5 字节 8 \text{ bits} = 1 \text{ byte}\quad 4 \text{ bits} = 0.5 \text{ bytes}

Given that 1 byte equals 8 bits, 4 bits are equivalent to 0.5 bytes. Therefore, to determine the memory consumption after applying 4-bit quantization to a Large Language Model with 7 billion parameters, we multiply 0.5 bytes by 7 billion.

7,000,000,000×0.5bytes=3,500,000,000bytes 7,000,000,000 \times 0.5 \, \text{bytes} = 3,500,000,000 \, \text{bytes}

After performing our calculation, we find that the memory consumption is 3 billion bytes, equivalent to 3.5 GB. This indicates that it's possible to run the LLaMa 7 billion parameter model on a device with more than 3.5 GB of available RAM space.

GGML生态系统

另一种有助于在CPU上运行LLM的关键技术是 ggml ,它代表 Georgi Gerganov机器学习。它以其创造者的名字命名。

GGML是一个机器学习库,可在C中实现tensor操作。由于其在C中的实现,它可以促进在不同平台上执行ML模型。此外,GGML提供了对模型量化的支持。

ggml最初用于开发Whisper.cpp,该项目旨在使OpenAI的低语模型在紧凑型设备(例如智能手机和其他小型设备)上执行。这为随后的一个名为llama.cpp的项目奠定了基础,该项目促进了在类似紧凑的设备上执行Llama模型的基础。

此外,GGML充当文件格式,可以在单个文件中存储模型信息。

Llama.cpp简介

Llama.cpp是基于Llama的模型的运行时间,可以在CPU上进行推断,前提是该设备具有足够的内存来加载模型。它用C ++编写,并利用GGML库执行张量操作并执行量化过程。

尽管用C ++编写,但有几种编程语言的绑定。 python绑定称为llama-cpp-python

与Llama-CPP-Python合作

让我们付诸实践到目前为止我们学到的一切。我们将利用llama-cpp-python执行Llama 2-7B型号。如果您的可用内存约为6.71 GB,则可以在本地运行此示例。如果不这样做,则可以使用以下链接在Google Colab中运行代码。

Open In Colab

首先,我们需要获取我们的模型,将其转换为GGML格式,然后继续量化它。但是,由于我们可以轻松地从HuggingFace获取已经量化的模型,因此无需担心此步骤。一个名为TheBloke的用户已经量化了许多型号。

wget https://huggingface.co/TheBloke/Llama-2-7B-Chat-GGML/resolve/main/llama-2-7b-chat.ggmlv3.q4_1.bin

我使用命令行工具wget下载模型。这种特定的骆驼变体经历了类似于chatgpt的微调。

pip install llama-cpp-python

接下来,我们继续安装llama-cpp-python。安装完成后,您可以选择创建一个python文件以包含您的代码或使用Python解释器进行执行。

from llama_cpp import Llama

LLM = Llama(model_path="./llama-2-7b-chat.ggmlv3.q4_1.bin")

我们加载模型,然后将其实例化。之后,我们将提示输入到模型。

prompt = "Tell me about the Python programming language? "

output = LLM(prompt)

Llama-CPP提供的API与OpenAI提供的API相似。这是我们提供的提示产生的响应:

{'id': 'cmpl-4c10c54e-f6a1-4d80-87af-f63f19ce96c2',
 'object': 'text_completion',
 'created': 1692538402,
 'model': './llama-2-7b-chat.ggmlv3.q4_1.bin',
 'choices': [{'text': '\npython programming language\nThe Python programming language is a popular, high-level programming language that is used for a wide range of applications, such as web development, data analysis, artificial intelligence, scientific computing, and more. Here are some key features and benefits of Python:\n\n1. **Easy to learn**: Python has a simple syntax and is relatively easy to learn, making it a great language for beginners.\n2. **High-level language**: Python is a high-level language, meaning it abstracts away many low-level details, allowing developers to focus on the logic of their code rather than',
   'index': 0,
   'logprobs': None,
   'finish_reason': 'length'}],
 'usage': {'prompt_tokens': 10, 'completion_tokens': 128, 'total_tokens': 138}}

从模型返回的文本是:

Python编程语言
Python编程语言是一种流行的高级编程语言,用于广泛的应用程序,例如Web开发,数据分析,人工智能,科学计算等。这是Python的一些关键特征和好处:

  1. 易于学习:Python具有简单的语法,并且相对容易学习,这是初学者的好语言。
  2. 高级语言:Python是一种高级语言,这意味着它抽象了许多低级细节,使开发人员可以专注于其代码的逻辑,而不是

收到的响应实际上是非常令人满意的。但是,必须牢记,就能力而言,这种特殊模型不等于Chatgpt。为了提高性能,请考虑使用具有更高量化的模型,例如8-bit version。对于更高级的结果,获取130亿参数模型可能是有益的。使用prompting engineering技术还可以提高获得的响应的质量。


在CPU上运行大型语言模型的能力代表了该领域的重大突破。这一进步为各种应用程序铺平了道路,使小型企业,研究人员,业余爱好者和不愿与第三方组织共享数据的个人。这种发展是为了持续增长,在接下来的几年,即使不是几个月的时间里,我们可以期望LLM的更多可访问性。

这里有很少的有用资源来帮助您扩大在CPU上运行LLM的知识。

  • 介绍Llama的博客postpaper
  • 查看ggml website并阅读他们的manifesto,以了解有关该项目的哲学的更多信息。
  • 观看此video以了解硬件Chatgpt。
  • 要获得更深入的量化概述,请观看此video
  • 要了解GGML文件格式,请阅读this