프로덕션 머신 러닝을 위해 Flask에서 FastAPI로 전환 한 이유

가장 인기있는 도구가 항상 최고는 아닙니다.

기계 학습 모델을 생산하기위한 표준 접근 방식은이를 REST API로 래핑하고 마이크로 서비스로 배포하는 것입니다. Flask는 현재 다음과 같은 몇 가지 이유로 이러한 API를 작성하는 데 실질적인 선택입니다.

  • 플라스크는 최소한입니다. 추론 API는 역사적으로 단순한 predict()메서드 인 경향이 있었기 때문에 (Django와 같은) 좀 더 독단적 인 프레임 워크가 도입 한 복잡성은 불필요한 것으로 간주되었습니다.
  • Flask는 기계 학습의 표준 언어 인 Python으로 작성되었습니다. 모든 주요 프레임 워크에는 Python 바인딩이 있으며 거의 ​​모든 데이터 과학자 / 머신 러닝 엔지니어가 이에 익숙합니다.

나중에 여러 번 출시되면서 우리는 우리의 결정에 매우 만족합니다.

아래에서는 Flask에서 FastAPI로 전환 한 핵심 이유에 대해 자세히 설명했습니다. 추론 API를 구축하기 위해 Flask 이외의 것을 사용하는 것에 대해 궁금하다면 유용한 컨텍스트를 제공 할 것입니다.

참고 : 익숙하지 않은 경우 FastAPIStarletteUvicorn 위에 빌드 된 Python API 마이크로 프레임 워크 입니다.

1. 기본 비동기 지원의 ML 추론 이점

우리는 처음에 자동 확장과 관련된 문제로 인해 Flask의 대안을 찾기 시작했습니다.

Cortex 내에서 자동 확장을 재구성하는 것은 자체적 인 이야기이지만 높은 수준은 Cortex가 CPU 사용률을 측정하여 자동 확장하는 데 사용되었지만 이제는 API에 수신되는 요청 수에 따라 자동 확장된다는 것입니다.

이것이 작동하려면 Cortex가 대기중인 요청과 진행중인 요청을 비동기식으로 계산할 수 있어야하며 Gunicorn과 같은 WSGI 서버용으로 설계된 Flask에는 기본 비동기 지원이 없습니다.

우리에게 가장 쉬운 해결책은 기본 비동기 지원이있는 프레임 워크로 전환하는 것이 었습니다. ASGI 서버 인 Uvicorn을 기반으로 구축 된 FastAPI는 수신 요청을 계산하는 비동기 이벤트 루프를 쉽게 실행할 수 있도록했습니다.

하지만 자동 확장 처리 문제를 해결하는 것 외에도 비동기 지원을 통해 더 복잡한 추론 기능에 대한 작업을 시작할 수있었습니다.

예를 들어 Cortex를 사용하면 사용자가 Predictor 인터페이스를 사용하여 자체 요청 처리 코드를 작성할 수 있습니다. 인터페이스는 모델 파일을 초기화하고 예측을 생성하는 방법을 제공하는 Python 클래스입니다.

그러나 일부 사용자 predict()는 S3에서 파일 저장, 외부 서비스에 예측 로깅 등 의 방법에 예측 생성 이상의 작업을 포함해야합니다 .

이상적으로 이러한 작업은 predict()추론 지연 시간을 추가하므로 에서 실행되지 않습니다 . 우리는 현재 사용자가 요청에 대한 실제 추론을 차단할 필요가없는 작업을 비동기식으로 실행할 수 있도록 사전 및 사후 예측 후크를 구현하는 작업을 진행하고 있습니다.

2. 지연 시간 개선은 추론에 큰 영향을 미칩니다.

지연 시간과 처리량은 항상 중요하지만 프로덕션 머신 러닝에서는 그 가치가 강조됩니다.

예를 들어 Uber의 ETA 예측이 귀하의 위치 또는 교통 데이터에서 몇 초 늦으면 유틸리티가 크게 감소합니다. 마찬가지로 Gmail의 스마트 편지 쓰기에서 입력하는 것보다 느리게 텍스트를 제안하는 경우이 기능은 거의 가치가 없습니다.

