Streamlit cache_resource 사용하기
Streamlit cache_resource 사용하기
Streamlit은 데이터 사이언스와 머신러닝 애플리케이션을 빠르게 시각화할 수 있는 강력한 도구입니다. 특히 Streamlit은 자원을 효율적으로 관리하고, 동일한 계산을 반복하지 않도록 캐싱 기능을 제공합니다. 이 중 st.cache_resource
는 주로 리소스를 효율적으로 재사용하는 데 사용됩니다. 이 글에서는 st.cache_resource
의 개념과 사용법을 간단한 예시를 통해 설명하겠습니다.
st.cache_resource
란?
st.cache_resource
는 복잡한 계산 또는 시간이 오래 걸리는 리소스를 생성하고 이를 캐싱해, 동일한 리소스를 여러 번 생성하지 않고 재사용할 수 있도록 돕는 기능입니다. 예를 들어, 데이터베이스 연결이나 모델 로드와 같은 작업은 초기화에 시간이 걸리므로, 이를 캐싱해 동일한 작업이 반복적으로 수행되지 않도록 최적화할 수 있습니다.
이 기능은 다음과 같은 경우에 유용합니다:
- 데이터베이스 연결: 매번 새로운 연결을 생성하는 대신 동일한 연결을 재사용.
- 머신러닝 모델 로드: 모델을 여러 번 로드하지 않고 한 번 로드된 모델을 사용.
- API 클라이언트 초기화: 같은 API 클라이언트를 계속 재사용.
st.cache_resource
기본 문법
@st.cache_resource
def expensive_initialization():
# 리소스 초기화 작업
return resource
이 데코레이터를 사용하면 함수가 최초로 호출될 때만 리소스를 초기화하고, 이후에는 캐시된 리소스를 사용하게 됩니다.
예시 1: 데이터베이스 연결 캐싱
먼저 간단한 예시로, 데이터베이스 연결을 설정해 보겠습니다. 보통 데이터베이스 연결은 한 번 설정하면 프로그램이 종료될 때까지 재사용하는 것이 좋습니다.
import streamlit as st
import sqlite3
@st.cache_resource
def create_connection():
# 데이터베이스에 연결하는 작업
= sqlite3.connect('my_database.db')
conn return conn
def get_data():
= create_connection()
conn = conn.cursor()
cur "SELECT * FROM my_table")
cur.execute(= cur.fetchall()
data return data
"데이터베이스에서 데이터를 불러옵니다...")
st.write(= get_data()
data st.write(data)
설명:
create_connection
함수는 SQLite 데이터베이스와 연결을 설정하는 함수입니다.@st.cache_resource
를 사용하여 이 연결을 캐싱합니다. 즉, 앱이 실행되는 동안 데이터베이스 연결을 한 번만 수행하고, 이후부터는 캐시된 연결을 재사용합니다.
이렇게 하면, 데이터베이스에 반복적으로 연결하지 않고 효율적으로 리소스를 사용할 수 있습니다.
예시 2: 머신러닝 모델 로드 캐싱
머신러닝 모델을 로드하는 것도 시간이 걸리는 작업입니다. st.cache_resource
를 사용하면 모델을 한 번만 로드하고, 나머지 호출에서는 캐시된 모델을 사용합니다.
import streamlit as st
from sklearn.ensemble import RandomForestClassifier
import joblib
@st.cache_resource
def load_model():
# 미리 학습된 모델을 로드하는 작업
= joblib.load('my_model.pkl')
model return model
def predict(input_data):
= load_model()
model return model.predict(input_data)
# 예시 입력 데이터
= [[5.1, 3.5, 1.4, 0.2]]
input_data = predict(input_data)
prediction
"예측 결과:", prediction) st.write(
설명:
load_model
함수는 사전 학습된 모델을 파일에서 불러오는 작업을 담당합니다.@st.cache_resource
를 사용하여 모델을 한 번만 로드하고 이후에는 캐시된 모델을 재사용하여 성능을 향상시킵니다.
예시 3: API 클라이언트 캐싱
여러 번 호출될 수 있는 API 클라이언트를 초기화할 때도 st.cache_resource
가 유용합니다.
import streamlit as st
import requests
@st.cache_resource
def get_api_client():
# API 클라이언트를 생성하는 작업
= requests.Session()
session return session
def fetch_data():
= get_api_client()
client = client.get('https://api.example.com/data')
response return response.json()
"API에서 데이터를 불러옵니다...")
st.write(= fetch_data()
api_data st.write(api_data)
설명:
get_api_client
함수는requests.Session
객체를 생성하여 API 요청을 관리합니다.@st.cache_resource
를 사용하여 클라이언트를 한 번만 생성하고 재사용함으로써, API 요청을 효율적으로 처리합니다.
st.cache_resource
vs st.cache_data
Streamlit에는 st.cache_data
라는 또 다른 캐싱 데코레이터가 있습니다. 둘의 차이는 다음과 같습니다:
st.cache_data
: 데이터를 캐싱하고, 주로 계산된 값(데이터)을 다시 계산하지 않도록 저장합니다. (ex 데이터프레임 변환 결과, 대용량 데이터 다운로드, 복잡한 계산 결과)st.cache_resource
: 리소스를 캐싱하고, 연결 객체나 머신러닝 모델과 같은 시스템 자원을 여러 번 생성하지 않도록 관리합니다. 주로 연결 객체, 머신러닝 모델, API 클라이언트와 같은 상태가 있는 리소스를 캐싱합니다. 이러한 리소스는 주로 초기화에 시간이 오래 걸리거나, 한 번 생성되면 재사용되는 경우가 많습니다.
따라서, 데이터 처리에는 st.cache_data
를, 리소스(연결, 클라이언트, 모델) 관리에는 st.cache_resource
를 사용하는 것이 좋습니다.
마무리
Streamlit의 st.cache_resource
를 사용하면 데이터베이스 연결, 모델 로드, API 클라이언트와 같은 시스템 리소스를 효율적으로 관리할 수 있습니다. 이 기능을 통해 불필요한 리소스 재생성을 방지하고 애플리케이션의 성능을 크게 향상시킬 수 있습니다.
<h3>카테고리 다른 글</h3>
Date | Title | Author |
---|---|---|
Jan 1, 3000 | 전체 카테고리 | |
Sep 21, 2024 | Streamlit 멀티 select 사용하기 | |
Sep 21, 2024 | Streamlit selectbox를 사용하기 | |
Sep 19, 2024 | Streamlit fragments 사용하기 | |
Sep 19, 2024 | Streamlit form 사용하기 | |
Sep 19, 2024 | Streamlit 데이터프레임 수정하기 | |
Sep 19, 2024 | Streamlit fragments 사용하기 | |
Sep 18, 2024 | Streamlit docker로 배포하기 | |
Sep 18, 2024 | Streamlit 실시간 업데이트 사용하기 | |
Sep 18, 2024 | Streamlit에서 다이얼로그 사용하기 | |
Sep 18, 2024 | Streamlit의 유지보수와 디버깅 팁 | |
Sep 16, 2024 | Streamlit cache 사용하기 | |
Sep 15, 2024 | Streamlit 데이터프레임 선택하기 | |
Sep 14, 2024 | Streamlit 다중 page 구성하기 | |
Sep 13, 2024 | Streamlit Session_state 사용하기 | |
Sep 12, 2024 | Streamlit을 활용한 기본 시각화 도구 | |
Sep 12, 2024 | Streamlit에 Plotly 차트 적용하기 | |
Sep 11, 2024 | Streamlit에서 파일 업로드하기 | |
Sep 11, 2024 | Streamlit에 SQLite 데이터베이스 적용 | |
Sep 10, 2024 | Streamlit UI 컴포넌트 소개 | |
Sep 9, 2024 | Streamlit 사용 사례 | |
Sep 9, 2024 | Streamlit 설치 및 환경설정 | |
Sep 9, 2024 | Streamlit 애플리케이션 구조 이해 | |
Sep 9, 2024 | Streamlit layout 설정하는 방법 | |
Sep 8, 2024 | Streamlit이란 무엇인가요? | |
Sep 6, 2024 | Streamlit Cloud로 앱 배포하기 |