일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 | 23 | 24 | 25 | 26 | 27 | 28 |
29 | 30 |
- pyenv
- REST API
- 가상환경
- N-Queen
- end to end
- 손실함수
- 재귀
- 1002
- Python
- video retireval
- 오블완
- 신경망 학습
- 9020
- 파이싼
- streamlit
- 백트래킹
- BOJ
- 4948
- 경사하강법
- Retrieval
- 그리디 알고리즘
- 밑바닥부터 시작하는 딥러닝
- n과 m
- 1101
- 기계학습
- 파이썬
- 개발환경
- 티스토리챌린지
- 백준
- 15649
- Today
- Total
파이톨치
[BoostCamp AI Tech] Streamlit 본문
소프트웨어 엔지니어링
전통적인 소프트웨어 엔지니어링은 소프트웨어 개발 과정에서 체계적이고 효율적인 방법을 사용하여 소프트웨어의 품질과 유지 보수성을 보장하는 학문이다. AI 역시 소프트웨어의 일종이며, 집중하는 문제가 다를 뿐 본질적으로는 소프트웨어 개발의 원칙에서 크게 벗어나지 않는다.
좋은 소프트웨어는 모듈화가 잘 되어 있어야 하며, 코드 간의 의존성이 낮아야 한다. 각 기능이 독립적으로 동작해야 하며, 필요에 따라 쉽게 재사용될 수 있어야 한다. 코드를 레고 블록에 비유할 수 있는데, 각 블록을 잘 조립하면 멋진 결과물이 나오듯, 소프트웨어도 잘 설계된 모듈을 적절히 조합할 때 완성도가 높아진다.
또한, 소프트웨어는 철저히 테스트되어야 한다. 실제 환경에서 코드가 문제없이 작동하는지, 예기치 않은 변수가 없는지 꼼꼼히 확인하는 과정이 필수적이다. 프로그래머는 코드 작성 시 꼼꼼함과 깐깐함을 유지해야 한다.
AI를 개발하고 서비스화하려면, 이러한 소프트웨어의 기본 원칙을 따르는 것이 중요하다. 특히, 프론트엔드와 백엔드 개발자들과의 소통을 위해서는 그들이 사용하는 언어와 도구, 프로세스에 대한 이해가 필요하다.
이 과정에서 Streamlit 같은 도구는 매우 효율적인 해결책을 제공한다. 전통적인 방식에서는 AI 모델을 서비스로 전환하기 위해 프론트엔드와 백엔드 개발자들이 필요하고, 시스템 간의 의존성과 복잡성도 증가할 수 있지만, Streamlit을 사용하면 데이터 분석가는 별도의 복잡한 작업 없이 파이썬 코드만으로 바로 웹 애플리케이션을 구현하고 배포할 수 있다.
Streamlit은 코드를 모듈화하여 손쉽게 유지보수하고 확장 가능하게 만들며, 버튼 클릭 같은 상호작용이나 데이터 시각화를 위해 복잡한 프론트엔드 기술 없이도 빠르게 프로토타입을 개발할 수 있게 해준다. 이를 통해 AI 개발자는 소프트웨어 엔지니어링의 핵심 원칙을 따르면서도 더 빠르고 효율적으로 AI 모델을 서비스화할 수 있다.
Streamlit
일반적으로 데이터 분석가나 데이터 사이언티스트는 데이터 분석에 집중하고,
분석 결과를 시각화하고 웹 서비스로 제공하기 위해 프론트엔드 개발자와 협업해야 한다.
하지만 Streamlit을 사용하면 이러한 작업을 하나의 프로세스에서 쉽게 처리할 수 있다.
데이터 분석가가 직접 데이터를 분석하고 그 결과를 시각화하여 웹 애플리케이션으로 배포할 수 있으므로,
별도의 프론트엔드 개발자 없이도 간편하게 프로토타입을 개발할 수 있다.
Streamlit을 사용할 경우의 장점은 효율성에 있다. 먼저, 파이썬 스크립트 코드를 조금만 수정하면 쉽게 웹 애플리케이션을 띄울 수 있으며, 별도의 백엔드 개발이나 HTTP 요청을 구현할 필요가 없다. 또한, 다양한 컴포넌트를 제공해 대시보드 UI를 손쉽게 구성할 수 있다. 배포 측면에서도 Streamlit Cloud를 이용하면 간단하게 웹 애플리케이션을 배포할 수 있지만, Community Plan에서는 Public 저장소만 사용할 수 있다는 제한이 있다. 이외에도 화면 녹화 기능(Record)을 지원해 화면을 쉽게 기록할 수 있는 장점이 있다.
중요한 점은 특정 도구나 라이브러리에 집착하지 않고, 점진적으로 문제를 해결하는 과정에 집중하는 것이다.
현재 사용 중인 도구의 장단점을 파악하고, 필요시 새로운 대안을 찾아보는 유연한 접근이 필요하다.
궁극적으로는 프로젝트의 요구 사항에 따라 적절한 결정을 내리는 것이 핵심이다.
import streamlit as st
import pandas as pd
import numpy as np
# 간단한 제목 추가
st.title("Streamlit 예시")
# 슬라이더를 이용해 데이터 크기 설정
size = st.slider("데이터 크기 선택", min_value=10, max_value=100)
# 무작위 데이터 생성
data = pd.DataFrame(
np.random.randn(size, 3),
columns=['A', 'B', 'C']
)
# 데이터프레임 출력
st.write("생성된 데이터:")
st.dataframe(data)
# 라인 차트 출력
st.line_chart(data)
위 예시 코드는 Streamlit을 사용해 간단한 웹 애플리케이션을 만드는 과정이다. 사용자는 슬라이더를 이용해 데이터의 크기를 조정할 수 있으며, pandas 라이브러리를 사용해 생성된 무작위 데이터를 화면에 출력하고, line_chart를 이용해 해당 데이터를 차트로 시각화한다. 이러한 방식으로 Streamlit은 데이터 분석과 시각화를 매우 간단하게 웹 인터페이스로 제공할 수 있다.
Streamlit의 주요 기능:
- st.write:
- 문자, 숫자, 데이터프레임, 차트 등 다양한 형태의 데이터를 화면에 표시할 수 있는 가장 기본적인 출력 함수이다.
- st.dataframe:
- Interactive한 DataFrame을 제공하며, 컬럼을 클릭하거나 정렬할 수 있는 기능이 있다.
- st.table:
- Static한 DataFrame을 화면에 출력할 때 사용되며, 데이터에 대한 상호작용 없이 단순하게 표 형식으로 보여줄 수 있다.
- 사용 상황:
- DataFrame을 보여주거나, 마크다운을 사용하여 텍스트를 포맷팅하고 싶을 때 주로 사용된다.
- 예를 들어 st.write로 데이터프레임과 함께 마크다운 형식의 설명을 추가할 수 있고, st.dataframe으로 상호작용이 가능한 데이터를 표시할 수 있다.
- Pandas DataFrame 강조:
- DataFrame의 특정 값을 강조하고 싶을 때, style.highlight_max를 사용하여 특정 컬럼이나 행에서 가장 큰 값을 강조할 수 있다.
- st.button:
- 버튼 클릭 시 특정 동작을 실행할 수 있으며, 이를 통해 함수 호출, 머신러닝 모델 예측 등의 작업을 할 수 있다.
- st.form:
- 여러 개의 입력을 그룹화하여 한 번에 제출하는 기능을 제공한다. 다양한 입력 필드를 사용자가 설정한 후 한 번에 제출할 수 있어, 데이터 입력을 편리하게 관리할 수 있다.
- st.checkbox:
- True 또는 False 옵션을 선택할 수 있는 체크박스를 제공하며, value 인자를 설정해 기본값을 지정할 수 있다. (기본값: True 또는 False)
- st.metric, st.json:
- st.metric: 지표를 한눈에 보여줄 때 사용된다.
- st.json: JSON 데이터를 시각적으로 표시하는 기능을 제공한다.
- st.line_chart:
- 라인 차트를 그리기 위해 사용되며, 시계열 데이터나 연속된 데이터의 시각화에 적합하다.
- st.status_box:
- 성공, 정보, 경고, 오류 등의 메시지를 나타낼 수 있어 상태를 명확하게 전달하고자 할 때 유용하다.
SessionState 활용 예시:
SessionState를 사용하여 상태를 관리하면, 사용자가 버튼을 누를 때마다 상태가 업데이트되는 기능을 구현할 수 있다. 예를 들어, 증가(Increment) 버튼을 누르면 값이 1씩 증가하고, 감소(Decrement) 버튼을 누르면 1씩 감소하는 카운터를 만들 수 있다. 이러한 상태 관리 기능은 채팅 서비스나 실시간 업데이트가 필요한 애플리케이션에서 유용하다.
import streamlit as st
# Session State를 사용하여 카운터 값 저장
if 'count' not in st.session_state:
st.session_state['count'] = 0
# 증가 버튼을 누를 때 카운터 +1
if st.button('Increment'):
st.session_state['count'] += 1
# 감소 버튼을 누를 때 카운터 -1
if st.button('Decrement'):
st.session_state['count'] -= 1
# 현재 카운터 값 표시
st.write(f"Current Count: {st.session_state['count']}")