自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

為ML模型注入靈魂:基于MVP的超簡單部署方案

人工智能 機器學習
開發(fā)一個出色的機器學習模型是一件棘手的事,但即使開發(fā)完成也不意味著工作的結束。在部署之前,它仍然毫無用處,他人可以輕易訪問。

本文轉載自公眾號“讀芯術”(ID:AI_Discovery)

開發(fā)一個出色的機器學習模型是一件棘手的事,但即使開發(fā)完成也不意味著工作的結束。在部署之前,它仍然毫無用處,他人可以輕易訪問。

部署模型的方法有很多,筆者想談一種適用于基本MVP的非常簡單的解決方案——使用Flask為模型編寫API,將Gunicorn用于軟件服務器,將Nginx用于網站服務器,并將其包裝在Docker中,以便更輕松地在其他機器(特別是AWS和GCP)上進行部署。

[[328507]]

設置服務器

筆者更喜歡用專門為此租用的服務器,而不是使用私人或工作硬件對新配置進行實驗。這樣,即使某些東西被嚴重損毀,也無關緊要。

因此筆者建議使用Linode,筆者本人就是用其來進行實驗的,它們的硬件使用感不錯。只要在Ubuntu18.04 LTS上,就可以隨心所欲使用其他任何服務。

這一部分適合使用Linides的人借鑒。導航到Linodes,然后單擊“添加Linode”。有些東西需要填寫。在發(fā)行版中,筆者建議選擇Ubuntu18.04 LTS映像:

  • 該區(qū)域——靠近你的區(qū)域(筆者用的是法蘭克福,德國)
  • Linode計劃——Nanode(每月僅需5美元,就需求而言足夠了)
  • 根密碼——你的密碼

然后單擊“創(chuàng)建”。大約幾分鐘后,可以轉到“網絡”,在這里能找到有關通過SSH訪問服務器的信息。

為ML模型注入靈魂:基于MVP的超簡單部署方案

下一步應連接服務器,并創(chuàng)建具有sudo特權的非根用戶。這個操作背后的邏輯相當簡單:你不想在服務器上把所有東西都作為根運行,因為這樣更容易損壞東西。

  1. adduser usernameusermod -aG sudousername 

最終,切換到新用戶。

  1. su — username 

創(chuàng)建應用容器

整個系統(tǒng)配置分為兩部分:應用程序容器(Flask +Gunicorn)和Web容器(Nginx Web服務器)。

 

[[328508]]

 

 

圖源:unsplash

 

(1) 步驟0——安裝Docker和Docker Compose

Docker和Docker-compose安裝非常簡單,分別在4行和2行內就能完成。

(2) 步驟1——創(chuàng)建FlaskApp和WSGI入口點

在主目錄中創(chuàng)建flask app目錄,并將以下文件放入其中。

  1. from flask importFlask 
  2.              server =Flask(__name__) 
  3.              @server.route('/') 
  4.       defhello_world(): 
  5.           return'hello world!' 

這是最基礎的Flask應用,幾乎沒有任何功能,不用加載任何模型,不添加任何GET /POST請求和內容(這些將在下文出現)?,F在,我們只有一個主頁上顯示著“ helloworld”的應用程序。

這部分極為簡單——只需為Gunicorn創(chuàng)建一個在端口8000上運行的單獨文件。

(3) 步驟2——為Flask創(chuàng)建一個Docker映像

現在,我們需要創(chuàng)建一個將運用這些文件的Dockerfile,并創(chuàng)建一個稍后能運行的映像。

  1. FROM python:3.6.7 
  2.              WORKDIRusr/src/flask_app 
  3.            COPYrequirements.txt . 
  4.            RUN pip install--no-cache-dir -r requirements.txt 
  5.            COPY . . 

對于不熟悉Docker的人而言,此腳本的功能如下:

  • 導入Python 3.6.7圖像
  • 設置所有文件的工作目錄
  • 復制包含Flask、Gunicorn和運行Flask應用程序需要的所有其他文件的需求文件。

然后,通過RUN命令安裝所有必要安裝包,最后將所有文件從flaskdir復制到容器內的usrscrflask 應用程序中?,F在只需將此文件放在相同的flask_app目錄中,并添加requirements.txt即可。

  1. flask 
  2.      gunicorn 

請記住,如果你對目錄和內容感到困惑,只需在文章結尾處檢查完整的項目結構,或訪問GitHub存儲庫。

(4) 步驟3——創(chuàng)建Nginx文件

 

[[328509]]

 

 

圖源:unsplash

 

為運行Nginx,需要配置一些內容。但在邁出下一步之前,請在主目錄內創(chuàng)建nginx目錄(與flask_app處于同一級別)。之后,我們需要的第一個文件是nginx.conf,該文件幾乎包含所有基本的Nginx信息和變量。

