使用VLLM部署大模型embedding/chat 的API

模型下載:


一般通過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?算法。

  1. 靈感來源:PagedAttention 的思想借鑒了操作系統中經典的“虛擬內存”和“分頁”技術。

  2. 解決痛點:傳統的大模型推理系統在處理注意力機制中的鍵值緩存(KV Cache)時效率低下。?KV Cache 需要占用大量 GPU 顯存,并且由于每個請求生成的文本長度不同,會導致嚴重的內存碎片和浪費。研究發現,現有系統對顯存的利用率可能低至 20%-40%。

  3. 工作原理

    • 內存分頁管理: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 非常直接:

  1. 安裝:通常通過?pip install vllm?即可完成安裝。需要注意的是,要確保本地的 NVIDIA 驅動、CUDA 版本與 PyTorch 版本相互兼容。

  2. 用于離線批量推理

    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)
  3. 部署為在線服務
    在終端中運行以下命令:

    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)

代碼解釋:

  1. openai.OpenAI(...): 我們實例化一個客戶端。

  2. base_url="http://localhost:8000/v1": 這是最關鍵的一步。它告訴?openai?庫不要去請求官方的?api.openai.com,而是請求我們本地運行的 vLLM 服務地址。

  3. api_key="not-needed": 盡管?openai?庫要求提供一個 API 密鑰,但 vLLM 服務器默認不會對其進行驗證,所以你可以填寫任何字符串,比如?"not-needed"?或?"sk-..."。

  4. 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(): 優雅終止服務器進程

技術要點

  1. vLLM框架: 高性能的LLM推理和服務框架

  2. BAAI/bge-m3模型: 北京智源研究院的多語言文本嵌入模型

  3. OpenAI API兼容: 可以使用OpenAI風格的API調用

  4. 子進程管理: 通過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))

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/94201.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/94201.shtml
英文地址,請注明出處:http://en.pswp.cn/web/94201.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Blender模型動畫導入到UE5

UE5支持直接導入FBX文件&#xff0c;但在實際應用中筆者發現&#xff1a;剛開始使用的是UE5.3&#xff0c;在UE5.3中直接將.fbx文件拖入UE中導入后是一個個的零件&#xff0c;后來使用了datasmith插件等其他辦法&#xff0c;怎么都沒有達到想要的效果。后面升級UE5.4以后&#…

Promise詳解:Promise解決ajax回調嵌套問題

目錄 一、Promise是什么 二、回調地獄 三、Promise解決回調地獄的原理 四、promaise實例 一、Promise是什么 1、主要用于異步計算 2、可以將異步操作隊列化&#xff0c;按照期望的順序執行&#xff0c;返回符合預期的結果 4、可以在對象之間傳遞和操作promise&#xff0c…

【Kubernetes知識點】Pod調度和ConfigMaps

目錄 1.如何將特定Pod調度到指定的節點&#xff1f; 2.什么是節點的親和性&#xff1f; 3.什么是污點&#xff0c;它的主要用途是什么&#xff1f; 4.解釋ConfigMap的作用。 5.Secret和ConfigMap相比較有哪些優點。 6.解釋ResourceQuota的作用 1.如何將特定Pod調度到指定…

火車頭使用Post方法采集Ajax頁面教程

前面有寫過一篇瀑布流的采集方法&#xff0c;今天在添加一個POST方法來采集Ajax刷新頁面的教程。 之前的文章請看&#xff1a;火車頭采集動態加載Ajax數據&#xff08;無分頁瀑布流網站&#xff09; 如果遇到POST方法來架子Ajax數據&#xff0c;這和我之前寫的是兩個類型&…

【學習記錄】structuredClone,URLSearchParams,groupBy

structuredClone() 可以進行深拷貝&#xff0c;這里有詳細講解&#xff1a;Window&#xff1a;structuredClone() 方法 當需要處理包含嵌套對象或數組的復雜數據結構時&#xff0c;建議使用 structuredClone() 來保護原始數據。 舉例&#xff1a;別再用 … 擴展運算符了&#x…

30條AI編程指令

大家好&#xff0c;小機又來分享AI了。 前言&#xff1a; 凌晨三點&#xff0c;你還在像素級對齊那個永遠對不齊的按鈕&#xff1b;剛寫完的API文檔&#xff0c;產品經理一句"需求變了" 讓你瞬間崩潰&#xff1b;更扎心的是&#xff0c;實習生用AI十分鐘搞定了你要…

AI+虛擬仿真:以科技之光照亮希望的田野

在鄉村振興與農業現代化的全新征程中&#xff0c;農林專業人才肩負著科技賦能土地、守護綠色發展的重任。然而&#xff0c;現有的教育模式卻越發不適應農業人才的培養需求。“AI虛擬仿真”正在為農業現代化人才建設提供創新的技術引擎。市場風口與政策紅據統計&#xff0c;2024…

04_函數

第4課&#xff1a;函數 課程目標 掌握函數的定義和調用方法學習參數傳遞和返回值的使用理解函數的作用域和命名空間 1. 函數的基本概念 函數是一段可重復使用的代碼塊&#xff0c;用于執行特定的任務。 2. 函數的定義和調用 # 定義函數 def greet():print("你好&#xff0…

