- vừa được xem lúc

Triển khai các mô hình với OpenVINO

0 0 70

Người đăng: Việt Hoàng

Theo Viblo Asia

I. Giới thiệu

Xin chào các bạn và lại là mình đây, trong thời gian gần đây mình có tìm hiểu về cách triển khai các mô hình deep learning trên các thiết bị Edge và trong bài viết lần trước mình có giới thiệu tới mọi người bài viết về Hướng dẫn convert Pytorch sang TF Lite các bạn nên đọc qua bài viết này của mình để có thể hiểu được các chuyển đổi mô hình từ Pytorch sang định dạng ONNX như thế nào nhé. Về chủ đề OpenVINO thì tác giải Phan Hoàng cũng có một bài viết Tối ưu hóa model với OpenVINO toolkit rất hay các bạn có thể tham khảo. Nhiều bạn sẽ đặt câu hỏi là tại sao người ta viết thì viết lại làm gì.... ờ thì đơn giản mình viết để mình có một cơ hội tổng hợp lại kiến thức khi nào quên thì xem nên có gì sau mong anh em chỉ bảo ?.
Hiện nay chúng ta đang sống trong thời đại của điện toán đám mây (cloud computing). Mọi thứ bây giờ đều có trên cloud. Các dịch vụ cloud như AWS, Azure, GCP, v.v. đã giúp các thiết bị IoT của bạn dễ dàng bù đắp cho việc thiếu tốc độ xử lý trong máy cục bộ và sử dụng sức mạnh xử lý trên cloud. Nhưng không phải trong mọi trường hợp, bạn có thể tin tưởng vào các dịch vụ cloud. Luôn có nguy cơ rò rỉ dữ liệu cá nhân nhạy cảm của bạn nếu bạn gửi dữ liệu đó lên cloud. Có thể có vấn đề về mạng hoặc vấn đề về độ trễ khi bạn muốn triển khai mô hình AI của mình để đưa ra quyết định trong thời gian thực, chẳng hạn như ô tô tự lái. Bạn thực sự không muốn ô tô tự lái của mình phải chờ phản hồi từ máy chủ trong khi đang lái. Hoặc thậm chí có thể có tình huống mà mạng hoàn toàn không khả dụng.
Sự phát triển của các thiết bị IoT đã làm tăng ứng dụng tiên tiến của AI, có rất nhiều thiết bị mục tiêu có tài nguyên phần cứng hạn chế mà bạn có thể muốn triển khai mô hình AI. Cạnh có nghĩa là xử lý cục bộ. Điều đó có nghĩa là bạn có thể sử dụng mô hình AI trong một thiết bị và sử dụng sức mạnh xử lý của nó để đưa ra quyết định mà không cần kết nối với dịch vụ đám mây.

II. Intel OpenVINO là gì?

Tên OpenVINO là viết tắt của Open Visual Inferencing and Neural Network Optimization. Nó là một phần mềm mã nguồn mở được phát triển bởi Intel. Trọng tâm chính của OpenVINO là tối ưu hóa mạng nơ-ron để có thể suy luận nhanh trên các phần cứng khác nhau của Intel như CPU, GPU, VPU, FPGA, IPU, v.v. bằng một API chung. Phần mềm OpenVINO tối ưu hóa kích thước và tốc độ của mô hình để mô hình có thể chạy vượt trội với tài nguyên phần cứng hạn chế. Nó không làm tăng độ chính xác của mô hình. Thay vào đó, đôi khi bạn có thể cần chọn giảm độ chính xác để có hiệu suất cao hơn ở rìa. Gồm 2 phần chính:

  1. Model Optimizer
  2. Inference Engine

III. Quy trình làm việc của OpenVINO

Các bước như sau:

  1. Huấn luyện mô hình
  2. Feed model vào Optimizer với mục đích nén mô hình với đầu ra là Intermediate Representation bao gồm 2 file .xml và .bin
  3. Feed Intermediate Representation vào Inference Engine với mục đích để kiểm tra tính tương thích của mô hình trên framework (được sử dụng để huấn luyện mô hình) với mô trường (hardware)
  4. Triển khai trên ứng dụng

3.1. Model Optimizer

Model Optimizer để nén mô hình convert model trên các framework khác nhau sang Intermediate Representation là định dạng của OpenVINO. Nó bao gồm:

  • frozen-*.xml: network topology, là 1 file xml định nghĩa các layer của model, hay network graph
  • frozen-*.bin: file chứa weight + bias của model, có thể convert dưới các định dạng: FP32, FP16, INT8

