กว่าจะออกมาเป็น Data Product … ทีม Data ต้องทำอะไรกันบ้าง

เคยสงสัยไหมว่า พอ Data Scientist ทำ Model ออกมาได้แล้ว มันจะออกไปโชว์บน Web หรือ App ได้ยังไงกันนะ

สวัสดีค่ะ เราชื่อแก้ว เป็น Senior data engineer อยู่ที่ LINE MAN Wongnai (LMWN) เราเป็นคนหนึ่งที่เคยสงสัยแบบนั้น จนได้มีโอกาสมาร่วมพัฒนา data product ที่นี่ เราก็เลยอยากจะเขียนบทความเล่า process ในการทำ data product ที่ LMWN ตั้งแต่ต้นจนจบเลยค่ะ บทความนี้จะเน้นที่ process อย่างเดียว จะไม่ลงลึกที่หัวข้อใดหัวข้อหนึ่งเป็นพิเศษค่ะ

เราจะอิงจาก ML process ของ Google ตามรูปด้านล่างค่ะ

ML Process

Google จะแบ่งการพัฒนา ML model ออกเป็น 3 เฟสหลักๆ คือ

  • Discovery phase (สีฟ้า) เป็นส่วนที่เริ่มกำหนดโจทย์หรือ business use case ในการทำ data product และทำ data exploration
  • Development phase (สีเหลือง) หลักๆเลยจะเป็นส่วนของการพัฒนา ML model
  • Deployment phase (สีเขียว) คือส่วนที่เอา model ที่พัฒนาเสร็จแล้ว ขึ้นระบบไปใช้งานจริง

บทความนี้จะเล่าแต่ละเฟสโดยย่อค่ะ โดยเราอยากเน้นไปที่ส่วนของ deployment เยอะหน่อย เพราะเรารู้สึกว่ามันเป็นส่วนที่โลกของ data ไม่ค่อยมีคนพูดถึงกัน แต่ก็เป็นส่วนที่ใช้เวลาและมีความสำคัญไม่แพ้กับส่วนอื่นๆเลยค่ะ


  1. รู้จักกับทีม Data ของ LMWN กันก่อน
  2. Discovery Phase
    1. Define Business Use Cases
    2. Data Collection & Exploration
  3. Development Phase
    1. Build ML Models
    2. Experiment Design
  4. Deployment Phase
    1. Model Serving
    2. Architecture Design
    3. Implementation
    4. Monitoring
    5. Load Test
  5. After Deployment

รู้จักกับทีม Data ของ LMWN กันก่อน

ก่อนที่เล่าถึง process ขอแนะนำทีม Data ที่ LMWN ก่อน ที่นี่เราจะเรียกว่าทีม Data Science & Engineering หรือเรียกย่อๆ ว่า DSE โดยหลักๆก็จะมี 2 role คือ

  1. Data Scientist (DS) มีหน้าที่พัฒนา ML models และทำการวิเคราะห์ข้อมูลเชิงลึก
  2. Data Engineer (DE) มีหน้าที่ดูแล data platform, ทำ data pipeline และเอาโมเดลขึ้นระบบ

(จริงๆเรามี ML Engineer อีกตำแหน่งค่ะ แต่ตอนนี้เขาทำงานเหมือน DE แล้วก็เลยขอรวมง่ายๆเหลือ 2 role หลักๆแล้วกันค่ะ)

ในการทำ data product จริงๆ ก็ไม่ใช่ว่าเราจะทำงานวังเวงกันอยู่ 2 คนนะคะ เราจะทำงานร่วมกันทีมอื่นๆด้วย เช่น

  • ทีมจากทางด้าน Business เช่น Product manager, Marketing, Operation ที่จะมาให้ requirement ว่าอยากจะให้ data product ออกมาหน้าตาเป็นยังไง
  • ทีม Architect ที่ช่วยดูเรื่อง Architecture design และ Infrastructure ให้
  • ทีม Dev ที่ช่วย review code ให้เรา

เมื่อรู้จักทีม DSE กันแล้ว ก็มาเริ่ม process กันเลยค่ะ


Discovery Phase

มาเริ่มกันที่ Discovery กันเลย

Define Business Use Cases

