TensorFlow Modeline Hizmet Verme

Bu eğitim, eğitilmiş bir TensorFlow modelini dışa aktarmak için TensorFlow Hizmet bileşenlerini nasıl kullanacağınızı ve ona hizmet etmek için standart tensorflow_model_server'ı nasıl kullanacağınızı gösterir. TensorFlow Serving'e zaten aşina iseniz ve sunucunun dahili bileşenlerinin nasıl çalıştığı hakkında daha fazla bilgi edinmek istiyorsanız TensorFlow Serving gelişmiş eğitimine bakın.

Bu eğitimde, el yazısı rakamları sınıflandıran basit bir Softmax Regresyon modeli kullanılmaktadır. Fashion MNIST veri kümesi kullanılarak görüntü sınıflandırmasına ilişkin TensorFlow eğitiminde tanıtılana çok benzer.

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

  • Modeli eğiten ve dışa aktaran mnist_saved_model.py Python dosyası.

  • Apt kullanılarak kurulabilen veya bir C++ dosyasından ( main.cc ) derlenebilen bir ModelServer ikili dosyası. TensorFlow Serving ModelServer, dışa aktarılan yeni modelleri keşfeder ve bunları sunmak için bir gRPC hizmetini çalıştırır.

Başlamadan önce Docker'ı yükleyin .

TensorFlow modelini eğitme ve dışa aktarma

Eğitim aşaması için TensorFlow grafiği, giriş tensörü (görüntü) x ve çıkış tensörü (Softmax puanı) y olacak şekilde TensorFlow oturumu sess başlatılır.

Daha sonra modeli dışa aktarmak için TensorFlow'un SavedModelBuilder modülünü kullanıyoruz. SavedModelBuilder eğitilen modelin bir "anlık görüntüsünü" güvenilir depolamaya kaydeder, böylece daha sonra çıkarım için yüklenebilmektedir.

SavedModel formatıyla ilgili ayrıntılar için lütfen SavedModel README.md adresindeki belgelere bakın.

mnist_saved_model.py dosyasından, bir modeli diske kaydetmenin genel sürecini gösteren kısa bir kod pasajı aşağıdadır.

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 dışa aktarma dizininin yoludur.

SavedModelBuilder mevcut değilse dizini oluşturacaktır. Örnekte, dışa aktarma dizinini elde etmek için komut satırı argümanını ve FLAGS.model_version birleştiriyoruz. FLAGS.model_version modelin sürümünü 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.

Aşağıdaki bağımsız değişkenlerle SavedModelBuilder.add_meta_graph_and_variables() işlevini kullanarak oluşturucuya meta grafik ve değişkenler ekleyebilirsiniz:

  • sess dışa aktardığınız eğitimli modeli tutan TensorFlow oturumudur.

  • tags meta grafiğin kaydedileceği etiketler kümesidir. Bu durumda grafiği sunumda kullanmayı düşündüğümüz için önceden tanımlanmış SavedModel etiket sabitlerinden serve etiketini kullanıyoruz. Daha fazla ayrıntı için tag_constants.py ve ilgili TensorFlow API belgelerine bakın.

  • signature_def_map meta grafiğe eklenecek tensorflow::SignatureDef imzasına yönelik kullanıcı tarafından sağlanan anahtarın haritasını belirtir. İ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 varsayılan sunum imzasını belirtir. Varsayılan sunum imzası def anahtarı, imzalarla ilgili diğer sabitlerle birlikte SavedModel imza sabitlerinin bir parçası olarak tanımlanır. Daha fazla ayrıntı için imza_constants.py ve ilgili TensorFlow API belgelerine bakın.

    Ayrıca, imza tanımlarını kolayca oluşturmaya yardımcı olmak için SavedModel API, imza tanımlarını sağlar. Özellikle, orijinal mnist_saved_model.py dosyasında, predict_signature ve classification_signature oluşturmak için signature_def_utils.build_signature_def() kullanırız.

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

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

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

    • method_name çıkarım için kullanılan yöntemdir. Tahmin istekleri için tensorflow/serving/predict olarak ayarlanmalıdır. Diğer yöntem adları için imza_constants.py ve ilgili TensorFlow API belgelerine bakın.

tensor_info_x ve tensor_info_y burada tanımlanan tensorflow::TensorInfo protokol arabelleği yapısına sahip olduğunu unutmayın. TensorFlow SavedModel API, tensör bilgilerini kolayca oluşturmak için ilgili TensorFlow API belgelerini içeren utils.py dosyasını da sağlar.

Ayrıca images ve scores tensör takma adları olduğunu unutmayın. Bunlar istediğiniz benzersiz dizeler olabilir ve daha sonra tahmin isteklerini gönderirken tensör bağlama için başvuracağınız tensör x ve y mantıksal adları haline gelecektir.

Örneğin, eğer x 'uzun_tensör_adı_foo' adındaki tensöre başvuruyorsa ve y 'oluşturulan_tensör_adı_çubuğu' adındaki tensöre başvuruyorsa, builder tensör mantıksal adını gerçek ad eşlemesinde saklayacaktır ('images' -> 'long_tensor_name_foo') ve ('scores) ' -> 'geneulated_tensor_name_bar'). Bu, kullanıcının çıkarımı çalıştırırken bu tensörlere mantıksal adlarıyla başvurmasına olanak tanır.

Haydi ç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 mevcutsa, 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 bir çı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 belirtildiği gibi modelin her versiyonunun dışa aktarımı için bir alt dizin oluşturulacaktır. FLAGS.model_version varsayılan değeri 1'dir, bu nedenle ilgili alt dizin 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 serileştirilmiş tensorflow::SavedModel'dir. Modelin bir veya daha fazla grafik tanımının yanı sıra modelin imzalar gibi meta verilerini içerir.

  • variables grafiklerin serileştirilmiş değişkenlerini tutan dosyalardır.

Böylece TensorFlow modeliniz dışa aktarılır ve yüklenmeye hazır olur!

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

Modeli sunum için kolayca yüklemek üzere 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 edin

Sunucuyu test etmek için sağlanan mnist_client yardımcı programını kullanabiliriz. İ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 şunun gibi bir çıktı vermelidir:

    ...
    Inference error rate: 11.13%

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