이로 인해 전체 지연 시간과 처리량을 개선 할 수있는 모든 개선은 겉보기에는 사소 해 보일지라도 가치가 있습니다.

이름에서 알 수 있듯이 FastAPI는 가장 빠른 Python 프레임 워크 중 하나이며 Flask를 300 % 이상 능가합니다.

출처 : 웹 프레임 워크 벤치 마크

대부분의 배포에서 기본 프레임 워크의 속도는 추론 지연 시간을 결정하는 가장 큰 요소가 아닙니다. 그러나 지연 시간 개선 비용을 고려할 때 모든 개선이 가치가 있음을 분명히 알 수 있습니다.

예를 들어 Smart Compose는 100ms 미만 에서 예측을 제공해야합니다 . 더 빠른 예측을 위해 특별히 모델을 디자인 한 후에도 팀은이 임계 값에 도달 할 수 없었습니다. 그들은 구름 TPU에 - 더에 배포했다 최소 로되어있는 $ 4.50 / 온 디맨드 시간 이 100ms에서 대기 시간을 얻기 위해 -in.

이러한 맥락에서 기본 프레임 워크의 속도를 개선하면 큰 이점을 얻을 수 있습니다. 대기 시간을 조금만 줄여도 팀이 더 비싼 하드웨어를 필요로하지 않게 할 수 있습니다.

3. FastAPI는 설계 상으로 쉽게 전환 할 수 있습니다.

비동기를 기본적으로 지원하는 Flask보다 빠른 다른 프레임 워크가 있습니다. 나머지 부분보다 FastAPI를 선택하기로 한 우리의 결정은 여전히 ​​기술적 인 이점에 크게 영향을 받았지만 낮은 스위칭 비용에 큰 영향을 받았습니다.

문맥 상 우리는 소규모 팀입니다. Cortex에는 놀라운 기여자가있는 오픈 소스 커뮤니티가 있지만 우리 중 4 명만이 풀 타임으로 작업합니다. 엔지니어링 시간이 소중하기 때문에 변경을 고려할 때마다 전환 비용이 중요한 고려 사항입니다.

FastAPI의 판매 포인트 중 하나는 구문 측면에서 Flask와 설계 상 매우 유사하다는 것입니다. 예를 들어, 다음은 Flask에서 빌드 된 Cortex v0.13의 라우팅 코드 스 니펫입니다.

다음은 FastAPI로 처음 전환했을 때 v0.14의 해당 코드입니다.

Flask에서 FastAPI 로의 초기 전환에는 놀랍도록 최소한의 재 작성이 필요했습니다 (새로운 디자인을 도입 한 자동 확장과 같은 기능 무시).

분명히 다른 프레임 워크가 FastAPI에 비해 극적인 성능 이점을 제공한다면 채택의 용이성 때문에 FastAPI를 선택하지 않을 것입니다. 그러나 FastAPI보다 훨씬 빠른 프레임 워크가 없기 때문에 채택의 용이성은 다른 프레임 워크보다 선택해야하는 더 큰 이유였습니다.

프로덕션 머신 러닝에서 미니멀리즘과 성숙함의 균형

FastAPI로 전환 한 이후로 본 또 다른 흥미로운 점은 데이터 유효성 검사, 개선 된 오류 처리 등과 같이 처음에 "사용하기 좋은"기능이라고 썼던 일부 기능이 실제로 사용자에게 가치가 있음이 입증되었다는 것입니다.

제 생각에 이것은 ML 내에서 더 광범위한 추세를 반영합니다.

과거에는 모델을 실시간 프로덕션 API로 배포하는 팀이 많지 않았습니다. 대부분의 데이터 과학 팀에서 Flask는 인기 있고 최소한이며 Python으로 작성되었다는 점에서 "충분히 좋았습니다".

그러나 생산 ML은 분야로서 성숙해졌습니다. 기업이 프로덕션에 하나 이상의 모델을 보유하는 것이 점점 더 일반적입니다. 더 많은 팀이 모델을 배포함에 따라 툴링에 대한 대화가 "무엇이 작업을 수행합니까?"에서 바뀌 었습니다. "생산 규모로 모델을 배포하려면 무엇이 필요합니까?"

