Bir TensorFlow Modeli Sunma

Bu eğitici, eğitimli bir TensorFlow modelini dışa aktarmak için TensorFlow Hizmet bileşenlerini nasıl kullanacağınızı ve buna hizmet etmek için standart tensorflow_model_server'ı nasıl kullanacağınızı gösterir. Zaten TensorFlow Porsiyon aşina ve daha fazla sunucu internals nasıl çalıştığı hakkında bilgi edinmek istiyorsanız, bkz gelişmiş öğretici Porsiyon TensorFlow .

Bu öğretici, el yazısı rakamları sınıflandıran basit bir Softmax Regresyon modeli kullanır. Bu tanıtıldı birine çok benzer Moda MNIST veri kümesini kullanarak görüntü sınıflandırmasına TensorFlow öğretici .

Bu öğreticinin kodu iki bölümden oluşur:

  • Bir Python dosyası, mnist_saved_model.py , yani tren ve ihracat modeli.

  • Ya Apt kullanılarak yüklenmiş ya da bir C ++ dosyası (derlenebilir bir ModelServer ikili main.cc ). TensorFlow Porsiyon ModelServer keşfeder yeni modeller ihraç ve ishal gRPC onlara hizmet için hizmet.

Başlamadan önce, ilk Docker yükleyin .

TensorFlow modelini eğitin ve dışa aktarın

Eğitim fazı için, TensorFlow grafik TensorFlow oturum piyasaya sunulmuştur sess gibi giriş tensörü (görüntü) ile, x ve benzeri gibi çıkış tensörü (Softmax skoru) y .

Sonra TensorFlow kullanalım SavedModelBuilder modülünü modelini ihraç etmeye. SavedModelBuilder o çıkarım için daha sonra yüklenebilir böylece güvenilir depolama için eğitilmiş modelinin "anlık" kaydeder.

SavedModel biçimi hakkında ayrıntılı bilgi için, en belgelere bakın SavedModel README.md .

Kaynaktan mnist_saved_model.py , şu diske bir model tasarrufu genel işlemi göstermek için bir kısa kod snippet'idir.

export_path_base = sys.argv[-1]
export_path = os.path.join(
    tf.compat.as_bytes(export_path_base),
    tf.compat.as_bytes(str(FLAGS.model_version)))
print('Exporting trained model to', export_path)
builder = tf.saved_model.builder.SavedModelBuilder(export_path)
builder.add_meta_graph_and_variables(
    sess, [tf.compat.v1.saved_model.tag_constants.SERVING],
    signature_def_map={
        'predict_images':
            prediction_signature,
        tf.compat.v1.saved_model.signature_constants
            .DEFAULT_SERVING_SIGNATURE_DEF_KEY:
            classification_signature,
    },
    main_op=tf.compat.v1.tables_initializer(),
    strip_default_attrs=True)
builder.save()

SavedModelBuilder.__init__ aşağıdaki argüman alır:

  • export_path ihracat dizinin yoludur.

SavedModelBuilder o yoksa dizin oluşturacaktır. Örneğimizde, komut satırı argümanı ve bitiştirmek FLAGS.model_version ihracat dizini elde etmek. FLAGS.model_version modelinin versiyonunu belirtir. Aynı modelin daha yeni bir sürümünü dışa aktarırken daha büyük bir tamsayı değeri belirtmelisiniz. Her sürüm, verilen yol altında farklı bir alt dizine aktarılacaktır.

Kullanarak oluşturucu meta grafik ve değişkenler ekleyebilir SavedModelBuilder.add_meta_graph_and_variables() aşağıdaki değişkenlerden ile:

  • sess aktarmakta olduğunuz eğitimli bir model tutan TensorFlow oturumdur.

  • tags meta grafiği kaydetmek için etiketlere ilişkin kümesidir. Yayınının grafiği kullanın niyetinde beri bu durumda, kullandığımız serve önceden SavedModel etiketi sabitleri etiketi. Daha fazla ayrıntı için bkz tag_constants.py ve ilgili TensorFlow API belgelerine .

  • signature_def_map belirtir bir tensorflow bir imza için kullanıcı tarafından sağlanan anahtarın haritası :: SignatureDef meta grafiğine ekleyin. İmza, ne tür bir modelin dışa aktarıldığını ve çıkarım çalıştırılırken bağlanacak giriş/çıkış tensörlerini belirtir.

    Özel imza anahtarı serving_default belirtir varsayılan imza hizmet. İmzalarla ilgili diğer sabitlerle birlikte varsayılan sunum imza def anahtarı, SavedModel imza sabitlerinin bir parçası olarak tanımlanır. Daha fazla ayrıntı için bkz signature_constants.py ve ilgili TensorFlow API belgelerine .

    Ayrıca, kolayca elde etmenizi sağlamakla imza Defs için, SavedModel API sağlar imza def utils'i orijinal, Özellikle .. mnist_saved_model.py dosyası, kullandığımız signature_def_utils.build_signature_def() inşa etmek predict_signature ve classification_signature .

    Nasıl bir örnek olarak predict_signature tanımlanır, util aşağıdaki bağımsız değişkenleri alır:

    • inputs={'images': tensor_info_x} giriş tensör bilgi belirtir.

    • outputs={'scores': tensor_info_y} tensör bilgileri puanları belirtir.

    • method_name çıkarım için kullanılan bir yöntemdir. Tahmin istekleri için, ayarlanmalıdır tensorflow/serving/predict . Diğer yöntem adlarıyla için bkz signature_constants.py ve ilgili TensorFlow API belgelerine .