來看一個Nginx基本設置:

  1. # Define the user that will own and run theNginx server 
  2.       user  nginx; 
  3.       # Define the number of worker processes;recommended value is the number of 
  4.       # cores that are being used by yourserver 
  5.       worker_processes  1; 
  6.       # Define the location on the file systemof the error log, plus the minimum 
  7.       # severity to log messages for 
  8.       error_log  /var/log/nginx/error.log warn; 
  9.       # Define the file that will store theprocess ID of the main NGINX process 
  10.       pid        /var/run/nginx.pid; 
  11.              # events blockdefines the parameters that affect connection processing. 
  12.       events { 
  13.           # Define themaximum number of simultaneous connections that can be opened by a workerproce$ 
  14.           worker_connections  1024; 
  15.       } 
  16.              # http blockdefines the parameters for how NGINX should handle HTTP web traffic 
  17.       http { 
  18.           # Include thefile defining the list of file types that are supported by NGINX 
  19.           include       /etc/nginx/mime.types; 
  20.           # Define thedefault file type that is returned to the user 
  21.           default_type  text/html; 
  22.           # Define theformat of log messages. 
  23.           log_format main  '$remote_addr - $remote_user [$time_local] "$request" ' 
  24.                             '$status$body_bytes_sent "$http_referer" ' 
  25.                             '"$http_user_agent" "$http_x_forwarded_for"'; 
  26.                                 # Define thelocation of the log of access attempts to NGINX 
  27.           access_log  /var/log/nginx/access.log  main; 
  28.           # Define theparameters to optimize the delivery of static content 
  29.           sendfile        on; 
  30.           tcp_nopush     on; 
  31.           tcp_nodelay    on; 
  32.           # Define thetimeout value for keep-alive connections with the client 
  33.           keepalive_timeout  65; 
  34.           # Define the usageof the gzip compression algorithm to reduce the amount of data to transmit 
  35.           #gzip  on; 
  36.           # Includeadditional parameters for virtual host(s)/server(s) 
  37.           include/etc/nginx/conf.d/*.conf; 
  38.       } 

第二個文件——特定應用程序的配置。想要做到這一點有兩種比較普遍的方法:

  • 在/ etc /nginx / sites-available / your_project中創(chuàng)建一個配置文件,然后創(chuàng)建到/ etc /nginx / sites-enabled / your_project的符號鏈接。
  • 只需在主要Nginx目錄中創(chuàng)建一個project.conf。下述為第二種方法。
    1. server { 
    2.                  listen 80; 
    3.          server_name docker_flask_gunicorn_nginx; 
    4.                  location / { 
    5.              proxy_pass http://flask_app:8000; 
    6.                      # Do not change this 
    7.              proxy_set_header Host $host; 
    8.              proxy_set_header X-Real-IP $remote_addr; 
    9.              proxy_set_header X-Forwarded-For$proxy_add_x_forwarded_for; 
    10.          } 
    11.                  location /static { 
    12.              rewrite ^/static(.*) /$1 break; 
    13.              root /static; 
    14.          } 
    15.       } 

有幾點需要注意:首先,請看一下listen80,該命令指定應用將在哪個端口運行。作為默認端口,我們選擇80。其次,服務器名稱。你可以指定從Linode獲得的IP地址,也可以只使用docker映像名稱。

最后,proxy pass命令,該命令應將Nginx配置指向flask項目。由于flask容器的名稱為flask_app(將在后面介紹),因此只須使用容器的名稱以及Flask項目中指定的端口。

(5) 步驟4——為Nginx創(chuàng)建一個Docker映像

該特定Docker映像非常簡單。與Flask一樣,它僅包含5行,且僅執(zhí)行2件事:

  1. FROM nginx:1.15.8 
  2.              RUN rm/etc/nginx/nginx.conf 
  3.            COPY nginx.conf/etc/nginx/ 
  4.            RUN rm/etc/nginx/conf.d/default.conf 
  5.            COPY project.conf/etc/nginx/conf.d/ 

導入nginx圖片,復制文件,并將其替換為默認文件。

(6) 步驟5——將Dockerfiles與docker-compose結合

現在已有2個Dockerfile:

  • 一個用于Flask + Gunicorn
  • 另一個用于Nginx。

現在是時候讓它們交互,并運行整個系統(tǒng)了。為完成這一點,要用到docker-compose。我們只需要在主目錄中創(chuàng)建docker-compose.yml文件。

  1. version: '3' 
  2.              services: 
  3.           flask_app: 
  4.            container_name: flask_app 
  5.            restart: always 
  6.            build: ./flask_app 
  7.            ports: 
  8.              - "8000:8000" 
  9.            command: gunicorn -w 1 -b 0.0.0.0:8000 wsgi:server 
  10.                nginx: 
  11.            container_name: nginx 
  12.            restart: always 
  13.            build: ./nginx 
  14.            ports: 
  15.              - "80:80" 
  16.            depends_on: 
  17.              - flask_app 

為了解其工作原理,我們來處理幾個重要問題:

  • 首先,docker-compose分為2部分(2個服務):flask_app和nginx。正如從以下幾行中看到的那樣——flask_app容器執(zhí)行運行Flask應用程序的Gunicorn,并用1個工作程序將其轉換為8000端口。
  • 第二個容器僅在80端口上運行Nginx。另外,請注意depends_on部分,該部分命令docker-compose首先啟動flask_app容器,然后才是——-nginx,因為這兩個容器相互依賴。

 

[[328510]]

 

 

圖源:unsplash

 

此外,還應添加一件事,以便更輕松運行此Docker設置。那就是run_docker.sh文件。

  1. echo killing old dockerprocesses 
  2.         docker-compose rm -fs 
  3.              echo building dockercontainers 
  4.         docker-compose up --build -d 

該設置只是簡單地運行docker-compose,但首先要確保此時舊的docker進程沒有處于活動狀態(tài)。

(7) 步驟6——將所有設置放在一起

當前的項目結構應如下所示:

  1. ├── flask_app 
  2. │   ├── app.py          
  3. │   ├── wsgi.py 
  4. │   └── Dockerfile 
  5. ├── nginx 
  6. │   ├── nginx.conf          
  7. │   ├── project.conf 
  8. │   └── Dockerfile 
  9. ├── docker-compose.yml 
  10. └── run_docker.sh 

在確保一切就緒之后,就能運行docker了。

  1. bash run_docker.sh 

并通過導航到從Linode獲得的IP,然后在瀏覽器中查看主頁面:

為ML模型注入靈魂:基于MVP的超簡單部署方案

(8) 步驟7——沒有得出任何成果,我該怎么辦?

先在Linode上租用一個服務器,安裝docker和docker-compose,接著克隆git存儲庫,然后運行bash run_docker.sh。

確保成功運行后,開始更改內容。嘗試使用Flask,Dockerfiles或docker-compose,直到出現故障。之后,嘗試找出問題所在,并著手解決。

(9) 步驟8-下一步呢?

 

[[328512]]

 

 

圖源:unsplash

 

接下來要添加的是支持FlaskApp中的POST請求。這樣,可以將請求發(fā)送到模型并獲得響應。

需滿足兩點:一個可以處理請求的模型,以及POST請求能夠自我支持。

  1. from flask importFlask, request,jsonify 
  2.              server =Flask(__name__) 
  3.              defrun_request(): 
  4.            index =int(request.json['index']) 
  5.            list = ['red', 'green', 'blue', 'yellow', 'black'] 
  6.            return list[index] 
  7.              @server.route('/', methods=['GET', 'POST']) 
  8.         defhello_world(): 
  9.            if request.method =='GET': 
  10.                return'The model is up and running. Send a POST request' 
  11.            else: 
  12.                returnrun_request() 

為方便起見,在這種情況下,該模型僅返回顏色列表的第i個元素。但實際上,運行哪種模型都無關緊要,只需在所有方法上創(chuàng)建模型的實例(prettymuch where you have server = Flask(__name__))就可以了。

現在,如果導航到IP地址,將看到一條消息——“模型已啟動,正在運行。發(fā)送POST請求”,因為只需轉到IP就可將其視為GET請求。

但讓我們試著使用包含模型索引的json文件發(fā)送POST請求。筆者使用Postman,但你可以視個人喜好而定(即Curl)。

為ML模型注入靈魂:基于MVP的超簡單部署方案

行得通!現在,可以添加其它路徑,以接收GET /POST請求。該想法背后的原因是可以通過加載多個模型,根據URL將請求發(fā)送到特定模型。

(10) 步驟9——進一步發(fā)展如何?

實際上,還有一個重要的步驟要做。為快速部署此Docker設置,將其部署在云空間是個不錯的想法。這種方法的一個主要優(yōu)勢是:AWS將為群集管理基礎架構提供保障。

你學會了嗎?

 

責任編輯:趙寧寧 來源: 讀芯術
相關推薦

2023-04-04 08:00:00

LazyPredic機器學習ML模型

2020-07-20 14:03:46

蘋果 iOS框架

2019-01-23 11:12:42

機器學習機器模型預測工資

2020-08-23 11:48:44

Python云盤updog

2022-06-08 08:43:02

Web3SBTsBlockcerts

2012-11-26 14:50:50

2022-03-28 18:59:02

DockerFlask深度學習

2025-02-19 07:53:19

2022-03-14 09:39:06

PythonPDF圖片

2024-07-12 11:35:20

2009-02-04 16:11:45

2022-08-09 13:44:37

機器學習PySpark M數據分析

2013-12-10 10:32:45

華為沃達豐Lampsite

2013-08-16 15:19:40

華為遠程醫(yī)療華為

2017-05-12 18:30:05

AndroidMVP代碼結構

2022-10-31 11:33:30

機器學習參數調優(yōu)

2013-10-10 14:46:54

華為eLTE方案華為eLTE華為

2022-11-09 10:33:39

awk腳本Groovy

2023-02-13 15:00:13

機器學習scikit-leaPyTorch
點贊
收藏

51CTO技術棧公眾號