丁香五月天婷婷久久婷婷色综合91|国产传媒自偷自拍|久久影院亚洲精品|国产欧美VA天堂国产美女自慰视屏|免费黄色av网站|婷婷丁香五月激情四射|日韩AV一区二区中文字幕在线观看|亚洲欧美日本性爱|日日噜噜噜夜夜噜噜噜|中文Av日韩一区二区

您正在使用IE低版瀏覽器,為了您的雷峰網(wǎng)賬號(hào)安全和更好的產(chǎn)品體驗(yàn),強(qiáng)烈建議使用更快更安全的瀏覽器
此為臨時(shí)鏈接,僅用于文章預(yù)覽,將在時(shí)失效
人工智能開發(fā)者 正文
發(fā)私信給skura
發(fā)送

0

手把手教你用 Flask, Docker 和 Kubernetes 部署Python機(jī)器學(xué)習(xí)模型(附代碼)

本文作者: skura 2019-12-21 17:21
導(dǎo)語:本文使用了兩種不同的方法演示 ML 模型的部署

手把手教你用 Flask, Docker 和 Kubernetes 部署Python機(jī)器學(xué)習(xí)模型(附代碼)

將機(jī)器學(xué)習(xí)(ML)模型部署到生產(chǎn)環(huán)境中的一個(gè)常見模式是將這些模型作為 RESTful API 微服務(wù)公開,這些微服務(wù)從 Docker 容器中托管,例如使用 SciKit Learn 或 Keras 包訓(xùn)練的 ML 模型,這些模型可以提供對(duì)新數(shù)據(jù)的預(yù)測(cè)。然后,可以將它們部署到云環(huán)境中,以處理維護(hù)連續(xù)可用性所需的所有事情,例如容錯(cuò)、自動(dòng)縮放、負(fù)載平衡和滾動(dòng)服務(wù)更新。

持續(xù)可用的云部署的配置詳細(xì)信息對(duì)于不同的目標(biāo)云提供商來說是不一樣的——例如,Amazon Web 服務(wù)的部署過程和拓?fù)浣Y(jié)構(gòu)與微軟 Azure 不同,后者又與谷歌云平臺(tái)不同。這構(gòu)成了每個(gè)云提供商需要獲取的知識(shí)。此外,在本地測(cè)試整個(gè)部署策略是困難的(有些人會(huì)說幾乎不可能),它使得網(wǎng)絡(luò)等問題難以調(diào)試。

Kubernetes 是一個(gè)容器編排平臺(tái),旨在解決這些問題。簡而言之,它提供了一種機(jī)制,用于定義整個(gè)基于微服務(wù)的應(yīng)用程序部署拓?fù)浼捌渚S護(hù)連續(xù)可用性的服務(wù)級(jí)別要求。對(duì)于目標(biāo)云提供商來說,它可以在本地運(yùn)行,甚至可以在你的筆記本電腦上運(yùn)行,而這一切所需的只是運(yùn)行 Kubernetes 的虛擬機(jī)集群,即 Kubernetes 集群。

這篇博客適合與 GitHub 存儲(chǔ)庫中的代碼一起閱讀,其中包含 Python 模塊、Docker 配置文件和 Kubernetes 指令,用于演示如何使用 Docker 和 Kubernetes 將簡單的 Python ML 模型轉(zhuǎn)換為生產(chǎn)級(jí) RESTful 模型評(píng)分(或預(yù)測(cè))API 服務(wù)。這不是一個(gè)全面的指南,但它會(huì)幫助你快速啟動(dòng)和運(yùn)行,熟悉基本概念和模式。

我們將使用兩種不同的方法演示 ML 模型部署:使用 Docker 和 Kubernetes 的第一原則方法;然后使用 Seldon Core Kubernetes 本機(jī)框架來簡化 ML 服務(wù)的部署。前者將有助于理解后者,后者構(gòu)成一個(gè)強(qiáng)大的框架,用于部署和監(jiān)視許多復(fù)雜的 ML 模型管道的性能。

使用 Flask 和 Docker 容器化一個(gè)簡單的 ML 模型評(píng)分服務(wù)器

我們首先演示如何使用 api.py 模塊中包含的簡單 Python ML 模型評(píng)分 REST API 和 Dockerfile 來實(shí)現(xiàn)這一基本功能,這兩個(gè)文件都位于 py-flask-ml-score-api 目錄中,其核心內(nèi)容如下:

py-flask-ml-score-api/

| Dockerfile

| Pipfile

| Pipfile.lock

| api.py

在 api.py 模塊中定義 Flask Service

這是一個(gè) Python 模塊,它使用 Flask 框架定義一個(gè) web 服務(wù)(app),帶有一個(gè)函數(shù)(score),該函數(shù)在響應(yīng)對(duì)特定 URL(或「route」)的 HTTP 請(qǐng)求時(shí)執(zhí)行,這要?dú)w功于 app.route 函數(shù)的封裝。相關(guān)代碼復(fù)制如下,以供參考:

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

如果在本地運(yùn)行(例如,使用 python run api.py 啟動(dòng) web 服務(wù)),我們就可以在 http://localhost:5000/score  訪問我們的函數(shù)。此函數(shù)接受以 JSON 形式發(fā)送給它的數(shù)據(jù)(該數(shù)據(jù)已自動(dòng)反序列化為 Python dict,在函數(shù)定義中用作請(qǐng)求變量),并返回響應(yīng)(自動(dòng)序列化為 JSON)。

在我們的示例函數(shù)中,我們期望傳遞給 ML 模型一組特性 X,在我們的示例中,ML 模型將這些相同的特性返回給調(diào)用者,即我們選擇的 ML 模型是 identity 函數(shù),我們選擇它純粹是為了演示。我們可以很容易地加載一個(gè) pickled SciKit Learn 或 Keras 模型,并將數(shù)據(jù)傳遞給 approproate predict 方法,以 JSON 的形式返回特性數(shù)據(jù)的分?jǐn)?shù)。

用 Dockerfile 定義 Docker 映像

Dockerfile 本質(zhì)上是 Docker 使用的配置文件,它允許你在操作時(shí)定義 Docker 容器的內(nèi)容并配置其操作。此靜態(tài)數(shù)據(jù)在未作為容器執(zhí)行時(shí)稱為「印像」。作為參考,Dockerfile 復(fù)制如下:

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 中,我們:

  • 首先使用一個(gè)預(yù)先配置好的 Docker 印像(python:3.6-slim),它已經(jīng)安裝了 python 的 Alpine Linux 發(fā)行版;

  • 然后將 py-flask-ml-score-api 本地目錄的內(nèi)容復(fù)制到圖像上名為 /usr/src/app 的目錄中;

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

  • 然后使用 Pipenv 將 Pipfile.lock 中描述的依賴項(xiàng)安裝到映像上的虛擬環(huán)境中;

  • 將端口 5000 配置為暴露在運(yùn)行容器上的「外部世界」;

  • 啟動(dòng) Flask RESTful web 服務(wù)——api.py。注意,這里我們依賴 Flask 的內(nèi)部 WSGI 服務(wù)器,而在生產(chǎn)環(huán)境中,我們建議配置一個(gè)更魯棒的選項(xiàng)(例如 Gunicorn)。

構(gòu)建此自定義映像并要求 Docker 進(jìn)程運(yùn)行它(請(qǐng)記住,正在運(yùn)行的映像是一個(gè)「容器」),將在端口 5000 上公開我們的 RESTful ML 模型評(píng)分服務(wù),就像它在專用虛擬機(jī)上運(yùn)行一樣。有關(guān)這些核心概念的更全面的討論,請(qǐng)參閱 Docker 官方文檔。

為 ML Scoring Service 構(gòu)建 Docker 映像

我們假設(shè) Docker 在本地運(yùn)行,客戶端登錄到 DockerHub 上的一個(gè)帳戶,并且在這個(gè)項(xiàng)目的根目錄中有一個(gè)打開的終端。要構(gòu)建 Dockerfile 運(yùn)行中描述的映像:

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

其中「AlxiiNANIDs」指的是 DockerHub 帳戶的名稱,我們將在對(duì)圖像進(jìn)行測(cè)試之后上傳它。

測(cè)試

要測(cè)試印象是否可以用于創(chuàng)建一個(gè) Docker 容器,該容器的功能與我們預(yù)期的一樣,

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

我們已經(jīng)從 Docker 容器(即我們的 ML 模型評(píng)分服務(wù)器正在監(jiān)聽的端口)映射到主機(jī)(localhost)上的端口 5000:

docker ps

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

curl http://localhost:5000/score \
   --request POST \
   --header "Content-Type: application/json" \
   --data '{"X": [1, 2]}

你應(yīng)該得到的輸出是:

{"score":[1,2]}

我們的測(cè)試模型所做的只是返回輸入數(shù)據(jù),即它是 identity 函數(shù)。修改此服務(wù)以從磁盤加載 SciKit Learn 模型并將新數(shù)據(jù)傳遞給生成預(yù)測(cè)的「predict」方法只需要幾行額外的代碼。現(xiàn)在容器已經(jīng)確認(rèn)可以使用了,我們可以停止它:

docker stop test-api

將印象推送到 DockerHub 注冊(cè)表

為了讓遠(yuǎn)程 Docker 主機(jī)或 Kubernetes 群集能夠訪問我們創(chuàng)建的映像,我們需要將其發(fā)布到映像注冊(cè)表。所有能提供基于托管 Docker 服務(wù)的云計(jì)算提供商都將提供私有印象注冊(cè),但為了方便起見,我們將使用 DockerHub 的公共印象注冊(cè)。將我們的新印象推到 DockerHub(我的帳戶 ID 是「AlxiiNANIDs」)。

docker push alexioannides/test-ml-score-api

我們現(xiàn)在可以看到,我們?yōu)橛∠筮x擇的命名約定與我們的目標(biāo)圖像注冊(cè)表有內(nèi)在的聯(lián)系(需要時(shí),你需要插入自己的帳戶 ID)。上傳完成后,登錄 DockerHub,通過 DockerHub 用戶界面確認(rèn)上傳成功。

安裝 Kubernetes 供本機(jī)開發(fā)和測(cè)試

安裝單節(jié)點(diǎn) Kubernetes 集群有兩個(gè)適合本機(jī)開發(fā)和測(cè)試的選項(xiàng):通過 Docker 桌面客戶端,或者通過 Minikube。

通過 Docker 桌面安裝 Kubernetes

如果你一直在 Mac 電腦上使用 Docker,那么你很有可能是通過 Docker 桌面應(yīng)用程序來完成的。如果沒有,則可以在此處下載 Docker 桌面。Docker 桌面現(xiàn)在與 Kubernetes 捆綁在一起,可以通過進(jìn)入 Preferences->Kubernetes 并選擇 Enable Kubernetes 來激活它。Docker 桌面需要一段時(shí)間才能下載運(yùn)行 Kubernetes 所需的 Docker 印象,所以請(qǐng)耐心等待。完成后,轉(zhuǎn)到 Preferences->Advanced,確保至少為 Docker 引擎分配了 2 個(gè) CPU 和 4 個(gè) GiB,這是部署單個(gè) Seldon ML 組件所需的最低資源。

要與 Kubernetes 集群交互,你需要 kubectl 命令行界面(CLI)工具,該工具需要單獨(dú)下載。在 Mac 上執(zhí)行此操作的最簡單方法是使用 brew install kubernetes-cli。一旦安裝了 kubectl 并啟動(dòng)并運(yùn)行了 Kubernetes 集群,就可以通過運(yùn)行它來測(cè)試是否能按預(yù)期工作。

kubectl cluster-info

返回應(yīng)該如下:

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 上,啟動(dòng)和運(yùn)行 Minikube 所需的步驟如下:

  • 確保安裝了安裝包管理器

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

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

要啟動(dòng)測(cè)試群集:

minikube start --memory 409

其中,我們指定了部署單個(gè) Seldon ML 組件所需的最小內(nèi)存量。耐心點(diǎn),Minikube 可能需要一段時(shí)間才能開始,要先測(cè)試該群集是否運(yùn)行正常。

kubectl cluster-info

其中 kubectl 是用于與 Kubernetes API 交互的標(biāo)準(zhǔn)命令行界面(CLI)客戶機(jī)。

將容器化的 ML 模型評(píng)分服務(wù)部署到 Kubernetes

要在 Kubernetes 上啟動(dòng)我們的測(cè)試模型評(píng)分服務(wù),我們將首先在 Kubernetes Pod 中部署容器化服務(wù),它的推出由部署管理,而部署又會(huì)創(chuàng)建一個(gè) ReplicaSet,這是通過下面的代碼實(shí)現(xiàn)的:

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

要檢查部署運(yùn)行的狀態(tài),

kubectl rollout status deployment test-ml-score-api

為了看到運(yùn)行的 pod,

kubectl get pod

