สถาปัตยกรรมความพร้อมใช้งานของรายการของ Instacart: การแก้ปัญหาเพื่อขนาดและความสม่ำเสมอ

สถาปัตยกรรมความพร้อมใช้งานของรายการของ Instacart: การแก้ปัญหาเพื่อขนาดและความสม่ำเสมอ

โพสต์บนบล็อกนี้เป็นส่วนสุดท้ายของซีรีส์สามส่วนที่สรุปแนวทางเชิงนวัตกรรมของเราในการเอาชนะความท้าทายด้านสินค้าคงคลัง เจาะลึกการประยุกต์ใช้การออกแบบผลิตภัณฑ์ การเรียนรู้ของเครื่อง และเทคโนโลยีทางวิศวกรรม นี่คือ "ตอนที่ 1" และ "ตอนที่ 2" ของซีรีส์นี้ หากคุณต้องการติดตาม

ในส่วนแรกของซีรีส์นี้ เราได้สำรวจการเปลี่ยนแปลงครั้งใหญ่ในความพร้อมจำหน่ายสินค้าของ Instacart โดยเฉพาะอย่างยิ่งในช่วงการแพร่ระบาด และวิธีที่เราควบคุมการคาดการณ์ความพร้อมจำหน่ายแบบเรียลไทม์เพื่อตามทันสินค้าคงคลังในร้านค้าที่ผันผวนอย่างรวดเร็ว ในส่วนที่สองของเรา เราได้เจาะลึกศิลปะการเรียนรู้ของเครื่องจักรเบื้องหลังการคาดการณ์แบบเรียลไทม์สำหรับรายการหลายร้อยล้านรายการ ในส่วนสุดท้ายนี้ เราแบ่งปันโครงสร้างพื้นฐานทางวิศวกรรมที่เราสร้างขึ้นเพื่อปรับขนาดการคาดการณ์แบบเรียลไทม์และส่งเสริมการทดลองที่รวดเร็วยิ่งขึ้น

โครงสร้างพื้นฐานของ RTA

การสร้างโครงสร้างพื้นฐานเพื่อรองรับการคาดการณ์ความพร้อมใช้งานแบบเรียลไทม์ (RTA) ที่แบ่งปันใน "ส่วนที่ 2" ทำให้เราต้องจัดการกับความท้าทายหลายประการ

  1. รองรับการดึงคะแนนผ่าน Remote Procedure Call (RPC): สำหรับการใช้การคาดการณ์แบบเรียลไทม์ เราจำเป็นต้องรองรับการดึงคะแนนผ่าน RPC ใหม่ที่สร้างโดยทีม Machine Learning (ML)
  2. รองรับกรณีการใช้งานที่มีเวลาแฝงต่ำ: เนื่องจากคะแนนถูกใช้ในการกรองในขั้นตอนการดึงข้อมูล เราจึงจำเป็นต้องรองรับการดึงข้อมูลคะแนนจำนวนมากอย่างรวดเร็วในขั้นตอนการดึงข้อมูล วิธีการที่ใช้ RPC จะช้าเกินไปสำหรับความต้องการเหล่านี้ ดังนั้นเราจึงจำเป็นต้องมีแนวทางอื่นนอกเหนือจาก API การให้คะแนนแบบเรียลไทม์
  3. รองรับกรณีการใช้งานที่มีความสอดคล้องสูง: ความสอดคล้องของคะแนนและสิ่งที่มีอยู่ในทุกพื้นผิวเป็นสิ่งสำคัญ โดยเฉพาะอย่างยิ่งเมื่อดึงข้อมูลคะแนนสำหรับการเปลี่ยนแปลง UI การแจ้งให้ลูกค้าทราบถึงสินค้าที่ไม่มีพร้อมจำหน่ายในขณะที่แสดงสินค้านั้นบนพื้นผิวอื่นจะทำลายความไว้วางใจของลูกค้า

