Train และ Deploy Machine Learning Model บน Microsoft Azure ด้วย Docker
สำหรับใครก็ตามที่ได้มีโอกาสเล่นกับ Machine Learning model ต่าง ๆ แล้ว สิ่งหนึ่งในสิ่งที่น่าเบื่อคงหนีไม่พ้นการที่ต้องรอ model learning
โดยเฉพาะคนที่ใช้ hosted Jupyter notebook service เช่น Google Colaboratory หรือ Kaggle notebook จะมีปัญหาหลายๆอย่างเมื่อมีการ train model เป็นระยะเวลานาน เช่น Notebook disconnecting, RAM limitations, GPU limitations ฯลฯ
ซึ่งหนึ่งในวิธีที่สามารถแก้ปัญหานี้ได้ โดยมีค่าใช้จ่ายที่ไม่สูงเกินไป คือ การใช้ Cloud services เข้ามาช่วยนั้นเอง
สามารถ download code ได้ตามจากด้านล่าง
Cloud Providers
Cloud providers หนือผู้ให้บริการ Cloud services ในปัจจุบันมีให้เลือกมากมายหลายจ้าว ไม่ว่าจะเป็น AWS, GCP, IBM Cloud, Azure ฯลฯ
ซึ่งในบทความนี้ผมได้เลือกใช้งาน Microsoft Azure เนื่องจากเป็น Cloud ที่ผมคุ้นเคยมากที่สุด (และ ที่สำคัญมี credit ฟรีอยู่)
Microsoft Azure
ก่อนการใช้งาน Microsoft Azure เราจะต้องสร้าง Account ก่อน โดยสามารถทำตามขั้นตอนใน link นี้ได้เลย https://azure.microsoft.com/en-us/get-started/
หลังจากที่สร้าง Account แล้วให้เข้าไปที่ Azure Portal เพื่อใช้งาน services ต่างๆ
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
โดยการสร้าง 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 ด้วยกัน
- ไฟล์ที่ใช้ train model
- ไฟล์สำหรับการ 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
บนหน้า Experiment ของ Azure Machine Learning ทำให้เราสามารถ Monitor ผลของการ training ได้ผ่าน web browser จากที่ไหนก็ได้ เพียงเข้า Azure Portal ของ Account เรา แล้วยังสามารถดู log ที่ได้จากการ run
นอกจากนี้สามารถ download Output จากการ train เช่น Model Weights หรือ Prediction result ต่าง ๆ
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 ที่ได้จะอยู่ในลักษณะนี้
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 เป็น Cloud Service Model ของ Azure แบบ PaaS ที่ช่วยให้เราสามารถนำ Code หรือ Container ของเราไปรันเป็น Web App ได้โดยไม่ต้องยุ่งเกี่ยวกับส่วน Infrastructure
ในการ deploy ขึ้น Azure App Service ผมเลือกใช้ VSCode ในการ deploy โดยให้เราลง Docker Extension และ Azure App Service บน VSCode
หลังจากที่ลงทั้ง 2 Extension เรียบร้อยแล้วจะมี tab Docker ขึ้นมาที่ด้านข้าง ให้เช้าไปที่
Registry -> Docker Hub แล้วเลือก Image ที่เรา push ขึ้นไปบน Docker Hub
จากนั้น click ขวา เพื่อกด Deploy Image to Azure App Service
เมื่อตั้งค่าต่างๆเรียบร้อยแล้ว สามารถตรวจสอบ Web App ของเราได้ที่ Azure Portal
สามารถลองเข้ามาเล่น Web App ตัวนี้ได้ที่