Phục vụ mô hình: Xử lý luồng so với RPC / REST Với Java, gRPC, Apache ...


Hồ Trúc Quân
1 năm trước
Hữu ích 3 Chia sẻ Viết bình luận 0
Đã xem 8622

Các mô hình Machine Learning / Deep Learning có thể được sử dụng theo nhiều cách khác nhau để thực hiện dự đoán. Cách ưa thích của tôi là triển khai một mô hình phân tích trực tiếp vào một ứng dụng xử lý luồng (như  Kafka Streams hoặc KSQL ). Ví dụ, bạn có thể sử dụng  TensorFlow cho Java API . Điều này cho phép độ trễ tốt hơn và tính độc lập của các dịch vụ bên ngoài. Một số ví dụ có thể được tìm thấy trong dự án GitHub của tôi:  Suy luận mô hình trong Kafka Streams microservice bằng cách sử dụng TensorFlow, H2O.ai, Deeplearning4j (DL4J) .

Tuy nhiên, việc triển khai trực tiếp các mô hình không phải lúc nào cũng là một cách tiếp cận khả thi . Đôi khi nó có ý nghĩa hoặc là cần thiết để triển khai một mô hình trong một cơ sở hạ tầng phục vụ khác như Mô hình TensorFlow Phục vụ cho các mô hình TensorFlow. Mô hình suy luận sau đó được thực hiện thông qua giao tiếp RPC / Yêu cầu phản hồi. Lý do tổ chức hoặc kỹ thuật có thể buộc phương pháp này. Hoặc bạn có thể muốn tận dụng các tính năng tích hợp để quản lý và phiên bản các mô hình khác nhau trong máy chủ mô hình.

Vì vậy, bạn kết hợp xử lý luồng với mô hình RPC / Yêu cầu phản hồi. Kiến trúc trông như sau:

Ưu điểm của một mô hình bên ngoài phục vụ cơ sở hạ tầng như Dịch vụ TensorFlow:

  • Tích hợp đơn giản với các công nghệ hiện có và quy trình tổ chức.
  • Dễ hiểu hơn nếu bạn đến từ thế giới không phát trực tuyến.
  • Di chuyển sau này để phát trực tuyến thực sự cũng có thể.
  • Quản lý mô hình tích hợp cho các mô hình và phiên bản khác nhau.

Nhược điểm:

  • Độ trễ tệ hơn như cuộc gọi từ xa thay vì suy luận cục bộ.
  • Không có suy luận ngoại tuyến (thiết bị, xử lý cạnh, v.v.).
  • Kết hợp tính khả dụng, khả năng mở rộng và độ trễ / thông lượng của ứng dụng Luồng Kafka của bạn với SLAs của giao diện RPC.
  • Tác dụng phụ (ví dụ trong trường hợp thất bại) không được xử lý bởi Kafka (ví dụ: Chính xác một lần).

Kết hợp xử lý luồng và máy chủ mô hình sử dụng Apache Kafka, luồng Kafka và phục vụ TensorFlow

Tôi đã tạo dự án GitHub Java " TensorFlow Serving + gRPC + Java + Kafka Streams " để giới thiệu cách thực hiện  suy luận mô hình với Apache Kafka, Kafka Stream và mô hình TensorFlow được triển khai bằng cách sử dụng  TensorFlow Serving . Các khái niệm này rất giống nhau đối với các khung ML và Nhà cung cấp đám mây khác, ví dụ: bạn cũng có thể sử dụng  Google Cloud ML Engine  cho TensorFlow (sử dụng Dịch vụ TensorFlow dưới mui xe) hoặc máy chủ mô hình Apache MXNet và  AWS .

Hầu hết các máy chủ ML để phục vụ mô hình cũng có thể mở rộng để phục vụ các loại mô hình và dữ liệu khác, ví dụ: bạn cũng có thể triển khai các mô hình không phải là TensorFlow sang Dịch vụ TensorFlow. Nhiều máy chủ ML có sẵn dưới dạng dịch vụ đám mây và để triển khai cục bộ.

Phục vụ kéo dài

Chúng ta hãy thảo luận về TensorFlow Phục vụ nhanh chóng. Nó có thể được sử dụng để lưu trữ các mô hình phân tích được đào tạo của bạn. Giống như với hầu hết các máy chủ mô hình, bạn có thể suy luận thông qua mô hình phản hồi yêu cầu. gRPC và REST / HTTP là hai công nghệ và khái niệm phổ biến được sử dụng.

