大语言模型入门指南

发布: 2023-08-12   上次更新: 2024-07-06   分类: 理解计算机   标签: LLM

文章目录

随着 ChatGPT 的到来,大语言模型(Large Language Model,简称 LLM)成了新时代的流行词(buzzword),各种基于 AI 的产品百花齐放。

大多数人直接用现有产品就可以了,但对于喜欢刨根问底的程序员来说,理解其原理,并能够在本地部署运行是必不可少的。但由于没有相关背景,笔者一开始在接触时, 很多 GitHub 上的搭建教程看得是云里雾里,而且这方面的介绍文章要不就是太晦涩难懂,要不就是太大众小白,于是就有了这篇文章, 主要介绍笔者在接触大模型过程中学到的知识,以及如何在 macOS 上运行大模型。 笔者水平有限,不足之处请读者指出。

什么是大语言模型

Explain like I'm 5

首先看看大模型自己的回答,提问:『假设我才 5 岁, 给我解释大模型是怎么工作的?』,Claude 的回答:

好的,我来用简单的方式解释一下大模型是怎么工作的。

可以想象大模型就像一个超级聪明的机器人学生。它会不停地阅读各种各样的文章、故事和书籍。

当它读这些东西的时候,它的大脑会记住所有看到的词语和句子。每读一篇新文章,它就会变得更聪明一点。

慢慢地,它看到了成千上万的句子。它开始理解词语之间的关系,哪些词经常一起出现,哪些词不会一起使用。

然后如果有人问它一个问题,它就会在存储的海量句子中找到相关的句子, 用这些句子组合出一个答案。

它也会预测接下来最有可能出现的词语,就像我们说话时脑海中会出现各种选项一样。

最后,它会从最可能的词语中选择最佳的回答,就像我们说话要思考后才开口。

所以简单来说,大模型就是一个超级大的脑容量,可以记住极多信息,并且可以像人类一样回答问题或写作!你明白了吗?如果还有不懂的可以再问我。

通俗来讲,大模型就是输入大量语料,来让计算机获得类似人类的“思考”能力,使之能够理解自然语言,来进行『文本生成』、『推理问答』、『文档摘要』等工作。

从学术上来说,LLM 是一种基于神经网络的机器学习模型,相对比之前的模型,“大”是她的主要特点,可以体现在数学公式更复杂,参数更多、计算资源需求高等方面。

基本概念

为了能让计算机理解自然语言,第一步就是要对文字进行数字化,这里面有以下几个概念:

  • Token,通过在对输入文本进行分词得到,它可以表示单个字符、单词或句子,这取决于所采用的分词方法。例如: cat
  • 词汇表(Vocabulary),每个 token 在 LLM 中对应一个数字,比如:
TokenID
The345
cat1256
sat1726
  • Embedding,单有一个 ID 无法表示 token 之间的联系,需要把它转成向量,这样才方便理解他们之间的联系。这里可以类比『坐标』, 通过给出经纬度(两个维度),我们就能确定一个地方,而且通过这个坐标可以确定两地的远近。对于 token 来说是类似的,只是 涉及的维度多。一般至少要成百上千个,在 GPT 3 中就用了 12,288 个。 cat 可能的向量表示:

[0.0074, 0.0030, -0.0105, 0.0742, 0.0765, -0.0011, 0.0265, 0.0106, 0.0191, 0.0038, -0.0468, -0.0212, 0.0091, 0.0030, -0.0563, -0.0396, -0.0998, -0.0796, …, 0.0002]

  • 推导(Inference),根据用户的输入,LLM 生成对应回答,即完成一次推导。回答可能是对话、翻译、绘画创作等不同形式。

现在的 LLM 一般指以 Transform 为代表的神经网络模型,它们采用自注意力(Self-attention)机制来学习不同 token 之间的依赖关系,生成高质量 embedding。

大模型中的“大”,主要就是指用于计算最终的 embedding 的参数多,这里包括权重(weight)与偏差(bias)两部分,例如 GPT-3 拥有 1750 亿参数,其中权重数量达到了这一量级,而词汇表 token 数只有 5 万左右。更多细节可参考:

发展历程

LLM 发展时间线
这一切的起源是 2017 年发布的 Attention Is All You Need 论文,之后基于大量语料的预训练模型百花齐放,比如:

BERT(Bidirectional Encoder Representations from Transformers)
Google 在 2018 年提出,创新性的双向预训练并行获取上下文语义信息,以及掩码语言建模(MLM)让模型更好地推断语义信息。它开创了预训练语言表示范式,对自然语言处理产生了深远影响。参数规模:110M 到 340M
GPT(Generative Pre-trained Transformer)
OpenAI 在2018年提出,开创了仅使用自回归语言建模作为预训练目标而无需额外监督信号。它展示了通过无监督大规模预训练获得的语言生成能力,对研究与应用都带来重大影响。参数规模:1750 亿
Large LAnguage Model Approach(LLAMA)
Meta 在 2021 年提出,首个开源模型。为构建更大规模、更通用的语言模型提供了系统化的方法与工具。参数规模:十亿到千亿

