Chat
Ask me anything
Ithy Logo

解鎖 vLLM 強大潛能:深入剖析其多元輸入機制與處理能力

從純文字到多模態數據,全面了解 vLLM 如何高效處理您的 AI 模型輸入。

vllm-input-types-capabilities-mfphb56q

vLLM (Very Large Language Model) 作為一個高效能的語言模型推理和服務函式庫,其強大之處不僅在於其卓越的吞吐量和記憶體效率,更在於它能夠靈活處理多種類型的輸入。了解 vLLM 可接受的輸入形式,對於最大化其效能並應用於各種複雜 AI 任務至關重要。本篇將深入探討 vLLM 支援的各種輸入類型、其內部的處理流程,以及相關的重要考量因素。


核心亮點速覽

  • 多元輸入支援: vLLM 不僅能處理基本的純文字和 tokenized 提示,更支援複雜的多模態數據(如文字加圖像)以及結構化的聊天格式輸入,滿足多樣化應用需求。
  • 高效處理流程: 透過精密的輸入管道設計,包括自動分詞、輸入轉換(利用 INPUT_REGISTRYMULTIMODAL_REGISTRY)及先進的排程機制(如 PagedAttention),vLLM 實現了高吞吐量且記憶體效率優異的推理服務。
  • 靈活配置與關鍵限制: 使用者可配置如 LoRA 適配器、GPU 記憶體利用率等參數。同時,也需注意模型的上下文長度 (Context Length)、最大模型長度 (max_model_len),以及多模態輸入的當前限制(例如,部分版本尚不支援交錯式模態輸入)。

vLLM 主要支援的輸入類型

vLLM 的設計使其能夠應對從簡單到複雜的各種輸入需求。以下是其支援的主要輸入類型:

純文字提示 (Text Prompts)

最基礎且廣泛應用的輸入

這是 vLLM 最基本也最常見的輸入形式。使用者可以直接提供單一的純文字字串,或是一個包含多個提示的列表(用於離線批量推理)。vLLM 內部會將這些文字提示通過分詞器 (tokenizer) 轉換為模型可以理解的 token ID 序列。這種輸入方式適用於各類文本生成任務、問答系統和基本的聊天機器人應用。


# 範例:使用純文字提示
prompts = ["請介紹一下大型語言模型。", "巴黎是法國的首都嗎?"]
# outputs = llm.generate(prompts, sampling_params) # 實際調用時
    

Tokenized 提示 (Tokenized Prompts)

為進階使用者提供更細緻的控制

對於需要更精確控制輸入或已自行完成分詞流程的應用,vLLM 支援直接接收已經被分詞器轉換後的 token ID 序列。這可以繞過 vLLM 內部的部分預處理步驟,有時能帶來些微的效能提升,特別是在大規模批次處理或對分詞過程有特殊客製化需求的場景中。

多模態輸入 (Multi-modal Inputs)

融合文字與視覺資訊的能力

vLLM 持續發展對多模態模型的支援,使其能夠處理結合不同類型數據的輸入,目前主要集中在文字與圖像的結合。這類輸入通常會被組織成一個特定的數據結構,例如一個字典(MultiModalDataDict),其中包含文字提示以及圖像數據(可能已被預處理為 token 形式)。

展示 vLLM 應用於聊天機器人介面的示意圖
vLLM 可驅動如上圖所示的聊天機器人,處理文字輸入並生成回應。

儘管 vLLM 在多模態處理上取得了進展,但仍需注意一些目前的局限性,例如:

  • 交錯式模態輸入 (Interleaved Modality Input): 某些版本的 vLLM 可能尚未完全支援圖像和文字在輸入序列中交錯出現的複雜模式。
  • 模型依賴性: 多模態功能高度依賴所使用的具體模型是否支援此類輸入。
  • 配置需求: 可能需要特定的配置參數(如 --disable-chunked-mm-input 或其他多模態處理器參數 mm_processor_kwargs)來啟用或調整多模態處理行為。

