Các thiết bị Edge thường có bộ nhớ hoặc công suất tính toán hạn chế. Nhiều người đóng góp có thể áp dụng tối ưu hoá cho các mô hình để chúng có thể chạy trong hạn chế. Ngoài ra, một số hình thức tối ưu hoá cho phép sử dụng các chỉ số để suy luận nhanh.
LiteRT và Tối ưu hoá mô hình TensorFlow Bộ công cụ cung cấp công cụ để giảm thiểu độ phức tạp của việc tối ưu hoá suy luận.
Bạn nên cân nhắc việc tối ưu hoá mô hình trong quá trình đăng ký quá trình phát triển ứng dụng. Tài liệu này trình bày một số phương pháp hay nhất để tối ưu hoá Các mô hình TensorFlow để triển khai cho phần cứng cạnh tranh.
Lý do bạn nên tối ưu hoá mô hình
Có một số cách chính giúp tối ưu hoá mô hình khi áp dụng phát triển ứng dụng.
Giảm kích thước
Có thể dùng một số hình thức tối ưu hoá để giảm kích thước của mô hình. Nhỏ hơn mô hình có những lợi ích sau:
- Kích thước bộ nhớ nhỏ hơn: Những mẫu máy nhỏ hơn sẽ chiếm ít không gian lưu trữ hơn của người dùng thiết bị. Ví dụ: một ứng dụng Android sử dụng mô hình nhỏ hơn sẽ mất làm giảm dung lượng lưu trữ trên thiết bị di động của người dùng.
- Kích thước tải xuống nhỏ hơn: Các mô hình nhỏ hơn đòi hỏi ít thời gian và băng thông hơn để Tải xuống cho người dùng thiết bị.
- Mức sử dụng bộ nhớ thấp hơn: Các mô hình nhỏ hơn sử dụng ít RAM hơn khi chạy. Điều này giải phóng bộ nhớ để các phần khác của ứng dụng sử dụng và có thể có được hiệu suất và độ ổn định tốt hơn.
Việc lượng tử hoá có thể làm giảm kích thước của mô hình trong tất cả các trường hợp này, có khả năng nhưng đổi lại là thiếu chính xác. Việc cắt giảm và phân cụm có thể làm giảm kích thước của để tải xuống bằng cách làm cho mô hình đó dễ nén hơn.
Giảm độ trễ
Độ trễ là khoảng thời gian cần thiết để chạy một suy luận với một mô hình. Một số hình thức tối ưu hoá có thể giúp giảm bớt lượng công việc tính toán cần thiết để chạy suy luận bằng cách sử dụng một mô hình, dẫn đến độ trễ thấp hơn. Độ trễ cũng có thể đều có ảnh hưởng đến mức tiêu thụ điện năng.
Hiện tại, lượng tử hoá có thể được sử dụng để giảm độ trễ bằng cách đơn giản hoá tính toán xảy ra trong quá trình suy luận, có thể làm ảnh hưởng đến một số sự chính xác.
Khả năng tương thích của trình tăng tốc
Một số trình tăng tốc phần cứng, chẳng hạn như Edge TPU, có thể chạy suy luận cực nhanh với các mô hình đã được tối ưu hoá chính xác.
Nhìn chung, những loại thiết bị này yêu cầu số lượng mô hình ở một chỉ số cụ thể . Xem tài liệu của từng trình tăng tốc phần cứng để tìm hiểu thêm về các yêu cầu liên quan.
Lựa chọn đánh đổi
Hoạt động tối ưu hoá có thể dẫn đến thay đổi về độ chính xác của mô hình (điều này phải là xem xét trong quá trình phát triển ứng dụng.
Những thay đổi về độ chính xác phụ thuộc vào mô hình riêng lẻ đang được tối ưu hoá và khó có thể dự đoán trước. Nhìn chung, các mô hình được tối ưu hoá kích thước hoặc độ trễ sẽ mất đi một lượng nhỏ chính xác. Tùy thuộc vào ứng dụng của bạn, điều này có thể ảnh hưởng hoặc không ảnh hưởng đến của bạn. Trong một số ít trường hợp, một số mô hình nhất định có thể đạt được độ chính xác nào đó do quá trình tối ưu hoá.
Các loại tối ưu hoá
LiteRT hiện hỗ trợ tối ưu hoá thông qua việc lượng tử hoá, cắt giảm và phân cụm.
Các hoạt động này là một phần của Phương pháp tối ưu hoá mô hình TensorFlow Toolkit, cung cấp tài nguyên về kỹ thuật tối ưu hoá mô hình tương thích với TensorFlow Phiên bản
Lượng tử hoá
Định lượng hoạt động bằng cách giảm độ chính xác của các số dùng để biểu thị giá trị của một mô hình các tham số. Theo mặc định, các tham số này là số có dấu phẩy động 32 bit. Điều này dẫn đến kích thước mô hình nhỏ hơn và tốc độ tính toán nhanh hơn.
Các kiểu lượng tử sau đây có sẵn trong LiteRT:
Kỹ thuật | Yêu cầu dữ liệu | Giảm kích thước | Độ chính xác | Phần cứng được hỗ trợ |
---|---|---|---|---|
Định lượng lượng tử float16 sau quá trình đào tạo | Không có dữ liệu | Lên đến 50% | Mất độ chính xác không đáng kể | CPU, GPU |
Định lượng dải động sau khi đào tạo | Không có dữ liệu | Lên đến 75% | Mức giảm độ chính xác nhỏ nhất | CPU, GPU (Android) |
Định lượng số nguyên sau khi đào tạo | Mẫu đại diện chưa được gắn nhãn | Lên đến 75% | Mức giảm độ chính xác nhỏ | CPU, GPU (Android), EdgeTPU |
Đào tạo nhận biết lượng tử | Dữ liệu huấn luyện được gắn nhãn | Lên đến 75% | Mức giảm độ chính xác nhỏ nhất | CPU, GPU (Android), EdgeTPU |
Cây quyết định sau đây giúp bạn chọn các lược đồ lượng tử hoá mà bạn có thể muốn sử dụng cho mô hình của bạn, chỉ dựa trên kích thước mô hình dự kiến và sự chính xác.
Dưới đây là kết quả về độ trễ và độ chính xác của việc định lượng sau khi đào tạo và nhận biết lượng tử hoá trên một số mô hình. Tất cả các chỉ số về độ trễ đều được đo lường Thiết bị Pixel 2 dùng một CPU lõi lớn. Khi bộ công cụ được cải tiến, cũng như các con số ở đây:
Mẫu | Độ chính xác hàng đầu trong 1 (Gốc) | Độ chính xác hàng đầu (số lượng định lượng sau đào tạo) | Độ chính xác hàng đầu (Đào tạo nhận biết định lượng) | Độ trễ (Ban đầu) (mili giây) | Độ trễ (được định lượng hóa sau khi đào tạo) (mili giây) | Độ trễ (Đào tạo theo nhận thức lượng tử) (mili giây) | Kích thước (MB) | Kích thước (Được tối ưu hóa) (MB) |
---|---|---|---|---|---|---|---|---|
Mobilenet-v1-1-224 | 0,709 | 0,657 | 0,70 | 124 | 112 | 64 | 16,9 | 4,3 |
Mobilenet-v2-1-224 | 0,719 | 0,637 | 0,709 | 89 | 98 | 54 | 14 | 3.6 |
Inception_v3 | 0,78 | 0,772 | 0,775 | 1130 | 845 | 543 | 95,7 | 23,9 |
Resnet_v2_101 | 0,770 | 0,768 | Không áp dụng | 3973 | 2868 | Không áp dụng | 178,3 | 44,9 |
Định lượng đầy đủ số nguyên với kích hoạt int16 và trọng số int8
Định lượng bằng cách kích hoạt int16 là một sơ đồ lượng tử số nguyên đầy đủ với các lần kích hoạt trong int16 và trọng số trong int8. Chế độ này có thể cải thiện độ chính xác của mô hình lượng tử hoá so với lược đồ lượng tử hoá số nguyên đầy đủ với cả giá trị kích hoạt và trọng số trong int8 để duy trì kích thước mô hình tương tự. Bạn nên áp dụng cách này khi kích hoạt có tính nhạy cảm vào việc lượng tử hoá.
LƯU Ý: Hiện tại, chỉ những cách triển khai hạt nhân tham chiếu không được tối ưu hoá mới có sẵn trong TFLite cho lược đồ lượng tử này, nên theo mặc định hiệu suất sẽ chậm so với hạt nhân int8. Toàn bộ ưu điểm của chế độ này có thể hiện có thể truy cập được thông qua phần cứng chuyên dụng hoặc phần mềm tuỳ chỉnh.
Dưới đây là kết quả về độ chính xác của một số mô hình hưởng lợi từ chế độ này.
Mẫu | Loại chỉ số về độ chính xác | Độ chính xác (kích hoạt float32) | Độ chính xác (kích hoạt in8) | Độ chính xác (kích hoạt in16) |
---|---|---|---|---|
Wav2letter | THƯ GIÃN | 6,7% | 7,7% | 7,2% |
DeepLanguage 0.5.1 (chưa cuộn) | CER | 6,13% | 43,67% | 6,52% |
YoloV3 | mAP(IOU=0,5) | 0,577 | 0,563 | 0,574 |
MobileNetV1 | Độ chính xác hàng đầu 1 | 0,7062 | 0,694 | 0,6936 |
MobileNetV2 | Độ chính xác hàng đầu 1 | 0,718 | 0,7126 | 0,7137 |
MobileBert | F1(Khớp chính xác) | 88,81(81,23) | 2,08(0) | 88,73(81,15) |
Cưa cành cầm tay
Cắt bớt hoạt động theo xoá các tham số trong một mô hình chỉ ảnh hưởng nhỏ đến dự đoán. Các mô hình rút gọn có cùng kích thước trên ổ đĩa và có cùng thời gian chạy độ trễ nhưng có thể được nén hiệu quả hơn. Điều này khiến việc cắt tỉa trở nên hữu ích để giảm kích thước tải xuống mô hình.
Trong tương lai, LiteRT sẽ giảm độ trễ cho các mô hình bị cắt bớt.
Tạo cụm
Phân cụm hoạt động bằng cách nhóm trọng số của mỗi lớp trong một mô hình thành một số xác định trước cụm, sau đó chia sẻ giá trị trọng tâm cho các trọng số thuộc về mỗi nhóm cụm riêng lẻ. Điều này làm giảm số lượng giá trị trọng số duy nhất trong một mô hình, do đó, giảm tính phức tạp.
Kết quả là các mô hình phân cụm có thể được nén hiệu quả hơn, cung cấp các lợi ích triển khai tương tự như cắt giảm.
Quy trình phát triển
Để bắt đầu, hãy kiểm tra xem các mô hình trong được lưu trữ các mô hình phân bổ có thể phù hợp với ứng dụng của bạn. Nếu không, chúng tôi nên bắt đầu với phương pháp lượng tử hoá sau đào tạo vì đây là giải pháp có thể áp dụng rộng rãi không cần dữ liệu huấn luyện.
Trong trường hợp không đáp ứng các mục tiêu về độ chính xác và độ trễ hoặc phần cứng hỗ trợ trình tăng tốc đóng vai trò quan trọng, nhận biết được lượng tử hoá đào tạo là lựa chọn tốt hơn. Xem thêm kỹ thuật tối ưu hoá trong Tối ưu hoá mô hình TensorFlow Bộ công cụ.
Nếu muốn giảm kích thước mô hình hơn nữa, bạn có thể thử cắt bỏ và/hoặc phân cụm trước khi định lượng mô hình của bạn.