6

Trong bài đăng cuối cùng của tôi, tôi đã khảo sát các tùy chọn ngày càng tăng để triển khai các mô hình ML của bạn vào sản xuất. Trong bài đăng này, chúng tôi sẽ tạo một bản demo để xem việc phát triển dịch vụ của riêng bạn bằng thư viện Flask của Python đơn giản đến mức nào.

Có một số trường hợp bạn không thể sử dụng dịch vụ đám mây để lưu trữ mô hình của mình và sẽ được yêu cầu cung cấp dịch vụ suy luận của riêng bạn. Trong nhiều doanh nghiệp lớn, giải pháp tại chỗ là bắt buộc. Việc phê duyệt để mua các giải pháp của bên thứ ba cũng có thể kéo dài và phức tạp. Vì vậy, phát triển dịch vụ nhỏ của riêng bạn có thể là giải pháp tốt nhất.

Bản demo mà chúng tôi sẽ phát triển ở đây sẽ là một minh chứng bằng chứng về cách tải và lưu trữ mô hình của bạn nhưng sẽ không đi vào các vấn đề xung quanh bảo mật, xác thực hoặc cân bằng tải.

Phát triển mô hình

Giai đoạn đầu tiên là phát triển một mô hình. Bạn có thể đã có một mô hình mà bạn đã được đào tạo đã sẵn sàng để triển khai. Có một số cách để chuẩn bị mô hình của bạn để triển khai bằng cách sử dụng TensorFlow. Bạn có thể sử dụng  SavedModelBuilder chức năng mà trước đây chúng tôi đã sử dụng để xuất AI trò chơi của chúng tôi để sử dụng với Go . Hoặc, bạn có thể sử dụng chức năng "đóng băng biểu đồ" của TensorFlow để xuất toàn bộ biểu đồ dưới dạng Bộ đệm giao thức để sử dụng cho việc phục vụ.

Đối với bản demo của chúng tôi, chúng tôi sẽ phát triển một AI siêu mạnh có thể xác định sự khác biệt giữa chó poodle, pugs và chó Weiner (dachshunds). Đối với công nghệ tiên tiến này, chúng tôi có thể sử dụng phiên bản đào tạo lại của các mô hình Inception hoặc MobileNet của Google.

Bây giờ, giống như ứng dụng "không phải hotdog" nổi tiếng ở Thung lũng Silicon, thuật toán nhận dạng chó thực tế của chúng tôi chắc chắn sẽ rất hữu ích cho loài người. Vì vậy, một khi chúng tôi đã đào tạo mô hình của mình để xác định những giống chó chủ chốt này, chúng tôi sẽ muốn tạo ra một dịch vụ để cung cấp cho thế giới.

Đào tạo lại các mô hình Inception hoặc MobileNet thực sự rất đơn giản. Bạn có thể huấn luyện nó để phân loại các loại đối tượng hoàn toàn mới chỉ bằng cách cung cấp một loạt hình ảnh trong thư mục con có nhãn. Sau đó, nó sẽ lấy những hình ảnh đó, phân loại chúng với nhãn (tức là tên thư mục) và xuất ra một mô hình mới được đào tạo ở  .pb định dạng.

Mẹo : Nếu bạn đang tìm kiếm một giới thiệu tuyệt vời và hướng dẫn về làm thế nào để đào tạo lại các mô hình này, bạn có thể làm việc thông qua này codelab được cung cấp bởi Google.

Vì lý do hiệu suất, chúng tôi chọn mô hình MobileNet. Nó được tối ưu hóa để sử dụng trên các thiết bị di động. Mô hình này hy sinh một số độ chính xác cho tốc độ nhưng hoạt động khá tốt cho trường hợp sử dụng của chúng tôi.

Sau đó, chúng tôi có thể điều chỉnh một trong các tập lệnh nhãn của Google có chứa các hàm tiện ích hữu ích để tải biểu đồ và chuyển đổi hình ảnh thành các thang đo để sử dụng với TensorFlow. Kịch bản phù hợp này sẽ trở thành cơ sở cho dịch vụ suy luận của chúng tôi.

Xây dựng dịch vụ

Khi chúng tôi đã đào tạo lại mô hình của mình và xuất nó ra đĩa, chúng tôi có thể lưu trữ mô hình dưới dạng dịch vụ. Chúng tôi sẽ tải mô hình từ đĩa bằng một hàm đơn giản lấy định nghĩa biểu đồ trực tiếp từ tệp và sử dụng mô hình đó để tạo biểu đồ. TensorFlow thực hiện hầu hết điều này cho chúng ta:

def load_graph(model_file):
 graph = tf.Graph()
 graph_def = tf.GraphDef()
 with open(model_file, "rb") as f:
   graph_def.ParseFromString(f.read())
 with graph.as_default():
   tf.import_graph_def(graph_def)