Một số framework OpenVINO cung cấp hỗ trợ convert sang định dạng IR như sau:

  • Tensorflow
  • Caffe
  • MXNet
  • ONNX(PyTorch and Apple ML)
  • Kaldi

Quá trình convert pretrained là một quá trình khá đơn giản. Bạn cần configure optimizer cho từng framework tại đây sau đó thực hiện chạy lệnh. OpenVINO support khá nhiều pretrained model với các mục đích như:

  • Object Detection
  • Object Recognition
  • Segmentation
  • OCR
  • Pose Estimation

OpenVINO cũng cung cấp một số phương thức Optmizer model với mục đích để mô hình nhẹ và nhanh hơn. Trong bài viết này tôi sẽ chỉ trình bày về 3 phương pháp

  • Quantization
  • Freezing
  • Fusion

Về các phương pháp tối ưu mô hình thì có khá nhiều phương pháp các bạn có thể tham khảo các bài viết dưới đây mà tôi khá tâm đắc:

Quantization

Weights và bias của các mô hình được đào tạo trước trong OpenVINO có các phân biệt khác nhau:

  • FP32- Floating Point 32-bit
  • FP16- Floating Point 16-bit
  • INT8- Integer 8-bit

Các mô hình có độ chính xác cao có thể mang lại kết quả tốt tuy nhiên nó lại khá lớn nên lúc inference sẽ gây ra chậm và tốn tài nguyên khi chạy. Mặt khác với những mô hình có độ chính xác thấp hơn nhưng tốc độ nhanh hơn nên tùy vào từng yêu cầu cụ thể của bài toán mà các bạn lựa chọn. Quantization quan tâm tới việc tối ưu hóa lưu weight làm sao để hiệu qủa nhất. Bạn có thể đánh đổi một chút độ chính xác để lưu weight từ dạng FP32 xuống FP16 hoặc INT8.

Freezing

Freezing ở đây khác với Freezing trong quá trình huấn luyện mô hình nên bạn đừng nhầm lẫn nhé. Trong huấn luyện mô hình, điều này có nghĩa là đóng băng các lớp nhất định để bạn có thể tinh chỉnh và đào tạo chỉ trên một tập hợp con của các lớp. Ở đây, nó được sử dụng trong bối cảnh của toàn bộ mô hình và mô hình Tensorflow nói riêng. Đóng băng các mô hình TensorFlow sẽ loại bỏ một số hoạt động nhất định và siêu dữ liệu chỉ cần thiết cho đào tạo. Ví dụ, việc lan truyền ngược chỉ được yêu cầu trong khi đào tạo và không được yêu cầu trong khi inference. Đóng băng mô hình TensorFlow thường là một ý tưởng hay cho dù trước khi thực hiện suy luận trực tiếp hoặc chuyển đổi với Trình tối ưu hóa mô hình.

Fusion

Fusion có nghĩa là kết hợp nhiều lớp thành một lớp duy nhất. Ví dụ, một lớp chuẩn hóa hàng loạt, lớp kích hoạt và lớp phức hợp có thể được kết hợp thành một lớp duy nhất.

3.2. Inference Engine

Inference Engine, như tên cho thấy, chạy suy luận thực tế trên mô hình. Nó chỉ hoạt động với Biểu diễn trung gian (IR) đến từ trình tối ưu hóa mô hình hoặc các mô hình được đào tạo trước của Intel đã có mặt ở định dạng IR.
Giống như Trình tối ưu hóa mô hình, cung cấp các cải tiến trên cơ sở kích thước và độ phức tạp của mô hình để cải thiện bộ nhớ và thời gian tính toán, Công cụ suy luận cung cấp các tối ưu hóa dựa trên phần cứng để có được những cải tiến hơn nữa trong mô hình.
Bản thân Inference Engine thực sự được xây dựng trên C ++, dẫn đến các hoạt động tổng thể nhanh hơn; tuy nhiên, việc sử dụng trình bao bọc Python tích hợp sẵn để tương tác với nó trong Python là rất phổ biến.
Hỗ trợ trên tất cả các thiết bị phần cứng của Intel như sau:

  • CPU (Central Processing Unit)
  • GPU (Graphics Processing Unit)
  • NCS-2 (Neural Compute Stick)
  • FPGA (Field Programmable Gate Array)

