【vLLM 学习】Vision Language Multi Image

Windows上用Docker部署PaddleOCR-VL+Blackwell+vLLM实战 多模态OCR是文档智能的核心技术,其本质是视觉编码器与语言模型的协同推理。vLLM凭借PagedAttention和多模态Backend扩展能力,成为高吞吐OCR服务的关键推理引擎;而PaddleOCR-VL作为国产开源方案,深度支持中文版面理解与结构化输出。在Blackwell架构GPU(如RTX 6000 Ada)日益普及的背景下,如何在主流交付终端Windows上实现CUDA栈可控、GPU直通可靠、模型服务开箱即用的部署,已成为政企本地化、工业质检、教学实验等场景的刚需。本文聚焦Windows Doc 阅读详情

vLLM 是一款专为大语言模型推理加速而设计的框架,实现了 KV 缓存内存几乎零浪费,解决了内存管理瓶颈问题。

更多 vLLM 中文文档及教程可访问 →go.hyper.ai/Wa62f

*在线运行 vLLM 入门教程:零基础分步指南

源码 examples/offline_inference/vision_language_multi_image.py


"""
本示例展示如何使用 vLLM 在视觉语言模型上执行离线推理,
处理多图像输入并生成文本,
整个过程使用模型定义的对话模板(chat template)。
"""
import os
from argparse import Namespace
from dataclasses import asdict
from typing import NamedTuple, Optional

from huggingface_hub import snapshot_download
from PIL.Image import Image
from transformers import AutoProcessor, AutoTokenizer

from vllm import LLM, EngineArgs, SamplingParams
from vllm.lora.request import LoRARequest
from vllm.multimodal.utils import fetch_image
from vllm.utils import FlexibleArgumentParser

QUESTION = "What is the content of each image?"
IMAGE_URLS = [
    "https://upload.wikimedia.org/wikipedia/commons/d/da/2015_Kaczka_krzy%C5%BCowka_w_wodzie_%28samiec%29.jpg",
    "https://upload.wikimedia.org/wikipedia/commons/7/77/002_The_lion_king_Snyggve_in_the_Serengeti_National_Park_Photo_by_Giles_Laurent.jpg",
]


class ModelRequestData(NamedTuple):
    engine_args: EngineArgs
    prompt: str
    image_data: list[Image]
    stop_token_ids: Optional[list[int]] = None
    chat_template: Optional[str] = None
    lora_requests: Optional[list[LoRARequest]] = None


# 注意:默认的 `max_num_seqs` 和 `max_model_len` 可能会导致低端 GPU 出现 OOM(内存溢出)。
# 除非另有说明,这些设置已在单张 L4 GPU 上经过测试可正常运行。


def load_aria(question: str, image_urls: list[str]) -> ModelRequestData:
    model_name = "rhymes-ai/Aria"
    engine_args = EngineArgs(
        model=model_name,
        tokenizer_mode="slow",
        trust_remote_code=True,
        dtype="bfloat16",
        limit_mm_per_prompt={"image": len(image_urls)},
    )
    placeholders = "<fim_prefix><|img|><fim_suffix>\n" * len(image_urls)
    prompt = (f"<|im_start|>user\n{placeholders}{question}<|im_end|>\n"
              "<|im_start|>assistant\n")
    stop_token_ids = [93532, 93653, 944, 93421, 1019, 93653, 93519]

    return ModelRequestData(
        engine_args=engine_args,
        prompt=prompt,
        stop_token_ids=stop_token_ids,
        image_data=[fetch_image(url) for url in image_urls],
    )


def load_deepseek_vl2(question: str,
                      image_urls: list[str]) -> ModelRequestData:
    model_name = "deepseek-ai/deepseek-vl2-tiny"

    engine_args = EngineArgs(
        model=model_name,
        max_model_len=4096,
        max_num_seqs=2,
        hf_overrides={"architectures": ["DeepseekVLV2ForCausalLM"]},
        limit_mm_per_prompt={"image": len(image_urls)},
    )

    placeholder = "".join(f"image_{i}:<image>\n"
                          for i, _ in enumerate(image_urls, start=1))
    prompt = f"<|User|>: {placeholder}{question}\n\n<|Assistant|>:"

    return ModelRequestData(
        engine_args=engine_args,
        prompt=prompt,
        image_data=[fetch_image(url) for url in image_urls],
    )


def load_gemma3(question: str, image_urls: list[str]) -> ModelRequestData:
    model_name = "google/gemma-3-4b-it"

    engine_args = EngineArgs(
        model=model_name,
        max_model_len=8192,
        max_num_seqs=2,
        limit_mm_per_prompt={"image": len(image_urls)},
    )

    placeholders = [{"type": "image", "image": url} for url in image_urls]
    messages = [{
        "role":
        "user",
        "content": [
            *placeholders,
            {
                "type": "text",
                "text": question
            },
        ],
    }]

    processor = AutoProcessor.from_pretrained(model_name)

    prompt = processor.apply_chat_template(messages,
                                           tokenize=False,
                                           add_generation_prompt=True)

    return ModelRequestData(
        engine_args=engine_args,
        prompt=prompt,
        image_data=[fetch_image(url) for url in image_urls],
    )


