Tutorial ini menunjukkan cara menggunakan komponen TensorFlow Serving untuk mengekspor model TensorFlow terlatih dan menggunakan tensorflow_model_server standar untuk menyajikannya. Jika Anda sudah akrab dengan TensorFlow Melayani, dan Anda ingin tahu lebih banyak tentang bagaimana internal server yang bekerja, melihat TensorFlow Melayani tutorial canggih .
Tutorial ini menggunakan model Regresi Softmax sederhana yang mengklasifikasikan angka tulisan tangan. Hal ini sangat mirip dengan yang diperkenalkan di TensorFlow tutorial tentang klasifikasi citra menggunakan dataset Mode MNIST .
Kode untuk tutorial ini terdiri dari dua bagian:
Sebuah file Python, mnist_saved_model.py , bahwa kereta dan ekspor model.
Sebuah ModelServer biner yang dapat baik diinstal dengan menggunakan Apt, atau dikompilasi dari C ++ berkas ( main.cc ). The TensorFlow Melayani menemukan ModelServer baru diekspor model dan menjalankan gRPC layanan untuk melayani mereka.
Sebelum memulai, pertama install Docker .
Latih dan ekspor model TensorFlow
Untuk tahap pelatihan, grafik TensorFlow diluncurkan di TensorFlow sesi sess
, dengan tensor input (image) sebagai x
dan output tensor (skor Softmax) sebagai y
.
Kemudian kita menggunakan TensorFlow ini modul SavedModelBuilder untuk mengekspor model. SavedModelBuilder
menyimpan "snapshot" dari model dilatih untuk penyimpanan yang handal sehingga dapat dimuat kemudian untuk inferensi.
Untuk detail pada format SavedModel, silakan lihat dokumentasi di SavedModel README.md .
Dari mnist_saved_model.py , berikut ini adalah potongan kode singkat untuk menggambarkan proses umum menyimpan model ke disk.
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__
mengambil argumen berikut:
-
export_path
adalah jalur dari direktori ekspor.
SavedModelBuilder
akan membuat direktori jika tidak ada. Dalam contoh ini, kami menggabungkan argumen baris perintah dan FLAGS.model_version
untuk mendapatkan direktori ekspor. FLAGS.model_version
menentukan versi model. Anda harus menentukan nilai integer yang lebih besar saat mengekspor versi yang lebih baru dari model yang sama. Setiap versi akan diekspor ke sub-direktori yang berbeda di bawah jalur yang diberikan.
Anda dapat menambahkan meta grafik dan variabel untuk pembangun menggunakan SavedModelBuilder.add_meta_graph_and_variables()
dengan argumen berikut:
sess
adalah sesi TensorFlow yang memegang model terlatih Anda mengekspor.tags
adalah set tag yang dapat digunakan untuk menyimpan meta grafik. Dalam hal ini, karena kami berniat untuk menggunakan grafik dalam melayani, kami menggunakanserve
tag dari konstanta tag SavedModel ditentukan sebelumnya. Untuk lebih jelasnya, lihat tag_constants.py dan TensorFlow terkait dokumentasi API .signature_def_map
Menentukan peta kunci yang disediakan pengguna untuk tanda tangan untuk tensorflow sebuah :: SignatureDef untuk menambah meta grafik. Signature menentukan jenis model apa yang sedang diekspor, dan tensor input/output untuk diikat saat menjalankan inferensi.Kunci tanda tangan khusus
serving_default
menspesifikasikan default melayani tanda tangan. Kunci def tanda tangan penyajian default, bersama dengan konstanta lain yang terkait dengan tanda tangan, didefinisikan sebagai bagian dari konstanta tanda tangan SavedModel. Untuk lebih jelasnya, lihat signature_constants.py dan TensorFlow terkait dokumentasi API .Selanjutnya, untuk membantu membangun tanda tangan defs mudah, yang SavedModel API menyediakan tanda tangan utils def .. Secara khusus, dalam bahasa aslinya mnist_saved_model.py berkas, kita menggunakan
signature_def_utils.build_signature_def()
untuk membangunpredict_signature
danclassification_signature
.Sebagai contoh bagaimana
predict_signature
didefinisikan, util mengambil argumen berikut:inputs={'images': tensor_info_x}
menentukan info masukan tensor.outputs={'scores': tensor_info_y}
menentukan nilai tensor info.method_name
adalah metode yang digunakan untuk kesimpulan. Untuk permintaan Prediksi, itu harus ditetapkan untuktensorflow/serving/predict
. Untuk nama metode lainnya, lihat signature_constants.py dan TensorFlow terkait dokumentasi API .
Perhatikan bahwa tensor_info_x
dan tensor_info_y
memiliki struktur tensorflow::TensorInfo
protokol penyangga didefinisikan di sini . Untuk dengan mudah membangun tensor infos, API TensorFlow SavedModel juga menyediakan utils.py , dengan terkait dokumentasi TensorFlow API .
Juga, perhatikan bahwa images
dan scores
adalah nama alias tensor. Mereka bisa menjadi string unik apa pun yang Anda inginkan, dan mereka akan menjadi nama-nama logis dari tensor x
dan y
yang Anda lihat untuk tensor mengikat saat mengirim permintaan prediksi nanti.
Misalnya, jika x
mengacu pada tensor dengan nama 'long_tensor_name_foo' dan y
mengacu pada tensor dengan nama 'generated_tensor_name_bar', builder
akan menyimpan tensor nama logis untuk nama sebenarnya pemetaan ( 'gambar' -> 'long_tensor_name_foo') dan ( 'skor ' -> 'generated_tensor_name_bar'). Ini memungkinkan pengguna untuk merujuk ke tensor ini dengan nama logisnya saat menjalankan inferensi.
Ayo jalankan!
Pertama, jika Anda belum melakukannya, klon repositori ini ke mesin lokal Anda:
git clone https://github.com/tensorflow/serving.git
cd serving
Hapus direktori ekspor jika sudah ada:
rm -rf /tmp/mnist
Sekarang mari kita latih modelnya:
tools/run_in_docker.sh python tensorflow_serving/example/mnist_saved_model.py \
/tmp/mnist
Ini akan menghasilkan output yang terlihat seperti:
Training model...
...
Done training!
Exporting trained model to models/mnist
Done exporting!
Sekarang mari kita lihat direktori ekspor.
$ ls /tmp/mnist
1
Seperti disebutkan di atas, sub-direktori akan dibuat untuk mengekspor setiap versi model. FLAGS.model_version
memiliki nilai default 1, oleh karena itu sesuai sub-direktori 1
dibuat.
$ ls /tmp/mnist/1
saved_model.pb variables
Setiap sub-direktori versi berisi file-file berikut:
saved_model.pb
adalah tensorflow serial :: SavedModel. Ini mencakup satu atau lebih definisi grafik model, serta metadata model seperti tanda tangan.variables
adalah file yang menyimpan variabel serial dari grafik.
Dengan itu, model TensorFlow Anda diekspor dan siap dimuat!
Muat model yang diekspor dengan TensorFlow ModelServer standar
Gunakan gambar penyajian Docker untuk memuat model penyajian dengan mudah:
docker run -p 8500:8500 \
--mount type=bind,source=/tmp/mnist,target=/models/mnist \
-e MODEL_NAME=mnist -t tensorflow/serving &
Uji servernya
Kita bisa menggunakan yang disediakan mnist_client utilitas untuk menguji server. Klien mengunduh data pengujian MNIST, mengirimkannya sebagai permintaan ke server, dan menghitung tingkat kesalahan inferensi.
tools/run_in_docker.sh python tensorflow_serving/example/mnist_client.py \
--num_tests=1000 --server=127.0.0.1:8500
Ini akan menghasilkan sesuatu seperti
...
Inference error rate: 11.13%
Kami mengharapkan akurasi sekitar 90% untuk model Softmax terlatih dan kami mendapatkan tingkat kesalahan inferensi 11% untuk 1.000 gambar uji pertama. Ini mengkonfirmasi bahwa server memuat dan menjalankan model yang dilatih dengan sukses!