개요

사무실 업무 중에 간단 딥러닝 모델 용 추론서버를 만들 일이 있어서 FastAPI를 통해 서빙하기로 했다. 과거 Flask를 써보았는데 2023년 기준 Python언어에서 제공하는 백엔드 프레임워크에서는 FastAPI가 확실히 점유율도 더 높아졌고 공부하며 구축해볼 때가 된 것같다.

환경

  • Ubuntu 20.04
  • python 3.8.15
  • FastAPI 0.104.1
  • uvicorn 0.23.2

설치

설치는 개발 환경에 pip를 통해 진행하였다. 해당 프레임워크의 파이썬 요구사항은 3.8 버전 이상이다.

$ pip install fastapi

그리고 이러한 서버 프레임워크는 Python의 경우 서버를 실행시키기 위한 ASGI가 필요하다. 단순히 파이썬 프로세스를 하나 실행시키고 종료하는 것이 아닌, 웹 서버에 대한 게이트웨이 인터페이스 표준을 유지하면서 지속 실행 및 비동기적 처리를 담당해주는 라이브러리를 필요로한다. FastAPI가 권장하는 것 중 하나인 uvicorn을 설치하였다.

$ pip install "uvicorn[standard]"

시작

개발환경을 셋팅했으니 서버에 대한 샘플코드를 작성해보고 실행해본다. 파일명은 일반적인 예제들 같이 main.py로 작성하였다.

# main.py
from fastapi import FastAPI

app = FastAPI()


@app.get("/")
def read_root():
    return {"Hello": "World!"}

서버 실행

CLI 기반 명령어를 사용하여 서버를 실행해준다.

# uvicorn {python module name}:{FastAPI() object}
$ uvicorn main:app --reload

--reload 옵션을 주면 내가 코드를 수정하고 저장할 때 마다 서버를 재시작하여 해당 변경 내용을 반영해준다. 개발 시 유용한 기능이다.

실행하면 다음과 같이 서버가 실행된다.

INFO:     Will watch for changes in these directories: ['/data/fastapi_serving']
INFO:     Uvicorn running on http://127.0.0.1:8000 (Press CTRL+C to quit)
INFO:     Started reloader process [73167] using WatchFiles
INFO:     Started server process [73169]
INFO:     Waiting for application startup.
INFO:     Application startup complete.

확인

curl을 활용해 내 FastAPI 서버에게 요청을 날려본다. IP 부분은 127.0.0.1이 아니라 localhost로 해도 결과는 동일하다.

$ curl 127.0.0.1:8000

> {"Hello":"World!"}

외부에서 연결

일단 본인이 개발 중인 서버가 작동하는 것은 확인했는데 우리 사무실에 있는 다른 개발자 분에게 잘 작동하는지 한번 접속해달라고 하니 접속이 안되고 있었다. 외부 공인 IP에 포트포워딩을 해놓은 것은 아니지만 내부망(192.168.X.X) IP기반으로 될 줄 알았는데 접속이 되지 않았다. 문득, Flask를 사용했을 때, bind-address 개념이 떠올랐고 찾아보니 공식문서에서 이를 지정할 수 있는 부분을 발견하였다.

host와 port 노출 변경

실행 시 --host 옵션을 통해 bind address 와 같은 기능을 수행하고 --port 옵션을 통해 노출시키는 포트를 변경할 수 있었다. 아래의 예제는 모든 IP로 부터의 접속을 허용하고 접속하기 위한 포트를 22222로 변경한다.

$ uvicorn main:app --relaod --host 0.0.0.0 --port 22222

>
INFO:     Will watch for changes in these directories: ['/data/fastapi_serving']
INFO:     Uvicorn running on http://0.0.0.0:22222 (Press CTRL+C to quit)
INFO:     Started reloader process [73244] using WatchFiles
INFO:     Started server process [73246]
INFO:     Waiting for application startup.
INFO:     Application startup complete

참고링크: FastAPI - Installation
참고링크: FastAPI - Deployment

Leave a comment