def load_h2ovl(question: str, image_urls: list[str]) -> ModelRequestData:
    model_name = "h2oai/h2ovl-mississippi-800m"

    engine_args = EngineArgs(
        model=model_name,
        trust_remote_code=True,
        max_model_len=8192,
        limit_mm_per_prompt={"image": len(image_urls)},
        mm_processor_kwargs={"max_dynamic_patch": 4},
    )

    placeholders = "\n".join(f"Image-{i}: <image>\n"
                             for i, _ in enumerate(image_urls, start=1))
    messages = [{'role': 'user', 'content': f"{placeholders}\n{question}"}]

    tokenizer = AutoTokenizer.from_pretrained(model_name,
                                              trust_remote_code=True)
    prompt = tokenizer.apply_chat_template(messages,
                                           tokenize=False,
                                           add_generation_prompt=True)


    # H2OVL-Mississippi 的停止 token
    # https://huggingface.co/h2oai/h2ovl-mississippi-800m
    stop_token_ids = [tokenizer.eos_token_id]

    return ModelRequestData(
        engine_args=engine_args,
        prompt=prompt,
        stop_token_ids=stop_token_ids,
        image_data=[fetch_image(url) for url in image_urls],
    )


def load_idefics3(question: str, image_urls: list[str]) -> ModelRequestData:
    model_name = "HuggingFaceM4/Idefics3-8B-Llama3"

    # 以下配置已确认可以在单个 L40 GPU 上启动。
    engine_args = EngineArgs(
        model=model_name,
        max_model_len=8192,
        max_num_seqs=16,
        enforce_eager=True,
        limit_mm_per_prompt={"image": len(image_urls)},
        # 如果您的内存不足,则可以减少 "LINGEST_EDDE"。
        # 请参阅:https://huggingface.co/huggingfacem4/idefics3-8b-llama3#model-optimization
        mm_processor_kwargs={
            "size": {
                "longest_edge": 2 * 364
            },
        },
    )

    placeholders = "\n".join(f"Image-{i}: <image>\n"
                             for i, _ in enumerate(image_urls, start=1))
    prompt = f"<|begin_of_text|>User:{placeholders}\n{question}<end_of_utterance>\nAssistant:"  # noqa: E501
    return ModelRequestData(
        engine_args=engine_args,
        prompt=prompt,
        image_data=[fetch_image(url) for url in image_urls],
    )


def load_internvl(question: str, image_urls: list[str]) -> ModelRequestData:
    model_name = "OpenGVLab/InternVL2-2B"

    engine_args = EngineArgs(
        model=model_name,
        trust_remote_code=True,
        max_model_len=4096,
        limit_mm_per_prompt={"image": len(image_urls)},
        mm_processor_kwargs={"max_dynamic_patch": 4},
    )

    placeholders = "\n".join(f"Image-{i}: <image>\n"
                             for i, _ in enumerate(image_urls, start=1))
    messages = [{'role': 'user', 'content': f"{placeholders}\n{question}"}]

    tokenizer = AutoTokenizer.from_pretrained(model_name,
                                              trust_remote_code=True)
    prompt = tokenizer.apply_chat_template(messages,
                                           tokenize=False,
                                           add_generation_prompt=True)

    # Internvl 的停止 token
    # 型号变体可能具有不同的停止 token
    # 请参考正确的"停止单词"的模型卡:
    # https://huggingface.co/opengvlab/internvl2-2b/blob/main/conversation.py
    stop_tokens = ["<|endoftext|>", "<|im_start|>", "<|im_end|>", "<|end|>"]
    stop_token_ids = [tokenizer.convert_tokens_to_ids(i) for i in stop_tokens]

    return ModelRequestData(
        engine_args=engine_args,
        prompt=prompt,
        stop_token_ids=stop_token_ids,
        image_data=[fetch_image(url) for url in image_urls],
    )


def load_mllama(question: str, image_urls: list[str]) -> ModelRequestData:
    model_name = "meta-llama/Llama-3.2-11B-Vision-Instruct"

    # 以下配置已确认可以在单个 L40 GPU 上启动。
    engine_args = EngineArgs(
        model=model_name,
        max_model_len=4096,
        max_num_seqs=16,
        limit_mm_per_prompt={"image": len(image_urls)},
    )

    placeholders = "<|image|>" * len(image_urls)
    prompt = f"{placeholders}<|begin_of_text|>{question}"
    return ModelRequestData(
        engine_args=engine_args,
        prompt=prompt,
        image_data=[fetch_image(url) for url in image_urls],
    )


