本地部署模型 --vLLM + Docker 部署+封裝接口

vLLM的介紹?

vLLM的核心特性:

? ? ? ? 最先進的服務吞吐量

? ? ? ? 使用PageAttention高效管理注意力鍵和值的內存

? ? ? ? 量化:GPTQ,AWQ,INT4,INT8和FP8

VLLM的靈活性和易用性體現在以下方面:

? ? ? ? 具有高吞吐量服務以及各種解碼算法,包括并行采樣,束搜索等

? ? ? ? 支持張量并行和流水線并行的分布式推理

? ? ? ? 提供與OpenAI兼容的API服務器

? ? ? ? 支持很多顯卡:NVIDIA GPU、AMD CPU和GPU、Intel GPU和CPU、PowerPC CPU、TPU及AWS Neuron

? ? ? ? 前綴緩存支持

? ? ? ? 支持多LoRA

基礎

量化

量化是將模型中的 高精度參數(如 FP32)轉為低位寬整數或浮點數(如 INT4、INT8、FP8) 的過程,以達到:

  • 減少模型大小

  • 降低顯存占用

  • 加速推理速度

  • 提升部署效率(尤其在邊緣設備)

方法全稱 / 意義類型是否需訓練簡要說明
INT88-bit Integer Quant.權重+激活量化?(PTQ)或 ?(QAT)最基礎,兼容性好,精度較高,速度/壓縮比適中
INT44-bit Integer Quant.權重量化?(PTQ)更小顯存,損失更大,適合結合 GPTQ/AWQ 使用
FP88-bit Floating Point權重+激活量化?(需訓練支持)精度高于 INT8,部署需硬件支持(如 H100)
GPTQGPT Quantization權重量化(INT4)?(Post-training)自動通道選擇,適合大模型,兼顧速度與精度
AWQActivation-aware Weight Quantization權重量化(INT4)?(Post-training)感知激活分布,專為 LLM 優化,精度更好

AWQ(Activation-aware Weight Quantization)是一種 后訓練量化(Post-Training Quantization, PTQ) 方法,它的核心創新在于:

  • 分析每層神經元激活分布

  • 對不同通道的權重做“有選擇的”量化

  • 避免激活和權重之間的量化誤差共振(量化時考慮激活值),保持模型性能

誤差共振:量化權重引入的誤差與激活值在某些層發生耦合或放大效應,導致模型輸出誤差顯著放大,從而嚴重影響整體推理精度的現象。

例如:假設模型某一層的激活值比較大且集中(例如都是正數),此時:

  • 如果權重量化誤差也呈現某種集中偏向(比如整體偏負);

  • 乘積操作就可能系統性偏離真實輸出;

  • 偏差在下一層繼續放大,最終影響整個推理精度。

這在 LLM 中尤為嚴重,因為 LLM 的結構、層數,誤差一層層累積,可能導致模型完全輸出錯誤的回答。

KV Cache

KV Cache 就是 Transformer 中**注意力機制(Self-Attention)**模塊中,每一層的 Key(K)和 Value(V)向量的緩存,它可以在每一步生成時重復使用,而不用重新計算前面所有的 K/V。

  • 前一步生成 token 的 K/V 會被緩存起來。

  • 下一步只需計算

  • 當前 token 的 Q,再用之前緩存的 K/V 來做注意力計算。

  • 效果:每一步只計算一次 Q,大大減少了計算和內存開銷。

優勢:提升速度、降低資源占用、支持長文本生成、易于實現(大多數框架(如 Transformers、vLLM)都有內置支持)

優化:

PagedAttention(vLLM)

  • 把 KV Cache 分頁管理(像虛擬內存頁表),支持多用戶并發、動態上下文切換

?FlashAttention

  • ?利用 CUDA kernel 和序列并行優化注意力計算,也有專門版本支持 KV Cache。

使用:use_cache=True ?# 開啟 KV Cache

估算GPU資源

推理(Inference)訓練(Training)兩部分之和

每個參數所占內存:

  • float32(默認):每個參數 4 Bytes

  • float16(混合精度訓練):每個參數 2 Bytes

  • int8/in4(量化推理):每個參數 1 Byte

