Python을 배워보자

Jupyter Notebook을 RESTful API 서버로 변신시키는 notebook_http 확장: 데이터 분석 파이프라인 자동화의 길을 열다

_Blue_Sky_ 2024. 12. 27. 00:16
728x90
728x90

 

데이터 분석 환경에서 Jupyter Notebook은 친숙한 인터랙티브 환경을 제공하여 데이터 탐색, 시각화, 모델링 등 다양한 작업을 수행하는 데 널리 사용됩니다. 하지만, 분석 결과를 다른 시스템이나 서비스와 공유하고 자동화된 파이프라인을 구축하려면 추가적인 개발이 필요했습니다. 이러한 문제를 해결하기 위해 등장한 것이 바로 notebook_http 확장입니다.

notebook_http는 Jupyter Notebook의 특정 셀을 HTTP API 엔드포인트로 노출시켜, 노트북을 마치 RESTful API 서버처럼 사용할 수 있도록 해줍니다. 즉, 외부에서 HTTP 요청을 통해 노트북의 코드를 실행하고 결과를 받아올 수 있다는 의미입니다. 이를 통해 데이터 분석 파이프라인을 자동화하고, 머신러닝 모델을 API 형태로 제공하며, 데이터 분석 결과를 실시간으로 공유하는 등 다양한 활용이 가능해집니다.

주요 기능과 특징

  • 간단한 API 생성: #!post, #!get과 같은 지시어를 사용하여 쉽게 API 엔드포인트를 생성할 수 있습니다.
  • 상태 유지: 노트북 커널이 살아있는 동안 변수와 데이터가 유지되어 상태를 관리할 수 있습니다.
  • 경량 API 서버: 별도의 웹 프레임워크 없이 간편하게 API 서버를 구축할 수 있습니다.
  • 빠른 프로토타이핑: 아이디어를 빠르게 구현하고 API 형태로 공유하여 검증할 수 있습니다.

notebook_http는 Jupyter Notebook에서 특정 셀을 HTTP API 엔드포인트로 노출시키는 확장 기능입니다.
이를 통해 Jupyter 노트북을 일종의 RESTful API 서버처럼 사용하고, 외부에서 HTTP 요청을 통해 노트북을 실행하고 결과를 받을 수 있습니다.

이 확장은 데이터 분석 파이프라인, 모델 서빙, 자동화된 보고서 생성 등에서 유용하게 사용됩니다.
예를 들어, 데이터 분석 결과를 특정 셀에 작성해 두고 외부에서 요청을 보내 해당 분석을 실시간으로 수행하고 결과를 반환받을 수 있습니다.


1. 주요 기능과 특징

  • REST API 엔드포인트 생성: Jupyter Notebook 셀에 #!post, #!get와 같은 지시문을 추가해 HTTP 요청을 처리할 수 있습니다.
  • 상태 유지: 노트북의 커널이 살아있는 동안 상태(변수, 데이터)가 유지됩니다.
  • 경량 API 서버: 별도의 Django, Flask 서버를 구축하지 않고도 API를 쉽게 만들 수 있습니다.
  • 빠른 프로토타이핑: 데이터 분석, 머신러닝 모델 등을 빠르게 API 형태로 공개해 사용할 수 있습니다.

2. 설치 및 설정

1) 확장 설치

pip install jupyter-http-over-ws

2) 확장 활성화

jupyter serverextension enable --py jupyter_http_over_ws

3) Jupyter Notebook 실행

jupyter notebook --NotebookApp.allow_origin='*' --NotebookApp.token='' --NotebookApp.password=''
  • allow_origin='*': 모든 출처에서 요청을 허용 (CORS 설정)
  • token='': 보안 토큰 비활성화
  • password='': 비밀번호 없이 접근 가능

3. 사용 방법

1) API 엔드포인트 설정

Jupyter Notebook의 셀에 #!post 또는 #!get으로 엔드포인트를 설정합니다.

#!post /predict
import random
result = {"prediction": random.randint(1, 100)}
result

2) 외부에서 API 호출

curl -X POST http://localhost:8888/notebooks/sample.ipynb/predict
  • /predict 엔드포인트로 POST 요청을 보내면 셀이 실행되고 결과가 반환됩니다.

4. 동작 방식

  • HTTP 요청 수신: Jupyter 서버가 특정 엔드포인트로 들어오는 HTTP 요청을 감지합니다.
  • 커널에서 셀 실행: 지정된 셀을 실행하고 결과를 반환합니다.
  • 상태 유지: Jupyter 커널이 살아있는 동안 셀의 상태(변수 등)가 유지되며, 이후 요청에서 이 상태를 재사용할 수 있습니다.

5. 예시: 머신러닝 모델 예측 API

#!post /train
from sklearn.datasets import load_iris
from sklearn.linear_model import LogisticRegression

# 데이터 불러오기 및 모델 학습
data = load_iris()
model = LogisticRegression(max_iter=200)
model.fit(data.data, data.target)
"Training Complete"
#!post /predict
import numpy as np
sample = np.array([[5.1, 3.5, 1.4, 0.2]])
prediction = model.predict(sample)
{"prediction": prediction.tolist()}

호출:

curl -X POST http://localhost:8888/notebooks/ml_model.ipynb/train
curl -X POST http://localhost:8888/notebooks/ml_model.ipynb/predict

728x90

6. 보안 및 인증

  • 토큰 및 패스워드 설정: --NotebookApp.token 또는 --NotebookApp.password를 설정해 보안을 강화할 수 있습니다.
  • CORS 설정: --NotebookApp.allow_origin으로 특정 도메인에서만 요청을 허용합니다.
  • IP 제한: NotebookApp.ip 설정을 통해 특정 IP에서만 요청을 허용합니다.

7. 장점과 단점

장점

  • 간단한 설치 및 사용
  • 빠르게 API를 만들 수 있음
  • 데이터 분석 및 모델 배포에 적합

단점

  • 복잡한 API 구축에는 부적합
  • Jupyter 커널이 살아있어야만 작동 (서버 재시작 시 상태 초기화)
  • 대규모 트래픽 처리에 비효율적

8. 사용 사례

  • 데이터 분석 자동화: 외부에서 분석 결과를 요청하고 즉시 받아볼 수 있음
  • 모델 서빙: 학습된 머신러닝 모델을 Jupyter Notebook에서 API 형태로 배포
  • 실험 및 연구: API 형태로 노트북을 공유해 동료들이 같은 환경에서 실험 가능

9. 언제 사용하면 좋을까?

  • 빠르게 프로토타입을 만들고 테스트할 때
  • 간단한 API를 노트북에서 바로 제공하고자 할 때
  • 데이터 분석 결과를 쉽게 공유하고 API로 제공하고자 할 때

728x90

10. Flask/Django와 비교

기능 notebook_http Flask/Django
설정 난이도 매우 쉬움 비교적 복잡
API 구축 속도 빠름 느림 (설정 필요)
확장성 낮음 높음
상태 유지 커널 종료 전까지 DB 및 캐시 사용
대규모 서비스 부적합 적합

결론

notebook_http는 간단하고 빠르게 API를 구축하는 도구로, 데이터 분석, 머신러닝, 연구 개발 환경에서 매우 유용합니다.
다만, 대규모 서비스정교한 API 설계가 필요한 경우 Flask나 Django 같은 웹 프레임워크를 사용하는 것이 더 적합합니다.

728x90
728x90