เพื่อแก้ปัญหาความท้าทายเหล่านี้ เราได้ปรับใช้สองวิธีในการนำเข้าคะแนนที่สร้างโดยโมเดล ML ไปยังพื้นที่จัดเก็บ DB ของเราเพื่อการดึงข้อมูลที่รวดเร็วและจำนวนมาก สำหรับทั้งสองวิธี เราเลือกที่จะจัดเก็บคะแนนไว้ในฐานข้อมูลและอัปเดตคะแนนเพื่อตอบสนองความต้องการกรณีการใช้งานที่มีความหน่วงต่ำ วิธีการนี้ทำให้คะแนนใกล้กับการดึงข้อมูลมากขึ้น และสามารถดึงข้อมูลได้ผ่านทางการรวม SQL

  • การซิงค์แบบเต็ม: บริการให้คะแนนความพร้อมใช้งาน ML จะอัปเดตตารางหลายครั้งต่อวันใน Snowflake ด้วยคะแนนความพร้อมใช้งานที่รีเฟรชของรายการ เจ้าหน้าที่นำเข้า DB จะอ่านตารางเกล็ดหิมะเป็นระยะๆ และเพิ่มคะแนนความพร้อมใช้งานสำหรับรายการที่รีเฟรชเพื่อให้แน่ใจว่าไม่มีคะแนนเก่า
  • การรีเฟรชคะแนน Lazy: คะแนนจะได้รับการอัปเดตตามความต้องการโดยอิงจากรายการที่ปรากฏในผลการค้นหาเมื่อเกินอายุที่อนุญาต เพื่อลดความพยายามในระบบออนไลน์ กิจกรรมการรีเฟรชจะเกิดขึ้นในงานเบื้องหลังและใช้ kinesis เพื่อรวมการอัปเดตที่จะนำเข้าไปยัง DB

การรีเฟรชคะแนน Lazy และสถาปัตยกรรมการรีเฟรชการซิงค์แบบเต็ม

ด้วยรายการหลายร้อยล้านรายการ การซิงค์แบบเต็มบ่อยครั้งจึงไม่สามารถปรับขนาดได้หรือมีประสิทธิภาพ เนื่องจากคะแนนไม่เปลี่ยนแปลงในลักษณะที่สำคัญต่อการเปลี่ยนแปลงประสบการณ์ของลูกค้า

เราสังเกตเห็นว่าสินค้าที่มีการค้นหาหรือซื้อบ่อยกว่านั้นมีสัญญาณจากผู้ซื้อมากกว่า ดังนั้นจึงมีการเปลี่ยนแปลงคะแนนบ่อยครั้ง

จากข้อมูลเชิงลึกนั้น เราใช้ผลการค้นหาเป็นตัวกระตุ้นสำหรับการรีเฟรชแบบ Lazy Refresh ซึ่งช่วยให้เราสามารถอัปเดตคะแนนได้บ่อยขึ้นในขณะที่ลดภาระการนำเข้าลง 2/3 เนื่องจากมีองค์ประกอบชั่วคราวในคะแนน เราจึงจำเป็นต้องซิงค์แบบเต็มหลายครั้งต่อวันเพื่อให้แน่ใจว่าทั้งสินค้าส่วนท้ายและสินค้าที่หมดสต๊อกซึ่งถูกกรองไว้แต่เดิมจะมีโอกาสได้รับการอัปเดต

กรอบการทดลองหลายแบบจำลอง

เพื่อเร่งการทดสอบโมเดล ML ของเราโดยใช้โครงสร้างพื้นฐาน RTA ใหม่ เราได้พัฒนาเฟรมเวิร์กการทดลองใหม่ที่ช่วยให้เราสามารถประเมินโมเดลหลาย ๆ แบบด้วยวิธีที่ปรับขนาดได้

กรอบการทำงานสำหรับการซิงค์คะแนนและการทดสอบโมเดล ML ความพร้อมใช้งานแบบเรียลไทม์หลายรายการ

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

กรอบงานมีองค์ประกอบหลักสามประการ:

  • คอลัมน์ DB ต่อรุ่น:ในแนวทางนี้ คะแนนของแต่ละรุ่นจะซิงโครไนซ์กับคอลัมน์เฉพาะภายในตารางฐานข้อมูลตลอดระยะการทดลอง ซึ่งช่วยลดความจำเป็นด้านวิศวกรรมในการปรับเปลี่ยน SQL เพื่อรวมตารางใหม่
  • การจับคู่โมเดล-คอลัมน์:ระบบการกำหนดค่าระดับบริการจับคู่เวอร์ชันโมเดลกับคอลัมน์เฉพาะที่สอดคล้องกัน การกำหนดค่านี้ถูกใช้โดยทั้งระบบรีเฟรชคะแนนแบบซิงค์แบบเต็มและแบบ Lazy เพื่อดึงข้อมูลสำหรับเวอร์ชันทั้งหมดในการกำหนดค่า
  • การแมปการทดสอบ-คอลัมน์: ขณะนี้การทดสอบ A/B ที่มีคะแนนเชื่อมโยงกับคอลัมน์เฉพาะ/โมเดล ML ดำเนินการได้อย่างง่ายดายด้วยแฟล็กคุณลักษณะเฉพาะที่เชื่อมโยงกับแต่ละคอลัมน์ นอกจากนี้ กรอบงานยังสนับสนุนการกำหนดคอลัมน์ที่กำหนดสำหรับประสบการณ์เริ่มต้น/การควบคุม

