แนะนำวิธีใช้ Docker deploy API ที่เขียนด้วย Python + FastAPI ขึ้น Cloud (Heroku) สำหรับทำ Face Recognition ทดสอบด้วยภาพสาว ๆ Blackpink 😆
สำหรับบทความนี้จะต่อเนื่องจากบทความที่แล้วนะครับ ที่แนะนำการเขียน Python โดยใช้ FastAPI เพื่อให้บริการรู้จำใบหน้า (Face Recognition) ในรูปแบบ Machine Learning as a Service (MLaas) โดยสามารถส่งภาพใบหน้าผ่าน URL และได้รับตอบกลับเป็นชื่อของบุคคลที่อยู่ในรูป ก่อนจะทำตามบทความนี้ให้ทำตามบทความเก่าก่อนตามลิงค์นี้เลยครับ 😃
และบทความที่เกี่ยวกับ FastAPI ของคุณ Thannob เผื่อใครอยากทดลองสร้าง API เบื้องต้นก่อนนะครับ
Code ทั้งหมดที่ใช้ในบทความนี้สามารถดาวน์โหลดได้จาก GitHub ของผมเลยครับ
Software Installation
เริ่มต้นติดตั้ง software ที่จำเป็นก่อนดังนี้ครับ
- Docker Desktop ใช้สำหรับ build Docker Image จากโปรแกรมที่เราเขียนด้วย Python + FastAPI จากบทความที่แล้ว เพื่อนำขึ้น Heroku Cloud Application Platform ต่อไป โดยสามารถดาวน์โหลดและติดตั้ง Docker Desktop ได้จาก https://www.docker.com/products/docker-desktop
- เพื่อให้ Docker สามารถที่จะใช้งานบน Windows ได้ ให้ลง wsl2-kernel ด้วยครับ https://docs.microsoft.com/en-us/windows/wsl/wsl2-kernel
- set BIOS ของเครื่องให้รองรับการทำ Virtualization ด้วยนะครับ ลอง Search หาวิธีการดูของแต่ละเครื่องคอมแต่ละรุ่นจะต่างกันนะครับ หรือดูจากที่นี้ก็ได้ครับ วิธีเปิดใช้งาน Virtualization
- git ใช้ clone Source Code ถ้ายังไม่มี สามารถดาวน์โหลดได้จาก https://git-scm.com/downloads
- Heroku CLI ใช้สำหรับเรียกคำส่งเพื่อ deploy Docker Image ของเราขึ้น Heroku ดาวน์โหลดและติดตั้งได้จาก https://devcenter.heroku.com/articles/heroku-cli#download-and-install
- และสุดท้าย ให้สมัคร Account ของ Heroku ด้วยครับ โดยแบบฟรีสามารถ Deploy ได้สูงสุดถึง 5 Application เลยทีเดียว สมัครแบบฟรีได้ที่ https://signup.heroku.com/login
หลายสิ่งมาก 5555 ติดตั้งเสร็จแล้ว Restart เครื่องคอมซักทีด้วยนะครับ
build Docker Image จาก Dockerfile
ใช้ git clone ตัว Source Code ที่ผมเตรียมไว้ได้เลยครับ
$ git clone https://github.com/KarnYong/face-recognition-fastapi-docker.git
cd เข้าไปยัง folder ซะก่อน
$ cd face-recognition-fastapi-docker
เปิดไฟล์ Dockerfile ขึ้นมา ตรงนี้จะเป็นตัวบอกถึงขั้นตอนในการ build Docker Image
- บรรทัดแรกคือการ pull Docker Image อีกตัวหนึ่งมาที่มีสภาพแวดล้อมของ minoconda3 เรียบร้อยแล้ว ซึ่งการ pull ก็คือการดาวน์โหลดตัว Docker Image จากอินเทอร์เน็ต ในการ build Docker Image ในครั้งนี้จะเป็นการ build ต่อยอดจาก Docker Image ตัวดังกล่าว
- บรรทัดที่ 3 คือระบุ Path (WORKDIR) ที่ใช้ทำงานภายใน Docker Image
- บรรทัดที่ 5 คือการ copy file ทุกไฟล์จาก path ที่อยู่ ไปยัง WORKDIR ภายใน Docker Image
- บรรทัดที่ 6 คือการสร้าง conda environment ขึ้นมาใหม่ โดยมีชื่อว่า face-api-venv และทำการติดตั้ง package เข้าไปใน environment ดังกล่าว โดยอ้างอิงชื่อและเวอร์ชันของ package เหล่านั้นจากไฟล์ environment.yml
- บรรทัดที่ 8 ที่เป็น CMD จะเป็นการบอกว่าเมื่อ Docker ถูก Run ขึ้นมา จะให้เรียกใช้คำสั่งภายใน CMD โดยที่ระบุไว้ จะเป็นคำสั่งในการ start ตัว API ขึ้นมานั้นเอง โดยจะใช้เป็น port 5000
ส่วนไฟล์ environment.yml จะเป็นการระบุ package ต่าง ๆ ที่เราจะใช้ conda ในการบรรจุไว้ใน Docker Image ที่เราจะ Build ขึ้นมา
ทำการ build Docker Image ตามคำสั่งด้านล่าง โดยระบุชื่อของ Docker Image ว่า face-api โดย . หมายถึงตำแหน่งของไฟล์ Dockerfile ซึ่งก็คือโฟล์เดอร์ที่อยู่ ณ ปัจจุบัน
$ docker build --tag face-api:latest .
ทดลอง run Container จาก Docker Image
ใช้คำสั่งด้านล่างในการ run Container จาก Docker Image เพื่อเป็นการทดลอง deploy ภายในเครื่องคอมของเราเอง โดยให้ forward port 80 จากเครื่องของเราไปยัง port 5000 ภายใน Container
$ docker run -p 80:5000 -d --name face-api face-api
*face-api แรก คือชื่อของ Container ส่วน face-api ด้านหลังสุดคือชื่อของ Docker Image
ทดสอบผ่าน Web browser โดยใส่ URL เป็น http://localhost/docs ทดลองเรียก API /faces_recognition/ แนบรูปไปด้วย การตอบรับกลับมาจะเป็นชื่อของบุคคลภายในรูป สามารถวิธีการเพิ่มเติมจากท้ายบทความที่แล้วได้นะครับ
Deploy Docker Image ขึ้น Cloud (Heroku)
เมื่อทดลองแล้วว่า Container ของเราทำงานได้ ถึงเวลาที่จะนำ API ของเราขึ้นไปให้บริการบน Cloud แล้วนะครับ 555 มาลองใช้ Heroku กันครับ
โดยเริ่มจากการใช้ Heroku CLI เพื่อ login ตรงนี้จะมีการเปิดหน้า Web browser ขึ้นมาเพื่อให้ login ผ่านหน้าเว็บด้วยนะครับ เมื่อ login ผ่านแล้วก็กลับมาเรียกคำสั่งต่อไปได้ครับ
$ heroku login
$ heroku container:login
พอ login เสร็จเรียบร้อย คำสั่งต่อไปจะเป็นการสร้าง Application แบบเปล่า ๆ เพื่อจองพื้นที่บน Cloud ของ Heroku ครับ โดยผมจะตั้งชื่อ Application ว่า karnyong-face-api นะครับ ตรงนี้จะตั้งชื่ออะไรก็ได้ครับ แค่อย่าลืมชื่อเป็นพอครับ 555 เพราะเดี๋ยวมีใช้ต่อ ๆ ไปครับ
$ heroku create karnyong-face-api
จากนั้น deploy API ขึ้นไปที่ Application บน Heroku ด้วยการ push และ release ตามคำสั่งด้านล่าง
$ heroku container:push web -a karnyong-face-api
$ heroku container:release web -a karnyong-face-api
ทดลองเรียกใช้ API ผ่านหน้า Web browser โดยใส่ URL เป็น https://karnyong-face-api.herokuapp.com/docs (อย่าลืมเปลี่ยน karnyong-face-api เป็นชื่อของ Application ที่ตั้งเองด้วยนะครับ) ลองส่งรูป Lisa เข้าไป เพื่อดูผลตอบกลับเป็นชื่อของ Lisa ได้ตามรูปด้านล่างเลยครับ
แถม! ปรับ API ให้ตอบกลับเป็นรูปภาพแทน
แก้ไขไฟล์ face-api.py เพื่อให้ตอบกลับมาเป็นรูปภาพที่ระบุชื่อบุคคลในภาพด้วย
deploy API ที่ปรับแก้ขึ้น Heroku ใหม่ด้วยคำสั่ง push และ release เหมือนเดิม (ถ้า login Heroku ไปแล้ว สามารถข้ามคำส่ง login ได้)
$ heroku login
$ heroku container:login
$ heroku container:push web -a karnyong-face-api
$ heroku container:release web -a karnyong-face-api
ทดสอบ API ผ่านหน้า Web browser โดยใส่ URL เป็น https://karnyong-face-api.herokuapp.com/docs เหมือนเดิม คราวนี้จะตอบกลับมาเป็นรูปภาพแทนครับ
จบแล้วครับ ขอบคุณที่อ่านจนจบนะครับ ขอบคุณภาพสวย ๆ จาก Blackpink Official Facebook ด้วยครับ
บทความโดย อ.ดร.กานต์ ยงศิริวิทย์
วิทยาลัยนวัตกรรมดิจิทัลเทคโนโลยี มหาวิทยาลัยรังสิต