大模型(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的优点有哪些?
- 文本生成的速度:实验多次,发现vLLM的推理速度是最快的
- 高吞吐量服务:支持各种解码算法,比如parallel sampling、beam search等
- 与OpenAI API兼容:如果使用OpenAI API,只需要替换端点的URL即可
📝 通俗解释:vLLM对开发者非常友好,就像你用惯了一个平台的接口,换到另一个支持相同协议的平台时,只需要改个地址就能继续用。
3.3 vLLM的缺点有哪些?
- 添加自定义模型:虽然可以合并自己的模型,但如果模型没有使用与vLLM中现有模型类似的架构,则过程会变得更加复杂。例如,增加Falcon的支持,这似乎很有挑战性
- 缺乏对适配器(LoRA、QLoRA等)的支持:当针对特定任务进行微调时,开源LLM具有重要价值。然而,在当前的实现中,没有单独使用模型和适配器权重的选项,这限制了有效利用此类模型的灵活性
- 缺少权重量化:有时,LLM可能不需要使用GPU内存,这对于减少GPU内存消耗至关重要
📝 通俗解释:vLLM的缺点就像一辆赛车,虽然快,但不太支持自己改装(自定义模型),也不能随意加装配件(适配器),还要占用不少内存。
3.4 vLLM离线批量推理
# 安装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启动与使用
# 启动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
# 创建数据目录
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。
总结对比
| 特性 | vLLM | Text Generation Inference |
|---|---|---|
| 推理速度 | 最快 | 较快 |
| 易用性 | 高(与OpenAI API兼容) | 中(需要Docker) |
| 适配器支持 | 不支持 | 不支持(计划中) |
| 自定义模型 | 较复杂 | 较简单 |
📝 通俗解释:选择哪个框架取决于你的需求——如果追求最高性能且模型架构标准,选vLLM;如果需要更灵活的模型支持和HuggingFace生态,选Text Generation Inference。