在機器學習專案中,模型佈署流程的自動化至關重要。本文將詳細介紹如何結合 Docker 與 Jenkins,建構一個自動化的機器學習模型佈署Pipeline,並整合 Kubernetes 進行容器協調和管理,最終實作高效的模型佈署與更新。此方案能有效減少人工介入,提升佈署效率,同時確保佈署流程的一致性和可靠性。

#!/usr/bin/python3

import platform
import sys
import os
import json
import numpy as np
from sklearn.discriminant_analysis import LinearDiscriminantAnalysis
from sklearn.neural_network import MLPClassifier
import pandas as pd
from joblib import dump, load
from sklearn import preprocessing
import paramiko

def inference():
    #... other code ...

    # 載入模型
    model_dir = os.environ["MODEL_DIR"]
    model_file_lda = os.environ["MODEL_FILE_LDA"]
    model_file_nn = os.environ["MODEL_FILE_NN"]
    model_path_lda = os.path.join(model_dir, model_file_lda)
    model_path_nn = os.path.join(model_dir, model_file_nn)

    # ... other code ...

使用Docker和Jenkins實作機器學習模型的自動化佈署

在機器學習的生命週期中,模型的佈署和更新是非常重要的步驟。為了實作這一目標,我們可以使用Docker和Jenkins來自動化機器學習模型的佈署。以下是實作這一目標的步驟:

步驟1:建立Docker映像

首先,我們需要建立一個Docker映像,該映像包含了我們的機器學習模型和相關的依賴項。為了實作這一目標,我們可以使用Dockerfile來定義映像的內容。

FROM python:3.9-slim

# 安裝依賴項
RUN pip install scikit-learn numpy

# 複製模型程式碼
COPY. /app

# 設定工作目錄
WORKDIR /app

# 執行模型訓練
CMD ["python", "train.py"]

步驟2:建立Jenkins工作

接下來,我們需要建立一個Jenkins工作,該工作負責自動化地構建和佈署我們的機器學習模型。為了實作這一目標,我們可以使用Jenkins的GUI介面來建立一個新的工作。

工作1:下載程式碼

首先,我們需要建立一個工作,該工作負責下載我們的機器學習模型程式碼。

  • 在Jenkins中建立一個新的工作
  • 選擇「Git」作為程式碼倉函式庫
  • 輸入程式碼倉函式庫的URL和憑證
  • 設定工作觸發器為「Poll SCM」

工作2:訓練模型

接下來,我們需要建立一個工作,該工作負責訓練我們的機器學習模型。

  • 在Jenkins中建立一個新的工作
  • 選擇「Docker」作為執行環境
  • 輸入Docker映像的名稱和標籤
  • 設定工作觸發器為「Build after other projects are built」
  • 選擇工作1作為觸發器

步驟3:實作自動化佈署

最後,我們需要實作自動化佈署的功能。為了實作這一目標,我們可以使用Jenkins的「Post-build Actions」功能。

  • 在工作2中新增一個新的Post-build Actions
  • 選擇「Send build artifacts over SSH」
  • 輸入遠端伺服器的IP地址和憑證
  • 設定佈署目錄和檔案名稱

圖表翻譯:

以下是實作自動化佈署的流程圖:

  graph LR
    A[程式碼倉函式庫] -->| 下載程式碼 |B[工作1]
    B -->| 訓練模型 |C[工作2]
    C -->| 佈署模型 |D[遠端伺服器]

在這個流程圖中,程式碼倉函式庫中的程式碼會被下載到工作1中,然後工作1會觸發工作2進行模型訓練,最後工作2會將訓練好的模型佈署到遠端伺服器中。

6.4.1 Kubernetes 基本概念

在 Kubernetes 中,存在著許多不同的概念。首先,我們需要了解 Kubernetes 的主節點(Master Node),它是一組三個程式,執行於叢集中的單一節點:kube-apiserver、kube-controller-manager 和 kube-scheduler。每個節點(除了主節點)都執行著兩個程式:kubelet,它負責與 Kubernetes 主節點進行通訊,以及 kube-proxy,它是一個網路代理,反映了 Kubernetes 網路服務於每個節點。

API 伺服器用於元件之間的通訊,控制器管理員檢查狀態與期望狀態的差異,而排程器則決定哪些 Pod 應該執行。Kubelet 是每個節點上的主要「節點代理」。Kube-proxy 是執行於每個節點上的 Kubernetes 網路代理。

在 Kubernetes 中,控制平面(Master Node)是整個系統的協調器,而節點則是執行容器化應用程式的機器(實體伺服器、虛擬機器等)。這些節點由玄貓控制(見圖 6.1 的典型 Kubernetes 架構)。此外,我們還有 Pod 的概念,它是 Kubernetes 中的基本建置單元。Pod 是我們可以建立和管理的最小可佈署單元,由一個或多個容器組成。

例如,我們可以建立一個 Pod 來訓練機器學習模型(程式碼位於單一容器中)。我們還需要處理 Job 的概念,它可以建立一個或多個 Pod。Job 保證 Pod 的執行成功。我們可以建立 Job 來訓練模型、執行批次推論或將訓練中繼資料或預測儲存到外部儲存空間中。Kubernetes 可以幫助我們將機器學習/深度學習模型佈署到生產環境中。

6.4.2 Kubernetes 快速安裝

有多種方法可以安裝 Kubernetes,它們都在 Kubernetes 網站上有詳細的解釋。以下是使用 Homebrew 安裝 kubectl 的方法:

brew install kubectl

或者,您也可以使用以下命令:

Ubuntu/Debian:

sudo apt-get update
sudo apt-get install -y apt-transport-https
sudo apt-get update
sudo apt-get install -y kubectl

Red Hat/CentOS:

cat <<EOF > /etc/yum.repos.d/kubernetes.repo
[kubernetes]
name=Kubernetes
enabled=1
gpgcheck=1
repo_gpgcheck=1
EOF

內容解密:

以上命令用於安裝 kubectl,這是 Kubernetes 的命令列工具。kubectl 可以用來與 Kubernetes 叢集進行互動,例如建立、更新和刪除資源。

圖表翻譯:

  graph LR
    A[Kubernetes Master] -->|API|> B[Node]
    B -->|kubelet|> A
    A -->|Scheduler|> C[Pod]
    C -->|Container|> D[Application]

此圖表展示了 Kubernetes 中的基本元件和其之間的關係。Kubernetes Master 是控制平面,負責管理叢集。Node 是執行容器化應用程式的機器。Pod 是基本的建置單元,由一個或多個容器組成。Container 則是執行應用程式的環境。