อย่างแรกเลยที่เราต้องทำและจริงๆแล้วเป็นส่วนที่สำคัญมากส่วนหนึ่ง คือ กำหนดโจทย์ให้กับ data product ของเราค่ะ จริงๆที่เราเจอมาจะมี 2 แบบ คือ

  • Business เป็นคนให้โจทย์ทีม data : แบบนี้ business จะมี data literacy อยู่แล้ว เขารู้ว่าข้อมูลเอาไปใช้ทำอะไรได้บ้าง เขาก็จะบอกเลยว่าอยากได้อะไร output เป็นแบบไหน และ timeline ในการออก product จะสั้น เพราะเขาจะ follow up ตลอดเวลา
  • ทีม data คิดโจทย์กันเอง : แบบนี้เราจะคิดกันเองในทีมว่าอยากจะทำอะไร จะออกเป็นงานแนว research มากกว่าและจะมีเวลาในการทำมากกว่า แต่ข้อเสียของแบบนี้ก็คือ สุดท้ายเราต้องไปขายสิ่งที่เราทำให้ business เอาไปใช้ให้ได้ บางทีเขาไม่รู้ว่าสิ่งที่เราทำมันจะมี impact อะไรบ้าง เราก็จะต้องเป็นเหมือนเซลล์ขายของไปขายให้เขาใช้ให้ได้

Data Collection & Exploration

พอเราได้โจทย์ที่จะทำมาแล้ว เราก็จะมาดูว่าข้อมูลเพียงพอสำหรับการทำโจทย์นี้ไหม ถ้าดูแล้วไม่พอก็ต้องมีการเก็บข้อมูลเพิ่ม

ในส่วนของการเก็บข้อมูลนั้น DE จะเป็นคนดึงข้อมูลทั้งจาก data source ภายในระบบของบริษัทและจาก 3rd party tools มาเก็บไว้ให้ใน data lake แล้ว DS ก็ใช้ analytic tools ต่างๆ ไปตรวจสอบข้อมูลใน data lake ว่าเพียงพอสำหรับการทำ product ไหม ถ้าข้อมูลพร้อมแล้ว เราก็เข้าสู่เฟสต่อไปกันเลยค่ะ

Development Phase

ส่วนนี้ขอยกให้ DS เป็นพระเอกเลยค่ะ

Build ML Models

ส่วนนี้ก็คือส่วนที่ DS จะพัฒนา ML Model ขึ้นมานั่นเอง ตัวอย่างของ project ที่เราทำโมเดลกัน ก็มีทั้งโมเดลทั่วไป เช่น user segmentation, churn prediction, demand prediction, recommendation และโมเดลที่ใช้ deep learning เช่น image aesthetic (ที่เรียกว่าโมเดลรูปสวยรูปถูกใจ) และ search engine with knowledge graph

อย่างหนึ่งที่อยากจะ note ไว้ก็คือ การทำโมเดลไม่ใช่ทำครั้งเดียวจบ พอเราโชว์ผลลัพธ์ให้กับทาง business แล้ว ทางนั้นก็จะมี feedback กลับมาหลายๆอย่าง ไม่ว่าจะเป็นการเติม domain knowledge มาให้กลับไปพัฒนาโมเดลให้ดียิ่งขึ้น หรือบางครั้งเขาก็มีข้อจำกัดในการใช้งาน model หรือบางทีก็ให้ requirement เพิ่ม

มันก็จะเป็น feedback loop ไปซักพักจนกว่าทาง business จะโอเคกับโมเดลของเรา ก็จะได้เป็น final model ที่เราจะไปใช้งานหรือขึ้นระบบจริงๆ

Experiment Design

แต่พอเราได้ model แล้ว ก็ไม่ใช่ว่าเราจะเอาโมเดลนี้ไปใช้เลย 100% นะ คือต้องบอกก่อนว่า การที่โมเดลเราให้ผลลัพธ์ที่ดีทางทฤษฎีแบบ accurracy 99% ไม่ได้แปลว่ามันจะดีแบบนั้นในการใช้งานจริง

เพราะฉะนั้น เราจะทำการทดลองที่เรียกว่า A/B testing คือการที่เราจะทดสอบ model กับคนบางกลุ่มในช่วงเวลาหนึ่งก่อน แล้วค่อยเอาผลการทดลองมาตรวจสอบดูว่า model ให้ผลลัพธ์ที่ดีขึ้นจริงไหมในทางปฏิบัติค่ะ

