Vi điều khiển có RAM và bộ nhớ hạn chế, điều này hạn chế kích thước của các mô hình học máy. Ngoài ra, LiteRT cho Vi điều khiển hiện chỉ hỗ trợ một số ít các thao tác, nên không phải kiến trúc mô hình nào cũng có thể thực hiện được.
Tài liệu này giải thích quy trình chuyển đổi mô hình TensorFlow để chạy trên vi điều khiển. Tài liệu này cũng trình bày các thao tác được hỗ trợ và đưa ra một số hướng dẫn về cách thiết kế và huấn luyện một mô hình phù hợp với bộ nhớ có hạn.
Để xem ví dụ có thể chạy từ đầu đến cuối về cách tạo và chuyển đổi một mô hình, hãy xem ví dụ Hello World.
Chuyển đổi mô hình
Để chuyển đổi một mô hình TensorFlow đã được huấn luyện để chạy trên vi điều khiển, bạn nên sử dụng API Python của trình chuyển đổi LiteRT. Thao tác này sẽ chuyển đổi mô hình thành FlatBuffer, giảm kích thước mô hình và sửa đổi mô hình để sử dụng các thao tác LiteRT.
Để có được kích thước mô hình nhỏ nhất có thể, bạn nên cân nhắc sử dụng lượng tử hoá sau huấn luyện.
Chuyển đổi thành mảng C
Nhiều nền tảng vi điều khiển không có hỗ trợ hệ thống tệp gốc. Cách dễ nhất để sử dụng một mô hình trong chương trình của bạn là đưa mô hình đó vào dưới dạng một mảng C và biên dịch nó vào chương trình của bạn.
Lệnh unix sau đây sẽ tạo một tệp nguồn C chứa mô hình LiteRT dưới dạng một mảng char:
xxd -i converted_model.tflite > model_data.cc
Kết quả sẽ có dạng như sau:
unsigned char converted_model_tflite[] = {
0x18, 0x00, 0x00, 0x00, 0x54, 0x46, 0x4c, 0x33, 0x00, 0x00, 0x0e, 0x00,
// <Lines omitted>
};
unsigned int converted_model_tflite_len = 18200;
Sau khi tạo tệp, bạn có thể đưa tệp đó vào chương trình của mình. Bạn cần thay đổi khai báo mảng thành const để có hiệu suất bộ nhớ tốt hơn trên các nền tảng nhúng.
Để biết ví dụ về cách thêm và sử dụng một mô hình trong chương trình của bạn, hãy xem hello_world_test.cc trong ví dụ Hello World.
Cấu trúc và quá trình huấn luyện mô hình
Khi thiết kế một mô hình để sử dụng trên vi điều khiển, bạn cần cân nhắc kích thước mô hình, khối lượng công việc và các thao tác được sử dụng.
Kích thước mô hình
Mô hình phải đủ nhỏ để vừa với bộ nhớ của thiết bị mục tiêu cùng với phần còn lại của chương trình, cả dưới dạng nhị phân và trong thời gian chạy.
Để tạo một mô hình nhỏ hơn, bạn có thể sử dụng ít lớp hơn và các lớp nhỏ hơn trong cấu trúc của mình. Tuy nhiên, các mô hình nhỏ có nhiều khả năng bị thiếu khớp. Điều này có nghĩa là đối với nhiều vấn đề, bạn nên thử và sử dụng mô hình lớn nhất phù hợp với bộ nhớ. Tuy nhiên, việc sử dụng các mô hình lớn hơn cũng sẽ làm tăng khối lượng công việc của bộ xử lý.
Tải
Kích thước và độ phức tạp của mô hình sẽ ảnh hưởng đến khối lượng công việc. Các mô hình lớn, phức tạp có thể dẫn đến chu kỳ hoạt động cao hơn, tức là bộ xử lý của thiết bị dành nhiều thời gian hơn để hoạt động và ít thời gian hơn để ở trạng thái nhàn rỗi. Điều này sẽ làm tăng mức tiêu thụ điện và lượng nhiệt đầu ra, có thể gây ra vấn đề tuỳ thuộc vào ứng dụng của bạn.
Hỗ trợ hoạt động
LiteRT cho Vi điều khiển hiện chỉ hỗ trợ một số ít các thao tác TensorFlow, điều này ảnh hưởng đến những cấu trúc mô hình có thể chạy. Chúng tôi đang nỗ lực mở rộng khả năng hỗ trợ hoạt động, cả về việc triển khai tham chiếu và tối ưu hoá cho các cấu trúc cụ thể.
Bạn có thể xem các thao tác được hỗ trợ trong tệp micro_mutable_ops_resolver.h