본문 바로가기
Backend MLOps/Fastapi

[DL Serving] FastAPI 튜토리얼 - 2

by SteadyForDeep 2021. 12. 4.
반응형

이번에는 잘 작성되어있는 코드를 이용해서

line-by-line으로 이해하며 딥러닝 서빙을 위한 웹서버를 만들어 보자.

 

https://github.com/State-of-The-MLOps/MLOps

 

GitHub - State-of-The-MLOps/MLOps: 👊 Build MLOps system step by step 👊

👊 Build MLOps system step by step 👊. Contribute to State-of-The-MLOps/MLOps development by creating an account on GitHub.

github.com

최근 T-academy 에서 MLOps를 수강하셨던 분들과 함께 스터디 교류를 하게 되었는데

그분들이 직접 작성하고 시연까지 해 주신 코드들이어서 이걸 분석해보기로 했다.

좋은 코드와 지식을 공유해 주신 분들께 다시 한번 감사드린다.

 

main.py 부터 시작하여 기능 하나하나를 파고 들어가면서 분석해 보도록 하자.

 

우선은 app의 미들웨어를 추가하는 부분을 이해해야 하는데 미들웨어의 설명이 FastAPI 공식 docs에 나와있다.

보면 request를 받은 서버가 response를 보내는 하나의 경로가 있다고 한다면 그 경로의 중간에 배치되어

일종의 훅과 같은 역할을 하는 operation임을 알 수 있다.

여기서는 add_middleware를 이용해서 CORSMiddleware 를 추가해주는데

CORS는 Cross-Origin Resource Sharing 의 약자임을 알 수 있다.

문서에 따르면 CORS의 기능은 FE와 BE의 소통에 있어서 origin이 서로 다를때 이를 완충해주는 역할인데

Origin 이라는 개념은 프로토콜, 도메인, 포트가 결합되어있는 하나의 형식임을 알 수 있다.

URL을 작성할때 항상 앞쪽에 위치하는 중요한 부분으로

같은 URL내에서 이후에 작성되는 request들이 어디서 처리되어야하는지 알려주는 부분이다.

사용자가 어떤 프로토콜을 쓸지, 어떤 도메인으로 접속할지 알 수 없는 상황에서 사용하는 기능으로 보인다.

혹은 특정한 조합의 Origin 만 listening 하려고 할때 사용할 수 있을 것이다.

 

정리해보면 대략 이런데 request header는 http구조를 조금 알아야한다.

http request는 head와 body로 나눠지는 구조를 가진다고 한다.

이 부분은 html의 head와 body를 말하는 것이 아니고

html같은 정보는 body에, 그 밖에 meta data에 해당할 수 있는 정보들을 header에 담는 모양이다.

아무튼 이렇게 여러 origin 에 대해서 요청을 들을 수 있는 미들웨어를 추가했다.

 

http 구조를 위해서는 아래의 본문을 참고하기 바란다.

https://blueyikim.tistory.com/1999

 

[정보] HTTP 구조 - 헤더(Header)와 본문(Body)

하이퍼 텍스트 전송 프로토콜(HTTP, Hyper Text Transport Protocol) 통신을 사용하면 클라이언트와 서버간에 두 가지 유형의 메시지 (HTTP 요청 및 HTTP 응답)를 전송할 수 있다. 클라이언트/브라우저가 요청

blueyikim.tistory.com

 

이제는 include_router를 이해해야하는데 내가 아는 router는 와이파이공유기 밖에 없어서 한번 찾아봤다.

위키피디아에 따르면 router는 한마디로 요약해서 '중계기' 이며

네트워크 페킷이 가야만 하는 곳으로 가장 빠르게 전송해주는 장치이다.

와이파이 공유기에서도 알 수 있듯 1개 이상의 하위망을 가진다고 되어있다.

이건 물리적인 router 의 의미였고 조금 더 찾아보니

```

클라이언트의 요청 경로(path)를 보고 이 요청을 처리할 수 있는 곳으로 기능을 전달해주는 역할

출처: https://cotak.tistory.com/85 [TaxFree]

```

이라는 설명을 봤다. 이해가 되는 문장이다.

내가 휴대폰으로 컴퓨터에 접속하려면 휴대폰, 컴퓨터 둘 다 router에 연결되어 있어야하고

휴대폰에서 발생시킨 요청을 컴퓨터로 전달해 주는 역할을 하는게 router로 볼 수 있으므로

이를 객체적으로 구현해 두었다고 이해했다.

 

위의 predict와 train은 저장소에 따로 작성한 py 파일에 있는 부분으로 지금은 일단 넘어가자.

대략 의미만 유추해 보면 predict나 train 기능을 수행하는 객체들이 있고

이 객체들을 중계해 주는 중계기를 지금 app에 연결한다고 보면 되겠다.

 

그러고 '/'에서 발생되는 하나의 response를 적어주었다.

uvicorn을 CLI로 실행할 수도 있지만 이 코드의 경우 python script 내부에서 실행하는 모습을 볼 수 있다.

 

이렇게 하면 main.py 파일의 작성이 완료된다.

반응형

댓글