Backend MLOps/Fastapi

[DL Serving] FastAPI 튜토리얼 - 3

SteadyForDeep 2021. 12. 5. 02:59
반응형

이번에는 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를 열고 연동해서 함께 사용해보는 부분 까지 진도를 나가보면 되겠다.

반응형