在线观看www成人影院-在线观看www日本免费网站-在线观看www视频-在线观看操-欧美18在线-欧美1级

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

深度學習應用的服務端部署—PyTorch模型部署

電子設計 ? 來源:電子設計 ? 作者:電子設計 ? 2020-12-08 22:29 ? 次閱讀
文章轉載于微信公眾號:GiantPandaCV
作者: 阿呆

【GiantPandaCV導讀】這篇文章包含與PyTorch模型部署相關的兩部分內容:

  • PyTorch-YOLOv3模型的Web頁面展示程序的編寫
  • 模型的服務接口相關工具的使用

0. 環境依賴:

系統:Ubuntu 18.04
Python版本:3.7
依賴Python包:1. PyTorch==1.3 2. Flask==0.12 3. Gunicorn

需要注意的是Flask 0.12中默認的單進程單線程,而最新的1.0.2則不是(具體是多線程還是多進程尚待考證),而中文博客里面能查到的資料基本都在說Flask默認單進程單線程。

依賴工具 1. nginx 2. apache2-utils

nginx 用于代理轉發和負載均衡,apache2-utils用于測試接口

1. 制作模型演示界面

圖像識別任務的展示這項工程一般是面向客戶的,這種場景下不可能把客戶拉到你的電腦前面,敲一行命令,等matplotlib彈個結果窗口出來。總歸還是要有個圖形化界面才顯得有點誠意。
為了節約時間,我們選擇了Flask框架來開發這個界面。

上傳頁面和展示頁面

做識別演示需要用到兩個html頁面,代碼也比較簡單,編寫如下:

上傳界面







使用Flask上傳本地圖片

展示界面






使用Flask上傳本地圖片

{{?url_for('static',?filename=?path,_t=val1)?}}

上傳界面如下圖所示,覺得丑的話可以找前端同事美化一下:

flask上傳圖片及展示功能

然后就可以編寫flask代碼了,為了更好地展示圖片,可以向html頁面傳入圖片地址參數

fromflaskimportFlask,render_template,request,redirect,url_for,make_response,jsonifyfromwerkzeug.utilsimportsecure_filenameimportosimportcv2importtimefromdatetimeimporttimedeltafrommainimportrun,confALLOWED_EXTENSIONS=set(["png","jpg","JPG","PNG","bmp"])defis_allowed_file(filename):return'.'infilenameandfilename.rsplit('.',1)[1]inALLOWED_EXTENSIONSapp=Flask(__name__)#靜態文件緩存過期時間app.send_file_max_age_default=timedelta(seconds=1)@app.route("/upload",methods=['POST','GET'])defupload():ifrequest.method=="POST":f=request.files['file']ifnot(fandis_allowed_file(f.filename)):returnjsonify({"error":1001,"msg":"請檢查上傳的圖片類型,僅限于png、PNG、jpg、JPG、bmp"})user_input=request.form.get("name")basepath=os.path.dirname(__file__)upload_path=os.path.join(basepath,"static/images",secure_filename(f.filename))f.save(upload_path)detected_path=os.path.join(basepath,"static/images","output"+secure_filename(f.filename))run(upload_path,conf,detected_path)#returnrender_template("upload_ok.html",userinput=user_input,val1=time.time(),path=detected_path)path="/images/"+"output"+secure_filename(f.filename)returnrender_template("upload_ok.html",path=path,val1=time.time())returnrender_template("upload.html")if__name__=="__main__":app.run(host='0.0.0.0',port=8888,debug=True)

目標檢測函數

原項目中提供了detection.py來做批量的圖片檢測,需要稍微修改一下才能用來做flask代碼中的接口。

