- การแสดงผลข้อมูลทางวิทยาศาสตร์กลายเป็นคอขวดมากขึ้นจากข้อมูลขนาดใหญ่และมิติสูง รวมถึงความต้องการวิเคราะห์แบบเรียลไทม์ โดย 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"
- ด้วยวิธีนี้ แม้หลังจากพล็อตครั้งแรกแล้ว ก็ยังสามารถปรับคุณสมบัติต่าง ๆ ของกราฟิกได้แบบไดนามิก
- 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 และเทคโนโลยีกราฟิกพื้นฐาน
ยังไม่มีความคิดเห็น