ทำไมทีม AI ที่ WISESIGHT ถึงเลือกใช้ AWS Inferentia



Original Source Here

ทำไมทีม AI ที่ WISESIGHT ถึงเลือกใช้ AWS Inferentia

อย่างที่เล่าไปใน “กว่าจะได้ AI ซักตัวพวกเราทำยังไงกันนะว่าทีม ML Engineer ของ WISESIGHT เราทำทุกอย่างเกี่ยวกับ AI/ML แบบ End-to-End ซึ่งในบทความนี้จะมาขยายความในส่วนของ Deployment ว่าพวกเรามีวิธีการประมาณไหนที่ทำให้ Product ที่ทีมของเรา Deliver ออกไป Cost-Effective ที่สุด เอาละขอสปอยก่อนละกันว่าท่าที่จะมานำเสนอในบทความนี้คือการ Deploy โมเดลบน AWS Inferentia ซึ่งเป็นหนึ่งใน Instance ของ AWS EC2 ซึ่งมันเร็วและถูกมากๆ สำหรับการทำ Inference

AWS Inferentia คืออะไร

AWS Inferentia เป็น Instance Type หนึ่งของ AWS EC2 ซึ่งออกแบบมาไว้สำหรับ Machine Learning Inference โดยเฉพาะ AWS เคลมว่า Throughput สูงขึ้น 2.3x และถูกว่า 70% เมื่อเทียบกับ GPU-Instance ที่มีขนาดเท่ากัน ซึ่ง ML Framework ที Support ได้แก่ Pytorch, Tensorflow, และ MXNet

ทำไมเราถึงเลือกใช้ AWS Inferentia

Photo by Eran Menashri on Unsplash

ในฐานะ ML Engineer เราต้องหาจุดกึ่งกลางระหว่าง Cost และ Accuracy ให้ได้ ซึ่งเนื่องจากข้อมูลของโลกโซเชียลที่พวกเราต้องตบตีกับมันทุกวันมักจะไม่มีรูปแบบที่ตายตัว หลาย ๆ ครั้งเราจำเป็นต้องใช้โมเดลที่มีขนาดใหญ่ จำนวน Parameters เยอะ ๆ ซึ่งผลที่ตามมาก็คือมันก็เก่งมาก ๆ แหละ แต่มีราคาแพงถ้าเราจะ Deploy สิ่งนี้ขึ้นไปยัง Production (ถ้าอยากอ่านเพิ่มเกี่ยวกับการเลือกใช้ Model อ่านได้จาก “Things to consider when choosing ML models”) ในทางกลับกันทีมของเราทดลองการ Deploy หลายรูปแบบมาก ๆ ทั้ง TorchScript, ONNX Runtime, OpenVINO, GPU, และอื่น ๆ ซึ่งจากที่เราเจอใน Usecase ของพวกเรา เราพบว่า AWS Neuron Runtime ซึ่งรันบน AWS Inferentia เนี้ยแหละเร็วและถูกสุดแล้ว

แล้วถ้าจะ Run บน AWS Inferentia ทำยังไง

ในหัวข้อนี้จะเริ่มเข้าโหมด Coding ละ ซึ่งวิธีการนำโมเดลที่ถูกเทรนมารันบน AWS Neuron Runtime มีอยู่ 3 ขั้นตอนดังนี้ Compile, Load, และ Inference ผมขอค่อย ๆ ไล่ไปที่จะขั้นตอนละกัน โดยผมขอเลือกใช้ Pytorch ละกันเพราะว่าน่าจะเป็น ML Framework ที่เป็นที่นิยมมากที่สุด

1. Model Compilation

หลังจากที่เราเทรนโมเดลเสร็จแล้ว เราจะนำโมเดลที่เราได้มาทำการ Compile เพื่อให้มัน Compatible กับ Inferentia Deviceโดยทาง AWS แนะนำว่าคอมที่ใช้ Compile ควรมีขนาด 8 core ขึ้นไป แต่ในตัวอย่างเราจะลองกับโมเดลที่ไม่ใหญ่มากซึ่งไม่น่าจะมีปัญหาอะไร (อ่านเพิ่มได้ตรงนี้)

ก่อนอื่นเลย เราต้องเริ่มจากการลง Dependencies สำหรับการ Compile โมเดลก่อน

จากนั้นเราจึงเริ่มโหลดโมเดลที่อยู่ในรูปแบบของ Eager Model เข้ามายังใน Memory แล้วก็เริ่ม Compile ได้เลย ซึ่งก่อน Compile เราจำเป็นที่จะต้องสร้าง dummy tensor ขึ้นมาเพื่อให้ Compiler สามารถ Trace กราฟของโมเดลได้ โดยในตัวอย่างนี้ขอเลือกใช้ ResNet50 ที่ถูก Pretrained มาแล้ว อย่าลืม Save Model ไว้ใช้สำหรับการรันด้วยนะ

Load Model to AWS Neuron Memory

