Servirea Modelelor Multimodale (Vision-Language) în vLLM în vLLM & Infrastructură LLM

Găzduirea pe infrastructură proprie a modelelor capabile să proceseze imagini, diagrame și documente scanate alături de text prin API compatibil OpenAI.

Sintaxă & invocare
vllm serve cu modele VLM (Qwen2-VL, Pixtral)

Până la apariția noilor arhitecturi Vision-Language (VLM) de înaltă performanță, analiza documentelor cu imagini sau grafice era monopolizată de API-uri proprietare precum GPT-4o. Noile modele open-source (precum Qwen2-VL sau Mistral Pixtral) oferă performanțe comparabile și pot fi rulate în regie proprie prin vLLM.

vLLM gestionează procesarea multimodală prin codarea imaginilor folosind un Vision Encoder (cum ar fi ViT – Vision Transformer), intercalând tokenii vizuali rezultați direct în fluxul de tokeni de text al modelului de bază.

Serverul expune endpoint-ul standard /v1/chat/completions cu suport pentru array-ul image_url (atât linkuri HTTPS cât și imagini codificate base64), permițând integrarea instantanee cu biblioteci existente de Python sau clienți web precum Open WebUI.

Sintaxă, opțiuni și concepte cheie

Opțiune / Concept Descriere practică
image_url Formatul compatibil OpenAI de trimitere a imaginilor: `{„type”: „image_url”, „image_url”: {„url”: „data:image/jpeg;base64,…”}}`.
Vision Encoder Componenta de rețea neuronală care transformă matricea de pixeli în reprezentări vectoriale de tokeni vizuali.
Dynamic Image Resolution Abilitatea modelului (ex. Qwen2-VL) de a păstra rezoluția nativă a imaginii fără deformare sau decupare forțată.
--limit-mm-per-prompt Parametru de configurare vLLM ce specifică numărul maxim de imagini permise într-un singur prompt (implicit 1).

Exemple practice și comenzi

Exemplul 1: Lansarea modelului Qwen2-VL-7B pe GPU și interogare cu imagine base64

Configurarea completă pentru recunoașterea automată a conținutului din imagini.

# 1. Pornim serverul vLLM multimodal:
$ python3 -m vllm.entrypoints.openai.api_server \
    --model Qwen/Qwen2-VL-7B-Instruct \
    --dtype bfloat16 \
    --gpu-memory-utilization 0.90 \
    --port 8000

# 2. Interogare în Python:
import openai, base64
client = openai.OpenAI(base_url="http://localhost:8000/v1", api_key="none")

with open("schema_retea.png", "rb") as f:
    b64 = base64.b64encode(f.read()).decode()

raspuns = client.chat.completions.create(
    model="Qwen/Qwen2-VL-7B-Instruct",
    messages=[{
        "role": "user",
        "content": [
            {"type": "text", "text": "Identifică adresele IP din diagrama de rețea atașată:"},
            {"type": "image_url", "image_url": {"url": f"data:image/png;base64,{b64}"}}
        ]
    }]
)
print(raspuns.choices[0].message.content)

Rezultat & Impact

Extragerea precisă a diagramelor și tabelelor cu confidențialitate absolută a datelor.

Greșeli frecvente și bune practici

  • Trimiterea de imagini de rezoluții gigantice (peste 4K) fără redimensionare preliminară, ceea ce poate genera peste 10.000 de tokeni vizuali pentru o singură imagine, epuizând VRAM-ul.
  • Uitările legate de setarea flagului `–limit-mm-per-prompt` atunci când utilizatorul dorește să compare două sau trei imagini simultan.

Ghiduri și noțiuni înrudite