顯存估算公式(粗略):

顯存(MB)≈參數量(B)×4(FP16)+KV緩存大小(基于長上下文)+其他緩存

例如:總參數量:0.6B(6億參數);上下文長度(Context Length):32,768 tokens(超長上下文)

推理總顯存需求估算(FP16):

  • 模型參數:0.6B × 2 Bytes ≈ 1.2 GB

  • KV 緩存:~1 GB

  • 其他激活緩存、臨時變量等:~1 GB

?推理最低顯存需求:約 3–4 GB(FP16)

訓練資源預估

訓練比推理顯存需求高很多,主要因為:

  • 需要存儲梯度、前向激活值

  • 反向傳播時顯存翻倍

  • 長上下文會加重 attention 的計算開銷

粗略訓練顯存估算:

1. 參數模型體積(FP16):

  • 0.6B × 2 Bytes = 1.2 GB

2. 激活值 + 梯度緩存(訓練中需占 2-4 倍模型體積)

Batch size 越大,顯存占用越高

最終估算:

訓練所需單卡顯存30–40GB+(保守估計)

安裝vLLM

建議使用uv,地址:GPU - vLLM

uv pip install "vllm[cuda]"
##這個命令會自動選擇適合你的 CUDA 版本的 prebuilt 版本(12.1 及以上)

Docker部署

  1. 將需要下載的大模型下載到對應的項目中
  2. 編寫配置文件Dockerfile

??獲取鏡像:https://hub.docker.com/search?q=&type=image

