在Windows上部署PyTorch模型的三種主流方法
摘要:本文介紹了在Windows系統(tǒng)上部署PyTorch模型的三種主流方法。方案一通過TorchScript實現(xiàn)高性能推理,支持Python和C++調用;方案二使用FastAPI構建Web API服務,適合后端調用;方案三通過PyInstaller打包為桌面exe程序,便于交付給終端用戶。每種方案都包含詳細步驟,涵蓋模型導出、加載推理、服務部署和GUI集成等關鍵環(huán)節(jié),可根據(jù)不同應用場景(高性能推理、Web服務或桌面應用)靈活選擇。
在 Windows 上部署 PyTorch 模型主要有三種主流方式,取決于你的具體需求(是用于高性能推理、Web 服務 API,還是桌面應用程序)。
以下是三種最常用方案的詳細步驟:
方案一:使用 TorchScript (官方原生,適合 C++ 調用或高性能 Python 服務)
適用場景:需要脫離 Python 解釋器依賴(C++ 部署),或者在 Python 中追求比原生 model.forward 更快的推理速度。
步驟 1: 導出模型為 TorchScript
在你的訓練代碼或單獨的腳本中,將訓練好的模型轉換為腳本格式。
import torch
import torchvision.models as models
# 1. 加載訓練好的模型 (確保處于評估模式)
model = models.resnet18(weights='IMAGENET1K_V1') # 示例模型
model.eval()
# 2. 創(chuàng)建示例輸入 (用于追蹤或腳本化)
# 假設輸入是 batch_size=1, 3通道, 224x224的圖片
example_input = torch.rand(1, 3, 224, 224)
# 3. 跟蹤模式 (Tracing) - 適合控制流簡單的模型
traced_script_module = torch.jit.trace(model, example_input)
# 或者 腳本模式 (Scripting) - 適合有復雜控制流(if/for)的模型
# traced_script_module = torch.jit.script(model)
# 4. 保存模型
traced_script_module.save("resnet18_windows.pt")
print("模型已導出為 resnet18_windows.pt")
步驟 2: 在 Windows 上部署 (Python 端加載)
創(chuàng)建一個獨立的推理腳本 inference.py,它不依賴訓練代碼,只依賴導出的 .pt 文件。
import torch
import torchvision.transforms as transforms
from PIL import Image
# 1. 加載 TorchScript 模型
device = torch.device("cuda" if torch.cuda.is_available() else "cpu")
model = torch.jit.load("resnet18_windows.pt")
model.to(device)
model.eval()
# 2. 預處理圖片
transform = transforms.Compose([
transforms.Resize(256),
transforms.CenterCrop(224),
transforms.ToTensor(),
transforms.Normalize(mean=[0.485, 0.456, 0.406], std=[0.229, 0.224, 0.225]),
])
# 3. 推理
img = Image.open("test_image.jpg").convert("RGB")
input_tensor = transform(img).unsqueeze(0).to(device)
with torch.no_grad():
output = model(input_tensor)
print("預測結果:", output.argmax(dim=1).item())
步驟 3: (可選) C++ 部署 (完全脫離 Python)
如果你需要極致的性能或集成到現(xiàn)有的 C++ Windows 軟件中:
- 下載 LibTorch: 去 PyTorch 官網(wǎng) 選擇 “LibTorch”,操作系統(tǒng)選 “Windows”,語言選 “C++”,計算平臺選 “CUDA” (如果有顯卡) 或 “CPU”。
- 配置 Visual Studio:
- 新建 C++ 項目。
- 在屬性頁中配置
Include Directories和Library Directories指向解壓后的 LibTorch 文件夾 (include,lib)。 - 鏈接
torch_cpu.lib或torch_cuda.lib等相關庫。
- 編寫 C++ 代碼: 使用
torch::jit::load("model.pt")加載并推理。
方案二:構建 Web API 服務 (最常用,適合后端服務)
適用場景:需要通過 HTTP 請求調用模型(如前端網(wǎng)頁、移動端 App 調用),使用 FastAPI 或 Flask。
步驟 1: 安裝依賴
打開 Windows PowerShell 或 CMD:
pip install fastapi uvicorn[standard] pillow python-multipart # 如果還沒裝 torch pip install torch torchvision
步驟 2: 創(chuàng)建main.py
from fastapi import FastAPI, File, UploadFile
import torch
import torchvision.transforms as transforms
from PIL import Image
import io
app = FastAPI()
# 全局加載模型 (避免每次請求都加載)
device = torch.device("cuda" if torch.cuda.is_available() else "cpu")
model = torch.jit.load("resnet18_windows.pt") # 使用方案一中導出的模型
model.to(device)
model.eval()
transform = transforms.Compose([
transforms.Resize(256),
transforms.CenterCrop(224),
transforms.ToTensor(),
transforms.Normalize(mean=[0.485, 0.456, 0.406], std=[0.229, 0.224, 0.225]),
])
@app.post("/predict/")
async def predict(file: UploadFile = File(...)):
# 讀取圖片
image_data = await file.read()
image = Image.open(io.BytesIO(image_data)).convert("RGB")
# 預處理
input_tensor = transform(image).unsqueeze(0).to(device)
# 推理
with torch.no_grad():
output = model(input_tensor)
prediction = output.argmax(dim=1).item()
return {"filename": file.filename, "class_id": prediction}
# 啟動命令: uvicorn main:app --reload --host 0.0.0.0 --port 8000
步驟 3: 運行服務
在終端運行:
uvicorn main:app --host 0.0.0.0 --port 8000
現(xiàn)在你可以訪問 http://localhost:8000/docs 查看 Swagger UI 界面并上傳測試圖片。
步驟 4: Windows 開機自啟 (作為服務)
為了讓它在后臺一直運行:
- 使用 NSSM (Non-Sucking Service Manager) 工具。
- 下載 nssm.exe。
- 命令行運行
nssm install PyTorchService。 - 在彈出的 GUI 中:
- Path: 填寫你的 Python 路徑 (例如
C:\Users\YourName\venv\Scripts\python.exe)。 - Arguments: 填寫
-m uvicorn main:app --host 0.0.0.0 --port 8000。 - Startup directory: 填寫你的代碼所在文件夾。
- Path: 填寫你的 Python 路徑 (例如
- 點擊 “Install service”,然后在 Windows 服務管理器中啟動該服務。
方案三:打包為桌面 exe 程序 (適合交付給最終用戶)
適用場景:需要發(fā)給沒有 Python 環(huán)境的普通用戶使用,帶圖形界面 (GUI)。
步驟 1: 安裝 PyInstaller 和 GUI 庫
pip install pyinstaller pyside6 # 或者 tkinter (內置)
步驟 2: 編寫帶 GUI 的推理腳本app.py
import sys
import torch
from PySide6.QtWidgets import QApplication, QMainWindow, QPushButton, QLabel, QFileDialog, QVBoxLayout, QWidget
from PySide6.QtGui import QPixmap
from PIL import Image
import torchvision.transforms as transforms
import io
# 加載模型 (全局)
model = torch.jit.load("resnet18_windows.pt")
model.eval()
transform = transforms.Compose([...]) # 同上
class MainWindow(QMainWindow):
def __init__(self):
super().__init__()
self.setWindowTitle("PyTorch Windows 演示")
layout = QVBoxLayout()
self.label = QLabel("請上傳圖片")
self.btn = QPushButton("選擇圖片并預測")
self.btn.clicked.connect(self.predict)
layout.addWidget(self.label)
layout.addWidget(self.btn)
container = QWidget()
container.setLayout(layout)
self.setCentralWidget(container)
def predict(self):
file_path, _ = QFileDialog.getOpenFileName(self, "選擇圖片", "", "Images (*.png *.jpg)")
if file_path:
img = Image.open(file_path).convert("RGB")
input_tensor = transform(img).unsqueeze(0)
with torch.no_grad():
out = model(input_tensor)
res = out.argmax(dim=1).item()
self.label.setText(f"預測類別 ID: {res}")
if __name__ == "__main__":
app = QApplication(sys.argv)
window = MainWindow()
window.show()
sys.exit(app.exec())
步驟 3: 打包成 EXE
由于 PyTorch 很大,打包需要特殊參數(shù)。
pyinstaller --noconfirm --onefile --windowed --add-data "resnet18_windows.pt;." app.py
注意:Windows 下 --add-data 使用分號 ; 分隔,Linux/Mac 使用冒號 :。
重要提示:
- 首次打包可能非常大(幾百 MB 甚至 1GB+),因為包含了整個 PyTorch 庫。
- 如果遇到內存錯誤,嘗試添加
--exclude-module排除不需要的庫,或者使用 UPX 壓縮(但有時會導致 PyTorch 崩潰,需測試)。 - 生成的
.exe文件在dist文件夾下,可以直接發(fā)給任何 Windows 電腦運行(無需安裝 Python)。
Windows 部署特別注意事項
- 路徑問題:
- Windows 路徑使用反斜杠
\,但在 Python 字符串中建議用正斜杠/或原始字符串r"C:\path"。 - 使用
os.path.join或pathlib來處理路徑,保證兼容性。
- Windows 路徑使用反斜杠
- CUDA 驅動:
- 如果使用 GPU 部署,目標機器必須安裝與 PyTorch 版本匹配的 NVIDIA 顯卡驅動。
- 不需要在目標機器安裝 CUDA Toolkit (cuDNN 等已包含在 PyTorch wheel 包或 LibTorch 中),只要顯卡驅動夠新即可。
- 防火墻:
- 如果是 Web API 部署,Windows Defender 防火墻可能會攔截 8000 端口。首次運行時需允許通過防火墻。
- 性能優(yōu)化 (Windows 特有):
- 在推理前設置線程數(shù):
torch.set_num_threads(1)。Windows 上多線程有時反而因為上下文切換導致變慢,特別是在 CPU 推理時。 - 使用
torch.backends.cudnn.benchmark = True(僅限 NVIDIA GPU) 可以加速固定輸入的推理。
- 在推理前設置線程數(shù):
總結推薦
| 需求 | 推薦方案 | 難度 | 性能 |
|---|---|---|---|
| 內部微服務/API | 方案二 (FastAPI + TorchScript) | ?? | ???? |
| 集成到 C++ 軟件 | 方案一 (LibTorch C++) | ????? | ????? |
| 給小白用戶的工具 | 方案三 (PyInstaller exe) | ??? | ??? |
| 快速原型驗證 | 直接運行 Python 腳本 | ? | ?? |
對于大多數(shù) Windows 部署場景,方案二 (FastAPI + TorchScript) 是最平衡、最穩(wěn)健的選擇。
以上就是在Windows上部署PyTorch模型的三種主流方法的詳細內容,更多關于Windows部署PyTorch模型的資料請關注腳本之家其它相關文章!
相關文章
Ubuntu下使用python讀取doc和docx文檔的內容方法
今天小編就為大家分享一篇Ubuntu下使用python讀取doc和docx文檔的內容方法,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2018-05-05
Python?clip與range函數(shù)保姆級使用教程
本文主要和大家介紹了詳解Python中clip與range函數(shù)的用法,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參,希望能幫助到大家2022-06-06
Python?matplotlib實戰(zhàn)之氣泡圖繪制
氣泡圖是一種多變量的統(tǒng)計圖表,可以看作是散點圖的變形,這篇文章主要為大家介紹了如何使用Matplotlib繪制氣泡圖,需要的小伙伴可以參考下2023-08-08
flask SQLAlchemy連接數(shù)據(jù)庫及操作的實現(xiàn)
本文主要介紹了flask SQLAlchemy連接數(shù)據(jù)庫及操作的實現(xiàn),文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧2023-03-03

