Streamlit App Deployment with nohup in Google Compute Engine
Page content
개요
- Streamlit과 Bigquery를 연동하는 코드를 구현한다.
- 가상환경 설정 부터 VS Code 연동까지 준비가 안되어 있다면 이전 글을 참조하기를 바란다.
- 만약 GCP가 처음이신 분들은 이전 글을 순차적으로 읽어본다.
개요
- Streamlit Sample 코드를 작성한 후 배포를 진행한다.
- VS Code 접속 시 고정 IP를 할당한다.
- 이 때 터미널이 종료되거나 사용자가 로그아웃해도 계속 실행되도록 nohup을 사용한다.
Nohup의 기본 개념
- nohup은 “no hang up"의 약자로, 백그라운드에서 다른 명령을 실행하는 데 사용되는 UNIX 명령으로, 로그아웃한 후에도 계속 실행됨.
- 원격 서버에서 장기간 실행되는 프로세스를 시작하려는 경우 세션 연결이 끊어지거나 터미널이 닫힐 때 프로세스가 종료되지 않도록 하려는 경우에 특히 유용함.
- foreground에서 명령이나 프로세스를 실행할 때 터미널이나 셸 세션이 종료되면 해당 명령이나 프로세스가 종료될 수 있다.
- nohup을 사용하면 기본적으로 터미널에서 프로세스를 분리하고 종료(HUP) 신호를 수신하지 못하도록 하여 로그아웃하거나 연결을 끊어도 프로세스가 완료될 때까지 실행할 수 있다.
- Python에서 nohup을 실행할 때는 다음과 같다.
- 출력(로그 및 오류)을 특정 파일로 리디렉션하려면 다음 명령을 사용할 수 있다.
- 이렇게 하면 Streamlit 앱의 표준 출력과 표준 오류가 모두 streamlit.log라는 파일로 리디렉션 된다.
nohup streamlit run my_app.py > streamlit.log 2>&1 &
- Streamlit 앱을 중지해야 하는 경우 ps 명령을 사용하여 프로세스 ID를 찾은 다음 종료 명령을 사용하면 된다.
ps aux | grep "streamlit run"
- 그러면 Streamlit과 관련된 프로세스 목록이 표시된다. 삭제하고자 하는 프로세스 ID를 찾아서 종료한다.
kill -9 PROCESS_ID
고정 IP 할당
- 왼쪽 사이드바 메뉴 > VPC 네트워크 > IP 주소 클릭한다.
- 화면 오른쪽 Label 클릭 후, 고정 IP 주소로 승급한다.
- 이름을 기재한다. (이름명 : mulcamp28)
- IP 주소 앞에 이름이 생긴 것을 확인한다.
VS Code에서 재접속
- 먼저 Google Compute Engine이 실행중인지 확인한다.
- 이번에는 VS Code를 연동한다. 왼쪽 메뉴에서 mulcampGCP를 선택한다.
- 암호를 입력한다.
- 파일과 폴더를 확인한다.
- mulcampFP 폴더 하위에 main.py를 생성 후 다음과 같은 코드를 가져온다.
- Code 는 ChatGPT가 만들어 줬다.
# streamlit_app.py
import streamlit as st
import pandas as pd
import numpy as np
import plotly.express as px
from sklearn import datasets
def load_data():
iris = datasets.load_iris()
df = pd.DataFrame(data= np.c_[iris['data'], iris['target']],
columns= iris['feature_names'] + ['target'])
df['species'] = df['target'].map({0: 'setosa', 1: 'versicolor', 2: 'virginica'})
return df
def main():
df = load_data()
st.title("Streamlit Iris Data Visualization")
st.write("""
## Explore the Iris dataset
Use the controls below to explore different visualizations of the Iris dataset.
""")
# Sidebar for user controls
features = df.columns[:-2] # excluding target and species
x_axis = st.sidebar.selectbox("Choose X axis", features, index=0)
y_axis = st.sidebar.selectbox("Choose Y axis", features, index=1)
# Plotting
fig = px.scatter(df, x=x_axis, y=y_axis, color='species',
title=f"{x_axis} vs. {y_axis} by Species")
st.plotly_chart(fig)
# Display raw data on demand
if st.checkbox("Show raw data", False): # False means the checkbox is unchecked by default
st.write(df)
if __name__ == '__main__':
main()
nohup으로 실행
- 백그라운드로 실행하기 위해 nohup으로 실행한다.
- 포트번호는 8501이다.
(base) ~/mulcampFP$ nohup streamlit run main.py > streamlit.log 2>&1 &
[1] 2593
- 터미널을 닫아도 이제 계속 해당 링크에서 실행중이다.
비용 확인 및 인스턴스 중지
- 서버가 계속 실행되면 요금이 나가기 때문에 계속 배포를 해야 하는 것이 아니라면 인스턴스를 중지한다.
- 중지가 된 상태에서 해당 링크를 클릭하면 웹사이트는 더 이상 열리지 않는다.