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