大模型时代
Large language model

入门级理解

大规模预训练语言模型 (大模型)

Generative Pretrained Transformer ,也有个叫法是大型语言模型(LLM)。 相比于在此之前的NLP模型,它能完成更加通用和智能的NLP任务,比如搜索、推荐、问答、内容创作、写代码。

OpenAI的GPT系列将大模型推向了大风口。

预训练架构的几大门派

NLP各种任务其实收敛到了两个不同的预训练模型框架里:

LLM模型结构

LLM Visualization

LLM相比它的前身比如Bert,最大的区别不是模型结构而是参数规模。 LLM默认一般使用fp16精度来训练。

Transformer 架构已成为开发各种 LLM 的事实标准骨干,现有 LLM 的主流架构可以大致分为三种类型:

结构解析

GPT模型输出的logits, key_states, value_states,key_states.3,value_states.3 分别是什么意思?

推理步骤

生成策略

贪心搜索、束搜索、Top-k采样、Top-p采样(核采样)、基于温度的采样、Min-P 采样等知名的解码策略,通过了解这些技术,使我们可以更高效的优化LLM的生成结果。

模型规模

sequence length 和 context length

外置超参数

关于token

config.json

"bos_token_id": 151643,    <|endoftext|>
"eos_token_id": [
    151645,   <|im_end|>
    151643
],
"pad_token_id": 151643,

tokenizer.json

词汇表、分词算法细节、合并规则

tokenizer_config.json

分词器类型、特殊标记、处理参数 “eos_token”: “<|im_end|>”,

提示工程(Prompt Engineering)

https://www.promptingguide.ai/zh

Chain-of-Thought(CoT)是一种改进的Prompt技术,目的在于提升大模型LLMs在复杂推理任务上的表现,对于复杂问题尤其是复杂的数学题大模型很难直接给出正确答案

LLM推理中的role是什么意思?system、user、assistant

提示学习 Prompt Learning

比如做情感分类任务:

大模型训练

分词器训练

BPE、WordPiece、ULM、SentencePiece

预训练 (Pre-Training)

数据集:学习无标记文本数据。 基于 Transformer 架构,以“预测下一个词”为目标进行自监督训练.

指令精调(Instruction Tuning)

让LLM理解输入命令的含义,并正确执行。 它跟SFT的过程看起来很像,不过训练目标是有差异的,指令精调更为注重提升模型在面对自然语言指令时的表现,SFT更注重特定领域的知识。实际生产中,这两个事情可能是同一个过程。

有监督微调(Supervised Fine-Tuning - SFT)

数据集:收集高质量 <问题,回答> 对,涵盖开放问答、推理等任务。 使用标注好的数据集用于LLM微调,这些数据集包含输入和期望输出的示例。

奖励建模(Reward Modeling)

数据集:针对同一问题,标注不同模型输出的优劣排序。 训练奖励模型是一个回归任务

强化学习 RLHF

搞清楚强化学习中的“状态”、“动作”在 LLM 中对应什么 https://huggingface.co/blog/zh/rlhf

大模型微调技术

https://zhuanlan.zhihu.com/p/618894319

huggingface PEFT

把微调技术工程化了 https://huggingface.co/docs/peft/index

极简的工程实践

Reproducing GPT-2 (124M) in llm.c

https://github.com/karpathy/llm.c/discussions/481

inference a baby Llama 2 model in pure C?

https://github.com/karpathy/llama2.c

Karpathy 的 minGPT 和 nanoGPT 都是基于 GPT 架构的轻量级实现

开源大模型

大模型推理性能优化 (accelerate LLM inference)

综述:

优化方向:

性能指标:

专家并行

Prefill-Decode PD分离

在 PD 分离式架构中: Prefill Instance 专注于 Prefill 阶段的计算。 Decode Instance 专注于 Decode 阶段的生成任务。 当 Prefill Instance 完成 KV Cache 的计算后,会将其传输给 Decode Instance,后者接续生成结果。这种架构独立优化了两个阶段的性能,因此又被简称为 PD 分离。

PD分离遇到的最大挑战是如何在不同GPU设备之间传输KVCache

https://zhuanlan.zhihu.com/p/1894492016718639469

