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 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 melayani model tersebut.

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 tag serve 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 membuat predict_signature dan classification_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 ke tensorflow/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 disajikan:

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 terlatih!