國內(nèi)做任務得數(shù)字貨幣的網(wǎng)站關(guān)鍵詞歌詞表達的意思
文章目錄
- 模型部署
- 一、模型部署的定義與目的
- 二、模型部署的步驟
- 三、模型部署的方式
- 四、Flask框架
- 五、實現(xiàn)模型部署
- 1. 搭建服務端
- 1.1 初始化Flask app
- 1.2 加載模型
- 1.3 數(shù)據(jù)預處理
- 1.4 構(gòu)建裝飾器
- 1.5 完整代碼
- 2. 搭建客戶端
- 2.1 服務端網(wǎng)址
- 2.2 發(fā)送請求
- 2.3 完整代碼
- 六、運行使用
- 總結(jié)
模型部署
一、模型部署的定義與目的
模型部署是指將大模型運行在專屬的計算資源上,使模型在獨立的運行環(huán)境中高效、可靠地運行,并為業(yè)務應用提供推理服務。其目標是將機器學習模型應用于實際業(yè)務中,使最終用戶或系統(tǒng)能夠利用模型的輸出,從而發(fā)揮其作用。
二、模型部署的步驟
- 導出模型:將訓練好的模型導出為可部署的格式。
- 部署模型:將導出的模型部署到生產(chǎn)環(huán)境中,通常是以一個服務或一個庫的形式。
- 測試模型:在生產(chǎn)環(huán)境中對模型進行測試,以確保其能夠正常工作,并且輸出結(jié)果符合預期。
- 監(jiān)控模型:在生產(chǎn)環(huán)境中對模型進行監(jiān)控,以便及時發(fā)現(xiàn)并解決問題。
三、模型部署的方式
模型的部署方式多種多樣,可以根據(jù)具體的應用場景和需求而定。以下是一些常見的模型部署方式:
- 云端部署:將模型部署到云端服務器上,通過API接口提供服務,實現(xiàn)遠程調(diào)用。這種方式可以實現(xiàn)大規(guī)模的分布式計算和存儲,同時提供高可用性和可擴展性。在云端部署中,需要考慮數(shù)據(jù)的安全性和隱私保護,以及模型的并發(fā)處理能力。
- 嵌入式設備部署:將模型部署到嵌入式設備中,如智能手機、智能音箱、智能家居等。這種方式可以實現(xiàn)本地化的智能化應用,具有實時性、低延遲的優(yōu)點。在嵌入式設備部署中,需要考慮設備的計算能力、存儲空間等限制,以及模型的輕量化設計。
- 邊緣計算部署:將模型部署到邊緣設備上,如路由器、攝像頭等。這種方式可以實現(xiàn)本地數(shù)據(jù)的實時處理和智能化分析,減少數(shù)據(jù)傳輸?shù)难舆t和成本。在邊緣計算部署中,需要考慮設備的計算能力和數(shù)據(jù)處理能力,以及模型的實時性要求。
- 移動端部署:將模型部署到移動端設備上,如智能手機、平板電腦等。這種方式可以實現(xiàn)移動設備的智能化應用,提高用戶體驗。在移動端部署中,需要考慮設備的功耗和性能限制,以及模型的輕量化設計。
- FPGA和GPU部署:FPGA(Field-Programmable Gate Array)部署是將深度學習模型部署到FPGA芯片上,實現(xiàn)高效的硬件加速,提高模型的運行速度和效率。GPU(Graphics Processing Unit)部署是將深度學習模型部署到GPU上,利用GPU的并行計算能力,提高模型的運行速度和效率。這兩種方式適用于對計算性能要求較高的場景,如實時圖像處理、視頻分析等。
四、Flask框架
-
優(yōu)點:
- 輕量級:Flask是一個輕量級的框架,代碼量少,靈活性高,適合快速開發(fā)小型應用程序。
- 簡單易學:Flask的設計理念簡潔明了,入門相對容易,對于初學者來說非常友好??蓴U展性強:Flask提供了豐富的擴展庫,開發(fā)者可以根據(jù)需求選擇合適的擴展來擴展功能。
- 社區(qū)支持良好:Flask有一個龐大的社區(qū),提供了豐富的資源和支持。
-
缺點:
- 功能相對較少:相比于一些大型框架如Django,Flask的功能相對較少,需要依賴擴展庫來實現(xiàn)一些功能。
- 安全性考慮:由于Flask的輕量級特性,安全性方面的考慮需要開發(fā)者自行關(guān)注。
- 不適合大型應用:由于Flask的輕量級特性,它可能不適合開發(fā)大型復雜的應用程序。
五、實現(xiàn)模型部署
1. 搭建服務端
1.1 初始化Flask app
"""-----初始化Flask app-----"""
app = flask.Flask(__name__) # 創(chuàng)建一個Flask應用程序?qū)嵗?/span>
model = None
use_gpu = False
1.2 加載模型
本片使用自帶的殘差網(wǎng)絡模型,將網(wǎng)絡模型輸出轉(zhuǎn)化為自己要求的輸出類別數(shù)量:
def load_model():global model# 加載resnet18網(wǎng)絡model = models.resnet18()num_ftrs = model.fc.in_featuresmodel.fc = nn.Sequential(nn.Linear(num_ftrs,102))checkpoint = torch.load('best.pth')model.load_state_dict(checkpoint['state_dict'])model.eval()# 是否使用gpuif use_gpu:model.cuda()
1.3 數(shù)據(jù)預處理
將圖像轉(zhuǎn)換為模型輸入所需的格式:
def prepare_image(image,target_size):if image.mode !='RGB':image = image.convert('RGB')image = transforms.Resize(target_size)(image)image = transforms.ToTensor()(image)image = transforms.Normalize([0.485,0.456,0.406],[0.229,0.224,0.225])(image)image = image[None]if use_gpu:image = image.cuda()return torch.tensor(image)
1.4 構(gòu)建裝飾器
@app.route是一個裝飾器,用于將特定的URL路徑綁定到一個視圖函數(shù)上。當Web服務器接收到與該URL路徑匹配且方法也匹配的HTTP請求時,就會調(diào)用相應的視圖函數(shù)來處理該請求。
@app.route("/predict",methods = ["POST"])
def predict():# 做一個標志,剛開始無圖像傳入時為false,傳入圖像時為truedata = {"success":False}if flask.request.method == 'POST':if flask.request.files.get("image"):image = flask.request.files["image"].read()image = Image.open(io.BytesIO(image))image = prepare_image(image,target_size=(224,224))preds = F.softmax(model(image),dim=1)results = torch.topk(preds.cpu().data,k=3,dim=1)results = (results[0].cpu().numpy(),results[1].cpu().numpy())data['predictions'] = list()for prob,label in zip(results[0][0],results[1][0]):r = {"label":str(label),"probability":float(prob)}data['predictions'].append(r)data["success"] = Truereturn flask.jsonify(data)
1.5 完整代碼
import io
import flask
import torch
import jsonify
import torch.nn.functional as F
from PIL import Image
from torch import nn
from torchvision import transforms,models,datasets"""-----初始化Flask app-----"""
app = flask.Flask(__name__) # 創(chuàng)建一個Flask應用程序?qū)嵗?/span>model = None
use_gpu = False"""-----加載模型進來-----"""
def load_model():global model# 加載resnet18網(wǎng)絡model = models.resnet18()num_ftrs = model.fc.in_featuresmodel.fc = nn.Sequential(nn.Linear(num_ftrs,102))checkpoint = torch.load('best.pth')model.load_state_dict(checkpoint['state_dict'])model.eval()# 是否使用gpuif use_gpu:model.cuda()"""-----數(shù)據(jù)預處理-----"""
def prepare_image(image,target_size):if image.mode !='RGB':image = image.convert('RGB')image = transforms.Resize(target_size)(image)image = transforms.ToTensor()(image)image = transforms.Normalize([0.485,0.456,0.406],[0.229,0.224,0.225])(image)image = image[None]if use_gpu:image = image.cuda()return torch.tensor(image)# @app.route是一個裝飾器,用于將特定的URL路徑綁定到一個視圖函數(shù)上。
# 當Web服務器接收到與該URL路徑匹配且方法也匹配的HTTP請求時,就會調(diào)用相應的視圖函數(shù)來處理該請求。
@app.route("/predict",methods = ["POST"])
def predict():# 做一個標志,剛開始無圖像傳入時為false,傳入圖像時為truedata = {"success":False}if flask.request.method == 'POST':if flask.request.files.get("image"):image = flask.request.files["image"].read()image = Image.open(io.BytesIO(image))image = prepare_image(image,target_size=(224,224))preds = F.softmax(model(image),dim=1)results = torch.topk(preds.cpu().data,k=3,dim=1)results = (results[0].cpu().numpy(),results[1].cpu().numpy())data['predictions'] = list()for prob,label in zip(results[0][0],results[1][0]):r = {"label":str(label),"probability":float(prob)}data['predictions'].append(r)data["success"] = Truereturn flask.jsonify(data)if __name__ == '__main__':print("Loading PyTorch model and Flask starting server...")print("Please wait until server has fully started")load_model() #加載模型# 再開啟服務app.run(port='5012') # 端口
2. 搭建客戶端
2.1 服務端網(wǎng)址
用于連接服務端:
-- 127.0.0.1:表示本地地址
-- 5012:表示端口
flask_url = 'http://127.0.0.1:5012/predict'
2.2 發(fā)送請求
def predict_result(image_path):image = open(image_path,'rb').read()payload = {'image':image}r = requests.post(flask_url,files=payload).json()# 向服務端發(fā)送一個POST請求,并嘗試將返回的JSON響應解析為一個Python字典if r['success']:for (i,result) in enumerate(r['predictions']):print('{}.預測類別為{}:的概率{}'.format(i+1,result['label'],result['probability']))else:print('Reqquest failed')
2.3 完整代碼
import requests
flask_url = 'http://127.0.0.1:5012/predict'def predict_result(image_path):image = open(image_path,'rb').read()payload = {'image':image}r = requests.post(flask_url,files=payload).json()# 向服務端發(fā)送一個POST請求,并嘗試將返回的JSON響應解析為一個Python字典if r['success']:for (i,result) in enumerate(r['predictions']):print('{}.預測類別為{}:的概率{}'.format(i+1,result['label'],result['probability']))else:print('Reqquest failed')if __name__ == '__main__':predict_result('./train/6/image_07162.jpg')
六、運行使用
先行運行服務端,使得服務端打開,然后再運行客戶端就可以連接上服務端,并使用服務端函數(shù)進行操作。
總結(jié)
本篇介紹了,如何進行模型部署,將客戶端與服務端連接在一起,使客戶可以借用服務端來操作。