99精品伊人亚洲|最近国产中文炮友|九草在线视频支援|AV网站大全最新|美女黄片免费观看|国产精品资源视频|精彩无码视频一区|91大神在线后入|伊人终合在线播放|久草综合久久中文

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

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

倩倩 ? 來源:雷鋒網(wǎng) ? 2020-04-15 16:56 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

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

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

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

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

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

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

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

py-flask-ml-score-api/

| Dockerfile

| Pipfile

| Pipfile.lock

| api.py

在 api.py 模塊中定義 Flask Service

這是一個 Python 模塊,它使用 Flask 框架定義一個 web 服務(wù)(app),帶有一個函數(shù)(score),該函數(shù)在響應(yīng)對特定 URL(或「route」)的 HTTP 請求時執(zhí)行,這要歸功于 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

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

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

用 Dockerfile 定義 Docker 映像

Dockerfile 本質(zhì)上是 Docker 使用的配置文件,它允許你在操作時定義 Docker 容器的內(nèi)容并配置其操作。此靜態(tài)數(shù)據(jù)在未作為容器執(zhí)行時稱為「image」。作為參考,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 中,我們:

首先使用一個預(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 中描述的依賴項安裝到映像上的虛擬環(huán)境中;

端口 5000 配置為暴露在運行容器上的「外部世界」;

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

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

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

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

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

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

測試

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

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

我們已經(jīng)從 Docker 容器(即我們的 ML 模型評分服務(wù)器正在監(jiān)聽的端口)映射到主機(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]}

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

docker stop test-api

將印象推送到 DockerHub 注冊表

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

docker push alexioannides/test-ml-score-api

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

安裝 Kubernetes 供本機開發(fā)和測試

安裝單節(jié)點 Kubernetes 集群有兩個適合本機開發(fā)和測試的選項:通過 Docker 桌面客戶端,或者通過 Minikube。

通過 Docker 桌面安裝 Kubernetes

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

要與 Kubernetes 集群交互,你需要 kubectl 命令行界面(CLI)工具,該工具需要單獨下載。在 Mac 上執(zhí)行此操作的最簡單方法是使用 brew install kubernetes-cli。一旦安裝了 kubectl 并啟動并運行了 Kubernetes 集群,就可以通過運行它來測試是否能按預(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 上,啟動和運行 Minikube 所需的步驟如下:

確保安裝了安裝包管理器

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

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

要啟動測試群集:

minikube start --memory 409

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

kubectl cluster-info

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

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

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

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

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

kubectl rollout status deployment test-ml-score-api

為了看到運行的 pod,

kubectl get pod

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

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

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

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

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

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

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

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

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

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

在 Google 云平臺上配置多節(jié)點集群

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

啟動并運行 Google 云平臺

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

brew cask install google-cloud-sdk

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

gcloud components install kubectl

然后我們需要初始化 SDK

gcloud init

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

初始化 Kubernetes 群集

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

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

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

在 GCP 上啟動容器化 ML 模型評分服務(wù)器

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

kubectl create deployment test-ml-score-api --image=alexioannides/test-ml-score-api:latestkubectl expose deployment test-ml-score-api --port 5000 --type=LoadBalancer --name test-ml-score-api-lb

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

kubectl get services

然后我們可以在 GCP 上測試我們的服務(wù)器,例如:

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

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

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

在 Kubectl 上下文之間切換

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

kubectl config use-context docker-desktop

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

kubectl config get-contexts

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

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

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

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

kubectl get all --namespace test-ml-app

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

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

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

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

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

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

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

安裝 Helm

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

brew install kubernetes-helm

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

kubectl --namespace kube-system create serviceaccount tiller

然后在此服務(wù)帳戶和群集角色之間創(chuàng)建綁定,顧名思義,該綁定會授予群集范圍內(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 進行部署

要創(chuàng)建新的 Helm 布署定義,

helm create NAME-OF-YOUR-HELM-CHART

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

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

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

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

apiVersion: v1kind: Namespacemetadata:name: {{ .Values.app.namespace }}

在此特定實例中 .Values.app.namespace 插入 app.namespace 變量,其默認(rèn)值在 Values.yaml 中定義。接下來,我們在 deployment.yaml 中定義 pods 的部署:

apiVersion: apps/v1kind: Deploymentmetadata: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 中的負載平衡器服務(wù)的詳細信息,

apiVersion: v1kind: Servicemetadata:name: {{ .Values.app.name }}-lblabels: app: {{ .Values.app.name }} namespace: {{ .Values.app.namespace }}spec: type: LoadBalancer ports: - port: {{ .Values.containerPort }} targetPort: {{ .Values.targetPort }} selector:app: {{ .Values.app.name }}

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

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

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

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

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

helm list

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

helm status test-ml-app

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

helm delete test-ml-app

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

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

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

要使用 Seldon 部署 ML 組件,我們需要創(chuàng)建 Seldon 兼容的 Docker 映像。我們首先遵循相關(guān)指導(dǎo)原則來定義一個 Python 類,該類封裝了一個用于 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 評分服務(wù)器的 Docker 映像以特定的方式構(gòu)造:

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 parametersdefined 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 服務(wù),它和上面的點都可以看到 DockerFile

FROM python:3.6-slimCOPY 。 /appWORKDIR /appRUN pip install pipenvRUN pipenv installEXPOSE 5000# Define environment variableENV MODEL_NAME MLScoreENV API_TYPE RESTENV SERVICE_TYPE MODELENV PERSISTENCE 0CMD pipenv run seldon-core-microservice $MODEL_NAME $API_TYPE --service-type $SERVICE_TYPE --persistence $PERSISTENCE

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

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

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

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

然后向它發(fā)送一個請求:

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ù)期一致(即它包含與請求相同的負載),則推送印象:

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

使用 Seldon Core 部署 ML 組件

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

kubectl create namespace ambassador

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

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

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

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

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

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

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

kubectl -n ambassador get service ambassador

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

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

如果你的請求成功了,那么你應(yīng)該會看到如下的結(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] } }}

