部署ragflow代碼庫中的det.onnx
模型(通常是目標檢測或文檔結構解析類模型,如版面分析模型)到火山云,需基于ONNX Runtime推理框架,結合火山云的計算資源和服務能力實現。以下是具體步驟:
一、模型特性與依賴確認
det.onnx
是ONNX格式的預訓練模型,需明確:
- 功能:ragflow中的
det.onnx
通常用于文檔版面分析(如識別文本塊、表格、圖片等區域),為后續RAG流程提供結構化支持。 - 依賴:需
onnxruntime
(或onnxruntime-gpu
,推薦GPU加速)、OpenCV
(圖像處理)、Python 3.8+
等環境。 - 輸入輸出:輸入為圖像數據(如
(1, 3, H, W)
的張量),輸出為檢測到的區域坐標和類別。
二、火山云部署步驟
1. 選擇計算資源
根據模型推理需求選擇火山云實例:
- 推薦實例:GPU計算型ECS(如
ecs.gni3cg.5xlarge
,1×A10 GPU,16GB顯存),滿足輕量化ONNX模型推理需求。 - 系統鏡像:Ubuntu 20.04(便于安裝GPU驅動和依賴)。
2. 環境配置
登錄實例后,安裝基礎依賴和ONNX Runtime:
# 更新系統
sudo apt update && sudo apt install -y python3-pip python3-dev libgl1-mesa-glx# 安裝ONNX Runtime(GPU版本,需匹配CUDA)
# 查看CUDA版本:nvidia-smi,假設為11.7
pip3 install onnxruntime-gpu==1.14.1 # 1.14.1版本兼容CUDA 11.7# 安裝其他依賴(圖像處理、API服務)
pip3 install opencv-python fastapi uvicorn numpy pillow
若使用CPU推理,安裝
onnxruntime
(非GPU版本):pip3 install onnxruntime==1.14.1
。
3. 上傳模型與代碼
-
模型獲取:從ragflow代碼庫的
models/
目錄中提取det.onnx
,或通過以下方式下載:# 克隆ragflow代碼庫獲取模型 git clone https://github.com/infiniflow/ragflow.git cp ragflow/models/det.onnx ./ # 假設模型位于此路徑
-
模型存儲優化:若模型較大,先上傳至火山云對象存儲(TOS),再通過
tosutil
工具下載到實例:# 安裝TOS客戶端 wget https://tos-tools.tos-cn-beijing.volces.com/tosutil/v1.7.2/linux-amd64/tosutil chmod +x tosutil # 從TOS下載模型(需配置AK/SK) ./tosutil cp tos://your-bucket/det.onnx ./det.onnx
4. 編寫推理服務代碼
用FastAPI包裝det.onnx
模型,提供HTTP接口供外部調用。創建det_server.py
:
import onnxruntime as ort
import cv2
import numpy as np
from fastapi import FastAPI, UploadFile, File
from PIL import Image
import ioapp = FastAPI()# 加載ONNX模型
model_path = "./det.onnx"
# 配置GPU推理(若使用CPU,刪除providers參數)
session = ort.InferenceSession(model_path,providers=["CUDAExecutionProvider", "CPUExecutionProvider"]
)# 獲取模型輸入輸出信息
input_name = session.get_inputs()[0].name
input_shape = session.get_inputs()[0].shape # 如(1, 3, 640, 640)
output_names = [out.name for out in session.get_outputs()]def preprocess(image: Image.Image) -> np.ndarray:"""預處理圖像:resize、歸一化等(需與訓練時一致)"""img = cv2.cvtColor(np.array(image), cv2.COLOR_RGB2BGR)img = cv2.resize(img, (input_shape[3], input_shape[2])) # 按模型輸入尺寸resizeimg = img.transpose(2, 0, 1) # HWC -> CHWimg = img.astype(np.float32) / 255.0 # 歸一化img = np.expand_dims(img, axis=0) # 增加batch維度return imgdef postprocess(outputs: list) -> list:"""后處理:解析輸出為檢測框和類別(根據模型輸出格式調整)"""# 示例:假設輸出為[boxes, scores, classes]boxes = outputs[0].squeeze().tolist()scores = outputs[1].squeeze().tolist()classes = outputs[2].squeeze().tolist()# 過濾低置信度結果results = []for box, score, cls in zip(boxes, scores, classes):if score > 0.5:results.append({"box": box, # [x1, y1, x2, y2]"score": score,"class": int(cls)})return results@app.post("/detect")
async def detect(file: UploadFile = File(...)):"""接收圖像文件,返回檢測結果"""# 讀取圖像image = Image.open(io.BytesIO(await file.read()))# 預處理input_data = preprocess(image)# 推理outputs = session.run(output_names, {input_name: input_data})# 后處理results = postprocess(outputs)return {"results": results}@app.get("/health")
async def health_check():return {"status": "healthy"}if __name__ == "__main__":import uvicornuvicorn.run(app, host="0.0.0.0", port=8000) # 綁定所有網卡,端口8000
注意:
preprocess
和postprocess
需根據det.onnx
的實際訓練預處理邏輯調整(如歸一化參數、輸入尺寸等)。
5. 啟動服務與網絡配置
-
啟動服務:
# 后臺啟動服務(日志輸出到det.log) nohup python3 det_server.py > det.log 2>&1 &
-
驗證服務:
在實例內執行curl http://localhost:8000/health
,返回{"status":"healthy"}
說明啟動成功。 -
開放網絡訪問:
- 進入火山云ECS控制臺,找到實例對應的安全組,添加入方向規則:
- 端口:8000
- 來源:0.0.0.0/0(或限制為特定IP)。
- 若需公網訪問,為實例綁定彈性公網IP(EIP)。
- 進入火山云ECS控制臺,找到實例對應的安全組,添加入方向規則:
6. 測試模型服務
通過公網IP調用接口測試:
# 發送圖像文件測試檢測接口
curl -X POST "http://[EIP]:8000/detect" -F "file=@test_image.jpg"
返回結果示例:
{"results": [{"box": [100, 200, 300, 400], "score": 0.92, "class": 0}, # 0表示文本塊{"box": [500, 300, 700, 500], "score": 0.88, "class": 1} # 1表示表格]
}
三、優化與擴展
-
容器化部署:
將服務打包為Docker鏡像,上傳至火山云容器鏡像服務(CR),再通過容器服務(VKE)部署,支持彈性擴縮容:# Dockerfile FROM nvidia/cuda:11.7.1-cudnn8-runtime-ubuntu20.04 RUN apt update && apt install -y python3-pip libgl1-mesa-glx COPY requirements.txt . RUN pip3 install -r requirements.txt COPY det.onnx det_server.py ./ CMD ["python3", "det_server.py"]
-
性能優化:
- 啟用ONNX Runtime的
CUDAExecutionProvider
加速推理; - 批量處理圖像(修改接口支持多圖輸入);
- 調整輸入尺寸(在精度允許范圍內減小尺寸,提升速度)。
- 啟用ONNX Runtime的
-
監控與運維:
- 集成火山云日志服務(LTS) 收集推理日志;
- 通過云監控監控GPU利用率、內存占用等指標,設置告警。
四、注意事項
- 版本兼容性:確保
onnxruntime-gpu
版本與實例的CUDA版本匹配(參考ONNX Runtime文檔)。 - 模型輸入格式:
det.onnx
的輸入尺寸、通道順序(RGB/BGR)需與預處理邏輯嚴格一致,否則會導致推理結果異常。 - 權限控制:生產環境中建議通過火山云API網關配置認證(如API-Key),限制接口訪問權限。
通過以上步驟,可在火山云上穩定部署det.onnx
模型,為ragflow的文檔解析流程提供后端推理能力。