您現在的位置是:首頁 > 網路遊戲首頁網路遊戲

手把手教你用 Flask, Docker 和 Kubernetes 部署Python機器學習模型(附程式碼)

簡介在本地 Docker 守護程序上啟動映像:docker run ——rm -p 5000:5000 -d alexioannidestest-ml-score-seldon-api:latest然後向它傳送一個請求:curl -g htt

電腦終結點是什麼

手把手教你用 Flask, Docker 和 Kubernetes 部署Python機器學習模型(附程式碼)

將機器學習(ML)模型部署到生產環境中的一個常見模式是將這些模型作為 RESTful API 微服務公開,這些微服務從 Docker 容器中託管,例如使用 SciKit Learn 或 Keras 包訓練的 ML 模型,這些模型可以提供對新資料的預測。然後,可以將它們部署到雲環境中,以處理維護連續可用性所需的所有事情,例如容錯、自動縮放、負載平衡和滾動服務更新。

持續可用的雲部署的配置詳細資訊對於不同的目標雲提供商來說是不一樣的——例如,Amazon Web 服務的部署過程和拓撲結構與微軟 Azure 不同,後者又與谷歌雲平臺不同。這構成了每個雲提供商需要獲取的知識。此外,在本地測試整個部署策略是困難的(有些人會說幾乎不可能),它使得網路等問題難以除錯。

Kubernetes 是一個容器編排平臺,旨在解決這些問題。簡而言之,它提供了一種機制,用於定義整個基於微服務的應用程式部署拓撲及其維護連續可用性的服務級別要求。對於目標雲提供商來說,它可以在本地執行,甚至可以在你的膝上型電腦上執行,而這一切所需的只是執行 Kubernetes 的虛擬機器叢集,即 Kubernetes 叢集。

這篇部落格適合與GitHub 儲存庫中的程式碼一起閱讀,其中包含 Python 模組、Docker 配置檔案和 Kubernetes 指令,用於演示如何使用 Docker 和 Kubernetes 將簡單的 Python ML 模型轉換為生產級 RESTful 模型評分(或預測)API 服務。這不是一個全面的指南,但它會幫助你快速啟動和執行,熟悉基本概念和模式。

我們將使用兩種不同的方法演示 ML 模型部署:使用 Docker 和 Kubernetes 的第一原則方法;然後使用 Seldon Core Kubernetes 本機框架來簡化 ML 服務的部署。前者將有助於理解後者,後者構成一個強大的框架,用於部署和監視許多複雜的 ML 模型管道的效能。

使用 Flask 和 Docker 容器化一個簡單的 ML 模型評分伺服器

我們首先演示如何使用 api。py 模組中包含的簡單 Python ML 模型評分 REST API 和 Dockerfile 來實現這一基本功能,這兩個檔案都位於 py-flask-ml-score-api 目錄中,其核心內容如下:

py-flask-ml-score-api/

| Dockerfile

| Pipfile

| Pipfile。lock

| api。py

在 api.py 模組中定義 Flask Service

這是一個 Python 模組,它使用 Flask 框架定義一個 web 服務(app),帶有一個函式(score),該函式在響應對特定 URL(或「route」)的 HTTP 請求時執行,這要歸功於 app。route 函式的封裝。相關程式碼複製如下,以供參考:

from flask import Flask, jsonify, make_response, request

app = Flask(__name__)

@app。route(‘/score’, methods=[‘POST’])

def score():

features = request。json[‘X’]

return make_response(jsonify({‘score’: features}))

if __name__ == ‘__main__’:

app。run(host=‘0。0。0。0’, port=5000

如果在本地執行(例如,使用 python run api。py 啟動 web 服務),我們就可以在 http://localhost:5000/score訪問我們的函式。此函式接受以 JSON 形式傳送給它的資料(該資料已自動反序列化為 Python dict,在函式定義中用作請求變數),並返回響應(自動序列化為 JSON)。

在我們的示例函式中,我們期望傳遞給 ML 模型一組特性 X,在我們的示例中,ML 模型將這些相同的特性返回給呼叫者,即我們選擇的 ML 模型是 identity 函式,我們選擇它純粹是為了演示。我們可以很容易地載入一個 pickled SciKit Learn 或 Keras 模型,並將資料傳遞給 approproate predict 方法,以 JSON 的形式返回特性資料的分數。

用 Dockerfile 定義 Docker 映像

Dockerfile 本質上是 Docker 使用的配置檔案,它允許你在操作時定義 Docker 容器的內容並配置其操作。此靜態資料在未作為容器執行時稱為「image」。作為參考,Dockerfile 複製如下:

FROM python:3。6-slim

WORKDIR /usr/src/app

COPY 。 。

RUN pip install pipenv

RUN pipenv install

EXPOSE 5000

CMD [“pipenv”, “run”, “python”, “api。py”]

在我們的示例 Dockerfile 中,我們:

首先使用一個預先配置好的 Docker 映象(python:3。6-slim),它已經安裝了 python 的 Alpine Linux 發行版;

然後將 py-flask-ml-score-api 本地目錄的內容複製到影象上名為 /usr/src/app 的目錄中;

然後使用 pip 為 Python 依賴管理安裝 Pipenv 包;

然後使用 Pipenv 將 Pipfile。lock 中描述的依賴項安裝到映像上的虛擬環境中;

將埠 5000 配置為暴露在執行容器上的「外部世界」;

啟動 Flask RESTful web 服務——api。py。注意,這裡我們依賴 Flask 的內部 WSGI 伺服器,而在生產環境中,我們建議配置一個更魯棒的選項(例如 Gunicorn)。

構建此自定義映像並要求 Docker 程序執行它(請記住,正在執行的映像是一個「容器」),將在埠 5000 上公開我們的 RESTful ML 模型評分服務,就像它在專用虛擬機器上執行一樣。有關這些核心概念的更全面的討論,請參閱 Docker 官方文件。

為 ML Scoring Service 構建 Docker 映像

我們假設 Docker 在本地執行,客戶端登入到 DockerHub 上的一個帳戶,並且在這個專案的根目錄中有一個開啟的終端。要構建 Dockerfile 執行中描述的映像:

docker build ——tag alexioannides/test-ml-score-api py-flask-ml-score-api

其中「AlxiiNANIDs」指的是 DockerHub 帳戶的名稱,我們將在對影象進行測試之後上傳它。

測試

要測試印象是否可以用於建立一個 Docker 容器,該容器的功能與我們預期的一樣,

docker run ——rm ——name test-api -p 5000:5000 -d alexioannides/test-ml-score-ap

我們已經從 Docker 容器(即我們的 ML 模型評分伺服器正在監聽的埠)對映到主機(localhost)上的埠 5000:

docker ps

然後檢查容器是否正在使用:

curl http://localhost:5000/score \

——request POST \

——header “Content-Type: application/json” \

——data ‘{“X”: [1, 2]}

你應該得到的輸出是:

{“score”:[1,2]}

我們的測試模型所做的只是返回輸入資料,即它是 identity 函式。修改此服務以從磁碟載入 SciKit Learn 模型並將新資料傳遞給生成預測的「predict」方法只需要幾行額外的程式碼。現在容器已經確認可以使用了,我們可以停止它:

docker stop test-api

將印象推送到 DockerHub 登錄檔

為了讓遠端 Docker 主機或 Kubernetes 群集能夠訪問我們建立的映像,我們需要將其釋出到映像登錄檔。所有能提供基於託管 Docker 服務的雲計算提供商都將提供私有印象註冊,但為了方便起見,我們將使用 DockerHub 的公共印象註冊。將我們的新印象推到 DockerHub(我的帳戶 ID 是「AlxiiNANIDs」)。

docker push alexioannides/test-ml-score-api

我們現在可以看到,我們為印象選擇的命名約定與我們的目標影象登錄檔有內在的聯絡(需要時,你需要插入自己的帳戶 ID)。上傳完成後,登入 DockerHub,透過 DockerHub 使用者介面確認上傳成功。

安裝 Kubernetes 供本機開發和測試

安裝單節點 Kubernetes 叢集有兩個適合本機開發和測試的選項:透過 Docker 桌面客戶端,或者透過 Minikube。

透過 Docker 桌面安裝 Kubernetes

如果你一直在 Mac 電腦上使用 Docker,那麼你很有可能是透過 Docker 桌面應用程式來完成的。如果沒有,則可以在此處下載 Docker 桌面。Docker 桌面現在與 Kubernetes 捆綁在一起,可以透過進入 Preferences->Kubernetes 並選擇 Enable Kubernetes 來啟用它。Docker 桌面需要一段時間才能下載執行 Kubernetes 所需的 Docker 印象,所以請耐心等待。完成後,轉到 Preferences->Advanced,確保至少為 Docker 引擎分配了 2 個 CPU 和 4 個 GiB,這是部署單個 Seldon ML 元件所需的最低資源。

要與 Kubernetes 叢集互動,你需要 kubectl 命令列介面(CLI)工具,該工具需要單獨下載。在 Mac 上執行此操作的最簡單方法是使用 brew install kubernetes-cli。一旦安裝了 kubectl 並啟動並運行了 Kubernetes 叢集,就可以透過執行它來測試是否能按預期工作。

kubectl cluster-info

返回應該如下:

Kubernetes master is running at https://kubernetes。docker。internal:6443KubeDNS is running at https://kubernetes。docker。internal:6443/api/v1/namespaces/kube-system/services/kube-dns:dns/proxy

To further debug and diagnose cluster problems, use ’kubectl cluster-info dump‘。

透過 Minikube 安裝 Kubernetes

在 Mac OS X 上,啟動和執行 Minikube 所需的步驟如下:

確保安裝了安裝包管理器

使用安裝 VirtualBox,使用 brew cask 安裝 VirtualBox

使用安裝 Minikube,使用 brew cask 安裝 minicube

要啟動測試群集:

minikube start ——memory 409

其中,我們指定了部署單個 Seldon ML 元件所需的最小記憶體量。耐心點,Minikube 可能需要一段時間才能開始,要先測試該群集是否執行正常。

kubectl cluster-info

其中 kubectl 是用於與 Kubernetes API 互動的標準命令列介面(CLI)客戶機。

將容器化的 ML 模型評分服務部署到 Kubernetes

要在 Kubernetes 上啟動我們的測試模型評分服務,我們將首先在 Kubernetes Pod 中部署容器化服務,它的推出由部署管理,而部署又會建立一個 ReplicaSet,這是透過下面的程式碼實現的:

kubectl create deployment test-ml-score-api ——image=alexioannides/test-ml-score-api:lates

要檢查部署執行的狀態,

kubectl rollout status deployment test-ml-score-api

為了看到執行的 pod,

kubectl get pod

可以使用埠轉發來測試單個容器,而無需將其公開到公共網路。要使用此功能,請開啟一個單獨的終端並執行。例如,

kubectl port-forward test-ml-score-api-szd4j 5000:500

其中 body-ml-score-api-szd4j 是叢集上當前活動的 pod 的確切名稱,由 kubectl get pods 命令確定。然後從原來的終端,對執行在 Kubernetes 上的同一個容器重複我們的測試請求,

curl http://localhost:5000/score \

——request POST \

——header “Content-Type: application/json” \

——data ’{“X”: [1, 2]}

要將容器作為(負載平衡)服務公開,我們必須建立引用它的 Kubernetes 服務。這是透過以下命令實現的:

kubectl expose deployment test-ml-score-api ——port 5000 ——type=LoadBalancer ——name test-ml-score-api-lb

如果你使用的是 Docker 桌面,那麼這將自動模擬 http://localhost:5000上的負載平衡器。查詢 Minikube 在何處公開其模擬負載平衡器執行:

minikube service list

現在我們測試我們的新伺服器,例如,使用 Docker 桌面:

curl http://localhost:5000/score \

——request POST \

——header “Content-Type: application/json” \

——data ‘{“X”: [1, 2]}

注意,Docker Desktop 和 Minikube 都沒有設定一個真實的負載平衡器(如果我們在雲平臺上提出這個請求,就會發生這種情況)。要拆下負載平衡器,請依次執行以下命令:

kubectl delete deployment test-ml-score-api

kubectl delete service test-ml-score-api-l

在 Google 雲平臺上配置多節點叢集

該叢集的資源遠遠大於膝上型電腦上 Kubernetes 管理器平臺。我們將在 Google 雲平臺(GCP)上使用 Kubernetes 引擎。

啟動並執行 Google 雲平臺

在使用 Google 雲平臺之前,請註冊一個帳戶並建立一個專門用於此工作的專案。接下來,確保 GCP SDK 安裝在本地計算機上,例如:

brew cask install google-cloud-sdk

或者直接從 GCP 下載安裝映像。注意,如果你還沒有安裝 Kubectl,那麼現在就需要安裝,這可以使用 GCP SDK 完成:

gcloud components install kubectl

然後我們需要初始化 SDK

gcloud init

它將開啟瀏覽器並指導你完成必要的身份驗證步驟,確保選擇建立的專案以及預設區域。

初始化 Kubernetes 群集

首先,在 GCP UI 中,訪問 Kubernetes 引擎頁面以觸發

Kubernetes API 啟動。然後從命令列啟動一個叢集:

gcloud container clusters create k8s-test-cluster ——num-nodes 3 ——machine-type g1-small

然後,在等待叢集建立的同時,你可以泡杯咖啡。注意,這將自動切換 kubectl 上下文以指向 GCP 上的叢集,如果執行 kubectl config get-contexts,你將看到這一點。要切換回 Docker 桌面客戶端,請使用 kubectl config use-context docker-desktop。

在 GCP 上啟動容器化 ML 模型評分伺服器

這在很大程度上與我們在本地執行測試服務時所做的相同-依次執行以下命令:

kubectl create deployment test-ml-score-api ——image=alexioannides/test-ml-score-api:latest

kubectl expose deployment test-ml-score-api ——port 5000 ——type=LoadBalancer ——name test-ml-score-api-lb

但是,要找到我們需要使用的 GCP 叢集的外部 IP 地址:

kubectl get services

然後我們可以在 GCP 上測試我們的伺服器,例如:

curl http://35。246。92。213:5000/score \

——request POST \

——header “Content-Type: application/json” \

——data ’{“X”: [1, 2]}’

或者,我們可以再次使用埠來連線到單個 pod,例如:

kubectl port-forward test-ml-score-api-nl4sc 5000:5000

然後在一個單獨的終端上:

curl http://localhost:5000/score \

——request POST \

——header “Content-Type: application/json” \

——data ‘{“X”: [1, 2]}’

最後,我們拆除複製控制器和負載平衡器,

kubectl delete deployment test-ml-score-api

kubectl delete service test-ml-score-api-lb

在 Kubectl 上下文之間切換

如果在本地執行 Kubernetes 和 GCP 上執行一個叢集,那麼可以將 Kubectl 上下文從一個叢集切換到另一個叢集,如下所示:

kubectl config use-context docker-desktop

其中上下文的列表可以使用,

kubectl config get-contexts

使用 YAML 檔案定義和部署 ML 模型評分伺服器

到目前為止,我們一直在使用 Kubectl 命令來定義和部署我們的 ML 模型評分伺服器的基本版本。這對於演示來說是很好的,但是很快就受限,且無法控制。實際上,定義整個 Kubernetes 部署的標準方法是使用釋出到 Kubernetes API 的 YAML 檔案。py-flask-ml-score-api 目錄中的 py-flask-ml-score。yaml 檔案是一個示例,它說明了如何在單個 yaml 檔案中定義我們的 ML 模型評分伺服器。現在可以使用一個命令部署它:

kubectl apply -f py-flask-ml-score-api/py-flask-ml-score。yaml

注意,我們在這個檔案中定義了三個單獨的 Kubernetes 元件:一個名稱空間、一個部署和一個負載平衡伺服器,對於所有這些元件(及其子元件),使用 ——- 來限定每個單獨元件的定義。要檢視部署到此名稱空間中的所有元件的使用方法:

kubectl get all ——namespace test-ml-app

同樣,當使用任何 kubectl get 命令檢查測試應用程式的不同元件時,設定 ——namespace 標誌。或者,我們可以將新的名稱空間設定為預設上下文:

kubectl config set-context $(kubectl config current-context) ——namespace=test-ml-app

然後執行:

kubectl get all

在這裡,我們可以使用

kubectl config set-context $(kubectl config current-context) ——namespace=default

拆掉我們可以使用的應用程式,

kubectl delete -f py-flask-ml-score-api/py-flask-ml-score。yaml

這樣我們就不必使用多個命令單獨刪除每個元件。請參閱Kubernetes API 的官方文件,以更深入地瞭解此 YAML 檔案的內容。

使用 Helm 圖表定義和部署 ML 模型評分伺服器

為 Kubernetes 編寫 YAML 檔案可能是重複性的工作,且難以管理,特別是如果涉及到大量的「複製貼上」,那麼從一個部署到下一個部署只需要更改少數引數,但有一堵「YAML 牆」需要修改。輸入 Helm——一個用於建立、執行和管理 Kubernetes 部署模板的框架。下面是一個非常棒的演示,它是關於如何使用 Helm 來部署我們的 ML 模型評分伺服器。要全面討論 Helm 的全部功能,請參考官方文件。Seldon Core 也可以使用 Helm 部署,稍後我們將更詳細地介紹這一點。

安裝 Helm

和以前一樣,在 Mac OS X 上安裝 Helm 的最簡單方法是使用自制包管理器,

brew install kubernetes-helm

Helm 依賴於一個專用的部署伺服器,稱為「Tiller」,它執行在我們希望部署應用程式的 Kubernetes 叢集中。在部署 Tiller 之前,我們需要建立一個在叢集範圍內的超級使用者角色來分配給它,以便它可以在任何名稱空間中建立和修改 Kubernetes 資源。為了實現這一點,我們首先建立一個服務帳戶,透過此方法,pod 在與服務帳戶關聯時,可以向 Kubernetes API 進行驗證,以便能夠檢視、建立和修改資源。我們在 kube 系統名稱空間中建立它,如下所示,

kubectl ——namespace kube-system create serviceaccount tiller

然後在此服務帳戶和群集角色之間建立繫結,顧名思義,該繫結會授予群集範圍內的管理許可權:

kubectl create clusterrolebinding tiller \

——clusterrole cluster-admin \

——serviceaccount=kube-system:tiller

我們現在可以將 Helm Tiller 部署到 Kubernetes 叢集,並使用所需的訪問許可權,

helm init ——service-account tiller

使用 Helm 進行部署

要建立新的 Helm 佈署定義,

helm create NAME-OF-YOUR-HELM-CHART

這將建立一個新的目錄,例如 helm-ml-score-app,它包含在這個儲存庫中,具有以下高階目錄結構,

helm-ml-score-app/

| —— charts/

| —— templates/

| Chart。yaml

| values。yaml

簡而言之,charts 目錄包含我們的新表所依賴的其他表(我們不會使用這個),templates 目錄包含我們的 Helm 模板,Chart。yaml 包含圖表的核心資訊(例如名稱和版本資訊),values。yaml 包含用於呈現模板的預設值的資訊(如果沒有從命令列設定值)。

下一步是刪除模板目錄中的所有檔案(NOTES。txt 除外),並用我們自己的檔案替換它們。我們從 namespace。yaml 開始為應用程式宣告名稱空間,

apiVersion: v1

kind: Namespace

metadata:

name: {{ 。Values。app。namespace }}

在此特定例項中 。Values。app。namespace 插入 app。namespace 變數,其預設值在 Values。yaml 中定義。接下來,我們在 deployment。yaml 中定義 pods 的部署:

apiVersion: apps/v1

kind: Deployment

metadata:

labels:

app: {{ 。Values。app。name }}

env: {{ 。Values。app。env }}

name: {{ 。Values。app。name }}

namespace: {{ 。Values。app。namespace }}

spec:

replicas: 1

selector:

matchLabels:

app: {{ 。Values。app。name }}

template:

metadata:

labels:

app: {{ 。Values。app。name }}

env: {{ 。Values。app。env }}

spec:

containers:

- image: {{ 。Values。app。image }}

name: {{ 。Values。app。name }}

ports:

- containerPort: {{ 。Values。containerPort }}

protocol: TCP

以及 service。yaml 中的負載平衡器服務的詳細資訊,

apiVersion: v1kind: Servicemetadata:

name: {{ 。Values。app。name }}-lb

labels:

app: {{ 。Values。app。name }}

namespace: {{ 。Values。app。namespace }}spec:

type: LoadBalancer

ports:

- port: {{ 。Values。containerPort }}

targetPort: {{ 。Values。targetPort }}

selector:

app: {{ 。Values。app。name }}

實際上,我們所做的是將部署細節的每個元件從 py-flask-ml-score。yaml 拆分到自己的檔案中,然後為配置的每個引數定義模板變數。要測試和檢查呈現的模板,請執行:

helm install helm-ml-score-app ——debug ——dry-run

如果您對「dry run」的結果感到滿意,則執行部署並使用:

helm install helm-ml-score-app ——name test-ml-app

這將自動打印發布的狀態,以及 Helm 賦予它的名稱和呈現給終端的 NOTES。txt 的內容。列出所有可用的 Helm 版本及其名稱:

helm list

以及其所有組成元件(如 pod、複製控制器、伺服器等)的狀態,例如:

helm status test-ml-app

ML 評分伺服器現在可以用與上面完全相同的方式進行測試。一旦你確信它按預期工作,就可以使用了:

helm delete test-ml-app

使用 Seldon 將 ML 模型評分伺服器部署到 Kubernetes

Seldon 的核心任務是簡化 Kubernetes 上覆雜 ML 預測管道的重複部署和管理。在本演示中,我們將重點介紹最簡單的示例,即我們已經使用的簡單的 ML 模型評分 API。

為 Seldon 構建 ML 元件

要使用 Seldon 部署 ML 元件,我們需要建立 Seldon 相容的 Docker 映像。我們首先遵循相關指導原則來定義一個 Python 類,該類封裝了一個用於 Seldon 部署的 ML 模型。它包含在 seldon-ml-score-component 目錄中,其內容類似於 py-flask-ml-score-api 中的內容:

seldon-ml-score-component/

| Dockerfile

| MLScore。py

| Pipfile

| Pipfile。lock

構建 Docker 印像以用於 Seldon

Seldon 要求 ML 評分伺服器的 Docker 映像以特定的方式構造:

ML 模型必須封裝在一個 Python 類中,其中包含一個帶有特定簽名(或介面)的 predict 方法,例如,在 MLScore。py(故意以其中包含的 Python 類命名)中:

class MLScore:

“”“

Model template。 You can load your model parameters in __init__ from

a location accessible at runtime

”“”

def __init__(self):

“”“

Load models and add any initialization parameters (these will

be passed at runtime from the graph definition parameters

defined in your seldondeployment kubernetes resource manifest)。

”“”

print(“Initializing”)

def predict(self, X, features_names):

“”“

Return a prediction。

Parameters

——————

X : array-like

feature_names : array of feature names (optional)

”“”

print(“Predict called - will run identity function”)

return X

必須安裝 seldon core Python 包

容器首先使用 seldon-core 包提供的 Seldon core microservice 入口點執行 Seldon 服務,它和上面的點都可以看到 DockerFile

FROM python:3。6-slim

COPY 。 /app

WORKDIR /app

RUN pip install pipenv

RUN pipenv install

EXPOSE 5000

# Define environment variable

ENV MODEL_NAME MLScore

ENV API_TYPE REST

ENV SERVICE_TYPE MODEL

ENV PERSISTENCE 0

CMD pipenv run seldon-core-microservice $MODEL_NAME $API_TYPE ——service-type $SERVICE_TYPE ——persistence $PERSISTENCE

有關詳細資訊,請參閱 Seldon 官方檔案。接下來,建立這個印象:

docker build seldon-ml-score-component -t alexioannides/test-ml-score-seldon-api:latest

在將此印像推送到登錄檔之前,我們需要確保它按預期工作。在本地 Docker 守護程序上啟動映像:

docker run ——rm -p 5000:5000 -d alexioannides/test-ml-score-seldon-api:latest

然後向它傳送一個請求:

curl -g http://localhost:5000/predict \

——data-urlencode ‘json={“data”:{“names”:[“a”,“b”],“tensor”:{“shape”:[2,2],“values”:[0,0,1,1]}}}’

如果響應與預期一致(即它包含與請求相同的負載),則推送印象:

docker push alexioannides/test-ml-score-seldon-api:latest

使用 Seldon Core 部署 ML 元件

我們現在繼續將 Seldon 相容的 ML 元件部署到 Kubernetes 叢集,並從中建立一個容錯和可縮放的伺服器。為了實現這一目標,我們將使用 Helm 表部署 Seldon Core。我們首先建立一個包含 seldon core 運算子的名稱空間,這是使用 seldon 部署任何 ML 模型所需的自定義 Kubernetes 資源:

kubectl create namespace seldon-core

然後我們使用 Helm 部署 Seldon Core,並在 https://storage。googleapis。com/Seldon-charts上部署 Seldon Helm 圖表庫:

helm install seldon-core-operator \

——name seldon-core \

——repo https://storage。googleapis。com/seldon-charts \

——set usageMetrics。enabled=false \

——namespace seldon-core

接下來,我們為 Kubernetes 部署 Ambassador API 閘道器,它將充當 Kubernetes 叢集的入口點。我們將為 Ambassador 部署建立一個專用名稱空間:

kubectl create namespace ambassador

然後使用 Helm 官方庫中最新的圖表部署 Ambassador:

helm install stable/ambassador \

——name ambassador \

——set crds。keep=false \

——namespace ambassador

如果我們現在執行 helm list ——namespace seldon-core,我們應該看到 seldon core 已經部署好了,並且正在等待 seldon ML 元件的部署。為了部署我們的 Seldon ML 模型評分伺服器,我們為它建立了一個單獨的名稱空間:

kubectl create namespace test-ml-seldon-app

然後配置並部署另一個官方 Seldon Helm,如下所示:

helm install seldon-single-model \

——name test-ml-seldon-app \

——repo https://storage。googleapis。com/seldon-charts \

——set model。image。name=alexioannides/test-ml-score-seldon-api:latest \

——namespace test-ml-seldon-app

注意,透過重複最後兩個步驟,現在可以使用 Seldon 部署多個 ML 模型,它們都將透過同一個 Ambassador API 閘道器自動訪問,我們現在將使用該閘道器測試 Seldon ML 模型評分伺服器。

透過 Ambassador 閘道器 API 測試 API

為了測試基於 Seldon 的 ML 模型評分伺服器,我們遵循與上面 Kubernetes 部署相同的方法,但是我們將透過 Ambassador API 閘道器路由我們的請求。要查詢 Ambassador 服務執行的 IP 地址:

kubectl -n ambassador get service ambassador

如果使用 Docker 桌面,則為 localhost:80;如果在 GCP 或 Minikube 上執行,則為 IP 地址(如果在後一種情況下需要記住使用 minikuke 服務列表)。現在測試預測的終結點,例如:

curl http://35。246。28。247:80/seldon/test-ml-seldon-app/test-ml-seldon-app/api/v0。1/predictions \

——request POST \

——header “Content-Type: application/json” \

——data ‘{“data”:{“names”:[“a”,“b”],“tensor”:{“shape”:[2,2],“values”:[0,0,1,1]}}}’

如果你想了解路由背後的完整邏輯,請參閱Seldon 文件,但 URL 實際上使用的是:

http:///seldon///api/v0。1/predictions

如果你的請求成功了,那麼你應該會看到如下的結果:

{

“meta”: {

“puid”: “hsu0j9c39a4avmeonhj2ugllh9”,

“tags”: {

},

“routing”: {

},

“requestPath”: {

“classifier”: “alexioannides/test-ml-score-seldon-api:latest”

},

“metrics”: []

},

“data”: {

“names”: [“t:0”, “t:1”],

“tensor”: {

“shape”: [2, 2],

“values”: [0。0, 0。0, 1。0, 1。0]

}

}

}

清理

要刪除使用上述步驟部署的單個 Seldon ML 模型及其名稱空間,請執行:

helm delete test-ml-seldon-app ——purge &&

kubectl delete namespace test-ml-seldon-app

按照同樣的模式移除 Seldon 核心操作器和 Ambassador:

helm delete seldon-core ——purge && kubectl delete namespace seldon-core

helm delete ambassador ——purge && kubectl delete namespace ambassador

如果有一個 GCP 叢集需要終止執行:

gcloud container clusters delete k8s-test-cluster

同樣,如果使用 Minikube:

minikube stop

minikube delete

如果在 Docker 桌面上執行,導航到 Preferences->Reset 重置叢集。

接下來做什麼

以下資源列表將幫助你深入瞭解我們在上面略過的主題:

the full set of functionality provided by Seldon;

running multi-stage containerised workflows (e。g。 for data engineering and model training) using Argo Workflows;

the excellent ‘Kubernetes in Action‘ by Marko Luka available from Manning Publications;

‘Docker in Action‘ by Jeff Nickoloff and Stephen Kuenzli also available from Manning Publications;

‘Flask Web Development’ by Miguel Grinberg O’Reilly。

via:https://alexioannides。com/2019/01/10/deploying-python-ml-models-with-flask-docker-and-kubernetes/

雷鋒網雷鋒網雷鋒網

Top