def load_nvlm_d(question: str, image_urls: list[str]) -> ModelRequestData:
    model_name = "nvidia/NVLM-D-72B"


    # 根据需要进行调整以适合 GPU
    engine_args = EngineArgs(
        model=model_name,
        trust_remote_code=True,
        max_model_len=8192,
        tensor_parallel_size=4,
        limit_mm_per_prompt={"image": len(image_urls)},
        mm_processor_kwargs={"max_dynamic_patch": 4},
    )

    placeholders = "\n".join(f"Image-{i}: <image>\n"
                             for i, _ in enumerate(image_urls, start=1))
    messages = [{'role': 'user', 'content': f"{placeholders}\n{question}"}]

    tokenizer = AutoTokenizer.from_pretrained(model_name,
                                              trust_remote_code=True)
    prompt = tokenizer.apply_chat_template(messages,
                                           tokenize=False,
                                           add_generation_prompt=True)

    return ModelRequestData(
        engine_args=engine_args,
        prompt=prompt,
        image_data=[fetch_image(url) for url in image_urls],
    )


def load_pixtral_hf(question: str, image_urls: list[str]) -> ModelRequestData:
    model_name = "mistral-community/pixtral-12b"

    # 根据需要进行调整以适合 GPU
    engine_args = EngineArgs(
        model=model_name,
        max_model_len=8192,
        max_num_seqs=2,
        tensor_parallel_size=2,
        limit_mm_per_prompt={"image": len(image_urls)},
    )

    placeholders = "[IMG]" * len(image_urls)
    prompt = f"<s>[INST]{question}\n{placeholders}[/INST]"

    return ModelRequestData(
        engine_args=engine_args,
        prompt=prompt,
        image_data=[fetch_image(url) for url in image_urls],
    )


def load_phi3v(question: str, image_urls: list[str]) -> ModelRequestData:

    # num_crops 是传递给多模态图像处理器的一个覆盖(override)关键字参数;
    # 对于某些模型,例如 Phi-3.5-vision-instruct,建议在单帧(single frame)场景下使用 16,
    # 而在多帧(multi-frame)场景下使用 4。
    #
    # 一般来说,较大的 num_crops 值会导致每个图像实例生成更多的 token,
    # 因为它可能在图像预处理过程中对图像进行更大范围的缩放。
    #
    # https://huggingface.co/microsoft/Phi-3.5-vision-instruct#loading-the-model-locally
    # https://huggingface.co/microsoft/Phi-3.5-vision-instruct/blob/main/processing_phi3_v.py#L194
    engine_args = EngineArgs(
        model="microsoft/Phi-3.5-vision-instruct",
        trust_remote_code=True,
        max_model_len=4096,
        max_num_seqs=2,
        limit_mm_per_prompt={"image": len(image_urls)},
        mm_processor_kwargs={"num_crops": 4},
    )
    placeholders = "\n".join(f"<|image_{i}|>"
                             for i, _ in enumerate(image_urls, start=1))
    prompt = f"<|user|>\n{placeholders}\n{question}<|end|>\n<|assistant|>\n"

    return ModelRequestData(
        engine_args=engine_args,
        prompt=prompt,
        image_data=[fetch_image(url) for url in image_urls],
    )


def load_phi4mm(question: str, image_urls: list[str]) -> ModelRequestData:
    """
    Phi-4-multimodal-instruct 支持图像和音频输入。
    此示例展示了如何处理多图像输入。
    """

    model_path = snapshot_download("microsoft/Phi-4-multimodal-instruct")

    # 由于 vision-lora 和 speech-lora 与基本模型共存,所以
    # 我们必须手动指定 Lora 权重的路径。
    vision_lora_path = os.path.join(model_path, "vision-lora")
    engine_args = EngineArgs(
        model=model_path,
        trust_remote_code=True,
        max_model_len=10000,
        max_num_seqs=2,
        limit_mm_per_prompt={"image": len(image_urls)},
        enable_lora=True,
        max_lora_rank=320,
    )

    placeholders = "".join(f"<|image_{i}|>"
                           for i, _ in enumerate(image_urls, start=1))
    prompt = f"<|user|>{placeholders}{question}<|end|><|assistant|>"

    return ModelRequestData(
        engine_args=engine_args,
        prompt=prompt,
        image_data=[fetch_image(url) for url in image_urls],
        lora_requests=[LoRARequest("vision", 1, vision_lora_path)],
    )


