TensorFlow Serving은 프로덕션 환경을 위해 설계된 기계 학습 모델을 위한 유연한 고성능 제공 시스템입니다. TensorFlow Serving을 사용하면 동일한 서버 아키텍처와 API를 유지하면서 새로운 알고리즘과 실험을 쉽게 배포할 수 있습니다. TensorFlow Serving은 TensorFlow 모델과의 즉시 통합을 제공하지만 다른 유형의 모델을 제공하도록 쉽게 확장할 수 있습니다.
주요 컨셉
TensorFlow Serving의 아키텍처를 이해하려면 다음 주요 개념을 이해해야 합니다.
서빙 가능
Servable 은 TensorFlow Serving의 중심 추상화입니다. Servable은 클라이언트가 계산(예: 조회 또는 추론)을 수행하는 데 사용하는 기본 개체입니다.
Servable의 크기와 세분성은 유연합니다. 단일 Servable에는 조회 테이블의 단일 샤드에서 단일 모델, 추론 모델 튜플에 이르기까지 모든 것이 포함될 수 있습니다. Servable은 모든 유형과 인터페이스가 될 수 있으므로 다음과 같은 유연성과 향후 개선 사항이 가능합니다.
- 스트리밍 결과
- 실험적 API
- 비동기 작동 모드
Servable은 자체 수명 주기를 관리하지 않습니다.
일반적인 servable에는 다음이 포함됩니다.
- TensorFlow 저장된 모델 번들(
tensorflow::Session
) - 임베딩 또는 어휘 조회를 위한 조회 테이블
제공 가능한 버전
TensorFlow Serving은 단일 서버 인스턴스의 수명 동안 하나 이상의 서빙 가능 버전 을 처리할 수 있습니다. 이를 통해 시간이 지남에 따라 새로운 알고리즘 구성, 가중치 및 기타 데이터를 로드할 수 있습니다. 버전을 사용하면 둘 이상의 서빙 가능 버전을 동시에 로드할 수 있으므로 점진적 롤아웃 및 실험을 지원합니다. 서비스를 제공할 때 클라이언트는 특정 모델에 대해 최신 버전 또는 특정 버전 ID를 요청할 수 있습니다.
제공 가능한 스트림
제공 가능한 스트림 은 버전 번호가 증가하는 순서로 정렬된 제공 가능한 버전의 시퀀스입니다.
모델
TensorFlow Serving은 모델 을 하나 이상의 servable로 나타냅니다. 기계 학습 모델에는 하나 이상의 알고리즘(학습된 가중치 포함)과 조회 또는 임베딩 테이블이 포함될 수 있습니다.
복합 모델 을 다음 중 하나로 나타낼 수 있습니다.
- 여러 독립 서블
- 단일 복합 게재 가능
servable은 모델의 일부에 해당할 수도 있습니다. 예를 들어 큰 조회 테이블은 여러 TensorFlow Serving 인스턴스에 걸쳐 분할될 수 있습니다.
로더
로더 는 서블릿의 수명 주기를 관리합니다. Loader API는 관련된 특정 학습 알고리즘, 데이터 또는 제품 사용 사례와 독립적인 공통 인프라를 가능하게 합니다. 특히, 로더는 서빙 가능을 로드 및 언로드하기 위한 API를 표준화합니다.
출처
소스 는 servable을 찾고 제공하는 플러그인 모듈입니다. 각 소스는 0개 이상의 제공 가능한 스트림을 제공합니다. 각 제공 가능한 스트림에 대해 Source는 로드할 수 있도록 하는 각 버전에 대해 하나의 Loader 인스턴스를 제공합니다. (소스는 실제로 0개 이상의 SourceAdapter와 함께 연결되며 체인의 마지막 항목은 로더를 방출합니다.)
소스용 TensorFlow Serving의 인터페이스는 임의의 스토리지 시스템에서 서빙 가능 항목을 검색할 수 있습니다. TensorFlow Serving에는 공통 참조 소스 구현이 포함됩니다. 예를 들어 소스는 RPC와 같은 메커니즘에 액세스하고 파일 시스템을 폴링할 수 있습니다.
소스는 여러 servable 또는 버전에서 공유되는 상태를 유지할 수 있습니다. 이는 버전 간에 델타(diff) 업데이트를 사용하는 서빙 가능 항목에 유용합니다.
열망하는 버전
Aspired 버전 은 로드되어 준비되어야 하는 제공 가능한 버전 집합을 나타냅니다. 소스는 한 번에 단일 제공 가능한 스트림에 대해 이 제공 가능한 버전 집합을 전달합니다. 소스가 관리자에게 열망하는 버전의 새 목록을 제공하면 해당 제공 가능한 스트림에 대한 이전 목록을 대체합니다. Manager는 목록에 더 이상 나타나지 않는 이전에 로드된 버전을 언로드합니다.
버전 로드가 실제로 어떻게 작동하는지 보려면 고급 자습서 를 참조하십시오.
관리자
관리자 는 다음을 포함하여 Servable의 전체 수명 주기를 처리합니다.
- Servable 로드
- 서빙 가능
- Servable 언로드
관리자는 소스를 듣고 모든 버전을 추적합니다. Manager는 Sources의 요청을 이행하려고 시도하지만 필요한 리소스를 사용할 수 없는 경우 원하는 버전의 로드를 거부할 수 있습니다. 관리자는 "언로드"를 연기할 수도 있습니다. 예를 들어 Manager는 항상 하나 이상의 버전이 로드되도록 보장하는 정책에 따라 최신 버전의 로드가 완료될 때까지 언로드를 기다릴 수 있습니다.
TensorFlow Serving Manager는 클라이언트가 로드된 제공 가능한 인스턴스에 액세스할 수 있도록 단순하고 좁은 인터페이스인 GetServableHandle()
을 제공합니다.
핵심
표준 TensorFlow Serving API를 사용하여 TensorFlow Serving Core 는 다음과 같은 servable 측면을 관리합니다.
- 수명 주기
- 측정항목
TensorFlow Serving Core는 servable과 loader를 불투명한 객체로 취급합니다.
서블러블의 삶
넓게 말하면:
- 소스는 제공 가능한 버전용 로더를 생성합니다.
- 로더는 Aspired 버전으로 Manager에 전송되어 클라이언트 요청에 로드하고 제공합니다.
더 자세하게:
- 소스 플러그인은 특정 버전에 대한 로더를 생성합니다. Loader에는 Servable을 로드하는 데 필요한 모든 메타데이터가 포함되어 있습니다.
- 소스는 콜백을 사용하여 관리자에게 Aspired 버전을 알립니다.
- Manager는 구성된 버전 정책을 적용하여 이전에 로드된 버전을 언로드하거나 새 버전을 로드할 수 있는 다음 작업을 결정합니다.
- Manager가 안전하다고 판단하면 로더에 필요한 리소스를 제공하고 로더에 새 버전을 로드하도록 지시합니다.
- 클라이언트는 버전을 명시적으로 지정하거나 최신 버전을 요청하여 관리자에게 Servable을 요청합니다. Manager는 Servable에 대한 핸들을 반환합니다.
예를 들어 소스가 자주 업데이트되는 모델 가중치가 있는 TensorFlow 그래프를 나타낸다고 가정해 보겠습니다. 가중치는 디스크의 파일에 저장됩니다.
- 소스는 모델 가중치의 새 버전을 감지합니다. 디스크의 모델 데이터에 대한 포인터를 포함하는 로더를 생성합니다.
- 소스는 Aspired 버전을 Dynamic Manager에 알립니다.
- Dynamic Manager는 버전 정책을 적용하고 새 버전을 로드하기로 결정합니다.
- Dynamic Manager는 로더에게 메모리가 충분하다고 알려줍니다. 로더는 새로운 가중치로 TensorFlow 그래프를 인스턴스화합니다.
- 클라이언트는 최신 버전의 모델에 대한 핸들을 요청하고 Dynamic Manager는 새 버전의 Servable에 대한 핸들을 반환합니다.
확장성
TensorFlow Serving은 새로운 기능을 추가할 수 있는 여러 확장 지점을 제공합니다.
버전 정책
버전 정책은 단일 제공 가능한 스트림 내에서 버전 로드 및 언로드 순서를 지정합니다.
TensorFlow Serving에는 대부분의 알려진 사용 사례를 수용하는 두 가지 정책이 포함되어 있습니다. 가용성 보존 정책(0개의 버전을 로드한 상태로 두지 마십시오. 일반적으로 이전 버전을 언로드하기 전에 새 버전을 로드) 및 리소스 보존 정책(두 버전을 동시에 로드하지 않도록 하여 리소스가 두 배로 필요함, 로드하기 전에 이전 버전 언로드 새로운 것). 모델의 제공 가용성이 중요하고 리소스 비용이 저렴한 TensorFlow Serving의 간단한 사용을 위해 가용성 보존 정책은 이전 버전을 언로드하기 전에 새 버전이 로드되고 준비되었는지 확인합니다. TensorFlow Serving의 정교한 사용(예: 여러 서버 인스턴스의 버전 관리)을 위해 Resource Preserving Policy에는 최소한의 리소스가 필요합니다(새 버전 로드를 위한 추가 버퍼 없음).
원천
New Sources는 새로운 파일 시스템, 클라우드 오퍼링 및 알고리즘 백엔드를 지원할 수 있습니다. TensorFlow Serving은 새로운 소스를 쉽고 빠르게 생성할 수 있도록 몇 가지 공통 빌딩 블록을 제공합니다. 예를 들어, TensorFlow Serving에는 간단한 소스에 대한 폴링 동작을 래핑하는 유틸리티가 포함되어 있습니다. 소스는 특정 알고리즘 및 데이터 호스팅 서빙에 대한 로더와 밀접하게 관련되어 있습니다.
사용자 정의 소스를 만드는 방법에 대한 자세한 내용은 사용자 정의 소스 문서를 참조하십시오.
로더
로더는 알고리즘 및 데이터 백엔드를 추가하기 위한 확장점입니다. TensorFlow는 그러한 알고리즘 백엔드 중 하나입니다. 예를 들어, 새로운 유형의 제공 가능한 기계 학습 모델의 인스턴스를 로드, 액세스 제공 및 언로드하기 위해 새 로더를 구현합니다. 룩업 테이블 및 추가 알고리즘을 위한 로더를 생성할 예정입니다.
커스텀 서블을 만드는 방법을 배우려면 Custom Servable 문서를 참조하세요.
배처
여러 요청을 단일 요청으로 일괄 처리하면 특히 GPU와 같은 하드웨어 가속기가 있는 경우 추론 수행 비용을 크게 줄일 수 있습니다. TensorFlow Serving에는 클라이언트가 요청 전반에 걸쳐 유형별 추론을 알고리즘 시스템이 보다 효율적으로 처리할 수 있는 일괄 요청으로 쉽게 일괄 처리할 수 있는 요청 일괄 처리 위젯이 포함되어 있습니다. 자세한 내용은 일괄 처리 가이드 를 참조하십시오.