
AI 平台初學者工作坊: 從training、tracking到serving 系列
主要說明使用AI平台最常使用的三個需求: training 、 tracking 與 serving. 這30天會使用 open source 工具說明如何安裝與整合系統, 以建立出自己的AI平台, .同時也會使用現有工具說明如何達成圖像應用的 Labeling 、 training 與 serving.
※本系列文章為參賽文章,同步刊登於 2021 iThone 鐵人賽
主題說明
本次參加鐵人賽的主題是 AI平台初學者工作坊: 從 training 、 tracking 到 serving
, 將使用 AI 工具說明如何安裝 AI 平台、執行訓練、 tracking 訓練參數,最後將訓練好的 model 部署到指定的環境讓 end user 可以存取 endpoint 之後取得推論的結果.
下圖為這次主題的示意圖:

平台需求
對於 Training 、 training 與 serving 的需求, 分別說明如下:
Training
- 需要有一個工具可以執行 jupyter notebook
- 這個 jupyter notebook 可以是 jupyterlab 或 jupyterHub
- 需要支援 python3 環境
- 需要能自行安裝自己所需的 package , 例如 pytorch 、 tensorflow 與 fastai
- 需要能下載訓練完成之後的模型檔
Tracking
- 可以記錄每次執行 training 時的參數
- 可以記錄每次執行 training 時的 metric
- 可以列表比較不同 training 後的結果
Serving
- 可以將訓練好的 model 完成部署並提供 endpoint
- 外部使用者可存取 endpoint 並取得推論結果
- model serving 工具可以自建或使用現成的工具
範例簡介
本次的鐵人賽預計會以四個範例進行說明, 這四個範例簡述如下:
- 範例一 : 訓練圖像資料( MNIST )並且部署到自行開發的 Web Server
- 範例二 : 訓練文字資料( 心血管疾病資料 )並且使用 seldon 整合 PVC 與 MinIO 部署 model
- 範例三 : 使用 AutoML 工具自動產生最佳(較佳)的 model
- 範例四 : 使用現有工具(使用 Nilvana )操作影像標註功能, 並且將訓練好的model進行部署
最後, 本系列文章著重於平台工具串接
為主, 故上述四個範例所使用的 jupyter notebook 會以現有且公開的文件進行說明, 較不會強調 model 的精確度.
一、安裝 kubeadmin
如上所提, 後續範例使用到的工具可以自建或使用現成的工具, 並將自建工具建置在 kubernets culster 上, 因此需要一座 K8s cluster 來安裝這些工具. 預計使用 kubeadm 建立 k8s cluster , 那麼接下來,我們將說明如何使用 kubeadm 架設一個 k8s cluster.
VM資訊
已先準備好下列表格的三個 VM , 資訊如下:
Node | CPU | RAM | OS | eno0 | |
---|---|---|---|---|---|
Master | 2 Core | 4G | Ubuntu 18.04 | 172.23.180.10 | |
Worker01 | 4 Core | 8G | Ubuntu 18.04 | 172.23.180.11 | |
Worker02 | 4 Core | 8G | Ubuntu 18.04 | 172.23.180.12 |
ps : 在這個 K8s cluster 中沒有 GPU , 此環境僅供示範, 如果要做大量資料訓練,少了GPU的這個環境可能就不是那麼適合,速度很慢的。
安裝步驟說明
-
更新 os (三個 node 都要執行)
- sudo apt-get update
-
各 node 之間設定 ssh 不用密碼, 這部份可以參考這個連結
-
關閉 swap space (三個node都要執行)
$sudo vim /etc/fstab
將 swap 這一行註解起來(前方加上 ‘#’ )
# /etc/fstab: static file system information. # # Use 'blkid' to print the universally unique identifier for a # device; this may be used with UUID= as a more robust way to name devices # that works even if disks are added and removed. See fstab(5). # # <file system> <mount point> <type> <options> <dump> <pass> /dev/mapper/ubuntu--vg-root / ext4 errors=remount-ro 0 1 # /dev/mapper/ubuntu--vg-swap_1 none swap sw 0 0
-
安裝 docker
- 請參考這個連結
-
安裝 kubernetes package
- 請參考這個連結
-
init master node
請參考下列指令:
ps: 下列指令的 IP 記得要改為你自己的 master node IP$sudo kubeadm init --apiserver-advertise-address=192.168.58.10 --pod-network-cidr=10.244.0.0/16
init 好 master node 之後再執行下列指令( on master node ), 這樣之後在 master node 上操作kubectl指令比較方便
mkdir -p $HOME/.kube sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config sudo chown $(id -u):$(id -g) $HOME/.kube/config
init 好 master node 之後也會印出像下方的指令, 先把這行
sudo kubeadm join
指令 copy 下來.You can now join any number of machines by running the following on each node as root: $sudo kubeadm join <control-plane-host>:<control-plane-port> --token <token> --discovery-token-ca-cert-hash sha256:<hash>
-
將二個 worker node 加入 K8s custer (在 worker node 執行)
- 將前一個步驟 copy 下來的指令貼到二個 work node 上並執行, 這樣就會將 worker node 加入 cluster
-
確認 cluster 的狀態
- 這時候三個 node 的 status 都是 not ready , 因為我們還沒有安裝網路元件
kubectl get node
-
安裝網路元件
- 我們要安裝的是 calico , 請執行下列指令
$curl https://docs.projectcalico.org/manifests/calico.yaml -O $kubectl apply -f calico.yaml
等一小段時間後, 再使用
kubectl get node
指令查看 node 狀態, 三個 node 都會是 ready , 像這樣NAME STATUS ROLES AGE VERSION k8s-master Ready control-plane,master 28d v1.21.3 k8s-worker01 Ready <none> 28d v1.21.3 k8s-worker02 Ready <none> 28d v1.21.3
-
修改節點 IP
- 在三個節點上都要改 IP , 請將
192.168.58.xx
替換為自己的IP
修改下列檔案內容
$sudo vim /etc/systemd/system/kubelet.service.d/10-kubeadm.conf
加入第二行的內容( again ,記得改為自己的 IP )
EnvironmentFile=-/etc/default/kubelet Environment="KUBELET_EXTRA_ARGS=--node-ip=192.168.58.xx" ExecStart=
- 然後重啟 kubelet
sudo systemctl stop kubelet.service sudo systemctl daemon-reload sudo systemctl start kubelet.service
- 在三個節點上都要改 IP , 請將
到這裡, 我們已經有一個 K8s cluster 可以使用了, 接著我們就使用這個 cluster 來安裝我們所需要的工具吧 !!!
未完待續….