Bài đăng trên blog " Cách triển khai các mô hình TensorFlow vào sản xuất bằng cách sử dụng TF Phục vụ " là một lời giải thích tuyệt vời về cách xuất khẩu và triển khai các mô hình TensorFlow được đào tạo vào cơ sở hạ tầng phục vụ TensorFlow. Bạn có thể triển khai cơ sở hạ tầng của riêng mình ở bất cứ đâu hoặc tận dụng dịch vụ đám mây như Google Cloud ML Engine. Một  SavingModel  là định dạng được đề xuất của TensorFlow để lưu các mô hình và đó là định dạng bắt buộc để triển khai các mô hình TensorFlow được đào tạo bằng cách sử dụng Dịch vụ TensorFlow hoặc triển khai trên Google Cloud ML Engine.

Kiến trúc cốt lõi được mô tả chi tiết trong  tổng quan kiến ​​trúc của TensorFlow Phục vụ :

Kiến trúc này cho phép triển khai và quản lý các mô hình và phiên bản khác nhau của các mô hình này bao gồm các tính năng bổ sung như thử nghiệm A / B. Trong bản demo sau, chúng tôi chỉ triển khai một mô hình TensorFlow duy nhất cho Nhận dạng hình ảnh (dựa trên mạng thần kinh Inception nổi tiếng).

Bản trình diễn: Trộn xử lý luồng với RPC: Phục vụ kéo dài + Luồng Kafka

Tuyên bố miễn trừ trách nhiệm: Dưới đây là phiên bản rút gọn của các bước cần tuân theo. Để biết ví dụ đầy đủ, bao gồm mã nguồn và tập lệnh, vui lòng truy cập vào dự án GitHub của tôi, "Dịch vụ TensorFlow + gRPC + Java + Kafka ."

Những việc cần làm

  1. Cài đặt và khởi động Công cụ phục vụ ML.
  2. Triển khai một mô hình TensorFlow dựng sẵn.
  3. Tạo một cụm Kafka.
  4. Triển khai ứng dụng Kafka Streams.
  5. Triển khai ứng dụng Kafka Streams (ví dụ: cục bộ trên máy tính xách tay hoặc cụm Kubernetes).
  6. Tạo dữ liệu phát trực tuyến để kiểm tra sự kết hợp của Luồng Kafka và Phục vụ hàng chục.

Bước 1: Tạo Mô hình TensorFlow và xuất nó sang Định dạng 'SavingModel'

Tôi chỉ đơn giản là thêm một mô hình Nhận dạng hình ảnh được đào tạo sẵn, được xây dựng với TensorFlow. Bạn chỉ cần xuất một mô hình bằng API của TensorFlow và sau đó sử dụng thư mục đã xuất. TensorFlow sử dụng Protobuf để lưu trữ biểu đồ mô hình và thêm các biến cho trọng số của mạng thần kinh.

Google ML Engine cho thấy cách tạo một mô hình TensorFlow đơn giản để dự đoán điều tra dân số bằng cách sử dụng " Hướng dẫn bắt đầu ML Engine ". Trong bước thứ hai, bạn có thể xây dựng một ví dụ nâng cao hơn để nhận dạng hình ảnh bằng cách sử dụng Transfer Learning, theo hướng dẫn " Phân loại hình ảnh bằng cách sử dụng bộ dữ liệu Hoa ".

Bạn cũng có thể kết hợp các dịch vụ đám mây và dịch vụ cục bộ, ví dụ: xây dựng mô hình phân tích với Google ML Engine và sau đó triển khai nó tại địa phương bằng cách sử dụng Dịch vụ TensorFlow như chúng tôi làm.

Bước 2: Cài đặt và khởi động Máy chủ phục vụ TensorFlow + Mô hình triển khai

