Train และ Deploy Machine Learning Model บน Microsoft Azure ด้วย Docker

Natchapol Patamawisut
5 min readOct 21, 2020

--

สำหรับใครก็ตามที่ได้มีโอกาสเล่นกับ Machine Learning model ต่าง ๆ แล้ว สิ่งหนึ่งในสิ่งที่น่าเบื่อคงหนีไม่พ้นการที่ต้องรอ model learning

Credit: https://twitter.com/nunenuh/statuses/1277458585170046977

โดยเฉพาะคนที่ใช้ hosted Jupyter notebook service เช่น Google Colaboratory หรือ Kaggle notebook จะมีปัญหาหลายๆอย่างเมื่อมีการ train model เป็นระยะเวลานาน เช่น Notebook disconnecting, RAM limitations, GPU limitations ฯลฯ

ซึ่งหนึ่งในวิธีที่สามารถแก้ปัญหานี้ได้ โดยมีค่าใช้จ่ายที่ไม่สูงเกินไป คือ การใช้ Cloud services เข้ามาช่วยนั้นเอง

สามารถ download code ได้ตามจากด้านล่าง

Github: https://github.com/BankNatchapol/AzureML

Cloud Providers

Cloud providers หนือผู้ให้บริการ Cloud services ในปัจจุบันมีให้เลือกมากมายหลายจ้าว ไม่ว่าจะเป็น AWS, GCP, IBM Cloud, Azure ฯลฯ

Credit: https://www.parkmycloud.com/blog/cloud-providers/

ซึ่งในบทความนี้ผมได้เลือกใช้งาน Microsoft Azure เนื่องจากเป็น Cloud ที่ผมคุ้นเคยมากที่สุด (และ ที่สำคัญมี credit ฟรีอยู่)

Credit: http://www.gci.support/cloud-services/

Microsoft Azure

ก่อนการใช้งาน Microsoft Azure เราจะต้องสร้าง Account ก่อน โดยสามารถทำตามขั้นตอนใน link นี้ได้เลย https://azure.microsoft.com/en-us/get-started/

หลังจากที่สร้าง Account แล้วให้เข้าไปที่ Azure Portal เพื่อใช้งาน services ต่างๆ

Azure Portal

Train Model

ในการ train เราจะใช้ service ที่ชื่อว่า Azure Machine Learning

ซึ่งในที่นี้เราจะใช้ python script ในการสร้าง Resources ทั้งหมด โดยมีขั้นตอนดังนี้

Setup Environment

ขั้นตอนการเตรียม Environment บนเครื่องมีดังนี้

  • Install Azure Machine Learning SDK
pip install azureml-sdk
  • Create a directory structure for code
(folder งาน)
└──.azureml

สร้าง folder .azureml ภายใน folder งาน

Create Workspace

ขั้นตอนนี้ให้เราทำการสร้าง workspace ขึ้นมา

โดย workspace เป็น top-level resource ของ Azure Machine Learning เทียบได้กับ 1 Project = 1 Workspace ซึ่งภายในก็จะประกอบไปด้วย service ย่อย ๆ หลาย service

Credit: https://docs.microsoft.com/en-us/azure/machine-learning/concept-workspace

โดยการสร้าง workspace ให้ทำการ run file create-workspace.py

โดย ในกรณีที่เรายังไม่ได้ สร้าง Resource Group ให้ใส่ชื่อ Resource Group ที่ต้องการ และ ใช้ argument create_resource_group = True

Create Compute

ในขั้นตอนนี้เราจะทำการสร้าง Compute service ขึ้นมาเพื่อเป็น service ที่จะเป็นตัวประมวลผลให้แก่ model ของเรา โดยใช้ python script ดังนี้

ซึ่งในกรณีนี้ผมเลือก compute service เป็น GPU รุ่น Standard_NC6 ซึ่งเราสามารถเลือกใช้รุ่นอื่นได้มากมายตามที่มีว่างให้ใช้ แต่ราคาก็อาจจะเพิ่มหรือลดตามขนาดของ device นั้นๆ

Upload Data

ในการ train model ให้เรา upload ข้อมูลขึ้นไปบน Datastores โดยใช้ Python Script ดังนี้

โดยให้ตั้ง Data path เป็น folder ของข้อมูลที่เราต้องการใช้ในการ train model

Train Model

ในการ train model เราจะต้องมี 2 files ด้วยกัน

  1. ไฟล์ที่ใช้ train model
  2. ไฟล์สำหรับการ run python script บน Azure Machine Learning

train.py

ไฟล์นี้เป็น file สำหรับ train model จะเป็น model ของการทำนายตัวเลขไทยลายมือเขียน ซึ่งสามารถติดตามเพิ่มเติมเรื่อง model ได้ทาง blog นี้

ในส่วนของ code การ train เราจำเป็นต้องเพิ่มคำสั่งตามรูปด้านล่างลงไป

ซึ่งเป็นการรับค่า Path ของข้อมูลในขณะที่ run อยู่บน Azure Machine Learning จากนั้นให้เราทำการเปลี่ยน Path ของการดึงข้อมูล จาก Path ปกติ ไปเป็น Path บน Azure Machine Learning ลักษณะนี้

