이번에는 main.py에서 include 했던 router들을 한번 들여다 보도록 하자.
다른 파일들은 모두 무시하고 우리가 import 했던 녀석들만 들여다보도록 하자.
train을 먼저 봤다.
이런것들이 import 된다. app.utils 는 무시하고 지나쳐왔던 내용들이므로 필요할때 다시 올라가서 보도록 하자.
https://lucky516.tistory.com/86?category=1055020
위의 블로그를 잘 읽어보면 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
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를 열고 연동해서 함께 사용해보는 부분 까지 진도를 나가보면 되겠다.
'Backend MLOps > Fastapi' 카테고리의 다른 글
[Fastapi] asyncio 제대로 써보기 with pytest - 1 (0) | 2022.06.03 |
---|---|
[DL Serving] FastAPI 튜토리얼 - 4 (0) | 2021.12.06 |
[DL Serving] FastAPI 튜토리얼 - 2 (0) | 2021.12.04 |
[DL Serving] FastAPI 튜토리얼 (0) | 2021.12.01 |
[Github Action] python 프로젝트의 coverage 측정 후 보고 (0) | 2021.09.23 |
댓글