from__future__importdivisionfrommodelsimport*fromutils.utilsimport*fromutils.datasetsimport*importosimportsysimporttimeimportdatetimeimportargparsefromPILimportImageimporttorchfromtorchvisionimportdatasetsfromtorch.autogradimportVariableimportmatplotlib.pyplotaspltimportmatplotlib.patchesaspatchesfrommatplotlib.tickerimportNullLocatorclasscustom_dict(dict):def__init__(self,d=None):ifdisnotNone:fork,vind.items():self[k]=vreturnsuper().__init__()def__key(self,key):return""ifkeyisNoneelsekey.lower()def__str__(self):importjsonreturnjson.dumps(self)def__setattr__(self,key,value):self[self.__key(key)]=valuedef__getattr__(self,key):returnself.get(self.__key(key))def__getitem__(self,key):returnsuper().get(self.__key(key))def__setitem__(self,key,value):returnsuper().__setitem__(self.__key(key),value)conf=custom_dict({"model_def":"config/yolov3.cfg","weights_path":"weights/yolov3.weights","class_path":"data/coco.names","conf_thres":0.8,"nms_thres":0.4,"img_size":416})defrun(img_path,conf,target_path):device=torch.device("cuda"iftorch.cuda.is_available()else"cpu")os.makedirs("output",exist_ok=True)classes=load_classes(conf.class_path)model=Darknet(conf.model_def,img_size=conf.img_size).to(device)ifconf.weights_path.endswith(".weights"):#Loaddarknetweightsmodel.load_darknet_weights(conf.weights_path)else:#Loadcheckpointweightsmodel.load_state_dict(torch.load(conf.weights_path))model.eval()img=Image.open(img_path).convert("RGB")img=img.resize(((img.size[0]//32)*32,(img.size[1]//32)*32))img_array=np.array(img)img_tensor=pad_to_square(transforms.ToTensor()(img),0)[0].unsqueeze(0)conf.img_size=img_tensor.shape[2]withtorch.no_grad():detections=model(img_tensor)detections=non_max_suppression(detections,conf.conf_thres,conf.nms_thres)[0]cmap=plt.get_cmap("tab20b")colors=[cmap(i)foriinnp.linspace(0,1,20)]plt.figure()fig,ax=plt.subplots(1)ax.imshow(img_array)ifdetectionsisnotNone:#Rescaleboxestooriginalimagedetections=rescale_boxes(detections,conf.img_size,img_array.shape[:2])unique_labels=detections[:,-1].cpu().unique()n_cls_preds=len(unique_labels)bbox_colors=random.sample(colors,n_cls_preds)forx1,y1,x2,y2,conf,cls_conf,cls_predindetections:print("/t+Label:%s,Conf:%.5f"%(classes[int(cls_pred)],cls_conf.item()))box_w=x2-x1box_h=y2-y1color=bbox_colors[int(np.where(unique_labels==int(cls_pred))[0])]#CreateaRectanglepatchbbox=patches.Rectangle((x1,y1),box_w,box_h,linewidth=2,edgecolor=color,facecolo)#Addthebboxtotheplotax.add_patch(bbox)#Addlabelplt.text(x1,y1,s=classes[int(cls_pred)],colo,verticalalignmen,bbox={"color":color,"pad":0},)#Savegeneratedimagewithdetectionsplt.axis("off")plt.gca().xaxis.set_major_locator(NullLocator())plt.gca().yaxis.set_major_locator(NullLocator())filename=img_path.split("/")[-1].split(".")[0]plt.savefig(target_path,bbox_inches='tight',pad_inches=0.0)plt.close()if__name__=="__main__":run("data/samples/dog.jpg",conf)

展示效果

編寫好了之后,啟動server.py,在本地打開localhost:8888/upload就可以看到如下界面了,把圖片上傳上去,很快就能得到檢測結果。
結果如下圖所示:

2. 深度學習的服務接口編寫

接下來介紹的是在生產環境下的部署,使用的是flask+gunicorn+nginx的方式,可以處理較大規模的請求。
下面以圖像分類模型為例演示一下深度學習服務接口如何編寫。

對于深度學習工程師來說,學習這些內容主要是了解一下自己的模型在生產環境的運行方式,便于在服務出現問題的時候與開發的同事一起進行調試。

flask服務接口

接口不需要有界面顯示,當然也可以添加一個API介紹界面,方便調用者查看服務是否已經啟動。

fromflaskimportFlask,requestfromwerkzeug.utilsimportsecure_filenameimportuuidfromPILimportImageimportosimporttimeimportbase64importjsonimporttorchfromtorchvision.modelsimportresnet18fromtorchvision.transformsimportToTensorfromkeysimportkeyapp=Flask(__name__)net=resnet18(pretrained=True)net.eval()@app.route("/",methods=["GET"])defshow():return"classifierapi"@app.route("/run",methods=["GET","POST"])defrun():file=request.files['file']base_path=os.path.dirname(__file__)ifnotos.path.exists(os.path.join(base_path,"temp")):os.makedirs(os.path.join(base_path,"temp"))file_name=uuid.uuid4().hexupload_path=os.path.join(base_path,"temp",file_name)file.save(upload_path)img=Image.open(upload_path)img_tensor=ToTensor()(img).unsqueeze(0)out=net(img_tensor)pred=torch.argmax(out,dim=1)return"result:{}".format(key[pred])if__name__=="__main__":app.run(hos,port=5555,debug=True)

在命令行輸入python server.py即可啟動服務。

gunicorn啟動多個實例

新版的flask已經支持多進程了,不過用在生產環境還是不太穩定,一般生產環境會使用gunicorn來啟動多個服務。
使用如下命令即可啟動多個圖像分類實例

