3P by GN⁺ | ★ favorite | 댓글 1개
  • 과학 데이터 시각화는 대용량·고차원 데이터와 실시간 분석 요구 때문에 병목이 커졌고, fastplotlib은 이를 GPU 가속 플로팅으로 줄이려는 Python 라이브러리임
  • WGPU 기반 렌더링으로 대규모 데이터 탐색, 빠른 프로토타이핑, 알고리듬 설계, 계측기용 실시간 수집 시스템 구축을 지원함
  • 배열 중심 API를 채택해 초기 플롯 이후에도 NumPy식 인덱싱으로 색상·컬러맵·데이터 같은 그래픽 속성을 동적으로 바꿀 수 있음
  • 콜백 기반 이벤트 시스템으로 클릭 같은 사용자 상호작용을 정의하며, 예제에서는 클릭 위치와 가장 가까운 원을 찾아 색상을 바꾸는 흐름을 구성함
  • 렌더링은 pygfx 위에 추상화되고 WGPU를 통해 Vulkan, Metal, DX12를 대상으로 하므로, OpenGL 중심 도구보다 현대 GPU 활용에 초점을 둠

fastplotlib이 겨냥한 과학 시각화 병목

  • fastplotlibWGPU를 활용하는 GPU 가속 과학 플로팅 라이브러리로, 빠르고 인터랙티브한 시각화를 목표로 함
  • 과학 시각화가 어려워지는 이유는 대체로 다음과 같음
    • 데이터가 테라바이트 규모에 이를 수 있고 고차원인 경우가 많음
    • 계산 자원을 효율적으로 쓰기 어려움
    • 많은 도구가 정적 플롯 중심이거나 대용량 데이터에 잘 확장되지 않음
    • 데이터 생성 속도에 비해 시각화가 늦어 실시간 분석이 지연됨
  • fastplotlib은 고성능·인터랙티브 시각화를 위해 다음 용도를 강조함
    • GPU 가속 시각화
    • 빠른 프로토타이핑과 알고리듬 설계
    • 대규모 데이터 탐색과 빠른 렌더링
    • 계측기용 실시간 수집 시스템 생성
  • 대부분의 사용 사례에는 최신 통합 GPU로 충분함

정적 플롯을 넘어선 인터랙티브 탐색

  • 전통적인 과학 시각화는 정적 플롯에 의존해 왔지만, 동적·인터랙티브 시각화는 데이터 탐색과 분석을 더 직접적으로 만듦
  • 예시로 Olivetti faces dataset의 공분산 행렬을 fastplotlib으로 인터랙티브하게 시각화함
    • 왼쪽 서브플롯은 Olivetti faces dataset의 공분산 행렬을 표시함
    • 공분산 행렬의 각 항목은 두 픽셀의 강도가 함께 어떻게 변하는지를 나타냄
    • 오른쪽 서브플롯은 현재 선택된 공분산 행렬 행을 재구성한 이미지임
    • 선택자를 움직이면 보고 있는 행을 쉽게 바꿀 수 있음
  • 공분산 행렬만 정적으로 보는 것보다, 각 행의 재구성 이미지를 함께 보면 데이터셋 내 얼굴에서 픽셀 강도가 어떻게 변하는지 더 잘 파악할 수 있음
  • 이 예시는 공분산 행렬 자체를 깊게 분석하기보다, 작은 수준의 상호작용만으로도 데이터 이해가 좋아질 수 있음을 보여줌
  • fastplotlib은 고수준 인터랙티브 플롯을 만들 수 있는 메커니즘을 제공해 과학 시각화의 활용 범위를 넓히려 함

