Performans Kılavuzu

TensorFlow Serving'in performansı büyük ölçüde çalıştırdığı uygulamaya, dağıtıldığı ortama ve temel donanım kaynaklarına erişimi paylaştığı diğer yazılımlara bağlıdır. Bu nedenle, performansının ayarlanması duruma bağlıdır ve tüm ayarlarda en iyi performansı sağlamayı garantileyen çok az sayıda evrensel kural vardır. Bununla birlikte bu belge, TensorFlow Hizmetini çalıştırmaya yönelik bazı genel ilkeleri ve en iyi uygulamaları yakalamayı amaçlamaktadır.

Modelinizin çıkarım istekleri üzerindeki hesaplamasının temel davranışını anlamak için lütfen TensorBoard ile Profil Çıkarımı İstekleri kılavuzunu kullanın ve performansını yinelemeli olarak artırmak için bu kılavuzu kullanın.

Hızlı ipuçları

  • İlk isteğin gecikmesi çok mu yüksek? Model ısınmasını etkinleştirin.
  • Daha yüksek kaynak kullanımı veya verimle ilgileniyor musunuz? Toplu işlemi yapılandırma

Performans Ayarlama: Hedefler ve Parametreler

TensorFlow Serving'in performansına ince ayar yaparken, genellikle sahip olabileceğiniz 2 tür hedef ve bu hedefleri geliştirmek için ayarlayabileceğiniz 3 grup parametre vardır.

Hedefler

TensorFlow Serving, makine tarafından öğrenilen modeller için çevrimiçi bir hizmet sistemidir . Diğer birçok çevrimiçi hizmet sisteminde olduğu gibi, birincil performans hedefi , kuyruk gecikmesini belirli sınırların altında tutarken verimi en üst düzeye çıkarmaktır . Uygulamanızın ayrıntılarına ve olgunluğuna bağlı olarak, ortalama gecikmeyi kuyruk gecikmesinden daha fazla önemsiyor olabilirsiniz, ancak bazı gecikme ve aktarım hızı kavramları genellikle performans hedeflerini belirlediğiniz ölçümlerdir. Bu daha çok dağıtım ortamının bir işlevi olduğu için bu kılavuzda kullanılabilirliği tartışmadığımızı unutmayın.

Parametreler

Kabaca konfigürasyonu gözlemlenen performansı belirleyen 3 grup parametreyi düşünebiliriz: 1) TensorFlow modeli 2) çıkarım istekleri ve 3) sunucu (donanım ve ikili).

1) TensorFlow Modeli

Model, TensorFlow Serving'in gelen her isteği aldıktan sonra gerçekleştireceği hesaplamayı tanımlar.

TensorFlow Serving, aslında isteklerinize ilişkin gerçek çıkarımı yapmak için TensorFlow çalışma zamanını kullanır. Bu, TensorFlow Sunumu ile bir isteğin sunulmasındaki ortalama gecikmenin genellikle en azından TensorFlow ile doğrudan çıkarım yapma süresi kadar olduğu anlamına gelir. Bu, belirli bir makinede tek bir örnek üzerinde çıkarımın 2 saniye sürmesi ve saniyenin altındaki bir gecikme hedefiniz varsa, çıkarım isteklerinin profilini çıkarmanız, hangi TensorFlow işlemlerinin ve modelinizin alt grafiklerinin bu gecikmeye en çok katkıda bulunduğunu anlamanız gerektiği anlamına gelir. ve modelinizi, tasarım kısıtlaması olarak çıkarım gecikmesini göz önünde bulundurarak yeniden tasarlayın.

TensorFlow Serving ile çıkarım gerçekleştirmenin ortalama gecikmesi genellikle TensorFlow'u doğrudan kullanmaktan daha düşük olmasa da, TensorFlow Serving'in parladığı, birçok farklı modeli sorgulayan birçok istemci için kuyruk gecikmesini düşük tuttuğunu ve bu arada verimi en üst düzeye çıkarmak için temel donanımı verimli bir şekilde kullandığını lütfen unutmayın. .