清理

要刪除使用上述步驟部署的單個 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-corehelm delete ambassador --purge && kubectl delete namespace ambassador

如果有一個 GCP 集群需要終止運行:

gcloud container clusters delete k8s-test-cluster

同樣,如果使用 Minikube:

minikube stopminikube delete

如果在 Docker 桌面上運行,導(dǎo)航到 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/

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報投訴
  • 應(yīng)用程序
    +關(guān)注

    關(guān)注

    38

    文章

    3337

    瀏覽量

    59049
  • ML
    ML
    +關(guān)注

    關(guān)注

    0

    文章

    151

    瀏覽量

    35086
  • python
    +關(guān)注

    關(guān)注

    56

    文章

    4827

    瀏覽量

    86826
收藏 人收藏
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

    評論

    相關(guān)推薦
    熱點推薦

    如何使用Docker部署大模型

    隨著深度學(xué)習(xí)和大模型的快速發(fā)展,如何高效地部署這些模型成為了重要的挑戰(zhàn)。Docker 作為
    的頭像 發(fā)表于 05-24 16:39 ?360次閱讀

    Flexus 云服務(wù)器 X 實例部署 Docker 管理儀表板 DweebUI

    引言 在當(dāng)今的數(shù)字業(yè)務(wù)環(huán)境中,華為云以其卓越的技術(shù)實力脫穎而出。華為云 Flexus 云服務(wù)器 X 實例,作為新代云服務(wù)器專為中小企業(yè)和開發(fā)者精心打造,具備柔性算力且能智能感知業(yè)務(wù)
    的頭像 發(fā)表于 01-14 09:27 ?876次閱讀
    Flexus 云<b class='flag-5'>服務(wù)器</b> X 實例部署 <b class='flag-5'>Docker</b> 管理儀表板 DweebUI

    Flexus 云服務(wù)器 X 實例安裝 Docker 管理工具 Portainer

    。在此強大平臺上部署如 Portainer CE 這樣的容器管理工具,不僅能夠極大地簡化 Docker 環(huán)境的管理流程,還能進步提升運維效率與自動水平,讓用戶的云端體驗更加流暢自如
    的頭像 發(fā)表于 01-13 18:46 ?816次閱讀
    Flexus 云<b class='flag-5'>服務(wù)器</b> X 實例安裝 <b class='flag-5'>Docker</b> 管理工具 Portainer

    服務(wù)器 Flexus X 實例,Docker 集成搭建搭建 Flink

    夠同時處理實時數(shù)據(jù)流和靜態(tài)數(shù)據(jù)集,使得數(shù)據(jù)處理更加靈活高效 華為云端口放行 ??服務(wù)器放行對應(yīng)端口 8082 Docker 安裝并配置鏡像加速 1、購買華為云 Flexus X 實例 Flexus云
    的頭像 發(fā)表于 01-13 18:17 ?429次閱讀
    云<b class='flag-5'>服務(wù)器</b> Flexus X 實例,<b class='flag-5'>Docker</b> 集成搭建搭建 Flink

    服務(wù)器 Flexus X 實例,Docker 集成搭建 YesPlayMusic 網(wǎng)易云音樂播放

    YesPlayMusic 是款基于 Electron 的開源網(wǎng)易云音樂桌面播放,以簡潔的界面和豐富的功能受到了許多用戶的喜愛,特別是對于希望在桌面上享受網(wǎng)易云音樂服務(wù)的用戶 Docker
    的頭像 發(fā)表于 01-13 18:17 ?634次閱讀
    云<b class='flag-5'>服務(wù)器</b> Flexus X 實例,<b class='flag-5'>Docker</b> 集成搭建 YesPlayMusic 網(wǎng)易云音樂播放<b class='flag-5'>器</b>

    服務(wù)器 Flexus X 實例,Docker 集成搭建 MinIO

    架構(gòu)來存儲和管理大規(guī)模的非結(jié)構(gòu)數(shù)據(jù),如圖片、視頻、日志文件等,提供高可用性、可擴展性和數(shù)據(jù)持久性 華為云端口放行 ??服務(wù)器放行對應(yīng)端口 9000,9001 Docker 安裝并配置鏡像加速 1
    的頭像 發(fā)表于 01-13 18:16 ?395次閱讀
    云<b class='flag-5'>服務(wù)器</b> Flexus X 實例,<b class='flag-5'>Docker</b> 集成搭建 MinIO

    服務(wù)器 Flexus X 實例,Docker 集成搭建 Grafana 開源數(shù)據(jù)可視平臺

    的用戶界面,用戶可以輕松創(chuàng)建和自定義動態(tài)儀表板,以實時展示關(guān)鍵指標(biāo)和數(shù)據(jù)趨勢 華為云端口放行 ??服務(wù)器放行對應(yīng)端口 9955 Docker 安裝并配置鏡像加速 1、購買華為云 Flexus X 實例
    的頭像 發(fā)表于 01-13 15:50 ?478次閱讀
    云<b class='flag-5'>服務(wù)器</b> Flexus X 實例,<b class='flag-5'>Docker</b> 集成搭建 Grafana 開源數(shù)據(jù)可視<b class='flag-5'>化</b>平臺

    服務(wù)器 Flexus X 實例,Docker 集成搭建 NGINX

    Docker 集成搭建 NGINX 1、購買華為云 Flexus X 實例 Flexus云服務(wù)器X實例-華為云 (huaweicloud.com) ? 2、docker 安裝 yum?install
    的頭像 發(fā)表于 01-13 11:09 ?953次閱讀
    云<b class='flag-5'>服務(wù)器</b> Flexus X 實例,<b class='flag-5'>Docker</b> 集成搭建 NGINX

    基于 Docker 與 Jenkins 實現(xiàn)自動部署

    前言 重塑自動部署新高度,Docker 攜手 Jenkins,在華為云 Flexus X 云服務(wù)器的加持下,引領(lǐng)持續(xù)集成與部署的新紀(jì)元。Flexus X 以其卓越的性能、靈活的資源配置和高效的成本
    的頭像 發(fā)表于 01-07 17:25 ?530次閱讀
    基于 <b class='flag-5'>Docker</b> 與 Jenkins 實現(xiàn)自動<b class='flag-5'>化</b>部署

    在華為云 FlexusX 實例上實現(xiàn) Docker 容器的實時監(jiān)控與可視化分析

    : 華為云Flexus云服務(wù)器X實例 ? 原生命令 查看正在運行的容器 [root@flexusx-251f?~]# docker psCONTAINER?
    的頭像 發(fā)表于 01-02 13:42 ?424次閱讀
    在華為云 FlexusX 實例上實現(xiàn) <b class='flag-5'>Docker</b> <b class='flag-5'>容器</b>的實時監(jiān)控與可視化分析

    服務(wù)器容器的區(qū)別和聯(lián)系

    服務(wù)器采用虛擬機方式,每個虛擬機擁有獨立操作系統(tǒng)和資源,適用于高性能、高穩(wěn)定性應(yīng)用如數(shù)據(jù)庫和企業(yè)資源規(guī)劃系統(tǒng)。容器技術(shù)則在宿主操作系統(tǒng)上創(chuàng)建多個獨立容器,共享操作系統(tǒng)和資源,適合無狀態(tài)、彈性
    的頭像 發(fā)表于 12-02 11:41 ?410次閱讀

    Kubernetes集群搭建容器云需要幾臺服務(wù)器?

    Kubernetes集群搭建容器云需要幾臺服務(wù)器?至少需要4臺服務(wù)器。搭建容器云所需的服務(wù)器數(shù)量以及具體的搭建步驟,會根據(jù)所選用的技術(shù)棧、業(yè)
    的頭像 發(fā)表于 10-21 10:06 ?448次閱讀

    容器云跟服務(wù)器有啥區(qū)別?五區(qū)別要知道

    容器云和服務(wù)器分別代表了不同的計算資源管理和部署方式,兩者在多個方面存在顯著差異,這些差異主要體現(xiàn)在定義、服務(wù)器、虛擬方式、資源管理、操作自由度、應(yīng)用場景等方面。以下是對兩者區(qū)別的詳
    的頭像 發(fā)表于 09-18 14:03 ?472次閱讀

    常見的服務(wù)器容器和漏洞類型匯總

    常見的服務(wù)器容器包括KubeSphere、Tomcat、Nginx、Apache等,它們在提供便捷的服務(wù)部署和靈活的網(wǎng)絡(luò)功能的同時,也可能存在著定的安全風(fēng)險。這些
    的頭像 發(fā)表于 08-29 10:39 ?542次閱讀

    ARM平臺實現(xiàn)Docker容器技術(shù)

    及依賴包到可移植的鏡像中,然后發(fā)布到任何流行的Linux或Windows機器上,亦可實現(xiàn)虛擬容器是完全使用沙箱機制,相互之間不會有任何接口。使用
    發(fā)表于 07-25 14:36