사이드 프로젝트로 KoGPT2를 활용해 "면접 도우미 챗봇"을 개발하기로 했다.
개발 환경: VSCode
일단 데이터랑 모델 학습에 대해서는 나중에 이야기해보도록 하고..
Flask로 구현한 챗봇을 Docker 이미지로 만들고, Render를 이용해 Public한 url로 배포해볼 생각이다.
(간단한 프로젝트이기도하고, 과금을 할 수가 없는 상황이라 무료로 사용할 수 있는 Render를 활용했다.)
Cloud Application Platform | Render
On Render, you can build, deploy, and scale your apps with unparalleled ease – from your first user to your billionth.
render.com
1. Flask app.py 파일 작성
from flask import Flask, render_template, request, jsonify
import torch
from transformers import GPT2LMHeadModel, AutoTokenizer
app = Flask(__name__)
# 모델 및 토크나이저 설정
# model_path = 'C:\\Users\\karen\\chatbot\\chatbot\\model\\best_model_1104.pt' # 파인튜닝된 모델 파일 경로
model_path = "model/best_model_1104.pt" # Docker 컨테이너 내부의 경로
model = GPT2LMHeadModel.from_pretrained("skt/kogpt2-base-v2")
tokenizer = AutoTokenizer.from_pretrained("skt/kogpt2-base-v2")
# 모델의 상태 불러오기
model.load_state_dict(torch.load(model_path, map_location=torch.device('cpu')))
model.eval()
device = torch.device('cpu') # 또는 'cuda' 사용 가능 시 설정
model.to(device)
# 응답 생성 함수
def generate_response(prompt, max_length=200):
input_ids = tokenizer.encode(prompt, return_tensors="pt").to(device)
output = model.generate(
input_ids,
max_length=max_length,
num_return_sequences=1,
no_repeat_ngram_size=2,
top_k=50,
top_p=0.95,
temperature=0.8,
do_sample=True,
repetition_penalty=2.0,
eos_token_id=tokenizer.eos_token_id
)
response = tokenizer.decode(output[0], skip_special_tokens=True)
return response
# 홈 페이지 (index.html)
@app.route('/')
def index():
return render_template('index.html')
# 챗봇 페이지 (chat.html)
@app.route('/chat')
def chat():
return render_template('chat.html')
# 챗봇 응답 API 엔드포인트
@app.route('/generate_response', methods=['POST'])
def chatbot_response():
user_input = request.json['user_input'] # JavaScript에서 전달한 사용자 질문
response = generate_response(user_input) # 생성된 응답
return jsonify({'response': response})
if __name__ == '__main__':
app.run(host="0.0.0.0", port=5000, debug=True)
app.py 파일을 작성할 때 주의할 것은 (1)model_path와 (2)host 설정이었다.
(1) model path
model path에 주석이 쳐있는 부분은 로컬에서 개발하고 테스트할 때 사용한 경로인데, Docker를 사용해 이미지를 만들고자 할 경우에는 Docker 컨테이너 내부 경로로 작성해주어야 한다.
Dockerfile에서 모델 파일을 컨테이너 내부로 복사한 위치를 참조해주면 된다.
(2) host 설정
Flask는 기본적으로 127.0.0.1 (localhost)에서 실행되며, 외부 네트워크에서 접근할 수가 없다.
그래서 Docker 컨테이너 내부에서 Flask 애플리케이션을 실행하기 위해서 host="0.0.0.0"으로 설정해주어야 컨테이너 외부에서도 접근할 수 있다.
이 부분을 명시해주지 않아서 잠깐 삽질을 했다..
2. requirements.txt 파일 작성
가상 환경 활성화
[가상환경이름]\Scripts\activate
requirements.txt 파일 작성
pip freeze > requirements.txt
가상 환경에 설치했던 모든 라이브러리가 requirements.txt 파일에 저장된다.
프로젝트 루트 디렉토리에 위치하도록 해주어야한다!
3. Dockerfile, .dockerignore 파일 작성
Dockerfile
# 1. Python 이미지 3.12 사용
FROM python:3.12-slim
# 2. 작업 디렉토리 설정
WORKDIR /app
# 3. 의존성 설치를 위한 requirements.txt 복사
COPY requirements.txt /app/requirements.txt
# 4. 의존성 설치 (필요한 빌드 도구 포함)
RUN apt-get update && apt-get install -y \
build-essential gcc \
&& pip install --no-cache-dir -r requirements.txt \
&& apt-get clean \
&& rm -rf /var/lib/apt/lists/*
# 5. 프로젝트의 소스 코드 복사
COPY . /app
# 6. 모델 파일 복사
COPY model/ /app/model/
# 7. 환경 변수 설정
ENV FLASK_APP=app.py
ENV FLASK_RUN_HOST=0.0.0.0
ENV FLASK_ENV=production
# 8. Flask 애플리케이션 실행
CMD ["flask", "run", "--host=0.0.0.0"]
.dockerignore
Docker가 이미지 빌드 과정에서 무시해야하는 파일과 디렉토리를 지정해주는 파일이다.
빌드 컨텍스트에서 불필요한 파일을 제거해 빌드 속도를 높이고 이미지 크기를 줄일 수 있다.
또한 외부에 노출되면 안되는 환경 변수 파일이나 로그 파일 등을 보호할 수 있다.
*pvc
__pycache__/
.git
pyvenv.cfg
Include/
Lib/
Scripts/
share/
4. Docker image 빌드
WSL 기반 Ubuntu 22.04.5 LTS 활용
1. ubuntu에 docker 설치
sudo apt-get update
sudo apt-get install -y docker.io
2. 설치된 Docker 버전 확인
docker --version
3. Docker 서비스 시작
sudo systemctl start docker
sudo systemctl enable docker
4. 재부팅
변경 사항을 적용하기 위해 재부팅 필수
5. 프로젝트 경로로 이동
cd /mnt/c/Users/<사용자명>/chatbot/chatbot
6. Docker 이미지 빌드
docker build -t chatbot-app .
7. Docker 이미지 확인
docker images
5. Docker Hub에 Docker image Push
1. Docker 로그인
Docker Hub 계정의 사용자명과 비밀번호를 입력해 로그인한다.
docker login
2. Docker Image 태그 지정
이미지를 push하기 위해서는 태그를 추가해주어야 한다.
docker tag chatbot-app <your-dockerhub-username>/chatbot-app:latest
3. Docker Image Push
docker push <your-dockerhub-username>/chatbot-app:latest
Docker Hub에 로그인해서 레포지토리에 이미지가 잘 업로드되었는지 확인하기!!
6. Render
1. Render 회원가입 및 새 Web Service 생성
회원가입 후 [Dashboard]에서 [+New] 클릭 -> [Web Service] 선택
[Source Code]에서 [Existing Image] 선택
[Image URL]에 Docker Hub에 Push한 이미지 입력
2. 서비스 이름 및 환경 설정
OOM 에러가 발생했다!!!
퍼블릭하게 배포하는 다른 방법을 찾아봐야겠다.
'Data Engineering > Docker' 카테고리의 다른 글
[Windows/Docker] Windows에 WSL2를 기반으로 Docker Desktop 설치해보자 (0) | 2024.11.17 |
---|---|
[Ubuntu/Docker] Ubuntu CLI에서 pip을 설치해보자 (의존성 설치 타임 아웃 에러 해결 방법) (2) | 2024.09.04 |
[Docker] Docker 디스크 사용량 확인하고, 용량 이슈 해결하자 (0) | 2024.09.04 |
[Linux/Docker] Docker Resistry에 대해 알아보고 이미지를 Push, Pull해보자 (0) | 2024.08.24 |
[Linux/Docker] Sinatra를 사용해보고 Ubuntu 서버에 배포해보자 (0) | 2024.08.24 |