Yeni bir hizmet türü oluşturma

Bu belge, TensorFlow Sunumunun yeni bir servis edilebilir tür ile nasıl genişletileceğini açıklamaktadır. En göze çarpan sunulabilir tür SavedModelBundle , ancak modelinizle birlikte gelen verileri sunmak için diğer türdeki sunulabilirleri tanımlamak yararlı olabilir. Örnekler şunları içerir: bir kelime arama tablosu, özellik dönüştürme mantığı. Herhangi bir C++ sınıfı sunulabilir olabilir, örneğin int , std::map<string, int> veya ikili dosyanızda tanımlanan herhangi bir sınıf - buna YourServable adını verelim.

YourServable için bir Loader ve SourceAdapter Tanımlama

TensorFlow Serving'in YourServable yönetmesini ve sunmasını sağlamak için iki şeyi tanımlamanız gerekir:

  1. YourServable örneğini yükleyen, erişim sağlayan ve kaldıran bir Loader sınıfı.

  2. Yükleyicileri dosya sistemi yolları gibi bazı temel veri formatlarından başlatan bir SourceAdapter . SourceAdapter alternatif olarak tam bir Source yazabilirsiniz. Ancak SourceAdapter yaklaşımı daha yaygın ve daha modüler olduğundan burada ona odaklanıyoruz.

Loader soyutlaması core/loader.h dosyasında tanımlanır. Sunulabilir türünüzü yüklemek, erişmek ve boşaltmak için yöntemler tanımlamanızı gerektirir. Sunulabilirin yüklendiği veriler herhangi bir yerden gelebilir, ancak bir depolama sistemi yolundan gelmesi yaygındır. YourServable için de durumun böyle olduğunu varsayalım. Ayrıca, halihazırda memnun olduğunuz bir Source<StoragePath> 'e sahip olduğunuzu varsayalım (değilse Özel Kaynak belgesine bakın).

Loader ek olarak, belirli bir depolama yolundan Loader başlatan bir SourceAdapter tanımlamanız gerekecektir. Çoğu basit kullanım durumu, iki nesneyi SimpleLoaderSourceAdapter sınıfıyla ( core/simple_loader.h içinde) tam olarak belirtebilir. Gelişmiş kullanım durumları, örneğin SourceAdapter bazı durumları koruması gerekiyorsa ve/veya durumun Loader örnekleri arasında paylaşılması gerekiyorsa, alt düzey API'leri kullanarak Loader ve SourceAdapter sınıflarını ayrı ayrı belirtmeyi tercih edebilir.

servables/hashmap/hashmap_source_adapter.cc dosyasında SimpleLoaderSourceAdapter kullanan basit bir karma harita sunumunun referans uygulaması vardır. HashmapSourceAdapter bir kopyasını oluşturmayı ve ardından onu ihtiyaçlarınıza uyacak şekilde değiştirmeyi uygun bulabilirsiniz.

HashmapSourceAdapter uygulanması iki bölümden oluşur:

  1. LoadHashmapFromFile() içindeki bir dosyadan hashmap yükleme mantığı.

  2. LoadHashmapFromFile() temel alınarak hashmap yükleyicileri yayan bir SourceAdapter tanımlamak için SimpleLoaderSourceAdapter kullanımı. Yeni SourceAdapter HashmapSourceAdapterConfig türündeki bir yapılandırma protokolü mesajından başlatılabilir. Şu anda yapılandırma mesajı yalnızca dosya formatını içermektedir ve referans uygulaması amacıyla yalnızca tek bir basit format desteklenmektedir.

    Yıkıcıdaki Detach() çağrısına dikkat edin. Bu çağrı, parçalanma durumu ile Yaratıcı lambda'nın diğer başlıklarda devam eden çağrıları arasındaki yarışı önlemek için gereklidir. (Bu basit kaynak bağdaştırıcısının herhangi bir durumu olmamasına rağmen, temel sınıf yine de Detach() öğesinin çağrılmasını zorunlu kılar.)

YourServable nesnelerinin bir yöneticiye yüklenmesini ayarlama

Yeni SourceAdapter for YourServable yükleyicilerinizi temel bir depolama yolu kaynağına ve bir yöneticiye (kötü hata işlemeyle; gerçek kod daha dikkatli olmalıdır) nasıl bağlayacağınız aşağıda açıklanmıştır:

İlk önce bir yönetici oluşturun:

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

Ardından, bir YourServable kaynak bağdaştırıcısı oluşturun ve bunu yöneticiye takın:

auto your_adapter = new YourServableSourceAdapter(...);
ConnectSourceToTarget(your_adapter, manager.get());

Son olarak basit bir yol kaynağı oluşturun ve onu adaptörünüze takın:

std::unique_ptr<FileSystemStoragePathSource> path_source;
// Here are some FileSystemStoragePathSource config settings that ought to get
// it working, but for details please see its documentation.
FileSystemStoragePathSourceConfig config;
// We just have a single servable stream. Call it "default".
config.set_servable_name("default");
config.set_base_path(FLAGS::base_path /* base path for our servable files */);
config.set_file_system_poll_wait_seconds(1);
TF_CHECK_OK(FileSystemStoragePathSource::Create(config, &path_source));
ConnectSourceToTarget(path_source.get(), your_adapter.get());

Yüklenen YourServable nesnelerine erişme

Yüklenen bir YourServable tanıtıcısını nasıl alacağınız ve onu nasıl kullanacağınız aşağıda açıklanmıştır:

auto handle_request = serving::ServableRequest::Latest("default");
ServableHandle<YourServable*> servable;
Status status = manager->GetServableHandle(handle_request, &servable);
if (!status.ok()) {
  LOG(INFO) << "Zero versions of 'default' servable have been loaded so far";
  return;
}
// Use the servable.
(*servable)->SomeYourServableMethod();

Gelişmiş: Birden fazla yayınlanabilir örneğin durumu paylaşacak şekilde düzenlenmesi

SourceAdapters, birden fazla yayılan hizmet arasında paylaşılan durumu barındırabilir. Örneğin:

  • Birden çok hizmetin kullandığı paylaşılan bir iş parçacığı havuzu veya başka bir kaynak.

  • Her bir hizmet verilebilir örnekte veri yapısının çoğaltılmasından kaynaklanan zaman ve alan yükünü önlemek için, birden çok hizmet sunucusunun kullandığı, paylaşılan salt okunur bir veri yapısı.

Başlatma süresi ve boyutu ihmal edilebilir olan paylaşılan durum (örneğin iş parçacığı havuzları), SourceAdapter tarafından istekli bir şekilde oluşturulabilir ve bu daha sonra, yayılan her hizmet verilebilir yükleyiciye kendisine bir işaretçi yerleştirir. Pahalı veya büyük paylaşımlı durumun oluşturulması, uygulanabilir ilk Loader::Load() çağrısına ertelenmeli, yani yönetici tarafından yönetilmelidir. Simetrik olarak, pahalı/büyük paylaşımlı durumu kullanan son hizmet dosyasına yapılan Loader::Unload() çağrısı onu çökertmelidir.