聊天格式輸入 (Chat Format Inputs)

專為對話式 AI 設計

為了更好地支援對話型 AI 應用,vLLM 支援類似 OpenAI Chat API 的聊天格式輸入。這意味著可以將多輪對話的歷史記錄(包含系統、使用者和助手等不同角色的發言)結構化,並透過模型對應的聊天模板 (chat template) 進行格式化處理後,再傳遞給模型。這種方式有助於模型理解對話上下文,從而生成更連貫和相關的回應。


# 範例:使用聊天格式輸入 (概念性)
# messages = [
#     {"role": "system", "content": "你是一個樂於助人的 AI 助理。"},
#     {"role": "user", "content": "vLLM 有哪些主要功能?"}
# ]
# text_input = tokenizer.apply_chat_template(messages, tokenize=False, add_generation_prompt=True)
# outputs = llm.generate([text_input], sampling_params) # 實際調用時
    

結構化輸出導向輸入 (Structured Output-Oriented Inputs)

引導模型產生特定格式的結果

雖然這主要 يتعلق بالتحكم في تنسيق الإخراج، إلا أن vLLM تدعم أيضًا تضمين تعليمات أو قوالب في الإدخال لتوجيه النموذج لإنشاء مخرجات منظمة، مثل تنسيق JSON. يتم ذلك عادةً عن طريق تكوين GuidedDecodingParams لتحديد قيود على الإخراج الذي تم إنشاؤه. هذا مفيد بشكل خاص للتطبيقات التي تتطلب تحليلًا آليًا سهلًا لنتائج النموذج، مثل تكامل واجهة برمجة التطبيقات أو استخراج البيانات.

嵌入式提示 (Embeddings Prompts)

特定模型的向量表示輸入

