아키텍처

TensorFlow Serving은 프로덕션 환경을 위해 설계된 머신러닝 모델을 위한 유연한 고성능 제공 시스템입니다. TensorFlow Serving을 사용하면 동일한 서버 아키텍처와 API를 유지하면서 새로운 알고리즘과 실험을 쉽게 배포할 수 있습니다. TensorFlow Serving은 TensorFlow 모델과의 기본 통합을 제공하지만 다른 유형의 모델을 제공하도록 쉽게 확장할 수 있습니다.

주요 개념

TensorFlow Serving의 아키텍처를 이해하려면 다음 주요 개념을 이해해야 합니다.

제공 가능

Servable은 TensorFlow Serving의 핵심 추상화입니다. Servable은 클라이언트가 계산(예: 조회 또는 추론)을 수행하는 데 사용하는 기본 개체입니다.

Servable의 크기와 세분성은 유연합니다. 단일 Servable에는 조회 테이블의 단일 샤드부터 단일 모델, 추론 모델 튜플까지 모든 것이 포함될 수 있습니다. Servable은 모든 유형 및 인터페이스가 가능하므로 다음과 같은 유연성과 향후 개선이 가능합니다.

  • 스트리밍 결과
  • 실험적인 API
  • 비동기식 작동 모드

Servable은 자체 수명주기를 관리하지 않습니다.

일반적인 servable에는 다음이 포함됩니다.

  • TensorFlow SavedModelBundle( tensorflow::Session )
  • 임베딩 또는 어휘 조회를 위한 조회 테이블

제공 가능한 버전

TensorFlow Serving은 단일 서버 인스턴스의 수명 동안 하나 이상의 서비스 버전을 처리할 수 있습니다. 이를 통해 시간이 지남에 따라 새로운 알고리즘 구성, 가중치 및 기타 데이터를 로드할 수 있습니다. 버전을 사용하면 둘 이상의 서비스 버전을 동시에 로드하여 점진적인 롤아웃 및 실험을 지원할 수 있습니다. 서비스 제공 시 클라이언트는 특정 모델에 대해 최신 버전이나 특정 버전 ID를 요청할 수 있습니다.

제공 가능한 스트림

제공 가능 스트림은 버전 번호가 증가하는 순서로 정렬된 제공 가능 버전의 시퀀스입니다.

모델

TensorFlow Serving은 모델을 하나 이상의 servable로 나타냅니다. 기계 학습 모델에는 하나 이상의 알고리즘(학습된 가중치 포함)과 조회 또는 임베딩 테이블이 포함될 수 있습니다.

복합 모델을 다음 중 하나로 나타낼 수 있습니다.

  • 여러 개의 독립적인 서버블
  • 단일 복합 제공 가능

서빙 가능 항목은 모델의 일부에 해당할 수도 있습니다. 예를 들어 대규모 조회 테이블은 여러 TensorFlow Serving 인스턴스에 걸쳐 분할될 수 있습니다.

로더

로더는 서버블의 수명 주기를 관리합니다. Loader API는 관련된 특정 학습 알고리즘, 데이터 또는 제품 사용 사례와는 별개로 공통 인프라를 활성화합니다. 특히 로더는 서버블 로드 및 언로드를 위한 API를 표준화합니다.

출처

소스는 서 버블을 찾고 제공하는 플러그인 모듈입니다. 각 소스는 0개 이상의 제공 가능한 스트림을 제공합니다. 제공 가능한 각 스트림에 대해 소스는 로드할 수 있는 각 버전에 대해 하나의 Loader 인스턴스를 제공합니다. (소스는 실제로 0개 이상의 SourceAdapter와 함께 연결되며 체인의 마지막 항목은 로더를 내보냅니다.)

TensorFlow Serving의 소스용 인터페이스는 임의의 스토리지 시스템에서 제공 가능 항목을 검색할 수 있습니다. TensorFlow Serving에는 공통 참조 소스 구현이 포함되어 있습니다. 예를 들어 소스는 RPC와 같은 메커니즘에 액세스하고 파일 시스템을 폴링할 수 있습니다.

소스는 여러 servable 또는 버전에서 공유되는 상태를 유지할 수 있습니다. 이는 버전 간 델타(diff) 업데이트를 사용하는 서버블에 유용합니다.

열망하는 버전

Aspired 버전은 로드되어 준비되어야 하는 제공 가능한 버전 세트를 나타냅니다. 소스는 한 번에 제공 가능한 단일 스트림에 대해 이 제공 가능한 버전 세트를 전달합니다. 소스가 Manager에 새로운 버전 목록을 제공하면 해당 제공 가능한 스트림에 대한 이전 목록을 대체합니다. Manager는 목록에 더 이상 표시되지 않는 이전에 로드된 버전을 언로드합니다.

버전 로딩이 실제로 어떻게 작동하는지 보려면 고급 튜토리얼을 참조하세요.

관리자

관리자는 다음을 포함하여 Servable의 전체 수명주기를 처리합니다.

  • 서비스 가능 항목 로드 중
  • 서빙 가능
  • Servable 언로드

관리자는 소스를 듣고 모든 버전을 추적합니다. 관리자는 소스의 요청을 이행하려고 시도하지만 필요한 리소스를 사용할 수 없는 경우 원하는 버전 로드를 거부할 수 있습니다. 관리자는 "언로드"를 연기할 수도 있습니다. 예를 들어, 관리자는 항상 하나 이상의 버전이 로드되도록 보장하는 정책에 따라 최신 버전의 로드가 완료될 때까지 언로드를 기다릴 수 있습니다.