เฟรมเวิร์กนี้ได้ลดงานวิศวกรรมลงอย่างมากสำหรับการดำเนินการทดสอบโมเดล ML ใหม่ควบคู่กันไป การกำหนดค่าระดับบริการได้รับการอัปเดตเพื่อเพิ่มการแมประหว่างเวอร์ชันโมเดลใหม่และคอลัมน์ DB เพื่อเปิดใช้โมเดล ML ใหม่ ขณะนี้กระบวนการซิงค์แบบเต็มและแบบ Lazy จะใช้ข้อมูลนี้เพื่อซิงโครไนซ์คะแนนสำหรับเวอร์ชันใหม่ในระหว่างรอบถัดไป เมื่อการซิงค์แบบเต็มทำงานอย่างน้อยหนึ่งครั้ง ธงคุณลักษณะที่เกี่ยวข้องกับโมเดลใหม่จะถูกนำมาใช้เพื่อทำการทดสอบและกำหนดจุดปฏิบัติการที่เหมาะสมที่สุด เมื่อเรียกใช้การทดสอบ การแมปจะได้รับการอัปเดตเพื่อกำหนดคอลัมน์โมเดล ML ที่ชนะให้กับประสบการณ์เริ่มต้น/การควบคุม ด้วยเหตุนี้ คอลัมน์ก่อนหน้านี้จึงพร้อมใช้งานสำหรับการซิงค์และประเมินโมเดล ML อื่น

กรอบเดลต้า

แม้ว่าโมเดล ML จะพิจารณาคุณลักษณะหลายร้อยรายการ แต่ก็มีกลุ่มเฉพาะที่ต้องเลือกจุดปฏิบัติงานแยกต่างหากบนเส้นโค้งอัตราการคัดเลือกที่พบ เนื่องจากความจำเป็นทางธุรกิจ (ครอบคลุมใน "ส่วนที่ 1") สิ่งนี้จำเป็นต้องมีเกณฑ์ที่แตกต่างกัน (จุดปฏิบัติการ) สำหรับเซ็กเมนต์ที่แตกต่างกันเมื่อกรองรายการในเลเยอร์ SQL ความซับซ้อนนี้เพิ่มขึ้นอย่างมากเมื่อเราทดลองกับโมเดล ML ใหม่และต้องการเพิ่มประสิทธิภาพกลุ่มต่างๆ เพิ่มเติม ตัวอย่างเช่น เมื่อทดลองกับโมเดล ML สามโมเดลและเพิ่มประสิทธิภาพสำหรับหมวดหมู่ผลิตภัณฑ์เฉพาะสามหมวดหมู่ ผู้ค้าปลีกสี่ราย สองภูมิภาค และกลุ่มผู้ใช้แปดกลุ่มสามารถนำไปสู่ชุดค่าผสม 576 รายการและค่าเกณฑ์สำหรับแต่ละรายการ

total_combinations (576) =
num_models (3) * num_products (3) * num_retailers(4)*
num_inventory_areas(2) * num_user_buckets(8)

เพื่อแก้ปัญหาแบบผสมผสานที่เกิดจากการมีค่าเกณฑ์สำหรับชุดค่าผสมแต่ละชุด เราได้แนะนำ "ตัวแก้ไขเกณฑ์" และ "กรอบงานเดลต้า"

ตัวแก้ไขเกณฑ์จะกำหนดเกณฑ์พื้นฐานสำหรับโมเดล ML ต่างๆ ที่อยู่ระหว่างการทดลอง เกณฑ์เหล่านี้เป็นจุดที่เหมาะสมที่สุดบนเส้นโค้งอัตราการเลือกที่พบโดยเฉพาะสำหรับโมเดล ML แต่ละรุ่น และมักพบผ่านการทดลอง นอกจากนี้ เกณฑ์เหล่านี้ยังได้รับการปรับปรุงเป็นประจำเมื่อเงื่อนไขของตลาดเปลี่ยนแปลง

กรอบงานเดลต้าใช้เดลต้าคงที่ทั้งเชิงบวกและเชิงลบกับเกณฑ์พื้นฐาน เกณฑ์สุดท้ายจะถูกคำนวณ ณ รันไทม์โดยใช้เดลตาที่เกี่ยวข้องทั้งหมดที่ด้านบนของเกณฑ์ฐาน เมื่อมีสิทธิ์หลายกลุ่ม ส่วนเดลต้าจะซ้อนกันและใช้ร่วมกัน