# 基礎鏡像,帶CUDA 12.1 + cuDNN + Python 3.10(我們后面升級Python)
FROM pytorch/pytorch:2.2.0-cuda12.1-cudnn8-runtimeENV DEBIAN_FRONTEND=noninteractive
# 安裝Python 3.11及相關工具
RUN apt-get update && apt-get install -y software-properties-common \&& add-apt-repository ppa:deadsnakes/ppa \&& apt-get update && apt-get install -y \python3.11 python3.11-distutils python3.11-venv python3-pip curl \&& rm -rf /var/lib/apt/lists/*# 設置python3指向python3.11
RUN update-alternatives --install /usr/bin/python3 python3 /usr/bin/python3.11 1# 升級pip,安裝對應PyTorch和vllm
RUN python3 -m pip install --upgrade pip# 重新安裝兼容CUDA 12.1的PyTorch,避免版本沖突(覆蓋基礎鏡像的PyTorch)
RUN python3 -m pip install torch torchvision torchaudio --index-url https://download.pytorch.org/whl/cu121# 安裝vLLM
RUN python3 -m pip install vllm# 創建工作目錄
WORKDIR /app# 拷貝啟動腳本
COPY entrypoint.sh /app/entrypoint.sh
RUN chmod +x /app/entrypoint.sh# 掛載模型目錄
VOLUME ["/qwen"]# 開放8000端口
EXPOSE 8000# 啟動命令
CMD ["/app/entrypoint.sh"]

? ? ?3. 編寫shell腳本文件

#!/bin/bash
# 啟動 vLLM OpenAI 兼容 API 服務,加載掛載的本地模型路徑python3 -m vllm.entrypoints.openai.api_server \--model /qwen \--tokenizer /qwen \--served-model-name Qwen-3 \--host 0.0.0.0 \--port 8000

???????4. 構建鏡像運行

## 構建鏡像DOCKER_BUILDKIT=1 docker build -f [本地磁盤上的 Dockerfile 文件所在位置] -t qwen-vllm:latest .
## 最后的路徑參數表示構建上下文目錄,Docker從這里找文件構建鏡像 .代表當前目錄
## -t 給鏡像打標簽(tag)<鏡像名>:<標簽>##查看鏡像
docker images# 刪除容器
docker rm {容器名稱}## 運行容器
docker run -d --gpus '"device=1"' -p 8000:8000 \-v /home/featurize/qwen:/qwen \--name qwen-vllm-container1 \qwen-vllm:latest
#-v:表示把本地 /home/featurize/qwen 目錄掛載到容器里的 /qwen
#--name:給容器起名字
#qwen-vllm:latest--鏡像名
#-d :讓容器在后臺運行
#-p 8000:8000--把宿主機(本機)的 8000 端口,映射到容器內的 8000 端口##持續監聽日志:
docker logs -f qwen-vllm-container1
##退出日志的持續監聽
Ctrl + C

參數:DOCKER_BUILDKIT 是 Docker 提供的一個環境變量,用來控制是否啟用 BuildKit 構建引擎?

  • DOCKER_BUILDKIT=1 表示啟用 Docker 的 BuildKit 功能。

  • DOCKER_BUILDKIT=0 或不設置則使用傳統的 Docker 構建引擎。

BuildKit 是 Docker 官方推出的一個更高效、更靈活的鏡像構建引擎,具備以下優勢:

  • 并行構建:能夠并行執行 Dockerfile 中的多條命令,提高構建速度。

  • 更好的緩存管理:緩存機制更智能,減少重復構建時間。

  • 更小的鏡像層:生成的鏡像層更合理,減少鏡像體積。

  • 內置更強大的語法支持:支持更復雜的 Dockerfile 語法,比如 --mount=type=cache 等。

  • 安全隔離:提高構建過程的安全性。

測試

方式一:curl

curl -X POST http://localhost:8000/v1/chat/completions \
-H "Content-Type: application/json" \
-d '{"model":"Qwen-3","messages":[{"role":"user","content":"你好"}]}'

方式二:python

import requests
import jsondef chat_with_model(prompt, model_name="Qwen-3", server_url="http://localhost:8000/v1/chat/completions"):headers = {"Content-Type": "application/json",}data = {"model": model_name,"messages": [{"role": "user", "content": prompt}]}response = requests.post(server_url, headers=headers, data=json.dumps(data))if response.status_code == 200:res_json = response.json()answer = res_json.get("choices", [{}])[0].get("message", {}).get("content", "")return answerelse:return f"Error: {response.status_code} - {response.text}"if __name__ == "__main__":prompt = "你好,今天天氣怎么樣"reply = chat_with_model(prompt)print("模型回復:", reply)

Fast API封裝

#示例 test.py
from fastapi import FastAPI, HTTPException
from pydantic import BaseModel
import httpxapp = FastAPI()# 請求輸入格式
class ChatRequest(BaseModel):prompt: strtemperature: float = 0.7max_tokens: int = 512# 響應格式可自定義
class ChatResponse(BaseModel):response: str# 本地大模型的 API 地址
LLM_API_URL = "http://localhost:8000/v1/chat/completions"@app.post("/api/chat", response_model=ChatResponse)
async def chat_with_model(req: ChatRequest):# 轉換為大模型 API 所需要的格式(假設你在用 OpenAI 格式接口)payload = {"model": "your-model-name",  # 視情況設置或移除"messages": [{"role": "user", "content": req.prompt}],"temperature": req.temperature,"max_tokens": req.max_tokens}try:async with httpx.AsyncClient() as client:response = await client.post(LLM_API_URL, json=payload, timeout=60.0)response.raise_for_status()data = response.json()# 從大模型返回中提取內容(OpenAI 格式)reply_text = data['choices'][0]['message']['content']return ChatResponse(response=reply_text)except Exception as e:raise HTTPException(status_code=500, detail=str(e))

運行

uvicorn test:app --host 0.0.0.0 --port 9000 --reload
#test:app-模塊名:變量名 是告訴 Uvicorn 去哪里找 FastAPI 實例來運行服務。

測試

curl -X POST http://localhost:9000/api/chat \
-H "Content-Type: application/json" \
-d '{"prompt": "你好,請介紹一下你自己", "temperature": 0.7, "max_tokens": 200}'

大模型量化

AWQ:https://github.com/casper-hansen/AutoAWQ

python -m awq.entry \--model_path /home/featurize/qwen \              --w_bit 4 \                                            --q_group_size 128 \                                  --q_backend real \                                     --dump_quant quant_cache/qwen3-awq-int4.pt      

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

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

相關文章

每日一博 - JWT 安全實戰指南

文章目錄 Pre引言背景與原理簡介核心安全挑戰傳輸層安全實踐簽名算法與密鑰管理Header 與 Claims 嚴格校驗Token 生命周期管理存儲與前端實踐抗攻擊措施日志與監控附加增強與高級方案小結與建議后續方向 引言&#xff1a;闡述 JWT 的流行與安全重要性背景與原理簡介&#xff1a…

403 Access Denied Tomcat managerapp

提示 403 Access Denied You are not authorized to view this page. By default the Manager is only accessible from a browser running on the same machine as Tomcat. If you wish to modify this restriction, you’ll need to edit the Manager’s context.xml file.…

工業鏡頭選型講解

B站 &#xff1a;道傳科技上位機 觀看教程 一、工業鏡頭介紹 鏡頭的主要作用是 將目標成像在圖像傳感器的光敏面上。 下圖左一的型號為 焦距 50mm 最大光圈為F1.6 鏡頭的像面尺寸為2/3英寸&#xff08;最大能夠兼容CCD芯片尺寸&#xff09; 二、工業鏡頭的分類 鏡頭的…

重構技術奇點的路徑:三智雙融認知大飛躍

結合三智雙融理論認知大飛躍框架重構技術奇點的路徑 構建一個三維修訂框架&#xff1a;首先分析融智學視域下的奇點滲透本質&#xff0c;然后按時間線逐年修訂預言并補充融智學維度&#xff0c;最后提出人機共生的實踐路徑。考慮設計表格對比原預言與修訂后的差異&#xff0c;突…

LabVIEW利用Monte Carlo 工業數據模擬應用

基于LabVIEW 平臺&#xff0c;結合 NI 工業級硬件構建 Monte Carlo 模擬系統&#xff0c;實現工業傳感器數據不確定性分析與設備故障概率預測。通過圖形化編程架構與高性能硬件協同&#xff0c;解決復雜工業場景下的隨機問題量化分析需求&#xff0c;適用于智能制造、能源監控等…

2025年滲透測試面試題總結-天翼電子公司[社招]安全運營崗(題目+回答)

安全領域各種資源&#xff0c;學習文檔&#xff0c;以及工具分享、前沿信息分享、POC、EXP分享。不定期分享各種好玩的項目及好用的工具&#xff0c;歡迎關注。 目錄 天翼電子商務有限公司[社招]安全運營崗 1. Web服務加固方案 2. IAST技術解析 3. SCA&#xff08;軟件成分…

Java NIO詳解:新手完全指南

文章目錄 1. NIO簡介1.1 NIO的核心優勢1.2 NIO的適用場景 2. NIO與IO的對比2.1 代碼對比示例2.1.1 傳統IO讀取文件2.1.2 NIO讀取文件 3. NIO核心組件3.1 Buffer&#xff08;緩沖區&#xff09;3.2 Channel&#xff08;通道&#xff09;3.3 Selector&#xff08;選擇器&#xff…

webgl(three.js 與 cesium 等實例應用)之瀏覽器渲染應用及內存釋放的關聯與應用

文章目錄 WebGL 概念1. 紋理&#xff08;Texture&#xff09;&#x1f4cc; 概念&#xff1a;&#x1f9e9; 應用方向&#xff1a;&#x1f4a1; 示例代碼&#xff08;加載一張圖片作為紋理&#xff09;&#xff1a; 2. 緩沖區&#xff08;Buffer&#xff09;&#x1f4cc; 概念…

黑馬點評【緩存】

目錄 一、為什么要使用緩存 二、添加商戶緩存 1.緩存的模型和思路 2.代碼 3.緩存更新策略 Redis內存淘汰機制&#xff1a; 3.1 被動淘汰策略&#xff08;不主動淘汰&#xff0c;僅在查詢時觸發&#xff09; 3.2 主動淘汰策略&#xff08;主動掃描內存&#xff0c;按規則…

【地圖服務限制范圍】

根據你提供的 eb_service_area 表結構&#xff0c;其中有兩個字段與地理坐標相關&#xff1a;latlng 和 limit_latlng。這兩個字段分別用于存儲服務范圍區域的坐標和限制區域的坐標。下面是對這兩個字段的具體分析以及如何使用它們來定義執行范圍。 字段分析 latlng&#xff0…

python數據結構和算法(1)

數據結構和算法簡介 數據結構&#xff1a;存儲和組織數據的方式&#xff0c;決定了數據的存儲方式和訪問方式。 算法&#xff1a;解決問題的思維、步驟和方法。 程序 數據結構 算法 算法 算法的獨立性 算法是獨立存在的一種解決問題的方法和思想&#xff0c;對于算法而言&a…

Linux操作系統-性能優化

1. 基礎工具 top / htop top # 實時查看CPU、內存、進程 htop # 增強版&#xff08;支持鼠標操作&#xff09; 關鍵指標&#xff1a;%CPU&#xff08;CPU占用&#xff09;、%MEM&#xff08;內存占用&#xff09;、LOAD AVERAGE&#xff08;系統負載&#…

如何徹底解決緩存擊穿、緩存穿透、緩存雪崩

一、緩存擊穿 成因&#xff1a;緩存擊穿通常發生在某個熱點數據失效或清空后&#xff0c;大量請求同時涌入后端數據庫&#xff0c;導致數據庫崩潰或宕機。 解決方案&#xff1a; 互斥鎖&#xff1a;在獲取數據時&#xff0c;使用分布式鎖&#xff08;如Redis的分布式鎖&…

JDK 8、JDK 17和JDK 19綜合對比分析

JDK 8、JDK 17和JDK 19在性能、特性、易用性及普及性等方面的綜合對比分析&#xff0c;結合了各版本的核心改進和實際應用場景 目錄 ? 一、性能對比 ? 二、語言與特性演進 &#x1f6e0;? 三、API與功能增強 &#x1f3af; 四、易用性改進 &#x1f4ca; 五、市場普及…

Vue-理解 vuex

一、前言 在開發中大型 Vue 應用時&#xff0c;我們常常會遇到多個組件之間共享數據、通信復雜的問題。例如&#xff1a; 多個組件需要訪問同一個用戶信息&#xff1b;組件之間需要傳遞狀態或事件&#xff1b;數據變更需要同步更新多個組件&#xff1b; 這時&#xff0c;Vue…

【209】VS2022 C++對排好序的vector使用二分查找算法的例子

本文介紹了如何對已經排序的 vector 進行二分法查找。 首先&#xff0c;我們先看一下存儲數據的類&#xff0c;我們假設所有數據的 id 是唯一的&#xff1a; DataItem.h #pragma once #include<string>namespace zc {class DataItem{public:int m_id;std::string m_na…

ABAP 上傳 excel 報表

&#xff08;1&#xff09;先在屏幕上增加上傳文件的按鈕 "屏幕選擇條件" SELECTION-SCREEN BEGIN OF BLOCK b1 WITH FRAME TITLE TEXT-001. PARAMETERS : p_source LIKE rlgrap-filename . SELECTION-SCREEN END OF BLOCK b1. 你會發現&#xff0c;上面的代碼只…

Compose與View系統互操作方案

本文將全面解析 Android 現代 UI 框架 Jetpack Compose 與傳統 View 系統的互操作方案&#xff0c;涵蓋基礎原理、實戰技巧、性能優化和高級應用&#xff0c;助你實現漸進式遷移和混合開發。 一、互操作的必要性與整體架構 1.1 為什么需要互操作性 漸進式遷移&#xff1a;大型…

HNCTF 2025 Just Ping Write-up

part 1 路由部分主邏輯逆向 package mainimport ("net/http" )func main() {// 注冊路由和處理函數// 當訪問 "/api/ping" 路徑時&#xff0c;調用 pingHandler 函數處理請求http.HandleFunc("/api/ping", pingHandler)// 注冊開發測試API路由//…

OpenCV CUDA模塊中用于稠密光流計算的 TV-L1(Dual TV-L1)算法類cv::cuda::OpticalFlowDual_TVL1

操作系統&#xff1a;ubuntu22.04 OpenCV版本&#xff1a;OpenCV4.9 IDE:Visual Studio Code 編程語言&#xff1a;C11 算法描述 cv::cuda::OpticalFlowDual_TVL1類是基于變分優化方法的稠密光流算法實現&#xff08;Dual TV-L1 光流模型&#xff09;&#xff0c;在 GPU 上加…