tritonserver 推理框架
步骤 1:在 Python 后端中编写代码,解析请求中的图片 URL/Base64 数据,完成图片编码(如用 CLIP 视觉编码器);步骤 2:将编码后的视觉特征与文本特征融合,送入大模型推理;步骤 3:Triton 负责接收 / 返回请求,Python 后端处理核心多模态逻辑。Triton 不仅支持多模态模型,还是生产环境部署多模态大模型的主流选择(优势:高并发、动态批处理、多后端统一管理)。v
triton框架的基本逻辑是,triton是个外壳只做调度和管理类似k8s和docker的关系。真正的推理服务器加载模型,模型计算等都是后面的推理服务如vllm,onnx等不同的推理服务。
什么是triton inference server?
triton可以充当服务框架去部署你的深度学习模型,其他用户可以通过http或者grpc去请求
triton也可以摘出C-API充当多线程推理服务框架,去除http和grpc部分,适合本地部署多模型,比如你有很多模型要部署,然后分时段调用,或者有pipeline,有了triton就省去你处理显存、内存和线程的麻烦
triton的一些优点
支持HTTP/GRPC
支持多backend,TensorRT、libtorch、onnx、paddle、vm啥的都支持,也可以自己custom,所以理论上所有backend都可以支持
单GPU、多GPU都可以支持,CPU也支持
模型可以在CPU层面并行执行
很多基本的服务框架的功能都有,模型管理比如热加载、模型版本切换、动态batch,类似于之前的tensorflow server
开源,可以自定义修改,很多问题可以直接issue,官方回复及时
NVIDIA官方出品,对NVIDIA系列GPU比较友好,也是大厂购买NVIDIA云服务器推荐使用的框架
Triton Inference Server(Tritonserver)完全支持多模态模型(如 Qwen2.5-VL、LLaVA、GPT-4V 等),但支持方式并非 Triton 原生实现多模态逻辑,而是通过对接支持多模态的后端(如 vLLM、FasterTransformer、Python 后端)来实现,核心是「Triton 作为统一推理网关,转发多模态请求给专用后端处理」。
一、Triton 支持多模态模型的核心方式
Triton 本身不直接解析图片 / 语音等模态数据,而是通过以下两种核心方式适配多模态模型:
1. 对接 vLLM 后端(最常用,适配你的场景)
vLLM 从 0.4.0 版本开始原生支持 Qwen2.5-VL、LLaVA 等多模态模型,Triton 只需配置 vLLM 后端,即可无缝转发多模态请求(文本 + 图片)给 vLLM,由 vLLM 处理图片编码、多模态融合等逻辑。
- 你的场景问题:并非 Triton 不支持,而是vLLM 版本过低 / 模型文件缺失导致多模态能力未加载(之前报错
only text mess是 vLLM 层面的限制,而非 Triton)。
2. 自定义 Python 后端(灵活适配自研多模态模型)
若需适配自研多模态模型,可基于 Triton 的 Python 后端封装:
- 步骤 1:在 Python 后端中编写代码,解析请求中的图片 URL/Base64 数据,完成图片编码(如用 CLIP 视觉编码器);
- 步骤 2:将编码后的视觉特征与文本特征融合,送入大模型推理;
- 步骤 3:Triton 负责接收 / 返回请求,Python 后端处理核心多模态逻辑。
3. 组合式模型(Ensemble)
Triton 支持「Ensemble 模型」,将视觉编码器(如 ViT)和语言模型拆分为两个独立 Triton 模型,通过配置拼接成一个多模态推理流水线:
- 模型 1:视觉编码模型(如 ONNX 格式的 ViT),处理图片并输出视觉特征;
- 模型 2:语言模型(如 vLLM 后端的 Qwen2.5-VL),接收文本 + 视觉特征完成推理;
- Triton 配置 Ensemble 逻辑,自动将模型 1 的输出作为模型 2 的输入
四、常见误区澄清
- ❌ 误区:Triton 原生不支持多模态 → ✅ 正解:Triton 本身是网关,通过后端(vLLM/Python)支持多模态;
- ❌ 误区:Triton 需要特殊配置才能支持图片 → ✅ 正解:Triton 仅转发 JSON 中的图片 URL/Base64,由后端解析,无需 Triton 配置图片处理;
- ❌ 误区:多模态报错是 Triton 问题 → ✅ 正解:99% 是 vLLM 版本 / 模型文件 / 请求格式问题,Triton 仅返回后端的报错。
总结
Triton 不仅支持多模态模型,还是生产环境部署多模态大模型的主流选择(优势:高并发、动态批处理、多后端统一管理)。你当前的问题核心不是 Triton 不支持,而是:
- vLLM 版本 / 模型文件导致多模态能力未加载;
- 请求 JSON 格式曾有语法错误;
- 图片 URL 可能无法被 Triton 服务器访问。
解决这三点后,Triton + vLLM 即可稳定处理 Qwen2.5-VL 的多模态请求。
目录结构
(vllm_py13) root@spark-c29b:/home/jettech/work/wubo# tree
.
├── config
│ └── vllm
│ ├── 1
│ │ └── model.json
│ └── config.pbtxt
├── models
│ └── Qwen2.5-VL-32B-Instruct
│ ├── added_tokens.json
│ ├── chat_template.json
│ ├── config.json
│ ├── configuration.json
│ ├── generation_config.json
│ ├── merges.txt
│ ├── model-00001-of-00018.safetensors
│ ├── model-00002-of-00018.safetensors
│ ├── model-00003-of-00018.safetensors
│ ├── model-00004-of-00018.safetensors
│ ├── model-00005-of-00018.safetensors
│ ├── model-00006-of-00018.safetensors
│ ├── model-00007-of-00018.safetensors
│ ├── model-00008-of-00018.safetensors
│ ├── model-00009-of-00018.safetensors
│ ├── model-00010-of-00018.safetensors
│ ├── model-00011-of-00018.safetensors
│ ├── model-00012-of-00018.safetensors
│ ├── model-00013-of-00018.safetensors
│ ├── model-00014-of-00018.safetensors
│ ├── model-00015-of-00018.safetensors
│ ├── model-00016-of-00018.safetensors
│ ├── model-00017-of-00018.safetensors
│ ├── model-00018-of-00018.safetensors
│ ├── model.safetensors.index.json
│ ├── preprocessor_config.json
│ ├── README.md
│ ├── special_tokens_map.json
│ ├── tokenizer_config.json
│ ├── tokenizer.json
│ └── vocab.json
└── readme
6 directories, 34 files
操作过程
(vllm_py13) root@spark-c29b:/home/jettech/work/wubo# cat readme
docker run -it --runtime nvidia -p 8080:8080 --ipc=host -v /home/jettech/work/wubo/models/qwen:/opt/jettech egslingjun-registry.cn-wulanchabu.cr.aliyuncs.com/egslingjun/inference-nv-pytorch:25.10-vllm0.11.0-pytorch2.9-cu130-20251028-serverless
echo 3 > /proc/sys/vm/drop_caches
容器启动命令 docker run -it --name jettech_trition_vllm_25.11 --ipc=host --network host --entrypoint /bin/bash --gpus all -v /home/jettech/work/wubo:/opt/jettech harbor.jettech.com/jettechtools/jettech-inference-tritonserver:25.11-vllm-python-py3.aarch64
容器名称 jettech_trition_vllm_25.11
模型配置文件路径 :/opt/jettech/config
非openai
服务启动命令 tritonserver --model-repository=/opt/jettech/config
访问:
stream,流式访问
curl -X POST localhost:8000/v2/models/vllm/generate_stream -d '{"text_input": "解释:菩提本无树,明镜亦非台,本来无一物,何处惹尘埃", "parameters": {"stream": true, "temperature": 0, "exclude_input_in_output": true, "max_tokens": 450}}'
no stream,非流式访问
curl -X POST localhost:8000/v2/models/vllm/generate -d '{"text_input": "解释:菩提本无树,明镜亦非台,本来无一物,何处惹尘埃", "parameters": {"stream": true, "temperature": 0, "exclude_input_in_output": true, "max_tokens": 450}}'
兼容openai方式https://github.com/triton-inference-server/server/tree/main/python/openai
python3 /opt/tritonserver/python/openai/openai_frontend/main.py --model-repository /opt/jettech/config --tokenizer /opt/jettech/models/Qwen2.5-VL-32B-Instruct --backend vllm --host=0.0.0.0 --openai-port=8000 --enable-kserve-frontends
访问:
curl -s http://localhost:9000/v1/chat/completions -H 'Content-Type: application/json' -d '{ "model": "'vllm'", "messages": [{"role": "user", "content": "解释:菩提本无树,明镜亦非台,本来无一物,何处惹尘埃"}]}'
多模态:
curl -X POST -H "Content-Type: application/json" http://192.168.0.162:9000/v1/chat/completions -d '{"model":"vllm","messages":[{"role":"user","content":[{"type":"text","text":"分析这张图片的内容"},{"type":"image_url","image_url":{"url":"http://nfs.jettech.cn/1.png"}}]}],"limit_mm_per_prompt":{"image":30}}'
docker exec -it jettech_trition_vllm_25.11 bash
nohub vllm serve --host=0.0.0.0 --port=8080 /opt/jettech/models/Qwen2.5-VL-32B-Instruct --served-model-name="Qwen2.5-VL-32B-Instruct" --trust-remote-code --enable-prefix-caching --tensor-parallel-size=1 --max-num-seqs=4 --max-model-len=8192 --block-size=128 --gpu-memory-utilization=0.9 --limit-mm-per-prompt='{"image": '10'}' &
配置文件:
(vllm_py13) root@spark-c29b:/home/jettech/work/wubo# cat config/vllm/config.pbtxt
backend: "vllm"
instance_group [
{
count: 1
kind: KIND_MODEL
}
]
这个配置文件只是告诉triton这个框架后端的推理服务是那个(vllm,onnx等),启动多少个实例,类型是什么,KIND_MODEL,KIND_GPU,KING_CPU等
(vllm_py13) root@spark-c29b:/home/jettech/work/wubo# cat config/vllm/1/model.json
{
"model":"/opt/jettech/models/Qwen2.5-VL-32B-Instruct",
"gpu_memory_utilization": 0.9,
"trust_remote_code": true,
"enable_prefix_caching": true ,
"max_model_len": 8196,
"tensor_parallel_size": 1,
"limit_mm_per_prompt": {"image": 30}
}
这个配置文件是具体后端的推理服务需要的参数
(vllm_py13) root@spark-c29b:/home/jettech/work/wubo# cat config/vllm/config.pbtxt
backend: "vllm"
instance_group [
{
count: 1
kind: KIND_MODEL
}
]
(vllm_py13) root@spark-c29b:/home/jettech/work/wubo# cat config/vllm/1/model.json
{
"model":"/opt/jettech/models/Qwen2.5-VL-32B-Instruct",
"gpu_memory_utilization": 0.9,
"trust_remote_code": true,
"enable_prefix_caching": true ,
"max_model_len": 8196,
"tensor_parallel_size": 1,
"limit_mm_per_prompt": {"image": 30}
}
https://catalog.ngc.nvidia.com/orgs/nvidia/containers/tritonserver/tags?version=25.11-vllm-python-py3https://blog.csdn.net/qq_21201267/article/details/145838207
https://blog.csdn.net/sinat_37574187/article/details/140480548
https://docs.nvidia.com/deeplearning/triton-inference-server/user-guide/docs/vllm_backend/README.html
https://github.com/triton-inference-server/server/blob/main/docs/perf_benchmark/genai-perf-README.rst
https://github.com/triton-inference-server/perf_analyzer/blob/main/genai-perf/README.md
更多推荐



所有评论(0)