• การแสดงผลข้อมูลทางวิทยาศาสตร์กลายเป็นคอขวดมากขึ้นจากข้อมูลขนาดใหญ่และมิติสูง รวมถึงความต้องการวิเคราะห์แบบเรียลไทม์ โดย fastplotlib เป็นไลบรารี Python ที่มุ่งลดปัญหานี้ด้วยการพล็อตกราฟแบบเร่งความเร็วด้วย GPU
  • รองรับ การสำรวจข้อมูลขนาดใหญ่, การทำต้นแบบอย่างรวดเร็ว, การออกแบบอัลกอริทึม และการสร้างระบบเก็บข้อมูลแบบเรียลไทม์สำหรับเครื่องมือวัด ด้วยการเรนเดอร์บนพื้นฐาน WGPU
  • ใช้ API ที่เน้น array เป็นศูนย์กลาง ทำให้หลังจากพล็อตครั้งแรกแล้ว ก็ยังสามารถเปลี่ยนคุณสมบัติของกราฟิก เช่น สี, colormap และข้อมูล ได้แบบไดนามิกด้วยการทำ indexing สไตล์ NumPy
  • ระบบอีเวนต์แบบ callback ใช้กำหนดการโต้ตอบของผู้ใช้ เช่น การคลิก โดยตัวอย่างประกอบเป็นลำดับการทำงานที่หาวงกลมที่อยู่ใกล้ตำแหน่งคลิกที่สุดแล้วเปลี่ยนสี
  • การเรนเดอร์ถูกทำเป็น abstraction อยู่บน pygfx และมุ่งเป้าไปยัง Vulkan, Metal และ DX12 ผ่าน WGPU จึงเน้นการใช้ GPU สมัยใหม่มากกว่าเครื่องมือที่เน้น OpenGL

คอขวดของการแสดงผลทางวิทยาศาสตร์ที่ fastplotlib มุ่งแก้

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

การสำรวจแบบโต้ตอบที่ไปไกลกว่าพล็อตสถิต

  • การแสดงผลทางวิทยาศาสตร์แบบดั้งเดิมพึ่งพาพล็อตสถิตมาโดยตลอด แต่การแสดงผลแบบไดนามิกและโต้ตอบได้ทำให้การสำรวจและวิเคราะห์ข้อมูลตรงไปตรงมามากขึ้น
  • ตัวอย่างคือการแสดงผลเมทริกซ์ covariance ของ Olivetti faces dataset ด้วย fastplotlib แบบโต้ตอบได้
    • subplot ด้านซ้ายแสดงเมทริกซ์ covariance ของ Olivetti faces dataset
    • แต่ละรายการในเมทริกซ์ covariance แสดงว่าความเข้มของพิกเซลสองจุดเปลี่ยนแปลงร่วมกันอย่างไร
    • subplot ด้านขวาเป็นภาพที่ประกอบขึ้นใหม่จากแถวของเมทริกซ์ covariance ที่เลือกอยู่ในปัจจุบัน
    • เมื่อเลื่อนตัวเลือก ก็สามารถเปลี่ยนแถวที่กำลังดูได้อย่างง่ายดาย
  • เมื่อเทียบกับการดูเฉพาะเมทริกซ์ covariance แบบสถิต การดูภาพที่ประกอบใหม่ของแต่ละแถวควบคู่กันช่วยให้เข้าใจได้ดีขึ้นว่าความเข้มของพิกเซลในใบหน้าภายใน dataset เปลี่ยนแปลงอย่างไร
  • ตัวอย่างนี้ไม่ได้มุ่งวิเคราะห์เมทริกซ์ covariance อย่างลึกซึ้ง แต่แสดงให้เห็นว่าเพียงมี การโต้ตอบ ในระดับเล็กน้อย ก็ช่วยให้เข้าใจข้อมูลได้ดีขึ้น
  • fastplotlib พยายามขยายขอบเขตการใช้งานการแสดงผลทางวิทยาศาสตร์ ด้วยการมีกลไกสำหรับสร้างพล็อตแบบโต้ตอบระดับสูง

API ที่ใช้งานเหมือน array

  • ในระบบนิเวศการแสดงผลทางวิทยาศาสตร์ของ Python มีเครื่องมือโอเพนซอร์สจำนวนมาก แต่ไลบรารีบางตัวมี API ซับซ้อน ทำให้มีอุปสรรคในการเริ่มใช้งานสำหรับนักวิทยาศาสตร์และผู้ใช้
  • fastplotlib พยายามนำเสนอการแสดงผลแบบโต้ตอบที่รวดเร็วผ่าน API ที่เข้าใจง่าย
  • แนวคิดหลักของการออกแบบคือทำให้ไม่จำเป็นต้องคิดว่าข้อมูลภายในการแสดงผลเป็นสิ่งอื่นนอกเหนือจาก array
  • เมื่อข้อมูลยังคงอยู่ในโครงสร้างแบบ array ที่คุ้นเคย การโต้ตอบกับการแสดงผลก็เรียบง่ายขึ้น
  • ในตัวอย่าง หลังจากวาดคลื่น sine แล้ว จะเปลี่ยนสีของหนึ่งจุดในทุก ๆ สามจุดเป็นสีแดงด้วย indexing สไตล์ NumPy