Kubernetes 架構概覽

Kubernetes 是一個容器協調系統,負責管理和協調容器化應用的生命週期。下面是 Kubernetes 的基本架構:

控制平面(Control Plane)

控制平面是 Kubernetes 的核心元件,負責管理和控制整個叢集。控制平面的主要元件包括:

  • API Server:提供 RESTful API 供使用者和其他元件與 Kubernetes 叢集進行互動。
  • Controller Manager:負責執行和管理控制器,控制器是 Kubernetes 的核心元件,負責維護叢集的狀態。
  • Scheduler:負責將 Pod 排程到合適的節點上。

工作節點(Worker Node)

工作節點是 Kubernetes 叢集中的計算節點,負責執行容器化應用。每個工作節點都有一個 Kubelet,它是 Kubernetes 的代理程式,負責管理節點上的容器和 Pod。

Kubelet

Kubelet 是 Kubernetes 的代理程式,負責管理節點上的容器和 Pod。它的主要功能包括:

  • 容器管理:建立、啟動、停止和刪除容器。
  • Pod 管理:建立、啟動、停止和刪除 Pod。
  • 節點管理:報告節點的狀態和資源使用情況。

Kube-proxy

Kube-proxy 是 Kubernetes 的網路代理程式,負責為 Pod 提供網路連線性。它的主要功能包括:

  • 服務發現:幫助 Pod 發現和存取叢集中的服務。
  • 負載平衡:將流量分配到多個 Pod 上,以實作負載平衡。

Pod

Pod 是 Kubernetes 的最小執行單元,代表了一組緊密耦合的容器。每個 Pod 都有一個唯一的 IP 位址和埠號,可以被其他 Pod 或服務存取。

容器

容器是 Pod 中的執行單元,代表了一個獨立的應用程式或服務。每個容器都有一個唯一的名稱和 ID,可以被 Kubelet 管理。

節點(Node)

節點是 Kubernetes 叢集中的計算節點,可以是物理機器或虛擬機器。每個節點都有一個唯一的名稱和 ID,可以被 Kubernetes 管理。

服務(Service)

服務是 Kubernetes 的網路服務,提供了一個穩定的網路入口,讓使用者可以存取叢集中的 Pod 和容器。服務可以是 ClusterIP、NodePort 或 LoadBalancer 等型別。

ClusterIP

ClusterIP 服務是一種只能在叢集內部存取的服務,提供了一個穩定的 IP 位址和埠號,可以被其他 Pod 或服務存取。

NodePort

NodePort 服務是一種可以在叢集外部存取的服務,提供了一個穩定的埠號,可以被外部使用者存取。

LoadBalancer

LoadBalancer 服務是一種可以在叢集外部存取的服務,提供了一個穩定的 IP 位址和埠號,可以被外部使用者存取,並且可以實作負載平衡。

Persistent Volume(PV)

Persistent Volume 是 Kubernetes 的持久化儲存資源,提供了一種方式讓 Pod 可以存取持久化儲存裝置。PV 可以是本地儲存、網路儲存或雲儲存等型別。

Persistent Volume Claim(PVC)

Persistent Volume Claim 是 Kubernetes 的持久化儲存申請,提供了一種方式讓 Pod 可以申請持久化儲存資源。PVC 可以被用來申請 PV 資源。

ConfigMap

ConfigMap 是 Kubernetes 的組態管理資源,提供了一種方式讓 Pod 可以存取組態資料。ConfigMap 可以被用來儲存應用程式的組態資料。

Secret

Secret 是 Kubernetes 的密碼管理資源,提供了一種方式讓 Pod 可以存取密碼資料。Secret 可以被用來儲存應用程式的密碼資料。

Deployment

Deployment 是 Kubernetes 的佈署資源,提供了一種方式讓使用者可以佈署和管理應用程式。Deployment 可以被用來建立、更新和刪除 Pod 和 ReplicaSet。

ReplicaSet

ReplicaSet 是 Kubernetes 的複製集資源,提供了一種方式讓使用者可以管理 Pod 的複製數量。ReplicaSet 可以被用來建立、更新和刪除 Pod。

StatefulSet

StatefulSet 是 Kubernetes 的有狀態集資源,提供了一種方式讓使用者可以管理有狀態的 Pod。StatefulSet 可以被用來建立、更新和刪除有狀態的 Pod。

DaemonSet

DaemonSet 是 Kubernetes 的守護程式集資源,提供了一種方式讓使用者可以管理守護程式的 Pod。DaemonSet 可以被用來建立、更新和刪除守護程式的 Pod。

Job

Job 是 Kubernetes 的工作資源,提供了一種方式讓使用者可以執行批次任務。Job 可以被用來建立、更新和刪除批次任務的 Pod。

CronJob

CronJob 是 Kubernetes 的定時工作資源,提供了一種方式讓使用者可以執行定時批次任務。CronJob 可以被用來建立、更新和刪除定時批次任務的 Pod。

以上是 Kubernetes 的基本架構和元件,希望對您有所幫助。

Kubernetes 架構與安裝

Kubernetes 是一個容器協調系統,能夠自動化佈署、擴充套件和管理容器化應用程式。下面是 Kubernetes 的典型架構:

  • Kubelet:負責管理節點上的容器,確保容器按照預期執行。
  • Kube-proxy:負責提供服務發現和負載平衡功能。
  • Container:Kubernetes 中的基本執行單元,是一個或多個相關聯的應用程式容器的集合。
  • POD:Kubernetes 中的最小執行單元,是一組分享相同網路名稱空間的容器集合。
  • Docker engine:負責建立和管理容器。

要安裝 Kubernetes,首先需要安裝 kubectl,這是一個用於與 Kubernetes 叢集互動的命令列工具。可以使用以下命令安裝 kubectl:

yum install -y kubectl

然後,可以檢查 kubectl 的版本:

kubectl version --client

接下來,可以安裝 Kubernetes 的二進位制檔案(kubeadm、kubelet、kubectl):

sudo apt-get install -y kubelet kubeadm kubernetes-cni

啟用 kubelet 服務:

systemctl enable kubelet

安裝 Kubernetes 叢集

為了熟悉 Kubernetes,我們將使用 Vagrant,一個用於建立和管理虛擬機器的工具。Vagrant 可以建立和組態輕量級環境,並在單一工作流程中提供資源給 Vagrant。

首先,需要安裝 Vagrant。對於 Ubuntu/Debian 系統,可以使用以下命令:

sudo apt-get update
sudo apt-get install vagrant

對於 Red Hat/CentOS 系統,可以使用以下命令:

sudo yum install -y yum-utils
sudo yum -y install vagrant

Vagrant 依賴於與提供者(如 VirtualBox、VMware 或 Hyper-V)的互動,以提供資源給 Vagrant。因此,需要安裝其中一種提供者。例如,可以安裝 VirtualBox:

sudo apt update
sudo apt install virtualbox
sudo apt install virtualbox-dkms

然後,可以建立一個 Vagrantfile:

sudo vagrant init bento/ubuntu-20.04

建立自定義 Vagrantfile

為了建立我們自己的環境,我們需要建立或編輯一個特定的 Vagrantfile。以下是 Vagrantfile 的示例內容:

# -*- mode: ruby -*-
# vi: set ft=ruby :
ENV['VAGRANT_DEFAULT_PROVIDER'] = 'virtualbox'
Vagrant.configure("2.2") do |config|
  #...
end

這個 Vagrantfile 將使用 VirtualBox 作為預設提供者,並組態其他必要的設定以建立我們的自定義環境。

圖表翻譯

下面是 Kubernetes 架構的 Mermaid 圖表:

  graph LR
    Kubelet -->|管理|> Container
    Kube-proxy -->|服務發現|> POD
    Docker engine -->|建立|> Container
    POD -->|包含|> Container
    Kubelet -->|監控|> POD

這個圖表展示了 Kubernetes 中各個元件之間的關係,包括 Kubelet、Kube-proxy、Docker engine、Container 和 POD。

虛擬機器設定檔案解析

在虛擬機器設定檔案中,我們可以看到兩個虛擬機器的定義:kubmasterkubnode1。這兩個虛擬機器都使用 bento/ubuntu-20.04 作為其 box 來源,並且都會安裝 Docker。

kubmaster 虛擬機器設定

config.vm.define "kubmaster" do |kub|
  kub.vm.box = "bento/ubuntu-20.04"
  kub.vm.hostname = 'kubmaster'
  kub.vm.provision "docker"
  
  kub.vm.provider :virtualbox do |v|
    v.customize ["modifyvm", :id, "--natdnshostresolver1", "on"]
    v.customize ["modifyvm", :id, "--memory", 2048]
    v.customize ["modifyvm", :id, "--name", "master"]
    v.customize ["modifyvm", :id, "--cpus", "2"]
  end
end

kubmaster 的設定中,我們可以看到以下幾點:

  • kub.vm.box = "bento/ubuntu-20.04":指定了虛擬機器的 box 來源為 bento/ubuntu-20.04
  • kub.vm.hostname = 'kubmaster':設定了虛擬機器的主機名稱為 kubmaster
  • kub.vm.provision "docker":指定了虛擬機器需要安裝 Docker。
  • kub.vm.provider :virtualbox do |v|:指定了虛擬機器提供者為 VirtualBox。
  • v.customize ["modifyvm", :id, "--natdnshostresolver1", "on"]:啟用了 VirtualBox 的 DNS 解析器。
  • v.customize ["modifyvm", :id, "--memory", 2048]:設定了虛擬機器的記憶體大小為 2048 MB。
  • v.customize ["modifyvm", :id, "--name", "master"]:設定了虛擬機器的名稱為 master
  • v.customize ["modifyvm", :id, "--cpus", "2"]:設定了虛擬機器的 CPU 數量為 2。

kubnode1 虛擬機器設定

config.vm.define "kubnode1" do |kubnode|
  kubnode.vm.box = "bento/ubuntu-20.04"
  kubnode.vm.hostname = 'kubnode1'
  kubnode.vm.provision "docker"
  
  kubnode.vm.provider :virtualbox do |v|
    v.customize ["modifyvm", :id, "--natdnshostresolver1", "on"]
    v.customize ["modifyvm", :id, "--memory", 2048]
    v.customize ["modifyvm", :id, "--name", "kubnode1"]
    v.customize ["modifyvm", :id, "--cpus", "2"]
  end
end

kubnode1 的設定中,我們可以看到以下幾點:

  • kubnode.vm.box = "bento/ubuntu-20.04":指定了虛擬機器的 box 來源為 bento/ubuntu-20.04
  • kubnode.vm.hostname = 'kubnode1':設定了虛擬機器的主機名稱為 kubnode1
  • kubnode.vm.provision "docker":指定了虛擬機器需要安裝 Docker。
  • kubnode.vm.provider :virtualbox do |v|:指定了虛擬機器提供者為 VirtualBox。
  • v.customize ["modifyvm", :id, "--natdnshostresolver1", "on"]:啟用了 VirtualBox 的 DNS 解析器。
  • v.customize ["modifyvm", :id, "--memory", 2048]:設定了虛擬機器的記憶體大小為 2048 MB。
  • v.customize ["modifyvm", :id, "--name", "kubnode1"]:設定了虛擬機器的名稱為 kubnode1
  • v.customize ["modifyvm", :id, "--cpus", "2"]:設定了虛擬機器的 CPU 數量為 2。

圖表翻譯:

  graph LR
    A[虛擬機器設定檔案] -->|定義|> B(kubmaster)
    A -->|定義|> C(kubnode1)
    B -->|設定|> D(Hostname: kubmaster)
    B -->|設定|> E(Docker 安裝)
    B -->|設定|> F(VirtualBox 設定)
    C -->|設定|> G(Hostname: kubnode1)
    C -->|設定|> H(Docker 安裝)
    C -->|設定|> I(VirtualBox 設定)

這個圖表展示了虛擬機器設定檔案的結構和內容,包括 kubmasterkubnode1 的定義和設定。

建立 Kubernetes叢集環境

為了建立一個完整的Kubernetes叢集環境,我們需要進行一系列的設定和安裝步驟。首先,我們需要定義我們的虛擬機器組態。

虛擬機器組態

我們使用Vagrant來管理虛擬機器,以下是Vagrantfile的組態內容:

config.vm.define "kubnode2" do |kubnode|
  kubnode.vm.box = "bento/ubuntu-20.04"
  kubnode.vm.hostname = 'kubnode2'
  kubnode.vm.provision "docker"
  
  config.vm.box_url = "bento/ubuntu-20.04"
  kubnode.vm.provider :virtualbox do |v|
    v.customize ["modifyvm", :id, "--natdnshostresolver1", "on"]
    v.customize ["modifyvm", :id, "--memory", 2048]
    v.customize ["modifyvm", :id, "--name", "kubnode2"]
    v.customize ["modifyvm", :id, "--cpus", "2"]
  end
end

這個組態定義了一臺名為kubnode2的虛擬機器,使用Ubuntu 20.04作業系統,具有2GB的記憶體和2個CPU核心。

