ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [GCP] Cloud Run을 활용한 Palm 2 챗봇 만들기
    IT/GCP 2023. 12. 31. 12:47
    728x90

    안녕하세요,
    오늘은 GDG Cloud 2023에서 발표한 내용인 Palm2 API를 활용한 Cloud Run 챗봇 배포에 대해서 작성하려고 합니다.
     
    먼저, 오늘의 주인공인 PaLM2에 대해서 알아볼까요?
    PaLM2 모델Pathways Language Model라고 합니다.
    직역하면 경로 언어 모델을 의미하는데요,
     
    2022년 4월에 PaLM의 첫 선을 보인 LLM입니다.
    PaLM 2는 2023년 5월에 버전 2를 내놓았습니다.
    바로 얼마전엔 Gemini가 나왔죠.
     
    1. PaLM2의 기능

    PaLM2 Icon
    1. 텍스트 처리
    2. 감정 분석
    3. 분류

    100개 이상의 언어에 대해 훈련된 LLM으로 위의 작업이 가능한 언어 모델을 다루는 api입니다.
    실제 해당 모델을 적용해서 미국 의사 면허 시험 80점으로 통과 점수를 받을 수 있는 Med-PaLM2,
    그리고 보안 취약 사항 점검에 사용될 Sec-PaLM2 등도 나왔답니다.
     

     
    현재 우리가 많이 사용하고 있는 Bard의 Backend에서도 사용되는 LLM입니다.

     
    텍스트 생성 및 번역, 요약, 내용 분석, 추리, 코드 생성 및 분석
    5400억개의 파라미터를 학습시켜서 이런 모든 기능들이 가능합니다.
     
    2. PaLM2 모델 (사이즈별 분류)
     

    현재 발표된 PaLM 2의 사이즈별 모델입니다.
    Gecko, Otter, Bison, Unicorn으로 나뉘는데요,
     
    학습된 파라미터 개수는 다음과 같습니다.
     
    Gecko 모델 12억 개
    Otter 모델 1370억 개
    Bison 모델 5400억 개
    Unicorn 모델 1.5조 개
     
    기능별 분류는
     
    Gecko - 소규모 디바이스
    Otter - 유니모달
    Bison - 멀티모달
    Unicorn - 초거대 LLM으로 고성능 모델에 사용됩니다.
     
    3. PaLM 모델 테스트!
     
    PaLM2를 통해서 간단히 테스트를 해보겠습니다.
    API Key는 여기서 만드시고 받으시면 됩니다!
    https://makersuite.google.com/app/apikey?hl=ko

     
    간단한 API 테스트는 Google Colab에서도 가능합니다.
    임의적으로 노트북을 만들어서 진행해 주세요!

     
     
    테스트 코드 1. 기본 PaLM2 테스트

    import google.generativeai as palm
    palm.configure(api_key='API KEY')
    response = palm.chat(messages='Hi, everyone who is attending GDG Devfest Cloud 2023!')
    print(response.last)

     
    테스트 코드 2. Text-bison 모델을 활용한 답변받아보기

    text_model = TextGenerationModel.from_pretrained("text-bison@001")
    prompt = """
    너는 서비스 봇이야.
    오늘 날씨는 추워.
    오늘은 크리스마스야.
    고객을 위한 인사 말을 만들어줘.
    """
    response = text_model.predict(prompt=prompt, temperature=0.8)
    print(response.text)

     
    결과는 다음과 같습니다.

     

    테스트 코드 3. 단순 답변받아보기

    from vertexai.language_models import TextGenerationModel
    # 프롬프트 설정
    prompt = "GDG Cloud Korea가 뭐야?"
    # 모델 로드
    generation_model = TextGenerationModel.from_pretrained('text-bison@001')
    # 텍스트 생성
    response = generation_model.predict(
        prompt=prompt,
        max_output_tokens=256, //최대 토큰 갯수
        temperature=0.2, //답변의 창의성
        top_p=0.8, //누적 확률 합
        top_k=40, //누적 확률 갯수
    )
    # 결과 출력
    print(response.text)



    결과 화면은 다음과 같습니다.

     
    테스트 코드 4. Streamlit을 활용한 간단한 애플리케이션 만들기

    import streamlit as st
    from vertexai.language_models import TextGenerationModel
    
    # 환경 변수에서 서비스 계정 키 파일 경로 읽기
    service_account_key_path = os.environ.get<'credential json 키의 경로'>
    
    # Streamlit UI 구성
    st.title("Text Generation with Vertex AI")
    prompt = st.text_input("프롬프트를 입력하세요:", "GDG Cloud Korea가 뭐야?")
    generate_button = st.button("입력")
    
    # 모델 로드
    generation_model = TextGenerationModel.from_pretrained('text-bison@001')
    
    # 버튼 클릭시 text 생성하기
    if generate_button:
        with st.spinner('텍스트를 생성 중입니다...'):  // 텍스트 생성 중 스피너 동작시 문구
            response = generation_model.predict(
                prompt=prompt,
                max_output_tokens=256,
                temperature=0.2,
                top_p=0.8,
                top_k=40,
            )
            # 생성된 텍스트 확인하기
            st.write(response.text)

     
    Credential의 생성에 관련해서는 다음에 작성하겠습니다.
    해당 내용에 어려움이 있으신 분들은 우선 하기 링크를 참고해 주세요!
    https://cloud.google.com/docs/authentication/provide-credentials-adc?hl=ko
     
    Streamlit을 활용하시면, 다음과 같이 확인이 되는데요,
    Network URL을 통해서 애플리케이션으로의 접근이 가능합니다.

     
     
    실행 화면

     
     
    맛보기는 여기까지 하고, 애플리케이션을 만들어 보겠습니다.

     
    우선 오늘 저희가 챗봇 애플리케이션을 올릴 워크로드는 Cloud Run이라고 합니다.
     

    Cloud run icon

     
     
    관리형 컴퓨팅 플랫폼으로 안정적인 https를 핸들링할 수 있으며, 인프라 걱정 없이
    개발에만 집중할 수 있는 제품입니다.
     
    클라우드런에 도커라이즈 된 애플리케이션을 배포해 보겠습니다.
     

     

     

     
    오늘의 애플리케이션은
    입력창, 입력 / 취소 버튼, 응답창으로 구성됩니다.
     
     
    # app.py의 챗봇 부분

    def create_session():
        chat_model = ChatModel.from_pretrained("chat-bison@001")
        chat = chat_model.start_chat()
        chat.send_message(PROMPT)  # 프롬프트 내용 전달
        return chat
    
    def response(chat, message):
        parameters = {
            "temperature": 0.2,
            "max_output_tokens": 256,
            "top_p": 0.8,
            "top_k": 40
        }
        result = chat.send_message(message, **parameters)
        return result.text

     
    # 프롬프트 설정부

    PROMPT = "너는 Devfest Cloud chat봇이야, \
    인사할 때는 Devfest Cloud 2023 행사에 오신 것을 환영합니다!라고 얘기해줘. \
    이벤트 정보 : 일시 : 2023년 12월 9일 토요일 \
                 장소 : 연세대학교 공학원에서 진행되고, \
    처음에는 오늘의 날씨 얘기를 한 줄 정도 하면서 가볍게 인사를 해줘. \
    참가 예정자, 챗봇 만든 사람은 물어볼 경우에만 알려줘. \
    2023년 12월 9일 오후 1시 기준 현재 참가 예정자는 280명이야. \
    이 챗봇을 만든 사람은 GDG Cloud Korea 챕터 오거나이저 최치영이야."

     
    # Flask application 이벤트 핸들러 세팅

    @app.route('/')
    def index():
        return render_template('index.html')
    
    @app.route('/palm2', methods=['GET', 'POST'])
    def vertex_palm():
        user_input = ""
        if request.method == 'GET':
            user_input = request.args.get('user_input')
        else:
            user_input = request.form['user_input']
        chat_model = create_session()
        content = response(chat_model,user_input)
        return jsonify(content=content)
    
    if __name__ == '__main__':
        app.run(debug=True, port=8080, host='0.0.0.0')

     
    @app.route(‘/’)
    루트 경로에 대한 핸들러입니다.
    “/” 경로로 접근할 경우, 사전에
    만들어 놓은 index.html로 접근합니다.
     
    @app.route(‘/palm2’)로 접근할 경우,
    GET과 POST 메서드를 통해서 유저 인풋에 대해서 처리하는 핸들러입니다.
     
    # Dockerfile

    FROM python:3.8
    
    WORKDIR /app
    
    COPY . ./
    RUN pip install -r requirements.txt
    EXPOSE 8080
    
    CMD ["python", "app.py"]

     
     
    컨테이너화 된 애플리케이션을 Cloud Run을 통해서 올리기 위해서는 Dockerfile이 필요합니다.
    좌측 명령을 통해서 Requirements에 명시한 종속성 및 라이브러리를 설치합니다.
    Python app.py 명령을 통해서, app.py로 명시한 애플리케이션 코드를 실행합니다.

    Cloud run / Github 연동
     
    사진과 같이 진행해 봅시다.

    이전 페이지에서 Set up with Cloud Build를 입력하면, 리포지토리 공급자를 선택하는 화면으로 이동합니다.
    연동할 Repo를 선택하세요!
     
    다음으로, 빌드 구성에 대해서 설정할 부분입니다.
    Branch를 설정하고, 소스 로케이션을 설정하는데, 앞서 만들어 둔대로 Dockerfile로 설정하면 됩니다.

     
     
    Github 코드를 fork 하시면,
    현재 Project id와 Location을 동적 할당되도록 설정하였기 때문에
    PROJECT_ID = os.getenv("PROJECT_ID")
    LOCATION = os.getenv("LOCATION")  

    vertexai.init(project=PROJECT_ID, location=LOCATION)
     
    Cloud Run에서 다음과 같이 별도 설정이 필요합니다.
     

     
     
    자 그럼, 애플리케이션이 동작하는지 확인해 봅시다.
    Cloud Run에 배포한 배포 경로를 눌러서 확인해 봅니다.

     
     
    응답을 받기까지 시간이 조금 걸릴 수 있는데, 조금 기다리시면
    다음과 같이 응답을 받아오는 것을 확인하실 수 있습니다.
     
    그리고 주의 사항입니다, 반드시 읽어주세요!
    .gitignore를 보시면 아시겠지만, 실수로라도 본인의 credentials.json 파일은 github 업로드 하지마세요
     

     
    그럼 올 한 해 마무리 잘하시고, 새해 복 많이 받으세요!!
     

     

    728x90
    반응형
Designed by Tistory.