vLLM-ollama 綜合對比
本文比較 vllm 和 ollama 在不同場景中的表現。我們將重點關注:資源利用率和效率、部署和維護的簡易性、具體用例和建議、安全和生產準備、文檔。
關於 LangChat
LangChat 是 Java 生態下企業級 AIGC 項目解決方案,集成 RBAC 和 AIGC 大模型能力,幫助企業快速定製 AI 知識庫、企業 AI 機器人。
支持的 AI 大模型: Gitee AI / 阿里通義 / 百度千帆 / DeepSeek / 抖音豆包 / 智譜清言 / 零一萬物 / 訊飛星火 / OpenAI / Gemini / Ollama / Azure / Claude 等大模型。
- 官網地址:http://langchat.cn/
開源地址:
-
Gitee:https://gitee.com/langchat/langchat
-
Github:https://github.com/tycoding/langchat
歡迎來到我們深入研究 LLM 推理框架的最後一部分!在第一部分和第二部分中,我們分別探討了 Ollama 和 vLLM,瞭解了它們的架構、功能和基本性能特徵。現在到了決定性的一輪:面對面的比較,以幫助您根據特定需求選擇合適的框架。
這次比較並不是要宣佈絕對的贏家——而是要了解哪種框架在不同場景中表現出色。我們將重點關注:
-
資源利用率和效率
-
部署和維護的簡易性
-
具體用例和建議
-
安全和生產準備
-
文檔
讓我們深入研究數據,看看我們的測試揭示了什麼!🚀
只有一個可以成爲冠軍,或者可能不是? 🤔
1、基準測試設置⚡
爲了確保公平比較,我們將對兩個框架使用相同的硬件和模型:
硬件配置:
-
GPU:NVIDIA RTX 4060 16GB Ti
-
RAM:64GB RAM
-
CPU:AMD Ryzen 7
-
存儲:NVMe SSD
型號:
-
Qwen2.5–14B-Instruct(4 位量化)
-
上下文長度:8192 個標記
-
批處理大小:1(單用戶場景)
2、非常公平的比較📊
讓我們分析一下這兩個框架如何以不同的方式管理系統資源,重點關注它們的核心架構方法和實際影響。
2.1 Ollama
我舉了一個問題 “給我講一個 1000 字的故事” 的例子。我一個請求的 tok/sec 爲 25.59。沒有並行請求
對於並行請求,用戶必須修改位於 /etc/systemd/system/ollama.service
中的文件(對於 Ubuntu)並添加一行 Environment="OLLAMA_NUM_PARALLEL=4"
,你將被允許執行最多 4 個並行請求
[Unit]
Description=Ollama Service
After=network-online.target
[Service]
ExecStart=/usr/local/bin/ollama serve
User=ollama
Group=ollama
Restart=always
RestartSec=3
Environment="PATH=/home/henry/.local/bin:/usr/local/cuda/bin/:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin"
Environment="OLLAMA_HOST=0.0.0.0:11434"
Environment="OLLAMA_DEBUG=1"
Environment="OLLAMA_NUM_PARALLEL=4"
Environment="OPENAI_BASE_URL=http://0.0.0.0:11434/api"
[Install]
WantedBy=multi-user.target
這裏是我完全不喜歡 Ollama 的地方,我認爲它不是一個好的生產框架。 Ollama 保留了所需的所有內存,即使其中只有一小部分會被使用。我的意思是,只有 4 個併發請求,就不可能在 GPU 上加載整個模型,並且一些層會加載到 CPU 上,如下圖所示或在終端中運行 ollama ps
即可看到
這還不是最糟糕的部分。我看到的是 15% 的神經網絡正在 GPU 中加載,但 GPU 中有近 2GB 的 VRAM 可用!但 Ollama 爲什麼要這樣做?
在我寫這些行時,GitHub 上有一個問題仍未解決,但 Ollama 開發人員並未對此予以關注。幾個用戶都面臨着同樣的問題,加載整個神經網絡似乎非常困難,即使我們談論的是僅並行 4 個請求。Ollama 沒有提供任何文檔。
知道這一點後,Ollama 可以支持的最大上下文量是多少,才能在 GPU 中加載 100% 的模型?我嘗試通過設置 PARAMETER num_ctx 24576(稍後你將看到爲什麼是這個數字)來修改我的模型文件,我注意到出現了同樣的問題:儘管 GPU 中有近 2GB 的 VRAM 可用,但 CPU 的使用率爲 4%。
2.2 vLLM
vLLM 採用純 GPU 優化方法,正如我們在本系列的第二部分中看到的,GGUF 量化仍處於實驗階段。我必須進行同類比較,所以我想爲我的 GPU 獲得最大的上下文長度。經過幾次嘗試,我的 RTX 4060 Ti 支持 24576 個令牌。所以我運行了這個修改後的 docker(相對於本系列的第二部分):
# Run the container with GPU support
docker run -it \
--runtime nvidia \
--gpus all \
--network="host" \
--ipc=host \
-v ./models:/vllm-workspace/models \
-v ./config:/vllm-workspace/config \
vllm/vllm-openai:latest \
--model models/Qwen2.5-14B-Instruct/Qwen2.5-14B-Instruct-Q4_K_M.gguf \
--tokenizer Qwen/Qwen2.5-14B-Instruct \
--host "0.0.0.0" \
--port 5000 \
--gpu-memory-utilization 1.0 \
--served-model-name "VLLMQwen2.5-14B" \
--max-num-batched-tokens 24576 \
--max-num-seqs 256 \
--max-model-len 8192 \
--generation-config config
我可以同時運行多達 20 個請求!!太瘋狂了!!。爲了測試這個框架,我使用了以下代碼:
import requests
import concurrent.futures
BASE_URL = "http://<your_vLLM_server_ip>:5000/v1"
API_TOKEN = "sk-1234"
MODEL = "VLLMQwen2.5-14B"
def create_request_body():
return {
"model": MODEL,
"messages": [
{"role": "user", "content": "Tell me a story of 1000 words."}
]
}
def make_request(request_body):
headers = {
"Authorization": f"Bearer {API_TOKEN}",
"Content-Type": "application/json"
}
response = requests.post(f"{BASE_URL}/chat/completions", json=request_body, headers=headers, verify=False)
return response.json()
def parallel_requests(num_requests):
request_body = create_request_body()
with concurrent.futures.ThreadPoolExecutor(max_workers=num_requests) as executor:
futures = [executor.submit(make_request, request_body) for _ in range(num_requests)]
results = [future.result() for future in concurrent.futures.as_completed(futures)]
return results
if __name__ == "__main__":
num_requests = 50 # Example: Set the number of parallel requests
responses = parallel_requests(num_requests)
for i, response in enumerate(responses):
print(f"Response {i+1}: {response}")
我獲得了超過 100 個令牌 / 秒!我不敢相信這是使用遊戲 GPU 可以實現的。 GPU 利用率達到 100%,這正是我想要的:獲得最大數量的 GPU(因爲我支付了 100% 的 GPU 🤣)。
這還不是最好的部分,我們設置了 --max-num-seq 256
,所以理論上我們可以並行發送 256 個請求!!我不敢相信,也許我以後會嘗試這些測試。
以下是我的最終想法
3、最終決定……⚖️
-
性能概述:獲勝者顯然是 vLLM。正如我們在本文第二部分中看到的那樣,通過 1 個請求,我獲得了 11% 的改進(Ollama 26 tok / 秒 vs vLLM 29 tok / 秒)。
-
資源管理:毫無疑問,vLLM 是這裏的王者。當我看到 Ollama 無法並行處理許多請求時,我感到非常失望,由於資源管理效率低下,它甚至無法並行處理 4 個請求。
-
易用性和開發性:沒有什麼比 Ollama 更容易的了。即使你不是專家,也可以使用一行代碼輕鬆與 LLM 聊天。同時,vLLM 需要一些知識,例如 docker 和更多參數。
-
生產就緒性:vLLM 就是爲此而創建的,甚至許多無服務器端點提供商公司(我有我的來源🤣)都在將此框架用於他們的端點。
-
安全性:vLLM 出於安全目的支持令牌授權,而 Ollama 則不支持。因此,如果你沒有很好地保護它,任何人都可以訪問你的端點。
-
文檔:這兩個框架採用不同的文檔方法:Ollama 的文檔簡單且適合初學者,但缺乏技術深度,尤其是在性能和並行處理方面。他們的 GitHub 討論經常留下關鍵問題未得到解答。相比之下,vLLM 提供全面的技術文檔,其中包含詳細的 API 參考和指南。他們的 GitHub 維護良好,開發人員反應迅速,有助於排除故障和理解,他們甚至爲此專門設立了一個網站。
所以,從我的角度來看,贏家是…… 沒有一個!
在我看來,如果你的目標是在本地環境甚至遠程服務器上快速試驗大型語言模型,而無需太多設置麻煩,Ollama 無疑是你的首選解決方案。它的簡單性和易用性使其非常適合快速原型設計、測試想法,或者適合剛開始使用 LLM 並希望學習曲線平緩的開發人員。
但是,當我們將重點轉移到性能、可擴展性和資源優化至關重要的生產環境時,vLLM 顯然大放異彩。它對並行請求的出色處理、高效的 GPU 利用率和強大的文檔使其成爲嚴肅、大規模部署的有力競爭者。該框架從可用硬件資源中榨取最大性能的能力尤其令人印象深刻,並且可能會改變那些希望優化其 LLM 基礎設施的公司的遊戲規則。
話雖如此,Ollama 和 vLLM 之間的決定不應憑空而來。它必須取決於你的特定用例,並考慮以下因素:
-
你的項目規模
-
你團隊的技術專長
-
應用程序的特定性能要求
-
你的開發時間表和資源
-
定製和微調的需求
-
長期維護和支持注意事項
本質上,雖然 vLLM 可能爲生產環境提供更高性能和可擴展性提供支持,Ollama 的簡單性對於某些場景來說可能是無價的,尤其是在開發的早期階段或較小規模的項目。
最終,最好的選擇將是最符合你項目獨特需求和約束的選擇。值得考慮的是,在某些情況下,你甚至可能受益於同時使用:Ollama 用於快速原型設計和初始開發,而 vLLM 則用於你準備擴展和優化生產。這種混合方法可以爲你提供兩全其美的效果,讓你可以在項目生命週期的不同階段利用每個框架的優勢。
聯繫我
最後,推薦大家關注一下開源項目:LangChat,Java 生態下的 AIGC 大模型產品解決方案。
-
LangChat 產品官網:https://langchat.cn/
-
Github: https://github.com/TyCoding/langchat
-
Gitee: https://gitee.com/langchat/langchat
-
微信:LangchainChat
本文由 Readfog 進行 AMP 轉碼,版權歸原作者所有。
來源:https://mp.weixin.qq.com/s/M4EKYpEuMmBchuT0UKyNig