Day_86 02. 프로토타이핑 - Notebook 베이스(Voila)

작성일

4 분 소요

프로토타이핑 - Notebook 베이스(Voila)

1. Notebook 베이스 Voila

Notebook 베이스로 프로토타입 만들기

모델 개발 과정

  • Jupyter Notebook 에서 함수를 작성한 후, 예측 함수를 실행하며 성능 확인

혼자 확인할 땐 위와 같이 진행해도 괜찮으나, 동료들과 함께 보면서 이야기할 때는?

  • 파일을 공유 후 각자 노트북 환경에서 실행하는 방법

ModuleNotFoundError: No module named ‘…..’

라이브러리의 의존성
테스트를 위해 추가 환경 설정이 필요

개발을 잘 모르는 분에게 테스트 요청할 경우엔 이 부분을 어려워 할 수 있음

혹은 nbconvert 를 사용해 HTML 으로 추출할 수도 있음
$\rightarrow$ 인터랙티브하게 조작하긴 어려우며, 이미지 용량 등에 따라 느려질 수 있음

  • 모델을 개발한 후, 사람들과 테스트할 수 있는 프로토타입을 먼저 만들어보기
  • 이 모델이 어떤 결과를 반환하는가?를 테스트할 수 있음

  • 그러나 웹 서비스를 만드는 것은 시간이 많이 소요됨
  • 익숙한 노트북에서 프로그램을 만들면 시간을 아낄 수 있음

  • ipywidget 과 같이 사용할 경우 간단한 대시보드를 구축할 수도 있음
  • 실행할 때 저장된 Notebook 파일이 순차적으로 실행

이런 경우 활용할 수 있는 도구가 Voila

https://gitbub.com/voila-dashboards/voila

Voila 를 사용한 예시

https://voila-gallery.org/

Voila 소개

Voila 의 본래 목적 : 대시보드

R 의 Shiny 와 유사하며, 파이썬의 Dash 와 유사한 도구

(참고) Dash 는 Dash 의 문법을 익혀야 하기 때문에 사용할 때 시간이 필요함

대시보드는 다양한 도구들이 존재함. Superset, Metabase, Redash, Tableau

다만 위 도구는 모두 서버에 제품을 설치한 후, 연동시켜야 함
(=개발 리소스 필요, 유지보수 필요)

대부분 SQL 베이스의 시각화

이런 것들은 Notebook 에서 실행한 것들을 띄우기엔 어려움

Notebook 에서 별도의 코드 추가 없이 실행할 수 있는 점이 Voila 의 강점

노트북 파일만 만들면 프로토타입은 쉽게 만들 수 있음

2019년 12월에 Jupyter 의 하위 프로젝트로 통합됨

https://blog.jupyter.org/voil%C3%A0-is-now-an-official-jupyter-subproject-87d659583490

Voila 의 장점

  1. Jupyter Notebook 결과를 쉽게 웹 형태로 띄울 수 있음
  2. Ipywidget, Ipyleaflet 등 사용 가능
  3. Jupyter Notebook 의 Extension 있음(=노트북에서 바로 대시보드로 변환 가능)
  4. Python, Julia, C++ 코드 지원
  5. 고유한 템플릿 생성 가능
  6. 너무 쉬운 러닝커브

Voila 사용하기

$ pip3 install voila

# JupyterLab 사용한다면
$ jupyter labextension install @jupyter-voila/jupyterlab-preview

# jupyter Notebook 이나 Jupyter Server 를 사용한다면
$ jupyter serverextension enable voila --sys-prefix

# nbextension 도 사용 가능하도록 하고 싶다면 다음과 같이 설정
$ voila --enable_nbextensions=True
$ jupyter notebook --VoilaConfiguration.enable_nbextensions=True

Jupyter Lab 을 실행시키고 좌측 아래 버튼을 확인하면 Enable 이 보임

Voila 의 아이콘이 보임

우측에 렌더링 된 결과가 보이게 됨

몇 초 후 새로고침 버튼을 클릭하면 렌더링이 바뀜을 볼 수 있음(=Notebook 이 재실행)

localhost:8888/voila 로 접근할 수도 있음

CLI 에서 Voila 를 실행하는 경우 (Voila)

localhost:8866 에서 확인할 수 있음

클릭시 다음과 같이 나옴

새로고침하면 데이터가 변경됨

ipywidget

ipywidget 으로 slider 를 설정하면 우측과 같이 렌더링됨

Voila 사용시 TIP

--strip_sources=False 과 함께 실행하면 Voila 에서 코드도 보임 (직접 실행은 불가능)

$ voila voila_basic.ipynb --strip_sources=False

Voila 는 유저별로 새로운 Notebook Kernel 을 실행시키는 구조

Voila 노트북을 사용하지 않을 때 자동으로 종료해야 함

Jupyter Notebook 의 Config 에서 cull 옵션을 확인할 수 있음.

idel 상태인 경우 cull(끄는 행위) cull_interval: idle 커널을 확인할 간격(초) cull_idle_timeout : 커널을 idle 상태로 판단할 기준(초). 이 시간동안 이벤트가 없으면 idle 로 판단

