Phục vụ Mô hình TensorFlow

Sử dụng bộ sưu tập để sắp xếp ngăn nắp các trang Lưu và phân loại nội dung dựa trên lựa chọn ưu tiên của bạn.

Hướng dẫn này chỉ cho bạn cách sử dụng các thành phần Cung cấp TensorFlow để xuất mô hình TensorFlow được đào tạo và sử dụng tensorflow_model_server tiêu chuẩn để phục vụ nó. Nếu bạn đã quen thuộc với TensorFlow Phục vụ, và bạn muốn biết thêm về cách thức internals máy chủ làm việc, vui lòng xem TensorFlow Phục vụ hướng dẫn nâng cao .

Hướng dẫn này sử dụng mô hình Hồi quy Softmax đơn giản để phân loại các chữ số viết tay. Nó rất giống với một giới thiệu trong TensorFlow hướng dẫn về phân loại hình ảnh bằng cách sử dụng dữ liệu thời trang MNIST .

Mã cho hướng dẫn này bao gồm hai phần:

  • Một tập tin Python, mnist_saved_model.py , rằng xe lửa và xuất khẩu mô hình.

  • Một ModelServer nhị phân có thể được cài đặt hoặc sử dụng Apt, hoặc thu thập từ C ++ file ( main.cc ). Các TensorFlow Phục vụ phát hiện ra ModelServer mới xuất mô hình và chạy một gRPC dịch vụ để phục vụ họ.

Trước khi bắt đầu, đầu tiên cài đặt Docker .

Đào tạo và xuất mô hình TensorFlow

Đối với giai đoạn đào tạo, đồ thị TensorFlow được đưa ra trong phiên TensorFlow sess , với tensor đầu vào (hình ảnh) như x và đầu ra tensor (điểm softmax) như y .

Sau đó, chúng tôi sử dụng TensorFlow của mô-đun SavedModelBuilder xuất khẩu mô hình. SavedModelBuilder tiết kiệm một "bản chụp" của mô hình đào tạo để lưu trữ đáng tin cậy để nó có thể được nạp sau cho suy luận.

Để biết chi tiết về định dạng SavedModel, vui lòng xem tài liệu tại SavedModel README.md .

Từ mnist_saved_model.py , sau đây là một đoạn mã ngắn để minh họa cho quá trình chung của tiết kiệm một mô hình vào đĩa.

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__ mất đối số sau đây:

  • export_path là đường dẫn của thư mục xuất khẩu.

SavedModelBuilder sẽ tạo thư mục nếu nó không tồn tại. Trong ví dụ này, chúng ta nối các đối số dòng lệnh và FLAGS.model_version để có được những thư mục xuất khẩu. FLAGS.model_version quy định các phiên bản của mô hình. Bạn nên chỉ định một giá trị số nguyên lớn hơn khi xuất phiên bản mới hơn của cùng một mô hình. Mỗi phiên bản sẽ được xuất sang một thư mục con khác nhau theo đường dẫn đã cho.

Bạn có thể thêm biểu đồ meta và biến vào xây dựng sử dụng SavedModelBuilder.add_meta_graph_and_variables() với các đối số sau đây:

  • sess là phiên TensorFlow chứa mô hình đào tạo bạn đang xuất.

  • tags là tập hợp của các thẻ đó để tiết kiệm đồ thị meta. Trong trường hợp này, vì chúng ta có ý định sử dụng các đồ thị trong phục vụ, chúng tôi sử dụng serve thẻ từ xác định trước thẻ hằng SavedModel. Để biết thêm chi tiết, xem tag_constants.pyTensorFlow liên quan tài liệu API .

  • signature_def_map quy định cụ thể bản đồ của chính người dùng cung cấp cho một chữ ký vào một tensorflow :: SignatureDef để thêm vào đồ thị meta. Chữ ký chỉ định loại mô hình đang được xuất và các yếu tố đầu vào / đầu ra để liên kết khi chạy suy luận.

    Chìa khóa chữ ký đặc biệt serving_default quy định cụ thể mặc định phục vụ chữ ký. Khóa định nghĩa chữ ký phục vụ mặc định, cùng với các hằng số khác liên quan đến chữ ký, được định nghĩa là một phần của hằng số chữ ký SavedModel. Để biết thêm chi tiết, xem signature_constants.pyTensorFlow liên quan tài liệu API .

    Hơn nữa, để giúp đỡ defs xây dựng chữ ký dễ dàng, API SavedModel cung cấp utils def chữ ký .. Cụ thể, trong bản gốc mnist_saved_model.py tập tin, chúng tôi sử dụng signature_def_utils.build_signature_def() để xây dựng predict_signatureclassification_signature .

    Như một ví dụ cho cách predict_signature được định nghĩa, các util có những lập luận như sau:

    • inputs={'images': tensor_info_x} xác định các thông tin tensor đầu vào.

    • outputs={'scores': tensor_info_y} xác định điểm tensor thông tin.

    • method_name là phương pháp được sử dụng để suy luận. Nếu có yêu cầu Dự đoán, nó nên được đặt thành tensorflow/serving/predict . Đối với tên phương pháp khác, xem signature_constants.pyTensorFlow liên quan tài liệu API .

