본문 바로가기
MLOps

MLOps - 14. FastAPI

by cocacola0 2022. 5. 29.

출처 : 변성윤님 블로그.
출처 : 부스트캠프 AI Tech.

1. FastAPI 익숙해지기

1.1 Event Handler

  • 이벤트가 발생했을 때, 그 처리를 담당하는 함수
  • FastAPI에선 Application이 실행할 때, 종료될 때 특정 함수를 실행할 수 있음
  • @app.on_event(“startup”)
  • @app.on_event(“shutdown”)
  • 예시
    • startup 할 때 머신러닝 모델 Load
    • shutdown 할 때 로그 저장
    • @app.on_event(“startup”)
    • @app.on_event(“shutdown”)

 

1.2 API Router

  • API Router는 더 큰 애플리케이션들에서 많이 사용되는 기능
  • API Endpoint를 정의
  • Python Subpackage
  • APIRouter는 Mini FastAPI로 여러 API를 연결해서 활용
  • 기존에 사용하던 @app.get, @app.post을 사용하지 않고, router 파일을 따로 설정하고 app에 import해서 사용
  • python3 12_api_router.py
    • user Router, order Router 2개 생성
    • app에 연결(include_router)
    • 실제 활용한다면 하나의 파일에 저장하지 않고 각각 저장
    • (user.py, order.py)
  • 2개의 Router가 추가됨
  • 예제 프로젝트 구조

1.3 Error Handling

  • Error Handling은 웹 서버를 안정적으로 운영하기 위해 반드시 필요한 주제
  • 서버에서 Error가 발생한 경우, 어떤 Error가 발생했는지 알아야 하고 요청한 클라이언트에 해당 정보를 전달해 대응할 수 있어야 함
  • 서버 개발자는 모니터링 도구를 사용해 Error Log를 수집해야 함
  • 발생하고 있는 오류를 빠르게 수정할 수 있도록 예외 처리를 잘 만들 필요가 있음
  • python3 13_exception_handling.py
    • 간단한 코드지만 Error를 발생할 확률이 높음
    • item_id가 1~3까진 정상
    • 4 이상의 숫자가 들어올 경우 Key Error가 발생 - Internal Server Error
@app.get("/v1/{item_id}")
async def find_by_id(item_id: int):
    return items[item_id]
  • item_id가 1일 경우 정상적으로 200 Return
  • item_id가 5일 경우 Internal Server Error 500 Return
  • item_id가 5일 경우 Internal Server Error 500 Return
  • 이렇게 되면 클라이언트는 어떤 에러가 난 것인지 정보를 얻을 수 없고, 자세한 에러를 보려면서버에 직접 접근해서 로그를 확인해야 함
  • 에러 핸들링을 더 잘 하려면 에러 메시지와 에러의 이유 등을 클라이언트에 전달하도록 코드를 작성해야 함
@app.get("/v2/{item_id}")
async def find_by_id(item_id: int):
    try:
        item = items[item_id]
    except KeyError:
        raise HTTPException(status_code=404, detail=f"아이템을 찾을 수 없습니다 [id: {item_id}]")
    return item
  • FastAPI의 HTTPException은 Error Response를 더 쉽게 보낼 수 있도록 하는 Class
  • HTTPException을 이용해서 클라이언트에게 더 자세한 에러 메시지를 보내는 코드 작성
  • item_id가 1일 경우 정상적으로 200 Return
  • item_id가 5일 경우 아이템을 찾을 수 없습니다 Return

1.4 Background Task

  • FastAPI는 Starlett이라는 비동기 프레임워크를 래핑해서 사용
  • FastAPI의 기능 중 Background Tasks 기능은 오래 걸리는 작업들을 background에서 실행함
  • Online Serving에서 CPU 사용이 많은 작업들을 Background Task로 사용하면,
  • 클라이언트는 작업 완료를 기다리지 않고 즉시 Response를 받아볼 수 있음
  • 특정 작업 후, 이메일 전송하는 Task 등
  • Background Tasks를 사용하지 않은 작업들은 작업 시간 만큼 응답을 기다림
  • Background Tasks를 사용한 작업들은 기다리지 않고 바로 응답을 주기 때문에 0초 소요
  • 실제 작업은 Background에서 실행됨
  • 작업 결과물을 조회할 때는 Task를 어딘가에 저장해두고, GET 요청을 통해 Task가 완료됐는지 확인
  • 결과 비교

2. FastAPI가 어렵다면

  • 1) 프로젝트 구조를 어떻게 잡아야 할지 모르겠다
  • 2) 객체 지향이 낯설다
  • 3) 백엔드 프로그래밍 자체가 처음
  • 4) 목표의 부재

2.1 프로젝트 구조 - Cookiecutter

  • 쿠키를 만들 때 사용하는 Cookiecutter
  • 많은 사람들이 프로젝트 구조에 대한 고민이 많아 템플릿을 서로 공유
  • https://github.com/cookiecutter/cookiecutter
  • CLI 형태로 프로젝트 생성 과정을 도와줌
  • 회사에서 공통의 프로젝트 구조가 필요하면 쿠키 커터로 설정
  • 개인용 쿠키 커터 템플릿을 만드는 것도 좋은 방법
  • (Cookiecutter Data Science)[https://github.com/drivendata/cookiecutter-data-science]
  • (cookitcutter-fastapi)[https://github.com/arthurhenrique/cookiecutter-fastapi]
  • 아예 처음 진행할 때는 일단 하나의 파일에 모두 코드 작성해서 FastAPI에 익숙해지고
  • 그 이후에 다른 프로젝트 구조를 참고해서 코드 개선
  • 클린 아키텍처 류의 책을 보면서 계속 구조 고민해보기

2.2 객체 지향

  • 절차형 프로그래밍 vs 객체 지향 프로그래밍의 차이 이해해보기
  • 객체 지향 프로그래밍은 코드의 중복을 최소화해서 재사용성을 증가시킴
  • 복잡한 로직이 들어갈수록 점점 빛을 발휘함
  • 현재 가지고 있는 코드를 Class로 변경해보기
  • Pydantic Use Case 탐색하기

2.3 Try & Error

  • 백엔드 프로그래밍이 처음이면 낯선 것이 당연
  • 코드를 작성하고 => 실행하고 => 수정하는 Flow
  • 조급해하지 않고 작은 규모의 프로젝트부터 하나씩 만들기
  • 목표를 설정하고(무엇을 만들겠다) => 기능을 정의 => 하나씩 구현
  • 막연히 FastAPI를 학습해야지보다는 프로젝트를 FastAPI 백엔드로 구현! 등으로 목표 설정

'MLOps' 카테고리의 다른 글

MLOps - 16.Logging  (0) 2022.05.31
MLOps - 15. Docker  (0) 2022.05.30
MLOps - 13. FastAPI  (0) 2022.05.28
MLOps - 12. FastAPI  (0) 2022.05.27
MLOps - 11. CI/CD, Github Action  (0) 2022.05.26

댓글