Triton 推理服务器 Kafka I/O 部署#

使用 Triton 推理服务器进程内 Python API,您可以将基于 triton 服务器的模型集成到任何 Python 框架中,以从 Kafka 主题消费消息并将推理结果生成回选择的 kafka 主题。

此目录包含一个基于 Kafka I/O 的 Triton 推理服务器部署示例,该示例为服务器、消费者和生产者中的每一个使用线程。

| 安装 | 运行部署 | 发送请求 |

安装#

在此 Kafka I/O 管道中,我们部署了一个基于 transformers 标记化模块的预处理阶段,并且可以根据需要扩展到任何类型的模型。

先决条件#

  1. Docker

启动 Docker 容器#

一旦您的 Docker 服务启动并运行,请通过执行以下命令启动容器

docker run --rm -it --gpus all -v <path>/<to>/tutorials/Triton_Inference_Server_Python_API/examples/kafka-io/:/opt/tritonserver/kafka-io -w /opt/tritonserver/kafka-io  --entrypoint bash nvcr.io/nvidia/tritonserver:24.06-py3

克隆仓库#

git clone https://github.com/triton-inference-server/tutorials.git
cd tutorials/Triton_Inference_Server_Python_API/examples/kafka-io

注意:如果您已将 git 仓库从本地目录挂载到 Docker 容器,请跳过此步骤

安装依赖项#

请注意,安装时间可能因您的硬件配置和网络连接而异。

pip install -r requirements.txt

如果尚未安装 triton 服务器,请使用以下命令安装依赖项。

pip install /opt/tritonserver/python/tritonserver-2.44.0-py3-none-any.whl

接下来,运行提供的 start-kafka.sh 脚本,该脚本将执行以下操作

  1. 下载 Kafka 及其依赖项

  2. 通过启动 Zookeeper 和 Kafka brokers 启动 Kafka 服务

  3. 创建 2 个新主题,名称为 inference-input 作为输入队列,inference-output 用于存储推理结果

chmod +x start-kafka.sh
./start-kafka.sh

启动管道#

启动推理管道#

运行提供的 start-server.sh 脚本,该脚本将执行以下操作

  1. 导出 Kafka Producer 和 Consumer 配置、输入和输出主题的主题名称、模型名称和仓库。

  2. 启动服务器。

chmod +x start-server.sh
./start-server.sh

当您的控制台输出类似于以下内容时

2024-07-18 21:55:38,254 INFO api.py:609 -- Deployed app 'default' successfully.

这意味着服务器已成功启动。您可以按 Ctrl+C 并继续执行下一步。

注意:在上述调用中,我们对 kafka 消费者使用默认的 1 个线程,但是,如果您需要增加并发性,请将环境变量 KAFKA_CONSUMER_MAX_WORKER_THREADS 设置为所需的值并重新启动服务器。 这应该以消费者的新并发性启动服务器,以提高部署的吞吐量

发送请求到部署#

为了将请求发送到已部署的推理管道,请使用以下命令将消息生成到输入 kafka 主题中。

cd kafka_2.13-3.7.0
bin/kafka-console-producer.sh --topic inference-input --bootstrap-server localhost:9092

一旦执行了上述命令,您应该会看到提示符 > 以开始将消息摄取到输入主题。

> this is a sample message
>

一旦您生成了足够的消息,您可以按 Ctrl+C 退出提示符。

示例输出#

一旦工作流程从 kafka 主题消费了摄取的消息,它将调用 triton 服务器并将推理输出作为 json 字符串生成到输出 kafka 主题。 一旦消息被摄取,我们可以启动消费者以查看从管道摄取到输出主题的输出消息

bin/kafka-console-consumer.sh --topic inference-output --from-beginning --bootstrap-server localhost:9092

由于我们的示例已将 tokenizer 部署为 triton 中的自定义模型,我们应该看到插入到 kafka 主题的输出如下所示。

{"model": {"name": "tokenizer", "version": 1, "state": null, "reason": null}, "request_id": "", "parameters": {}, "outputs": {"input_ids": [[101, 1142, 1110, 2774, 3802, 118, 1207, 130, 102, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]], "token_type_ids": [[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]], "attention_mask": [[1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]]}, "error": null, "classification_label": null, "final": true}