建立可探索新服務路徑的模組

本文件說明如何擴充 TensorFlow Serving 以監控不同的儲存系統,進而探索要服務的新模型 (或模型版本) 或資料。尤其是,本文件涵蓋如何建立及使用模組,以監控儲存系統路徑中新子路徑的出現,其中每個子路徑代表要載入的新服務版本。這類模組稱為 Source<StoragePath>,因為它會發出 StoragePath 類型的物件 (類型定義為 string)。它可以與 SourceAdapter 組合,後者會從來源探索到的指定路徑建立服務 Loader

首先,關於通用性的一點說明

並非一定要使用路徑做為服務資料的控制代碼;這僅說明將服務匯入系統的一種方式。即使您的環境沒有將服務資料封裝在路徑中,本文件仍會讓您熟悉主要的抽象概念。您可以選擇為適合您環境的類型 (例如 RPC 或發布/訂閱訊息、資料庫記錄) 建立 Source<T>SourceAdapter<T1, T2> 模組,或僅建立單體 Source<std::unique_ptr<Loader>>,直接發出服務載入器。

當然,無論您的來源發出何種類型的資料 (無論是 POSIX 路徑、Google Cloud Storage 路徑或 RPC 控制代碼),都需要有隨附的模組能夠根據該資料載入服務。這類模組稱為 SourceAdapters。自訂模組的建立方式在自訂服務文件中說明。TensorFlow Serving 隨附一個模組,用於根據 TensorFlow 支援的檔案系統路徑,來例項化 TensorFlow 工作階段。您可以透過擴充 RandomAccessFile 抽象概念 (tensorflow/core/public/env.h),為 TensorFlow 新增對其他檔案系統的支援。

本文件著重於建立來源,以發出 TensorFlow 支援的檔案系統中的路徑。最後會逐步說明如何搭配預先存在的模組使用您的來源,以服務部署 TensorFlow 模型。

建立您的來源

我們有一個 Source<StoragePath> 的參考實作,稱為 FileSystemStoragePathSource (位於 sources/storage_path/file_system_storage_path_source*)。FileSystemStoragePathSource 會監控特定的檔案系統路徑,監看數值子目錄,並將最新的子目錄回報為它想要載入的版本。本文件逐步說明 FileSystemStoragePathSource 的主要層面。您可能會發現複製 FileSystemStoragePathSource,然後修改以符合您的需求會很方便。

首先,FileSystemStoragePathSource 實作 Source<StoragePath> API,這是 Source<T> API 的特殊化,其中 T 繫結至 StoragePath。API 包含單一方法 SetAspiredVersionsCallback(),其提供來源可以調用的閉包,以溝通它想要載入特定的一組服務版本。

FileSystemStoragePathSource 以非常簡單的方式使用期望版本回呼:它會定期檢查檔案系統 (基本上執行 ls),如果它找到一或多個看起來像服務版本的路徑,它會判斷哪個是最新版本,並使用大小為 1 的清單 (其中僅包含該版本) 調用回呼 (在預設設定下)。因此,在任何給定時間,FileSystemStoragePathSource 最多要求載入一個服務,且其實作會利用回呼的等冪性來保持自身無狀態 (使用相同的引數重複調用回呼沒有任何危害)。

FileSystemStoragePathSource 具有靜態初始化 Factory (Create() 方法),其採用設定通訊協定訊息。設定訊息包含詳細資訊,例如要監控的基準路徑和監控間隔。它也包含要發出的服務串流名稱。(替代方法可能會從基準路徑中擷取服務串流名稱,以根據觀察更深層的目錄階層發出多個服務串流;這些變體超出參考實作的範圍。)

實作的大部分包含定期檢查檔案系統的執行緒,以及用於識別和排序它發現的任何數值子路徑的一些邏輯。執行緒在 SetAspiredVersionsCallback() 內部啟動 (而非在 Create() 中),因為那是來源應「開始」且知道將期望版本要求傳送到何處的點。

使用您的來源載入 TensorFlow 工作階段

您可能會想要搭配 SavedModelBundleSourceAdapter (servables/tensorflow/saved_model_bundle_source_adapter*) 使用新的來源模組,後者會將您的來源發出的每個路徑解譯為 TensorFlow 匯出,並將每個路徑轉換為 TensorFlow SavedModelBundle 服務的載入器。您可能會將 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 是捕捉期望版本要求的模組,即配接器或管理員)。