이 성숙은 우리가 처음에 Cortex를 만든 것과 같은 이유입니다. 몇 년 전만해도 데이터 과학 팀은 "충분히 좋은"배포 프로세스를 결합하여 얻을 수있었습니다. 그러나이 분야가 성숙 해짐에 따라 롤링 업데이트, 자동 확장, 예측 모니터링 등과 같은 실제 인프라 기능 이 "사용하기 좋은"기능에서 필수 기능으로 바뀌 었습니다.

배포중인 모델이 점점 더 커지고 있습니다. 그들이 구축하는 애플리케이션은 더 복잡합니다. 이러한 모델이 처리하는 트래픽이 증가하고 있습니다. 이러한 모든 과제와 함께 "충분히 좋은"솔루션의 정의가 바뀌고 있으며 성숙한 도구가 필수가되고 있습니다.

Suggested posts

좋은 습관을 만들고 유지하는 방법

장기적인 습관을 유지하기위한 생산성 팁

좋은 습관을 만들고 유지하는 방법

두 아이의 엄마가 된 후 일을 끝내기가 더 어려워졌습니다. 나는 한 작업에서 다음 작업으로 뛰어 들었고 하루가 끝날 때까지 아무것도하지 않았을 때 실망했습니다.

양자 컴퓨팅 Pt를위한 프로그래밍. 1 : NumPy

이제 양자 컴퓨팅이면의 물리학을 배우기 시작 했으므로 "이봐, 실제로 양자 컴퓨터를 사용하려면 실제로 양자 장치를 손으로 만들어야합니까?"라고 궁금해 할 것입니다. 답은 양자 컴퓨터를 컴퓨터라고 부르는 이유가 있습니다. 프로그래밍이 가능합니다! 이 시리즈에서는 수학 개념을 시뮬레이션하고 양자 컴퓨터에서 실행하는 소프트웨어를 구축하는 방법을 배우게됩니다. 깨끗하고 현대적이며 라이브러리가 풍부한 언어이기 때문에 Python을 사용하여 코드를 작성할 것입니다.

Related posts

Spotify의 마법 성분 : 기계 학습

Spotify의 마법 성분 : 기계 학습

면책 조항 :이 기사는 Spotify와 관련이 없으며 Spotify 및 현재 관련이 없을 수있는 과거 구조에 대한 확인되지 않은 정보로 구성 될 수 있습니다. 음악은 표현의 한 형태, 예술의 형태, 전체적인 문화 활동입니다.

2021 년 2 월에 읽을 4 가지 딥 러닝 논문

2021 년 2 월에 읽을 4 가지 딥 러닝 논문

신경 과학에서 자동 분화, 신경망 이론 및 신경 과정의 과소 적합에 이르기까지 현재 추구되고있는 다양한 딥 러닝 연구 흐름에 대한 더 나은 개요를 얻고 싶으십니까? 합리적으로 통과하기에는 열려있는 arXiv 탭이 너무 많습니까? 전체 동영상을 볼 시간이 너무 적습니까? 논문의 핵심 아이디어와 개념에 대한 간략한 요약 만 있다면. 그런 다음 '머신-러닝-콜라주'시리즈를 소개하게되어 기쁩니다.

내부의 관심 네트워크 그래프

수학에서 NumPy까지 단계별 가이드

내부의 관심 네트워크 그래프

그래프 신경망 (GNN)은 그래프 데이터에서 학습 할 수있는 표준 도구 상자로 등장했습니다. GNN은 콘텐츠 추천 또는 신약 발견과 같은 다양한 분야에서 영향이 큰 문제를 개선 할 수 있습니다.

분할에 대한 고정 2 부 : Python으로 이미지 분할을 수행하는 방법

분할에 대한 고정 2 부 : Python으로 이미지 분할을 수행하는 방법

안녕하세요! 이미지 분할에 대한이 짧은 시리즈의 첫 번째 부분을 읽지 않았다면 여기에서 읽으십시오. 이전 이야기에서 임계 값 및 색상 분할에 대해 논의 했으므로 2 부에서는 색도 분할과 이미지 차이에 중점을 둘 것입니다.