본문 바로가기
Backend MLOps/Fastapi

[DL Serving] FastAPI 튜토리얼

by SteadyForDeep 2021. 12. 1.
반응형

 

//FastAPI

 

FastAPI는 REST API 를 기반으로 한 파이썬 백엔드 프레임워크다.

REST API는 HTTP 프로토콜을 잘 사용하기 위한 규약이다.

HTTP 프로토콜은 웹을 통해서 기기간 페킷을 주고받는 방법을 정한 약속이다.

페킷은 다른 기기로 전송되는 데이터의 뭉치다.

 

// 1

 

우선은 아주 간단한 hello world 페이지를 만들어 보자.

https://fastapi.tiangolo.com/

 

FastAPI

FastAPI FastAPI framework, high performance, easy to learn, fast to code, ready for production Documentation: https://fastapi.tiangolo.com Source Code: https://github.com/tiangolo/fastapi FastAPI is a modern, fast (high-performance), web framework for buil

fastapi.tiangolo.com

튜토리얼을 참고했다.

 

from typing import Optional

from fastapi import FastAPI

app = FastAPI()

@app.get("/")
def read_root():
    return {"Hello" : "this is main page"}

@app.get("/items/{item_id}/{q}")
def read_item(item_id: int, q: Optional[str] = None):
    return {"item_id": item_id, "q": q}

자세하게 들어다 보지는 않았지만

서버 인스턴스를 app으로 만들고 .get은 REST API의 crud 중 하나로

arg로 주어지는 url을 해석하여 decorate된 함수에 전달하는 역할을 한다고 볼 수 있겠다.

 

우분투 서버는 바쁜상태라 윈도우에서 돌렸는데 unicorn의 경로를 찾지못해서 pyhon -m으로 돌려주었다.

localhost에 8000번 포트를 물고 서버가 열린 모습

main:app 은 main.py에 생성된 app이라는 서버 인스턴스를 말하고

--reload는 코드가 수정될 경우 실시간으로 반영하여 페이지를 수정하는 것이라 한다.

 

잘된다.

이제 이 서버를 도커에 넣고 돌려보자.

나중에 쿠버네티스 같은 환경에서 사용하기 위한 초석이다.

// 2

https://www.youtube.com/watch?v=0kQC19w0gTI 

도커파일 작성은 매번 여기를 참고하고 있다.

 

https://swalloow.github.io/dockerfile/

 

파이썬을 위한 Dockerfile 작성하기

Docker가 처음이라면, 이전 포스팅을 참고하시기 바랍니다. Docker 간편한 설치부터 실행까지 Docker, DockerHub 명령어 정리 파이썬을 위한 Dockerfile 작성하기 Flask Application Dockerfile은 일종의 이미지 설

swalloow.github.io

파이썬을 위한 도커파일 작성, 빌드 방법이 잘 나와있는 블로그다.

컨테이너의 최고 미덕은 가벼움인 만큼 생각보다 빌드가 내맘같지 않다.

apt 를 최신 버전으로 업데이트 하는데 드는 시간이 상당히 긴 편이므로

에러 메세지 하나하나를 꼼꼼하게 잘 따져보면서 진행해야 한다.

 

docker build -t fast-api-tutorial .

도커 데스크탑을 실행해서 도커 데몬이 뜨면 위 명령어를 실행한다.

원도우에 도커랑 쿠버네티스 미니쿠베 쿠베플로우.. 할말 참 많은데

까먹기 전에 꼭 정리하도록 하겠다.

진행이 잘 된 것을 확인했다.

requirements.txt는 `pip freeze > requirements.txt` 를 통해서 만들 수 있다.

이미지 생성이 도커 데스크탑에서 확인된다.

컨테이너 이름은 따로 주지 않아 해싱된 모습

 

그런데 이렇게 돌리면 외부에서 접속이 불가능 해진다.

왜냐하면 컨테이너 내부에서는 컨테이너에 할당된 ip를 litsen하도록 localhost가 설정되어 있기 때문이다.

예를 들면 172. 어쩌구 하는 컨테이너에 할당되는 ip만 듣고 있는 상태가 되는데

192.어쩌구 하는 내 호스트OS가 할당 받은 ip는 컨테이너 입장에서는 무시하는 ip가 된다.

그러므로 컨테이너 내부의 서버는 전범위를 듣는 서버가 되어야 한다.

나는 포트나 다른 변수들을 중복해서 쓰는 것을 정말 싫어하는데

특히나 튜토리얼에서는 바른 이해를 위해서 꼭 이렇게 저렇게 바꿔보면서 이해해야한다고 생각한다.

호스트의 8090 포트로 접속해보면 아래와 같이 실행되는 것을 알 수 있다.

반응형

댓글