可以使用端口轉(zhuǎn)發(fā)來測(cè)試單個(gè)容器,而無需將其公開到公共網(wǎng)絡(luò)。要使用此功能,請(qǐng)打開一個(gè)單獨(dú)的終端并運(yùn)行。例如,

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

其中 body-ml-score-api-szd4j 是集群上當(dāng)前活動(dòng)的 pod 的確切名稱,由 kubectl get pods 命令確定。然后從原來的終端,對(duì)運(yùn)行在 Kubernetes 上的同一個(gè)容器重復(fù)我們的測(cè)試請(qǐng)求,

curl http://localhost:5000/score \
   --request POST \
   --header "Content-Type: application/json" \
   --data '{"X": [1, 2]}

要將容器作為(負(fù)載平衡)服務(wù)公開,我們必須創(chuàng)建引用它的 Kubernetes 服務(wù)。這是通過以下命令實(shí)現(xiàn)的:

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

如果你使用的是 Docker 桌面,那么這將自動(dòng)模擬 http://localhost:5000 上的負(fù)載平衡器。查找 Minikube 在何處公開其模擬負(fù)載平衡器運(yùn)行:

minikube service list

現(xiàn)在我們測(cè)試我們的新服務(wù)器,例如,使用 Docker 桌面:

curl http://localhost:5000/score \
   --request POST \
   --header "Content-Type: application/json" \
   --data '{"X": [1, 2]}

注意,Docker Desktop 和 Minikube 都沒有設(shè)置一個(gè)真實(shí)的負(fù)載平衡器(如果我們?cè)谠破脚_(tái)上提出這個(gè)請(qǐng)求,就會(huì)發(fā)生這種情況)。要拆下負(fù)載平衡器,請(qǐng)依次運(yùn)行以下命令:

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

在 Google 云平臺(tái)上配置多節(jié)點(diǎn)集群

該集群的資源遠(yuǎn)遠(yuǎn)大于筆記本電腦上 Kubernetes 管理器平臺(tái)。我們將在 Google 云平臺(tái)(GCP)上使用 Kubernetes 引擎。

啟動(dòng)并運(yùn)行 Google 云平臺(tái)

在使用 Google 云平臺(tái)之前,請(qǐng)注冊(cè)一個(gè)帳戶并創(chuàng)建一個(gè)專門用于此工作的項(xiàng)目。接下來,確保 GCP SDK 安裝在本地計(jì)算機(jī)上,例如:

brew cask install google-cloud-sdk

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

gcloud components install kubectl

然后我們需要初始化 SDK

gcloud init

它將打開瀏覽器并指導(dǎo)你完成必要的身份驗(yàn)證步驟,確保選擇創(chuàng)建的項(xiàng)目以及默認(rèn)區(qū)域。

初始化 Kubernetes 群集

首先,在 GCP UI 中,訪問 Kubernetes 引擎頁面以觸發(fā) Kubernetes API 啟動(dòng)。然后從命令行啟動(dòng)一個(gè)集群:

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

然后,在等待集群創(chuàng)建的同時(shí),你可以泡杯咖啡。注意,這將自動(dòng)切換 kubectl 上下文以指向 GCP 上的集群,如果運(yùn)行 kubectl config get-contexts,你將看到這一點(diǎn)。要切換回 Docker 桌面客戶端,請(qǐng)使用 kubectl config use-context docker-desktop。

在 GCP 上啟動(dòng)容器化 ML 模型評(píng)分服務(wù)器

這在很大程度上與我們?cè)诒镜剡\(yùn)行測(cè)試服務(wù)時(shí)所做的相同-依次運(yùn)行以下命令:

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 上測(cè)試我們的服務(wù)器,例如:

curl http://35.246.92.213:5000/score \
   --request POST \
   --header "Content-Type: application/json" \
   --data '{"X": [1, 2]}’

或者,我們可以再次使用端口來連接到單個(gè) pod,例如:

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

然后在一個(gè)單獨(dú)的終端上:

curl http://localhost:5000/score \
   --request POST \
   --header "Content-Type: application/json" \
   --data '{"X": [1, 2]}'

最后,我們拆除復(fù)制控制器和負(fù)載平衡器,

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

在 Kubectl 上下文之間切換

如果在本地運(yùn)行 Kubernetes 和 GCP 上運(yùn)行一個(gè)集群,那么可以將 Kubectl 上下文從一個(gè)集群切換到另一個(gè)集群,如下所示:

kubectl config use-context docker-desktop

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

kubectl config get-contexts

