การซิงค์ข้อมูล

กลไกการกำหนดเวลา

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

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

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

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

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

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

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

การซิงค์การประทับเวลา

การดำเนินการกับกราฟ MediaPipe จะกระจายศูนย์: ไม่มีนาฬิกาส่วนกลางและโหนดต่างๆ ประมวลผลข้อมูลจากการประทับเวลาที่ต่างกันได้ในเวลาเดียวกัน ซึ่งจะทำให้อัตราการส่งข้อมูลสูงขึ้นผ่านไปป์ไลน์

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

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

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

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

นโยบายอินพุต

การซิงค์จะจัดการภายในแต่ละโหนดโดยใช้นโยบายอินพุตที่โหนดระบุไว้

นโยบายอินพุตเริ่มต้นที่กำหนดโดย DefaultInputStreamHandler จะมีการซิงค์อินพุตที่กำหนดพร้อมการรับประกันดังต่อไปนี้

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

  • ชุดอินพุตจะได้รับการประมวลผลตามลำดับการประทับเวลาจากน้อยไปมากอย่างเคร่งครัด

  • ไม่มีแพ็กเก็ตสูญหายและการประมวลผลจะเป็นไปอย่างเต็มที่

  • โหนดจะพร้อมประมวลผลข้อมูลโดยเร็วที่สุดตามการรับประกันข้างต้น

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

ระบบจะชำระการประทับเวลาในสตรีมหลายรายการ หากมีการประทับเวลาในแต่ละสตรีม นอกจากนี้ หากมีการชำระการประทับเวลาแล้ว ก็หมายความว่าการประทับเวลาก่อนหน้าทั้งหมดมีการชำระด้วย ดังนั้นการประทับเวลาที่ตกลงแล้วจะสามารถประมวลผลตามลำดับ จากน้อยไปมากได้

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

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

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

การควบคุมการรับส่งข้อมูล

กลไกการควบคุมการไหลมี 2 กลไกหลัก กลไก Backpressure จะควบคุมการดำเนินการของโหนดอัปสตรีมเมื่อแพ็กเก็ตที่บัฟเฟอร์ในสตรีมถึงขีดจำกัด (กำหนดค่าได้) ที่กำหนดโดย CalculatorGraphConfig::max_queue_size กลไกนี้จะรักษาลักษณะการทำงานที่กำหนดเอาไว้ และรวมถึงระบบการหลีกเลี่ยงการติดตายที่ผ่อนปรนขีดจำกัดที่กำหนดไว้เมื่อจำเป็น

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

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