def load_qwen_vl_chat(question: str,
                      image_urls: list[str]) -> ModelRequestData:
    model_name = "Qwen/Qwen-VL-Chat"
    engine_args = EngineArgs(
        model=model_name,
        trust_remote_code=True,
        max_model_len=1024,
        max_num_seqs=2,
        hf_overrides={"architectures": ["QwenVLForConditionalGeneration"]},
        limit_mm_per_prompt={"image": len(image_urls)},
    )
    placeholders = "".join(f"Picture {i}: <img></img>\n"
                           for i, _ in enumerate(image_urls, start=1))

    # 此模型在其 tokenizer 上没有 chat_template 属性,
    # 因此,我们需要显式传递它。我们使用 ChatML,因为它已在模型的生成工具中使用。
    # https://huggingface.co/qwen/qwen-vl-chat/blob/main/qwen_generation_utils.py#l265
    tokenizer = AutoTokenizer.from_pretrained(model_name,
                                              trust_remote_code=True)

    # 从:https://huggingface.co/docs/transformers/main/en/chat_templating 复制
    chat_template = "{% if not add_generation_prompt is defined %}{% set add_generation_prompt = false %}{% endif %}{% for message in messages %}{{'<|im_start|>' + message['role'] + '\n' + message['content'] + '<|im_end|>' + '\n'}}{% endfor %}{% if add_generation_prompt %}{{ '<|im_start|>assistant\n' }}{% endif %}"  # noqa: E501

    messages = [{'role': 'user', 'content': f"{placeholders}\n{question}"}]
    prompt = tokenizer.apply_chat_template(messages,
                                           tokenize=False,
                                           add_generation_prompt=True,
                                           chat_template=chat_template)

    stop_tokens = ["<|endoftext|>", "<|im_start|>", "<|im_end|>"]
    stop_token_ids = [tokenizer.convert_tokens_to_ids(i) for i in stop_tokens]

    return ModelRequestData(
        engine_args=engine_args,
        prompt=prompt,
        stop_token_ids=stop_token_ids,
        image_data=[fetch_image(url) for url in image_urls],
        chat_template=chat_template,
    )


def load_qwen2_vl(question: str, image_urls: list[str]) -> ModelRequestData:
    try:
        from qwen_vl_utils import process_vision_info
    except ModuleNotFoundError:
        print('WARNING: `qwen-vl-utils` not installed, input images will not '
              'be automatically resized. You can enable this functionality by '
              '`pip install qwen-vl-utils`.')
        process_vision_info = None

    model_name = "Qwen/Qwen2-VL-7B-Instruct"

    # 在 L40上测试
    engine_args = EngineArgs(
        model=model_name,
        max_model_len=32768 if process_vision_info is None else 4096,
        max_num_seqs=5,
        limit_mm_per_prompt={"image": len(image_urls)},
    )

    placeholders = [{"type": "image", "image": url} for url in image_urls]
    messages = [{
        "role": "system",
        "content": "You are a helpful assistant."
    }, {
        "role":
        "user",
        "content": [
            *placeholders,
            {
                "type": "text",
                "text": question
            },
        ],
    }]

    processor = AutoProcessor.from_pretrained(model_name)

    prompt = processor.apply_chat_template(messages,
                                           tokenize=False,
                                           add_generation_prompt=True)

    if process_vision_info is None:
        image_data = [fetch_image(url) for url in image_urls]
    else:
        image_data, _ = process_vision_info(messages)

    return ModelRequestData(
        engine_args=engine_args,
        prompt=prompt,
        image_data=image_data,
    )


def load_qwen2_5_vl(question: str, image_urls: list[str]) -> ModelRequestData:
    try:
        from qwen_vl_utils import process_vision_info
    except ModuleNotFoundError:
        print('WARNING: `qwen-vl-utils` not installed, input images will not '
              'be automatically resized. You can enable this functionality by '
              '`pip install qwen-vl-utils`.')
        process_vision_info = None

    model_name = "Qwen/Qwen2.5-VL-3B-Instruct"

    engine_args = EngineArgs(
        model=model_name,
        max_model_len=32768 if process_vision_info is None else 4096,
        max_num_seqs=5,
        limit_mm_per_prompt={"image": len(image_urls)},
    )

    placeholders = [{"type": "image", "image": url} for url in image_urls]
    messages = [{
        "role": "system",
        "content": "You are a helpful assistant."
    }, {
        "role":
        "user",
        "content": [
            *placeholders,
            {
                "type": "text",
                "text": question
            },
        ],
    }]

    processor = AutoProcessor.from_pretrained(model_name)

    prompt = processor.apply_chat_template(messages,
                                           tokenize=False,
                                           add_generation_prompt=True)

    if process_vision_info is None:
        image_data = [fetch_image(url) for url in image_urls]
    else:
        image_data, _ = process_vision_info(messages,
                                            return_video_kwargs=False)

    return ModelRequestData(
        engine_args=engine_args,
        prompt=prompt,
        image_data=image_data,
    )


model_example_map = {
    "aria": load_aria,
    "deepseek_vl_v2": load_deepseek_vl2,
    "gemma3": load_gemma3,
    "h2ovl_chat": load_h2ovl,
    "idefics3": load_idefics3,
    "internvl_chat": load_internvl,
    "mllama": load_mllama,
    "NVLM_D": load_nvlm_d,
    "phi3_v": load_phi3v,
    "phi4_mm": load_phi4mm,
    "pixtral_hf": load_pixtral_hf,
    "qwen_vl_chat": load_qwen_vl_chat,
    "qwen2_vl": load_qwen2_vl,
    "qwen2_5_vl": load_qwen2_5_vl,
}