และส่วนที่เหลือให้เป็นส่วนการ train model ปกติ

run-pytorch-data.py

ในไฟล์นี้จะเป็นคำสั่งให้ run ไฟล์ที่เราต้องการบน Azure Machine Learning ที่ workspace ที่เรากำหนด

ในการใช้งานให้เรานำไฟล์ train.py และ run-pytorch-data.py มาไว้ที่ folder เดียวกันจากนั้นให้ run ไฟล์ run-pytorch-data.py เพื่อนำไฟล์ train.py ไป run บน Azure Machine Learning

หลังจากที่เราสั่ง run ไฟล์ run-pytorch-data.py แล้วให้เรากดตาม link ที่ return ออกมาหลังการ run จะทำให้เข้าสู่หน้า Experiment บน Azure machine Learning

Azure Machine Learning Experiment

บนหน้า Experiment ของ Azure Machine Learning ทำให้เราสามารถ Monitor ผลของการ training ได้ผ่าน web browser จากที่ไหนก็ได้ เพียงเข้า Azure Portal ของ Account เรา แล้วยังสามารถดู log ที่ได้จากการ run

logging

นอกจากนี้สามารถ download Output จากการ train เช่น Model Weights หรือ Prediction result ต่าง ๆ

Output

Deploy Model

หลังจากที่เรา train model และทำการ save weights เก็บไว้เรียบร้อยแล้ว ก็เข้ามาสู่ขั้นตอนถัดไป คือการ deploy model ในลักษณะ Web application

Create Web App

ในขั้นตอนแรกคือการสร้าง Web App ของเราขึ้นมาก่อน โดยผมเลือกใช้ Flask ในการสร้าง Web เนื่องจากเป็น Web App เล็ก ๆ ที่มีเพียง function เดียว

ต้องขอขอบคุณท่านนี้สำหรับ Web app image classification ที่ดูดี

หลังจากที่เขียน flask app เรียบร้อยจะได้ไฟล์ในลักษณะนี้

  • templates เป็นหน้า folder สำหรับ หน้า html ต่างๆของเว็ปเรา
  • googlenetCheckPoint.pt คือ model weight ของ model ที่ train มาได้ ซึ่งใช้ในการทำ Digits Classification
  • index.py เป็น ไฟล์สำหรับการใช้งาน flask และ model ของเรา
  • Dockerfile ใช้สำหรับ build container
  • requirements.txt ใช้ในการกำหนด library ที่ต้องการ install บน container

Web app ที่ได้จะอยู่ในลักษณะนี้

Web App

Build Docker Images

หลังจากที่เราสร้าง Web App ของเราเรียบร้อยแล้ว ก่อนที่จะ deploy ขึ้นไปที่ Azure ผมเลือกใช้ Docker ในการ wrap ตัว app ของเราให้อยู่ใน environment ที่ถูกต้องเสมอว่าจะนำไป run ที่ไหน

โดยตัวที่จะใช้ build image นี้คือ Dockerfile ในลักษณะดังนี้

FROM python:3.7.3WORKDIR /appADD . /appRUN pip install -r requirements.txtEXPOSE 80CMD [ "python", "index.py" ]

โดยผมได้ทำการ push image ไปไว้ที่ Docker Hub แล้วตาม link นี้ สามารถ pull เพื่อใช้ในการ deploy ต่อไปได้เลย

Deploy Web Application

หลังจากได้สร้าง Web App เรียบร้อยแล้ว จากนั้นก็เป็นขั้นตอนการ Deploy โดยผมได้เลือกใช้ Azure App service เป็น web hosting service

Azure App Service

Azure App Service

Azure App Service เป็น Cloud Service Model ของ Azure แบบ PaaS ที่ช่วยให้เราสามารถนำ Code หรือ Container ของเราไปรันเป็น Web App ได้โดยไม่ต้องยุ่งเกี่ยวกับส่วน Infrastructure

ในการ deploy ขึ้น Azure App Service ผมเลือกใช้ VSCode ในการ deploy โดยให้เราลง Docker Extension และ Azure App Service บน VSCode

Docker Extension
Azure App Service Extension

หลังจากที่ลงทั้ง 2 Extension เรียบร้อยแล้วจะมี tab Docker ขึ้นมาที่ด้านข้าง ให้เช้าไปที่

Registry -> Docker Hub แล้วเลือก Image ที่เรา push ขึ้นไปบน Docker Hub

จากนั้น click ขวา เพื่อกด Deploy Image to Azure App Service

เมื่อตั้งค่าต่างๆเรียบร้อยแล้ว สามารถตรวจสอบ Web App ของเราได้ที่ Azure Portal

สามารถลองเข้ามาเล่น Web App ตัวนี้ได้ที่

bluethmnist.azurewebsites.net

--

--

Natchapol Patamawisut
Natchapol Patamawisut

Written by Natchapol Patamawisut

Studying Computer Engineering at King Mongkut's University of Technology Thonburi

Responses (2)