เอาละหลังจากที่เราได้โมเดลมาแล้วเราจะมาเริ่มโหลดโมเดลบนเครื่อง AWS EC2 Inferentia กัน ซึ่งก่อนที่เราจะโหลดโมเดลได้ เราจำเป็นที่จะต้องลง Neuron Driver ก่อน ซึ่งวิธีการลงสามารถ Follow ตามนี้ได้เลย Install Neuron Driver ซึ่งวิธีการโหลดโมเดลมันง่ายมาก ๆ ถ้าหากใครเคยใช้ TorchScript มาแล้ว จะบอกว่ามันเหมือนกันเลย แค่เพิ่มส่วนที Import เข้ามา

Inference

หลังจากที่เราโหลดโมเดลแล้ว เรามาลอง Inference กัน ซึ่งก็ไม่ต่างจาก TorchScript เลย เพียงแค่เรา Invoke โมเดลด้วย Tensor ก็ได้ผลลัพธ์การ Inference แล้ว

เร็วจริงเหรอ ?

Photo by Catherine Heath on Unsplash

ในหัวข้อนี้เราจะมาลองเปรียบเทียบความเร็วของการ Inference ระหว่าง Neuron Runtime กับ TorchScript Runtime เดียวจะหาว่าขี้โม้ สำหรับเครื่องที่จะใช้เทสคือ Inf1.2xlarge โดยในส่วนของ TorchScript จะให้รันบน CPU แต่ Neuron จะให้รันบน Inferentia Chip

ก่อนอื่นเลยขอเตรียมโมเดลที่ถูก Compile ด้วย TorchScript ก่อน

เอาละทีนี้ เรามาลองเทสความเร็วแบบง่าย ๆ กัน

Neuron inference took: 0.044843435287475586
TorchScript inference took: 0.16991400718688965

จะเห็นได้ว่า Neuron เร็วขึ้นเกือบ 4 เท่าเลยซึ่ง Significant มาก ๆ ซึ่งผลลัพธ์นี้ก็จะแตกต่างกันไปแล้วแต่โมเดล ยิ่งโมเดลใหญ่ ๆ ความแตกต่างระหว่าง TorchScript กับ Neuron ก็จะห่างมากกว่านี้ไปอีก

Deploy ยังไง ?

โดยปกติแล้ว เราจะ Deploy กันในรูปแบบของ Container แล้วจะทำยังไงดีละ ? จริง ๆ แล้วทาง AWS เขามี Deep Learning Container (DLC) ไว้ให้เลือกใช้ด้วยนะ ลองเลือกตาม Usecase แล้วนำมาใช้เป็น Base Image ของเราได้เลย ซึ่งตอนรัน Container ก็อย่าลืมให้ตัว Container เห็น Device ด้วยละทำตามนี้

docker run -it --name <container-name> --device /dev/neuron0 <image-name> bash

ซึ่งที่ควรระวังก็คือ Instance ของเราจำเป็นที่จะต้องมี Neuron Driver ก่อนซึ่งสามารถใช้ DLAMI ของทาง AWS ได้เลย

แล้วถ้าจะ Deploy บน Kubernetes ละ ?

จริง ๆ แล้วถ้าเราทำบน Kubernetes เราไม่จำเป็นต้องลง Driver ให้กับ Node ของเรานะ EKS มันจัดการลง DaemonSet ให้หมดแล้วเพียงแค่เราเลือก NodeGroup ให้เป็น Inferentia Type ลอง Follow ตาม Tutorial นี้น่าจะเห็นภาพมากขึ้น

ข้อควรระวัง

เอาละทีนี้มาพูดถึงข้อควรระวังของ Inferentia บ้าง เนื่องจากว่าตอนเราทำ Model Compilation เรามีการกำหนด Shape ของ Tensor ที่จะทำการ Trace ดังนั้นแล้ว ถ้าหากเรามี Tensor ที่มี Shape ที่ไม่ตรงกันจะทำให้เกิด Error ได้ตอน Inference อีกข้อนึงที่ทีมของเราเจอคือว่า ตัว AWS Neuron Compiler มันไม่ Compatible กับโมเดลบาง Architecture อันนี้อาจจะต้องลอง Compile ดูว่าผ่านไหม

สรุปแล้วว

Inferentia ถือว่าเป็นทางเลือกที่ดีสำหรับการทำ Model Inference มันถูกและเร็วมาก ๆ ถ้าเราคำนวณจาก Price per Inference นอกจากนั้นมันก็ยังตอบโจทย์ในมุมของ WISESIGHT อีกด้วย เนื่องจาก Message ที่วิ่งเข้ามาในระบบมีจำนวนค่อนข้างเยอะ ดังนั้นถ้าหากเรายังคงใช้ CPU ในการทำ Inference ต่อไปเราจะติดปัญหาเรื่อง Model Scalability เพราะเราจะใช้โมเดลใหญ่ไม่ได้ ซึ่งผลที่จะตามมาคือ Accuracy ที่ต่ำนั้นเอง

AI/ML

Trending AI/ML Article Identified & Digested via Granola by Ramsey Elbasheer; a Machine-Driven RSS Bot

%d bloggers like this: