Membuat modul yang menemukan jalur baru yang dapat dilayani

Dokumen ini menjelaskan cara memperluas TensorFlow Serving untuk memantau berbagai sistem penyimpanan guna menemukan model atau data baru (versi) yang akan disajikan. Secara khusus, ini mencakup cara membuat dan menggunakan modul yang memantau jalur sistem penyimpanan untuk kemunculan sub-jalur baru, di mana setiap sub-jalur mewakili versi baru yang dapat dilayani untuk dimuat. Semacam itu modul disebut Source<StoragePath> , karena memancarkan objek tipe StoragePath (typedefed ke string ). Hal ini dapat terdiri dengan SourceAdapter yang menciptakan servable Loader dari jalan mengingat bahwa menemukan sumber.

Pertama, catatan tentang generalitas

Menggunakan jalur sebagai pegangan ke data yang dapat disajikan tidak diperlukan; itu hanya menggambarkan satu cara untuk menyerap servable ke dalam sistem. Bahkan jika lingkungan Anda tidak merangkum data yang dapat disajikan di jalur, dokumen ini akan membiasakan Anda dengan abstraksi kunci. Anda memiliki pilihan untuk membuat Source<T> dan SourceAdapter<T1, T2> modul untuk jenis yang sesuai dengan lingkungan Anda (misalnya RPC atau pub / sub pesan, catatan database), atau untuk sekadar membuat monolitik Source<std::unique_ptr<Loader>> yang memancarkan loader servable langsung.

Tentu saja, apa pun jenis data yang dipancarkan sumber Anda (apakah itu jalur POSIX, jalur Google Cloud Storage, atau pegangan RPC), perlu ada modul yang menyertai yang dapat memuat servable berdasarkan itu. Modul tersebut disebut SourceAdapters . Membuat yang kustom dijelaskan dalam Kustom servable dokumen. TensorFlow Serving hadir dengan satu untuk membuat instance sesi TensorFlow berdasarkan jalur dalam sistem file yang didukung TensorFlow. Satu dapat menambahkan dukungan untuk sistem file tambahan untuk TensorFlow dengan memperluas RandomAccessFile abstraksi ( tensorflow/core/public/env.h ).

Dokumen ini berfokus pada pembuatan sumber yang memancarkan jalur dalam sistem file yang didukung TensorFlow. Ini diakhiri dengan panduan tentang cara menggunakan sumber Anda bersama dengan modul yang sudah ada sebelumnya untuk melayani model TensorFlow.

Membuat Sumber Anda

Kami memiliki implementasi referensi dari Source<StoragePath> , disebut FileSystemStoragePathSource (di sources/storage_path/file_system_storage_path_source* ). FileSystemStoragePathSource memonitor jalur sistem file tertentu, jam tangan untuk numerik sub-direktori, dan laporan terbaru ini sebagai versi itu bercita-cita untuk beban. Dokumen ini berjalan melalui aspek yang menonjol dari FileSystemStoragePathSource . Anda mungkin merasa nyaman untuk membuat salinan FileSystemStoragePathSource dan kemudian memodifikasinya sesuai dengan kebutuhan Anda.

Pertama, FileSystemStoragePathSource alat yang Source<StoragePath> API, yang merupakan spesialisasi dari Source<T> API dengan T terikat StoragePath . API terdiri dari metode tunggal SetAspiredVersionsCallback() , yang memasok penutupan sumber dapat meminta untuk berkomunikasi bahwa ia ingin satu set tertentu dari versi servable untuk dimuat.

FileSystemStoragePathSource menggunakan-versi dicita-citakan callback dengan cara yang sangat sederhana: secara berkala memeriksa sistem file (melakukan ls , pada dasarnya), dan jika menemukan satu atau lebih jalan yang terlihat seperti versi servable menentukan mana yang merupakan versi terbaru dan memanggil panggilan balik dengan daftar ukuran satu yang hanya berisi versi itu (di bawah konfigurasi default). Jadi, pada waktu tertentu FileSystemStoragePathSource permintaan paling banyak satu servable untuk dimuat, dan pelaksanaannya mengambil keuntungan dari idempotence dari callback untuk menjaga diri stateless (tidak ada salahnya menerapkan callback berulang kali dengan argumen yang sama).

FileSystemStoragePathSource memiliki inisialisasi pabrik statis (yang Create() metode), yang mengambil pesan protokol konfigurasi. Pesan konfigurasi mencakup detail seperti jalur dasar ke monitor dan interval pemantauan. Ini juga termasuk nama aliran yang dapat ditayangkan untuk dipancarkan. (Pendekatan alternatif mungkin mengekstrak nama aliran yang dapat dilayani dari jalur dasar, untuk memancarkan beberapa aliran yang dapat dilayani berdasarkan mengamati hierarki direktori yang lebih dalam; varian tersebut berada di luar cakupan implementasi referensi.)

Sebagian besar implementasi terdiri dari utas yang secara berkala memeriksa sistem file, bersama dengan beberapa logika untuk mengidentifikasi dan menyortir setiap sub-jalur numerik yang ditemukannya. Benang diluncurkan dalam SetAspiredVersionsCallback() (bukan di Create() ) karena itu adalah titik di mana sumber harus "mulai" dan tahu di mana untuk mengirim permintaan dicita-citakan-versi.

Menggunakan Sumber Anda untuk memuat sesi TensorFlow

Anda mungkin akan ingin menggunakan modul sumber baru dalam hubungannya dengan SavedModelBundleSourceAdapter ( servables/tensorflow/saved_model_bundle_source_adapter* ), yang akan menafsirkan setiap jalur memancarkan sumber Anda sebagai ekspor TensorFlow, dan mengubah setiap jalan ke loader untuk TensorFlow SavedModelBundle servable. Anda mungkin akan pasang SavedModelBundle adaptor ke AspiredVersionsManager , yang mengurus benar-benar memuat dan melayani servables. Sebuah ilustrasi yang baik dari chaining tiga jenis modul bersama-sama untuk mendapatkan sebuah perpustakaan server yang bekerja ditemukan di servables/tensorflow/simple_servers.cc . Berikut ini adalah walk-through dari aliran kode utama (dengan penanganan kesalahan yang buruk; kode yang sebenarnya harus lebih berhati-hati):

Pertama, buat pengelola:

std::unique_ptr<AspiredVersionsManager> manager = ...;

Kemudian, membuat SavedModelBundle adaptor sumber dan hubungkan ke manajer:

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());

Terakhir, menciptakan sumber jalan Anda dan hubungkan ke SavedModelBundle adapter:

auto your_source = new YourPathSource(...);
ConnectSourceToTarget(your_source, bundle_adapter.get());

The ConnectSourceToTarget() function (didefinisikan dalam core/target.h ) hanya memanggil SetAspiredVersionsCallback() untuk menghubungkan Source<T> ke Target<T> (a Target adalah modul yang tangkapan dicita-citakan-versi permintaan, yaitu adaptor atau manajer ).