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 sabitlerindenserve
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
veclassification_signature
oluşturmak içinsignature_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çintensorflow/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!