Tutorial ini menunjukkan cara menggunakan komponen TensorFlow Serving untuk mengekspor model TensorFlow terlatih dan menggunakan tensorflow_model_server standar untuk menyajikannya. Jika Anda sudah familiar dengan TensorFlow Serving, dan ingin mengetahui lebih lanjut tentang cara kerja internal server, lihat tutorial lanjutan TensorFlow Serving .
Tutorial ini menggunakan model Regresi Softmax sederhana yang mengklasifikasikan angka tulisan tangan. Hal ini sangat mirip dengan yang diperkenalkan dalam tutorial TensorFlow tentang klasifikasi gambar menggunakan dataset Fashion MNIST .
Kode untuk tutorial ini terdiri dari dua bagian:
File Python, mnist_saved_model.py , yang melatih dan mengekspor model.
Biner ModelServer yang dapat diinstal menggunakan Apt, atau dikompilasi dari file C++ ( main.cc ). TensorFlow Serving ModelServer menemukan model baru yang diekspor dan menjalankan layanan gRPC untuk menyajikannya.
Sebelum memulai, instal dulu Docker .
Latih dan ekspor model TensorFlow
Untuk fase pelatihan, grafik TensorFlow diluncurkan dalam sess
sesi TensorFlow, dengan tensor masukan (gambar) sebagai x
dan tensor keluaran (skor Softmax) sebagai y
.
Kemudian kita menggunakan modul SavedModelBuilder TensorFlow untuk mengekspor model. SavedModelBuilder
menyimpan "snapshot" model yang dilatih ke penyimpanan yang andal sehingga nanti dapat dimuat untuk inferensi.
Untuk detail tentang format SavedModel, silakan lihat dokumentasi di SavedModel README.md .
Dari mnist_saved_model.py , berikut ini cuplikan kode singkat untuk mengilustrasikan proses umum penyimpanan 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 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 bilangan bulat yang lebih besar saat mengekspor versi terbaru dari model yang sama. Setiap versi akan diekspor ke subdirektori berbeda di bawah jalur yang diberikan.
Anda dapat menambahkan grafik meta dan variabel ke pembuat menggunakan SavedModelBuilder.add_meta_graph_and_variables()
dengan argumen berikut:
sess
adalah sesi TensorFlow yang menampung model terlatih yang Anda ekspor.tags
adalah kumpulan tag yang dapat digunakan untuk menyimpan grafik meta. Dalam hal ini, karena kami bermaksud menggunakan grafik dalam penayangan, kami menggunakan tagserve
dari konstanta tag SavedModel yang telah ditentukan sebelumnya. Untuk detail selengkapnya, lihat tag_constants.py dan dokumentasi TensorFlow API terkait .signature_def_map
menentukan peta kunci yang disediakan pengguna untuk tanda tangan ke tensorflow::SignatureDef untuk ditambahkan ke grafik meta. Tanda tangan menentukan jenis model yang diekspor, dan tensor input/output yang akan diikat saat menjalankan inferensi.Kunci tanda tangan khusus
serving_default
menentukan tanda tangan penyajian default. Kunci def tanda tangan penyajian default, bersama dengan konstanta lain yang terkait dengan tanda tangan, didefinisikan sebagai bagian dari konstanta tanda tangan SavedModel. Untuk detail selengkapnya, lihat signature_constants.py dan dokumentasi TensorFlow API terkait .Selanjutnya, untuk membantu membuat def tanda tangan dengan mudah, SavedModel API menyediakan utils def tanda tangan . Secara khusus, dalam file mnist_saved_model.py asli, kami menggunakan
signature_def_utils.build_signature_def()
untuk membuatpredict_signature
danclassification_signature
.Sebagai contoh bagaimana
predict_signature
didefinisikan, util mengambil argumen berikut:inputs={'images': tensor_info_x}
menentukan info tensor masukan.outputs={'scores': tensor_info_y}
menentukan info tensor skor.method_name
adalah metode yang digunakan untuk inferensi. Untuk permintaan Prediksi, harus disetel ketensorflow/serving/predict
. Untuk nama metode lainnya, lihat signature_constants.py dan dokumentasi TensorFlow API terkait .
Perhatikan bahwa tensor_info_x
dan tensor_info_y
memiliki struktur buffer protokol tensorflow::TensorInfo
yang ditentukan di sini . Untuk membuat info tensor dengan mudah, TensorFlow SavedModel API juga menyediakan utils.py , dengan dokumentasi TensorFlow API terkait .
Perhatikan juga bahwa images
dan scores
adalah nama alias tensor. Itu bisa berupa string unik apa pun yang Anda inginkan, dan itu akan menjadi nama logis dari tensor x
dan y
yang Anda rujuk untuk pengikatan tensor saat mengirimkan permintaan prediksi nanti.
Misalnya, jika x
merujuk ke tensor dengan nama 'long_tensor_name_foo' dan y
merujuk ke tensor dengan nama 'generated_tensor_name_bar', builder
akan menyimpan nama logis tensor ke pemetaan nama asli ('images' -> 'long_tensor_name_foo') dan ('scores ' -> 'generated_tensor_name_bar'). Hal ini memungkinkan pengguna untuk merujuk ke tensor ini dengan nama logisnya saat menjalankan inferensi.
Ayo jalankan!
Pertama, jika Anda belum melakukannya, kloning 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 keluaran seperti ini:
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, subdirektori akan dibuat untuk mengekspor setiap versi model. FLAGS.model_version
memiliki nilai default 1, oleh karena itu subdirektori 1
yang sesuai dibuat.
$ ls /tmp/mnist/1
saved_model.pb variables
Setiap subdirektori versi berisi file berikut:
saved_model.pb
adalah tensorflow berseri::SavedModel. Ini mencakup satu atau lebih definisi grafik model, serta metadata model seperti tanda tangan.variables
adalah file yang menyimpan variabel serial grafik.
Dengan itu, model TensorFlow Anda telah diekspor dan siap dimuat!
Muat model yang diekspor dengan TensorFlow ModelServer standar
Gunakan gambar penyajian Docker untuk memuat model dengan mudah untuk penyajian:
docker run -p 8500:8500 \
--mount type=bind,source=/tmp/mnist,target=/models/mnist \
-e MODEL_NAME=mnist -t tensorflow/serving &
Uji servernya
Kita dapat menggunakan utilitas mnist_client yang disediakan 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 yang dilatih dan kami mendapatkan tingkat kesalahan inferensi 11% untuk 1000 gambar pengujian pertama. Ini mengonfirmasi bahwa server berhasil memuat dan menjalankan model yang dilatih!