kv cache优化

在自回归生成过程中做 attention 时, 一个 token i 的特征向量 (feature vector) 会线性映射拆成 Qi, Ki, Vi 三个特征向量. 其中, Qi 用于与序列中之前所有的 Kj, Vj 向量做 attention, 从而得出输出特征向量 Oi. 而 Ki, Vi 则会被留存下来, 以便之后的 token 在做 attention 时不再重复计算. 用于留存序列中 Ki, Vi 的存储空间 (或者是这个张量) 被称为 KV-Cache.

LLM在decoding阶段的每次推理只会用到当前的Q,这次用的Q下次不会用到,所以不用Cache Q

kv cache容量需求: batch_size * seq_length * attention_head_num * attention_head_dim * layer_num * key_bits * 2

单个 Token 的 KVCache 由四大因素决定:Layers、NumHead、HeadDim、以及 KVCache 数据类型决定的。

Chunked Prefills

让处于 Prefill 阶段的请求与 Decode 阶段的请求组成一个批次(batch)进行计算。 对于过长的token请求, 如果在一个batch内处理除了会及其占用显存资源导致显存超限外, 还有可能因为单请求无法并行处理严重影响其他请求的TTFT, 所以有了chunked_prefill这个功能, 主要作用就是将过长请求切分成多个chunk分别进行处理。

连续批处理技术

In-flight Batching / continuous batching / iteration-level batching

单处理也就是不组成Batch或者说一个Batch中数据始终为1,也就是单个提示(Prompt)传过来直接送入到LLM进行推理。单条数据虽然简单而且灵活,不过因为每次只能处理一条数据,对GPU资源的利用率较低。因此,我们通常会将多条数据放入一个批次进行处理,从而提升GPU的利用率。

与之相对应的处理方式叫做静态批处理 static batching

在处理实时数据流(如聊天消息)时,连续批处理会不断地将即时到达的消息聚合成批次,并将每个批次作为一个单元送入模型进行处理。也就是说在每次 decode 的迭代过程中,做 batch 的调度调整。这种方式可以减少模型推理的延迟并提高吞吐量。 https://www.anyscale.com/blog/continuous-batching-llm-inference

Speculative decoding 投机解码

EAGLE-3: 使用经过训练的专用草稿模型,与目标模型高度对齐,接受率高

长度外推技术

https://www.cnblogs.com/rossiXYZ/p/18808744 https://kexue.fm/archives/9948

MTP 多词预测 Multi-token prediction

MTP 通过训练时植入“多步预测”能力,推理时以“批量生成+并行验证”替代逐步生成,在保持语义连贯性的同时绕过显式自回归循环。

StreamingLLM

Attention Sink https://www.high-flyer.cn/blog/streamingllm/

Flash Attention

通过重新组织注意力计算来减少内存IO,从而发现显著的性能提升。优化访问HBM次数过多的性能问题 https://github.com/Dao-AILab/flash-attention https://www.high-flyer.cn/blog/flash_attn/

大模型量化技术

性能优化的大方向之 model compression methods for Large Language Models.

gptq

obq gptq

bitsandbytes 低比特体系

LLM大模型部署 inference/runtime

推荐阅读LLM 的推理优化技术纵览

fastllm

https://github.com/ztxz16/fastllm https://zhuanlan.zhihu.com/p/646193833

vllm(PagedAttention)

vLLM 主要用于快速 LLM 推理和服务,其核心是 PagedAttention,这是一种新颖的注意力算法 https://github.com/vllm-project/vllm

chatglm.cpp

https://github.com/li-plus/chatglm.cpp

llama.cpp

https://github.com/ggerganov/llama.cpp

whisper.cpp

https://github.com/ggerganov/whisper.cpp https://github.com/openai/whisper

huggingface/text-generation-inference tgi

https://github.com/huggingface/text-generation-inference

lmdeploy

https://github.com/InternLM/lmdeploy

TensorRT-LLM

https://github.com/NVIDIA/TensorRT-LLM

FlashInfer

https://github.com/flashinfer-ai/flashinfer

sglang

https://github.com/sgl-project/sglang

BasePrefixCache

OmniServe

https://github.com/mit-han-lab/omniserve

