Tạo một mô-đun khám phá các đường dẫn có thể phục vụ mới

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.

Tài liệu này giải thích cách mở rộng Cung cấp TensorFlow để giám sát các hệ thống lưu trữ khác nhau nhằm khám phá (các phiên bản) mô hình hoặc dữ liệu mới để cung cấp. Đặc biệt, nó bao gồm cách tạo và sử dụng mô-đun giám sát đường dẫn hệ thống lưu trữ để tìm sự xuất hiện của các đường dẫn con mới, trong đó mỗi đường dẫn con đại diện cho một phiên bản dịch vụ mới để tải. Đó là loại mô-đun được gọi là một Source<StoragePath> , bởi vì nó phát ra đối tượng thuộc loại StoragePath (typedefed để string ). Nó có thể được cấu tạo với một SourceAdapter tạo ra một thể phân phát Loader từ một con đường cho rằng phát hiện ra nguồn.

Đầu tiên, một lưu ý về tính tổng quát

Không bắt buộc phải sử dụng đường dẫn làm tay cầm cho dữ liệu có thể phục vụ; nó chỉ minh họa một cách để nhập các dịch vụ vào hệ thống. Ngay cả khi môi trường của bạn không đóng gói dữ liệu có thể phục vụ trong các đường dẫn, tài liệu này sẽ giúp bạn làm quen với các tóm tắt chính. Bạn có tùy chọn để tạo ra Source<T>SourceAdapter<T1, T2> module với nhiều loại phù hợp với môi trường của bạn (ví dụ RPC hoặc pub / sub thông điệp, hồ sơ cơ sở dữ liệu), hoặc chỉ đơn giản là tạo ra một khối Source<std::unique_ptr<Loader>> mà phát ra bộ tải thể phân phát trực tiếp.

Tất nhiên, bất kỳ loại dữ liệu nào mà nguồn của bạn phát ra (cho dù đó là đường dẫn POSIX, đường dẫn Google Cloud Storage hay trình xử lý RPC), cần phải có (các) mô-đun đi kèm có thể tải các dịch vụ dựa trên đó. Module như vậy được gọi là SourceAdapters . Tạo một tùy chỉnh được mô tả trong Tuỳ chỉnh thể phân phát tài liệu. TensorFlow Serving đi kèm với một để khởi tạo phiên TensorFlow dựa trên các đường dẫn trong hệ thống tệp mà TensorFlow hỗ trợ. Người ta có thể thêm hỗ trợ cho các hệ thống tập tin bổ sung để TensorFlow bằng cách mở rộng RandomAccessFile trừu tượng ( tensorflow/core/public/env.h ).

Tài liệu này tập trung vào việc tạo một nguồn phát ra các đường dẫn trong hệ thống tệp được TensorFlow hỗ trợ. Nó kết thúc với phần hướng dẫn cách sử dụng nguồn của bạn kết hợp với các mô-đun đã có từ trước để phục vụ các mô hình TensorFlow.

Tạo nguồn của bạn

Chúng tôi có một thực hiện tham chiếu của một Source<StoragePath> , được gọi là FileSystemStoragePathSource (tại sources/storage_path/file_system_storage_path_source* ). FileSystemStoragePathSource giám sát một đường dẫn hệ thống tập tin cụ thể, đồng hồ cho số thư mục con, và các báo cáo mới nhất trong số này là phiên bản nó mong muốn tải. Tài liệu này đi qua các khía cạnh nổi bật của FileSystemStoragePathSource . Bạn có thể tìm thấy nó thuận tiện để tạo một bản sao của FileSystemStoragePathSource và sau đó sửa đổi nó cho phù hợp với nhu cầu của bạn.

Thứ nhất, FileSystemStoragePathSource cụ các Source<StoragePath> API, mà là một chuyên môn của Source<T> API với T buộc phải StoragePath . API bao gồm một phương pháp duy nhất SetAspiredVersionsCallback() , trong đó cung cấp một đóng cửa các nguồn có thể gọi để giao tiếp mà nó muốn một tập hợp các phiên bản thể phân phát được nạp.