sine_wave.colors[::3] = "red"
  • ด้วยวิธีนี้ แม้หลังจากพล็อตครั้งแรกแล้ว ก็ยังสามารถปรับคุณสมบัติต่าง ๆ ของกราฟิกได้แบบไดนามิก
    • colormap
    • สี
    • ข้อมูล
  • API แบบ array เป็นรากฐานที่ทำให้ fastplotlib ใช้งานได้อย่างยืดหยุ่นและเข้าใจง่าย

ระบบอีเวนต์ที่ประกอบด้วย callback

  • fastplotlib ออกแบบให้จัดการระบบอีเวนต์ได้อย่างเรียบง่ายเช่นกัน
  • อีเวนต์ระหว่างกราฟิกหรือพล็อตสามารถกำหนดได้ด้วย ฟังก์ชัน callback และใช้สร้างหรือขยายการแสดงผลแบบโต้ตอบได้
  • ตัวอย่างอีเวนต์คลิกทำงานตามลำดับดังนี้
    • สร้างข้อมูลวงกลมหลายวง
    • เพิ่มวงกลมเข้าไปในพล็อตด้วย add_line_collection
    • ลงทะเบียน handler สำหรับอีเวนต์ "click" ที่ renderer
    • แปลงตำแหน่งคลิกจากพิกัดหน้าจอเป็นพิกัด world
    • หาวัตถุกราฟิกที่อยู่ใกล้ตำแหน่งคลิกที่สุด
    • เปลี่ยนสีวงกลมที่ใกล้ที่สุดเป็นสีขาว
  • การจัดการอีเวนต์เป็นรูปแบบที่กำหนดการทำงานเป็นฟังก์ชันก่อน แล้วจึงเพิ่ม handler ให้กับกราฟิกหรือพล็อตที่เกี่ยวข้อง
  • ผู้ใช้สามารถประกอบการโต้ตอบได้ด้วยการกำหนดฟังก์ชัน แทนที่จะต้องเรียนรู้ API เฉพาะของไลบรารีที่ซับซ้อนใหม่

การใช้ GPU และ Graphics API สมัยใหม่

  • GPU แทบจะกลายเป็นเงื่อนไขตั้งต้นสำหรับงานทางวิทยาศาสตร์แล้ว และการแสดงผลก็ไม่ใช่ข้อยกเว้น
  • หากต้องการสร้างการแสดงผลความละเอียดสูงให้มีประสิทธิภาพดี ต้องใช้ทรัพยากรประมวลผลของ GPU ให้มากที่สุด
  • ตัวอย่างของ fastplotlib พล็อต จุด 3 ล้านจุด พร้อมทำงานต่อไปนี้
    • พล็อตเส้น
    • ซูมเข้าและซูมออก
    • เปลี่ยน colormap ของเส้น
    • เปลี่ยนสีของจุดเฉพาะแบบรายจุด
  • ในไลบรารีแสดงผลทางวิทยาศาสตร์ของ Python ตัวอื่น ๆ เป็นเรื่องยากที่จะพล็อตจุดจำนวนมากขนาดนี้ในครั้งเดียวและควบคุมสีของจุดอย่างละเอียด
  • fastplotlib ถูกทำเป็น abstraction อยู่บนเอนจินเรนเดอร์ pygfx
  • pygfx ขับเคลื่อนด้วย WGPU และ WGPU มุ่งเป้าไปยัง Graphics API ต่อไปนี้ตามแต่ละแพลตฟอร์ม
    • Linux: Vulkan
    • Mac: Metal
    • Windows: DX12
  • Vulkan, Metal และ DX12 เป็น Graphics API รุ่นใหม่ที่เร็วและมีประสิทธิภาพกว่า OpenGL และใช้ประโยชน์จากฮาร์ดแวร์ GPU ได้ดีกว่า
  • เหตุผลที่ fastplotlib สร้างอยู่บน pygfx คือเพื่อ abstraction รายละเอียดของเอนจินเรนเดอร์ระดับต่ำ เช่น กล้อง, renderer, scene และโค้ดซ้ำ ๆ เพื่อให้ผู้ใช้โฟกัสกับข้อมูลได้

เอกสารและเนื้อหาที่จะตามมา

  • fastplotlib พยายามจัดการปัญหาปัจจุบันของการแสดงผลทางวิทยาศาสตร์บน Python ด้วยการผสาน API แบบ array ที่ใช้งานง่ายเข้ากับฮาร์ดแวร์กราฟิกสมัยใหม่
  • เอกสารและตัวอย่างมีให้ที่ เอกสาร fastplotlib
    • คู่มือผู้ใช้
    • วิธีเริ่มต้นใช้งาน
    • แกลเลอรีตัวอย่าง
  • รับคำถามหรือการพูดคุยผ่าน GitHub Issue หรือ Discussion
  • ในอนาคตจะมีบทความเพิ่มเติมที่ลงลึกยิ่งขึ้นเกี่ยวกับตัวอย่างการใช้งาน fastplotlib และเทคโนโลยีกราฟิกพื้นฐาน

ยังไม่มีความคิดเห็น

ยังไม่มีความคิดเห็น