text-generation-inference 文档

Gaudi 后端,用于文本生成推断

Hugging Face's logo
加入 Hugging Face 社区

并获得增强的文档体验

开始使用

Gaudi 后端,用于文本生成推断

概述

文本生成推断 (TGI) 已经过优化,可通过 TGI 的 Gaudi 后端在 Gaudi 硬件上运行。

支持的硬件

教程:Gaudi 上 TGI 入门

基本用法

在 Gaudi 上运行 TGI 的最简单方法是使用官方 Docker 镜像

model=meta-llama/Meta-Llama-3.1-8B-Instruct
volume=$PWD/data # share a volume with the Docker container to avoid downloading weights every run
hf_token=YOUR_HF_ACCESS_TOKEN

docker run --runtime=habana --cap-add=sys_nice --ipc=host \
    -p 8080:80 -v $volume:/data -e HF_TOKEN=$hf_token \
    ghcr.io/huggingface/text-generation-inference:3.2.2-gaudi \
    --model-id $model

一旦看到 connected 日志,服务器就可以接受请求了

2024-05-22T19:31:48.302239Z INFO text_generation_router: router/src/main.rs:378: 已连接

您可以在 https://huggingface.co/settings/tokens 找到您的 YOUR_HF_ACCESS_TOKEN。这对于访问像 llama3.1 这样的门控模型是必要的。

发出您的第一个请求

您可以从单独的终端发送请求

curl 127.0.0.1:8080/generate \
    -X POST \
    -d '{"inputs":"What is Deep Learning?","parameters":{"max_new_tokens":32}}' \
    -H 'Content-Type: application/json'

操作指南

您可以在支持的模型部分查看完整支持的模型列表。

例如,要运行 Llama3.1-8B,您可以使用以下命令

model=meta-llama/Meta-Llama-3.1-8B-Instruct
volume=$PWD/data # share a volume with the Docker container to avoid downloading weights every run
hf_token=YOUR_ACCESS_TOKEN

docker run --runtime=habana --cap-add=sys_nice --ipc=host \
    -p 8080:80 -v $volume:/data -e HF_TOKEN=$hf_token \
    ghcr.io/huggingface/text-generation-inference:3.2.2-gaudi \
    --model-id $model
    <text-generation-inference-launcher-arguments>

有关服务参数的完整列表,请参阅launcher-arguments 页面

经过验证的 docker 命令可以在examples/docker_commands 文件夹中找到。

注意:需要 --runtime=habana --cap-add=sys_nice --ipc=host 以使 docker 能够使用 Gaudi 硬件(更多详细信息请参见此处)。

如何启用多卡推理(分片)

TGI-Gaudi 支持多卡推理分片,允许您在多个 Gaudi 卡之间分配负载。建议运行大型模型并加速推理。

例如,在具有 8 个 Gaudi 卡的机器上,您可以运行

docker run --runtime=habana --ipc=host --cap-add=sys_nice \
    -p 8080:80 -v $volume:/data -e HF_TOKEN=$hf_token \
    tgi-gaudi \
    --model-id $model --sharded true --num-shard 8
我们建议在多卡机器上运行时始终使用分片。

如何使用不同的精度格式

BF16 精度(默认)

默认情况下,所有模型都在 Gaudi 硬件上以 BF16 精度运行。

FP8 精度

TGI-Gaudi 支持使用 Intel Neural Compressor (INC) 进行 FP8 精度推理。

要运行 FP8 推理

  1. 使用 Optimum Habana 测量脚本 测量统计信息
  2. 在 TGI 中使用 QUANT_CONFIG 设置运行模型 - 例如 -e QUANT_CONFIG=./quantization_config/maxabs_quant.json

以下 FP8 推理的命令示例基于通过上述第一步完成测量的假设。

Llama3.1-70B 在 8 卡上使用 FP8 精度的示例

model=meta-llama/Meta-Llama-3.1-70B-Instruct
hf_token=YOUR_ACCESS_TOKEN
volume=$PWD/data   # share a volume with the Docker container to avoid downloading weights every run

docker run -p 8080:80 \
   --runtime=habana \
   --cap-add=sys_nice \
   --ipc=host \
   -v $volume:/data \
   -v $PWD/quantization_config:/usr/src/quantization_config \
   -v $PWD/hqt_output:/usr/src/hqt_output \
   -e QUANT_CONFIG=./quantization_config/maxabs_quant.json \
   -e HF_TOKEN=$hf_token \
   -e MAX_TOTAL_TOKENS=2048 \
   -e BATCH_BUCKET_SIZE=256 \
   -e PREFILL_BATCH_BUCKET_SIZE=4 \
   -e PAD_SEQUENCE_TO_MULTIPLE_OF=64 \
   ghcr.io/huggingface/text-generation-inference:3.2.2-gaudi \
   --model-id $model \
   --sharded true --num-shard 8 \
   --max-input-tokens 1024 --max-total-tokens 2048 \
   --max-batch-prefill-tokens 4096 --max-batch-size 256 \
   --max-waiting-tokens 7 --waiting-served-ratio 1.2 --max-concurrent-requests 512

