ARTICLE · INTELLIGENCE

战地情报 · 详情页

来自尧图项目组的一线实战观察与深度解析

mistral.rs 运行 LLaVA-Next 多模态模型:基于 OpenAI 兼容 HTTP API 的图像推理实战

mistral.rs 运行 LLaVA-Next 多模态模型:基于 OpenAI 兼容 HTTP API 的图像推理实战 mistral.rs 运行 LLaVA-Next 多模态模型基于 OpenAI 兼容 HTTP API 的图像推理实战【免费下载链接】mistral.rsFast, flexible LLM inference项目地址: https://gitcode.com/GitHub_Trending/mi/mistral.rsLLaVA-NextLLaVA 1.6是当前开源社区广泛使用的视觉-语言模型家族支持任意分辨率图像输入与多轮视觉对话。mistral.rs 在其多模态推理引擎中原生支持LlavaNextForConditionalGeneration架构用户可以通过一条mistralrs serve命令启动本地服务再用标准 OpenAI SDK 发送图片 文本的多模态请求。本文以仓库中的可运行示例 examples/server/llava_next.py 为骨架完整讲解从服务启动、客户端构造、多模态消息格式到采样参数调优的全流程并结合 llava_next_inputs_processor.rs 等源码说明底层图像预处理机制读完即可在本地跑通 LLaVA-Next 的图像理解服务。LLaVA-Next 在 mistral.rs 中的支持方式mistral.rs 将 LLaVA-Next 作为多模态加载器Multimodal Loader的一等公民集成。在 multimodal_loaders.rs 中序列化名称llava_next与架构名LlavaNextForConditionalGeneration被映射到MultimodalLoaderType::LLaVANext见 L323同时 model_metadata.rs 也将该架构名注册到模型元数据中。这意味着只要模型仓库的config.json声明LlavaNextForConditionalGeneration架构mistralrs serve即可自动识别并加载无需额外适配代码。模型侧的推理路径同样完备mistralrs-core/src/vision_models/llava/目录下同时实现了llava_next模型主体与llava_next_inputs_processor输入处理器。其中 llava_next_inputs_processor.rs 中的LLaVANextProcessor使用正则image切分用户消息文本将图像占位符与文本片段分离后送入视觉编码器与语言模型这与 LLaVA-Next 官方 prompt 格式保持一致。第一步启动 LLaVA-Next 推理服务要在本地提供 OpenAI 兼容的 HTTP 端点使用mistralrs serve子命令加载 LLaVA-Next 模型以 llava-hf 系模型为例mistralrs serve -m llava-hf/llava-v1.6-mistral-7b-hf服务默认监听0.0.0.0:1234启动日志会输出类似下面的信息INFO mistralrs_cli::commands::serve: Server listening on http://0.0.0.0:1234几点说明端口可用-p/--port修改监听地址用--host修改默认0.0.0.0意味着同网络内任意主机都可访问仅本机调试建议加--host 127.0.0.1显存不足时可叠加--quant如--quant 4对权重做 4-bit 量化后加载模型可通过 Hugging Face 模型 ID 或本地目录路径指定具体加载参数可参考 Quickstart 与 OpenAI 兼容 API 服务指南。第二步用 OpenAI SDK 发送图像 文本请求服务启动后http://localhost:1234/v1就是一个标准的 OpenAI 兼容端点。仓库示例 examples/server/llava_next.py 演示了完整调用方式下面先给出可整体运行的代码再逐段拆解。from openai import OpenAI import httpx import textwrap import json def log_response(response: httpx.Response): request response.request print(fRequest: {request.method} {request.url}) print( Headers:) for key, value in request.headers.items(): if key.lower() authorization: value [...] if key.lower() cookie: value value.split()[0] ... print(f {key}: {value}) print( Body:) try: request_body json.loads(request.content) print(textwrap.indent(json.dumps(request_body, indent2), )) except json.JSONDecodeError: print(textwrap.indent(request.content.decode(), )) print(fResponse: status_code{response.status_code}) print( Headers:) for key, value in response.headers.items(): if key.lower() set-cookie: value value.split()[0] ... print(f {key}: {value}) client OpenAI(api_keyfoobar, base_urlhttp://localhost:1234/v1/) # Enable this to log requests and responses # client._client httpx.Client( # event_hooks{request: [print], response: [log_response]} # ) completion client.chat.completions.create( modeldefault, messages[ { role: user, content: [ { type: image_url, image_url: { url: https://www.nhmagazine.com/content/uploads/2019/05/mtwashingtonFranconia-2-19-18-108-Edit-Edit.jpg }, }, { type: text, text: What is shown in this image? Write a detailed response analyzing the scene., }, ], }, ], max_tokens256, frequency_penalty1.0, top_p0.1, temperature0, ) resp completion.choices[0].message.content print(resp)客户端初始化client OpenAI(api_keyfoobar, base_urlhttp://localhost:1234/v1/)base_url指向本地 mistral.rs 服务的/v1/前缀api_key是 OpenAI SDK 的必填参数但 mistral.rs 服务端不会校验其值示例中使用任意占位符foobar即可详见 OpenAI 兼容 API 服务指南 的认证说明单模型场景下请求中的model固定填default多模型服务则需填写GET /v1/models中展示的模型 id。可选的请求/响应调试日志示例中的log_response函数通过 httpx 的event_hooks挂接到 OpenAI 客户端底层用于打印每次请求的 method、URL、请求头、请求体以及响应状态码和响应头并对authorization、cookie、set-cookie三类敏感头做脱敏处理。这在排查 4xx/5xx 错误、核对请求体格式时非常有用按需取消注释即可启用# client._client httpx.Client( # event_hooks{request: [print], response: [log_response]} # )多模态消息格式content parts与纯文本请求不同多模态请求的content不再是一个字符串而是一个内容部件content part列表模型按列表顺序依次读取content: [ { type: image_url, image_url: {url: https://.../mtwashingtonFranconia-...jpg}, }, { type: text, text: What is shown in this image? Write a detailed response analyzing the scene., }, ],这是 OpenAI 官方定义的多模态消息协议image_url部件承载图片text部件承载文本。mistral.rs 遵循同一协议且单条消息内可以混排任意数量的部件多图对比、图文交错均可模型按顺序处理顺序即语义顺序详见 多模态输入指南。采样参数temperature / top_p / frequency_penalty / max_tokens示例对采样参数做了精细设置适合图像描述这类事实性任务参数示例值作用temperature0完全贪心解码输出最稳定、可复现适合需要事实准确的分析任务top_p0.1只从累积概率 10% 的 token 中采样进一步收窄输出分布frequency_penalty1.0惩罚已出现 token减少描述中的重复与啰嗦max_tokens256限制单次生成的最大 token 数控制响应长度与显存占用在视觉理解场景中temperature0配合top_p0.1能有效避免模型对同一张图给出飘忽不定的描述若希望输出更具多样性可适当调高temperature。图片 URL 的三种合法形式image_url中的url字段在 mistral.rs 中支持三种形式详见 多模态输入指南 的 Content parts and URL forms 一节网络 URLhttp(s)://...如示例中的图片链接服务端在请求时实时抓取本地文件路径file:///absolute/path/to/photo.jpg指向服务进程可读的本地文件适合内网或离线场景内联 base64data:image/png;base64,...图片直接编码进请求体适合图片在内存中如 Python 脚本中用 PIL 打开后转 base64的场景。三种形式在 HTTP 层面完全等价服务端统一走同一条图像解码与预处理管线。底层原理LLaVA-Next 的图像预处理管线了解底层实现有助于理解为什么请求能开箱即用。在 llava_next_inputs_processor.rs 中LLaVANextProcessor::new会解析模型的config.json得到LLaVANextConfig用正则rimage编译image_tag_splitter用于把用户消息中的图像占位符切分出来。随后的处理流程同文件LLaVANextInputProcessor共 816 行包括调用get_anyres_image_grid_shape按任意分辨率把图片切分为网格子图、select_best_resolution选择最合适的输入分辨率、resize_and_pad_image做缩放与填充。这正是 LLaVA-Next AnyRes 多分辨率机制的核心——模型会同时看到整图与高分辨率局部网格从而捕捉更多细节。从工程角度看mistral.rs 把整条链路URL 拉取/解码 → 多分辨率网格切分 → 归一化 →image占位符替换 → 视觉 token 与文本 token 拼接封装在 multimodal_loaders.rs 调用的get_num_image_tokens等接口中客户端无需关心 token 数量计算只需按本文格式组装请求即可。运行与验证安装依赖后直接执行示例脚本pip install openai httpx python examples/server/llava_next.py服务正常时脚本会打印模型对示例风景图的详细描述分析画面场景、主体内容等。如果希望核对请求是否按预期发送取消log_response挂钩的注释即可看到脱敏后的完整请求/响应报文。常见问题与注意事项api_key填什么任意非空字符串即可服务端不校验model在单模型服务中固定为default。请求被忽略的字段user、stream_options、metadata、parallel_tool_calls等 OpenAI 兼容字段会被接受但忽略seed可用于请求级确定性采样详见 OpenAI 兼容 API 服务指南 的兼容性说明。图片分辨率与数量上限视觉编码器有固定输入分辨率大图会被按宽高比缩小服务启动时可用--max-num-images默认 1、--max-edge、--max-image-length默认 1024控制加载时的图像边界与数量详见 多模态输入指南 的 Preprocessing 一节。网络 URL 拉取失败确认服务所在机器能访问该 URL内网环境建议改用file:///或data:形式。本地调试注意安全服务默认绑定0.0.0.0仅本机使用时建议--host 127.0.0.1。延伸阅读可运行示例源码examples/server/llava_next.py本文主体代码即来自该文件多模态输入协议与 URL 形式详解docs/src/content/docs/guides/models/multimodal-input.mdxOpenAI 兼容端点与兼容性说明docs/src/content/docs/guides/serve/openai-compatible-apis.md服务启动与安装指引docs/src/content/docs/quickstart.mdxLLaVA-Next 架构注册与加载multimodal_loaders.rs、model_metadata.rs图像预处理与输入处理实现llava_next_inputs_processor.rs【免费下载链接】mistral.rsFast, flexible LLM inference项目地址: https://gitcode.com/GitHub_Trending/mi/mistral.rs创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
RELATED READING

延伸阅读

更多一线实战笔记与深度复盘,助您持续精进