啟動虛擬機器

啟動虛擬機器的命令是vagrant up,這個命令會根據Vagrantfile的組態建立和組態虛擬機器。

連線虛擬機器

啟動虛擬機器後,我們可以使用以下命令連線到每臺虛擬機器:

vagrant ssh kubmaster
vagrant ssh kubnode1
vagrant ssh kubnode2

停用交換空間

為了確保Kubernetes叢集的正常運作,我們需要停用每臺虛擬機器的交換空間。可以使用以下命令:

swapoff -a

然後,編輯/etc/fstab檔案,註解掉交換空間的行。

安裝必要套件

在每臺虛擬機器上,我們需要安裝一些必要的套件,例如curlapt-transport-https

apt-get update && apt-get install -y apt-transport-https curl

安裝Kubernetes二進位制檔

為了安裝Kubernetes二進位制檔,我們需要下載並安裝kubectlkubeadmkubelet

apt-get install -y kubelet kubeadm kubectl kubernetes-cni

然後,啟用kubelet服務:

systemctl enable kubelet

內容解密:

以上步驟是建立Kubernetes叢集環境的基本流程。透過這些步驟,我們可以建立一個完整的Kubernetes叢集,並安裝必要的套件和二進位制檔。這些步驟是Kubernetes叢集佈署的基礎,之後我們可以在這個基礎上進行更進一步的組態和佈署。

圖表翻譯:

  graph LR
    A[啟動虛擬機器] --> B[連線虛擬機器]
    B --> C[停用交換空間]
    C --> D[安裝必要套件]
    D --> E[安裝Kubernetes二進位制檔]
    E --> F[啟用kubelet服務]

這個圖表展示了建立Kubernetes叢集環境的流程,從啟動虛擬機器到啟用kubelet服務。每個步驟都很重要,需要按照正確的順序進行。

Kubernetes 初始化與內部網路設定

在安裝了所有必要的套件後,我們將著手初始化 Kubernetes 叢集並設定內部網路,以便讓不同的節點能夠相互連線。

初始化主節點

首先,我們需要連線到主節點(Master Node),並執行以下命令:

kubeadm init --apiserver-advertise-address=192.168.56.101 --node-name $HOSTNAME --pod-network-cidr=10.244.0.0/16

這裡,192.168.56.101 是我們之前定義的主節點 IP 地址,而 10.244.0.0/16 是 Kubernetes 內部網路的子網路遮罩,定義了 Kubernetes 將使用的 IP 地址範圍。

執行此命令後,我們將看到一個包含令牌的輸出,該令牌將用於加入不同的節點:

...
To start using your cluster, you need to run the following command as a regular user:
...

如輸出所示,為了開始使用我們的叢集,我們需要建立一個組態檔案以便使用 kubectl

建立組態檔案

為了建立組態檔案,我們需要執行以下命令:

mkdir -p $HOME/.kube
chown $(id -u):$(id -g) $HOME/.kube/config

設定內部網路

為了建立內部網路,我們需要在節點之間提供一個網路。我們將使用 Flannel,它是一種為 Kubernetes 設計的簡單的第 3 層網路織物。Flannel 在每個主機上執行一個名為 flanneld 的二進位制代理,並負責為每個主機分配一個子網路租約。

Flannel 架構

以下是 Flannel 的架構概覽:

+---------------+
|  Master Node  |
+---------------+
       |
       |
       v
+---------------+
|  Node 1      |
|  (Kubnode 1) |
+---------------+
       |
       |
       v
+---------------+
|  Node 2      |
|  (Kubnode 2) |
+---------------+
       |
       |
       v
+---------------+
|  VxLAN      |
|  (橋接 Cnto) |
+---------------+
       |
       |
       v
+---------------+
|  Veth      |
|  (橋接 Cnto) |
+---------------+

在這個架構中,每個節點都有一個 eth0 網路卡,Flannel 使用 VxLAN 和橋接來建立一個跨節點的網路。這樣,Kubernetes 就可以在不同的節點之間進行通訊。

圖表翻譯:

  graph LR
    A[Master Node] -->|kubeadm init|> B[Node 1 (Kubnode 1)]
    A -->|kubeadm init|> C[Node 2 (Kubnode 2)]
    B -->|Flannel|> D[VxLAN (橋接 Cnto)]
    C -->|Flannel|> D
    D -->|Veth|> E[橋接 Cnto]

這個圖表顯示了 Kubernetes 初始化和 Flannel 網路設定的過程。Master Node 執行 kubeadm init 命令來初始化叢集,然後 Node 1 和 Node 2 透過 Flannel 建立內部網路。Flannel 使用 VxLAN 和橋接來建立一個跨節點的網路。

Kubernetes叢集安裝與設定

在本文中,我們將探討如何從頭開始安裝一個Kubernetes叢集。首先,我們需要在所有節點上啟用內部網路的管理,執行以下命令:

sysctl net.bridge.bridge-nf-call-iptables=1

接下來,我們使用組態檔案(kube-flannel.yml)安裝Flannel網路。這個組態檔案可以線上上找到。

# 安裝Flannel網路
kubectl apply -f Documentation/kube-flannel.yml

安裝完成後,我們可以檢查Pods的狀態:

# 檢查Pods狀態
kubectl get pods --all-namespaces

有時候,我們可能需要修改Flannel的組態,例如從10.244.0.0/16改為10.10.0.0/16。這可以透過以下命令實作:

# 編輯Flannel組態
kubectl edit cm -n kube-system kube-flannel-cfg

然後,我們可以檢查主節點是否已經準備好:

# 檢查主節點狀態
kubectl get nodes

現在,是時候將節點加入到主節點了。為此,我們需要複製之前生成的token,並在節點(kubnode1和kubnode2)上執行以下命令:

# 加入主節點
kubeadm join 192.168.56.101:6443 --token 0dgzxg.86lj9mirur1ele2f \
--discovery-token-ca-cert-hash sha256:59ca1ef21c1c4304ff1558210cf78528a6750babc3fa69241e925c2d5f7d90c6

傳回主節點後,我們可以檢查節點的狀態:

# 檢查節點狀態
kubectl get nodes

此外,我們也可以使用docker ps命令檢查所有已啟動的容器(包括coredns、flannel等)。

最後,讓我們來談談叢集存取。如果我們在主節點上執行以下命令:

# 檢查節點詳細資訊
kubectl get nodes -o wide

我們會看到主節點和其他節點具有相同的內部IP地址。為了方便存取,我們需要編輯/etc/hosts檔案並新增主節點的IP地址。