如何运行视觉语言模型 (VLM)

Gaudi 支持 VLM 推理。

Llava-v1.6-Mistral-7B 在 1 卡上的示例

通过以下命令启动 TGI 服务器

model=llava-hf/llava-v1.6-mistral-7b-hf
volume=$PWD/data   # share a volume with the Docker container to avoid downloading weights every run

docker run -p 8080:80 \
   --runtime=habana \
   --cap-add=sys_nice \
   --ipc=host \
   -v $volume:/data \
    -e PREFILL_BATCH_BUCKET_SIZE=1 \
    -e BATCH_BUCKET_SIZE=1 \
   ghcr.io/huggingface/text-generation-inference:3.2.2-gaudi \
   --model-id $model \
   --max-input-tokens 4096 --max-batch-prefill-tokens 16384 \
   --max-total-tokens 8192 --max-batch-size 4

然后,您可以通过以下命令向服务器发送请求

curl -N 127.0.0.1:8080/generate \
    -X POST \
    -d '{"inputs":"![](https://huggingface.co/datasets/huggingface/documentation-images/resolve/main/transformers/rabbit.png)What is this a picture of?\n\n","parameters":{"max_new_tokens":32}}' \
    -H 'Content-Type: application/json'

注意:在 Llava-v1.6-Mistral-7B 中,图像通常占用 2000 个输入令牌。例如,512x512 大小的图像由 2800 个令牌表示。因此,max-input-tokens 必须大于与图像关联的令牌数。否则,图像可能会被截断。我们将 BASE_IMAGE_TOKENS=2048 设置为默认图像令牌值。这是 max-input-tokens 的最小值。您可以覆盖环境变量 BASE_IMAGE_TOKENS 以更改此值。预热将生成输入长度从 BASE_IMAGE_TOKENSmax-input-tokens 的图。对于 Llava-v1.6-Mistral-7B,max-batch-prefill-tokens 的值为 16384,计算方法如下:prefill_batch_size = max-batch-prefill-tokens / max-input-tokens

如何进行性能基准测试

我们建议使用 inference-benchmarker 工具 来对 Gaudi 硬件的性能进行基准测试。

此基准测试工具模拟用户请求并测量模型在实际场景中的性能。

要在同一机器上运行它,您可以执行以下操作

MODEL=meta-llama/Llama-3.1-8B-Instruct
HF_TOKEN=<your HF READ token>
# run a benchmark to evaluate the performance of the model for chat use case
# we mount results to the current directory
docker run \
    --rm \
    -it \
    --net host \
    -v $(pwd):/opt/inference-benchmarker/results \
    -e "HF_TOKEN=$HF_TOKEN" \
    ghcr.io/huggingface/inference-benchmarker:latest \
    inference-benchmarker \
    --tokenizer-name "$MODEL" \
    --url http://localhost:8080 \
    --profile chat

有关更多详细信息,请参阅 inference-benchmarker README

如何进行性能分析

要收集性能分析,您需要设置以下环境变量

名称 默认值 描述
PROF_WAITSTEP 整数 0 控制分析等待步骤
PROF_WARMUPSTEP 整数 0 控制分析预热步骤
PROF_STEP 整数 0 启用/禁用分析,控制分析活动步骤
PROF_PATH 字符串 /tmp/hpu_profile 定义分析文件夹
PROF_RANKS 字符串 0 要分析的排名逗号分隔列表
PROF_RECORD_SHAPES True/False False 控制分析器中的 record_shapes 选项

要使用这些环境变量,请使用 -e 标志将它们添加到您的 docker run 命令中。例如

docker run --runtime=habana --ipc=host --cap-add=sys_nice \
    -p 8080:80 -v $volume:/data -e HF_TOKEN=$hf_token \
    -e PROF_WAITSTEP=10 \
    -e PROF_WARMUPSTEP=10 \
    -e PROF_STEP=1 \
    -e PROF_PATH=/tmp/hpu_profile \
    -e PROF_RANKS=0 \
    -e PROF_RECORD_SHAPES=True \
    ghcr.io/huggingface/text-generation-inference:3.2.2-gaudi \
    --model-id $model

解释:了解 Gaudi 上的 TGI

预热过程

为了确保最佳性能,预热在每次服务器运行时开始执行。此过程根据提供的参数创建具有各种输入形状的查询,并运行基本的 TGI 操作(预填充、解码、连接)。

注意:模型预热可能需要几分钟,特别是对于 FP8 推理。为了后续运行更快,请参考 Disk Caching Eviction Policy

理解参数调优

序列长度参数

  • --max-input-tokens 是最大可能的输入提示长度。默认值为 4095
  • --max-total-tokens 是序列(输入和输出)的最大可能总长度。默认值为 4096

