Skip to content

大模型(LLMs)加速篇

来源:AiGC面试宝典 作者:宁静致远 日期:2023年09月29日


1. 当前优化模型最主要技术手段有哪些?

  • 算法层面:蒸馏、量化
  • 软件层面:计算图优化、模型编译
  • 硬件层面:FP8(NVIDIA H系列GPU开始支持FP8,兼有FP16的稳定性和INT8的速度)

📝 通俗解释:就像优化一辆汽车,算法层面是换更高效的零件(蒸馏、量化),软件层面是优化发动机的工作方式(计算图优化),硬件层面是使用更好的燃料(FP8)。三者结合让模型跑得更快、更省资源。


2. 推理加速框架有哪些?都有什么特点?

2.1 FasterTransformer

英伟达推出的FasterTransformer不修改模型架构,而是在计算加速层面优化Transformer的encoder和decoder模块。具体包括:

  • 尽可能多地融合除了GEMM以外的操作
  • 支持FP16、INT8、FP8
  • 移除encoder输入中无用的padding来减少计算开销

📝 通俗解释:FasterTransformer就像一个智能的"交通调度员",它会合并那些零散的小任务(融合操作),去掉没必要的空位(移除padding),让GPU能连续高效地工作。

2.2 TurboTransformers

腾讯推出的TurboTransformers由computation runtime及serving framework组成,加速推理框架适用于CPU和GPU,最重要的是,它可以无需预处理便可处理变长的输入序列。具体包括:

  • 与FasterTransformer类似,它融合了除GEMM之外的操作以减少计算量
  • Smart batching:对于一个batch内不同长度的序列,它也最小化了zero-padding开销
  • 对LayerNorm和Softmax进行批处理,使它们更适合并行计算
  • 引入了模型感知分配器,以确保在可变长度请求服务期间内存占用较小

📝 通俗解释:TurboTransformers的smart batching就像把不同长度的句子拼在一起批量处理,尽量少填空白字符,这样就不会浪费计算资源。


3. vLLM篇

3.1 vLLM的功能有哪些?

  • Continuous batching:有iteration-level的调度机制,每次迭代batch大小都有所变化,因此vLLM在大量查询下仍可以很好地工作
  • PagedAttention:受操作系统中虚拟内存和分页的经典思想启发的注意力算法,这就是模型加速的秘诀

📝 通俗解释:Continuous batching就像餐厅翻台,每次有客人吃完就立即安排新客人坐下,而不是等到一桌完全吃完。PagedAttention类似于操作系统的内存管理,把注意力计算分成小页面,更灵活地利用内存。

3.2 vLLM的优点有哪些?

  1. 文本生成的速度:实验多次,发现vLLM的推理速度是最快的
  2. 高吞吐量服务:支持各种解码算法,比如parallel sampling、beam search等
  3. 与OpenAI API兼容:如果使用OpenAI API,只需要替换端点的URL即可

📝 通俗解释:vLLM对开发者非常友好,就像你用惯了一个平台的接口,换到另一个支持相同协议的平台时,只需要改个地址就能继续用。

3.3 vLLM的缺点有哪些?

  1. 添加自定义模型:虽然可以合并自己的模型,但如果模型没有使用与vLLM中现有模型类似的架构,则过程会变得更加复杂。例如,增加Falcon的支持,这似乎很有挑战性
  2. 缺乏对适配器(LoRA、QLoRA等)的支持:当针对特定任务进行微调时,开源LLM具有重要价值。然而,在当前的实现中,没有单独使用模型和适配器权重的选项,这限制了有效利用此类模型的灵活性
  3. 缺少权重量化:有时,LLM可能不需要使用GPU内存,这对于减少GPU内存消耗至关重要

📝 通俗解释:vLLM的缺点就像一辆赛车,虽然快,但不太支持自己改装(自定义模型),也不能随意加装配件(适配器),还要占用不少内存。

3.4 vLLM离线批量推理

python
# 安装vLLM
# pip install vllm

from vllm import LLM, SamplingParams

# 准备输入提示
prompts = [
    "Funniest joke ever:",
    "The capital of France is",
    "The future of AI is",
]

# 设置采样参数
sampling_params = SamplingParams(temperature=0.95, top_p=0.95, max_tokens=200)