STM32學習筆記19-FLASH

FLASH簡介STM32F1系列的FLASH包含程序存儲器、系統存儲器和選項字節三個部分&#xff0c;通過閃存存儲器接口&#xff08;外設&#xff09;可以對程序存儲器和選項字節進行擦除和編程&#xff0c;讀取指定寄存器直接使用指針讀即可讀寫FLASH的用途&#xff1a;利用程序存儲器的…

電蚊拍的原理及電壓電容參數深度解析:從高頻振蕩到倍壓整流的完整技術剖析

1. 引言在炎炎夏日&#xff0c;蚊蟲成為人們生活中的一大困擾。電蚊拍作為一種高效、環保的物理滅蚊工具&#xff0c;憑借其便攜性和實用性在全球范圍內得到了廣泛應用。然而&#xff0c;許多用戶對這種看似簡單的小家電背后的工作原理知之甚少。電蚊拍是一種新型的滅蚊小家電&…

Mac簡單測試硬盤讀寫速度

一、下載軟件 Blackmagic Disk Speed Test 「達芬奇 磁盤速度測試」二、選中測試位置可以隨便選個文件比如“下載”目錄三、開始測速

? 零 ? ? 安全體系構建內容結構

&#x1f44d;點「贊」&#x1f4cc;收「藏」&#x1f440;關「注」&#x1f4ac;評「論」在金融科技深度融合的背景下&#xff0c;信息安全已從單純的技術攻防擴展至架構、合規、流程與創新的系統工程。作為一名從業十多年的老兵&#xff0c;系統闡述數字銀行安全體系的建設路…

XP系統安裝Android Studio 3.5.3并建立Java或Native C++工程,然后在安卓手機上運行

第一節 安裝Android Studio 3.5.3Android Studio 3.5.3下載地址&#xff1a;Android Studio 3.5.3 December 5, 2019 Windows (32-bit): android-studio-ide-191.6010548-windows32.zip (756.1 MB) https://redirector.gvt1.com/edgedl/android/studio/ide-zips/3.5.3.0/androi…

calchash.exe和chckhash.exe計算pe文件hash值的兩個實用小工具

第一部分&#xff1a; C:\WINDOWS\system32\CatRoot\{F750E6C3-38EE-11D1-85E5-00C04FC295EE}\NT5.CAT t部分內容B B D 0 2 2 2 1 A A 6 5 5 6 2 8 F 4 9 5 F 6 C D 3 0 3 9 0 8 B B E 0 0 F 9 5 9 5 第二部分&#xff1a; D:\>calchash.exe pidgen.dll BB D0 22 21 AA 65 …

lanczso算法中的額外正交化代碼解釋

額外正交化 定義&#xff1a;在Lanczos算法中&#xff0c;由于浮點誤差&#xff0c;生成的向量可能不完全正交&#xff0c;需要額外正交化步驟。代碼實現&#xff1a;def extra_orthogonalization(v, basis):for u in basis:v - u * (v.dot(u) / u.dot(u))

Rabbit 實戰指南-學習筆記

第 4 章 RabbitMQ 進階 mandatory 參數 Returning | RabbitMQ 當 mandatory 參數設為 true 時&#xff0c;交換器無法根據自身的類型和路由鍵找到一個符合條件的隊列&#xff0c;那么RabbitMQ 會調用 Basic.Return 命令將消息返回給生產者,通過調用channel.addReturnListener …

BEVDet4D

1. BEVDet4D算法動機及開創性思路 1&#xff09;BEVDet算法概述輸入輸出&#xff1a;輸入為6視角圖像&#xff08;NuScenes數據集&#xff09;&#xff0c;輸出為3D檢測結果核心模塊&#xff1a; 圖像編碼器&#xff1a;由Backbone網絡和多尺度特征融合網絡組成&#xff0c;處理…

當 AI 學會 “理解” 人類:自然語言處理的進化與倫理邊界

大家可以去我的資源看看&#xff0c;有很多關于AI的免費資源可以下載&#xff0c;不下載也可以看看&#xff0c;真的對你有用引言&#xff1a;從 “對話” 到 “理解”——AI 語言能力的時代躍遷現實錨點&#xff1a;以日常場景切入&#xff08;如 ChatGPT 流暢回應復雜問題、A…

WPF控件隨窗體大寬度高度改變而改變

前臺控件中&#xff1a;Width"{Binding RelativeSource{RelativeSource AncestorTypeWindow}, PathWidth}"后臺代碼&#xff1a;定義在加載事件里面this.SizeChanged ProductData_SizeChanged;private void ProductData_SizeChanged(object sender, SizeChangedEven…

E10 通過RPC實現賬號批量鎖定與解鎖

需求背景&#xff1a;賬號信息由三方系統管理&#xff0c;包含賬號狀態&#xff0c;所以需要通過提供給三方的 Rest 接口中&#xff0c;實現賬號鎖定與解鎖。參考基線版本&#xff1a;10.0.2506.01&#xff0c;過低的版本可能無法使用。 鎖定分為兩種&#xff1a; &#xff08;…