gunicorn -w 4 -b 0.0.0.0:5555 server:app

輸出如下內容代表服務創建成功:

[2020-02-11 14:50:24 +0800] [892] [INFO] Starting gunicorn 20.0.4[2020-02-11 14:50:24 +0800] [892] [INFO] Listening at: http://0.0.0.0:5555 (892)[2020-02-11 14:50:24 +0800] [892] [INFO] Using worker: sync[2020-02-11 14:50:24 +0800] [895] [INFO] Booting worker with pid: 895[2020-02-11 14:50:24 +0800] [896] [INFO] Booting worker with pid: 896[2020-02-11 14:50:24 +0800] [898] [INFO] Booting worker with pid: 898[2020-02-11 14:50:24 +0800] [899] [INFO] Booting worker with pid: 899

如果配置比較復雜,也可以將配置寫入一個文件中,如:

bind='0.0.0.0:5555'timeout=10workers=4

然后運行:

gunicorn -c gunicorn.conf sim_server:app

nginx負載均衡

如果有多個服務器,可以使用nginx做請求分發與負載均衡。
安裝好nginx之后,修改nginx的配置文件

worker_processes auto;error_log /var/log/nginx/error.log;pid /run/nginx.pid;# Load dynamic modules. See /usr/share/nginx/README.dynamic.include /usr/share/nginx/modules/*.conf;events {    worker_connections 1024;}http {    server    {        listen 5556; # nginx端口        server_name localhost;        location / {            proxy_pass http://localhost:5555/run; # gunicorn的url        }    }}

然后按配置文件啟動

sudo nginx -c nginx.conf

測試一下服務是否正常

啟動了這么多服務之后,可以使用apache2-utils來測試服務的并發性能。
使用apache2-utils進行上傳圖片的post請求方法參考:
https://gist.github.com/chill...

嚴格參照,注意一個標點,一個符號都不要錯。使用這種方法傳輸圖片的base64編碼,在服務端不需要解碼也能使用

然后使用下面的方式訪問
gunicorn 接口

ab -n 2 -c 2 -T "multipart/form-data; boundary=1234567890" -p turtle.txt http://localhost:5555/run

nginx 接口

ab -n 2 -c 2 -T "multipart/form-data; boundary=1234567890" -p turtle.txt http://localhost:5556/run

- END -

推薦閱讀

更多嵌入式AI技術干貨請關注嵌入式AI專欄。

審核編輯:符乾江
聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • 深度學習
    +關注

    關注

    73

    文章

    5510

    瀏覽量

    121338
  • pytorch
    +關注

    關注

    2

    文章

    808

    瀏覽量

    13283