# 編輯/etc/hosts檔案
vim /etc/hosts

同樣地,其他節點(kubnode1和kubenode2)也需要修改/etc/hosts檔案。

如果需要刪除Flannel,可以使用以下命令:

# 刪除Flannel Pods
kubectl delete pods kube-flannel-ds-56f9h -n kube-system
kubectl delete pods kube-flannel-ds-dx8tv -n kube-system
kubectl delete pods kube-flannel-ds-kgxvt -n kube-system

Kubernetes的魔力在於它可以在不失去服務的情況下重新組態,並且可以自動建立新的Flannel。

最後,為了方便使用,我們可以新增自動補全功能:

# 安裝bash-completion
apt-get install bash-completion

# 啟用自動補全
echo "source <(kubectl completion bash)" >> ~/.bashrc
source ~/.bashrc

現在,我們已經掌握瞭如何從頭開始安裝一個Kubernetes叢集,並且可以建立Kubernetes Jobs來訓練機器學習模型、序列化模型、載入模型到記憶體中以及進行推理。

使用Docker和Kubernetes進行機器學習模型訓練

6.5.1 Kubernetes Jobs:模型訓練和批次推理

在本章中,我們將探討Kubernetes Jobs的應用,並瞭解如何使用Jobs進行機器學習模型的訓練。Kubernetes Job是一種控制器,負責確保Pods成功終止其工作負載。當指定數量的Pods終止時,Job即被視為完成。如果Pod失敗,Job將建立新的Pod來替換它。

我們的目標是建立一個名為「訓練Job」的Kubernetes Job,該Job負責載入儲存在GitHub的訓練資料,訓練機器學習模型,序列化模型,並將其儲存在叢集外部。為了儲存資料,我們可以使用公共雲、 私有雲或本地儲存。在本例中,我們將使用SSH(安全Shell協定)在Kubernetes叢集和外部伺服器之間進行通訊。

6.5.2 建立和準備虛擬機器

為了安裝Kubernetes叢集,我們需要建立虛擬機器或使用裸機伺服器。所有指令均在Ubuntu 20.04版本的虛擬機器上進行了測試:

  • kubmaster:2個vCPUs,4096 MB RAM,20 GB磁碟空間
  • kubenode1:2個vCPUs,4096 MB RAM,20 GB磁碟空間

我們啟用虛擬機器和主機之間的流量,並切換到root使用者,關閉交換空間並註解掉/etc/fstab中的交換參考:

swapoff -a
vim /etc/fstab

6.5.3 Kubeadm安裝

首先,我們需要在每個虛擬機器(kubmaster和kubenode1)上安裝Docker引擎,使用apt包索引,安裝允許apt使用https連線的包,新增Docker的官方GPG金鑰,設定穩定倉函式庫,並安裝最新版本的Docker引擎和容器:

sudo apt-get update
sudo apt-get install \
    apt-transport-https \
    ca-certificates \
    curl \
    gnupg \
    lsb-release

然後,我們需要下載Kubernetes二進位制檔案kubectl、kubeadm和kubelet的GPG金鑰:

curl -s https://packages.cloud.google.com/apt/doc/apt-key.gpg | sudo apt-key add -

接下來,我們安裝Kubernetes二進位制檔案:

sudo apt-get install -y kubelet kubeadm kubectl

並啟用kubelet服務:

systemctl enable kubelet

所有這些步驟必須在叢集的所有節點(主節點和從節點)上執行。

6.5.4 建立Kubernetes叢集

現在,我們已經在所有節點上安裝了必要的包,並且可以初始化主節點並加入從節點。為此,我們連線到主節點並執行以下命令:

kubeadm init --apiserver-advertise-address=192.168.1.55 --node-name $HOSTNAME --pod-network-cidr=10.244.0.0/16

這裡,192.168.1.55是主節點(kubmaster)的IP地址,而10.244.0.0/16是Kubernetes內部網路的子網路遮罩,用於定義Kubernetes分配IP地址的範圍。

6.5.5 容器化Python應用程式

為了容器化Python應用程式,我們需要建立一個Dockerfile,以指示Docker使用基礎映像、設定和命令。這裡,我們使用jupyter/scipy-notebook作為基礎映像:

FROM jupyter/scipy-notebook
RUN mkdir my-model
ENV MODEL_DIR=/home/jovyan/my-model
ENV MODEL_FILE_LDA=clf_lda.joblib
ENV MODEL_FILE_NN=clf_nn.joblib

內容解密:

  • FROM jupyter/scipy-notebook:指定基礎映像為jupyter/scipy-notebook。
  • RUN mkdir my-model:在容器內建立一個名為my-model的目錄。
  • ENV MODEL_DIR=/home/jovyan/my-model:設定環境變數MODEL_DIR為/home/jovyan/my-model。
  • ENV MODEL_FILE_LDA=clf_lda.joblib:設定環境變數MODEL_FILE_LDA為clf_lda.joblib。
  • ENV MODEL_FILE_NN=clf_nn.joblib:設定環境變數MODEL_FILE_NN為clf_nn.joblib。

圖表翻譯:

  graph LR
    A[Dockerfile] -->|指定基礎映像|> B[jupyter/scipy-notebook]
    B -->|建立目錄|> C[my-model]
    C -->|設定環境變數|> D[MODEL_DIR]
    D -->|設定環境變數|> E[MODEL_FILE_LDA]
    E -->|設定環境變數|> F[MODEL_FILE_NN]

這個圖表展示了Dockerfile的建立過程,從指定基礎映像到設定環境變數。

使用Docker和Kubernetes進行機器學習模型訓練

在本文中,我們將探討如何使用Docker和Kubernetes進行機器學習模型訓練。首先,我們需要設定環境變數並安裝必要的套件,包括joblib和paramiko。

ENV METADATA_FILE=metadata.json
COPY requirements.txt./requirements.txt
RUN pip install -r requirements.txt

接下來,我們需要複製必要的檔案,包括訓練資料和模型檔案。

COPY id_rsa./id_rsa
COPY train.py./train.py

為了建立與遠端伺服器的連線,我們需要設定RSA金鑰認證。首先,我們需要生成公鑰和私鑰。

ssh-keygen -t rsa

然後,我們需要將公鑰複製到遠端伺服器的authorized_keys檔案中。

vim /home/xavi/.ssh/id_rsa.pub

如果需要,我們可以將私鑰複製到目前目錄中,並修改許可權。

sudo cp /home/xavi/.ssh/id_rsa.
sudo chmod a+r id_rsa

在Dockerfile中,我們可以使用以下程式碼來設定RSA金鑰認證。

