【 Ai初心者系列 】從training、tracking到serving

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、tracking到serving
平台需求

對於 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
      

到這裡, 我們已經有一個 K8s cluster 可以使用了, 接著我們就使用這個 cluster 來安裝我們所需要的工具吧 !!!

未完待續….

訂閱電子報

Select list(s)*

 

Loading