def run_generate(model, question: str, image_urls: list[str],
                 seed: Optional[int]):
    req_data = model_example_map[model](question, image_urls)

    engine_args = asdict(req_data.engine_args) | {"seed": args.seed}
    llm = LLM(**engine_args)

    # 要维护此脚本中的代码兼容性,我们在此处添加 Lora。
    # 您还可以使用:
    # llm.generate(prompts, lora_request=lora_request,...)
    if req_data.lora_requests:
        for lora_request in req_data.lora_requests:
            llm.llm_engine.add_lora(lora_request=lora_request)

    sampling_params = SamplingParams(temperature=0.0,
                                     max_tokens=128,
                                     stop_token_ids=req_data.stop_token_ids)

    outputs = llm.generate(
        {
            "prompt": req_data.prompt,
            "multi_modal_data": {
                "image": req_data.image_data
            },
        },
        sampling_params=sampling_params)

    for o in outputs:
        generated_text = o.outputs[0].text
        print(generated_text)


def run_chat(model: str, question: str, image_urls: list[str],
             seed: Optional[int]):
    req_data = model_example_map[model](question, image_urls)

    engine_args = asdict(req_data.engine_args) | {"seed": seed}
    llm = LLM(**engine_args)

    # 要维护此脚本中的代码兼容性,我们在此处添加 Lora。
    # 您还可以使用:
    # llm.generate(prompts, lora_request=lora_request,...)
    if req_data.lora_requests:
        for lora_request in req_data.lora_requests:
            llm.llm_engine.add_lora(lora_request=lora_request)

    sampling_params = SamplingParams(temperature=0.0,
                                     max_tokens=128,
                                     stop_token_ids=req_data.stop_token_ids)
    outputs = llm.chat(
        [{
            "role":
            "user",
            "content": [
                {
                    "type": "text",
                    "text": question,
                },
                *({
                    "type": "image_url",
                    "image_url": {
                        "url": image_url
                    },
                } for image_url in image_urls),
            ],
        }],
        sampling_params=sampling_params,
        chat_template=req_data.chat_template,
    )

    for o in outputs:
        generated_text = o.outputs[0].text
        print(generated_text)


def main(args: Namespace):
    model = args.model_type
    method = args.method
    seed = args.seed

    if method == "generate":
        run_generate(model, QUESTION, IMAGE_URLS, seed)
    elif method == "chat":
        run_chat(model, QUESTION, IMAGE_URLS, seed)
    else:
        raise ValueError(f"Invalid method: {method}")


if __name__ == "__main__":
    parser = FlexibleArgumentParser(
        description='Demo on using vLLM for offline inference with '
        'vision language models that support multi-image input for text '
        'generation')
    parser.add_argument('--model-type',
                        '-m',
                        type=str,
                        default="phi3_v",
                        choices=model_example_map.keys(),
                        help='Huggingface "model_type".')
    parser.add_argument("--method",
                        type=str,
                        default="generate",
                        choices=["generate", "chat"],
                        help="The method to run in `vllm.LLM`.")
    parser.add_argument("--seed",
                        type=int,
                        default=None,
                        help="Set the seed when initializing `vllm.LLM`.")

    args = parser.parse_args()
    main(args)

o3/o4-mini:从文本生成到自主推理的范式跃迁 大语言模型正经历从‘生成式AI’向‘推理式AI’的关键演进。其核心在于将思考过程显式化、可调度、可验证,而非隐藏于黑箱token流中。这一转变依托图像-文本深度语义嵌入、自主工具编排与强化学习驱动的思考效率优化三大技术支柱,显著提升单位计算资源的信息增益与任务闭环能力。在数学推理、多模态分析、编程辅助等场景中,模型展现出抗干扰强、意图理解准、错误自诊断等工程优势。o3/o4-mini并非参数升级,而是以‘思考即服务’为内核的新一代推理代理,标志着AI从响应工具迈向协作智能体的重要拐点。 阅读详情

相关推荐

Qwen 2.5 VL本地部署实战:图文对齐原理与ComfyUI集成指南

多模态大模型中的视觉-语言(VL)对齐,是实现图文协同理解的核心技术基础。其本质在于跨模态特征空间的联合建模与语义对齐,依赖双路径视觉编码、专用tokenizer设计及严格对话模板约束。Qwen 2.5 VL通过ViT-L主干与Patch-wise ResNet分支协同,显著提升空间关系推理能力,在工业质检、医疗图文报告等强逻辑场景中展现12.7%准确率优势。但该架构对输入格式高度敏感——如system message位置错误、图像batch策略失当或embedding层混用,均会触发显存溢出、token

weixin_33724059的博客 684

vLLM部署视觉语言模型:从原理到实践的多模态推理优化