對於某些特定模型架構或專注於嵌入任務的模型(例如 pooling 模型),vLLM 也提供了對嵌入式輸入的初步支援。這種類型的輸入是以向量表示(embeddings)的形式直接提供給模型,而非原始文字。相關的處理類別可能如 EmbedsPrompt。然而,需要注意的是,截至目前(2025 年初),vLLM 對直接使用 embedding 向量作為通用輸入的支援仍然有限,並非所有模型或所有情境都適用,通常不被視為主流的輸入方式。一份 GitHub issue (vllm-project/vllm#6128) 中曾有討論確認此點。


輸入處理流程與關鍵考量

vLLM 擁有一套精心設計的輸入處理管道,以確保輸入數據能被高效且正確地轉換並傳遞給語言模型進行推理。

vLLM 的輸入處理管道

從接收到執行的完整流程

vLLM 的輸入處理流程大致可以概括為以下幾個步驟:

  1. 輸入接收 (Input Reception): LLMEngine 接收來自使用者的輸入,這可能是純文字字串、token ID 列表,或是包含多模態數據的字典。
  2. 預處理 (Preprocessing):
    • 對於文字輸入,vLLM 會使用分詞器(通常來自 Hugging Face Transformers 函式庫,如 AutoTokenizer)將其轉換為 token ID。
    • 對於多模態輸入,則會調用特定的多模態處理器(如由 MultiModalConfig 配置的處理器)來處理非文字部分的數據。
  3. 輸入轉換 (Input Transformation): 透過 INPUT_REGISTRY.process_input() 等內部機制,將預處理後的數據轉換為模型執行器 (Model Executor) 所需的標準格式。這一步驟會整合所有必要的元數據和 token 序列。
  4. 排程與執行 (Scheduling and Execution): 轉換後的輸入請求會被加入到一個等待隊列中。vLLM 的排程器 (Scheduler),結合其核心技術如 PagedAttention,會高效地管理這些請求,將它們組合成批次 (batches),並分配到 GPU 上執行推理,以最大化硬體利用率和處理吞吐量。
  5. 輸出生成 (Output Generation): 模型根據處理後的輸入執行推理,並生成相應的輸出,例如生成的文字序列或嵌入向量。

重要參數與限制

影響輸入處理的關鍵因素

在使用 vLLM 時,以下是一些與輸入處理密切相關的參數和限制,使用者應加以注意:

  • 上下文長度 (Context Length): 這是模型能夠一次性處理的最大 token 數量(包括輸入提示和預期生成的輸出)。例如,某些模型支援高達 64K tokens 的上下文長度。實際可輸入的 token 數量約為上下文長度減去模型配置的最大輸出長度。
  • 最大模型長度 (max_model_len): 此參數在 vLLM 啟動時設定,定義了模型能處理的最大序列長度。輸入提示加上預期生成的 token 數不能超過此限制。
  • GPU 記憶體利用率 (gpu_memory_utilization): 此參數控制 vLLM 可以使用的 GPU 記憶體比例,用於存放模型權重、KV 快取和中間激活值。合理的設定對處理長輸入或大批次至關重要。
  • LoRA 適配器 (LoRA Adapters): vLLM 支援在推理時動態載入 LoRA 適配器,允許對基礎模型進行微調。相關配置包括啟用 LoRA 處理、最大 LoRA 數量等。
  • CPU 交換空間 (cpu_swap_space): 在 GPU 記憶體不足時,vLLM 可以將部分 KV 快取交換到 CPU RAM,此參數定義了可用的交換空間大小。
  • 數據類型 (Data Type): 可以為 KV 快取指定數據類型(如 float16, bfloat16),影響記憶體佔用和精度。
  • 設備類型 (Device Type): vLLM 主要為 GPU 設計,但也可透過設置環境變數 VLLM_TARGET_DEVICE='cpu' 嘗試在 CPU 上運行(效能會顯著降低)。
  • API 金鑰 (API Key): 若將 vLLM 作為伺服器部署,可以設定 API 金鑰以進行請求驗證。
  • 多輪對話處理: 在多輪對話中,由於大多數伺服器端部署的 vLLM 不會自動保存對話上下文,因此每次新的請求通常需要將之前的對話歷史作為輸入的一部分重新傳遞給模型。

輸入類型比較與應用場景

為了更清晰地理解不同輸入類型的特性及其適用場景,下表進行了簡要的比較:

輸入類型 描述 主要應用場景 注意事項
純文字提示 (Text Prompts) 以字串形式提供的自然語言輸入。 問答、文本生成、聊天機器人。 需經分詞處理;受模型上下文長度限制。
Tokenized 提示 (Tokenized Prompts) 已預先轉換為 token ID 序列的輸入。 高效能批次推理、需自訂分詞流程的應用。 使用者需自行處理分詞;繞過 vLLM 部分預處理。
多模態輸入 (Multi-modal Inputs) 結合文字與其他媒體(如圖像)的輸入。 圖像描述、視覺問答、內容生成。 目前主要支援文字+圖像;可能不支援交錯模態;需模型本身支援。
聊天格式輸入 (Chat Format Inputs) 結構化的多輪對話歷史,包含角色資訊。 多輪對話型 AI、客服助理、虛擬角色。 需遵循特定聊天模板(如 OpenAI 格式);有效管理對話上下文。
結構化輸出導向輸入 (Structured Output-Oriented Inputs) 透過提示中的指令或模板,引導模型產生特定格式(如 JSON)的輸出。 API 整合、數據提取、自動化流程。 主要影響輸出,但輸入需包含清晰的格式化指令。
嵌入式提示 (Embeddings Prompts) 以預先計算的向量嵌入形式提供的輸入。 特定模型架構(如 pooling 模型)、嵌入相似性任務。 目前 vLLM 支援有限,並非所有模型的通用輸入方式。

vLLM 輸入能力評估雷達圖

下方的雷達圖從多個維度評估了 vLLM 對不同主要輸入類型的處理能力。這些評估是基於其設計特性、社群反饋和普遍的應用情況所做的綜合判斷,旨在提供一個直觀的比較參考。數值越高代表在該維度表現越佳(設定複雜度除外,數值越低代表越簡單)。


vLLM 輸入生態系統心智圖

這張心智圖概括了 vLLM 可處理的各種輸入類型及其相關的關鍵概念和考量因素,幫助您快速建立對 vLLM 輸入系統的整體認知。

mindmap root["vLLM 可處理的輸入類型"] id1["核心輸入 (Core Inputs)"] id1_1["純文字提示 (Text Prompts)"] id1_1_1["單個提示 (Single Prompt)"] id1_1_2["批量提示 (Batch Prompts)"] id1_2["Tokenized 提示 (Tokenized Prompts)"] id1_2_1["Token ID 序列 (Token ID Sequences)"] id1_3["多模態輸入 (Multi-modal Inputs)"] id1_3_1["文字 + 圖像 (Text + Image)"] id1_3_2["MultiModalDataDict"] id1_3_3["限制:非交錯式 (Limitation: Non-interleaved)"] id1_4["聊天格式輸入 (Chat Format Inputs)"] id1_4_1["對話歷史 (Conversation History)"] id1_4_2["聊天模板 (Chat Templates)"] id2["進階與輔助 (Advanced & Auxiliary)"] id2_1["結構化輸出導向 (Structured Output Guidance)"] id2_1_1["JSON 格式指令 (JSON Format Instructions)"] id2_2["嵌入式提示 (Embeddings Prompts)"] id2_2_1["EmbedsPrompt (有限支援 - Limited Support)"] id2_3["LoRA 適配器 (LoRA Adapters)"] id3["重要考量因素 (Key Considerations)"] id3_1["上下文長度 (Context Length)"] id3_2["最大模型長度 (max_model_len)"] id3_3["GPU 記憶體使用率 (GPU Memory Utilization)"] id3_4["API 金鑰與伺服器配置 (API Key & Server Config)"] id3_5["裝置類型 (Device Type - GPU/CPU)"] id4["處理流程 (Processing Flow)"] id4_1["接收與預處理 (Reception & Preprocessing)"] id4_2["轉換 (Transformation via INPUT_REGISTRY)"] id4_3["排程與執行 (Scheduling & Execution)"]

相關教學影片:深入了解 vLLM 多模態模型

若您對 vLLM 如何處理更進階的多模態輸入感興趣,以下這段由 vLLM 開發者主持的 Office Hours 影片,特別邀請了來自 Roblox 的軟體工程師暨 vLLM 貢獻者,深入探討了 vLLM 中多模態模型的開發與應用。影片中討論了 vLLM 在支援如文字加圖像等混合輸入時的架構設計、挑戰以及未來的發展方向,對於希望在 vLLM 上部署或使用多模態模型的開發者而言,具有很高的參考價值。

影片來源:vLLM Office Hours - Multimodal Models in vLLM with Roblox.


常見問題 (FAQ)

vLLM 處理輸入時,最重要的限制是什麼?
vLLM 是否支援直接輸入圖像檔案進行多模態處理?
我可以使用 vLLM 處理非常長的文本輸入嗎?
vLLM 如何處理多輪對話的上下文?

推薦查詢


參考資料

distilabel.argilla.io
vLLM - Distilabel Docs
nm-vllm.readthedocs.io
vllm.inputs - Read the Docs
nm-vllm.readthedocs.io
Input Processing — vLLM
qwen.readthedocs.io
vLLM - Qwen
docs.vllm.ai
LLM Inputs - vLLM
docs.vllm.ai
LLM Inputs - vLLM
zhuanlan.zhihu.com
vllm 笔记 - 知乎专栏
docs.vllm.ai
vllm.inputs.data

Last updated May 18, 2025
Ask Ithy AI
Download Article
Delete Article