ARG SSH_PRIVATE_KEY
RUN mkdir /root/.ssh/
RUN echo "${SSH_PRIVATE_KEY}" > /root/.ssh/id_rsa

然後,我們可以建置Docker映像檔。

sudo docker build -t kubernetes-models -f Dockerfile --build-arg SSH_PRIVATE_KEY="$(cat ~/.ssh/id_rsa)".

但是,我們需要注意不要留下任何敏感資訊在Docker映像檔中。即使我們刪除了檔案,仍然可以在映像檔的層中檢視到。為了避免這個問題,我們可以使用–squash引數來減少映像檔的大小。

另外,我們也可以使用Kubernetes的secret物件來儲存和管理敏感資訊,例如密碼、OAuth令牌和SSH金鑰。

在train.py檔案中,我們可以匯入必要的套件,讀取環境變數,載入訓練資料,序列化模型,執行交叉驗證,並上傳訓練好的模型和交叉驗證結果到遠端伺服器。

#!/usr/bin/python3

import os
import json
import numpy as np
from sklearn.discriminant_analysis import LinearDiscriminantAnalysis
from sklearn.neural_network import MLPClassifier
from sklearn.model_selection import cross_val_score
import pandas as pd
from joblib import dump, load
from sklearn import preprocessing
import paramiko

def train():
    #...

內容解密:

在上述程式碼中,我們使用了多個套件,包括scikit-learn、joblib和paramiko。scikit-learn是一個機器學習套件,提供了多種演算法和工具。joblib是一個套件,提供了序列化和反序列化的功能。paramiko是一個SSHv2協定的Python實作。

圖表翻譯:

以下是訓練模型的流程圖。

  flowchart TD
    A[開始] --> B[載入訓練資料]
    B --> C[序列化模型]
    C --> D[執行交叉驗證]
    D --> E[上傳訓練好的模型和交叉驗證結果]
    E --> F[結束]

在這個流程圖中,我們可以看到訓練模型的步驟,包括載入訓練資料、序列化模型、執行交叉驗證和上傳訓練好的模型和交叉驗證結果。

機器學習模型的訓練與佈署

在進行機器學習模型的訓練之前,首先需要載入必要的資料和設定模型的路徑。這包括了模型檔案的路徑(MODEL_FILE_LDAMODEL_FILE_NN)以及相關的中繼資料檔案路徑(METADATA_FILE)。

載入模型路徑和檔案

import os
import pandas as pd
from sklearn.preprocessing import normalize

# 定義模型和中繼資料的路徑
MODEL_DIR = os.environ["MODEL_DIR"]
MODEL_FILE_LDA = os.environ["MODEL_FILE_LDA"]
MODEL_FILE_NN = os.environ["MODEL_FILE_NN"]
METADATA_FILE = os.environ["METADATA_FILE"]

# 組合路徑
MODEL_PATH_LDA = os.path.join(MODEL_DIR, MODEL_FILE_LDA)
MODEL_PATH_NN = os.path.join(MODEL_DIR, MODEL_FILE_NN)
METADATA_PATH = os.path.join(MODEL_DIR, METADATA_FILE)

載入訓練資料

接下來,載入訓練資料集,並將其分割為特徵值(X_train)和目標變數(y_train)。

# 載入訓練資料
data_train = pd.read_csv(url)

# 分割資料為特徵值和目標變數
y_train = data_train['# Letter'].values
X_train = data_train.drop(data_train.loc[:, 'Line':'# Letter'].columns, axis=1)

資料預處理

進行資料預處理,包括資料正規化,以確保所有特徵值都在相同的尺度上。

# 資料正規化(L2 標準化)
X_train = normalize(X_train, norm='l2')

印出訓練資料的形狀

為了確認資料是否載入正確,印出訓練資料的形狀。

print("訓練資料的形狀:")
print(X_train.shape)
print(y_train.shape)

訓練模型

現在,可以開始訓練機器學習模型了。首先,使用線性判別分析(Linear Discriminant Analysis, LDA)作為預設引數進行模型訓練。

from sklearn.discriminant_analysis import LinearDiscriminantAnalysis

# 線性判別分析(LDA)模型
lda_model = LinearDiscriminantAnalysis()
lda_model.fit(X_train, y_train)

圖表翻譯:

  flowchart TD
    A[載入資料] --> B[資料預處理]
    B --> C[分割資料]
    C --> D[模型訓練]
    D --> E[模型評估]

圖表說明:

上述流程圖描述了從載入資料到模型訓練的整個過程。首先,載入必要的資料;然後,進行資料預處理以確保資料品質;接下來,分割資料為訓練集和測試集;最後,使用選定的機器學習演算法進行模型訓練。

線性判別分析(LDA)與神經網路(NN)模型的建立與序列化

在這個範例中,我們將建立兩個不同的機器學習模型:線性判別分析(LDA)和神經網路(NN),並將它們序列化以便於後續的使用。

首先,讓我們建立一個LDA模型並將其訓練:

from sklearn.discriminant_analysis import LinearDiscriminantAnalysis

# 建立LDA模型
clf_lda = LinearDiscriminantAnalysis()

# 訓練LDA模型
clf_lda.fit(X_train, y_train)

接下來,我們將序列化LDA模型以便於儲存和載入:

from joblib import dump

# 序列化LDA模型
dump(clf_lda, MODEL_PATH_LDA)

同樣地,讓我們建立一個神經網路模型並將其訓練:

from sklearn.neural_network import MLPClassifier

# 建立NN模型
clf_NN = MLPClassifier(solver='adam', activation='relu', alpha=0.0001,
                       hidden_layer_sizes=(500,), random_state=0, max_iter=1000)

# 訓練NN模型
clf_NN.fit(X_train, y_train)

然後,我們將序列化NN模型:

# 序列化NN模型
dump(clf_NN, MODEL_PATH_NN)

交叉驗證與儲存模型績效

接下來,我們將進行交叉驗證以評估模型的績效,並將結果儲存到一個JSON檔案中:

from sklearn.model_selection import cross_val_score
import json

# 進行交叉驗證
accuracy_lda = cross_val_score(clf_lda, X_train, y_train, cv=5)
accuracy_nn = cross_val_score(clf_NN, X_train, y_train, cv=5)

# 儲存模型績效到JSON檔案
metadata = {
    "train_accuracy_lda": accuracy_lda.mean(),
    "train_accuracy_nn": accuracy_nn.mean()
}

with open(METADATA_PATH, 'w') as outfile:
    json.dump(metadata, outfile)

上傳模型檔案到遠端伺服器

