Thiết kế triển khai mô hình AI bằng kiến trúc MicroServices
Lớp học MLEs 03 đang trong quá trình làm dự án. Trong ba dự án đã từng được đề cập ở đây, dưới đây là thiết kế của một bạn học viên về việc triển khai một hệ thống nhận diện văn bản trong hình ảnh theo hướng MicroServices.
Bài toán đặt ra là khi bạn cần xây dựng một hệ thống giúp bạn upload một bức ảnh và trả về nội dung văn bản nằm trên bức ảnh đó. Cụ thể như sau:
Như trên hình bạn có thể thấy, đầu vào là một bức ảnh và đầu ra là các văn bản nằm trong bức ảnh này.
1) Thiết kế
Thay vì chỉ sử dụng client và server như thông thường, bạn sẽ tách nhỏ các logic thành các service riêng.
Các service chính:
Webserver Frontend (Đóng gói bằng Docker) sẽ có nhiệm vụ host giao diện của ứng dụng, ví dụ trường hợp này giao diện sẽ cần có khu vực upload ảnh để gửi cho mô hình thực hiện dự đoán. Giao diện có thể lập trình dễ dàng với Gradio bằng Python.
Webserver Backend (Đóng gói bằng Docker) sẽ có nhiệm vụ nhận ảnh được tải lên, tiền xử lý ảnh và giao tiếp với service AI. Webserver này có thể lập trình bằng FastAPI và Python.
Service AI sẽ được chia thành 2 service deloy 2 model khác nhau:
Text Detection Model sẽ được host bằng Triton Inference Server (đóng gói bằng Docker).
Model sử dụng có tên EAST model. Đầu vào là ảnh và đầu ra là các bounding box hình chữ nhật khoanh các vùng có văn bản. Tìm hiểu thêm về Bounding Box tại loạt bài viết về bài toán nhận diện hình ảnh
Webserver Backend sẽ gửi ảnh đã được xử lý lên service này và nhận lại các bounding box này
Text Recognition Model cũng được host bằng Triton Inference Server (đóng gói bằng Docker).
Model sử dụng có tên None-ResNet-None-CTC. Tham khảo thêm tại đây.
Webserver Backend sau khi nhận được các bounding box ở service của model Text Detection Model sẽ cắt các phần ảnh nằm trong bounding box này và gửi cho model Text Recognition Model để dự đoán ra văn bản của từng vùng đó.
Ngoài ra hệ thống còn có 2 services phục vụ cho việc monitoring mô hình.
Service chạy Prometheus có nhiệm vụ thu thập các chỉ số (metrics) từ Triton server. Triton cung cấp metrics tại cổng 8002 với đầy đủ chi tiết về từng model hoạt động ra sao, tốn kém tài nguyên như thế nào, bao nhiêu yêu cầu thành công/thất bại và thời gian thực hiện mỗi yêu cầu này.
Service chạy Grafana. Một thư viện giúp bạn xây dashboard để hiển thị các chỉ số bạn đã thu thập bằng Prometheus.
Ở đây team ProtonX đã đính kèm hướng dẫn chi tiết cách xây dựng hệ thống monitoring các chỉ số của Triton Server bằng hai công cụ này.
2) Điểm mạnh điểm yếu
Điểm mạnh
Tách biệt các service giúp việc phát triển các service dễ dàng hơn, có thể phát triển bằng ngôn ngữ/framework lập trình khác nhau để tận dụng tối đa sức mạnh của ngôn ngữ/framework đó.
Một trong các service có thể không hoạt động nhưng các service còn lại vẫn có thể phục vụ người dùng
Ví dụ trường hợp các service AI không hoạt động thì ít nhất người dùng vẫn còn có thể thao tác với giao diện. Nếu để chung cả giao diện + AI model thì khi hệ thống sập thì người dùng không thể sử dụng bất kỳ tính năng nào.
Điểm yếu
Tốn kém nguồn lực để phát triển và duy trì. Ngoài ra việc version hóa các phiên bản của từng service để chúng làm việc với nhau trơn tru không hề đơn giản.
Hi vọng bạn đã học được cách thiết kế và chia nhỏ hệ thống theo hướng MicroServices. Team ProtonX sẽ tiếp tục chia sẻ về các project tiếp theo đến từ lớp học MLEs 03 và 04.