TensorFlow Serving Manager는 클라이언트가 로드된 제공 가능 인스턴스에 액세스할 수 있도록 간단하고 좁은 인터페이스( GetServableHandle() 를 제공합니다.

핵심

표준 TensorFlow Serving API를 사용하여 TensorFlow Serving Core는 servable의 다음 측면을 관리합니다.

  • 수명주기
  • 측정항목

TensorFlow Serving Core는 제공 가능 항목과 로더를 불투명 객체로 처리합니다.

서빙 가능 수명

TF 제공 아키텍처 다이어그램

광범위하게 말하면:

  1. 소스는 제공 가능한 버전에 대한 로더를 생성합니다.
  2. 로더는 Aspired Versions로 Manager에 전송되며, Manager는 클라이언트 요청에 따라 이를 로드하고 제공합니다.

더 자세하게:

  1. 소스 플러그인은 특정 버전에 대한 로더를 생성합니다. 로더에는 Servable을 로드하는 데 필요한 모든 메타데이터가 포함되어 있습니다.
  2. 소스는 콜백을 사용하여 관리자에게 Aspired 버전을 알립니다.
  3. Manager는 구성된 버전 정책을 적용하여 이전에 로드한 버전을 언로드하거나 새 버전을 로드하는 등 취할 다음 작업을 결정합니다.
  4. 관리자가 안전하다고 판단하면 로더에 필요한 리소스를 제공하고 로더에게 새 버전을 로드하라고 지시합니다.
  5. 클라이언트는 버전을 명시적으로 지정하거나 최신 버전을 요청하여 관리자에게 Servable을 요청합니다. Manager는 Servable에 대한 핸들을 반환합니다.

예를 들어 소스가 자주 업데이트되는 모델 가중치가 있는 TensorFlow 그래프를 나타낸다고 가정해 보겠습니다. 가중치는 디스크의 파일에 저장됩니다.

  1. 소스는 모델 가중치의 새 버전을 감지합니다. 디스크의 모델 데이터에 대한 포인터를 포함하는 로더를 생성합니다.
  2. 소스는 Aspired 버전을 Dynamic Manager에게 알립니다.
  3. 동적 관리자는 버전 정책을 적용하고 새 버전을 로드하기로 결정합니다.
  4. 동적 관리자는 로더에 메모리가 충분하다고 알려줍니다. 로더는 새로운 가중치로 TensorFlow 그래프를 인스턴스화합니다.
  5. 클라이언트는 최신 버전의 모델에 대한 핸들을 요청하고 동적 관리자는 Servable의 새 버전에 대한 핸들을 반환합니다.

확장성

TensorFlow Serving은 새로운 기능을 추가할 수 있는 여러 확장 지점을 제공합니다.

버전 정책

버전 정책은 단일 제공 가능 스트림 내에서 버전 로드 및 언로드 순서를 지정합니다.

TensorFlow Serving에는 가장 잘 알려진 사용 사례를 수용하는 두 가지 정책이 포함되어 있습니다. 가용성 보존 정책(0 버전을 로드된 상태로 두지 않음, 일반적으로 이전 버전을 언로드하기 전에 새 버전 로드) 및 리소스 보존 정책(두 버전을 동시에 로드하지 않음, 따라서 두 배의 리소스 필요, 로드하기 전에 이전 버전 언로드)이 있습니다. 새로운 것). 모델의 제공 가용성이 중요하고 리소스 비용이 낮은 TensorFlow Serving을 간단히 사용하려면 가용성 보존 정책을 사용하여 이전 버전을 언로드하기 전에 새 버전이 로드되고 준비되었는지 확인합니다. 예를 들어 여러 서버 인스턴스에서 버전을 관리하는 등 TensorFlow Serving을 정교하게 사용하려면 리소스 보존 정책에 최소한의 리소스가 필요합니다(새 버전을 로드하기 위한 추가 버퍼 없음).

원천

새로운 소스는 새로운 파일 시스템, 클라우드 제품 및 알고리즘 백엔드를 지원할 수 있습니다. TensorFlow Serving은 새로운 소스를 쉽고 빠르게 생성할 수 있도록 몇 가지 공통 구성 요소를 제공합니다. 예를 들어 TensorFlow Serving에는 간단한 소스를 중심으로 폴링 동작을 래핑하는 유틸리티가 포함되어 있습니다. 소스는 특정 알고리즘 및 데이터 호스팅 서비스에 대한 로더와 밀접하게 관련되어 있습니다.

사용자 정의 소스를 생성하는 방법에 대한 자세한 내용은 사용자 정의 소스 문서를 참조하세요.

로더

로더는 알고리즘 및 데이터 백엔드를 추가하기 위한 확장 지점입니다. TensorFlow는 그러한 알고리즘 백엔드 중 하나입니다. 예를 들어, 새로운 유형의 제공 가능한 기계 학습 모델의 인스턴스를 로드, 액세스 제공 및 언로드하기 위해 새 로더를 구현합니다. 조회 테이블 및 추가 알고리즘을 위한 로더를 생성할 것으로 예상됩니다.

사용자 정의 servable을 생성하는 방법을 알아보려면 사용자 정의 servable 문서를 참조하세요.

배처

여러 요청을 단일 요청으로 일괄 처리하면 특히 GPU와 같은 하드웨어 가속기가 있는 경우 추론 수행 비용을 크게 줄일 수 있습니다. TensorFlow Serving에는 클라이언트가 여러 요청에 걸쳐 유형별 추론을 알고리즘 시스템이 보다 효율적으로 처리할 수 있는 일괄 요청으로 쉽게 일괄 처리할 수 있게 해주는 요청 일괄 처리 위젯이 포함되어 있습니다. 자세한 내용은 일괄 처리 가이드를 참조하세요.