批大小参数

  • 对于预填充操作,请将 --max-batch-prefill-tokens 设置为 bs * max-input-tokens,其中 bs 是您预期的最大预填充批大小。
  • 对于解码操作,请将 --max-batch-size 设置为 bs,其中 bs 是您预期的最大解码批大小。
  • 请注意,批大小将始终填充为 BATCH_BUCKET_SIZEPREFILL_BATCH_BUCKET_SIZE 最接近的倍数。

性能和内存参数

  • PAD_SEQUENCE_TO_MULTIPLE_OF 决定了输入长度桶的大小。由于预热为每个桶创建多个图,因此按输入序列长度比例调整该值非常重要。否则,可能会观察到一些内存不足的问题。
  • ENABLE_HPU_GRAPH 启用 HPU 图的使用,这对性能结果至关重要。建议保留的值为 true

序列长度参数

  • --max-input-tokens:最大可能的输入提示长度(默认值:4095)
  • --max-total-tokens:最大可能的总序列长度(输入 + 输出)(默认值:4096)

批大小参数

  • --max-batch-prefill-tokens:设置为 bs * max-input-tokens,其中 bs 是您预期的最大预填充批大小
  • --max-batch-size:设置为 bs,其中 bs 是您预期的最大解码批大小
  • 注意:批大小会填充为 BATCH_BUCKET_SIZEPREFILL_BATCH_BUCKET_SIZE 最接近的倍数

参考

本节包含有关 Gaudi 后端的参考信息。

支持的模型

Text Generation Inference 允许在 Gaudi 硬件上服务优化的模型。以下部分列出了 Gaudi 支持哪些模型(VLMs 和 LLMs)。

大型语言模型 (LLMs)

视觉-语言模型 (VLMs)

我们还在尽力支持参数数量不同但使用相同模型架构的模型,但这些模型未经测试。例如,gaudi 后端支持 meta-llama/Llama-3.2-1B,因为该架构是标准的 llama3 架构。如果您在使用模型时遇到问题,请在 Gaudi 后端存储库上提交问题。

环境变量

下表包含可用于配置 Gaudi 后端的环境变量

名称 默认值 描述 用法
ENABLE_HPU_GRAPH True/False True 启用 hpu 图,或不启用 在 docker run 命令中添加 -e
LIMIT_HPU_GRAPH True/False True 跳过预填充的 HPU 图使用以节省内存,对于长序列/解码长度(例如 300/212)设置为 True 在 docker run 命令中添加 -e
BATCH_BUCKET_SIZE 整数 8 解码操作的批大小将四舍五入到最接近此数字的倍数。这限制了缓存图的数量 在 docker run 命令中添加 -e
PREFILL_BATCH_BUCKET_SIZE 整数 4 预填充操作的批大小将四舍五入到最接近此数字的倍数。这限制了缓存图的数量 在 docker run 命令中添加 -e
PAD_SEQUENCE_TO_MULTIPLE_OF 整数 128 对于预填充操作,序列将填充为所提供值的倍数。 在 docker run 命令中添加 -e
SKIP_TOKENIZER_IN_TGI True/False False 跳过输入/输出处理的 tokenizer 在 docker run 命令中添加 -e
WARMUP_ENABLED True/False True 在服务器初始化期间启用预热以重新编译所有图。这可能会增加 TGI 设置时间。 在 docker run 命令中添加 -e
QUEUE_THRESHOLD_MS 整数 120 控制请求被视为过期并优先处理的阈值。否则,较短的请求将被优先处理。 在 docker run 命令中添加 -e
USE_FLASH_ATTENTION True/False True 是否启用 Habana Flash Attention,前提是模型支持它。请参考 https://docs.habana.ai/en/latest/PyTorch/Model_Optimization_PyTorch/Optimization_in_PyTorch_Models.html?highlight=fusedsdpa#using-fused-scaled-dot-product-attention-fusedsdpa 在 docker run 命令中添加 -e
FLASH_ATTENTION_RECOMPUTE True/False True 是否在首次生成 token 时在重新计算模式下启用 Habana Flash Attention。 在 docker run 命令中添加 -e

贡献

欢迎为 TGI-Gaudi 项目做出贡献。请参考贡献指南

为 TGI 上的 Gaudi 贡献的指南: 所有更改都应在 backends/gaudi 文件夹中进行。通常,您应避免修改路由器、启动器或基准测试以适应 Gaudi 硬件,因为所有 Gaudi 特定的逻辑都应包含在 backends/gaudi 文件夹中。

从源代码构建 Docker 镜像

从源代码构建 Docker 镜像

make -C backends/gaudi image

这将构建镜像并将其另存为 tgi-gaudi。然后,您可以使用此镜像运行 TGI-Gaudi

model=meta-llama/Meta-Llama-3.1-8B-Instruct
volume=$PWD/data
hf_token=YOUR_ACCESS_TOKEN

docker run --runtime=habana --ipc=host --cap-add=sys_nice \
    -p 8080:80 -v $volume:/data -e HF_TOKEN=$hf_token \
    tgi-gaudi \
    --model-id $model

有关更多详细信息,请参阅 Gaudi 后端的 READMEGaudi 后端的 Makefile

< > 更新 on GitHub