ollama

Xorbits Inference

https://github.com/xorbitsai/inference

LLM 服务接口

stream_chat 流式输出

在使用ChatGPT时,模型的回复内容是一个字一个字蹦出来的,而不是整段话直接出现,因为模型需要不断预测接下来要回复什么内容,如果等整段回复生成之后再输出到网页,用户体验就会很差,一直以为这种流式输出效果是用WebSocket实现的,后来接入openai接口,发现接口是http协议,才了解到SSE技术。

Server-Sent Events (SSE) 是一种基于 HTTP 协议的服务器推送技术,它允许服务器向客户端发送数据和信息。与 WebSocket 不同,SSE 是一种单向通信方式,只有服务器可以向客户端推送消息。SSE 是 HTML5 规范的一部分,使用非常简单,主要由服务端与浏览器端的通讯协议(HTTP协议)和 EventSource 接口来处理 Server-sent events 组成,服务器端的响应的内容类型是“text/event-stream”.

openAI 风格rest服务接口

你可参考openai官网或者https://openai.apifox.cn/

普通问答接口

curl https://api.openai.com/v1/chat/completions \
  -H "Content-Type: application/json" \
  -H "Authorization: Bearer $OPENAI_API_KEY" \
  -d '{
     "model": "gpt-4-turbo",
     "messages": [{"role": "user", "content": "Say this is a test!"}],
     "temperature": 0.7
   }'

查询Embedding接口

curl https://api.openai.com/v1/embeddings \
 -H "Content-Type: application/json" \
 -H "Authorization: Bearer $OPENAI_API_KEY" \
 -d '{
  "input": "Your text string goes here",
  "model": "text-embedding-ada-002"
}'

模型微调接口

curl https://api.openai.com/v1/fine_tuning/jobs \
 -H "Content-Type: application/json" \
 -H "Authorization: Bearer $OPENAI_API_KEY" \
 -d '{
    "training_file": "file-prompt-completion.jsonl",
    "model": "gpt-3.5-turbo"
}'

多模态

当前LLM顾名思义,最擅长的是人类的语言文字,我们希望模型还能像人类一样理解图像、声音、视频。 多模态LLM的实现本质上是将不同模态的语义空间统一,并通过大规模预训练和精细对齐,使模型能够自由地在多种模态间转换和推理。随着技术的进步,这类模型正逐步接近人类的多模态认知能力。

DALL-E

Stable Diffusion

Sora

关注大模型的落地应用

如果openai把GPT做到像OS一样,那它也许就会如windows操作系统一样垄断,并且你没有机会也没有必要去自己开发GPT,绝大多数人的归属就是基于它做应用即可。

知识问答

文字创作

写代码

智能控制

GPT强大的理解能力,能够帮人类完成一些事情的感知->理解->决策->响应。 让GPT读、写任何具备API接口能力的服务、设备。

基于基于ID(sid)的物料表示

在搜推广领域,希望模型具有召回、排序某种物料的能力,这意味着LLM模型参数内部要记住这些物料id。怎么做到呢?

大模型应用层框架

AI Agent

Agent代理的意思,显而易见,个人助理。Agent并非ChatGPT升级版,它不仅告诉你“如何做”,更会帮你去做.

Agent = LLM+Planning+Feedback+Tool use

RAG 检索增强生成

LLM 擅长于一般的语言理解与推理,而不是某个具体的知识点。如何为ChatGPT/LLM大语言模型添加额外知识?

当用户提出问题时,系统会根据用户输入来搜索数据存储。 然后将用户问题与匹配结果结合起来,并使用提示(对 AI 或机器学习模型的明确指令)将其发送到 LLM,以生成所需的答案。

文档切块算法 向量数据库

LangChain

LangChain 是一个框架,用于开发由 LLM 驱动的应用程序。

组件包

MCP 协议

模型上下文协议(Model Context Protocol)

A2A 协议

Agent Skills

Reference

大型语言模型(LLM)技术精要 Numbers every LLM Developer should know LLM推理性能优化 Large Language Models: A Survey A Survey on Large Language Models for Recommendation Hands On Large Language Models - Jay Alammar

*****
Written by Lu.dev on 04 February 2023