ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • Streamlit 챗봇 외부접속 가능하도록 배포하기 - 네이버클라우드 활용
    Infra/ncloud 2024. 8. 12. 00:56

    Streamlit 챗봇 외부접속 가능하도록 배포하기 - 네이버클라우드 활용

     

    요즘 AI 업계에서 많은 사랑을 받고 있는 프로토타입 제작 도구인 Streamlit을 사용하면 간단한 파이썬 코드만으로도 누구나 빠르고 쉽게 앱을 제작할 수가 있습니다. 이 Streamlit으로 제작한 앱을 외부에 공개해서 나뿐만 아니라 누구나 볼 수 있도록 만들려면 어떻게 해야 될까요? 이번 포스팅에는 네이버클라우드를 활용해서 Streamlit으로 만든 앱을 외부에서 접속가능하도록 배포하는 방법에 대해 알아보도록 하겠습니다.

     


     

    🤔 Streamlit이란?

    Streamlit은 데이터를 시각화하거나 대화형 애플리케이션(챗봇) 개발을 쉽고 효율적으로 배포할 수 있는 프레임워크로 데이터 사이언티스트와 머신러닝 엔지니어들을 위한 프로토타입 제작도구입니다.

     

    Streamlit은 다음과 같은 구조로 패키징 되어 있습니다.

    • Frontend: React 기반의 사용자 인터페이스, 사용자의 입력을 실시간으로 서버에 전달하고 결과를 표시
    • Backend: Tornado 서버를 통해 Python 스크립트를 실행하고, 웹 소켓을 통해 UI 업데이트를 처리
    • Scripting Layer: 사용자가 작성한 Streamlit 스크립트, Streamlit의 API를 통해 다양한 UI 요소와 상호작용

     

    Streamlit을 사용하면 Frontend와 Backend는 백그라운드에서 동작되므로 저희가 직접 손댈 일이 없기 때문에 Scripting Layer에서 파이썬 코드를 활용하여 UI를 디자인하기만 하면 손쉽게 사용할 수 있습니다.

     

    만약 CLOVA X처럼 동작하는 간단한 AI 챗봇을 만든다고 가정한다면 다음과 같이 파이썬 스크립트를 다음과 같이 작성할 수 있습니다.

     

    # app.py
    
    import json
    import os
    
    import requests
    import streamlit as st
    from dotenv import load_dotenv
    from streamlit_chat import message
    
    
    class CompletionExecutor:
        def __init__(self):
            # .env 파일 로드 (API 키 준비)
            load_dotenv()
    
            self._clovastudio_api_key = os.getenv('CLOVASTUDIO_API_KEY')
            self._apigw_api_key = os.getenv('APIGW_API_KEY')
    
        def execute(self, request_data):
            headers = {
                'X-NCP-CLOVASTUDIO-API-KEY': self._clovastudio_api_key,
                'X-NCP-APIGW-API-KEY': self._apigw_api_key,
                'Content-Type': 'application/json; charset=utf-8',
            }
            response = requests.post('https://clovastudio.stream.ntruss.com/testapp/v1/chat-completions/HCX-003',headers=headers, json=request_data, stream=False)
            json_data = json.loads(response.text)
    
            return json_data['result']['message']['content']
    
    st.title("HyperCLOVA X 챗봇 만들기")
    
    if 'assistant' not in st.session_state:
        st.session_state['assistant'] = []
    
    if 'user' not in st.session_state:
        st.session_state['user'] = []
    
    with st.form('form', clear_on_submit=True):
        user_input = st.text_area('입력: ', '', key='input',height=200)
        submitted = st.form_submit_button('전송')
        if submitted and user_input:
            with st.spinner("대기중..."):
    
                completion_executor = CompletionExecutor()
    
                preset_text = [{"role":"system","content":""},{"role":"user","content":user_input}]
                request_data = {
                    'messages': preset_text,
                    'topP': 0.8,
                    'topK': 0,
                    'maxTokens': 300,
                    'temperature': 0.3,
                    'repeatPenalty': 5.0,
                    'stopBefore': [],
                    'includeAiFilters': True,
                    'seed': 0
                }
    
                response_text=completion_executor.execute(request_data)
    
                # 대화 기록 유지
                st.session_state.user.append(user_input)
                st.session_state.assistant.append(response_text)
    
    if st.session_state['assistant']:
        for i in range(len(st.session_state['assistant'])-1, -1, -1):
            message(st.session_state['user'][i], is_user=True, key=str(i) + '_user')
            message(st.session_state["assistant"][i], key=str(i))

     

    위의 예제를 사용하실 때 주의해야 할 점은 CLOVA Studio에서 직접 테스트앱을 만들어서 API KEY를 발급받아. env 파일에 발급받은 API KEY들을 넣어주셔야 합니다. CLOVA Studio API KEY 발급받는 방법은 아래 포스팅을 통해 확인하실 수 있습니다.

     

     

    네이버클라우드 CLOVA Studio에서 나만의 모델 API 생성하기

    지난 포스팅을 통해 CLOVA Studio를 활용하면 다양한 모델들과 옵션들을 플레이그라운드를 통해 테스트해보고 활용해 볼 수 있다는 사실을 알 수 있었는데요. 이번 포스팅에서는 플레이그라운드

    chucoding.tistory.com

     

     

    만약 이 과정이 번거롭다면 아래 사이트에서 사용자들이 만들어놓은 다른 다양한 템플릿을 가져와서 사용해 주셔도 됩니다.

     

     

    App Gallery • Streamlit

    Streamlit is an open-source Python framework for data scientists and AI/ML engineers to deliver interactive data apps – in only a few lines of code.

    streamlit.io

     

    app.py가 준비되었다면 이제 Streamlit을 구동시켜 보겠습니다. 현재 VSCode를 사용 중이거나 파이썬을 구동할 수 있는 환경이라면 터미널에서 아래 명령어를 실행하여 Streamlit을 구동시킬 수 있습니다. (혹시 패키지 버전 충돌이 우려된다면 미리 conda를 구동시켜 주세요.)

     

    pip install --no-cache-dir -r requirements.txt
    python -m streamlit run app.py

     

    정상적으로 구동이 되었다면 다음과 같이 웹사이트에 접속되는 것을 확인하실 수 있습니다.

     

    localhost:8085로 구동된 Streamlit 앱

     


     

    🐋 Dockerfile 셋팅하기

    아쉽게도 위에서 확인한 웹사이트는 제 PC에서만 접속할 수 있습니다. URL을 상대방에게 전달해도 해당 사이트에는 접속을 할 수가 없죠. 따라서 저희는 누구나 접근 가능하도록 만들기 위해서 클라우드 서버에 프로젝트를 올려놓고 구동시켜야 합니다.

     

    클라우드 서버에서 앱을 구동시키기 위해서는 앞서 로컬에서 Streamlit을 띄우기 위해 사용했던 명령어를 그대로 서버에서 사용해 주시면 됩니다. 단, Streamlit 명령어만 필요한 게 아니라 파이썬 설치부터 프로젝트 세팅까지 처음부터 다시 설정해주셔야 합니다. (예를 들면, 노트북을 새로 샀다고 가정하고 처음부터 다시 시작한다고 생각하시면 됩니다. )

     

    따라서 이런 번거로운 작업을 피하시려면 도커를 활용하여 컨테이너로 띄우는 것이 가장 좋습니다. 도커를 활용했을 때 좋은 점은 Dockerfile이라는 파일을 통해 파이썬 설치부터 Streamlit 구동까지 필요한 명령어들을 미리 작성해서 준비해 놓을 수 있습니다. 프로젝트 루트 경로 내에 Dockerfile 파일을 만들고 Streamlit을 구동시키기 위한 스크립트를 아래와 같이 작성합니다.

     

    # 베이스 이미지로 Python 3.9 사용
    FROM python:3.9
    
    # 작업 디렉토리 설정
    WORKDIR /app
    
    # 필요한 파일들을 이미지로 복사
    COPY requirements.txt ./
    
    # 패키지 설치
    RUN pip install --no-cache-dir -r requirements.txt
    
    # 앱 파일을 이미지로 복사
    COPY . .
    
    # Streamlit 환경 변수 설정
    ENV STREAMLIT_SERVER_HEADLESS=true
    ENV STREAMLIT_SERVER_PORT=8501
    ENV STREAMLIT_BROWSER_GATHER_USAGE_STATS=false
    
    # API 키를 위한 환경 변수 설정 (기본값은 빈 문자열)
    ENV CLOVASTUDIO_API_KEY=""
    ENV APIGW_API_KEY=""
    
    # Streamlit 애플리케이션 실행 (API 키 환경 변수를 전달)
    CMD ["sh", "-c", "CLOVASTUDIO_API_KEY=$CLOVASTUDIO_API_KEY APIGW_API_KEY=$APIGW_API_KEY streamlit run app.py"]

     

    위와 같이 Dockerfile 생성했다면 프로젝트를 commit 하고 원격 저장소(ex. Github)에 push 합니다. 이 처럼 프로젝트를 외부에서 접근가능하도록 구성해 놓으시면 클라우드 서버에서 해당 레포지토리를 내려받아 사용할 수 있게 됩니다.

     


     

    💚 네이버클라우드 서버 생성하기

    이제 배포할 준비를 모두 마쳤기 때문에 streamlit 앱을 구동시킬 수 있는 클라우드 서버 하나를 선정하시면 되는데요. 저는 국내 클라우드 서비스를 제공하고 있는 네이버클라우드 플랫폼을 활용해 보도록 하겠습니다.

     

    서버를 생성하는 방법도 목적에 따라 굉장히 다양한데 이번 포스팅에서는 가장 간단한 방법으로 설명드리겠습니다. 먼저 아래 링크를 통해 네이버클라우드 콘솔에 접속해서 서버를 하나 생성하도록 하겠습니다.

     

    https://console.ncloud.com

     

    콘솔에 접속하시면 왼쪽 내비게이션바에서 Platform을 Classic으로 선택해 주시고 [Services] 메뉴를 클릭하여 [Server]라고 되어있는 서비스를 선택하시면 됩니다. 가장 상단에 위치하고 있기 때문에 쉽게 찾으실 수 있습니다.

     

    네이버클라우드 플랫폼에서 Server 서비스 사용하기

     

    [Server] 메뉴에 접속하신다면 다음과 같은 화면을 보실 수 있습니다. 이곳에서 어떤 서버들을 생성했고 현재 운영 중인지 관리하실 수 있습니다. 새로운 서버를 만들기 위해서는 왼쪽 상단의 [+ 서버 생성] 버튼을 클릭하시면 됩니다.

     

    네이버클라우드 플랫폼에서 서버 생성하기

     

    서버 생성 시 가장 먼저 하는 일은 서버의 스펙을 선정하는 일인데요. 이번 포스팅에서는 가장 저렴하고 효율적으로 이용할 수 있는 방법에 대해 설명드리겠습니다. 만약 어떤 서버를 선택하면 좋을지 자세하게 알고 싶으시다면 ncloud 서버 생성 - 어떤 서버를 선택해야 할까??』 포스팅을 참조하시면 좋을 것 같습니다.

     

    아래와 같이 옵션들을 선택한 후 [다음 >] 버튼을 클릭하시면 됩니다.

     

    네이버클라우드 서버 스펙 정하기

     

    사실 서버 타입 중에 Micro 서버를 사용하면 조금 더 저렴하게 이용 가능합니다. 다만, 도커를 활용해서 컨테이너 구동할 경우 속도면에서 조금 답답함을 느낄 수 있습니다. 가격 차이가 조금 있는 편이기 때문에 Micro서버를 선택하시는 것도 좋은 방법입니다. Micro서버는 계정당 하나씩만 보유할 수 있습니다.

     

    다음은 서버 설정입니다. 이곳에서 서버 스펙별 가격을 미리 확인해 보실 수 있습니다. 다음과 같이 구성할 경우 월 26,000원이 청구됩니다. 장기적으로 띄워놓는 게 아니라 특정 기간에만 구동하신다고 하신다면 시간 요금제를 선택하셔서 금액적인 부담을 줄이시는 것도 좋은 방법입니다.

     

    네이버클라우드 서버 설정하기

     

    다음은 인증키 설정입니다. 기존에 발급받아 놓은 인증키가 없으시다면 다음과 같이 새로 발급받아 내 컴퓨터의 어딘가에 잘 보관해 놓는 것이 좋습니다. 추후 이 파일이 있어야 서버에 접속할 수 있기 때문입니다.

     

    네이버클라우드 서버 인증키 설정하기

     

    인증키를 설정하신 후에는 네트워크 접근 설정을 해주셔야 합니다. 기본적으로 ncloud-default-acg 접근 설정을 제공하고 있습니다. ACG는 추후 외부에서 접속 가능하도록 방화벽 설정 시 필요한 기능입니다.

     

    네이버클라우드 네트워크 접근 설정하기

     

    네트워크 접근 설정까지 모두 마쳤다면 마지막으로 생성할 서버의 최종 스펙을 확인한 후에 [서버 생성] 버튼을 클릭합니다.

     

    네이버클라우드 생성할 서버 최종 스펙확인하기

     

    서버 생성을 마치면 다음과 같이 서버 목록에 새로 생성한 서버가 나타나게 됩니다.

     

    새로 생성한 서버가 목록에 추가되어 나타남.

     


     

    👑 네이버클라우드 서버에서 Streamlit 구동하기

    서버 생성까지 완료했다면 이제 직접 만들어놓은 서버로 접속해 보도록 하겠습니다. 단, 서버가 생성되면 바로 접속할 수 있는 게 아니라 두 가지 설정이 추가적으로 필요합니다. 첫 번째로는 외부에서 접속이 가능하도록 포트포워딩을 해주셔야 하고 두 번째로는 서버의 관리자계정 비밀번호를 알아야 합니다.

     

    먼저 포트포워딩을 설정하기 위해서는 다음과 같이 생성된 서버를 체크하시고 상단 메뉴의 [포트 포워딩 설정] 버튼을 클릭하시면 됩니다.

     

    SSH 접속을 위한 포트포워딩 설정하기

     

    포트 포워딩 설정화면은 다음과 같습니다. 새로 생성된 서버에 외부 포트를 입력하시고 [+추가] 버튼을 클릭하시면 됩니다. 포트 번호는 1,024 ~ 65,534 사이로 선택해 주시면 됩니다. 추가적으로 클라우드 서버로 접속하기 위한 터미널 프로그램이 필요한데요. 따로 사용하시는 게 없으시다면 Putty라는 프로그램을 다운로드하시면 됩니다. 왼쪽 하단에 설치할 수 있는 페이지로 이동되는 링크가 있습니다.

     

    SSH 접속을 위한 외부포트 추가

     

    다음은 서버에 접속할 수 있는 관리자 비밀번호를 확인해야 합니다. 비밀번호를 확인하는 방법은 다음과 같습니다. 다시 생성된 서버를 체크하시고 상단의 [서버 관리 및 설정 변경 ▼] 버튼을 클릭하여 [관리자 비밀번호 확인] 메뉴를 선택합니다.

     

    서버 관리자 비밀번호 확인하기

     

    그러면 다음과 같이 인증키를 요구하는 화면이 나타나는데 앞서 서버를 설치할 때 사용한 인증키 파일을 이곳에 업로드하시고 [비밀번호 확인] 버튼을 클릭하시면 됩니다.

     

    인증키를 통해 관리자 비밀번호 확인하기

     

    그 후에는 다음과 같이 관리자(root) 비밀번호를 확인하실 수 있습니다.

     

    관리자(root) 비밀번호 확인하기

     

    준비가 다 되었으므로 이제 Putty를 통해 서버로 접속해 보도록 하겠습니다. Putty 사용방법은 간단합니다. 포트 포워딩 정보에 나와있는 정보를 각각 Host NamePort에 넣어주시고 [Open] 버튼을 클릭하시면 됩니다.

     

    포트 포워딩 정보를 통해 Putty로 서버 터미널 접속하기

     

    처음에는 새로운 IP주소로 연결을 허용할 것인지 확인하는 창이 나타날 수 있는데 [Accept] 버튼을 클릭하시고 넘어가시면 됩니다. 그러면 다음과 같이 로그인 콘솔화면이 나타나는 것을 보실 수 있습니다. 이때 앞서 확인한 관리자 계정 ID(root)와 비밀번호를 입력하시면 됩니다.

     

    root계정으로 네이버클라우드 서버 ssh 터미널 접속하기

     

    그 후 ls -al 명령어를 입력해 보시면 다음과 같이 접속이 잘 된 것을 확인하실 수 있습니다.

     

    네이버클라우드 서버 터미널 접속 성공

     

    다음은 Github에서 Streamlit 프로젝트를 내려받도록 하겠습니다. 네이버클라우드 서버는 기본적으로 git을 제공하고 있어서 따로 설치하지 않으셔도 명령어들을 간편하게 사용하실 수 있습니다. Streamlit 프로젝트 주소를 넣고 다음과 같이 다운로드하시면 됩니다.

     

    프로젝트를 다운로드하였다면 다음으로는 도커를 설치해야 합니다. 앞서 서버를 설치하실 때 보셨을 텐데요. 네이버클라우드 Classic 환경에서는 현재를 기준으로 CentOS 7 리눅스만을 지원하고 있습니다. 따라서 도커를 설치하실 때는 CentOS 명령어로 설치해 주시면 됩니다.

     

    단, 주의하실 점은 2024년 6월 30일 CentOS 7 EOS에 따라 기존의 레포지토리 내 패키지들이 삭제되었다고 합니다. 따라서 도커를 설치하실 때 공식홈페이지를 참조하셨다면 다음과 같은 오류가 발생하실 수 있습니다. Could not resolve host: mirrorlist.centos.org; Unknown error

     

    따라서 설치하기 전에 다음과 같이 리눅스 패키지를 다운로드할 수 있는 레포지토리 경로를 mirror에서 valut로 변경하셔야 합니다.

     

    sed -i.bak 's/mirrorlist/#mirrorlist/g' /etc/yum.repos.d/CentOS-*
    sed -i.bak 's|#baseurl=http://mirror.centos.org|baseurl=http://vault.centos.org|g' /etc/yum.repos.d/CentOS-*

     

    이후에는 도커 공식사이트를 참조해서 아래와 같은 순서로 설치를 진행합니다.

     

    1. 도커를 설치할 수 있도록 레포지토리 주소 등록

    yum install -y yum-utils
    yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo

     

    2. 도커 설치

     yum install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin

     

    3. 도커 구동

    systemctl start docker

     

    도커 설치 후 구동까지 완료했다면 다음과 같이 docker ps -a 명령어를 실행했을 때 아래와 같이 잘 동작하는지 확인해 보시면 됩니다.

     

    도커 설치 완료

     

    도커설치까지 완료하셨다면 이제 프로젝트에 준비된 도커파일을 빌드하고 실행하시면 됩니다. Dockerfile이 존재하는 프로젝트 루트 경로로 이동한 후에 아래와 같은 순서로 명령어를 입력합니다.

     

    1. Dockerfile에 환경변수 세팅 (api key값)

    # API 키를 위한 환경 변수 설정 (기본값은 빈 문자열)
    ENV CLOVASTUDIO_API_KEY=CLOVA STUDIO API 키 값 입력
    ENV APIGW_API_KEY=API GW API 키 값 입력

     

    2. 도커파일 빌드 후 실행

    docker build -t my-streamlit-app .

     

    3. Streamlit 실행

    docker run -p 8501:8501 my-streamlit-app

     

    도커 컨테이너로 Streamlit 구동

     


     

    🤝 외부 접속 가능한 환경 만들기

    도커 컨테이너로 Streamlit 구동까지 완료하셨다면 여기서 끝이 아니라 외부에서 접속 가능하도록 공인 IP를 발급받으셔야 합니다. 공인 IP는 다음과 같이 네이버클라우드 플랫폼 왼쪽 내비게이션바에서 [Server] > [Public IP] 메뉴에서 발급받으실 수 있습니다.

     

    외부에서 접속 가능한 공인 IP 생성하기

     

    위와 같이 [+ 공인 IP 신청] 버튼을 클릭해서 서버를 선택한 다음 [다음 >] 버튼을 클릭합니다. 그러면 다음과 같이 최종 확인을 하실 수 있습니다. 공인 IP는 월 이용료 4,032원으로 발급받을 수 있다는 것을 확인하실 수 있습니다.

     

    최종 확인 후 생성하기

     

    [생성] 버튼을 클릭하고 나면 곧바로 공인 IP가 만들어지는 것을 확인하실 수 있습니다. 이후에는 ACG 설정하러 가기 링크를 클릭하셔서 방화벽 설정을 해주시면 됩니다.

     

    공인 IP 신청 완료 후 ACG 설정 하러 가기

     

    ACG 설정은 다음과 같이 진행해 주시면 됩니다. 앞서 Putty로 접속하기 위해서 포트포워딩을 해주신 것과 비슷합니다. 접근 소스를 0.0.0.0/0으로 설정해 주시고 하용 포트에 Streamlit 포트번호를 입력해 주시면 어디서든 저의 Streamlit 앱에 접속할 수 있는 환경이 만들어집니다.

     

    ACG에 Streamlit에서 사용한 8501 포트 규칙 추가하기

     

    마지막으로 [적용] 버튼을 클릭하시면 ACG 규칙이 적용되어 앞서 설정한 공인 IP와 포트번호로 웹사이트에 접속할 수 있게 됩니다.

     

    공인IP 및 개방된 포트로 접속시 Streamlit 앱이 외부에서 접근가능해진다.

     


    🌠 마무리하며

    이제 이 공인 IP로 누구나 어디서든 접속가능하게 되었습니다. 대략 월 30,000원 정도의 가격으로 이러한 환경을 구축해볼 수 있었는데요. 이곳에서 따로 다루지는 않겠지만 조금 더 안전하게 적용하시려면 SSL과 도메인을 추가적으로 적용하신 뒤에 만들어진 URL을 상대방에게 전달하는 것이 좋습니다.

     

    이로써 네이버클라우드를 활용하여 Streamlit 챗봇을 외부에서 접속 가능하도록 배포해 보는 과정이 끝이 났습니다. 비록 이미지가 많아서 긴 글이 되었지만 막상 시도해 보면 생각보다 쉽고 얼마 안 걸린다는 것을 깨닫게 되실 겁니다. 긴 글 읽어주셔서 감사드립니다. 다들 Streamlit을 활용하여 재밌는 프로토타입 많이 만들어보시길 바랍니다. 🤗

     

    댓글

Designed by Tistory.