<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

          實踐教程|基于 docker 和 Flask 的深度學習模型部署!

          共 5248字,需瀏覽 11分鐘

           ·

          2021-12-09 20:49

          ↑ 點擊藍字?關(guān)注極市平臺

          作者丨louwill
          來源丨機器學習實驗室
          編輯丨極市平臺

          極市導讀

          ?

          本文筆者基于容器化技術(shù)的經(jīng)典工具docker,對REST API模型部署方式進行升級,讓模型部署更加高可用。?>>加入極市CV技術(shù)交流群,走在計算機視覺的最前沿

          模型部署一直是深度學習算法走向落地的重要的一環(huán)。隨著深度學習落地需求越來越迫切,具備一定工程部署能力是算法工程師的必備能力之一。

          深度學習模型一個比較關(guān)鍵的前置條件就是需要花不少時間進行環(huán)境配置,可能先需要建一個虛擬環(huán)境,然后配置深度學習框架和一些第三方庫,即時性和可移植性都比較差,總體而言可用性就不是那么強了。那么有沒有一種可以一鍵部署的方式?能在10分鐘內(nèi)就可以在一臺新機器上部署好我們的深度學習模型?答案是肯定的。本文筆者基于容器化技術(shù)的經(jīng)典工具docker,對REST API模型部署方式進行升級,讓模型部署更加高可用。

          docker簡介

          先簡單說一下docker。docker是一款基于Go語言開發(fā)的開源容器化技術(shù)。為了避免你寫的代碼在不同環(huán)境上表現(xiàn)不一,docker提供了一種環(huán)境隔離技術(shù),將你的代碼和代碼所有的依賴都打包到container中去,做到once build,run everywhere的效果。關(guān)于docker更詳細的介紹,各位讀者可以自行查找資料進行學習,不作為本文的重點。

          docker實際要重點掌握幾個概念和操作如下圖所示。

          類似于makefile風格,dockfile是用于生成image(鏡像)的文件,這個是需要我們自己編寫的,編寫完dockerfile之后,通過docker build命令生成image,這個image可以理解為可執(zhí)行程序,最后通過docker run運行這個可執(zhí)行程序image,運行起來的這個image就是container(容器)。

          關(guān)于ubuntu docker安裝可參考:

          https://docs.docker.com/engine/install/ubuntu/

          基于Falsk的REST API實現(xiàn)

          下面進入正文,來看基于docker和Flask如何快速部署一個深度學習模型,模型是一個基于MobileNetV2的圖像分類器。用于啟動REST API的app.py文件代碼編寫如下:

          import?os
          import?sys
          #?Flask
          from?flask?import?Flask,?redirect,?url_for,?request,?render_template,?Response,?jsonify,?redirect
          from?werkzeug.utils?import?secure_filename
          from?gevent.pywsgi?import?WSGIServer
          #?TensorFlow?and?tf.keras
          import?tensorflow?as?tf
          from?tensorflow?import?keras
          from?tensorflow.keras.applications.imagenet_utils?import?preprocess_input,?decode_predictions
          from?tensorflow.keras.models?import?load_model
          from?tensorflow.keras.preprocessing?import?image
          #?Some?utilites
          import?numpy?as?np
          from?util?import?base64_to_pil
          #?Declare?a?flask?app
          app?=?Flask(__name__)
          #?You?can?use?pretrained?model?from?Keras
          #?Check?https://keras.io/applications/
          #?or?https://www.tensorflow.org/api_docs/python/tf/keras/applications
          from?tensorflow.keras.applications.mobilenet_v2?import?MobileNetV2
          model?=?MobileNetV2(weights='imagenet')
          print('Model?loaded.?Check?http://127.0.0.1:5000/')
          #?Model?saved?with?Keras?model.save()
          MODEL_PATH?=?'models/your_model.h5'
          #?Load?your?own?trained?model
          #?model?=?load_model(MODEL_PATH)
          #?model._make_predict_function()??????????#?Necessary
          #?print('Model?loaded.?Start?serving...')
          def?model_predict(img,?model):
          ????img?=?img.resize((224,?224))
          ????#?Preprocessing?the?image
          ????x?=?image.img_to_array(img)
          ????#?x?=?np.true_divide(x,?255)
          ????x?=?np.expand_dims(x,?axis=0)
          ????#?Be?careful?how?your?trained?model?deals?with?the?input
          ????#?otherwise,?it?won't?make?correct?prediction!
          ????x?=?preprocess_input(x,?mode='tf')
          ????preds?=?model.predict(x)
          ????return?preds
          ????
          @app.route('/',?methods=['GET'])
          def?index():
          ????#?Main?page
          ????return?render_template('index.html')
          @app.route('/predict',?methods=['GET',?'POST'])
          def?predict():
          ????if?request.method?==?'POST':
          ????????#?Get?the?image?from?post?request
          ????????img?=?base64_to_pil(request.json)
          ????????#?Save?the?image?to?./uploads
          ????????#?img.save("./uploads/image.png")
          ????????#?Make?prediction
          ????????preds?=?model_predict(img,?model)
          ????????#?Process?your?result?for?human
          ????????pred_proba?=?"{:.3f}".format(np.amax(preds))????#?Max?probability
          ????????pred_class?=?decode_predictions(preds,?top=1)???#?ImageNet?Decode
          ????????result?=?str(pred_class[0][0][1])???????????????#?Convert?to?string
          ????????result?=?result.replace('_',?'?').capitalize()????????
          ????????#?Serialize?the?result,?you?can?add?additional?fields
          ????????return?jsonify(result=result,?probability=pred_proba)
          ????return?None
          ????
          if?__name__?==?'__main__':
          ????#?app.run(port=5002,?threaded=False)
          ??#?Serve?the?app?with?gevent
          ????http_server?=?WSGIServer(('0.0.0.0',?5000),?app)
          ????http_server.serve_forever()

          這里主要是基于Flask web框架實現(xiàn)一個REST API服務(wù),并添加html模板,將服務(wù)運行到指定的IP地址上。關(guān)于Python Flask web框架,可參考廖雪峰老師的教程進行學習:

          https://www.liaoxuefeng.com/wiki/1016959663602400/1017806472608512

          為了實現(xiàn)在指定網(wǎng)頁上的效果,除了應(yīng)用html模板之外,我們還需要編寫一點css樣式和js代碼,這里略過,可參考文末鏈接查看完整代碼。

          編寫dockerfile

          接下來我們需要編寫dockerfile,這是實現(xiàn)docker一鍵部署的起始點和關(guān)鍵所在。簡單來說,就是通過一系列dockerfile指令將Python環(huán)境、項目所需第三方庫、腳本運行等串起來,實現(xiàn)一鍵操作。所以在本例中我們可編寫dockfile文件如下:

          # 指定Python環(huán)境
          FROM python:3.6-slim-stretch
          # 拷貝Python依賴庫requirements文件到當前目錄下
          ADD requirements.txt /
          # 安裝依賴庫
          RUN pip install -r /requirements.txt
          # 拷貝所有文件到app目錄下
          ADD . /app
          # 指定app為工作目錄
          WORKDIR /app
          # 聲明端口
          EXPOSE 5000
          # docker容器啟動
          CMD [ "python" , "app.py"]

          requirements.txt包括的第三方依賴庫有:

          Flask==1.1.1
          gevent==1.4.0
          h5py==2.10.0
          numpy==1.17.0
          Pillow==6.1.0
          tensorflow==2.3.1
          Werkzeug==0.16.0

          基于docker的模型部署

          編寫完dockerfile文件后,即可通過docker來對該深度學習分類器進行線上部署。docker build命令建立改項目鏡像:

          docker build -t keras_flask_app .

          根據(jù)dockerfile中的7條指令,docker build也會經(jīng)過個步驟來生成鏡像。

          生成鏡像后即可運行,使得該深度學習項目服務(wù)啟動:

          docker?run?-it?--rm?-p?5000:5000?keras_flask_app

          服務(wù)啟動后,我們打開http://localhost:5000/即可使用該深度學習服務(wù):

          我們從本地上傳一張圖像進行測試:

          這樣,通過基于Flask實現(xiàn)的REST API服務(wù)和基于docker的一鍵部署功能結(jié)合在一起,我們就可以在短時間內(nèi)快速搭建一套線上的深度學習服務(wù)。

          完整項目代碼可參考:
          https://github.com/mtobeiyf/keras-flask-deploy-webapp


          如果覺得有用,就請分享到朋友圈吧!

          △點擊卡片關(guān)注極市平臺,獲取最新CV干貨

          公眾號后臺回復“transformer”獲取最新Transformer綜述論文下載~


          極市干貨
          課程/比賽:珠港澳人工智能算法大賽保姆級零基礎(chǔ)人工智能教程
          算法trick目標檢測比賽中的tricks集錦從39個kaggle競賽中總結(jié)出來的圖像分割的Tips和Tricks
          技術(shù)綜述:一文弄懂各種loss function工業(yè)圖像異常檢測最新研究總結(jié)(2019-2020)


          #?CV技術(shù)社群邀請函?#

          △長按添加極市小助手
          添加極市小助手微信(ID : cvmart4)

          備注:姓名-學校/公司-研究方向-城市(如:小極-北大-目標檢測-深圳)


          即可申請加入極市目標檢測/圖像分割/工業(yè)檢測/人臉/醫(yī)學影像/3D/SLAM/自動駕駛/超分辨率/姿態(tài)估計/ReID/GAN/圖像增強/OCR/視頻理解等技術(shù)交流群


          每月大咖直播分享、真實項目需求對接、求職內(nèi)推、算法競賽、干貨資訊匯總、與?10000+來自港科大、北大、清華、中科院、CMU、騰訊、百度等名校名企視覺開發(fā)者互動交流~



          覺得有用麻煩給個在看啦~??
          瀏覽 84
          點贊
          評論
          收藏
          分享

          手機掃一掃分享

          分享
          舉報
          評論
          圖片
          表情
          推薦
          點贊
          評論
          收藏
          分享

          手機掃一掃分享

          分享
          舉報
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  欧美精品系列 | 国产又粗又大操逼视频 | 九一精品网站 | 三级黄色电影日逼 | 亚洲无码免费电影 |