ภาพประกอบของวิธีการใช้เดลต้าเพื่อให้เกิดเกณฑ์ที่แตกต่างกันสำหรับกลุ่ม

แนวทางนี้นำเสนอความเป็นโมดูล ทำให้สามารถปรับเกณฑ์หรือเดลต้าได้อย่างอิสระโดยไม่ส่งผลกระทบต่อส่วนประกอบอื่นๆ นอกจากนี้ยังช่วยให้ทดลองโมเดล ML ได้อย่างง่ายดายโดยไม่จำเป็นต้องค้นหาจุดที่เหมาะสมที่สุดสำหรับทุกกลุ่ม แต่เพียงเกณฑ์พื้นฐานเท่านั้น ด้วยค่า DB เฟรมเวิร์ก Deltas ช่วยให้ดำเนินการอย่างรวดเร็วและแม่นยำกับเซ็กเมนต์เฉพาะที่มีความซับซ้อนขนาดพอดีคำ ตัวอย่างเช่น ในช่วงที่แป้งเด็กสูตรขาดแคลน เมื่ออัตราที่พบลดลงอย่างมากสำหรับหมวดหมู่ผลิตภัณฑ์นั้น ทีมงานของเราได้ปรับเดลตาสำหรับหมวดหมู่ผลิตภัณฑ์เฉพาะนี้ ซึ่งอำนวยความสะดวกในการเปลี่ยนแปลงในสมดุลของกราฟอัตราการคัดเลือกที่พบโดยไม่ทำการเปลี่ยนแปลงที่สอดคล้องกัน ไปยังส่วนหรือเกณฑ์อื่นๆ

ไดนามิกเดลต้า

แม้ว่า Deltas จะให้ความยืดหยุ่นในการเพิ่มประสิทธิภาพแต่ละกลุ่มตามอัตรา Selection-Found แต่ก็เห็นได้ชัดว่าเมื่อจำนวนกลุ่มเพิ่มขึ้น การปรับเปลี่ยนอย่างอิสระเหล่านี้ไม่ได้นำไปสู่จุดที่เหมาะสมที่สุดทั่วโลกตลอดเส้นอัตรา Selection-Found ยิ่งไปกว่านั้น เมื่อสภาพแวดล้อมของตลาดมีการพัฒนา จึงมีความจำเป็นในการปรับค่าจำนวนมากให้เหมาะสมมากขึ้น เพื่อให้แน่ใจว่าจะได้จุดปฏิบัติการที่เหมาะสมที่สุด พูดง่ายๆ ก็คือ ระบบของเราได้เปลี่ยนจากการเป็นเหมือนจักรยานธรรมดาที่มีคันโยกจำนวนหนึ่ง ไปเป็นรถแข่งที่มีคันโยกหลายคัน แม้ว่าเราจะเร่งความเร็วขึ้น แต่ก็กลายเป็นสิ่งจำเป็นที่จะต้องใช้ระบบอัตโนมัติเพื่อจัดการคันโยกเหล่านี้อย่างมีประสิทธิภาพ

การเพิ่มประสิทธิภาพหลายกลุ่มผ่านลูปความคิดเห็น

เพื่อให้การจัดการคันโยกเหล่านี้เป็นแบบอัตโนมัติ เราได้พัฒนาการปรับให้เหมาะสมแบบหลายส่วน วิธีการนี้จะตรวจสอบการเลือกที่แสดงต่อลูกค้าอย่างต่อเนื่อง อัตราที่พบของการเลือก พฤติกรรมผู้ใช้ (เช่น อัตราการสั่งซื้อและการรักษาลูกค้า) และแนะนำการปรับแบบละเอียด (เดลต้า) สำหรับแต่ละเซ็กเมนต์ ด้วยการวิเคราะห์ตัวชี้วัดระดับลูกค้า ผลลัพธ์สุดท้ายของเกณฑ์และเดลต้า ระบบจะสามารถปรับเดลต้าแยกกันสำหรับแต่ละเซ็กเมนต์ได้อย่างอิสระ และในที่สุดก็ถึงจุดปฏิบัติการที่เหมาะสมที่สุดบนกราฟอัตราการคัดเลือกทั่วโลก

ฟังก์ชันการปรับให้เหมาะสมสำหรับแต่ละเซ็กเมนต์อาจแตกต่างกัน ตั้งแต่การปรับอคติ (ความแตกต่างโดยเฉลี่ยระหว่างอัตราที่พบและคะแนนการคาดการณ์) ไปจนถึงเทคนิคที่ซับซ้อนมากขึ้นซึ่งมีจุดมุ่งหมายเพื่อปรับปรุงการรักษาลูกค้าในระยะยาว การปรับแบบละเอียดจะทำแบบออฟไลน์ ทำให้สามารถสังเกตรูปแบบในช่วงระยะเวลาที่ขยายออกไป และนำแนวทางที่ซับซ้อนไปใช้ เช่น Contextual Bandits