Transformer架构通过自注意力机制处理序列数据,已成为自然语言处理和多模态任务的核心。其原理在于将输入映射为查询、键、值向量,通过注意力权重计算实现上下文建模。在工程实践中,高效管理这些计算过程中的键值缓存是提升推理性能的关键技术价值所在,尤其对于需要处理图像和文本混合输入的多模态应用场景。视觉语言模型将图像编码为特征序列,其静态性、长序列特性对传统的文本优化方案提出了新挑战。本文聚焦于如何基于vLLM推理引擎,适配并优化视觉特征的KV Cache管理,以解决部署Qwen-VL、LLaVA等模型时遇

weixin_30437847的博客 292

DeepSeek模型命名规则与技术栈避坑指南

大语言模型的命名体系是理解其能力边界与工程适配性的第一把钥匙。DeepSeek系列通过后缀(如-R1、-V2、-V4)、领域前缀(Coder、VL、Math)和部署形态(API/本地/vLLM/Ollama)构建了一套隐含架构演进逻辑的技术坐标系。其核心原理在于模块化解耦:不同分支采用差异化的Tokenizer、注意力机制、多模态对齐方式及工具调用协议,导致相同模型权重在不同技术栈中行为迥异。这种设计带来显著技术价值——支持细粒度能力定制与资源敏感型部署,但也埋下概念混淆、API隐式约束、tokenizer

culh2177的博客 557

基于vLLM部署视觉语言模型:解决VLM推理三大痛点的工程实践

大语言模型(LLM)推理优化是当前AI工程化的核心挑战之一,其关键在于高效管理自回归生成过程中的KV Cache。vLLM通过创新的PagedAttention内存管理算法,将KV Cache分块管理,有效消除了内存碎片,从而在服务端实现了极高的吞吐量和并发能力。这一技术对于需要处理海量并发请求的AI应用具有重要价值,尤其在多模态AI领域。视觉语言模型(VLM)将视觉理解与语言生成相结合,但其文本生成部分与LLM面临相同的推理瓶颈。通过将vLLM的高效推理引擎与VLM的视觉编码器相结合,可以构建高性能的视觉

dgqvhtlwq472235338的博客 365

新手避坑指南:用Silvaco Atlas搞定GaN HEMT电热仿真的完整流程(附代码解读)

本文详细介绍了使用Silvaco Atlas进行GaN HEMT电热特性仿真的完整流程,特别针对新手常见问题提供避坑指南。从软件环境配置、结构定义、网格划分到物理模型设置,逐步解析关键步骤,并附有代码解读和调试技巧,帮助读者快速掌握GaN器件仿真的核心技术。

weixin_29215815的博客 597

Unity3D实战:5分钟搞定RTSP监控视频播放(附完整代码)

本文提供了一套在Unity3D中快速集成RTSP监控视频播放的实战方案。通过采用LibVLCSharp for Unity这一成熟稳定的跨平台中间件,开发者可以轻松实现RTSP流的解码与渲染,并附有完整的C#代码示例,帮助用户在5分钟内完成集成,适用于智慧园区、安防监控等3D可视化场景。

weixin_29001655的博客 191

InternLM-XComposer: A Vision-Language Large Model for Advanced Text-image Comprehension and Composit

Image Retrieval and Selection阶段:已知适合图片插入的段落位置和caption,clip模型用caption去检索底库图片,获取topn个图片作为候选集,再用多模态LLM从候选集中进行选择,图片的选择信息结合了前文的文本和图片,进一步提升图片、文本主题一致性。训练数据:预训练使用数据如下,基本都是image-pair对的中英双语数据,为了保留初始InternLM的能力,训练时候也用到了InternLM预训练阶段的部分文本数据。

yangyanbao8389的博客 1069

从零开始用TS开发babylonjs - 本机环境搭建

babylonjs,初始化本地安装,web3d引擎

han3527638的专栏 794

Qwen3.5架构解剖:从MoE路由到多模态Token对齐的全栈部署指南

大语言模型(LLM)的推理架构正从标准Transformer向混合专家(MoE)、门控增量网络与多模态统一表征演进。Qwen3.5作为典型代表,其核心突破在于将视觉、文本、视频输入映射至共享的multimodal token空间,并通过Gated DeltaNet降低长上下文计算复杂度。这种架构升级带来显著技术价值:支持百万级token上下文、原生工具调用(Tool Calling)与跨模态联合推理,但同时也对vLLM、SGLang等推理引擎提出新适配要求。典型应用场景包括ComfyUI多模态工作流集成、A

weixin_33695450的博客 462

Ubuntu20.04安装Torque-6.1.2单机版(踩坑篇)

说明:PBS排队系统原先是在Centos7安装使用很顺利,但是有客户需求在Ubuntu20.04上使用,着手在Ubuntu20.04安装上安装的时候发现很多报错,并不能顺利安装,网上查找到的教程,有的说是让放弃转slurm,有的是换源安装,但是安装好的版本很低,有许多bug,不是很好用。经过自己慢慢摸索之后,改了部分配置以及源码之后,能够顺利安装,再次记录一下踩坑心得,与大家一起分享学习。如有问题,欢迎大家来撩。...............

