Triton으로 Hugging Face Llava1.5-7B 멀티모달 모델 배포하기
Triton으로 Hugging Face Llava1.5-7B 멀티모달 모델 배포하기
TensorRT-LLM은 NVIDIA GPU에서 LLM을 실행하기 위한 NVIDIA의 권장 솔루션예요. 자세한 내용은 TensorRT-LLM과 Triton의 TensorRT-LLM 백엔드를 참고하세요.
참고: 이 튜토리얼의 일부가 동작하지 않는다면
tutorials저장소와tensorrtllm_backend저장소 사이에 버전 불일치가 있을 수 있어요. 필요한 경우 llama.md를 참고해 자세한 수정을 하고, Python에 익숙하다면 LLM API로 LLM 워크플로를 시도해 볼 수도 있어요.
Llava1.5-7B 모델 준비
이 튜토리얼은 사전 훈련된 가중치가 있는 Llava1.5-7B HuggingFace 모델을 사용해요. 가중치와 토크나이저가 담긴 모델 저장소를 여기에서 클론합니다.
Triton Inference Server로 배포하기
다음 단계는 TensorRT·TensorRT-LLM 엔진 빌드와 Triton 모델 저장소 구성 과정을 안내해요.
사전 준비: TensorRT-LLM 백엔드
이 튜토리얼은 TensorRT-LLM 백엔드 저장소가 필요해요. 최상의 경험을 위해 tensorrtllm_backend의 최신 릴리스 태그와 최신 Triton 서버 컨테이너를 권장합니다.
TensorRT-LLM 백엔드 저장소를 클론하려면 다음 명령 세트를 실행하세요.
git clone https://github.com/triton-inference-server/tensorrtllm_backend.git --branch <release branch>
# 서브모듈 업데이트
cd tensorrtllm_backend
# 필요하면 git-lfs 설치
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 도커 컨테이너를 실행해요. 단순화를 위해 tensorrtllm_backend를 /tensorrtllm_backend에, Llava1.5 모델을 /Llava-1.5-7b-hf에 마운트합니다. 엔진을 재사용하려면 도커 밖에 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
아니면 여기의 안내를 따라 특수한 컨테이너를 직접 빌드해도 됩니다. 컨테이너 실행 시 GPU 사용을 허용하는 걸 잊지 마세요.
각 모델의 엔진 생성 [엔진이 이미 있다면 건너뛰세요]
TensorRT-LLM은 실행 전에 각 모델을 필요한 설정으로 컴파일해야 해요. Triton Server에서 처음으로 모델을 실행하기 전에 TensorRT-LLM 엔진을 만들어야 합니다.
24.04 릴리스부터 Triton Server TensorRT-LLM 컨테이너에는 TensorRT-LLM 패키지가 미리 설치돼 있어서 Triton 컨테이너 안에서 엔진을 빌드할 수 있어요.
Llava1.5는 엔진 2개가 필요해요. 시각 컴포넌트용 TensorRT 엔진 하나, 언어 컴포넌트용 TRT-LLM 엔진 하나죠. 이 튜토리얼은 24.05 릴리스( TensorRT-LLM v0.9.0) 기준이며, 이 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 examples 폴더에 있는
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
추론 요청 보내기
실행 결과는 두 가지 방법으로 테스트할 수 있어요.
multi_modal_client.py스크립트 사용.
# SDK 컨테이너 예시
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.
- generate 엔드포인트 사용.
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}
참고
더 많은 예시는 멀티모달 모델을 실행하는 End to end 워크플로를 참고하세요.