2) Çıkarım İstekleri

API Yüzeyleri

TensorFlow Serving, her ikisi de PredictionService API'sini uygulayan iki API yüzeyine (HTTP ve gRPC) sahiptir (HTTP Sunucusunun MultiInference uç noktasını kullanıma sunmaması hariç). Her iki API yüzeyi de yüksek düzeyde ayarlanmıştır ve minimum gecikme süresi sağlar ancak pratikte gRPC yüzeyinin biraz daha performanslı olduğu gözlemlenir.

API Yöntemleri

Genel olarak, daha yüksek düzeyde bir soyutlama olan tf.Example'ı kabul ettikleri için Classify ve Regress uç noktalarının kullanılması tavsiye edilir; ancak, büyük (O(Mb)) yapılandırılmış isteklerin olduğu nadir durumlarda, bilgili kullanıcılar PredictRequest'i kullanarak Protobuf mesajlarını doğrudan bir TensorProto'ya kodlayabilir ve tf'ye seri hale getirme ve seri durumdan çıkarma işlemlerini atlayabilirler. Örneğin, hafif bir performans kazancı kaynağı.

Parti boyutu

Toplu işlemin performansınıza yardımcı olabileceği iki temel yol vardır. İstemcilerinizi TensorFlow Serving'e toplu istekler gönderecek şekilde yapılandırabilir veya bireysel istekler gönderip TensorFlow Serving'i önceden belirlenmiş bir süreye kadar bekleyecek ve o dönemde tek bir toplu iş halinde gelen tüm istekler üzerinde çıkarım yapacak şekilde yapılandırabilirsiniz. İkinci tür toplu işlemi yapılandırmak, TensorFlow Serving'i son derece yüksek QPS'de yakalamanıza olanak tanırken aynı zamanda buna ayak uydurmak için gereken bilgi işlem kaynaklarını alt doğrusal olarak ölçeklendirmesine olanak tanır. Bu konu, yapılandırma kılavuzunda ve toplu README dosyasında daha ayrıntılı olarak ele alınmaktadır.

3) Sunucu (Donanım ve İkili)

TensorFlow Serving ikili programı, üzerinde çalıştığı donanımın oldukça hassas bir hesaplamasını yapar. Bu nedenle, özellikle dinamik kaynak kullanımına sahip olanlar olmak üzere, yoğun bilgi işlem veya bellek kullanan diğer uygulamaları aynı makinede çalıştırmaktan kaçınmalısınız.

Diğer birçok iş yükü türünde olduğu gibi, TensorFlow Hizmeti de daha az sayıda, daha büyük (daha fazla CPU ve RAM) makineye (yani Kubernetes terimleriyle daha düşük replicas sahip bir Deployment ) dağıtıldığında daha verimli olur. Bunun nedeni, donanımı kullanmak ve sabit maliyetleri (RPC sunucusu, TensorFlow çalışma zamanı vb.) düşürmek için çok kiracılı dağıtımın daha iyi bir potansiyele sahip olmasıdır.

Hızlandırıcılar

Ana makinenizin bir hızlandırıcıya erişimi varsa, modelinizi hızlandırıcıya yoğun hesaplamalar yerleştirecek şekilde uyguladığınızdan emin olun; üst düzey TensorFlow API'leri kullandıysanız ancak özel grafikler oluşturduysanız veya sabitlemek istiyorsanız bu otomatik olarak yapılmalıdır. Belirli hızlandırıcılardaki grafiklerin belirli bölümleri için, hızlandırıcılara belirli alt grafikleri manuel olarak yerleştirmeniz gerekebilir (örn with tf.device('/device:GPU:0'): ... kullanarak).

Modern CPU'lar

