vLLM (Very Large Language Model) 作為一個高效能的語言模型推理和服務函式庫,其強大之處不僅在於其卓越的吞吐量和記憶體效率,更在於它能夠靈活處理多種類型的輸入。了解 vLLM 可接受的輸入形式,對於最大化其效能並應用於各種複雜 AI 任務至關重要。本篇將深入探討 vLLM 支援的各種輸入類型、其內部的處理流程,以及相關的重要考量因素。
INPUT_REGISTRY 和 MULTIMODAL_REGISTRY)及先進的排程機制(如 PagedAttention),vLLM 實現了高吞吐量且記憶體效率優異的推理服務。max_model_len),以及多模態輸入的當前限制(例如,部分版本尚不支援交錯式模態輸入)。vLLM 的設計使其能夠應對從簡單到複雜的各種輸入需求。以下是其支援的主要輸入類型:
這是 vLLM 最基本也最常見的輸入形式。使用者可以直接提供單一的純文字字串,或是一個包含多個提示的列表(用於離線批量推理)。vLLM 內部會將這些文字提示通過分詞器 (tokenizer) 轉換為模型可以理解的 token ID 序列。這種輸入方式適用於各類文本生成任務、問答系統和基本的聊天機器人應用。
# 範例:使用純文字提示
prompts = ["請介紹一下大型語言模型。", "巴黎是法國的首都嗎?"]
# outputs = llm.generate(prompts, sampling_params) # 實際調用時
對於需要更精確控制輸入或已自行完成分詞流程的應用,vLLM 支援直接接收已經被分詞器轉換後的 token ID 序列。這可以繞過 vLLM 內部的部分預處理步驟,有時能帶來些微的效能提升,特別是在大規模批次處理或對分詞過程有特殊客製化需求的場景中。
vLLM 持續發展對多模態模型的支援,使其能夠處理結合不同類型數據的輸入,目前主要集中在文字與圖像的結合。這類輸入通常會被組織成一個特定的數據結構,例如一個字典(MultiModalDataDict),其中包含文字提示以及圖像數據(可能已被預處理為 token 形式)。
vLLM 可驅動如上圖所示的聊天機器人,處理文字輸入並生成回應。
儘管 vLLM 在多模態處理上取得了進展,但仍需注意一些目前的局限性,例如:
--disable-chunked-mm-input 或其他多模態處理器參數 mm_processor_kwargs)來啟用或調整多模態處理行為。為了更好地支援對話型 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) # 實際調用時
雖然這主要 يتعلق بالتحكم في تنسيق الإخراج، إلا أن vLLM تدعم أيضًا تضمين تعليمات أو قوالب في الإدخال لتوجيه النموذج لإنشاء مخرجات منظمة، مثل تنسيق JSON. يتم ذلك عادةً عن طريق تكوين GuidedDecodingParams لتحديد قيود على الإخراج الذي تم إنشاؤه. هذا مفيد بشكل خاص للتطبيقات التي تتطلب تحليلًا آليًا سهلًا لنتائج النموذج، مثل تكامل واجهة برمجة التطبيقات أو استخراج البيانات.
對於某些特定模型架構或專注於嵌入任務的模型(例如 pooling 模型),vLLM 也提供了對嵌入式輸入的初步支援。這種類型的輸入是以向量表示(embeddings)的形式直接提供給模型,而非原始文字。相關的處理類別可能如 EmbedsPrompt。然而,需要注意的是,截至目前(2025 年初),vLLM 對直接使用 embedding 向量作為通用輸入的支援仍然有限,並非所有模型或所有情境都適用,通常不被視為主流的輸入方式。一份 GitHub issue (vllm-project/vllm#6128) 中曾有討論確認此點。
vLLM 擁有一套精心設計的輸入處理管道,以確保輸入數據能被高效且正確地轉換並傳遞給語言模型進行推理。
vLLM 的輸入處理流程大致可以概括為以下幾個步驟:
LLMEngine 接收來自使用者的輸入,這可能是純文字字串、token ID 列表,或是包含多模態數據的字典。AutoTokenizer)將其轉換為 token ID。MultiModalConfig 配置的處理器)來處理非文字部分的數據。INPUT_REGISTRY.process_input() 等內部機制,將預處理後的數據轉換為模型執行器 (Model Executor) 所需的標準格式。這一步驟會整合所有必要的元數據和 token 序列。在使用 vLLM 時,以下是一些與輸入處理密切相關的參數和限制,使用者應加以注意:
max_model_len): 此參數在 vLLM 啟動時設定,定義了模型能處理的最大序列長度。輸入提示加上預期生成的 token 數不能超過此限制。gpu_memory_utilization): 此參數控制 vLLM 可以使用的 GPU 記憶體比例,用於存放模型權重、KV 快取和中間激活值。合理的設定對處理長輸入或大批次至關重要。cpu_swap_space): 在 GPU 記憶體不足時,vLLM 可以將部分 KV 快取交換到 CPU RAM,此參數定義了可用的交換空間大小。VLLM_TARGET_DEVICE='cpu' 嘗試在 CPU 上運行(效能會顯著降低)。為了更清晰地理解不同輸入類型的特性及其適用場景,下表進行了簡要的比較:
| 輸入類型 | 描述 | 主要應用場景 | 注意事項 |
|---|---|---|---|
| 純文字提示 (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 開發者主持的 Office Hours 影片,特別邀請了來自 Roblox 的軟體工程師暨 vLLM 貢獻者,深入探討了 vLLM 中多模態模型的開發與應用。影片中討論了 vLLM 在支援如文字加圖像等混合輸入時的架構設計、挑戰以及未來的發展方向,對於希望在 vLLM 上部署或使用多模態模型的開發者而言,具有很高的參考價值。
影片來源:vLLM Office Hours - Multimodal Models in vLLM with Roblox.