# 加载模型
llm = LLM(model="huggyllama/llama-13b")

# 批量生成
outputs = llm.generate(prompts, sampling_params)

# 打印结果
for output in outputs:
    prompt = output.prompt
    generated_text = output.outputs[0].text
    print(f"Prompt: {prompt!r}, Generated text: {generated_text!r}")

📝 通俗解释:这段代码展示了如何用vLLM一次性处理多条请求,就像一个高效的批量处理中心,一次性处理多個人的请求,而不是一个个排队等。

3.5 vLLM API Server启动与使用

bash
# 启动API服务
python -m vllm.entrypoints.api_server --env MODEL_NAME=huggyllama/llama-13b

# 在shell中查询模型
curl http://localhost:8000/generate \
  -d '{
    "prompt": "Funniest joke ever:",
    "n": 1,
    "temperature": 0.95,
    "max_tokens": 200
  }'

📝 通俗解释:启动API服务就像开了一个24小时营业的餐厅,外部可以通过HTTP请求"点餐"(发送prompt),服务器会返回"菜品"(生成的文本)。


4. Text Generation Inference篇

4.1 介绍一下Text Generation Inference?

Text Generation Inference是用于文本生成推理的Rust、Python和gRPC服务器,在HuggingFace中已有LLM推理API使用。

📝 通俗解释:Text Generation Inference是HuggingFace推出的推理服务框架,用Rust(高性能)和Python(易用)两种语言编写,就像一个专业的"文本生成工厂"。

4.2 Text Generation Inference的功能有哪些?

  • 内置服务评估:可以监控服务器负载并深入了解其性能
  • 使用Flash Attention(v2)和Paged Attention优化transformer推理代码:并非所有模型都内置了对这些优化的支持,该技术可以对未使用该技术的模型进行优化

📝 通俗解释:内置服务评估就像工厂的监控仪表盘,能实时看服务器累不累。Flash Attention和Paged Attention是两种加速注意力计算的技术,就像给工厂引进了更高效的流水线。

4.3 Text Generation Inference的优点有哪些?

  • 所有依赖项都安装在Docker中:会得到一个现成的环境
  • 支持HuggingFace模型:轻松运行自己的模型或使用任何HuggingFace模型中心的模型
  • 对模型推理的控制:该框架提供了一系列管理模型推理的选项,包括精度调整、量化、张量并行性、重复惩罚等

📝 通俗解释:Docker预装好所有环境就像买了一个"精装房",拎包入住。张量并行性就像多人协作干活,把大任务分给多个GPU同时处理。

4.4 Text Generation Inference的缺点有哪些?

  • 缺乏对适配器的支持:需要注意的是,尽管可以使用适配器部署LLM(可以参考相关教程),但目前还没有官方支持或文档
  • 从源代码(Rust+CUDA内核)编译:对于不熟悉Rust的人,将客户化代码纳入库中变得很有挑战性
  • 文档不完整:所有信息都可以在项目的自述文件中找到。尽管它涵盖了基础知识,但必须在问题或源代码中搜索更多细节

📝 通俗解释:Text Generation Inference的缺点是自定义空间有限,文档不够详细,就像一个操作说明书写得比较简略的设备。

4.5 Text Generation Inference使用Docker运行Web Server

bash
# 创建数据目录
mkdir data

# 运行Docker容器
docker run --gpus all --shm-size 1g -p 8080:80 \
  -v data:/data ghcr.io/huggingface/text-generation-inference:0.9 \
  --model-id huggyllama/llama-13b \
  --num-shard 1

📝 通俗解释:这条命令用Docker启动了一个推理服务,就像用一个标准化的"集装箱"部署服务,保证在任何机器上都能跑起来。--gpus all让容器可以使用所有GPU,-p 8080:80是把容器的80端口映射到本地8080。


总结对比

特性vLLMText Generation Inference
推理速度最快较快
易用性高(与OpenAI API兼容)中(需要Docker)
适配器支持不支持不支持(计划中)
自定义模型较复杂较简单

📝 通俗解释:选择哪个框架取决于你的需求——如果追求最高性能且模型架构标准,选vLLM;如果需要更灵活的模型支持和HuggingFace生态,选Text Generation Inference。

基于 MIT 许可发布