Modern CPU'lar, SIMD (Tek Komutlu Çoklu Veri) desteğini ve yoğun hesaplamalar için kritik olan diğer özellikleri (örneğin, bir saat döngüsünde çarpma ve toplama) geliştirmek için x86 komut seti mimarisini sürekli olarak genişletmiştir. Bununla birlikte, biraz daha eski makinelerde çalışmak üzere TensorFlow ve TensorFlow Serving, bu özelliklerin en yenilerinin ana bilgisayar CPU'su tarafından desteklenmediği yönünde mütevazı bir varsayımla oluşturulmuştur.

Your CPU supports instructions that this TensorFlow binary was not compiled to use: AVX2 FMA

TensorFlow Serving başlangıcında bu günlük girişini (muhtemelen listelenen 2 uzantıdan farklı uzantılar) görürseniz, bu, TensorFlow Serving'i yeniden oluşturabileceğiniz ve kendi ana makinenizin platformunu hedefleyebileceğiniz ve daha iyi performansın keyfini çıkarabileceğiniz anlamına gelir. TensorFlow Oluşturmak Kaynaktan hizmet vermek Docker kullanılarak nispeten kolaydır ve burada belgelenmiştir.

İkili Yapılandırma

TensorFlow Serving, çalışma zamanı davranışını yöneten, çoğunlukla komut satırı işaretleriyle ayarlanan bir dizi yapılandırma düğmesi sunar. Bunlardan bazıları (en önemlisi tensorflow_intra_op_parallelism ve tensorflow_inter_op_parallelism ) TensorFlow çalışma zamanını yapılandırmak için aktarılır ve otomatik olarak yapılandırılır; bilgili kullanıcılar birçok deney yaparak ve kendi özel iş yükleri ve ortamları için doğru yapılandırmayı bularak bunları geçersiz kılabilirler.

TensorFlow Hizmet Çıkarımı İsteğinin Ömrü

Tipik bir isteğin geçirdiği yolculuğu görmek için TensorFlow Hizmet Çıkarma isteğinin prototip bir örneğinin ömrünü kısaca gözden geçirelim. Örneğimiz için, 2.0.0 TensorFlow Serving gRPC API yüzeyi tarafından alınan bir Tahmin İsteğini ele alacağız.

Önce bileşen düzeyinde bir dizi diyagramına bakalım, ardından bu etkileşim serisini uygulayan koda geçelim.

Sıra Diyagramı

Sıra Diyagramını Tahmin Et

Client'ın kullanıcıya ait bir bileşen olduğunu, Prediction Service, Servables ve Server Core'un TensorFlow Serving'e, TensorFlow Runtime'ın ise Core TensorFlow'a ait olduğunu unutmayın.

Sıra Ayrıntıları

  1. PredictionServiceImpl::Predict PredictRequest alır
  2. İstek son tarihini gRPC isteğinden (eğer ayarlanmışsa) yayarak TensorflowPredictor::Predict çağırırız.
  3. TensorflowPredictor::Predict içinde, isteğin çıkarım yapmak istediği Servable'ı (model) ararız ; buradan SavedModel hakkında bilgi alırız ve daha da önemlisi, model grafiğinin (muhtemelen kısmen) bulunduğu Session nesnesinin tanıtıcısını alırız. yüklendi. Bu Servable nesnesi, model TensorFlow Serving tarafından yüklendiğinde bellekte oluşturuldu ve kaydedildi. Daha sonra tahmini gerçekleştirmek için internal::RunPredict'i çağırırız.
  4. internal::RunPredict , isteği doğruladıktan ve ön işleme tabi tuttuktan sonra, Session::Run'a yapılan engelleme çağrısını kullanarak çıkarımı gerçekleştirmek için Session nesnesini kullanırız, bu noktada çekirdek TensorFlow'un kod tabanına gireriz. Session::Run geri döndükten ve outputs tensörlerimiz doldurulduktan sonra, çıktıları bir PredictionResponse dönüştürürüz ve sonucu çağrı yığınına döndürürüz.