Sử dụng Flask, phần lớn các công việc nặng nề xung quanh việc cấu hình máy chủ và xử lý các yêu cầu được thực hiện cho chúng tôi. Sau khi chúng tôi tạo một đối tượng ứng dụng Flask:

app = Flask(__name__)

Sau đó, chúng tôi có thể dễ dàng tạo các tuyến đường nơi dịch vụ phân loại của chúng tôi sẽ sống. Hãy tạo một tuyến đường mặc định cho classify()chức năng của chúng tôi sẽ cho phép chúng tôi chuyển một hình ảnh đến điểm cuối để nhận dạng.

@app.route('/')
def classify():

Sử dụng cú pháp trang trí để xác định tuyến đường, nó sẽ cấu hình dịch vụ để classify() chức năng của chúng tôi  sẽ được gọi mỗi khi ai đó truy cập vào thư mục gốc của địa chỉ dịch vụ của chúng tôi. Chúng tôi nói rằng chúng tôi muốn người dùng có thể chỉ định một tệp được xác định để chúng tôi sẽ lưu trữ dưới dạng tham số từ yêu cầu:

file_name = request.args['file']

Trong một ứng dụng thực tế, có lẽ chúng tôi sẽ điền thông tin này từ tệp đính kèm hoặc URL. Ví dụ của chúng tôi, chúng tôi chỉ cần cho phép người dùng chỉ định đường dẫn đến tệp mà họ muốn được xác định.

Sau đó chúng ta có thể đọc tệp hình ảnh và biến nó thành một tenxơ được sử dụng làm đầu vào cho biểu đồ mà chúng ta đã tải trước đó. Tập lệnh cơ sở bao gồm một số hàm hữu ích bao gồm read_tensor_from_image_file()tập tin hình ảnh và biến nó thành một tenxơ để sử dụng làm đầu vào bằng cách sử dụng biểu đồ TensorFlow tùy chỉnh nhỏ.

Chạy suy luận trên biểu đồ của chúng tôi với hình ảnh này một lần nữa khá đơn giản:

       results = sess.run(output_operation.outputs[0],
                     {input_operation.outputs[0]: t})

Trong dòng này, biến t đại diện cho tenxơ hình ảnh được tạo bởi read_tensor_from_image_file()hàm. TensorFlow sau đó sẽ lấy hình ảnh đó và chạy mô hình được đào tạo lại mới để tạo dự đoán.

Những dự đoán này được đưa ra dưới dạng một loạt các xác suất chỉ ra loại nào trong số các lớp (poodle, pug hoặc wiener dog) là có khả năng nhất. Vì đây chỉ là một dịch vụ dự đoán, nên nó sẽ chỉ trả về một đại diện JSON của các mảng.

Trong kịch bản của chúng tôi, chúng tôi có thể bắt đầu dịch vụ của mình với:

app.run(debug=True, port=8000)

Sau đó, nếu chúng ta muốn khởi chạy tập lệnh từ dòng lệnh, tất cả những gì chúng ta phải làm là chạy  python app.py và nó sẽ khởi tạo và bắt đầu chạy trên cổng 8000 .

Sử dụng dịch vụ

Bây giờ chúng ta có thể sử dụng dịch vụ này bằng cách truy cập vào trình duyệt web hoặc thường thực hiện bất kỳ cuộc gọi REST nào trên cổng đó. Để kiểm tra dễ dàng, chúng tôi có thể truy cập nó bằng cách sử dụng curl:

curl localhost:8000?file=path/to/poodle.jpg

Vì vậy, nếu chúng tôi cung cấp cho nó hình ảnh sau đây về poodle tiêu chuẩn của tôi, Orion, hãy xem nó nói gì:

Đầu ra là:

[
  [
    "poodle", 
    "pug", 
    "dachshund"
  ], 
  [
    0.9994891881942749, 
    1.1696176443365403e-05, 
    0.0004991634050384164
  ]
]

Sự thành công! Mô hình TensorFlow của chúng tôi chắc chắn 99,9% rằng anh chàng này là một con chó xù!

Mã và mô hình cho bài đăng này có sẵn trên GitHub trong repo tenorflask . Bạn có thể tải xuống và triển khai dịch vụ nhận dạng chó siêu mạnh của riêng bạn! 

Bước tiếp theo

Rõ ràng có rất nhiều phần mở rộng cần thiết để biến điều này thành một dịch vụ sản xuất trong thế giới thực. Tuy nhiên, nó minh họa rằng các mô hình lưu trữ như các dịch vụ tương đối đơn giản và có thể được thực hiện nhanh chóng mà không cần viết nhiều mã soạn sẵn.

Có rất nhiều thành phần khác sẽ biến dịch vụ này thành dịch vụ sẵn sàng sản xuất và lần tới, chúng tôi sẽ xem xét cách thiết lập đường ống dữ liệu để tự động đào tạo lại, kiểm soát phiên bản dữ liệu đào tạo và hơn thế nữa.

|