跳至主要內容

TGI + exllama llama 量化部署方案

Kevin 吴嘉文大约 3 分钟知识笔记NLPAIGC

本文对 Text generation inference + exllama 的 LLaMa 量化服务方案进行单卡 4090 部署测试。

上期内容:vllm vs TGI 部署 llama v2 7B 踩坑笔记open in new window

在上期中我们提到了 TGI 和 vllm 的对比测试,在使用 vllm 和 TGI 对 float16 模型进行部署后,我们能够在单卡 4090 上达到 3.5+ request/秒的吞吐量。

就在几天前 TGI 优化了 exllama,基于之前量化 LLaMa 的测试,exllama 能在控制精度损失的情况下,将模型的推理速度提升。

以下参考 TGI 的官方手册对采用 AUTOGPTQ 量化后的 LLaMa v2 gptq4 权重进行部署:

docker run --rm --name tgi \
    --runtime=nvidia \
    --gpus all \
    -p 5001:5001 \
    -v /home/kevin/models:/models \
    ghcr.io/huggingface/text-generation-inference:1.0.0 \
    --model-id /models/llama2-7b-chat-gptq-int4 \
    --hostname 0.0.0.0 \
    --port 5001 \
    --max-concurrent-requests 256  \
    --quantize gptq \
    --trust-remote-code \
    --max-batch-total-tokens 30000 \
    --sharded false \
    --max-input-length 1024 \
    --validation-workers 4

其中,llama2-7b-chat-gptq-int4 量化采用 AUTOGPTQ 提供的示例量化代码进行量化,量化数据集选择 wikitext:

# git clone AUTOGPTQ 仓库后进入 `examples/quantization` 文件夹
# 修改以下 pretrained_model_dir 和 quantized_model_dir 选择用 Llama-2-7b-chat-hf 量化
python basic_usage_wikitext2.py

当然 TGI 和 GPTQ-for-LLaMa 也提供了 llama 量化脚本,但是对 llama v2 进行 GPTQ 量化时,AUTOGPTQ 的损失总是比较小, 量化后的模型输出也更稳定一些 ,原因未知。

目前 TGI 版本(1.0.0)对本地加载 exllama 模型仍有不少问题,如果遇到了 weight gptq_bits not found 的话,在模型文件夹下加入一个 safetensor,其中储存好 gptq_bits 和 group 就行。具体 exllama 权重加载逻辑可以看 utils.weight.Wight

import torch
from safetensors.torch import save_file

tensors = {
    "gptq_bits": torch.tensor(4),
    "gptq_groupsize": torch.tensor(128)
}
save_file(tensors, "/home/kevin/models/llama2-7b-chat-gptq-int4/gptq_config.safetensors")

目前 TGI 中对量化权重的处理方法不是很兼容 AUTOGPTQ 等 GPTQ 采用的数据储存方式,但有几个 PR 中已经在对此优化。

TGI + EXLLAMA 测试

部署后,发送单一的请求进行速度测试:

###
POST http://127.0.0.1:5001/generate
Content-Type: application/json

{
    "inputs": "Once a upon time,",
    "parameters":{"max_new_tokens":100,"tempareture":0.6}
}

发送请求后 853ms 得到预测结果,平均 117.23 tokens/s。比 TGI + AUTOGPTQ (约 80 tokens/s)快。但还是不如 exllama 官方的推理速度(140+ tokens/s)。

通过 vllm 提供的 server benchmark 文件 benchmark/benchmark_serving.py 进行测试,

  • 测试数据集:ShareGPT_V3_unfiltered_cleaned_split.json
  • num prompt: 100 (随机从 ShareGPT 提供的用户和 GPT 对话数据当中,筛选 100 个问题进行测试)
  • 默认设备为:单卡 4090 + inter i9-13900K。(采用 3070 测试的数据有标注)
  • request 间隔: 每个 request 发送的间隔。
request 间隔(秒)Throughtput (request/s)average speed (tokens/s)lowest speed (tokens/s)
vllm10.955139.4
vllm0.51.6644.9629.41
vllm0.252.4837.624.05
vllm0.053.2426.314.13
TGI float1610.9680.1540.91
TGI float160.51.8174.6232.97
TGI float160.252.6759.3622.59
TGI float160.053.637.394.12
TGI EXLLAMA11.01131.8770.47
TGI EXLLAMA0.51.8697.2844.22
TGI EXLLAMA0.252.9159.7016.66
TGI EXLLAMA0.024.8941.4114.88
TGI Exllama (3070)10.428.580.72
TGI Exllama (3070)0.250.352.390.16
TGI Exllama (3070)0.020.432.610.19

TGI + exllama 使得我们能够在一些小显存上部署模型,如 3070 (8GB)。期待 TGI,vllm 等部署服务对量化部署 llm 的持续优化,让私有部署模型有更好的体验。

上次编辑于:
贡献者: kevinng77