text-generation-inference Neuron 后端部署指南:在 AWS Trainium 与 Inferentia 上运行 TGI
2026/9/15 16:42:12 网站建设 项目流程

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 部署服务(模型卡方式)

最简单的部署路径是直接利用模型卡片上提供的部署入口:

  1. 打开目标模型页面,点击右侧的Deploy按钮;
  2. 选择部署服务(支持Inference EndpointsSageMaker);
  3. 硬件类型选择AWS Trainium & Inferentia
  4. 按页面提示完成后续配置。

这种方式由托管平台负责 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_TYPEHF_NUM_CORES这两个环境变量,从 tgi_env.py 可以看出它们是 Neuron 后端服务器侧的关键配置:

  • HF_NUM_CORES:指定编译/运行所需的 Neuron core 数量(即张量并行度tp_degree);
  • HF_AUTO_CAST_TYPE:指定模型权重与激活的自动转换精度类型(如fp16)。

这两个变量连同 router 侧的MAX_BATCH_SIZEMAX_TOTAL_TOKENSMAX_INPUT_TOKENSMAX_BATCH_PREFILL_TOKENS,共同构成 Neuron 后端完整的环境变量集合。parse_cmdline_and_set_env()会把命令行参数转换为对应的环境变量;而当模型配置不完整时,model.py 的get_export_kwargs_from_env()会从这些环境变量中提取导出参数(batch_sizesequence_lengthnum_coresauto_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_sizesequence_lengthtp_degreeauto_cast_type),将其写入环境变量文件(MAX_BATCH_SIZEMAX_TOTAL_TOKENSHF_NUM_CORESHF_AUTO_CAST_TYPE),若未显式指定,则自动令MAX_INPUT_TOKENS = sequence_length // 2MAX_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-sizeMAX_BATCH_SIZE
--max-total-tokensMAX_TOTAL_TOKENS
--max-input-tokensMAX_INPUT_TOKENS(兼容旧名MAX_INPUT_LENGTH
--max-batch-prefill-tokensMAX_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):

  1. 容器ENTRYPOINT指向 tgi-entrypoint.sh;
  2. 脚本调用 tgi_entry_point.py:解析命令行参数与环境变量,若所有tgi_env_vars均已设置则直接跳过;否则读取模型的 NeuronConfig 或查找 Hub 缓存中的兼容配置,通过neuron_config_to_env()把推导结果写入临时环境变量文件;
  3. 脚本source该环境变量文件,exec text-generation-launcher $@启动 TGI launcher(router);
  4. 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-dkmstorch-neuronxneuronx-ccoptimum-neuron等 Neuron 软件栈,并在base阶段安装 CPU 版 PyTorch 以避免引入 CUDA 依赖。

八、部署注意事项小结

  1. 版本匹配:容器 tag 使用ghcr.io/huggingface/text-generation-inference:<VERSION>-neuron,请按实际发布版本替换<VERSION>
  2. 设备数量:每个 Neuron 设备 2 个 core,暴露设备数 × 2 必须 ≥ 模型tp_degree;生产环境用--device显式暴露,不要用privileged
  3. 参数对齐--max-batch-size--max-total-tokens必须与模型导出配置完全一致,--max-input-length必须小于序列长度;本地 Neuron 模型会自动推导参数,无需手动指定;
  4. 数据卷:务必把/data挂载为持久化卷,避免重复下载与导出;
  5. gated 模型:记得通过-e HF_TOKEN传入有效的 Hugging Face 令牌;
  6. 内存预算: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),仅供参考

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询