管理和减少预热时间¶
本文档提供了在 Intel® Gaudi® 加速器上使用 vLLM 模型部署时减少预热时间的指南。它概述了 HPU 图缓存、分桶策略以及实验性功能的使用,以提高模型性能。
通过 HPU 图缓存减少预热时间¶
Intel Gaudi 软件支持使用 PT_HPU_RECIPE_CACHE_CONFIG 环境变量缓存已编译的 HPU 图。通过重用先前编译的图,可以显著缩短启动时间。
设置此变量需要使用以下格式
其中
RECIPE_CACHE_PATH:用于存储已编译的图谱配方的目录。RECIPE_CACHE_DELETE:一个布尔值,控制缓存行为:当设置为true时,在存储新的图谱编译配方之前会清除现有内容;当设置为false时,会重用存储在RECIPE_CACHE_PATH中的图谱编译配方,从而加快预热速度。RECIPE_CACHE_SIZE_MB:设置缓存目录的最大大小(以 MB 为单位)。如果达到缓存大小限制,PyTorch bridge 会根据文件的创建时间自动删除最旧的配方。我们建议根据模型和用例需求调整缓存目录大小。
图编译过程包括两个阶段:GC 图编译和 HPU 图编译。当启用了 PT_HPU_RECIPE_CACHE_CONFIG 时,通过重用缓存的图谱可以跳过 GC 阶段,从而显著减少总编译时间。然而,HPU 图谱编译步骤仍然会被执行。在以下情况下,图谱需要重新生成
- PyTorch 容器或 Intel® Gaudi® 软件版本发生更改。
- 平台发生更改,例如从 Intel® Gaudi® 2 更改为 Intel® Gaudi® 3。
- 模型张量并行性或数据类型发生更改,例如,从 BF16 更改为 FP8 或从 FP8 更改为 BF16。
存储建议¶
对于跨进程共享缓存的横向扩展场景,我们建议使用本地磁盘。应避免使用 NFS 等远程文件系统,因为它们不支持文件锁定。
在 Kubernetes 环境中,缓存可以存储在 PVC 或 NFS 上,但在使用之前应将其复制到本地磁盘。
有关使用示例,请参阅 Intel Gaudi 教程。
使用 vLLM 进行部署¶
要缓存已编译的 HPU 图谱并减少启动时间,请使用以下方法之一。
服务命令¶
将缓存参数添加到服务命令中,如下例所示,适用于 Llama 3.1 8B
# Store in cache
export PT_HPU_RECIPE_CACHE_CONFIG='/tmp/llama3_8b_recipe_cache/',True,8192
# Replay from cache
export PT_HPU_RECIPE_CACHE_CONFIG='/tmp/llama3_8b_recipe_cache/',False,8192
VLLM_PROMPT_BS_BUCKET_MAX=256 \
VLLM_DECODE_BS_BUCKET_MIN=128 \
VLLM_DECODE_BS_BUCKET_STEP=128 \
VLLM_DECODE_BS_BUCKET_MAX=128 \
VLLM_PROMPT_SEQ_BUCKET_MAX=1024 \
VLLM_DECODE_BLOCK_BUCKET_MAX=1024 \
PT_HPU_WEIGHT_SHARING=0 PT_HPU_MAX_COMPOUND_OP_SIZE=30 PT_HPU_LAZY_MODE=1 PT_HPU_ENABLE_LAZY_COLLECTIVES=true vllm serve meta-llama/Llama-3.1-8B-instruct -tp 1 --weights-load-device cpu --max-model-len 8192
这会产生以下结果
| 精度 | 无缓存 | 有缓存 | 时间缩减 |
|---|---|---|---|
| BF16 | 66 秒 | 23 秒 | 提速约 65% |
| FP8 | 504 秒 | 34 秒 | 提速约 93% |
Docker¶
Dockerfile 中无需进行任何更改,因为配方缓存特定于模型和用例。使用 -e 标志设置环境变量
桶管理¶
vLLM 的预热时间取决于必须编译以支持动态形状的 HPU 图的数量。这些形状受 batch_size、query_length 和 num_context_blocks 的影响。将它们根据 max_num_batched_tokens 进行设置,可确保运行时不会编译额外的图谱。
指数桶¶
VLLM_EXPONENTIAL_BUCKETING=True 标志(自 vLLM 1.21.0-post1 版本起默认启用)将分桶策略从线性更改为指数。这可以将桶的数量和预热时间减少高达 80%,同时通常保持可比的推理性能。然而,在某些配置中,由于填充增加,可能会导致性能略有下降。此设置对于 BF16 和 FP8 模型尤其有效。要使用线性分桶,请将 VLLM_EXPONENTIAL_BUCKETING=False 设置为 False。