Not olduğunu tensor_info_x ve tensor_info_y Var yapısı tensorflow::TensorInfo protokolü tanımlanmış tampon burada . Kolayca tensör Infos oluşturmak için TensorFlow SavedModel API ayrıca sağlar utils.py ile ilgili TensorFlow API belgelerinde .

Ayrıca, not olduğunu images ve scores tensör takma isimleridir. Onlar istediğiniz benzersiz olursa olsun dizeleri olabilir ve onlar tensör mantıksal isimleri haline gelecek x ve y daha sonra tahmin istekleri gönderirken bağlayıcı tensör için başvurmak söyledi.

Örneğin, x adı 'long_tensor_name_foo' ile tensörü belirtir ve y 'generated_tensor_name_bar' adıyla tensör belirtir, builder (puanları ve - gerçek adı eşleme tensörü mantıksal adı depolamak (> 'long_tensor_name_foo' görüntü ') olacak ' -> 'generated_tensor_name_bar'). Bu, kullanıcının çıkarımı çalıştırırken mantıksal adlarıyla bu tensörlere başvurmasına izin verir.

Hadi çalıştıralım!

İlk olarak, henüz yapmadıysanız, bu depoyu yerel makinenize kopyalayın:

git clone https://github.com/tensorflow/serving.git
cd serving

Zaten varsa, dışa aktarma dizinini temizleyin:

rm -rf /tmp/mnist

Şimdi modeli eğitelim:

tools/run_in_docker.sh python tensorflow_serving/example/mnist_saved_model.py \
  /tmp/mnist

Bu, şuna benzeyen çıktıyla sonuçlanmalıdır:

Training model...

...

Done training!
Exporting trained model to models/mnist
Done exporting!

Şimdi dışa aktarma dizinine bir göz atalım.

$ ls /tmp/mnist
1

Yukarıda bahsedildiği gibi, modelin her versiyonunu dışa aktarmak için bir alt dizin oluşturulacaktır. FLAGS.model_version varsayılan değeri 1 olarak, bu nedenle karşılık gelen alt dizin sahiptir 1 oluşturulur.

$ ls /tmp/mnist/1
saved_model.pb variables

Her sürüm alt dizini aşağıdaki dosyaları içerir:

  • saved_model.pb tefrika tensorflow olduğu :: SavedModel. Modelin bir veya daha fazla grafik tanımını ve ayrıca modelin imzalar gibi meta verilerini içerir.

  • variables grafikler tefrika değişkenleri tutun dosyalardır.

Bununla TensorFlow modeliniz dışa aktarılır ve yüklenmeye hazırdır!

Dışa aktarılan modeli standart TensorFlow ModelServer ile yükleyin

Modeli sunum için kolayca yüklemek için bir Docker sunum görüntüsü kullanın:

docker run -p 8500:8500 \
--mount type=bind,source=/tmp/mnist,target=/models/mnist \
-e MODEL_NAME=mnist -t tensorflow/serving &

sunucuyu test et

Biz sağlanan kullanabilirsiniz mnist_client sunucusunu test etmek için yarar. İstemci MNIST test verilerini indirir, bunları sunucuya istek olarak gönderir ve çıkarım hata oranını hesaplar.

tools/run_in_docker.sh python tensorflow_serving/example/mnist_client.py \
  --num_tests=1000 --server=127.0.0.1:8500

Bu, şöyle bir çıktı vermeli

    ...
    Inference error rate: 11.13%

Eğitilmiş Softmax modeli için yaklaşık %90 doğruluk bekliyoruz ve ilk 1000 test görüntüsü için %11 çıkarım hata oranı elde ediyoruz. Bu, sunucunun eğitilmiş modeli başarıyla yüklediğini ve çalıştırdığını onaylar!