Lưu ý rằng tensor_info_xtensor_info_y có cấu trúc của tensorflow::TensorInfo vùng đệm giao thức được định nghĩa ở đây . Để dễ dàng xây dựng tensor infos, API TensorFlow SavedModel cũng cung cấp utils.py , với tài liệu hướng dẫn TensorFlow API có liên quan .

Ngoài ra, lưu ý rằng imagesscores là tên bí danh tensor. Họ có thể là bất cứ điều gì dây độc đáo mà bạn muốn, và họ sẽ trở thành những cái tên logic của tensor xy rằng bạn tham khảo cho các ràng buộc khi gửi yêu cầu dự đoán sau tensor.

Ví dụ, nếu x đề cập đến tensor với tên 'long_tensor_name_foo' và y đề cập đến tensor với tên 'generated_tensor_name_bar', builder sẽ lưu trữ tensor tên logic để tên thật của bản đồ ( 'hình ảnh' -> 'long_tensor_name_foo') và ( 'điểm '->' create_tensor_name_bar '). Điều này cho phép người dùng tham chiếu đến các tensor này với tên logic của chúng khi chạy suy luận.

Hãy chạy nó!

Trước tiên, nếu bạn chưa làm như vậy, hãy sao chép kho lưu trữ này vào máy cục bộ của bạn:

git clone https://github.com/tensorflow/serving.git
cd serving

Xóa thư mục xuất nếu nó đã tồn tại:

rm -rf /tmp/mnist

Bây giờ hãy đào tạo mô hình:

tools/run_in_docker.sh python tensorflow_serving/example/mnist_saved_model.py \
  /tmp/mnist

Điều này sẽ dẫn đến đầu ra giống như sau:

Training model...

...

Done training!
Exporting trained model to models/mnist
Done exporting!

Bây giờ chúng ta hãy nhìn vào thư mục xuất khẩu.

$ ls /tmp/mnist
1

Như đã đề cập ở trên, một thư mục con sẽ được tạo để xuất từng phiên bản của mô hình. FLAGS.model_version có giá trị mặc định là 1, do đó các tiểu thư mục tương ứng 1 được tạo ra.

$ ls /tmp/mnist/1
saved_model.pb variables

Mỗi thư mục con phiên bản chứa các tệp sau:

  • saved_model.pb là tensorflow serialized :: SavedModel. Nó bao gồm một hoặc nhiều định nghĩa đồ thị của mô hình, cũng như siêu dữ liệu của mô hình như chữ ký.

  • variables là các tập tin mà giữ các biến tuần tự của đồ thị.

Cùng với đó, mô hình TensorFlow của bạn đã được xuất và sẵn sàng tải!

Tải mô hình đã xuất với TensorFlow ModelServer tiêu chuẩn

Sử dụng hình ảnh phân phát Docker để dễ dàng tải mô hình phục vụ:

docker run -p 8500:8500 \
--mount type=bind,source=/tmp/mnist,target=/models/mnist \
-e MODEL_NAME=mnist -t tensorflow/serving &

Kiểm tra máy chủ

Chúng tôi có thể sử dụng được cung cấp mnist_client tiện ích để kiểm tra máy chủ. Máy khách tải xuống dữ liệu thử nghiệm MNIST, gửi chúng dưới dạng yêu cầu tới máy chủ và tính toán tỷ lệ lỗi suy luận.

tools/run_in_docker.sh python tensorflow_serving/example/mnist_client.py \
  --num_tests=1000 --server=127.0.0.1:8500

Điều này sẽ xuất ra một cái gì đó như

    ...
    Inference error rate: 11.13%

Chúng tôi mong đợi độ chính xác khoảng 90% đối với mô hình Softmax được đào tạo và chúng tôi nhận được tỷ lệ lỗi suy luận là 11% cho 1000 hình ảnh thử nghiệm đầu tiên. Điều này xác nhận rằng máy chủ tải và chạy mô hình được đào tạo thành công!