使用 YAML 文件定義和部署 ML 模型評(píng)分服務(wù)器

到目前為止,我們一直在使用 Kubectl 命令來定義和部署我們的 ML 模型評(píng)分服務(wù)器的基本版本。這對(duì)于演示來說是很好的,但是很快就受限,且無法控制。實(shí)際上,定義整個(gè) Kubernetes 部署的標(biāo)準(zhǔn)方法是使用發(fā)布到 Kubernetes API 的 YAML 文件。py-flask-ml-score-api 目錄中的 py-flask-ml-score.yaml 文件是一個(gè)示例,它說明了如何在單個(gè) yaml 文件中定義我們的 ML 模型評(píng)分服務(wù)器?,F(xiàn)在可以使用一個(gè)命令部署它:

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

注意,我們?cè)谶@個(gè)文件中定義了三個(gè)單獨(dú)的 Kubernetes 組件:一個(gè)名稱空間、一個(gè)部署和一個(gè)負(fù)載平衡服務(wù)器,對(duì)于所有這些組件(及其子組件),使用 --- 來限定每個(gè)單獨(dú)組件的定義。要查看部署到此命名空間中的所有組件的使用方法:

kubectl get all --namespace test-ml-app

同樣,當(dāng)使用任何 kubectl get 命令檢查測(cè)試應(yīng)用程序的不同組件時(shí),設(shè)置 --namespace 標(biāo)志。或者,我們可以將新的名稱空間設(shè)置為默認(rèn)上下文:

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

然后運(yùn)行:

kubectl get all

在這里,我們可以使用

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

拆掉我們可以使用的應(yīng)用程序,

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

這樣我們就不必使用多個(gè)命令單獨(dú)刪除每個(gè)組件。請(qǐng)參閱 Kubernetes API 的官方文檔,以更深入地了解此 YAML 文件的內(nèi)容。

使用 Helm 圖表定義和部署 ML 模型評(píng)分服務(wù)器

為 Kubernetes 編寫 YAML 文件可能是重復(fù)性的工作,且難以管理,特別是如果涉及到大量的「復(fù)制粘貼」,那么從一個(gè)部署到下一個(gè)部署只需要更改少數(shù)參數(shù),但有一堵「YAML 墻」需要修改。輸入 Helm——一個(gè)用于創(chuàng)建、執(zhí)行和管理 Kubernetes 部署模板的框架。下面是一個(gè)非常棒的演示,它是關(guān)于如何使用 Helm 來部署我們的 ML 模型評(píng)分服務(wù)器。要全面討論 Helm 的全部功能,請(qǐng)參考官方文檔。Seldon Core 也可以使用 Helm 部署,稍后我們將更詳細(xì)地介紹這一點(diǎn)。

安裝 Helm

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

brew install kubernetes-helm

Helm 依賴于一個(gè)專用的部署服務(wù)器,稱為「Tiller」,它運(yùn)行在我們希望部署應(yīng)用程序的 Kubernetes 集群中。在部署 Tiller 之前,我們需要?jiǎng)?chuàng)建一個(gè)在集群范圍內(nèi)的超級(jí)用戶角色來分配給它,以便它可以在任何命名空間中創(chuàng)建和修改 Kubernetes 資源。為了實(shí)現(xiàn)這一點(diǎn),我們首先創(chuàng)建一個(gè)服務(wù)帳戶,通過此方法,pod 在與服務(wù)帳戶關(guān)聯(lián)時(shí),可以向 Kubernetes API 進(jìn)行驗(yàn)證,以便能夠查看、創(chuàng)建和修改資源。我們?cè)?kube 系統(tǒng)名稱空間中創(chuàng)建它,如下所示,

kubectl --namespace kube-system create serviceaccount tiller

然后在此服務(wù)帳戶和群集角色之間創(chuàng)建綁定,顧名思義,該綁定會(huì)授予群集范圍內(nèi)的管理權(quán)限:

kubectl create clusterrolebinding tiller \
    --clusterrole cluster-admin \
    --serviceaccount=kube-system:tiller

我們現(xiàn)在可以將 Helm Tiller 部署到 Kubernetes 集群,并使用所需的訪問權(quán)限,

helm init --service-account tiller

使用 Helm 進(jìn)行部署

要?jiǎng)?chuàng)建新的 Helm 布署定義,

helm create NAME-OF-YOUR-HELM-CHART

