在 Kubernetes 上部署一個深度學習模型
隨著企業增加了對人工智慧(AI)、機器學習(ML)與深度學習(DL)的使用,出現了一個關鍵問題:如何將機器學習的開發進行規模化與產業化?這些討論經常聚焦於機器學習模型本身;然而,模型僅僅只是完整解決方案的其中一環。為了達到生產環境的應用和規模,模型的開發過程必須還包括一個可以說明開發前後關鍵活動以及可公用部署的可重複過程。
本文演示了如何使用 Kubermatic Kubernetes 平台 對圖像識別預測的深度學習模型進行部署、擴展與管理。
Kubermatic Kubernetes 平台是一個生產級的開源 Kubernetes 集群管理工具,提供靈活性和自動化,與機器學習/深度學習工作流程整合,具有完整的集群生命周期管理。
開始
這個例子部署了一個用於圖像識別的深度學習模型。它使用了 CIFAR-10 數據集,包含了 60,000 張分屬 10 個類別的 32x32 彩色圖,同時使用了 Apache MXNet 的 Gluon 與 NVIDIA GPU 進行加速計算。如果你希望使用 CIFAR-10 數據集的預訓練模型,可以查閱其 入門指南。
使用訓練集中的樣本對模型訓練 200 次,只要訓練誤差保持緩慢減少,就可以保證模型不會過擬合。下方圖展示了訓練的過程:
![深度學習模型訓練 loss 圖](/data/attachment/album/202109/01/233430j0jnjf92hfnr2iss.png "Deep learning model training plot")
訓練結束後,必須保存模型訓練所得到的參數,以便稍後可以載入它們:
file_name = "net.params"
net.save_parameters(file_name)
一旦你的模型訓練好了,就可以用 Flask 伺服器來封裝它。下方的程序演示了如何接收請求中的一張圖片作為參數,並在響應中返回模型的預測結果:
from gluoncv.model_zoo import get_model
import matplotlib.pyplot as plt
from mxnet import gluon, nd, image
from mxnet.gluon.data.vision import transforms
from gluoncv import utils
from PIL import Image
import io
import flask
app = flask.Flask(__name__)
@app.route("/predict",methods=["POST"])
def predict():
if flask.request.method == "POST":
if flask.request.files.get("img"):
img = Image.open(io.BytesIO(flask.request.files["img"].read()))
transform_fn = transforms.Compose([
transforms.Resize(32),
transforms.CenterCrop(32),
transforms.ToTensor(),
transforms.Normalize([0.4914, 0.4822, 0.4465], [0.2023, 0.1994, 0.2010])])
img = transform_fn(nd.array(img))
net = get_model('cifar_resnet20_v1', classes=10)
net.load_parameters('net.params')
pred = net(img.expand_dims(axis=0))
class_names = ['airplane', 'automobile', 'bird', 'cat', 'deer',
'dog', 'frog', 'horse', 'ship', 'truck']
ind = nd.argmax(pred, axis=1).astype('int')
prediction = 'The input picture is classified as [%s], with probability %.3f.'%
(class_names[ind.asscalar()], nd.softmax(pred)[0][ind].asscalar())
return prediction
if __name__ == '__main__':
app.run(host='0.0.0.0')
容器化模型
在將模型部署到 Kubernetes 前,你需要先安裝 Docker 並使用你的模型創建一個鏡像。
- 下載、安裝並啟動 Docker:
sudo yum install -y yum-utils device-mapper-persistent-data lvm2
sudo yum-config-manager --add-repo <https://download.docker.com/linux/centos/docker-ce.repo>
sudo yum install docker-ce
sudo systemctl start docker
- 創建一個你用來管理代碼與依賴的文件夾:
mkdir kubermatic-dl
cd kubermatic-dl
- 創建
requirements.txt
文件管理代碼運行時需要的所有依賴:
flask
gluoncv
matplotlib
mxnet
requests
Pillow
- 創建
Dockerfile
,Docker 將根據這個文件創建鏡像:
FROM python:3.6
WORKDIR /app
COPY requirements.txt /app
RUN pip install -r ./requirements.txt
COPY app.py /app
CMD ["python", "app.py"]
這個 Dockerfile
主要可以分為三個部分。首先,Docker 會下載 Python 的基礎鏡像。然後,Docker 會使用 Python 的包管理工具 pip
安裝 requirements.txt
記錄的包。最後,Docker 會通過執行 python app.py
來運行你的腳本。
- 構建 Docker 容器:
sudo docker build -t kubermatic-dl:latest .
這條命令使用 kubermatic-dl
鏡像為你當前工作目錄的代碼創建了一個容器。
- 使用
sudo docker run -d -p 5000:5000 kubermatic-dl
命令檢查你的容器可以在你的主機上正常運行。
- 使用
sudo docker ps -a
命令查看你本地容器的運行狀態:
![查看容器的運行狀態](/data/attachment/album/202109/01/233430nszyaz0pklym7jay.png "Checking the container's status")
將你的模型上傳到 Docker Hub
在向 Kubernetes 上部署模型前,你的鏡像首先需要是公開可用的。你可以通過將你的模型上傳到 Docker Hub 來將它公開。(如果你沒有 Docker Hub 的賬號,你需要先創建一個)
- 在終端中登錄 Docker Hub 賬號:
sudo docker login
- 給你的鏡像打上標籤,這樣你的模型上傳到 Docker Hub 後也能擁有版本信息:
sudo docker tag <your-image-id> <your-docker-hub-name>/<your-app-name>
sudo docker push <your-docker-hub-name>/<your-app-name>
![給鏡像打上 tag](/data/attachment/album/202109/01/233430h5uahx4vevfhxxjf.png "Tagging the image")
- 使用
sudo docker images
命令檢查你的鏡像的 ID。
部署你的模型到 Kubernetes 集群
- 首先在 Kubermatic Kubernetes 平台創建一個項目, 然後根據 快速開始 創建一個 Kubernetes 集群。
![創建一個 Kubernetes 集群](/data/attachment/album/202109/01/233431qsg5vryf74zppyp7.png "Create a Kubernetes cluster")
- 下載用於訪問你的集群的
kubeconfig
,將它放置在下載目錄中,並記得設置合適的環境變數,使得你的環境能找到它:
![Kubernetes 集群示例](/data/attachment/album/202109/01/233431wyjdooviaf75135f.png "Kubernetes cluster example")
- 使用
kubectl
命令檢查集群信息,例如,需要檢查kube-system
是否在你的集群正常啟動了就可以使用命令kubectl cluster-info
![查看集群信息](/data/attachment/album/202109/01/233431u78i7ir88x485at4.png "Checking the cluster info")
- 為了在集群中運行容器,你需要創建一個部署用的配置文件(
deployment.yaml
),再運行apply
命令將其應用於集群中:
apiVersion: apps/v1
kind: Deployment
metadata:
name: kubermatic-dl-deployment
spec:
selector:
matchLabels:
app: kubermatic-dl
replicas: 3
template:
metadata:
labels:
app: kubermatic-dl
spec:
containers:
- name: kubermatic-dl
image: kubermatic00/kubermatic-dl:latest
imagePullPolicy: Always
ports:
- containerPort: 8080
kubectl apply -f deployment.yaml`
- 為了將你的部署開放到公網環境,你需要一個能夠給你的容器創建外部可達 IP 地址的服務:
kubectl expose deployment kubermatic-dl-deployment --type=LoadBalancer --port 80 --target-port 5000`
- 就快大功告成了!首先檢查你布署的服務的狀態,然後通過 IP 請求的你圖像識別 API:
kubectl get service
![獲取請求圖像識別 API 的 IP 地址](/data/attachment/album/202109/01/233431e2v0f0n0v8ffwmnv.png "Get the IP address to call your image recognition API")
- 最後根據你的外部 IP 使用以下兩張圖片對你的圖像識別服務進行測試:
![馬](/data/attachment/album/202109/01/233432r9655dyqhq666gzf.jpg "Horse")
![狗](/data/attachment/album/202109/01/233432x63iiam0fy2li665.jpg "Dog")
![測試 API](/data/attachment/album/202109/01/233432eiiihhililliri3i.png "Testing the API")
總結
在這篇教程中,你可以創建一個深度學習模型,並且使用 Flask 提供 REST API 服務。它介紹了如何將應用放在 Docker 容器中,如何將這個鏡像上傳到 Docker Hub 中,以及如何使用 Kubernetes 部署你的服務。只需幾個簡單的命令,你就可以使用 Kubermatic Kubernetes 平台部署該應用程序,並且開放服務給別人使用。
via: https://opensource.com/article/20/9/deep-learning-model-kubernetes
作者:Chaimaa Zyani 選題:lujun9972 譯者:chunibyo-wly 校對:wxy
本文轉載來自 Linux 中國: https://github.com/Linux-CN/archive