最後,我們將使用Paramiko函式庫上傳模型檔案到遠端伺服器:

import paramiko

# 建立SSH連線
client = paramiko.SSHClient()
client.set_missing_host_key_policy(paramiko.AutoAddPolicy())
k = paramiko.RSAKey.from_private_key_file('id_rsa')

# 上傳模型檔案
sftp = client.open_sftp()
sftp.put(MODEL_PATH_LDA, "/home/xavi/output/" + MODEL_FILE_LDA)
sftp.put(MODEL_PATH_NN, "/home/xavi/output/" + MODEL_FILE_NN)
sftp.put(METADATA_PATH, "/home/xavi/output/" + METADATA_FILE)

sftp.close()

這樣就完成了LDA和NN模型的建立、序列化、交叉驗證和上傳到遠端伺服器的過程。

使用Docker和Kubernetes進行機器學習模型訓練

在上一節中,我們已經完成了機器學習模型的訓練和測試。現在,我們將使用Docker和Kubernetes來佈署和管理我們的模型。

建立Docker映像

首先,我們需要建立一個Docker映像來包含我們的模型和訓練程式碼。以下是Dockerfile的內容:

FROM python:3.9-slim

# 設定工作目錄
WORKDIR /app

# 複製訓練程式碼
COPY train.py /app/

# 安裝依賴函式庫
RUN pip install -r requirements.txt

# 執行訓練程式碼
CMD ["python", "train.py"]

接下來,我們可以使用以下命令建立Docker映像:

docker build -t kubernetes-models -f Dockerfile.

測試Docker映像

在建立Docker映像後,我們可以使用以下命令測試它:

docker run kubernetes-models python3 train.py rm./id_rsa

如果一切正常,則表示我們的Docker映像已經正確建立。

推播Docker映像到倉函式庫

現在,我們可以將Docker映像推播到Docker Hub倉函式庫:

docker login
docker tag kubernetes-models:latest xaviervasques/kubernetes-models:latest
docker push xaviervasques/kubernetes-models:latest

建立Kubernetes Job組態檔

接下來,我們需要建立一個Kubernetes Job組態檔來執行我們的模型訓練程式碼。以下是job.yaml的內容:

apiVersion: batch/v1
kind: Job
metadata:
  name: train-models-job
spec:
  template:
    spec:
      containers:
      - name: train-container
        imagePullPolicy: Always
        image: xaviervasques/kubernetes-models:latest
        command: ["python3", "train.py", "rm", "./id_rsa"]
      restartPolicy: Never
      backoffLimit: 4

執行Kubernetes Job

現在,我們可以使用以下命令執行Kubernetes Job:

kubectl create -f job.yaml

檢視Job狀態

我們可以使用以下命令檢視Job狀態:

kubectl get jobs
kubectl get pods --selector=job-name=train-models-job

檢視日誌

我們可以使用以下命令檢視日誌:

kubectl logs train-models-job-vd5rq

刪除Cluster

如果需要刪除Cluster,可以使用以下命令:

kubectl delete job train-models-job
sudo kubeadm reset
kubeadm reset
sudo apt-get purge kubeadm kubectl kubelet kubernetes-cni kube*
sudo apt-get autoremove
sudo rm -rf ~/.kube

線上推論

在下一節中,我們將實作線上推論和批次推論。

批次推論

首先,我們需要修改Dockerfile來包含批次推論程式碼:

FROM jupyter/scipy-notebook
RUN mkdir my-model

ENV MODEL_DIR=/home/jovyan/my-model

ENV MODEL_FILE_LDA=clf_lda.joblib

ENV MODEL_FILE_NN=clf_nn.joblib

線上推論

線上推論可以使用REST API來實作。

推論模型佈署

在上一節中,我們探討瞭如何構建一個 Docker 容器來執行機器學習模型的訓練和推斷。現在,我們將更深入地瞭解如何實作推斷功能。

推斷指令碼

首先,我們需要建立一個推斷指令碼,負責載入已經訓練好的模型並對新資料進行預測。以下是 inference.py 指令碼的內容:

#!/usr/bin/python3

import platform
import sys
import numpy as np
from sklearn.discriminant_analysis import LinearDiscriminantAnalysis
from sklearn.neural_network import MLPClassifier
import pandas as pd
from joblib import load
from sklearn import preprocessing
import paramiko

def inference():
    # 載入模型
    model_dir = os.environ["MODEL_DIR"]
    model_file_lda = os.environ["MODEL_FILE_LDA"]
    model_file_nn = os.environ["MODEL_FILE_NN"]
    model_path_lda = os.path.join(model_dir, model_file_lda)
    model_path_nn = os.path.join(model_dir, model_file_nn)

    # 載入和正規化測試資料
    data_test = pd.read_csv("testing.csv")
    y_test = data_test['# Letter'].values
    X_test = data_test.drop(data_test.loc[:, 'Line':'# Letter'].columns, axis=1)
    X_test = preprocessing.normalize(X_test, norm='l2')

    # 載入模型並進行預測
    lda_model = load(model_path_lda)
    nn_model = load(model_path_nn)
    y_pred_lda = lda_model.predict(X_test)
    y_pred_nn = nn_model.predict(X_test)

    # 輸出預測結果
    print("LDA 模型預測結果:", y_pred_lda)
    print("NN 模型預測結果:", y_pred_nn)

這個指令碼首先載入了兩個模型(LDA 和 NN),然後載入和正規化測試資料,最後使用這兩個模型對測試資料進行預測,並輸出預測結果。

Dockerfile 修改

為了執行這個推斷指令碼,我們需要修改 Dockerfile 以包含推斷指令碼和相關依賴。以下是修改後的 Dockerfile 內容:

ENV METADATA_FILE=metadata.json
COPY requirements.txt./requirements.txt
RUN pip install -r requirements.txt

COPY id_rsa./id_rsa
COPY inference.py./inference.py
COPY train.py./train.py

我們增加了 inference.py 指令碼到 Docker 容器中,並確保它可以被執行。

執行推斷

現在,我們可以使用以下命令執行推斷指令碼:

docker run -it --rm -v $(pwd):/app -w /app python:3.9-slim python inference.py

這個命令會啟動一個新的 Docker 容器,掛載當前目錄到容器中的 /app 目錄,然後執行 inference.py 指令碼。

內容解密:

在這個例子中,我們使用了 inference.py 指令碼來載入已經訓練好的模型並對新資料進行預測。指令碼首先載入了兩個模型(LDA 和 NN),然後載入和正規化測試資料,最後使用這兩個模型對測試資料進行預測,並輸出預測結果。

圖表翻譯:

以下是推斷過程的 Mermaid 圖表:

  flowchart TD
    A[載入模型] --> B[載入和正規化測試資料]
    B --> C[使用模型進行預測]
    C --> D[輸出預測結果]

這個圖表展示了推斷過程的步驟,從載入模型到輸出預測結果。

遠端伺服器批次推論:載入訓練模型、輸出分數和預測

在進行批次推論時,我們需要將模型載入遠端伺服器,然後使用測試資料計算模型的準確度和進行預測。以下是使用Python和Paramiko函式庫實作此功能的步驟。

步驟1:連線遠端伺服器

首先,我們需要建立與遠端伺服器的連線。這可以使用Paramiko函式庫來實作,該函式庫提供了一個安全的方式來連線SSH伺服器。

import paramiko

# 建立SSH客戶端
ssh_client = paramiko.SSHClient()

# 自動新增主機金鑰
ssh_client.set_missing_host_key_policy(paramiko.AutoAddPolicy())

# 載入私鑰
k = paramiko.RSAKey.from_private_key_file('id_rsa')

# 連線遠端伺服器
ssh_client.connect(hostname='192.168.1.11', username='username', pkey=k)

步驟2:載入訓練模型

接下來,我們需要載入訓練好的模型。假設我們已經將模型儲存為檔案,並且知道檔案的路徑。

# 載入LDA模型
sftp_client = ssh_client.open_sftp()
remote_file = sftp_client.open("/Users/LRENC/Desktop/Kubernetes/Jenkins/" + MODEL_FILE_LDA)
clf_lda = load(remote_file)

步驟3:計算模型準確度和進行預測

現在,我們可以使用載入的模型計算準確度和進行預測。

# 計算LDA模型的準確度和進行預測
print("LDA score and classification:")
print(clf_lda.score(X_test, y_test))
print(clf_lda.predict(X_test))

步驟4:關閉連線

最後,別忘了關閉連線,以避免資源浪費。

# 關閉SFTP客戶端
remote_file.close()

# 關閉SSH連線
ssh_client.close()

內容解密:

在上述程式碼中,我們使用Paramiko函式庫來建立與遠端伺服器的連線,然後載入訓練好的模型,計算準確度和進行預測。注意,我們需要替換usernameMODEL_FILE_LDAMODEL_FILE_NN為實際的使用者名稱和模型檔案名稱。

圖表翻譯:

以下是程式碼的Mermaid流程圖:

  flowchart TD
    A[開始] --> B[連線遠端伺服器]
    B --> C[載入LDA模型]
    C --> D[計算LDA模型的準確度和進行預測]
    D --> E[載入NN模型]
    E --> F[計算NN模型的準確度和進行預測]
    F --> G[關閉連線]
    G --> H[結束]

圖表翻譯:

上述流程圖展示了批次推論的步驟,從連線遠端伺服器開始,然後載入LDA和NN模型,計算準確度和進行預測,最後關閉連線。

使用Docker和Kubernetes進行機器學習模型佈署

在上一節中,我們已經完成了機器學習模型的訓練和評估。現在,我們將使用Docker和Kubernetes來佈署模型,實作批次推理和實時推理。

批次推理

首先,我們需要建立一個Docker映象,包含我們的模型和推理程式碼。然後,我們可以使用Kubernetes來佈署這個映象,實作批次推理。

# inference.py
from sklearn.externals import joblib
import pandas as pd

# 載入模型
clf_nn = joblib.load('model.pkl')

# 載入測試資料
test_data = pd.read_csv('test.csv')

# 進行推理
predictions = clf_nn.predict(test_data)

# 輸出結果
print(predictions)
# inference.yaml
apiVersion: batch/v1
kind: Job
metadata:
  name: inference-job
spec:
  template:
    spec:
      containers:
      - name: inference-container
        imagePullPolicy: Always
        image: xaviervasques/kubernetes-inference:latest
        command: ["python3", "inference.py"]
      restartPolicy: Never
      backoffLimit: 4

實時推理

接下來,我們將使用Flask-RESTful API來實作實時推理。首先,我們需要建立一個API,接受使用者的請求,然後使用我們的模型進行推理。

# api.py
from flask import Flask, request, jsonify
from sklearn.externals import joblib

app = Flask(__name__)

# 載入模型
clf_nn = joblib.load('model.pkl')

@app.route('/predict', methods=['POST'])
def predict():
    # 接受使用者的請求
    data = request.get_json()
    
    # 進行推理
    prediction = clf_nn.predict(data)
    
    # 輸出結果
    return jsonify({'prediction': prediction})

if __name__ == '__main__':
    app.run(debug=True)
# Dockerfile
FROM python:3.9-slim

# 安裝依賴包
RUN pip install flask flask-restful joblib

# 複製程式碼
COPY. /app

# 設定工作目錄
WORKDIR /app

# 執行API
CMD ["python", "api.py"]

Kubernetes佈署

最後,我們可以使用Kubernetes來佈署我們的API。

# deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
  name: api-deployment
spec:
  replicas: 3
  selector:
    matchLabels:
      app: api
  template:
    metadata:
      labels:
        app: api
    spec:
      containers:
      - name: api-container
        image: xaviervasques/kubernetes-inference:latest
        ports:
        - containerPort: 5000
# 佈署API
kubectl apply -f deployment.yaml

# 暴露API
kubectl expose deployment api-deployment --type=LoadBalancer --port=80

這樣,我們就完成了機器學習模型的佈署,實作了批次推理和實時推理。

機器學習模型在生產環境中的應用

在實際生產環境中,機器學習模型的佈署和管理是一個非常重要的步驟。為了實作這一目標,我們需要設計和實作一系列的API,以便於使用者可以方便地與模型進行互動。

從商業價值視角來看,利用 Docker 和 Jenkins 自動化佈署機器學習模型,能顯著縮短模型上線時間,加速產品迭代速度,提升企業競爭力。分析段落中提到的 Docker 映像構建、Jenkins 工作流程組態、以及自動化佈署流程,都體現了 DevOps 理念在機器學習領域的實踐。然而,模型版本控制、持續監控和回復機制等議題,仍需仔細考量,才能確保模型在生產環境的穩定性和可靠性。展望未來,隨著 Serverless 技術和 MLOps 理念的普及,預期機器學習模型的佈署流程將更加簡化和高效,模型迭代週期將進一步縮短,進而推動更多根據 AI 的創新應用落地。玄貓認為,掌握 Docker 和 Jenkins 等自動化工具,並將其整合至 MLOps 流程中,對於提升機器學習工程師的效率和價值至關重要。