이 문서에서는 TensorFlow Serving을 확장하여 다양한 스토리지 시스템을 모니터링하여 제공할 새로운 모델(버전) 또는 데이터를 검색하는 방법을 설명합니다. 특히, 새로운 하위 경로가 나타나는지 스토리지 시스템 경로를 모니터링하는 모듈을 생성하고 사용하는 방법을 다룹니다. 여기서 각 하위 경로는 로드할 새로운 제공 가능 버전을 나타냅니다. 이러한 종류의 모듈을 Source<StoragePath>
라고 합니다. 왜냐하면 StoragePath
유형의 객체를 내보내기 때문입니다( string
으로 형식 정의됨). 소스가 발견한 특정 경로에서 제공 가능한 Loader
생성하는 SourceAdapter
로 구성될 수 있습니다.
첫째, 일반성에 대한 참고 사항
제공 가능한 데이터에 대한 핸들로 경로를 사용할 필요는 없습니다. 이는 단지 제공 가능 항목을 시스템에 수집하는 한 가지 방법을 보여줍니다. 귀하의 환경이 제공 가능한 데이터를 경로에 캡슐화하지 않더라도 이 문서를 통해 주요 추상화에 익숙해질 수 있습니다. 환경에 적합한 유형(예: RPC 또는 게시/구독 메시지, 데이터베이스 레코드)에 대해 Source<T>
및 SourceAdapter<T1, T2>
모듈을 생성하거나 단순히 단일체 Source<std::unique_ptr<Loader>>
생성하는 옵션이 있습니다. Source<std::unique_ptr<Loader>>
는 제공 가능한 로더를 직접 내보냅니다.
물론 소스가 내보내는 데이터의 종류(POSIX 경로, Google Cloud Storage 경로, RPC 핸들 등)에 관계없이 이를 기반으로 제공 가능 항목을 로드할 수 있는 모듈이 함께 제공되어야 합니다. 이러한 모듈을 SourceAdapters
라고 합니다. 사용자 정의 항목을 생성하는 방법은 Custom Servable 문서에 설명되어 있습니다. TensorFlow Serving에는 TensorFlow가 지원하는 파일 시스템의 경로를 기반으로 TensorFlow 세션을 인스턴스화하는 기능이 함께 제공됩니다. RandomAccessFile
추상화( tensorflow/core/public/env.h
)를 확장하여 TensorFlow에 추가 파일 시스템에 대한 지원을 추가할 수 있습니다.
이 문서에서는 TensorFlow 지원 파일 시스템에서 경로를 내보내는 소스를 만드는 데 중점을 둡니다. TensorFlow 모델을 제공하기 위해 기존 모듈과 함께 소스를 사용하는 방법을 안내하는 것으로 끝납니다.
소스 만들기
FileSystemStoragePathSource
( sources/storage_path/file_system_storage_path_source*
)라는 Source<StoragePath>
의 참조 구현이 있습니다. FileSystemStoragePathSource
특정 파일 시스템 경로를 모니터링하고 숫자 하위 디렉터리를 감시하며 이들 중 최신 버전을 로드하려는 버전으로 보고합니다. 이 문서는 FileSystemStoragePathSource
의 주요 측면을 안내합니다. FileSystemStoragePathSource
의 복사본을 만든 다음 필요에 맞게 수정하는 것이 편리할 수 있습니다.
먼저, FileSystemStoragePathSource
T
StoragePath
에 바인딩된 Source<T>
API의 특수화인 Source<StoragePath>
API를 구현합니다. API는 단일 메서드 SetAspiredVersionsCallback()
으로 구성됩니다. 이 메서드는 특정 제공 가능한 버전 집합이 로드되기를 원한다는 것을 전달하기 위해 소스가 호출할 수 있는 클로저를 제공합니다.
FileSystemStoragePathSource
는 매우 간단한 방식으로 aspired-versions 콜백을 사용합니다. 주기적으로 파일 시스템을 검사하고(기본적으로 ls
수행), 제공 가능한 버전처럼 보이는 하나 이상의 경로를 찾으면 어느 것이 최신 버전인지 확인하고 호출합니다. 해당 버전만 포함하는 크기 1의 목록이 있는 콜백(기본 구성에서) 따라서 주어진 시간에 FileSystemStoragePathSource
최대 하나의 서버블 로드를 요청하고 해당 구현은 콜백의 멱등성을 활용하여 자체적으로 상태 비저장을 유지합니다(동일한 인수를 사용하여 콜백을 반복적으로 호출해도 해가 되지 않습니다).
FileSystemStoragePathSource
에는 구성 프로토콜 메시지를 사용하는 정적 초기화 팩토리( Create()
메서드)가 있습니다. 구성 메시지에는 모니터링할 기본 경로 및 모니터링 간격과 같은 세부 정보가 포함됩니다. 또한 내보낼 제공 가능한 스트림의 이름도 포함됩니다. (대체 접근 방식은 기본 경로에서 제공 가능한 스트림 이름을 추출하여 더 깊은 디렉터리 계층 구조 관찰을 기반으로 여러 제공 가능한 스트림을 방출할 수 있습니다. 이러한 변형은 참조 구현의 범위를 벗어납니다.)
구현의 대부분은 파일 시스템을 주기적으로 검사하는 스레드와 발견된 숫자 하위 경로를 식별하고 정렬하기 위한 일부 논리로 구성됩니다. 스레드는 SetAspiredVersionsCallback()
( Create()
이 아님) 내부에서 시작됩니다. 왜냐하면 이 지점이 소스가 "시작"되어야 하고 열망하는 버전 요청을 보낼 위치를 알고 있기 때문입니다.
소스를 사용하여 TensorFlow 세션 로드
새로운 소스 모듈을 SavedModelBundleSourceAdapter
( servables/tensorflow/saved_model_bundle_source_adapter*
)와 함께 사용하고 싶을 것입니다. 이는 소스가 내보내는 각 경로를 TensorFlow 내보내기로 해석하고 각 경로를 TensorFlow SavedModelBundle
servable용 로더로 변환합니다. SavedModelBundle
어댑터를 AspiredVersionsManager
에 연결하면 실제로 서버블 로드 및 제공을 처리하게 됩니다. 작동하는 서버 라이브러리를 얻기 위해 이러한 세 가지 종류의 모듈을 함께 연결하는 좋은 예는 servables/tensorflow/simple_servers.cc
에서 찾을 수 있습니다. 다음은 주요 코드 흐름을 살펴보는 것입니다(잘못된 오류 처리 포함, 실제 코드는 더 주의해야 함).
먼저 관리자를 만듭니다.
std::unique_ptr<AspiredVersionsManager> manager = ...;
그런 다음 SavedModelBundle
소스 어댑터를 생성하고 관리자에 연결합니다.
std::unique_ptr<SavedModelBundleSourceAdapter> bundle_adapter;
SavedModelBundleSourceAdapterConfig config;
// ... populate 'config' with TensorFlow options.
TF_CHECK_OK(SavedModelBundleSourceAdapter::Create(config, &bundle_adapter));
ConnectSourceToTarget(bundle_adapter.get(), manager.get());
마지막으로 경로 소스를 생성하고 이를 SavedModelBundle
어댑터에 연결합니다.
auto your_source = new YourPathSource(...);
ConnectSourceToTarget(your_source, bundle_adapter.get());
ConnectSourceToTarget()
함수( core/target.h
에 정의됨)는 단지 SetAspiredVersionsCallback()
을 호출하여 Source<T>
를 Target<T>
에 연결합니다( Target
원하는 버전 요청을 잡는 모듈입니다. 예: 어댑터 또는 관리자) ).