這將創(chuàng)建一個(gè)新的目錄,例如 helm-ml-score-app,它包含在這個(gè)存儲(chǔ)庫中,具有以下高級(jí)目錄結(jié)構(gòu),

helm-ml-score-app/
 | -- charts/
 | -- templates/
 | Chart.yaml
 | values.yaml

簡而言之,charts 目錄包含我們的新表所依賴的其他表(我們不會(huì)使用這個(gè)),templates 目錄包含我們的 Helm 模板,Chart.yaml 包含圖表的核心信息(例如名稱和版本信息),values.yaml 包含用于呈現(xiàn)模板的默認(rèn)值的信息(如果沒有從命令行設(shè)置值)。

下一步是刪除模板目錄中的所有文件(NOTES.txt 除外),并用我們自己的文件替換它們。我們從 namespace.yaml 開始為應(yīng)用程序聲明命名空間,

apiVersion: v1
kind: Namespace
metadata:
  name: {{ .Values.app.namespace }}

在此特定實(shí)例中 .Values.app.namespace 插入 app.namespace 變量,其默認(rèn)值在 Values.yaml 中定義。接下來,我們?cè)?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 中的負(fù)載平衡器服務(wù)的詳細(xì)信息,

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 }}

實(shí)際上,我們所做的是將部署細(xì)節(jié)的每個(gè)組件從 py-flask-ml-score.yaml 拆分到自己的文件中,然后為配置的每個(gè)參數(shù)定義模板變量。要測(cè)試和檢查呈現(xiàn)的模板,請(qǐng)運(yùn)行:

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

如果您對(duì)「dry run」的結(jié)果感到滿意,則執(zhí)行部署并使用:

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

這將自動(dòng)打印發(fā)布的狀態(tài),以及 Helm 賦予它的名稱和呈現(xiàn)給終端的 NOTES.txt 的內(nèi)容。列出所有可用的 Helm 版本及其名稱:

helm list

以及其所有組成組件(如 pod、復(fù)制控制器、服務(wù)器等)的狀態(tài),例如:

helm status test-ml-app

ML 評(píng)分服務(wù)器現(xiàn)在可以用與上面完全相同的方式進(jìn)行測(cè)試。一旦你確信它按預(yù)期工作,就可以使用了:

helm delete test-ml-app

使用 Seldon 將 ML 模型評(píng)分服務(wù)器部署到 Kubernetes

Seldon 的核心任務(wù)是簡化 Kubernetes 上復(fù)雜 ML 預(yù)測(cè)管道的重復(fù)部署和管理。在本演示中,我們將重點(diǎn)介紹最簡單的示例,即我們已經(jīng)使用的簡單的 ML 模型評(píng)分 API。

為 Seldon 構(gòu)建 ML 組件

要使用 Seldon 部署 ML 組件,我們需要?jiǎng)?chuàng)建 Seldon 兼容的 Docker 映像。我們首先遵循相關(guān)指導(dǎo)原則來定義一個(gè) Python 類,該類封裝了一個(gè)用于 Seldon 部署的 ML 模型。它包含在 seldon-ml-score-component 目錄中,其內(nèi)容類似于 py-flask-ml-score-api 中的內(nèi)容:

seldon-ml-score-component/
 | Dockerfile
 | MLScore.py
 | Pipfile
 | Pipfile.lock

構(gòu)建 Docker 印像以用于 Seldon

Seldon 要求 ML 評(píng)分服務(wù)器的 Docker 映像以特定的方式構(gòu)造:

  • ML 模型必須封裝在一個(gè) Python 類中,其中包含一個(gè)帶有特定簽名(或接口)的 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 入口點(diǎn)運(yùn)行 Seldon 服務(wù),它和上面的點(diǎn)都可以看到 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

有關(guān)詳細(xì)信息,請(qǐng)參閱 Seldon 官方文件。接下來,建立這個(gè)印象:

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

在將此印像推送到注冊(cè)表之前,我們需要確保它按預(yù)期工作。在本地 Docker 守護(hù)進(jìn)程上啟動(dòng)映像:

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

然后向它發(fā)送一個(gè)請(qǐng)求:

curl -g http://localhost:5000/predict \
    --data-urlencode 'json={"data":{"names":["a","b"],"tensor":{"shape":[2,2],"values":[0,0,1,1]}}}'

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

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

使用 Seldon Core 部署 ML 組件