Tùy chọn khác nhau có sẵn. Cài đặt TensforFlow Phục vụ trên máy Mac vẫn còn là một vấn đề khó khăn vào giữa năm 2018.  apt-get hoạt động dễ dàng hơn nhiều trên các hệ điều hành Linux. Thật không may, không có gì giống như lệnh 'brew' hoặc tệp zip đơn giản mà bạn có thể sử dụng trên Mac. Lựa chọn thay thế:

  • Bạn có thể  xây dựng dự án và biên dịch mọi thứ bằng cách sử dụng hệ thống xây dựng Bazel - nghĩa đen sẽ mất mãi mãi (trên máy tính xách tay của tôi), tức là nhiều giờ.
  • Cài đặt và chạy Dịch vụ TensorFlow qua bộ  chứa Docker . Điều này cũng đòi hỏi phải xây dựng dự án. Ngoài ra, tài liệu không phải là rất tốt và lỗi thời.
  • Tùy chọn ưa thích cho người mới bắt đầu => Sử dụng bộ chứa Docker dựng sẵn với Dịch vụ TensorFlow . Tôi đã sử dụng một  ví dụ từ Thamme Gowda . Kudos cho anh ta xây dựng một dự án không chỉ chứa hình ảnh Docker phục vụ TensorFlow, mà còn cho thấy một ví dụ về cách thực hiện giao tiếp gRPC giữa một ứng dụng Java và Dịch vụ TensorFlow.

Nếu bạn muốn mô hình của riêng mình, hãy đọc hướng dẫn " Triển khai mô hình TensorFlow để phục vụ TensorFlow ." Hoặc để sử dụng dịch vụ đám mây, ví dụ: hãy xem " Bắt đầu với Google ML Engine ".

Bước 3: Tạo chủ đề Kafka một cụm và Kafka

Tạo môi trường Kafka cục bộ (nhà môi giới Apache Kafka + Zookeeper). Cách dễ nhất là Confluent CLI nguồn mở   - cũng là một phần của Nền tảng doanh nghiệp hợp lưu và nguồn mở Confluent. Chỉ cần gõ  confluent start kafka. 

Bạn cũng có thể tạo một cụm bằng cách sử dụng Kafka làm Dịch vụ. Tùy chọn tốt nhất là  Confluent Cloud - Apache Kafka là một Dịch vụ . Bạn có thể chọn giữa Confluent Cloud Professional để "chơi xung quanh" hoặc Confluent Cloud Enterprise trên AWS, GCP hoặc Azure để triển khai nhiệm vụ quan trọng bao gồm 99,95% SLA và thông lượng rất lớn lên tới 2 GB / giây. Tùy chọn thứ ba là kết nối với cụm Kafka hiện tại của bạn tại cơ sở hoặc trên đám mây (lưu ý rằng bạn cần thay đổi URL và cổng của nhà môi giới trong mã Java Kafka Streams trước khi xây dựng dự án).

Tiếp theo, tạo hai chủ đề Kafka cho ví dụ này ('ImageInputTopic' cho URL tới hình ảnh và 'ImageOutputTopic' cho kết quả dự đoán):

Bước 4: Xây dựng và triển khai ứng dụng Kafka Streams + Gửi tin nhắn thử nghiệm

Dịch vụ siêu nhỏ Kafka Streams (tức là lớp Java) "Kafka Streams TensorFlow Phục vụ ví dụ gRPC"  là máy khách Java của Kafka Streams. Microservice sử dụng gRPC và Protobuf để liên lạc đáp ứng yêu cầu với máy chủ phục vụ TensorFlow để thực hiện suy luận mô hình để dự đoán nội dung của hình ảnh. Lưu ý rằng máy khách Java không cần bất kỳ API TensorFlow nào, mà chỉ cần các giao diện gRPC.

Ví dụ này thực thi một phương thức chính của Java, tức là nó bắt đầu một quy trình Java cục bộ chạy microservice Kafka Streams. Nó liên tục chờ đợi các sự kiện mới đến 'ImageInputTopic' để thực hiện suy luận mô hình (thông qua cuộc gọi gRCP tới Dịch vụ TensorFlow) và sau đó gửi dự đoán đến 'ImageOutputTopic' - tất cả chỉ trong thời gian thực trong một phần nghìn giây.

Theo cách tương tự, bạn có thể triển khai dịch vụ siêu nhỏ Kafka Streams này ở bất cứ đâu - bao gồm Kubernetes (ví dụ: cụm OpenShift tại cơ sở hoặc Google Kubernetes Engine), Mesosphere, Amazon ECS hoặc thậm chí trong ứng dụng Java EE - và tự động mở rộng quy mô.

Bây giờ gửi tin nhắn, ví dụ với kafkacat và sử dụng kafka-console- Consumer để sử dụng các dự đoán.

Một lần nữa, nếu bạn muốn xem mã nguồn và tập lệnh, thì vui lòng truy cập vào dự án GitHub của tôi " TensorFlow Serving + gRPC + Java + Kafka Streams ."

Hữu ích 3 Chia sẻ Viết bình luận 0
Đã xem 8622