FileSystemStoragePathSource sử dụng khao khát-phiên bản gọi lại một cách rất đơn giản: nó định kỳ kiểm tra các hệ thống tập tin (làm một ls , về cơ bản), và nếu nó tìm thấy một hoặc nhiều con đường mà trông giống như các phiên bản thể phân phát nó quyết định cái nào là phiên bản mới nhất và gọi lệnh gọi lại với một danh sách có kích thước chỉ chứa phiên bản đó (theo cấu hình mặc định). Vì vậy, tại bất kỳ thời điểm nào FileSystemStoragePathSource yêu cầu nhiều nhất một thể phân phát được nạp, và thực hiện nó tận dụng idempotence của callback để giữ cho bản thân không quốc tịch (không có hại trong cách gọi gọi lại nhiều lần với các đối số giống nhau).

FileSystemStoragePathSource có một nhà máy tĩnh khởi (các Create() phương pháp), trong đó có một thông điệp giao thức cấu hình. Thông báo cấu hình bao gồm các chi tiết như đường dẫn cơ sở để giám sát và khoảng thời gian giám sát. Nó cũng bao gồm tên của luồng dịch vụ để phát ra. (Các phương pháp thay thế có thể trích xuất tên luồng có thể phục vụ từ đường dẫn cơ sở, để tạo ra nhiều luồng có thể phục vụ dựa trên việc quan sát phân cấp thư mục sâu hơn; những biến thể đó nằm ngoài phạm vi triển khai tham chiếu.)

Phần lớn việc triển khai bao gồm một chuỗi kiểm tra định kỳ hệ thống tệp, cùng với một số logic để xác định và sắp xếp bất kỳ đường dẫn con số nào mà nó phát hiện ra. Các chủ đề được đưa ra bên SetAspiredVersionsCallback() (không phải trong Create() ) vì đó là điểm mà tại đó các nguồn nên "bắt đầu" và biết nơi để gửi yêu cầu khao khát phiên bản.

Sử dụng Nguồn của bạn để tải các phiên TensorFlow

Bạn có thể sẽ muốn sử dụng mô-đun mã nguồn mới của bạn kết hợp với SavedModelBundleSourceAdapter ( servables/tensorflow/saved_model_bundle_source_adapter* ), mà sẽ giải thích từng con đường phát ra nguồn của bạn như một xuất khẩu TensorFlow, và chuyển đổi mỗi đường dẫn đến một bộ nạp cho một TensorFlow SavedModelBundle thể phân phát. Bạn có thể sẽ cắm SavedModelBundle adapter vào một AspiredVersionsManager , mà sẽ chăm sóc của thực tải và phục vụ servables. Một minh hoạ tốt về chaining ba loại mô-đun với nhau để có được một thư viện máy chủ làm việc được tìm thấy trong servables/tensorflow/simple_servers.cc . Dưới đây là hướng dẫn về luồng mã chính (với việc xử lý lỗi không tốt; mã thực nên cẩn thận hơn):

Đầu tiên, hãy tạo một người quản lý:

std::unique_ptr<AspiredVersionsManager> manager = ...;

Sau đó, tạo một SavedModelBundle bộ chuyển đổi nguồn và cắm nó vào người quản lý:

std::unique_ptr<SavedModelBundleSourceAdapter> bundle_adapter;
SavedModelBundleSourceAdapterConfig config;
// ... populate 'config' with TensorFlow options.
TF_CHECK_OK(SavedModelBundleSourceAdapter::Create(config, &bundle_adapter));
ConnectSourceToTarget(bundle_adapter.get(), manager.get());

Cuối cùng, tạo nguồn con đường của bạn và cắm nó vào SavedModelBundle adapter:

auto your_source = new YourPathSource(...);
ConnectSourceToTarget(your_source, bundle_adapter.get());

Các ConnectSourceToTarget() chức năng (được định nghĩa trong core/target.h ) chỉ đơn thuần gọi SetAspiredVersionsCallback() để kết nối một Source<T> với một Target<T> (một Target là một mô-đun bắt khao khát phiên bản yêu cầu, tức là một bộ chuyển đổi hoặc người quản lý ).