배열처럼 다루는 API

  • Python 과학 시각화 생태계에는 오픈소스 도구가 많지만, 일부 라이브러리는 복잡한 API 때문에 과학자와 사용자의 진입 장벽이 높음
  • fastplotlib은 빠른 인터랙티브 시각화를 직관적인 API로 제공하려 함
  • 핵심 설계는 시각화 안의 데이터를 배열 이외의 것으로 생각하지 않아도 되게 만드는 것임
  • 데이터가 익숙한 배열형 구조를 유지하면 시각화와의 상호작용도 단순해짐
  • 예제에서는 사인파를 그린 뒤, NumPy 스타일 인덱싱으로 세 번째마다 한 점의 색을 빨간색으로 바꿈
sine_wave.colors[::3] = "red"
  • 이 방식으로 처음 플롯한 이후에도 그래픽의 여러 속성을 동적으로 조작할 수 있음
    • 컬러맵
    • 색상
    • 데이터
  • 배열형 API는 fastplotlib을 유연하고 직관적으로 쓰게 만들기 위한 기반임

콜백으로 구성하는 이벤트 시스템

  • fastplotlib은 이벤트 시스템도 단순하게 다룰 수 있도록 설계함
  • 그래픽이나 플롯 사이의 이벤트는 콜백 함수로 정의할 수 있고, 이를 통해 인터랙티브 시각화를 만들고 확장할 수 있음
  • 클릭 이벤트 예제는 다음 흐름으로 동작함
    • 여러 원 데이터를 생성함
    • add_line_collection으로 원들을 플롯에 추가함
    • 렌더러에 "click" 이벤트 핸들러를 등록함
    • 클릭 위치를 화면 좌표에서 월드 좌표로 변환함
    • 클릭 위치와 가장 가까운 그래픽을 찾음
    • 가장 가까운 원의 색을 흰색으로 바꿈
  • 이벤트 처리는 먼저 동작을 함수로 정의한 뒤, 해당 그래픽이나 플롯에 핸들러를 추가하는 방식임
  • 사용자는 복잡한 라이브러리 전용 API를 새로 익히기보다, 함수를 정의하는 방식으로 상호작용을 구성할 수 있음

최신 GPU와 그래픽 API 활용

  • GPU는 과학 작업에서 사실상 전제 조건에 가까워졌고, 시각화도 예외가 아님
  • 고해상도 시각화를 성능 좋게 만들려면 GPU의 계산 자원을 최대한 활용해야 함
  • fastplotlib 예제는 300만 개 포인트를 플로팅하면서 다음 작업을 수행함
    • 선을 플로팅함
    • 확대와 축소를 수행함
    • 선의 컬러맵을 변경함
    • 특정 포인트의 색상을 개별적으로 변경함
  • 다른 Python 과학 시각화 라이브러리에서는 이만큼 많은 포인트를 한 번에 플로팅하고 포인트 색상을 세밀하게 제어하기 어려움
  • fastplotlib은 pygfx 렌더링 엔진 위에 추상화되어 있음
  • pygfx는 WGPU로 구동되며, WGPU는 플랫폼별로 다음 그래픽 API를 대상으로 함
    • Linux: Vulkan
    • Mac: Metal
    • Windows: DX12
  • Vulkan, Metal, DX12는 OpenGL보다 빠르고 효율적이며 GPU 하드웨어를 더 잘 활용하는 새 그래픽 API임
  • fastplotlib이 pygfx 위에 만들어진 이유는 카메라, 렌더러, 장면 같은 저수준 렌더링 엔진 세부사항과 반복 코드를 추상화해 사용자가 데이터에 집중하게 하기 위함임

문서와 이어질 내용

  • fastplotlib은 사용하기 쉬운 배열형 API와 최신 그래픽 하드웨어를 결합해 Python 과학 시각화의 현재 문제를 다루려 함
  • 문서와 예제는 fastplotlib 문서에서 제공됨
    • 사용자 가이드
    • 시작 방법
    • 예제 갤러리
  • 질문이나 대화는 GitHub Issue 또는 Discussion을 통해 받음
  • 향후 fastplotlib 사용 예제와 기반 그래픽 기술을 더 깊게 다루는 글이 추가될 예정임

