Triton 推理服务器 Kafka I/O 部署#
使用 Triton 推理服务器进程内 Python API,您可以将基于 triton 服务器的模型集成到任何 Python 框架中,以从 Kafka 主题消费消息并将推理结果生成回选择的 kafka 主题。
此目录包含一个基于 Kafka I/O 的 Triton 推理服务器部署示例,该示例为服务器、消费者和生产者中的每一个使用线程。
安装#
在此 Kafka I/O 管道中,我们部署了一个基于 transformers
标记化模块的预处理阶段,并且可以根据需要扩展到任何类型的模型。
先决条件#
启动 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
脚本,该脚本将执行以下操作
下载 Kafka 及其依赖项
通过启动 Zookeeper 和 Kafka brokers 启动 Kafka 服务
创建 2 个新主题,名称为
inference-input
作为输入队列,inference-output
用于存储推理结果
chmod +x start-kafka.sh
./start-kafka.sh
启动管道#
启动推理管道#
运行提供的 start-server.sh
脚本,该脚本将执行以下操作
导出 Kafka Producer 和 Consumer 配置、输入和输出主题的主题名称、模型名称和仓库。
启动服务器。
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}