Melayani Model TensorFlow

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 menggunakan serve 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 membangun predict_signature dan classification_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 untuk tensorflow/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!