$ voila voila_basic.ipynb --MappingKernelManager.cull_interval=60 --MappingKernelManager.cull_idle_timeout=300

Voila 셀 타임아웃 제한

  • 아무 설정을 하지 않을 경우 하나의 Cell 이 30초 이상 진행되면 Timeout Error 를 발생
    [Voila] ERROR | Timeout waiting for execute reply (30s)
  • 무거운 연산(전처리, 예측 등)에서 이슈
  • Voila 실행시 인자를 주어서 타임아웃 제한 시간을 늘릴 수 있음
    $ voila --ExecutePreprocessor.timeout=180

  • Jupyter Notebook 실행할 때는 다음과 같이 인자를 설정할 수 있음
    $ jupyter notebook --ExecutePreprocessor.timeout=180

Voila 에서 nbextension 을 사용하고 싶은 경우
voila your_notebook.ipynb --enable_nbextensions=True

jupyter notebook 실행 시에도 인자를 넘길 수 있음
jupyter notebook --ExecutePreprocessor.timeout=180 --VoilaConfiguration.enable_nbextensions=True

항상 보안에 신경쓰는 습관을 가져야 함

  • Jupyter Notebook 의 passwd 를 사용해 암호를 지정할 수 있음

1) Jupyter Notebook 의 설정 파일 생성하기(있다면 Skip)
jupyter notebook --generate-config

2) 터미널에서 python 실행 후 아래 코드 실행

from IPython.lib import passwd
passwd()

sha1 로 된 암호가 나타남. ‘sha1~~’ 값 복사

3) 아까 생성된 jupyter notebook config 로 진입
vi ~/.jupyter/jupyter_notebook_config.py

c.NotebookApp.pasword 를 찾아서 우측에 복사한 sha1 값을 붙여넣기
ESC :wq 로 저장하고 나오기

이제 암호를 입력해야 함

암호를 입력한 후 Voila 에 접근할 수 있음

2. ipywidget

ipywidget 과 같이 사용하면 인터랙티브한 효과를 줄 수 있음

https://ipywidgets.readthedocs.io/en/stable/

ipywidget 도 Notebook 프로젝트

다양한 Widget 을 보면서 “어떤 것을 만들 수 있을 것 같다” 라는 생각해보기

ipywidget - Slider Widget

improt 부분

display : Python Object 를 보여주는 함수

IntSlider : 정수형 Slider

IntSlider 의 인자(FloatSlider 등도 유사)

  • value : Default 값
  • step : 한번에 이동할 단계
  • orientation : 수직, 수평선
  • description : Slider 의 Label

그 외에 FloatSlider, IntRangeSlider

Slider 의 객체를 만든 후

int_widget.value 를 출력하면 값이 보임

int_widget.value = 8 을 할 경우 값이 변경됨

ipywidget - Text Widget

Slider 가 아닌 Input 입력

  • Bounded : 범위가 주어진 Text

마찬가지로 .value 로 값에 접근 가능

String Text 위젯

ipywidget - Boolean Widget

True, False 를 표시할 수 있는 Widget
ToggleButton, Checkbox

ToggleButton

  • button_style : 버튼의 스타일
  • icon : 사용하는 아이콘

CheckBox

  • indent : 들여쓰기 여부

ipywidget - Selection Widget

선택할 수 있는 Widget

  • Dropdown, RadioButtons

Dropdown

RadioButtons

ipywidget - Upload Widget

파일을 업로드하는 Widget

ipywidget - Image Widget

Image 를 보여주는 Widget

ipywidget - Date Picker Widget

Date 를 선택하는 Widget
Date, Time, Datetime 도 있음

ipywidget - Widget Events(on_click)

버튼이 클릭되었을 때, 어떤 함수가 동작하길 원하는 경우
on_click 인자에 함수를 넘겨주면 됨

ipywidget - Widget Events(observe)

위젯의 값이 변경되는 것을 감지해서 특정 함수를 실행하고 싶은 경우
observe 인자에 함수를 넘기면 됨

ipywidget - interact Decorator

@interact 데코레이터를 사용하면 UI 컨트롤러가 생성
함수의 인자를 받아서 UI 가 생성됨

x, y 는 default 를 의미

x=True 면 선택박스를 만들고 y=1.0 이니까 FloatSlider 를 만들어 줌

만약 함수의 인자 중 하나는 고정하고 싶고, UI 에서 나타나는 것을 원하지 않는 경우 fixed 를 사용할 수 있음

ipywidget - Layout(HBox, VBox)

위젯의 레이아웃을 구성하고 싶은 경우 HBox, VBox 를 사용

  • VBox : 수직으로 구성(세로)
  • HBox : 수평으로 구성(가로)

응용 : 값을 제곱하는 위젯

ipywidget + Voila

ipywidget 에서 Voila 를 클릭하면 렌더링이 된 화면을 볼 수 있음

Special Mission

1) Jupyter Notebook 으로 만든 마스크 분류 모델을 Voila 로 띄워보기 2) ipywidget 공식 문서 읽어보기 3) 데이터 시각화 파트에서 배운 내용과 ipywidget 을 사용해 인터랙티브한 대시보드 만들기

댓글남기기