华青水上的博客 8087

33、AI赋能5G/6G通信:LDPC码解码与强化学习技术解析

本文探讨了基于AI和强化学习的LDPC码技术在5G/6G通信中的应用。包括LAMS解码器、神经MS解码器、盲识别方法、统一极性-LDPC解码器、NNMS和SNNMS解码器、N-2D-NMS解码器、神经分层MS解码器、MAB-NS方案以及强化学习与MCTS结合的技术。这些技术在提升解码性能、降低计算复杂度和增强系统适应性方面表现出色,为未来通信系统的发展提供了强有力的支持。

lambda的博客 242

vLLM多模态推理实践:多图视觉语言模型部署与优化指南

多模态大模型通过整合视觉与语言信息,实现了对图像和文本的联合理解,其核心原理在于将图像编码为特征序列并与文本嵌入空间对齐。这一技术显著扩展了AI模型的感知能力,在智能客服、内容分析、机器人交互等场景中具有重要价值。本文聚焦于如何在vLLM高性能推理引擎中部署支持多图输入的视觉语言模型,深入探讨了视觉编码器与LLM的协同推理、多图输入的序列化表示、以及PagedAttention内存管理的适配策略等工程挑战。针对计算资源调度和动态批处理优化,文章提供了分离式与一体化两种架构的实践方案,并分享了在模型加载、输入

weixin_34204722的博客 396

南 京 农 业 大 学 试 题 纸 附表(rape.csv)是25个油菜材料,测得每个材料的千粒重、亚油酸等的含量. (1) 对物质含量的八个指标作主成分分析,画出碎石图和主成分得分图; (2) 选

(1)请用n1

Mrrunsen的博客 498

多图视觉语言模型vLLM:跨模态理解与生成技术解析

视觉语言模型是计算机视觉与自然语言处理融合的前沿方向,通过共享表示空间实现跨模态语义对齐。其核心技术在于多模态注意力机制,既能提取视觉特征,又能建立与文本的深层关联。这类模型在智能相册管理、电商搜索、医疗报告生成等场景展现巨大价值,其中vLLM框架凭借高效的分布式推理架构成为行业标杆。以多图理解为例,模型需要处理跨图像特征交互和动态文本生成等挑战,通过改进的注意力机制和强化学习策略,能准确理解'展示同一商品不同穿搭'等复杂查询。开源工具如FAISS索引的引入,进一步提升了亿级图像库的检索效率。

weixin_30691871的博客 324

SOUL.md 人格定制的 7 个高阶技巧:Hermes Agent 精准控制 AI 行为模式

揭示 SOUL.md 的本质是行为契约而非人格设定,介绍7个围绕边界约束的高阶技巧,包括用上下文锚点(INPUT SCOPE/OUTPUT TARGET/CONSTRAINTS)替代角色描述、动态渲染锚点适配CI流程等,显著降低token消耗与人工review耗时。

weixin_42520239的博客 252

电机驱动器MP6540H应用设计

/ ... 其他初始化函数(SystemClock_Config, MX_GPIO_Init, MX_TIM1_Init, MX_TIM2_Init)需要你根据STM32CubeMX生成或手动编写。// 假设霍尔传感器引脚是 GPIO_PIN_8, GPIO_PIN_9, GPIO_PIN_10。// 低侧U相GPIO引脚。

zhusl6688的博客 660

从零构建多图像视觉语言模型:原理、架构与工程实践

视觉语言模型(VLM)作为连接计算机视觉与自然语言处理的关键技术,其核心原理在于将图像信息编码为与文本语义空间对齐的特征表示,再通过大语言模型(LLM)的推理能力生成自然语言描述或回答。这项技术的核心价值在于赋予AI系统跨模态的理解与生成能力,使其能够处理图像描述、视觉问答、多模态对话等复杂任务。在实际应用中,当场景需要同时分析、对比或关联多张图像时(如产品多角度对比、医疗影像序列分析),传统的单图VLM便面临挑战,这催生了多图像视觉语言模型(Multi-Image VLM)的需求。本文聚焦于如何从零搭建一

weixin_34008933的博客 400

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

专业 英语

计算机、数学、机械等专业的专业英语词汇

Edward2022的博客 2948

廖雪峰Python教程[完整版]

廖雪峰的python教程整理的,已经排好版了,而且还是完整的,适合小白

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

从零开始:使用AMD-Quark为MiniMax-M3创建自定义量化模型的终极指南

想要在AMD硬件上高效运行MiniMax-M3多模态大语言模型吗?本教程将为您展示如何利用AMD-Quark工具为MiniMax-M3创建MXFP4和FP8混合量化模型,实现高达98.65%的精度恢复率!AMD-Quark量化技术是优化大模型推理性能的关键工具,能够显著降低模型的内存占用和计算成本。 ## 📊 为什么选择AMD-Quark量化? AMD-Quark是AMD官方推出的模型量化工