Inference Engine có 2 classes chính như sau :

  • IECore-> Python Wrapper để làm việc với IE
  • IENetwork -> Lấy các tệp .xml và .bin và load mô hình vào IECore.

Sau khi tải IENetwork lên IECore thành công, bạn sẽ nhận được một Executable Network, nơi bạn sẽ gửi Inference Requests.

Có 2 loại Inference Requests:

  • Synchronous
  • Asynchronous
Synchronous

Trong trường hợp Suy luận Đồng bộ, hệ thống sẽ đợi và không hoạt động cho đến khi phản hồi suy luận được trả về (chặn luồng chính). Trong trường hợp này, chỉ một khung được xử lý cùng một lúc và không thể tập hợp khung tiếp theo cho đến khi hoàn tất suy luận của khung hiện tại

Asynchronous

Như bạn có thể đã đoán, trong trường hợp Suy luận không đồng bộ, nếu phản hồi cho một yêu cầu cụ thể mất nhiều thời gian, thì bạn không cần chờ đợi, thay vào đó bạn tiếp tục với quy trình tiếp theo trong khi quy trình hiện tại đang thực thi. Suy luận không đồng bộ đảm bảo suy luận nhanh hơn so với Suy luận đồng bộ.

IV. Kết luận

Bài viết của mình đến đây là kết thúc hết phần 1 và mình đang viết tiếp phần 2 hướng dẫn thực hiện convert 1 mô hình thực tế từ pytorch hãy follow để xem các bài viết tiếp theo nhé. Cảm ơn các bạn đã theo dõi bài viết của mình. Đừng tiếc gì hãy cho mình xin 1 lượt upvote nha các bạn.

Bình luận

Bài viết tương tự

- vừa được xem lúc

Hành trình AI của một sinh viên tồi

Mình ngồi gõ những dòng này vào lúc 2h sáng (chính xác là 2h 2 phút), quả là một đêm khó ngủ. Có lẽ vì lúc chiều đã uống cốc nâu đá mà giờ mắt mình tỉnh như sáo, cũng có thể là vì những trăn trở về lý thuyết chồng chất ánh xạ mình đọc ban sáng khiến không tài nào chợp mắt được hoặc cũng có thể do mì

0 0 146

- vừa được xem lúc

[Deep Learning] Key Information Extraction from document using Graph Convolution Network - Bài toán trích rút thông tin từ hóa đơn với Graph Convolution Network

Các nội dung sẽ được đề cập trong bài blog lần này. . Tổng quan về GNN, GCN. Bài toán Key Information Extraction, trích rút thông tin trong văn bản từ ảnh.

0 0 219

- vừa được xem lúc

Tìm hiểu về YOLO trong bài toán real-time object detection

1.Yolo là gì. . Họ các mô hình RCNN ( Region-Based Convolutional Neural Networks) để giải quyết các bài toán về định vị và nhận diện vật thể.

0 0 284

- vừa được xem lúc

Encoding categorical features in Machine learning

Khi tiếp cận với một bài toán machine learning, khả năng cao là chúng ta sẽ phải đối mặt với dữ liệu dạng phân loại (categorical data). Khác với các dữ liệu dạng số, máy tính sẽ không thể hiểu và làm việc trực tiếp với categorical variable.

0 0 259

- vừa được xem lúc

TF Lite with Android Mobile

Như các bạn đã biết việc đưa ứng dụng đến với người sử dụng thực tế là một thành công lớn trong Machine Learning.Việc làm AI nó không chỉ dừng lại ở mức nghiên cứu, tìm ra giải pháp, chứng minh một giải pháp mới,... mà quan trọng là đưa được những nghiên cứu đó vào ứng dụng thực tế, được sử dụng để

0 0 72

- vừa được xem lúc

Xây dựng hệ thống Real-time Multi-person Tracking với YOLOv3 và DeepSORT

Trong bài này chúng ta sẽ xây dựng một hệ thống sử dụng YOLOv3 kết hợp với DeepSORT để tracking được các đối tượng trên camera, YOLO là một thuật toán deep learning ra đời vào tháng 5 năm 2016 và nó nhanh chóng trở nên phổ biến vì nó quá nhanh so với thuật toán deep learning trước đó, sử dụng YOLO t

0 0 316