模型下載:
一般通過modelscope提供的方式進行下載,速度更快,huggingface下模型即便開啟了魔法也還是很慢,對于9B以上的模型都是至少15G的。
比如需要下載qwen3-embedding-8b的模型,可以通過提供的一段代碼自動進行下載到/root/.cache中
#Model Download
from modelscope import snapshot_download
model_dir = snapshot_download('Qwen/Qwen3-Embedding-8B')
VLLM庫介紹
vLLM 是一個為大型語言模型(LLM)推理和部署服務而設計的、主打高性能和高內存效率的開源庫。它最初由加州大學伯克利分校的研究人員開發,現在已經成為一個由社區驅動的活躍項目,并由 PyTorch 基金會托管。
簡單來說,vLLM 的核心目標是讓 LLM 的運行更快、更省錢、更容易。無論是進行離線批量處理還是部署在線服務,vLLM 都能顯著提升模型的推理速度和吞吐量(即單位時間內處理請求的數量)。
vLLM 為何如此高效?核心技術:PagedAttention
vLLM 實現卓越性能的關鍵在于其創新的?PagedAttention?算法。
靈感來源:PagedAttention 的思想借鑒了操作系統中經典的“虛擬內存”和“分頁”技術。
解決痛點:傳統的大模型推理系統在處理注意力機制中的鍵值緩存(KV Cache)時效率低下。?KV Cache 需要占用大量 GPU 顯存,并且由于每個請求生成的文本長度不同,會導致嚴重的內存碎片和浪費。研究發現,現有系統對顯存的利用率可能低至 20%-40%。
工作原理:
內存分頁管理:PagedAttention 將龐大的 KV Cache 分割成許多個固定大小的“塊”(Block)。這些塊可以像操作系統的內存頁一樣,存儲在非連續的顯存空間中。
近乎零浪費:通過這種方式,vLLM 幾乎消除了內存碎片,讓顯存的利用率接近 100%,從而可以在相同的硬件上處理更大批次的請求。
高效內存共享:當多個請求(例如,使用相同開頭提示詞的并行生成)需要共享部分計算結果時,PagedAttention 可以通過共享內存塊來實現,極大地減少了內存開銷,使得并行采樣、束搜索(Beam Search)等復雜生成策略的運行成本更低。
得益于 PagedAttention,vLLM 的吞吐量可以達到 HuggingFace Transformers 的?24 倍之多,并且無需對模型架構做任何修改。
vLLM 的主要特性與優勢
極致的吞吐量:通過 PagedAttention 和持續批處理(Continuous Batching)技術,vLLM 可以高效地將多個請求打包處理,最大化 GPU 的利用率,實現業界領先的推理吞吐量。
高效的內存管理:顯著降低顯存占用,這意味著用戶可以用更少的硬件資源運行更大的模型,或者在同等硬件上獲得更高的性能,從而降低成本。
易于使用和部署:
離線推理:提供了簡單的 Python API(vllm.LLM?類),只需幾行代碼即可加載模型并進行推理。
在線服務:通過一條命令(vllm serve)即可啟動一個與 OpenAI API 兼容的服務器。這意味著許多現有的、基于 OpenAI API 開發的應用可以無縫切換到由 vLLM 驅動的本地模型,極大地簡化了部署流程。
廣泛的兼容性:
模型支持:無縫支持 Hugging Face 生態中絕大多數熱門的開源模型,包括 Llama、Mixtral、Gemma 等多種架構。同時,它也開始支持多模態模型。
硬件支持:主要針對 NVIDIA GPU 進行了深度優化,同時也支持 AMD GPU、AWS Neuron 等多種硬件。
豐富的高級功能:
量化支持:支持 GPTQ、AWQ、FP8 等多種量化技術,進一步壓縮模型體積,提升推理速度。
分布式推理:支持張量并行和流水線并行,能夠將超大模型部署在多張 GPU 上。
流式輸出:支持像 ChatGPT 一樣逐字生成并返回結果。
多 LoRA 適配:支持同時加載和運行多個 LoRA 適配器,適用于需要為不同客戶或任務提供定制化服務的場景。
如何開始使用 vLLM?
使用 vLLM 非常直接:
安裝:通常通過?pip install vllm?即可完成安裝。需要注意的是,要確保本地的 NVIDIA 驅動、CUDA 版本與 PyTorch 版本相互兼容。
用于離線批量推理:
from vllm import LLM, SamplingParams# 從 Hugging Face Hub 加載模型 llm = LLM(model="meta-llama/Meta-Llama-3-8B-Instruct")# 定義采樣參數 sampling_params = SamplingParams(temperature=0.8, top_p=0.95)# 生成文本 outputs = llm.generate("你好,中國的首都是", sampling_params)# 打印結果 print(outputs[0].outputs[0].text)
部署為在線服務:
在終端中運行以下命令:python -m vllm.entrypoints.openai.api_server \--model "meta-llama/Meta-Llama-3-8B-Instruct"
該命令會啟動一個監聽在?localhost:8000?的服務,你可以像調用 OpenAI API 一樣,通過?curl?或任何 HTTP 客戶端來請求這個服務。
使用?curl?命令行工具和使用 Python 的?openai?庫。
假設你已經通過以下命令在本地啟動了服務,模型為?meta-llama/Meta-Llama-3-8B-Instruct:
codeBash
python -m vllm.entrypoints.openai.api_server --model "meta-llama/Meta-Llama-3-8B-Instruct"
服務會默認運行在?http://localhost:8000。
方式一:使用?curl?命令行工具
curl?是一個強大的命令行工具,用于發送網絡請求。這對于快速測試和腳本編寫非常方便。
1. 調用“Completions”接口 (適用于舊版模型)
這個接口主要用于文本補全,你提供一個提示(prompt),模型會接著往下寫。
curl http://localhost:8000/v1/completions \-H "Content-Type: application/json" \-d '{"model": "meta-llama/Meta-Llama-3-8B-Instruct","prompt": "中國的首都是","max_tokens": 50,"temperature": 0.7}'
參數解釋:
http://localhost:8000/v1/completions: 這是 vLLM 服務的 Completions API 端點。
-H "Content-Type: application/json": 指定我們發送的數據是 JSON 格式。
-d '{...}': 指定要發送的數據體 (data body)。
"model": 指定要使用的模型。vLLM 服務器會加載你在啟動時指定的模型。
"prompt": 你的輸入提示。
"max_tokens": 控制生成文本的最大長度。
"temperature": 控制生成文本的創造性。值越低越確定,越高越隨機。
2. 調用“Chat Completions”接口 (推薦,適用于現代對話模型)
這個接口是為對話型模型設計的,輸入的是一個消息列表(messages list),可以包含系統、用戶和助手的多輪對話歷史。Llama 3 Instruct 這類指令微調模型使用這個接口更合適。
curl http://localhost:8000/v1/chat/completions \-H "Content-Type: application/json" \-d '{"model": "meta-llama/Meta-Llama-3-8B-Instruct","messages": [{"role": "system", "content": "你是一個樂于助人的AI助手。"},{"role": "user", "content": "你好,請問中國的首都是哪里?"}],"max_tokens": 50,"temperature": 0.7}'
參數解釋:
http://localhost:8000/v1/chat/completions: 這是 vLLM 服務的 Chat Completions API 端點。
"messages": 一個消息對象數組,用來提供對話上下文。
"role": 角色,可以是?system?(系統指令)、user?(用戶提問) 或?assistant?(模型之前的回答)。
"content": 消息的具體內容。
方式二:使用 Python 的?openai?庫
這是在應用程序中最常用、最方便的方式。你需要先安裝?openai?庫:pip install openai。
然后,你可以編寫一個 Python 腳本來調用 vLLM 服務。關鍵在于?修改?base_url?指向你的本地 vLLM 服務器,并使用一個虛擬的 API 密鑰。
import openai# 創建一個 OpenAI 客戶端,但將其配置為指向本地的 vLLM 服務器
# 注意:api_key 是必需的,但由于是本地服務,其值可以是任何非空字符串
client = openai.OpenAI(base_url="http://localhost:8000/v1",api_key="not-needed"
)# 調用 Chat Completions 接口
response = client.chat.completions.create(model="meta-llama/Meta-Llama-3-8B-Instruct",messages=[{"role": "system", "content": "You are a helpful assistant."},{"role": "user", "content": "What is the capital of China?"}],temperature=0.7,max_tokens=50
)# 打印模型的回復
print(response.choices[0].message.content)
代碼解釋:
openai.OpenAI(...): 我們實例化一個客戶端。
base_url="http://localhost:8000/v1": 這是最關鍵的一步。它告訴?openai?庫不要去請求官方的?api.openai.com,而是請求我們本地運行的 vLLM 服務地址。
api_key="not-needed": 盡管?openai?庫要求提供一個 API 密鑰,但 vLLM 服務器默認不會對其進行驗證,所以你可以填寫任何字符串,比如?"not-needed"?或?"sk-..."。
client.chat.completions.create(...): 這部分代碼就和調用官方 OpenAI API 的代碼完全一樣了,參數也一一對應。
這種方式的巨大優勢在于,如果你有一個現有的項目是基于 OpenAI API 開發的,你幾乎只需要修改?base_url?這一行代碼,就可以無縫地將后端從 OpenAI 的付費服務切換到你自己部署的、由 vLLM 驅動的開源模型上,大大降低了遷移成本。
python腳本部署:
import os
import subprocess
import sysdef start_embed_server():cmd = [sys.executable, "-m", "vllm.entrypoints.openai.api_server","--model", "BAAI/bge-m3","--task", "embed","--host", "0.0.0.0","--port", "8101","--api-key", "" ]print("啟動嵌入模型服務器...")process = subprocess.Popen(cmd)return processif __name__ == "__main__":server_process = start_embed_server()print("服務器啟動在 http://localhost:8101")try:server_process.wait()except KeyboardInterrupt:print("關閉服務器...")server_process.terminate()
代碼功能概述
這是一個Python腳本,用于啟動vLLM框架的OpenAI API兼容的嵌入模型服務器,使用BAAI/bge-m3模型提供文本嵌入服務。
逐行解析
1. 導入模塊
import os
import subprocess
import sys
subprocess
: 用于啟動和管理子進程sys
: 用于訪問Python解釋器相關的功能和參數
2. 服務器啟動函數
def start_embed_server():cmd = [sys.executable, "-m", "vllm.entrypoints.openai.api_server","--model", "BAAI/bge-m3","--task", "embed","--host", "0.0.0.0","--port", "8101","--api-key", "" ]
sys.executable
: 當前Python解釋器的路徑命令參數:
-m vllm.entrypoints.openai.api_server
: 作為模塊運行vLLM的OpenAI API服務器--model BAAI/bge-m3
: 指定使用的嵌入模型--task embed
: 指定任務類型為嵌入--host 0.0.0.0
: 監聽所有網絡接口--port 8101
: 使用8101端口--api-key ""
: 設置空API密鑰(無需認證)
3. 啟動子進程
process = subprocess.Popen(cmd)
return process
subprocess.Popen()
: 啟動新的子進程運行指定命令返回進程對象以便后續管理
4. 主程序邏輯
if __name__ == "__main__":server_process = start_embed_server()print("服務器啟動在 http://localhost:8101")
啟動服務器并獲取進程對象
輸出服務器訪問地址
5. 進程管理和優雅關閉
try:server_process.wait()
except KeyboardInterrupt:print("關閉服務器...")server_process.terminate()
server_process.wait()
: 等待子進程結束捕獲
KeyboardInterrupt
(Ctrl+C)信號server_process.terminate()
: 優雅終止服務器進程
技術要點
vLLM框架: 高性能的LLM推理和服務框架
BAAI/bge-m3模型: 北京智源研究院的多語言文本嵌入模型
OpenAI API兼容: 可以使用OpenAI風格的API調用
子進程管理: 通過subprocess模塊管理外部進程
使用方式:
腳本已通過 vLLM 以 OpenAI 兼容協議在?http://localhost:8101/v1?暴露了 Embeddings 服務(模型?BAAI/bge-m3)。可直接按 OpenAI API 的用法訪問。
- 基礎地址:?http://localhost:8101/v1
- 認證: 你啟動時?--api-key?"",表示不校驗;如后續設置了密鑰,需加?Authorization: Bearer <YOUR_KEY>
- 主要接口:?POST /v1/embeddings
- 必要參數:?model: "BAAI/bge-m3",?input: "<文本>"?或?["文本1","文本2"]
curl?示例
curl?-X?POST?"http://localhost:8101/v1/embeddings"?\-H?"Content-Type:?application/json"?\-H?"Authorization:?Bearer?any"?\-d?'{"model":?"BAAI/bge-m3","input":?["你好,世界",?"hello?world"]}'
Python(OpenAI SDK)
from?openai?import?OpenAIclient?=?OpenAI(base_url="http://localhost:8101/v1",?api_key="any")??#?無校驗時隨便填resp?=?client.embeddings.create(model="BAAI/bge-m3",input=["這是一個測試",?"another?sample"])print(len(resp.data),?len(resp.data[0].embedding))