댓글과 토론

Hacker News 의견들
  • 2주마다 GitHub에서 이런 도구를 찾아보는데, 이건 꽤 유망해 보임
    통계유전학에서는 맨해튼 플롯이라는 아주 큰 산점도를 만들고 https://en.wikipedia.org/wiki/Manhattan_plot 규모별 시각화를 위해 특화된 소프트웨어를 많이 써야 함
    어떤 모습인지 보려면 https://my.locuszoom.org/gwas/236887/ 참고하면 되고, 직접 써보는 게 기대됨

    • 흥미로운 사용 사례로 보임
      시각화 중 문제가 생기거나 도움이 필요하면 저장소에 이슈를 올려주면 좋겠고, 맨해튼 플롯 예제 데모를 추가하는 것도 생각해볼 수 있음
    • R에서 ggplot2를 쓴다면 ggrastr 패키지, 특히 ggrastr::geom_point_rast 도 고려해볼 만함
    • 이런 대규모 산점도는 클레임 시각화와 사기 탐지에도 유용함
    • ManimGL은 써봤는지 궁금함
      https://github.com/3b1b/manim/releases
      정말 훌륭하고, Cursor용 MCP로도 만들 수 있음
  • 매우 유망해 보이고, 이 도구가 열어주는 가능성에 맞춰 내 시각화 사례들을 다시 생각해봐야겠음
    간헐적으로 Rerun이라는 “로보틱스 스타일 데이터 시각화” 앱을 지켜보고 있었음 https://rerun.io
    구조도 어느 정도 비슷함 https://github.com/rerun-io/rerun/blob/main/ARCHITECTURE.md 둘 다 Wgpu를 쓰고, egui/imgui, Rust와 Python 조합임
    Rerun 스택은 WASM으로 컴파일되어 브라우저에서도 동작함
    용도는 다르지만 어느 정도 겹쳐 보이고, 과학이나 로보틱스 작업을 하진 않아서 실현 가능성에 대해서는 판단하기 어려움

  • 최신 CPU가 R이나 Python의 ggplot2, seaborn, plotnine 같은 도구로 10만 개 정도의 점을 그리는 데 오래 걸리는 게 늘 흥미로웠음
    그런데 486DX 50MHz는 Doom을 인터랙티브하고 부드럽게 돌릴 만큼 픽셀을 뿌려댈 수 있었음

    • 이 Stack Overflow 스레드가 ggplot이 각 작업에 시간을 얼마나 쓰는지 분석함
      https://stackoverflow.com/questions/73470828/ggplot2-is-slow...
      시각 출력을 만드는 데 GPU 통합을 더 잘한다고 해서 속도가 크게 오를지는 잘 모르겠음
    • R 쪽에서는 주로 ggplot2가 정말 느려서 그런 것 같음
      Base R 그래픽은 10만 개 점을 약 100ms 안에 그릴 수 있음
      x <- rnorm(100000) / plot(x)
      파일로 쓰는 간단한 벤치마크에서도 png("file.png"), plot(x), dev.off()를 실행하면 elapsed가 약 0.180초임
    • 백만 개 점 같은 비교적 큰 데이터셋에 대한 최적화에는 아무도 별로 신경 쓰지 않는 듯하고, 아마 흔한 사용 사례가 아닐 수도 있음
      이런 데이터셋을 렌더링할 수 있는 라이브러리도 피크를 건너뛰거나, 잡음 데이터의 내부 분포 대신 검은 사각형을 보여주는 식으로 잘못 처리하는 경우가 있음
      결국 수백만 개 점을 보여줄 수 있는 도구를 직접 만들었고, 그 뒤로는 돌아보지 않게 됨
  • WGPU를 쓴다는 점이 흥미로운 확장 가능성을 시사함
    WGPU가 WebGPU의 Python 네이티브 구현처럼 보이는데, 다른 댓글들처럼 데이터가 사용자 로컬이 아니라 클러스터의 머신에 있다는 걸 안다면 서버를 띄우고 포트를 열어 HTTP로 데이터를 넘겨 브라우저에서 렌더링하는 방식이 말이 됨
    그러면 연구실 안에서 공유하기도 쉬워짐
    한계는 HTTP를 통한 데이터 대역폭, 예를 들어 300만 점 사례겠지만 더 단순한 경우에는 매우 유용해 보임
    결국 플롯 점들을 HTTP로 전송해 브라우저의 WebGPU 인터페이스에 효율적으로 넘기는 프로토콜 정의가 흥미로운 과제가 됨
    서버 쪽 전처리로 더 효율적인 표현도 가능할지 모름

    • 데이터가 클러스터 머신에 있고 사용자 로컬에 없을 때는 jupyter-rfb로 원격 렌더링을 할 수 있음
      원격 프레임 버퍼에 렌더링하고 JPEG 바이트 스트림으로 전송하는 방식임
      우리와 여러 과학 분야 사용자들이 이렇게 쓰고 있음
      https://fastplotlib.org/ver/dev/user_guide/faq.html#what-fra...
      플롯 점 전송 프로토콜을 정의하는 건 Cyrille Rossant가 작업하는 GSP에 더 가까워 보이고, 사용 사례가 조금 다름
    • WGPU는 Python 쪽이라기보다 Rust 쪽 기술에 가까움
    • 설명한 방식은 Graphistry와 약간 비슷하게 들림
      https://pygraphistry.readthedocs.io/en/latest/performance.ht...
  • 최근 발표 녹화를 보고 지난주에 드디어 시도해보기로 했음
    목표는 인터랙티브 네트워크 시각화를 만드는 것으로, 노드와 엣지를 클릭하거나 박스 선택해서 부분 그래프를 강조하는 기능은 콜백과 선택기로 가능해 보임
    아직 많이 진행하진 못했지만, 뭔가 알아내면 예제를 기꺼이 기여하고 싶음
    언젠가 해보고 싶은 것 중에는 Shadertoy를 fpl 서브플롯에 인터랙티브하게 렌더링하고, 브라우저에서 인터랙티브하게 실행하며, 네트워크 레이아웃은 GPU에서 컴퓨트 셰이더로 처리하는 것도 있음
    마지막 부분은 fpl 범위 밖일 듯함

    • wgpu-py 관련 작업을 본 적 있음
      도움이 필요하거나 아이디어가 있으면 알려주면 좋겠고, main 브랜치라면 최근 양방향 이벤트를 허용하는 PR이 병합됐음
  • 꽤 설득력 있어 보이지만, Jupyter 노트북에서 어떻게 동작하는지 또는 아예 동작하는지에 대한 답은 없어 보임
    GPU 가속이 클라이언트 쪽, 예컨대 JavaScript에서 되는지, 서버 쪽 커널에서 되는지, 아니면 둘 다 선택 가능한지 궁금함
    Google Colab에서 빠르다고 하는 시각화 라이브러리를 써봤지만, 30fps로 갱신되는 대신 클릭 후 2초가 걸렸음
    새 이미지가 렌더링된 뒤 Jupyter 커넥터와 네트워크를 통해 전송되어야 해서 정말 느려질 수 있음

  • 처리 가능한 데이터 포인트 수가 대략 어느 정도인지 숫자가 있는지 궁금함
    예를 들어 산점도에서 수백만 개 데이터 포인트를 그릴 수 있게 해주는지 알고 싶음

    • 가능함
      데이터 포인트 수는 수백만 개 범위까지 갈 수 있고, 솔직히 GPU 성능이 한계가 됨
      다만 대부분의 사용 사례에서는 내장 GPU로 충분함
      참고로 2017년형 중급 내장 GPU에서 300만 개 넘는 점을 그려본 적 있음
      이런 지표는 많은 사람에게 도움이 될 것 같아서 문서 어딘가에 추가해보겠음
  • HoloViz와 비교하면 어떤지 궁금함
    https://holoviz.org/
    온라인 워크숍 하나를 따라가봤는데 정말 강력해 보였지만, 어느 부분이 무엇을 하는지 약간 헷갈렸음
    기본적으로 6~7개 프로젝트를 한 우산 아래 묶은 형태임

    • Fastplotlib은 bokeh나 holoviz와 매우 다르고, 사용 사례도 다름
      내가 아는 한 bokeh와 holoviz는 데이터를 JavaScript 프론트엔드로 보내서 그리는 반면, Fastplotlib은 모든 작업을 Python 쪽에서 처리하고 Jupyter에서 쓸 때는 jupyter_rfb로 압축된 프레임 버퍼를 보냄
      Fastplotlib은 Qt와 glfw 기반 네이티브 데스크톱 앱으로도 동작하는데, 이 점도 bokeh/holoviz와 크게 다름
      원시 렌더링 속도도 더 높아서 데스크톱에서 4K 영상을 60Hz로 스크롤하면서 수천 개의 추가 객체를 표시할 수 있음
      bokeh로는 그런 걸 해본 적이 없고, 몇 년 동안 써보지 않아 지금은 바뀌었는지는 모름
      이벤트 시스템도 꽤 다르고, Fastplotlib에서는 API를 단순한 함수 콜백으로 유지하려고 함
      결국 자기 사용 사례에 가장 맞는 도구를 쓰면 됨
    • 큰 차이 하나는 Fastplotlib이 GPU 기술 기반이라 훨씬 큰 데이터셋을 인터랙티브하게 렌더링할 수 있다는 점임
  • 정말 멋져 보이고 써보는 게 기대됨
    이런 GPU 플로팅 라이브러리의 킬러 기능은 torch/jax CUDA 배열을 직접 받아서 느린 CPU 경유 전송을 요구하지 않는 것이라고 봄

    • 좋은 질문이고, 우리도 씨름해온 부분임
      우리가 아는 한 GPU에서 서로 다른 컨텍스트가 설정되는 방식 때문에 현재는 불가능함
      https://github.com/pygfx/pygfx/issues/510
      써보진 않았지만 tinygrad는 torch와 비슷해 보이고 WGPU 백엔드가 있음
      https://github.com/tinygrad/tinygrad
    • Python Array API 표준을 활용할 수 있을지 궁금함
      아니면 계산에 더 적합한 표준인지도 궁금함
    • 메모리 전송 병목과 완화책은 잘 모르겠지만, 흥미 차원에서 Fastplotlib을 WGPU 대신 JAX 가속을 쓰도록 “개조”하는 게 얼마나 어려울지 궁금함
  • 신경과학 시각화를 만드는 건 아니고, 주로 선 그래프를 다루며 약 1만 개 점 기반 애니메이션을 만들고 싶음
    이 시각화를 YouTube용 영상으로 변환하고 싶고, HD에 60fps, HEVC/H.265 코덱을 쓰고 싶음
    문서를 잠깐 봤지만 가능한지 찾지 못했음
    이런 렌더링이 지원되거나 지원될 예정인지 궁금함
    예전에 matplotlib로 시도했을 때는 단일 렌더링을 만드는 데 20~30분이 걸렸음
    matplotlib은 CPU 단일 코어만 쓰고 GPU 가속을 지원하지 않기 때문임
    Manim도 시도했지만 실제 영상 파일을 얻지 못했고, OpenGL은 다루기가 좀 복잡해 보였음
    GPU 가속 데이터 시각화 도구가 Vulkan을 활용할 수 있다는 전망이 기대되고, 이 라이브러리가 내 사용 사례를 커버해주길 바람