บทสรุป

การคาดการณ์ความพร้อมจำหน่ายสินค้าถือเป็นความท้าทายที่ซับซ้อนและไม่เหมือนใครที่บริษัทอย่าง Instacart ต้องเผชิญ ซึ่งเกี่ยวข้องกับการระบุความพร้อมทางกายภาพของสินค้าหลายล้านรายการในร้านค้าปลีกกว่า 80,000 แห่ง สถานที่แต่ละแห่งดำเนินการด้วยระบบการจัดการสินค้าคงคลังที่เป็นเอกลักษณ์ ทำให้เกิดความท้าทายในการรับรองว่าทุกรายการในคำสั่งซื้อของลูกค้าสามารถดำเนินการได้สำเร็จ แม้จะมีความยากลำบาก การจัดการกับความท้าทายนี้และการบรรลุ “อัตราการค้นพบที่ดี” ที่สูงเป็นสิ่งสำคัญสำหรับการรักษาลูกค้า

จับคู่คุณภาพก่อนโควิด

โควิดเป็นจุดสำคัญในการเดินทางของ Instacart ซึ่งความต้องการของลูกค้าเพิ่มขึ้น ส่งผลให้จุดปฏิบัติการที่มีอัตราการคัดเลือกมีความสมดุล ในช่วงสองสามปีที่ผ่านมา ซึ่งขับเคลื่อนโดยเทคนิค ML ใหม่และระบบวิศวกรรมที่ขับเคลื่อนเทคนิคดังกล่าวตามที่อธิบายไว้ก่อนหน้านี้ Instacart ได้นำคุณภาพของคำสั่งซื้อไปสู่ระดับก่อนเกิดโควิดในระดับใหม่

% ของคำสั่งซื้อที่มีรายการทั้งหมดที่พบ (ปรับขนาดเพื่อแสดงแนวโน้ม)

การตั้งค่าความคาดหวังของลูกค้า

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

% ของสินค้าที่สั่งซื้อซึ่งมีอยู่ในสต็อกสูง (ปรับขนาดเพื่อแสดงแนวโน้ม)

ความสามารถในการทดลอง

กรอบงาน Thresholds & Delta ช่วยให้สามารถทำการทดลองหลายรายการพร้อมกันในโมเดล ML ใหม่ และเพิ่มประสิทธิภาพจุดปฏิบัติการของอัตราการเลือกที่พบสำหรับเซ็กเมนต์ต่างๆ เราเห็นการทดสอบเพิ่มขึ้น 6 เท่าที่ทำงานโดยใช้เฟรมเวิร์กใหม่

ไปรษณีย์

แม้ว่าเราจะก้าวหน้าไปมากแล้ว แต่งานก็ยังต้องทำต่อไป โรเบิร์ต ฟรอสต์เคยกล่าวไว้ว่า “ต้องไปอีกไกลก่อนที่ฉันจะนอน” ที่ Instacart เราตระหนักถึงหนทางข้างหน้าในการแก้ไขปัญหาความพร้อมใช้งานและเกินความคาดหวังของลูกค้า ความก้าวหน้าที่เราได้รับในด้านประสบการณ์ผลิตภัณฑ์ ความสามารถของ ML และโครงสร้างพื้นฐานทางวิศวกรรมในปีที่ผ่านมาได้เร่งการค้นพบโซลูชันใหม่ๆ และปลดล็อกศักยภาพสำหรับนวัตกรรมที่ก้าวล้ำ เรายังคงมุ่งมั่นที่จะใช้ประโยชน์จากเทคโนโลยีและขับเคลื่อนความก้าวหน้าในการแก้ปัญหาความท้าทายที่ซับซ้อนนี้

เราขอขอบคุณสมาชิกคนสำคัญต่อไปนี้ที่มีบทบาทสำคัญในการสร้างระบบวิศวกรรม

  • ML: อัลลัน สจ๊วร์ต, แจ็ค เหอ, ชิชีร์ คูมาร์, อี้หมิง ลู่
  • ML อินฟรา: Guanghua Shu
  • อังกฤษ: Damon Ding, Michael Prescott, Yanhua Liu, Thomas Cheng, Frank Chung, Jason Shao, James Liew
  • ภาษาอังกฤษอินฟรา: Marco Montagna, Ankit Mittal