Day_86 02. 프로토타이핑 - Notebook 베이스(Voila)
작성일
프로토타이핑 - 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 의 장점
- Jupyter Notebook 결과를 쉽게 웹 형태로 띄울 수 있음
- Ipywidget, Ipyleaflet 등 사용 가능
- Jupyter Notebook 의 Extension 있음(=노트북에서 바로 대시보드로 변환 가능)
- Python, Julia, C++ 코드 지원
- 고유한 템플릿 생성 가능
- 너무 쉬운 러닝커브
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 을 사용해 인터랙티브한 대시보드 만들기
댓글남기기