在 Triton 中部署 Hugging Face Llava1.5-7b 模型#
TensorRT-LLM 是 Nvidia 推荐的在 Nvidia GPU 上运行大型语言模型 (LLM) 的解决方案。阅读更多关于 TensorRT-LLM 的信息,请点击此处,以及 Triton 的 TensorRT-LLM 后端,请点击此处。
注意: 如果本教程的某些部分无法正常工作,可能是 tutorials
和 tensorrtllm_backend
仓库之间存在版本不匹配。如有必要,请参考 llama.md 了解更详细的修改信息。如果您熟悉 python,也可以尝试使用 高级 API 进行 LLM 工作流程。
获取 Llava1.5-7B 模型#
在本教程中,我们将使用带有预训练权重的 Llava1.5-7B HuggingFace 模型。克隆包含权重和 tokens 的模型仓库,请点击此处。
使用 Triton 推理服务器部署#
接下来的步骤将指导您完成 TensorRT 和 TensorRT-LLM 引擎构建以及 Triton 模型仓库设置的过程。
前提条件:TensorRT-LLM 后端#
本教程需要 TensorRT-LLM 后端仓库。请注意,为了获得最佳用户体验,我们建议使用最新的 发布标签 的 tensorrtllm_backend
和最新的 Triton Server 容器。
要克隆 TensorRT-LLM 后端仓库,请确保运行以下命令集。
git clone https://github.com/triton-inference-server/tensorrtllm_backend.git --branch <release branch>
# Update the submodules
cd tensorrtllm_backend
# Install git-lfs if needed
apt-get update && apt-get install git-lfs -y --no-install-recommends
git lfs install
git submodule update --init --recursive
启动 Triton TensorRT-LLM 容器#
启动带有 TensorRT-LLM 后端的 Triton docker 容器。请注意,为了简单起见,我们将 tensorrtllm_backend
挂载到 /tensorrtllm_backend
,并将 Llava1.5 模型挂载到 docker 容器中的 /Llava-1.5-7b-hf
。在 docker 外部创建一个 engines
文件夹,以便在将来的运行中重用引擎。请确保将 <xx.yy> 替换为您要使用的 Triton 版本。
docker run --rm -it --net host --shm-size=2g \
--ulimit memlock=-1 --ulimit stack=67108864 --gpus all \
-v </path/to/tensorrtllm_backend>:/tensorrtllm_backend \
-v </path/to/Llava1.5/repo>:/llava-1.5-7b-hf \
-v </path/to/engines>:/engines \
-v </path/to/tutorials>:/tutorials \
nvcr.io/nvidia/tritonserver:<xx.yy>-trtllm-python-py3
或者,如果您想构建专门的容器,您可以按照此处的说明构建带有 Tensorrt-LLM 后端的 Triton Server。
启动容器时,不要忘记允许 gpu 使用。
为每个模型创建引擎 [如果您已经有引擎,请跳过此步骤]#
TensorRT-LLM 要求每个模型在运行之前都针对您需要的配置进行编译。为此,在您第一次在 Triton Server 上运行模型之前,您需要创建一个 TensorRT-LLM 引擎。
从 24.04 版本 开始,Triton Server TensrRT-LLM 容器预装了 TensorRT-LLM 包,允许用户在 Triton 容器内部构建引擎。
Llava1.5 需要 2 个引擎:用于视觉组件的 TensorRT 引擎和用于语言组件的 TRT-LLM 引擎。本教程基于 24.05 版本,该版本对应于 v0.9.0
版本的 TensorRT-LLM 和 TensorRT-LLM 后端,并遵循 此 TensorRT-LLM 多模态指南。
要生成引擎,只需按照以下步骤操作
HF_LLAVA_MODEL=/llava-1.5-7b-hf
UNIFIED_CKPT_PATH=/tmp/ckpt/llava/7b/
ENGINE_DIR=/engines/llava1.5
CONVERT_CHKPT_SCRIPT=/tensorrtllm_backend/tensorrt_llm/examples/llama/convert_checkpoint.py
python3 ${CONVERT_CHKPT_SCRIPT} --model_dir ${HF_LLAVA_MODEL} --output_dir ${UNIFIED_CKPT_PATH} --dtype float16
trtllm-build --checkpoint_dir ${UNIFIED_CKPT_PATH} \
--output_dir ${ENGINE_DIR} \
--gemm_plugin float16 \
--use_fused_mlp \
--max_batch_size 1 \
--max_input_len 2048 \
--max_output_len 512 \
--max_multimodal_len 576 # 1 (max_batch_size) * 576 (num_visual_features)
python /tensorrtllm_backend/tensorrt_llm/examples/multimodal/build_visual_engine.py --model_path ${HF_LLAVA_MODEL} --model_type llava --output_dir ${ENGINE_DIR}
可选:您可以检查模型的输出,使用位于同一 llama 示例文件夹中的
run.py
。python3 /tensorrtllm_backend/tensorrt_llm/examples/multimodal/run.py --max_new_tokens 30 --hf_model_dir ${HF_LLAVA_MODEL} --visual_engine_dir ${ENGINE_DIR} --llm_engine_dir ${ENGINE_DIR} --decoder_llm --input_text "Question: which city is this? Answer:"您应该期望得到以下响应
[TensorRT-LLM] TensorRT-LLM version: 0.9.0 ... [06/18/2024-01:02:24] [TRT-LLM] [I] --------------------------------------------------------- [06/18/2024-01:02:24] [TRT-LLM] [I] [Q] Question: which city is this? Answer: [06/18/2024-01:02:24] [TRT-LLM] [I] [A] ['Singapore'] [06/18/2024-01:02:24] [TRT-LLM] [I] Generated 1 tokens [06/18/2024-01:02:24] [TRT-LLM] [I] ---------------------------------------------------------
使用 Triton 提供服务#
最后一步是设置 Triton 模型仓库。在本教程中,我们在 model_repository/
下提供了所有必要的 Triton 相关文件。您只需在其 config.pbtxt
中提供 TensorRT-LLM 引擎位置即可
FILL_TEMPLATE_SCRIPT=/tensorrtllm_backend/tools/fill_template.py
python3 ${FILL_TEMPLATE_SCRIPT} -i /tutorials/Popular_Models_Guide/Llava1.5/model_repository/tensorrt_llm/config.pbtxt engine_dir:${ENGINE_DIR}
启动 Tritonserver
使用 launch_triton_server.py 脚本。这将使用 MPI 启动 tritonserver
的多个实例。
export TRT_ENGINE_LOCATION="/engines/llava1.5/visual_encoder.engine"
export HF_LOCATION="/llava-1.5-7b-hf"
python3 /tensorrtllm_backend/scripts/launch_triton_server.py --world_size=<world size of the engine> --model_repo=/tutorials/Popular_Models_Guide/Llava1.5/model_repository
您应该期望得到以下响应
... I0503 22:01:25.210518 1175 grpc_server.cc:2463] Started GRPCInferenceService at 0.0.0.0:8001 I0503 22:01:25.211612 1175 http_server.cc:4692] Started HTTPService at 0.0.0.0:8000 I0503 22:01:25.254914 1175 http_server.cc:362] Started Metrics Service at 0.0.0.0:8002
要停止容器内的 Triton Server,请运行
pkill tritonserver
发送推理请求#
您可以使用以下命令测试运行结果
# Using the SDK container as an example
docker run --rm -it --net host --shm-size=2g \
--ulimit memlock=-1 --ulimit stack=67108864 --gpus all \
-v /path/to/tutorials:/tutorials
nvcr.io/nvidia/tritonserver:<xx.yy>-py3-sdk
CLIENT_SCRIPT=/tutorials/Popular_Models_Guide/Llava1.5/multi_modal_client.py
python3 ${CLIENT_SCRIPT} --prompt "Describe the picture." --image_url "http://images.cocodataset.org/test2017/000000155781.jpg" --max-tokens=15
您应该期望得到以下响应
Got completed request The image features a city bus parked on the side of a street.
curl -X POST localhost:8000/v2/models/llava-1.5/generate -d '{"prompt":"USER: <image>\nQuestion:Describe the picture. Answer:", "image":"http://images.cocodataset.org/test2017/000000155781.jpg", "max_tokens":100}'
您应该期望得到以下响应
data: {"completion_tokens":77,"finish_reason":"stop","model_name":"llava-1.5","model_version":"1","prompt_tokens":592,"text":"The image features a city bus parked on the side of a street. The bus is positioned near a railroad crossing, and there is a stop sign visible in the scene. The bus is also displaying an \"Out of Service\" sign, indicating that it is not currently in operation. The street appears to be foggy, adding a sense of atmosphere to the scene.</s>","total_tokens":669}
参考资料#
如需更多示例,请随时参考运行多模态模型的端到端工作流程。