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:
YourServable
örneğini yükleyen, erişim sağlayan ve kaldıran birLoader
sınıfı.Dosya sistemi yolları gibi bazı temel veri formatlarından yükleyicileri başlatan bir
SourceAdapter
.SourceAdapter
alternatif olarak tam birSource
yazabilirsiniz. AncakSourceAdapter
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:
LoadHashmapFromFile()
içindeki bir dosyadan hashmap yükleme mantığı.LoadHashmapFromFile()
temel alınarak hashmap yükleyicileri yayan birSourceAdapter
tanımlamak içinSimpleLoaderSourceAdapter
kullanımı. YeniSourceAdapter
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 (örn. 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.