Phục vụ mô hình TensorFlow

Hướng dẫn này chỉ cho bạn cách sử dụng các thành phần Phục vụ 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 Dịch vụ TensorFlow và muốn biết thêm về cách hoạt động bên trong máy chủ, hãy xem hướng dẫn nâng cao về Dịch vụ TensorFlow .

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 cái được giới thiệu trong hướng dẫn TensorFlow về phân loại hình ảnh bằng bộ dữ liệu Fashion MNIST .

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

  • Một tệp Python, mnist_saved_model.py , dùng để huấn luyện và xuất mô hình.

  • Một tệp nhị phân ModelServer có thể được cài đặt bằng Apt hoặc được biên dịch từ tệp C++ ( main.cc ). Máy chủ mô hình phục vụ TensorFlow phát hiện các mô hình được xuất mới và chạy dịch vụ gRPC để phục vụ chúng.

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

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

Đối với giai đoạn huấn luyện, biểu đồ TensorFlow được khởi chạy trong phiên TensorFlow sess , với tensor đầu vào (hình ảnh) là x và tensor đầu ra (điểm Softmax) là y .

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

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

Từ mnist_saved_model.py , sau đây là đoạn mã ngắn để minh họa quy trình chung để lưu 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__ nhận đối số sau:

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

SavedModelBuilder sẽ tạo thư mục nếu nó chưa tồn tại. Trong ví dụ này, chúng tôi ghép đối số dòng lệnh và FLAGS.model_version để lấy thư mục xuất. FLAGS.model_version chỉ định phiên bản của mô hình. Bạn nên chỉ định 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ẫu. Mỗi phiên bản sẽ được xuất sang một thư mục con khác nhau theo đường dẫn nhất định.

Bạn có thể thêm biểu đồ meta và các biến vào trình tạo bằng cách sử dụng SavedModelBuilder.add_meta_graph_and_variables() với các đối số sau:

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

  • tags là tập hợp các thẻ để lưu biểu đồ meta. Trong trường hợp này, vì dự định sử dụng biểu đồ để phân phát nên chúng tôi sử dụng thẻ serve từ các hằng số thẻ SavingModel được xác định trước. Để biết thêm chi tiết, hãy xem tag_constants.pytài liệu API TensorFlow có liên quan .

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

    Khóa chữ ký đặc biệt serving_default chỉ định chữ ký phục vụ mặc định. Khóa def chữ ký cung cấp mặc định, cùng với các hằng số khác liên quan đến chữ ký, được xác định như một phần của hằng số chữ ký SavingModel. Để biết thêm chi tiết, hãy xem signature_constants.pytài liệu API TensorFlow có liên quan .

    Hơn nữa, để giúp xây dựng phần xác định chữ ký một cách dễ dàng, API SavingModel cung cấp các tiện ích xác định chữ ký .. Cụ thể, trong tệp mnist_saved_model.py ban đầu, chúng tôi sử dụng signature_def_utils.build_signature_def() để xây dựng predict_signatureclassification_signature .

    Để làm ví dụ về cách xác định predict_signature , util nhận các đối số sau:

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

    • outputs={'scores': tensor_info_y} chỉ định thông tin tensor điểm số.

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

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

Ngoài ra, hãy lưu ý rằng imagesscores là tên bí danh tensor. Chúng có thể là bất kỳ chuỗi duy nhất nào bạn muốn và chúng sẽ trở thành tên logic của tensor xy mà bạn tham chiếu để liên kết tensor khi gửi yêu cầu dự đoán sau này.

Ví dụ: nếu x đề cập đến tensor có tên 'long_tensor_name_foo' và y đề cập đến tensor có tên 'generated_tensor_name_bar', thì builder sẽ lưu trữ tên logic tensor để ánh xạ tên thật ('images' -> 'long_tensor_name_foo') và ('scores ' -> 'generated_tensor_name_bar'). Điều này cho phép người dùng tham chiếu đến các tensor này bằng 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 huấn luyện 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 kết quả đầu ra trông giống như:

Training model...

...

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

Bây giờ chúng ta hãy xem thư mục xuất.

$ 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 đó thư mục con 1 tương ứng sẽ được tạo.

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

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

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

  • variables là các tệp chứa các biến được tuần tự hóa của biểu đồ.

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 Máy chủ mô hình TensorFlow tiêu chuẩn

Sử dụng hình ảnh phục vụ 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 ta có thể sử dụng tiện ích mnist_client được cung cấp để kiểm tra máy chủ. Máy khách tải xuống dữ liệu kiểm tra MNIST, gửi chúng dưới dạng yêu cầu đến 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!