Streamlit의 Rerun 없이 PyTorch 모델 데모를 구현하는 방법: Violit

안녕하세요, 현업에서 AI팀을 이끌며 연구와 개발을 병행하고 있는 개발자입니다.

PyTorch로 모델을 개발한 뒤, 내부 시연이나 외부 데모를 위해 Streamlit이나 Gradio를 많이 사용하실 겁니다. 저 역시 그 직관적인 문법을 매우 좋아하지만, 프로젝트 규모가 커지거나 데이터셋이 헤비해질수록 한계에 부딪히곤 했습니다.

연구자/엔지니어로서 느꼈던 Pain Points

  • 지옥의 Full-Script Rerun : 슬라이더 하나만 움직여도 스크립트 전체가 처음부터 끝까지 다시 실행되는 구조 때문에, 복잡한 후처리 로직이 포함된 앱은 로딩 스피너를 무한히 보게 됩니다.

  • 상태 관리의 어려움 : 인터랙션이 많아질수록 캐싱(@st.cache)만으로는 해결되지 않는 상태 꼬임 현상이 발생합니다.

  • 데모 그 이상의 한계 : 데모를 넘어 실제 서비스(MVP) 수준으로 UI를 커스터마이징하거나 성능을 최적화하기가 어렵습니다.

이런 고민을 해결하고자, "Streamlit의 사용성을 유지하면서 React의 반응성을 가진" 새로운 파이썬 웹 프레임워크 Violit을 만들게 되었습니다.

Violit이 PyTorch 유저에게 주는 가치

  1. Fine-grained Reactivity (No Rerun) : 스크립트 전체를 다시 읽지 않습니다. Solid.js의 Signal 개념을 도입하여, 변수(State)가 변한 특정 컴포넌트만 정밀하게 업데이트합니다.

  2. 압도적인 대용량 데이터 처리 : 100만 개의 데이터 포인트를 렌더링하는 데 단 24ms면 충분합니다. (Streamlit 대비 약 12배 이상의 성능 우위)

  3. 제로 러닝 커브 : Streamlit 사용자라면 10분 안에 적응할 수 있을 만큼 API가 유사합니다.

  4. Modern & Beautiful UI : 별도의 CSS 없이도 사이버펑크, 드라큘라 등 20여 가지 테마를 코드 한 줄로 적용할 수 있어, 모델 데모의 퀄리티가 비약적으로 상승합니다.

  5. Desktop App Mode 지원 : 웹 서비스뿐만 아니라 pywebview를 통해 별도의 코드 수정 없이 데스크톱 앱 모드로도 실행 가능합니다.

PyTorch 모델 서빙 예시 코드

import violit as vl
import torch

app = vl.App(title="PyTorch Model Demo")
# 상태 선언 (Rerun 없이 이 값만 변화함)
input_data = app.state("Sample input")
result = app.state("Waiting for inference...")

def run_inference():
    # 모델 추론 로직 (전체 스크립트 재실행 없이 이 함수만 실행)
    # output = model(torch.tensor(...))
    result.set(f"Result for {input_data.value}")

app.text_input("Input Data", value=input_data)
app.button("Run Inference", on_click=run_inference)
app.text("Inference Result:", result)

app.run()

현재 v0.1.12 버전으로 빠르게 발전하고 있으며, 모든 코드는 오픈소스로 공개되어 있습니다. 파이토치 모델의 성능을 UI에서도 그대로 느끼고 싶으신 분들께 Violit이 좋은 대안이 되었으면 합니다.

부족한 점이 많지만, 오픈소스 첫 발걸음에 많은 피드백과 응원 부탁드립니다..!!

2개의 좋아요

안녕하세요, 알리바바 Wan 모델 리액티브 데모 앱을 만들 프레임워크를 찾다가 Steamlit이 너무느리고 Violit이 적합해보여서 잘 구축해서 사용하고 있습니다. 좋은 프레임워크 개발해주셔서 감사합니다. ~!

한번 놀러오세요~!

http://qwen.modelstudiokorea.ai:8080/