개요
사무실 업무 중에 간단 딥러닝 모델 용 추론서버를 만들 일이 있어서 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
댓글남기기