模型部署

由于大模型的参数非常多,比如在 GPT-2 中,有 1.5B 参数,每个参数用 float32 表示,那么需要的内存大小为 4 bytes * 1,500,000,000 = 6GB ,更先进的模型如 LLAMA 有 65B 参数,那么需要的内存就需要 260G,这还是在不考虑词汇表的情况下。因此在进行模型实际部署时,会进行模型的压缩。

而且,在训练、使用 LLM 时,CPU 与内存之间的传输速度往往是系统的瓶颈,核心数反而不是大问题,因此减小内存使用是首要优化点。使用更小的数据类型是一种直接的方式,比如 16 位的浮点数就可以直接将内存使用减倍。目前有几种相互竞争的 16 位标准,英伟达在其最新一代硬件中引入了对 bfloat16 的支持:

FormatSignificandExponent
bfloat168 bits8 bits
float1611 bits5 bits
float3224 bits8 bits

量化 Quantization

将 16 位降至 8 位或 4 位是可能的,但不能使用硬件加速浮点运算。如果想对更小的类型进行硬件加速,就需要使用小整数和矢量化指令集。这就是量化的过程。

量化技术可以应用到现有的 32 位浮点运算模型中,通过将权值转换为较小的整数,这些整数的运算可以使用硬件加速指令集,如英特尔的 AVX。

量化模型的简单方法是,首先找出权重的最大值和最小值,然后将数值范围划分为整数类型中可用的桶数,8 位为 256 桶,4 位为 16 桶。这就是所谓的训练后量化(post-training quantization),也是量化模型的最简单方法。现在市面上主要有两类量化方法:

GPTQ (Accurate Post-Training Quantization for Generative Pre-trained Transformers)
主要针对英伟达的 GPU
GGML
侧重于 CPU 优化的量化方法,主要针对苹果 M1 和 M2 芯片做优化,macOS 用户首选

社区用户 TheBloke 已经把 Huggingface Transformers 库中的大多数 LLM 量化好,可供用户直接下载使用,这无疑极大方便了用户的使用,感谢开源社区的力量💪🏻。

动手实验

由于笔者实用的 macOS 系统,因此采用 GGML 量化后的模型,官方开源出来的模型大都以 Python 为主,效率可想而知,因此笔者一般会采用社区内的其他实现,比较有名的项目有:

LLama

早期的 LLama 主要针对 CPU 进行设计,但社区非常给力,GPU(英伟达 & 苹果)已经得到支持:

使用也比较简单,首先是编译,为了能够利用 Apple 的 GPU,可以用如下命令编译:

1
LLAMA_METAL=1 make

之后需要去 Llama-2-7B-Chat-GGML 中下载模型,3G 到 7G 不等,读者可以按需尝试即可。

1
2
./main -m ~/Downloads/llama-2-7b-chat.ggmlv3.q4_1.bin \
       -p "Are there any aliens on earth" -n 512 -ngl 10

得到输出

There is no definitive evidence of aliens on Earth, but many people believe that the possibility of extraterrestrial life existing in some form or another cannot be ruled out completely. Here are a few reasons why:

  1. The vastness of the universe: With an estimated 100-400 billion stars in the Milky Way galaxy alone, and over 100 billion galaxies in the observable universe, the potential for life-supporting planets is immense.
  2. Exoplanet discoveries: Over 4,000 exoplanets have been discovered so far, and many of these planets are believed to be located in the habitable zones of their respective stars, where conditions are suitable for life as we know it.
  3. The building blocks of life: Many organic compounds, such as amino acids and sugars, have been found in meteorites and in interstellar space, suggesting that the raw materials for life are widespread in the universe.
  4. The Fermi Paradox: The Fermi Paradox suggests that if intelligent extraterrestrial life exists, we should have seen some sign of it by now

. However, it's possible that advanced civilizations may be avoiding us, or that they have a different timescale for communication.

  1. The Drake Equation: This equation is a mathematical framework for estimating the number of extraterrestrial civilizations in the galaxy that might be able to communicate with Earth. While the equation is highly speculative and involves many unknown variables, it does suggest that the possibility of intelligent life existing elsewhere in the universe is not entirely negligible.

In conclusion, while there is no conclusive evidence of aliens on Earth, the possibility of extraterrestrial life existing in some form or another cannot be ruled out completely. The vastness of the universe, the discoveries of exoplanets, the presence of building blocks of life, the Fermi Paradox, and the Drake Equation all contribute to this belief.

此外,llama.cpp 还提供了 WebUI 供用户使用,首先启动 server:

1
./server -m ~/Downloads/llama-2-7b-chat.ggmlv3.q4_1.bin -ngl 512

它默认监听 8080 端口,打开浏览器就可以对话了

LLama Web 界面

Ollama

