Streamlit App Deployment with nohup in Google Compute Engine

Page content

개요

개요

  • 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 주소 클릭한다.

Untitled

  • 화면 오른쪽 Label 클릭 후, 고정 IP 주소로 승급한다.

Untitled

  • 이름을 기재한다. (이름명 : mulcamp28)

Untitled

  • IP 주소 앞에 이름이 생긴 것을 확인한다.

Untitled

VS Code에서 재접속

  • 먼저 Google Compute Engine이 실행중인지 확인한다.

Untitled

  • 이번에는 VS Code를 연동한다. 왼쪽 메뉴에서 mulcampGCP를 선택한다.

Untitled

  • 암호를 입력한다.

Untitled

  • 파일과 폴더를 확인한다.

Untitled

  • 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

Untitled

  • 터미널을 닫아도 이제 계속 해당 링크에서 실행중이다.

비용 확인 및 인스턴스 중지

  • 서버가 계속 실행되면 요금이 나가기 때문에 계속 배포를 해야 하는 것이 아니라면 인스턴스를 중지한다.

Untitled

Untitled

  • 중지가 된 상태에서 해당 링크를 클릭하면 웹사이트는 더 이상 열리지 않는다.

Untitled