收藏 人收藏

    評論

    相關推薦

    Flexus X 實例 ultralytics 模型 yolov10 深度學習 AI 部署與應用

    模型迭代,讓 AI 智能觸手可及。把握此刻,讓創新不再受限! ???本實驗演示從 0 到 1 部署 YOLOv10 深度學習 AI 大模型
    的頭像 發表于 12-24 12:24 ?337次閱讀
    Flexus X 實例 ultralytics <b class='flag-5'>模型</b> yolov10 <b class='flag-5'>深度</b><b class='flag-5'>學習</b> AI <b class='flag-5'>部署</b>與應用

    AI模型部署邊緣設備的奇妙之旅:目標檢測模型

    以及邊緣計算能力的增強,越來越多的目標檢測應用開始直接在靠近數據源的邊緣設備上運行。這不僅減少了數據傳輸延遲,保護了用戶隱私,同時也減輕了云端服務器的壓力。然而,在邊緣部署高效且準確的目標檢測
    發表于 12-19 14:33

    Pytorch深度學習訓練的方法

    掌握這 17 種方法,用最省力的方式,加速你的 Pytorch 深度學習訓練。
    的頭像 發表于 10-28 14:05 ?237次閱讀
    <b class='flag-5'>Pytorch</b><b class='flag-5'>深度</b><b class='flag-5'>學習</b>訓練的方法

    基于Pytorch訓練并部署ONNX模型在TDA4應用筆記

    電子發燒友網站提供《基于Pytorch訓練并部署ONNX模型在TDA4應用筆記.pdf》資料免費下載
    發表于 09-11 09:24 ?0次下載
    基于<b class='flag-5'>Pytorch</b>訓練并<b class='flag-5'>部署</b>ONNX<b class='flag-5'>模型</b>在TDA4應用筆記

    深度學習算法在嵌入式平臺上的部署

    隨著人工智能技術的飛速發展,深度學習算法在各個領域的應用日益廣泛。然而,將深度學習算法部署到資源受限的嵌入式平臺上,仍然是一個具有挑戰性的任
    的頭像 發表于 07-15 10:03 ?1555次閱讀

    PyTorch神經網絡模型構建過程

    PyTorch,作為一個廣泛使用的開源深度學習庫,提供了豐富的工具和模塊,幫助開發者構建、訓練和部署神經網絡模型。在神經網絡
    的頭像 發表于 07-10 14:57 ?530次閱讀

    基于AX650N/AX630C部署側大語言模型Qwen2

    本文將分享如何將最新的側大語言模型部署到超高性價比SoC上,向業界對側大模型部署的開發者提供
    的頭像 發表于 07-06 17:43 ?3647次閱讀
    基于AX650N/AX630C<b class='flag-5'>部署</b><b class='flag-5'>端</b>側大語言<b class='flag-5'>模型</b>Qwen2

    如何使用PyTorch建立網絡模型

    PyTorch是一個基于Python的開源機器學習庫,因其易用性、靈活性和強大的動態圖特性,在深度學習領域得到了廣泛應用。本文將從PyTorch
    的頭像 發表于 07-02 14:08 ?441次閱讀

    TensorFlow與PyTorch深度學習框架的比較與選擇

    深度學習作為人工智能領域的一個重要分支,在過去十年中取得了顯著的進展。在構建和訓練深度學習模型的過程中,
    的頭像 發表于 07-02 14:04 ?1013次閱讀

    服務端測試包括什么類型

    服務端測試是確保軟件系統在服務器端正常運行和滿足性能要求的重要環節。本文將詳細介紹服務端測試的類型、方法和最佳實踐。 1. 服務端測試的定義 服務端
    的頭像 發表于 05-30 16:03 ?802次閱讀

    服務端測試是web測試嗎為什么

    服務端測試和Web測試是兩個不同的概念,但它們在軟件開發和測試過程中是相互關聯的。本文將詳細解釋這兩個概念以及它們之間的關系。 服務端測試 服務端測試主要關注服務器端的軟件組件,這些組
    的頭像 發表于 05-30 15:30 ?662次閱讀

    服務端測試和客戶測試區別在哪

    服務端測試和客戶測試是軟件開發過程中的兩個重要環節,它們分別針對服務器端和客戶的軟件進行測試。本文將詳細介紹服務端測試和客戶
    的頭像 發表于 05-30 15:27 ?3305次閱讀

    服務端的測試主要是測什么內容

    服務端測試是軟件開發過程中的一個重要環節,主要目的是確保服務端程序的穩定性、性能、安全性和可靠性。 功能測試 功能測試是服務端測試的基礎,主要驗證服務端程序是否按照需求實現了所有功能。
    的頭像 發表于 05-30 15:24 ?4149次閱讀

    模型部署加速,都有哪些芯片可支持?

    電子發燒友網報道(文/李彎彎)大模型部署是指將大型神經網絡模型部署在移動終端設備上,使這些設備能夠直接運行這些
    的頭像 發表于 05-24 00:14 ?4249次閱讀

    【算能RADXA微服務器試用體驗】Radxa Fogwise 1684X Mini 規格

    ::支持主流編程框架(包括 TensorFlow, Caffe, PyTorch,Paddle, ONNX, MXNet, Tengine, and DarkNet) 大模型:支持邊緣部署
    發表于 02-28 11:21
    主站蜘蛛池模板: 成人窝窝午夜看片| 国产精品护士| videosgratis乱色欧美野外| 国产床戏无遮掩视频播放| 高清国产下药迷倒美女| 综合视频网| 色天天网| 福利视频自拍| 亚洲一区二区精品推荐| 免费的很黄很色的床小视频| 亚洲综人网| 瑟瑟网站免费| 久久免费精品国产72精品剧情| 国产精品va一区二区三区| yy6080一级毛片高清| 午夜视频久久| 国产午夜精品久久久久九九 | 日本免费观看网站| 九七婷婷狠狠成人免费视频| xxxx欧美69免费| 天天干天天色天天| 国产精品美女www爽爽爽视频| 免费高清成人啪啪网站| 高清不卡免费一区二区三区| 四虎最新地址| 美女视频很黄很暴黄是免费的| 丁香婷婷网| 日日夜夜精品| 日本69av| 国产精品久久久久久免费播放 | 中文字幕亚洲一区二区va在线 | 国产福利观看| 李老汉和小花的性生生活| 天天摸天天碰色综合网| 美女视频黄.免费网址| 午夜小网站| 五月sese| 亚洲国产婷婷香蕉久久久久久| 你懂的在线视频网站| 成人在线一区二区三区| 最猛91大神ben与女教师|