Ollama 对 llama.cpp 提供了一层 API 封装,使用起来更加方案,并且提供了与 OpenAI 兼容的接口,方便接入。使用方式如下:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
# 安装
brew install ollama

# 启动 API 服务器,之后就可以用 REST API 来进行访问了
ollama serve

# 也可以使用 brew services  进行后台启动
brew services restart ollama

# 用 llama3 模型,启动一个交互式 REPL,首次使用时会进行模型下载
ollama run llama3

ollama 支持的模型可以在 library 页面找到,不同模型对内存的要求:

参数规模所需内存
7B8G
13B16G
33B32G
1
2
3
4
5
curl -s http://localhost:11434/api/chat -d '{
  "model": "llama3",
  "messages": [{"role": "user", "content": "Hello, Nice to meet you, what is your name?"}],
  "stream": false
}' | jq
{
  "model": "llama3",
  "created_at": "2024-06-02T07:03:52.329377Z",
  "message": {
    "role": "assistant",
    "content": "Nice to meet you too! I'm LLaMA, a large language model trained by a team of researcher at Meta AI. My purpose is to understand and generate human-like text based on the input I receive. I don't have a personal name, but feel free to call me LLaMA or just \"Assistant\" if that's more comfortable for you! What brings you here today?"
  },
  "done_reason": "stop",
  "done": true,
  "total_duration": 2521845291,
  "load_duration": 1234666,
  "prompt_eval_duration": 168948000,
  "eval_count": 80,
  "eval_duration": 2350576000
}

Whisper

Whisper 是由 OpenAI 开源的通用型语音识别模型。和 llama 类似,采用 make 命令编译,之后去 ggerganov/whisper.cpp 下载量化好的模型,然后就可以进行音频识别。目前输入只接受 wav 格式,可以用 ffmpeg 转化,使用方式:

1
2
3
4
ffmpeg -loglevel -0 -y -i "$INPUT" -ar 16000 -ac 1 -c:a pcm_s16le "${INPUT}.wav"

./main -m models/ggml-small.bin -f "$INPUT" \
        -osrt -t 8 -p 4

下面是 Zig with Andrew Kelley :: Rustacean Station 这个播客的 srt 输出,完整版本可以在这里查看。

1 00:00:00,000 –> 00:00:10,720 [Music]

2 00:00:10,720 –> 00:00:14,880 Hello and welcome to another episode of "Restation Station" on your host Alan Weimar.

3 00:00:14,880 –> 00:00:18,480 Today I am with Andrew Kelly, the creator of Zig.

4 00:00:18,480 –> 00:00:21,120 It's really a great honor to have a language creator here.

5 00:00:21,120 –> 00:00:23,840 I like I told him before the show, I have great respect for language creators,

6 00:00:23,840 –> 00:00:27,040 especially ones that can get the language very popular.

7 00:00:27,040 –> 00:00:29,920 Also, as you guys have probably heard in different episodes,

一般来说,英文的音频使用 small 模型就有够了,但是如果是中文,最好用最大的模型。

SizeParametersEnglish-only modelMultilingual modelRequired VRAMRelative speed
tiny39 Mtiny.entiny~1 GB~32x
base74 Mbase.enbase~1 GB~16x
small244 Msmall.ensmall~2 GB~6x
medium769 Mmedium.enmedium~5 GB~2x
large1550 MN/Alarge~10 GB1x

免费的 LLM 产品

尽管 ChatGPT 是收费的,而且还不面向中国,但现在市面上有非常多的其他选择,比如 Google 的 Bard,下图给出了一些常用服务, 读者都可以去体验试试:

免费的大模型产品
ChatHub 是一个浏览器插件,可以在一个页面中同时使用多个 GPT (ChatGPT、new Bing Chat、Google Bard、Claude 等)。

单就写代码这个垂直领域来看,GitHub 的 Copilot 无疑是老大哥,但它并非免费,下面有几个替代品:

Tabnine
AI assistant that speeds up delivery and keeps your code safe
Codeium
Free AI Code Completion & Chat
Amazon CodeWhisperer
Build applications faster and more securely with your AI coding companion
SourceGraph Cody
The AI that knows your entire codebase
Tabby
Opensource, self-hosted AI coding assitant
fauxpilot/fauxpilot
An open-source alternative to GitHub Copilot server

总结

说来可笑,ChatGPT 的开发者 OpenAI 并不像其名字那样开放,ChatGPT 的源码与模型数据是不对外开放的,但不久, Meta 在 2023 年 2 月份开源了 LLaMA 1,并在 7 月接着发布了进阶的 Llama 2,而且允许商用。 Meta 此举无疑极大推进的大模型的发展,坊间甚至一度流传这么一篇文章:Google "We Have No Moat, And Neither Does OpenAI",说 Meta 才是大模型时代的最大赢家, OpenAI、Google 都要靠边站。

大模型时代到来了,你的工作离被取代还远吗?

参考

评论

欢迎读者通过邮件与我交流,也可以在 MastodonTwitter 上关注我。