我們現(xiàn)在繼續(xù)將 Seldon 兼容的 ML 組件部署到 Kubernetes 集群,并從中創(chuàng)建一個(gè)容錯(cuò)和可縮放的服務(wù)器。為了實(shí)現(xiàn)這一目標(biāo),我們將使用 Helm 表部署 Seldon Core。我們首先創(chuàng)建一個(gè)包含 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

接下來,我們?yōu)?Kubernetes 部署 Ambassador API 網(wǎng)關(guān),它將充當(dāng) Kubernetes 集群的入口點(diǎn)。我們將為 Ambassador 部署創(chuàng)建一個(gè)專用名稱空間:

kubectl create namespace ambassador

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

helm install stable/ambassador \
  --name ambassador \
  --set crds.keep=false \
  --namespace ambassador

如果我們現(xiàn)在運(yùn)行 helm list --namespace seldon-core,我們應(yīng)該看到 seldon core 已經(jīng)部署好了,并且正在等待 seldon ML 組件的部署。為了部署我們的 Seldon ML 模型評(píng)分服務(wù)器,我們?yōu)樗鼊?chuàng)建了一個(gè)單獨(dú)的名稱空間:

kubectl create namespace test-ml-seldon-app

然后配置并部署另一個(gè)官方 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

注意,通過重復(fù)最后兩個(gè)步驟,現(xiàn)在可以使用 Seldon 部署多個(gè) ML 模型,它們都將通過同一個(gè) Ambassador API 網(wǎng)關(guān)自動(dòng)訪問,我們現(xiàn)在將使用該網(wǎng)關(guān)測(cè)試 Seldon ML 模型評(píng)分服務(wù)器。

通過 Ambassador 網(wǎng)關(guān) API 測(cè)試 API

為了測(cè)試基于 Seldon 的 ML 模型評(píng)分服務(wù)器,我們遵循與上面 Kubernetes 部署相同的方法,但是我們將通過 Ambassador API 網(wǎng)關(guān)路由我們的請(qǐng)求。要查找 Ambassador 服務(wù)運(yùn)行的 IP 地址:

kubectl -n ambassador get service ambassador

如果使用 Docker 桌面,則為 localhost:80;如果在 GCP 或 Minikube 上運(yùn)行,則為 IP 地址(如果在后一種情況下需要記住使用 minikuke 服務(wù)列表)?,F(xiàn)在測(cè)試預(yù)測(cè)的終結(jié)點(diǎn),例如:

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]}}}'

如果你想了解路由背后的完整邏輯,請(qǐng)參閱 Seldon 文檔,但 URL 實(shí)際上使用的是:

http://<ambassadorEndpoint>/seldon/<namespace>/<deploymentName>/api/v0.1/predictions

如果你的請(qǐng)求成功了,那么你應(yīng)該會(huì)看到如下的結(jié)果:

{
  "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]
    }
  }
}

清理

要?jiǎng)h除使用上述步驟部署的單個(gè) Seldon ML 模型及其命名空間,請(qǐng)運(yùn)行:

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

如果有一個(gè) GCP 集群需要終止運(yùn)行:

gcloud container clusters delete k8s-test-cluster

同樣,如果使用 Minikube:

minikube stop
minikube delete

如果在 Docker 桌面上運(yùn)行,導(dǎo)航到 Preferences->Reset 重置集群。

接下來做什么

以下資源列表將幫助你深入了解我們?cè)谏厦媛赃^的主題:

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

雷鋒網(wǎng)雷鋒網(wǎng)雷鋒網(wǎng)

雷峰網(wǎng)版權(quán)文章,未經(jīng)授權(quán)禁止轉(zhuǎn)載。詳情見轉(zhuǎn)載須知。

手把手教你用 Flask, Docker 和 Kubernetes 部署Python機(jī)器學(xué)習(xí)模型(附代碼)

分享:
相關(guān)文章
當(dāng)月熱門文章
最新文章
請(qǐng)?zhí)顚懮暾?qǐng)人資料
姓名
電話
郵箱
微信號(hào)
作品鏈接
個(gè)人簡介
為了您的賬戶安全,請(qǐng)驗(yàn)證郵箱
您的郵箱還未驗(yàn)證,完成可獲20積分喲!
請(qǐng)驗(yàn)證您的郵箱
立即驗(yàn)證
完善賬號(hào)信息
您的賬號(hào)已經(jīng)綁定,現(xiàn)在您可以設(shè)置密碼以方便用郵箱登錄
立即設(shè)置 以后再說