본문 바로가기
Backend MLOps/Fastapi

[DL Serving] FastAPI 튜토리얼 - 3

by SteadyForDeep 2021. 12. 5.
반응형

이번에는 main.py에서 include 했던 router들을 한번 들여다 보도록 하자.

 

다른 파일들은 모두 무시하고 우리가 import 했던 녀석들만 들여다보도록 하자.

 

train을 먼저 봤다.

이런것들이 import 된다. app.utils 는 무시하고 지나쳐왔던 내용들이므로 필요할때 다시 올라가서 보도록 하자.

 

https://lucky516.tistory.com/86?category=1055020 

 

[Fast API] Fast API 배우기 1부 - 시작 및 path parameter

Fast API란? 파이썬 웹 프레임워크중 가장 빠른속도를 지닌 프레임워크. Node.js와 Go와 속도가 맞먹는다 속도만 빠를뿐만 아니라 개발속도도 미치도록 빠르다 인터넷에 자료는 적지만 그걸 커버쳐

lucky516.tistory.com

위의 블로그를 잘 읽어보면 path operation이 무엇인지 이해할 수 있는데

HTTP의 method들이 각각 하나의 operation으로 정의되고 path를 해석하는 부분을 path operation이라고 할 수 있겠다.

 

fastapi의 공식적인 프로젝트 예제를 보면 이런식으로 구성이 된다고 예를 드는데

만약 users 라는 파이썬 처리와 items 라는 python 처리에 접근해야한다고 하면

어떤 경로로 접근이 가능하게 할 것인가를 router로 지정해 줄 수 있다고 한다.

자세한 부분은 공식문서의 APIRouter 검색 결과를 참고하면 된다.

 

그러니까 프로젝트 안에서 구현된 어떤 기능을 이용하기 위해서 경로를 지정해 줘야하는데

이 부분을 해결해 주는 API가 Router인 것이다.

이렇게 일련의 정보를 입력받아서 모델을 학습하는 함수를 작성하고 데코레이터롤 감싸주었다.

내용은 조금 더 들여다보면 알게 되겠지만 우선 직관적으로

사용할 수 있는 포트를 찾아서 하나 가져온 후

학습에 대한 정보를 yml파일로 저장하고

NNI를 이용해서 학습을 위한 서버와 데시보드를 열어둔다.

이때 subprocess를 사용하게 되는데 정말 간단하게만 설명하자면

subprocess 쉘을 하나 생성하고 그 쉘에서 동작한 결과를 main process가 동작하는 쉘에서 출력하는 것이 아니라

main process에서 다룰 수 있는 형태의 변수로 저장할 수 있는 기능이다.

성공적으로 NNI 서버가 만들어졌으면 해달 출력내용을 파싱해서

멀티프로세스로 실험을 진행한 후 로그를 남긴다.

실패할 결우 실패에 관한 로그를 남긴다.

 

가장 먼저 사용된 get_free_port부터 보자.

soketserver로 부터 사용가능한 포트를 하나 잡아오는 모습이다.

 

실험 관리 툴인 NNI는 AutoML을 편리하게 구현해주는 툴로

yaml파일 을 입력받아서 동작한다. 그 yaml파일을 작성하기 위한 함수이다.

with문으로 context를 관리하기 때문에 close()는 생략해도 될듯 하다.

yaml 패키지는 pip install pyyaml 을 통해서 받을 수 있다.

 

이번에는 multiprocess를 통해서 돌아가게 되는 NniWatcher 클래스를 한번 보자.

instance를 생성하고 나서는 execute() 를 이용해서 동작하게 된다.

def __init__(slef): 함수는 생략

 

먼저 self.watch_process() 를 보자.

세가지 단계로 나뉘는데

진행중인 실험의 로그를 갱신하고 갱신된 로그에 DONE 이 포함되어 있다면 실험과 루프를 멈춘다.

그렇지 않은 경우 로그의 실험 ID가 실험 리스트에 있는지 아닌지 확인하고 없으면 루프를 멈춘다.

아닌 경우 모델을 계속 업데이트 해준다.

 

자세한 내용은 링크로 남긴 깃헙에서 볼 수 있으니 확인하기 바란다.

 

중요한 부분은 모델을 업데이트 하는 부분인데

 

저기서 engine은 database.py 에서 sqlalchemy 를 이용해서 만든 db 연동 객체다.

그리고 UPDATE_TEMP_MODEL_DATA 는 쿼리에 해당한다.

 

import 부분을 보면 dotenv 를 이용해서 입력되는 변수를 감춰두는 모습을 볼 수 있다.

dotenv 같은 경우는 .env 파일을 생성해서 파이썬의 환경변수를 추가하는 방법으로

보안이 이루어져야하는 변수를 감추는 방법인데 아래의 블로그를 참고하면 정보를 얻을 수 있다.

https://one-step-a-day.tistory.com/152

 

환경변수 사용하기(.env 사용하기)

프로젝트를 진행하다 보면 코드에 서버 접속 정보를 기입해야 할 때가 있다. git repo가 private으로 되어있다면 상관없지만, 언제까지나 모든 프로젝트를 private으로 할 수는 없다. 그래서 외부에 감

one-step-a-day.tistory.com

 

sqlalchemy 는 sql 데이터베이스와 소통하기 위한 파이썬의 라이브러리다.

굉장히 광범위하게 사용되고 사실상 표준으로 알고 있다.

아래의 영상을 통해서 sql이 fastapi와 연동되는 방식을 빠르게 익힐 수 있다.

https://www.youtube.com/watch?v=N8i4GcRRkV8 

간단한 조사를 통해 얻은 사실들을 나열하면

ORM은 객체와 db를 연동하여 mapping 시켜주는 방식으로 객체와 db가 물려있는 session을 단위로 동작한다.

그리고 declarative_base를 상속해 선언된 객체들을 db로 맵핑해 주는 방식으로 진행된다.

겉핥기 식으로 조사한 내용이라 틀린 부분이 있을 수 있으니 주의하기 바란다.

 

postgresql 을 사용하는 것을 확인할 수 있다.

optuna를 이용한 분산 AutoML 에서 postgresql로 실습을 했는데 운이 좋게도 동일한 db를 사용한다.

 

이 다음 글에서는 db를 열고 연동해서 함께 사용해보는 부분 까지 진도를 나가보면 되겠다.

반응형

댓글