gitblog_00927的博客 627

lwip-2.0.3

lwip是瑞典计算机科学院(SICS)的Adam Dunkels 开发的一个小型开源的TCP/IP协议栈。实现的重点是在保持TCP协议主要功能的基础上减少对RAM 的占用。

MiniMax-M3-MXFP4模型深度解析:AMD MI350平台上的多模态AI革命

MiniMax-M3-MXFP4是基于AMD MI350/MI355平台优化的多模态AI模型,通过MXFP4量化技术实现了高性能与高效率的完美平衡。作为MiniMaxAI/MiniMax-M3的优化版本,该模型在保持94.19%准确率的同时,显著降低了计算资源需求,为开发者提供了一个强大且经济的多模态解决方案。 ## 核心特性与技术突破 ### 革命性的MXFP4量化技术 MiniMax-M

gitblog_01097的博客 897

Gemma 4私有部署指南:轻量多模态模型在24GB显存设备上的工程实践

多模态大模型正从云端走向边缘,但Qwen 3.5-VL等强模型受限于高显存(>26GB)与部署复杂度,难以落地中小场景。其核心原理在于视觉编码器与语言模型的协同推理,技术价值体现在低资源下的结构化输出、工具链编排与可审计思考路径。典型应用场景包括医疗影像分析、AI漫剧生成、遥感图像处理等对数据隐私与实时性要求高的领域。本文聚焦Gemma 4——一个基于Gemma 2底座融合Qwen 3.5多模态能力的非官方但高度工程化的轻量级方案,详解其LoRA+Adapter Fusion微调、ReAct思考模式、MCP

weixin_34006965的博客 353

Docker Agent:构建可编排、可隔离的多智能体AI系统

多智能体系统(Multi-Agent System)正从概念验证走向工业级落地,其核心挑战在于智能体间的解耦、可观测性与运行时治理。Docker Agent 作为一种以 OCI 镜像为交付单元、YAML 为行为契约、标准 HTTP/gRPC 为协作协议的轻量级 AI 服务实例,将模型能力封装为独立、可灰度、可审计的服务单元。它不依赖特定框架或云厂商,支持 Rust/Go/C++/Python 等多语言实现,天然兼容 Prometheus 监控与 Kubernetes 编排。该范式特别适用于金融风控、工业质检

weixin_33698043的博客 345

Qwen3.8-27B 全面解读:阿里最强开源多模态大模型,凭什么值得你立刻上手?

Qwen3.8-27B 是阿里通义千问团队最新发布的开源多模态大模型,也是目前 Qwen 开源家族中综合能力最强的 27B 级稠密模型。它原生支持图片与视频理解、灵活的思考控制与超长上下文,同时兼容 Transformers、vLLM、SGLang 等主流推理框架。无论你是想本地部署一个大模型做开发助手,还是想体验"能看图、会思考、可自主干活"的多模态大模型,Qwen3.8-27B 都是当下最值得

gitblog_00434的博客 1077

Qwen3.6-27B去审查模型:从原理到部署的完整实战指南

Qwen3.6-27B-uncensored-heretic-v2-Native-MTP-Preserved-GGUF代表了当前最先进的无审查AI模型技术,在保持原始模型性能的同时实现了94%的拒绝率降低,为开发者和研究者提供了真正无限制的高性能推理与多模态支持。这个去审查AI模型基于创新的MPOA方法,在去除内容过滤机制的同时完整保留了关键的MTP组件,确保了模型在专业任务上的卓越表现。 ##

gitblog_00603的博客 1014

如何构建多模态智能助手:DeepSeek-VL2实战指南

你是否曾经面对复杂的视觉内容却无法让AI准确理解?当需要处理图像识别、视觉问答或跨模态推理时,传统的语言模型往往力不从心。DeepSeek-VL2正是为解决这一痛点而生,它作为基于混合专家架构的先进视觉语言模型,能够实现图像与文本的深度融合理解,为开发者提供了构建下一代多模态应用的能力。 ## 核心原理:混合专家架构如何突破视觉语言融合瓶颈 ### 混合视觉编码器:从像素到语义的智能转换 D

gitblog_02260的博客 494

【大模型】-名词手册-扫盲

本篇文章用来记录在了解学习大模型的过程中遇到的一些名词缩写,好记性不如烂笔头,记录下来,也供大家参考。如有不正确的,欢迎指正。

记忆、理解、表达和融会贯通。 1340
上一篇: 【Triton 教程】triton_language.erf
下一篇: 在线教程丨低门槛部署英伟达最新Physical AI模型,覆盖人形机器人/人体运动生成/扩散模型微调等
HyperAI超神经
博客等级 码龄7年 8873粉丝 1753原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值