text-generation-inference Neuron 后端部署指南:在 AWS Trainium 与 Inferentia 上运行 TGI
【免费下载链接】text-generation-inferenceLarge Language Model Text Generation Inference项目地址: https://gitcode.com/GitHub_Trending/te/text-generation-inference
本指南以 TGI 仓库的 Neuron 后端文档(docs/source/backends/neuron.md)为主线,系统讲解如何在 AWS Trainium 1 与 Inferentia 2 芯片上部署 text-generation-inference 服务。你将掌握从 Hugging Face Hub 直接拉起服务、使用 Neuron Model Cache 免导出运行标准模型、部署本地已导出 Neuron 模型,以及正确配置 batch size、输入长度等静态维度参数的完整实战方案。
一、Neuron 后端概述与硬件支持
Neuron 后端是 TGI 针对 AWS Trainium 与 Inferentia 系列芯片专门实现的推理后端,目标是把 TGI 的完整服务能力(HTTP 路由、动态批处理调度)与 AWS Neuron SDK 的编译执行能力结合起来。
当前仓库支持的硬件目标如下:
- Trainium 1(trn1 / trn1n 实例);
- Inferentia 2(inf2 实例)。
从仓库结构看,Neuron 后端由三部分组成(见 backends/neuron/README.md):
- AWS Neuron SDK(neuronx-cc、torch-neuronx、neuronx-distributed、libneuronxla 等运行时与编译器);
- TGI v2 的 launcher 与 router(负责 HTTP 入口、请求队列、连续批处理调度);
- Neuron 专用推理服务器(位于 backends/neuron/server 下的 Python gRPC 服务,负责模型的 prefill/decode 与 token 选择)。
这种三层结构决定了其部署形态:用户通过 Docker 镜像启动容器,容器内的 entrypoint 先执行 tgi_entry_point.py 推导出正确的服务环境变量,再启动text-generation-launcher拉起 router 与 Python 推理服务器。
支持的功能特性
Neuron 后端支持 TGI 的基础功能:
- 连续批处理(continuous batching):新请求可以在解码过程中随时插入,无需等整个批次结束;
- Token 流式输出(token streaming):通过
/generate_stream逐 token 返回结果; - 贪婪搜索与多项式采样:复用 transformers 的生成策略(transformers 生成策略文档)。
从源码看,这些能力分别由 generator.py 中的NeuronGenerator类实现:prefill()负责新请求的接入与 slot 分配,decode()负责对已 prefill 的批次逐 token 解码,而 token 选择逻辑(贪婪或采样)通过TokenSelector(来自optimum.neuron.generation)完成。仓库测试 test_continuous_batching.py 专门验证了"请求 1 解码到一半时插入请求 2,两者最终输出一致"的连续批处理行为,可以作为功能正确性的参考依据。
二、从 Hugging Face Hub 部署服务(模型卡方式)
最简单的部署路径是直接利用模型卡片上提供的部署入口:
- 打开目标模型页面,点击右侧的Deploy按钮;
- 选择部署服务(支持Inference Endpoints与SageMaker);
- 硬件类型选择AWS Trainium & Inferentia;
- 按页面提示完成后续配置。
这种方式由托管平台负责 Neuron 设备挂载、镜像拉取等基础设施细节,适合快速验证或生产托管场景。
三、在专用主机上部署服务(Docker 方式)
在自有 EC2 实例上部署时,直接运行 Neuron 版的 TGI 容器即可。容器启动命令分为两组参数:
docker run <system_parameters> ghcr.io/huggingface/text-generation-inference:<VERSION>-neuron <service_parameters>- system parameters:负责宿主机与容器之间的端口、数据卷、Neuron 设备映射;
- service parameters:透传给
text-generation-launcher(即 TGI 的服务参数,如--model-id、--max-batch-size等)。
注意:<VERSION>需替换为具体的 TGI 版本号,例如3.3.5-neuron。
部署前需要明确一点:Neuron 模型是预编译产物。Neuron 后端支持两种模型来源:
- 直接部署已导出为 Neuron 格式的模型;
- 借助Neuron Model Cache在启动时自动导出你自己的普通模型。
3.1 通用系统参数(system parameters)
无论采用哪种模型来源,以下系统级配置都强烈建议遵循:
- 共享数据卷挂载到
/data:容器内/data是模型缓存目录,挂载共享卷可以显著加速后续服务实例的启动(避免重复下载/导出); - 正确暴露 Neuron 设备:每个 Neuron 设备包含2 个 core,因此要在 2 个 core 上部署至少需要暴露 1 个设备。生产环境推荐用
--device选项显式、逐个指定设备(例如--device /dev/neuron0,有几个设备就重复几次); - 快速本地测试:可选用
privileged模式启动容器以一次性访问全部 Neuron 设备(不推荐生产使用); HF_TOKEN:访问 gated 仓库(如 Llama 系列)时需要通过-e HF_TOKEN=${HF_TOKEN}传入令牌。
下面是一个只暴露第一个设备的服务实例化示例:
docker run -p 8080:80 \ -v $(pwd)/data:/data \ --device=/dev/neuron0 \ -e HF_TOKEN=${HF_TOKEN} \ ghcr.io/huggingface/text-generation-inference:<VERSION>-neuron \ <service_parameters>3.2 使用 Hub 上的标准模型(推荐,借助 Neuron Model Cache)
我们维护了一个覆盖主流架构与常用部署参数的Neuron Model Cache(位于aws-neuron/optimum-neuron-cache)。因此,即便模型没有预先导出为 Neuron 格式,也可以快速拉起服务,但需满足两个前提:
- 启动时必须指定导出参数(或使用默认参数);
- 目标模型的配置必须已在缓存中。
以下示例展示了如何从 Hub 标准模型直接部署meta-llama/Meta-Llama-3-8B(8 个 core、fp16 精度):
export HF_TOKEN=<YOUR_TOKEN> docker run -p 8080:80 \ -v $(pwd)/data:/data \ --device=/dev/neuron0 \ --device=/dev/neuron1 \ --device=/dev/neuron2 \ --device=/dev/neuron3 \ -e HF_TOKEN=${HF_TOKEN} \ -e HF_AUTO_CAST_TYPE="fp16" \ -e HF_NUM_CORES=8 \ ghcr.io/huggingface/text-generation-inference:<VERSION>-neuron \ --model-id meta-llama/Meta-Llama-3-8B \ --max-batch-size 1 \ --max-input-length 3164 \ --max-total-tokens 4096关于HF_AUTO_CAST_TYPE与HF_NUM_CORES这两个环境变量,从 tgi_env.py 可以看出它们是 Neuron 后端服务器侧的关键配置:
HF_NUM_CORES:指定编译/运行所需的 Neuron core 数量(即张量并行度tp_degree);HF_AUTO_CAST_TYPE:指定模型权重与激活的自动转换精度类型(如fp16)。
这两个变量连同 router 侧的MAX_BATCH_SIZE、MAX_TOTAL_TOKENS、MAX_INPUT_TOKENS、MAX_BATCH_PREFILL_TOKENS,共同构成 Neuron 后端完整的环境变量集合。parse_cmdline_and_set_env()会把命令行参数转换为对应的环境变量;而当模型配置不完整时,model.py 的get_export_kwargs_from_env()会从这些环境变量中提取导出参数(batch_size、sequence_length、num_cores、auto_cast_type),配合optimum-neuron在启动时完成模型导出。
3.3 使用已导出到本地路径的模型
如果已经用optimum-cli把模型导出为 Neuron 格式,可以将其放到共享卷内,然后通过本地路径启动服务:
docker run -p 8080:80 \ -v $(pwd)/data:/data \ --device=/dev/neuron0 \ --device=/dev/neuron1 \ ghcr.io/huggingface/text-generation-inference:<VERSION>-neuron \ --model-id /data/<neuron_model_path>注意:
- 此时无需指定任何服务参数,所有参数都会从模型导出配置中推导出来;
- 但必须暴露足够数量的设备,以匹配导出阶段指定的 core 数量。
这一推导逻辑的实现位于 tgi_env.py 的neuron_config_to_env():它会读取模型的 NeuronConfig(含batch_size、sequence_length、tp_degree、auto_cast_type),将其写入环境变量文件(MAX_BATCH_SIZE、MAX_TOTAL_TOKENS、HF_NUM_CORES、HF_AUTO_CAST_TYPE),若未显式指定,则自动令MAX_INPUT_TOKENS = sequence_length // 2、MAX_BATCH_PREFILL_TOKENS = batch_size × MAX_INPUT_TOKENS,并写入同一文件。该文件随后由 tgi-entrypoint.sh 通过source加载,再启动text-generation-launcher。
3.4 使用 Hub 上的 Neuron 模型
若模型已以 Neuron 格式推送到 Hugging Face Hub,即可在组织内直接共享并部署,无需任何导出步骤:
docker run -p 8080:80 \ -v $(pwd)/data:/data \ --device=/dev/neuron0 \ --device=/dev/neuron1 \ -e HF_TOKEN=${HF_TOKEN} \ ghcr.io/huggingface/text-generation-inference:<VERSION>-neuron \ --model-id <organization>/<neuron-model>从 model.py 的fetch_model()流程看,服务端会先尝试读取模型的NeuronConfig:如果能读到,说明是 Neuron 模型,直接snapshot_download拉取(忽略*.bin权重文件);读不到则走 Neuron Model Cache 的兼容条目查找逻辑,找不到兼容缓存时报错并提示去请求缓存或自行导出。
3.5 兼容性校验机制(源码视角)
Neuron 后端在加载模型前会做严格的环境兼容性检查(见 tgi_env.py 的check_env_and_neuron_config_compatibility()),主要校验项包括:
| 校验项 | 规则 |
|---|---|
| core 数量 | 模型tp_degree不得超过本机可用 core 数(available_cores) |
| 编译器版本 | 本地neuronxcc版本必须与模型编译时版本一致(Hub 缓存条目强制校验) |
MAX_BATCH_SIZE | 不得超过 Neuron 配置中的batch_size |
MAX_TOTAL_TOKENS | 不得超过 Neuron 配置中的sequence_length |
HF_NUM_CORES | 不得超过 Neuron 配置中的tp_degree |
HF_AUTO_CAST_TYPE | 必须与模型配置中的auto_cast_type/torch_dtype一致 |
MAX_INPUT_TOKENS | 必须小于模型序列长度 |
这解释了为什么文档反复强调"服务参数必须与模型导出配置对齐"——任何一项不匹配都会导致启动失败或加载报错。
四、服务参数选择:静态输入维度的约束
查看可用服务参数列表,可以在不带任何服务参数的情况下运行:
docker run ghcr.io/huggingface/text-generation-inference:<VERSION>-neuron --help推理端点的配置本质上是吞吐量与延迟之间的权衡:并行处理的请求越多,吞吐越高,但延迟也会随之增加。
4.1 Neuron 模型的静态维度特性
与 GPU 后端不同,Neuron 模型的输入维度是静态的[batch_size, max_length]——这是由编译期固定下来的,无法在运行时动态调整。这给以下参数带来了硬性约束:
--max-batch-size:必须等于模型编译时的batch size;--max-input-length:必须小于模型编译时的max_length;--max-total-tokens:必须等于模型编译时的max_length(按单请求计)。
此外,虽然不是严格必需,但为了高效的 prefill(预填充阶段),建议将:
--max-batch-prefill-tokens设置为batch_size × max-input-length。
这些约束在源码中有直接印证:NeuronGenerator.warmup()(generator.py)会校验请求批次大小不得超过模型neuron_config.batch_size,否则抛出错误并提示"请确保编译模型的 batch_size 与传入 TGI 的 batch_size 一致(通常通过环境变量MAX_BATCH_SIZE设置)"。而prefill()在分配 slot 时,如果空 slot 数量不足以容纳新请求,也会要求把max_batch_size与静态 batch size 对齐。
从 tgi_env.py 的tgi_router_env_vars可以看到,这四个参数在 router 侧对应的环境变量分别是:
| 服务参数 | 环境变量 |
|---|---|
--max-batch-size | MAX_BATCH_SIZE |
--max-total-tokens | MAX_TOTAL_TOKENS |
--max-input-tokens | MAX_INPUT_TOKENS(兼容旧名MAX_INPUT_LENGTH) |
--max-batch-prefill-tokens | MAX_BATCH_PREFILL_TOKENS |
parse_cmdline_and_set_env()的逻辑是:命令行参数优先,仅当命令行未指定且环境变量已存在时才使用环境变量值,并在设置完成后统一写入os.environ,保证 router 与 server 拿到一致的值。
4.2 如何选择合适的 batch size
如前所述,Neuron 模型静态 batch size 会直接影响端点的延迟与吞吐,因此选择时必须同时考虑性能目标与内存容量两个维度:
- 内存约束是硬性下限:必须在实例可用的总设备内存内装下指定
batch_size的模型。每个 Neuron core 提供16GB 显存,每个设备有2 个 core(即每个设备共 32GB)。例如inf2.24xlarge这类实例的总可用内存由实例规格决定,选型前请先核对型号规格; - 性能权衡:更大的 batch size 提高吞吐但增加单请求延迟,更小的 batch size 反之。建议结合自身场景(在线低延迟 or 离线高吞吐)在实测中调优。
五、查询服务(/generate 与 /generate_stream)
服务启动后,可以通过 TGI 的标准 HTTP 路由查询模型:
非流式生成(/generate):
curl 127.0.0.1:8080/generate \ -X POST \ -d '{"inputs":"What is Deep Learning?","parameters":{"max_new_tokens":20}}' \ -H 'Content-Type: application/json'流式生成(/generate_stream):
curl 127.0.0.1:8080/generate_stream \ -X POST \ -d '{"inputs":"What is Deep Learning?","parameters":{"max_new_tokens":20}}' \ -H 'Content-Type: application/json'提示:如果服务不在本机,请把
127.0.0.1:8080替换为实际的 IP 地址与端口。
流式输出的底层实现在 generator.py 的Slot._decode_next_tokens()中:它会以 token 偏移为游标,只解码新增 token 对应的文本片段,并处理 UTF-8 多字节字符可能被截断的情况(检测到不完整的字节序列时暂不返回,等待下一个 token 补齐),从而保证中文、emoji 等内容的流式输出不会出现乱码。仓库测试 test_generator_slot.py 用空格文本、中文、emoji 三类用例验证了这一解码逻辑。
六、服务端架构与请求处理流程(源码视角)
6.1 启动链路
Neuron 容器的启动链路清晰可循(Dockerfile.neuron、tgi-entrypoint.sh):
- 容器
ENTRYPOINT指向 tgi-entrypoint.sh; - 脚本调用 tgi_entry_point.py:解析命令行参数与环境变量,若所有
tgi_env_vars均已设置则直接跳过;否则读取模型的 NeuronConfig 或查找 Hub 缓存中的兼容配置,通过neuron_config_to_env()把推导结果写入临时环境变量文件; - 脚本
source该环境变量文件,exec text-generation-launcher $@启动 TGI launcher(router); - launcher 拉起 Python 推理服务器(server.py),以 gRPC 协议在
unix://<uds_path>-0上提供服务。
6.2 gRPC 服务与请求处理
server.py 中的TextGenerationService实现了 TGI 的 gRPC 协议(proto 定义见 proto/generate.proto 与 proto/v3/generate.proto),核心 RPC 包括:
Info/Health:服务元信息与健康检查;Prefill:新请求的预填充(首次前向,生成第一个 token);Decode:基于 KV cache 逐 token 解码;FilterBatch/ClearCache:批次过滤与缓存清理;Warmup:启动时验证硬件能否支撑目标负载,返回模型支持的最大 token 数。
所有异常统一由 interceptor.py 的ExceptionInterceptor捕获并转为 gRPC INTERNAL 状态码返回。NeuronGenerator内部用固定数量的Slot(数量等于静态batch_size)表示批次槽位:EMPTY(空闲)、READY(就绪)、PAUSE(暂停,KV cache 仍会填充),prefill 时把新请求分配到空闲 slot,decode 期间通过暂停/恢复机制实现连续批处理。
七、构建自定义 Neuron 镜像(可选)
若需定制镜像(例如修改 Neuron SDK 版本或预装依赖),可以使用仓库提供的构建入口:
make -C backends/neuron image该目标(backends/neuron/Makefile)会基于 Dockerfile.neuron 构建text-generation-inference:<VERSION>-neuron镜像,并额外打上latest-neuron标签。镜像内部固定安装了aws-neuronx-dkms、torch-neuronx、neuronx-cc、optimum-neuron等 Neuron 软件栈,并在base阶段安装 CPU 版 PyTorch 以避免引入 CUDA 依赖。
八、部署注意事项小结
- 版本匹配:容器 tag 使用
ghcr.io/huggingface/text-generation-inference:<VERSION>-neuron,请按实际发布版本替换<VERSION>; - 设备数量:每个 Neuron 设备 2 个 core,暴露设备数 × 2 必须 ≥ 模型
tp_degree;生产环境用--device显式暴露,不要用privileged; - 参数对齐:
--max-batch-size、--max-total-tokens必须与模型导出配置完全一致,--max-input-length必须小于序列长度;本地 Neuron 模型会自动推导参数,无需手动指定; - 数据卷:务必把
/data挂载为持久化卷,避免重复下载与导出; - gated 模型:记得通过
-e HF_TOKEN传入有效的 Hugging Face 令牌; - 内存预算:batch size 的选择受限于每 core 16GB(每设备 2 core)的总显存容量,选型前先核对实例规格。
至此,你已经可以从零开始,在 AWS Trainium / Inferentia 实例上通过 Docker 部署 Neuron 后端的 TGI 服务,并正确配置静态维度参数、完成流式与非流式请求的调用。更深入的架构背景可参阅 docs/source/architecture.md,GPU 与 Trainium 的实例化部署差异可对照 docs/source/installation.md 与 docs/source/installation_inferentia.md。
【免费下载链接】text-generation-inferenceLarge Language Model Text Generation Inference项目地址: https://gitcode.com/GitHub_Trending/te/text-generation-inference
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考