A/B Testing (Ref: https://www.marketingoops.com/exclusive/how-to/ab-testing/)

ในขั้นตอนนี้ DS จะทำการออกแบบว่าการทดลองครั้งนี้จะใช้ metric อะไรมาวัดว่า product ของเราจะดีกว่าอันเก่า จะแบ่งเป็นกี่กลุ่ม กลุ่มหนึ่งต้องใช้ user กี่คน หรือต้องเปิดการทดลองนานเท่าไหร่ค่ะ

Deployment Phase

พอเราได้โมเดลมาแล้ว ก็จะเข้าสู่เฟส deployment แล้วค่ะ ส่วนนี้คนที่รับหน้าที่ส่วนใหญ่จะเป็น DE ค่ะ

Model Serving

พอเราจะขึ้นเป็น product เนี่ย เราจะต้องมาดูก่อนว่าโมเดลของเราจะต้อง predict แบบ real-time หรือเปล่า

Batch prediction vs. Real-time prediction

ในบางทีเราอาจจะต้องการ predict แค่วันละครั้ง เราก็ทำเป็น batch prediction ได้ อาจจะทำเป็น pipeline ง่ายๆ ให้มีการเตรียมดาต้า, โหลดโมเดลมา predict, เก็บผลลัพธ์ไว้ใน database แล้วให้แอปมาเรียกใช้ก็ได้ อันนี้ก็จะไม่ซับซ้อนมากนัก

แต่ถ้าเราต้องการ predict แบบ real-time ก็จะต้องทำสิ่งที่เรียกว่า Model serving และก็จะต้องมีการทำ service เพิ่ม (service พูดง่ายๆก็คือเป็นโปรแกรมตัวหนึ่งละกัน) เพื่อให้ service ยิง data มาถามตัว serving แล้วตัว serving ก็จะให้ prediction result ได้ในทันที

อันนี้ก็จะแล้วแต่ use case ของแต่ละ product เลยค่ะ

Architecture Design

ส่วนต่อมาคือการออกแบบว่าเราจะต้องมี service หรือ component อะไรที่เราจะต้องทำเพิ่ม และ service เหล่านั้นจะต้องรับส่งข้อมูลกันอย่างไร เพื่อให้ผลลัพธ์จาก model ของเราไปออกบน web หรือ app ได้

ตัวอย่าง architecture ที่ใช้ deploy โมเดลรูปตัวใหม่

ตัวอย่างในรูปนี้เป็นตัวอย่างที่เราจะเอาโมเดลรูปตัวใหม่ที่เรียกว่า TookjaiNet (รูปถูกใจ) ขึ้นไปทดสอบบน Wongnai ส่วนสีฟ้าในรูปคือส่วนที่ทีม data ต้องทำเพิ่มทั้งหมดเพื่อให้ผลลัพธ์จาก model ไปโชว์บน web กับ app ให้ได้ เนื่องจากการขึ้นโมเดลในระบบอาจมีส่วนที่จะต้องทำเพิ่มเยอะ จึงอาจทำให้เฟส deployment ใช้เวลานานพอสมควรค่ะ อาจจะเท่ากับหรือนานกว่าตอนพัฒนา ML Model เลยด้วยซ้ำ

ส่วนนี้เราจะปรึกษากับทีม architect ให้ช่วยตรวจสอบ architecture ที่ทีม data ออกแบบมาแล้ว ทีม architect ก็จะมาช่วยดูเรื่อง feasibility กับ cost ให้ บางทีตัวที่ทีม data เลือกมามี cost สูงเกินไป เขาก็จะหาตัวเลือกอื่นมาแทนให้ หรือทางนั้นอาจเห็นปัญหาว่าจะไปกระทบ service เก่าๆที่มีอยู่แล้ว ทีม data ก็จะต้องมา design จนกว่าทีม architect จะโอเคค่ะ

Implementation

พอทีม Architect ให้ผ่านแล้ว เราก็จะมา Implement กัน ส่วนใหญ่เราจะเลือก Python เป็นภาษาหลัก เพราะเป็นภาษาที่ทางทีม data ใช้กันอยู่แล้ว แต่ก็มีบาง service ที่ต้องใช้ภาษาอื่นบ้าง อย่างเช่นถ้าไปแก้ Backend ของ Wongnai ให้รับการทำงานกับ service เราได้ ก็ต้องไปแก้ Java ที่เป็นภาษาหลักของ Wongnai ค่ะ

พอ Implement เสร็จแล้วเนี่ย ก็ไม่ใช่ว่าเราจะ deploy ขึ้นไปให้ user ใช้งานได้เลยนะคะ ทีม DSE จะมี Deployment checklist อยู่ มันคือสิ่งที่เราต้องทำเพื่อทำให้ product ที่จะไปถึงมือ user มีคุณภาพเพียงพอค่ะ สิ่งที่เราต้องทำก็คือ

  1. เขียน Unit test เพื่อให้มั่นใจว่า service ของเราจะทำงานไม่ผิดพลาด ตอนนี้ทางทีมเขียนกันอยู่ที่ Coverage 70–80% ค่ะ
  2. ทำ Monitoring error และ performance ของ service
  3. ทำ Load test

ข้อ 2, 3 จะอธิบายเพิ่มเติมในหัวข้อถัดไปค่ะ

Monitoring

ต่อมาก็จะเข้าสู่เรื่องการทำ Monitoring ค่ะ หลักๆที่เราทำมี 2 อย่างค่ะ

อย่างแรกเลยคือ เราจะต้องรู้ถ้ามี error เกิดขึ้นระหว่างที่ user ใช้ service ของเรา

ที่นี่เราใช้ Sentry สำหรับ capture error ใน service ของเราค่ะ ตัว Sentry จะสามารถบอกได้ว่า error เกิดขึ้นเมื่อไหร่ เกิดขึ้นที่โค้ดตรงไหนของเรา เกิดขึ้นกี่ครั้ง แล้วก็ยังสามารถยิง alert เข้า slack ได้ด้วย เราก็จะรู้ทันทีแล้วก็สามารถไปตรวจสอบและแก้ไข error ได้ทันทีค่ะ

Sentry จะส่ง alert มาทาง Slack ทำให้รู้ทันทีว่ามี error เกิดขึ้นใน service

อีกส่วนที่เราทำ monitoring คือเราจะมี Grafana dashboard ที่คอยติดตาม performance ของ service เราอยู่ค่ะ

ตัวอย่าง Grafana dashboard

ตอน implement service เราจะส่ง metric ที่เราต้องการวัดไปให้ Prometheus (Time-series database ที่ใช้สำหรับ monitoring) แล้วให้ Grafana มาดึง metric จาก Prometheus เพื่อเอามาแสดงผลเป็น dashboard ได้ดังรูปค่ะ

เราก็จะสามารถ monitor service ระหว่างที่ user ใช้ได้ว่าเป็นยังไง มีอะไรแปลกๆ ไหม และตัว Grafana เองก็สามารถสร้าง alert ไปที่ slack ได้เหมือนกัน เราก็จะรู้ได้ทันทีถ้ามีอะไรผิดปกติกับ service ของเราค่ะ

Load Test

อันนี้เป็นส่วนสุดท้ายก่อนจะได้ deploy แล้วค่ะ

เราทำ Load test เพื่อจะได้รู้ว่า service ที่เราทำมานั้น สามารถรับ request ได้มากเท่าไหร่และ latency เป็นอย่างไร

ยกตัวอย่าง เช่น ในหนึ่งวินาทีอาจจะมีคนใช้ search บน Wongnai 100 คนพร้อมๆกัน ดังนั้น search service ก็ต้องสามารถรับ request ให้ได้ 100 requests ในหนึ่งวินาที ค่า 100req/s ก็คือโหลดของเรานั่นเอง แล้วทีนี้คนใช้ต้องรอนานแค่ไหนกว่าจะได้รับผลการ search อันนี้ก็คือ latency ของ service ของเราค่ะ ยิ่งรับโหลดได้เยอะและยิ่ง latency ต่ำก็ยิ่งดีค่ะ

ตัวอย่าง report จากการทำ load test

ปกติจะมี tool ที่ใช้ทำ load test โดยเฉพาะอยู่แล้ว โดย tool จะสามารถสร้าง report ออกมาให้ตามรูปได้เลย เราก็จะรู้เลยว่า performance ของ service เราเป็นอย่างไร ถ้า latency มีค่าสูงมากเกินไป (user ต้องรอโหลดนาน) เราก็จะต้องกลับไป optimize ตัว service ของเราใหม่ให้มี latency ต่ำลงค่ะ

พอทำจบครบ process นี้แล้ว เราก็จะได้ deploy model ของเราให้ออกสู่สาธารณะชนได้แล้วค่ะ

DEPLOYED!!! HOORAY!!!

แต่เดี๋ยวก่อน ….

ลืมอะไรกันไปหรือเปล่า ….

After Deployment

จำได้ไหมว่าเรามีการทำ A/B testing กัน คือจริงๆแล้วเราจะปล่อย product ไปทดลองกับ user บางกลุ่มเป็นช่วงเวลาหนึ่งก่อน พอจบช่วงเวลาทดลองแล้ว DS ก็จะเอาข้อมูลมาดูว่า metric ที่วัดดีขึ้นไหมนะ

ถ้าดีขึ้นเราก็จะปล่อย product ออกไปใช้ แต่มันก็มีโอกาสที่ product ของเราจะแย่ลงเหมือนกัน ก็อาจจะต้องกลับไปพัฒนา model กันใหม่ ตรงนี้ก็เหมือนเป็น challenge ด่านสุดท้ายของการทำ data product เลยค่ะ

จบแล้วค่ะ สำหรับ process การทำ data product ของ LMWN แบบย่อ หวังว่าผู้ที่อ่านมาถึงตรงนี้จะเห็นภาพการทำ data product ตั้งแต่ต้นจนจบมากยิ่งขึ้นค่ะ

ขอบคุณค่ะ


Comments

Leave a Reply

Your email address will not be published. Required fields are marked *