본문 바로가기
Cloud/Docker | K8s + CI, CD

[Docker] Flask로 NLP 모델 서빙하기

by HelloJudy 2022. 6. 25.

나는 현재 '💊 Pill my rhythm' 이라는 서비스 명을 가진 AI 웹서비스를 진행하고 있다.

 

우리 서비스의 메인 기능은 '자신의 증상을 문장으로 작성하면 영양제 추천을 해주는 서비스'이다.

 

나는 백엔드 포지션으로 프론트에서 인공지능 모델을 돌려 결과값을 반환받기 위해서

인공지능 모델을 서빙하려고 한다.

 

모델은 python 코드로 작성되어 python 서버를 위해서 Flask를 사용했다.

 

 

 

📌 [관련 포스팅]

 


1. 가상환경

 

우선 코드 작성에 앞서 파이썬 가상 환경을 구성해야한다.

 

가상 환경 구성에 대한 내 포스팅은 따로 확인해볼 수 있다.

 

👉 파이썬 가상 환경(virtualenv)과 Flask 서버 구축

 

파이썬 가상 환경(virtualenv)과 Flask 서버 구축

파이썬을 사용하여 프로젝트를 진행할 때엔 가상 환경을 구축한 뒤 개발을 권장하고 있다. 가상 환경을 구축하여 프로젝트를 하는 이유는 프로젝트 마다 라이브러리의 버전이 다를 수 있기 때

hello-judy-world.tistory.com

 

 

📎 방법은 총 두 가지로 

 

  1. Anaconda
  2. virtualenv, venv

2번의 차이는 다음과 같다고 한다.

 

 

출처: https://zetawiki.com/wiki/%ED%8C%8C%EC%9D%B4%EC%8D%AC%EA%B0%80%EC%83%81%ED%99%98%EA%B2%BD_virtualenv,_venv

 

 

 

2. NLP 모델, Flask 서버에 필요한 패키지 설치

 

나는 파이썬 3.8.5 버전에서 구성했다.

 

가상환경에서 NLP 모델을 실행시키기 위해 필요한 패키지를 설치했다.

 

이때 가상환경 내에서 pip로 설치하면 가상환경 폴더 내에 패키지를 설치한다.

 

$ pip install <패키지 명>

 

이때, 우리 프로젝트에서 형태소 분석을 위해서 konlpy 모듈을 사용했는데 konlpy 내 클래스는 Java 기반이기 때문에 JDK 설치 등 과정이 복잡하다. 🥺

 

 

해당 내용도 내 포스팅에서 확인할 수 있다.

 

👉 [AI] 자연어처리, konlpy 설치

 

[AI] 자연어처리, konlpy 설치

현재 AI 웹서비스를 진행하고 있다. 우리 서비스의 메인 기능은 자신의 증상을 문장으로 작성하면 영양제 추천을 해주는 서비스이다. 이때, 형태소 분석을 위해서 사용하는 모듈이 konlpy 인데 이

hello-judy-world.tistory.com

 

 

 

3. app.python

 

코드 생략을 했지만 Flask app을 만들어서 모델을 가지고 와서 결과값을 받아 response했다.

 

현재 메인 서버는 node이기 때문에 node 서버와 python 서버 간 통신을 통해 결과를 클라이언트에 반환해도 되지만

우리 서비스에서는 node를 거치지 않고 python 서버에서 조회 후 반환하는 것이 더 빠를 것이라 판단하여

Client <-> Python 이렇게 통신한다.

 

 

@app.route("/recommend", methods=['POST'])
@verifyToken
def recommend():
	# 1. request로 문장을 받고
    sentence = request.get_json()["sentence"]
    fk_user_id = g.userId
    # 2. test_model 이라는 모듈에 넣어서 모델 결과 값을 받는다.
    supplement = test_model(sentence)

    .
    .
    
    return {'results': recommend_supplement}


if __name__ == '__main__':
    app.run(port=5002, debug=True)

 

 

 

4. requirements.txt 파일 생성

 

모델에 필요한 패키지 목록을 파일로 만들어야 한다.

 

해당 파일을 만드는 방법은 위의 '가상환경 포스팅'에 작성해두었다.

 

 

 

5. Dockerfile

 

 

우선 모델 서빙을 위해서 자바를 설치해야하는데 처음에는 자바 위에 파이썬 설치를 시도했지만 설정에 어려움이 있어

파이썬 서버에 자바 설치하는 방식을 선택했다.

 

FROM python:3.8.13-slim
WORKDIR /app

RUN apt-get update -y
RUN apt-get install -y gcc g++

RUN apt-get install -y default-jdk

COPY . /app
COPY requirements.txt .

RUN pip3 install --no-cache-dir -r requirements.txt
RUN chmod +x /app/app.py
EXPOSE 5002
CMD ["gunicorn", "--bind", "0.0.0.0:5002", "app:app"]

 

 

✔️ FROM python:3.8.13-slim

 

base image를 선택한다. 콜론(:) 뒤는 태그를 의미하는데 도커 허브에서 확인할 수 있다.

 

그 다음 작업할 디렉토리를 선택해서 jdk를 설치하고 requirements.txt 를 복사한 다음 설치한다.

 

 

 

6. gunicorn

 

Dockerfile 마지막 CMD를 보면 gunicorn으로 실행한다.

 

왜냐하면 로컬에서 python app.py 로 실행을 하면 다음과 같이 경고 문구가 뜬다. 

Flask 내장 서버 (단일 프로세스)는  '대량 요청'이나 '동시 요청'을 효율적으로 처리하지 못하므로 Production 환경에서는 적합하지 않다.

 

 

 

 

✔️ WSGI server

 

WSGI 서버는 웹서버가 동적 페이지 요청을 처리하기 위해 호출하는 서버이다. 

 

 

 

  • 가상환경에서 설치
# gunicorn 설치
$ pip install gunicorn

# gunicorn 설치 확인
$ which gunicorn

 

  • 실행
# 실행
$ gunicorn --bind 0.0.0.0:8000 app:app &

 

🥺 여기서 주의!!!

 

윈도우에서 실행하려고 하면 ㅎ..

이런 에러를 발견한다..!

 

그 이유는

 

윈도우 환경에서는 사용할 수 없다!

 

따라서 나는 개발환경에서는 flask 내장 서버를 사용하고

배포 스크립트에서는 gunicorn을 사용했다.

 

 


📌 Reference

 

반응형

댓글