手把手教你用 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 服務),我們就可以在
https://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 https://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 https://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 桌面,那么這將自動模擬
https://localhost:5000
上的負載平衡器。查找 Minikube 在何處公開其模擬負載平衡器運行:
minikube service list
現在我們測試我們的新服務器,例如,使用 Docker 桌面:
curl https://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 https://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 https://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://<ambassadorEndpoint>/seldon/<namespace>/<deploymentName>/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 Luk?a 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/
雷鋒網雷鋒網
(公眾號:雷鋒網)
雷鋒網
雷鋒網版權文章,未經授權禁止轉載。詳情見。