Sử dụng TPU San hô để chạy các mô hình TFlite trong Nút bằng TensorFlow.js

1. Giới thiệu

54e81d02971f53e8.pngs

Lần cập nhật gần đây nhất: ngày 11 tháng 04 năm 2022

Trong lớp học lập trình này, bạn sẽ tìm hiểu cách huấn luyện một mô hình phân loại hình ảnh bằng Teachable Machine và chạy mô hình đó bằng công cụ Tăng tốc phần cứng san hô bằng TensorFlow.js, một thư viện máy học mạnh mẽ và linh hoạt dành cho JavaScript. Bạn tạo một ứng dụng Electron hiển thị hình ảnh từ webcam và phân loại hình ảnh bằng TPU cạnh san hô. Bạn có thể xem phiên bản hoạt động đầy đủ của lớp học lập trình này trong kho lưu trữ GitHub sig-tfjs.

Tôi có cần dùng thiết bị san hô không?

Không. Bạn có thể thử tham gia lớp học lập trình này mà không cần thiết bị san hô mà vẫn đạt được hiệu suất tốt trên máy tính bằng cách sử dụng trình tăng tốc WebNN.

Sản phẩm bạn sẽ tạo ra

Trong lớp học lập trình này, bạn sẽ tạo một ứng dụng electron để phân loại hình ảnh. Ứng dụng của bạn:

  • Phân loại hình ảnh từ webcam thành các danh mục được xác định trong mô hình mà bạn đã huấn luyện.
  • Sử dụng trình tăng tốc mô phỏng san hô (nếu có) để tăng hiệu suất.
  • Sử dụng WebNN để tăng hiệu suất nếu nền tảng của bạn hỗ trợ WebNN.

Kiến thức bạn sẽ học được

  • Cách cài đặt và thiết lập gói kháng nghị bạn cho tfjs-tflite-node để chạy các mô hình TFLite trong Node.js.
  • Cách cài đặt thư viện thời gian chạy TPU của Edge để chạy các mô hình trên thiết bị san hô.
  • Cách tăng tốc độ suy luận mô hình bằng cách sử dụng TPU cạnh san hô.
  • Cách tăng tốc độ suy luận mô hình bằng WebNN.

Lớp học lập trình này tập trung vào TFLite trong Node.js. Các khái niệm và khối mã không liên quan được che khuất và chỉ cung cấp cho bạn để sao chép và dán.

Bạn cần có

Để hoàn tất lớp học lập trình này, bạn cần có:

2. Bắt đầu thiết lập

Lấy mã

Chúng tôi đã đặt tất cả mã bạn cần cho dự án này vào kho lưu trữ Git. Để bắt đầu, hãy lấy mã và mở mã đó trong môi trường phát triển mà bạn yêu thích. Đối với lớp học lập trình này, bạn nên sử dụng Raspberry Pi chạy Raspberry Pi OS (64 bit) với máy tính. Thao tác này giúp bạn dễ dàng kết nối trình tăng tốc mô phỏng san hô.

Khuyến nghị: Dùng Git để sao chép kho lưu trữ trên Raspberry Pi

Để lấy mã, hãy mở cửa sổ dòng lệnh mới rồi sao chép kho lưu trữ:

git clone https://github.com/tensorflow/sig-tfjs.git

Tất cả tệp bạn cần chỉnh sửa cho lớp học lập trình này đều nằm trong thư mục tfjs-tflite-node-codelab (bên trong sig-tfjs). Trong thư mục này, bạn sẽ thấy các thư mục con có tên starter_code, cpu_inference_working, coral_inference_workingwebnn_inference_working. Đây là những điểm kiểm tra cho các bước của lớp học lập trình này.

Trong số các tệp khác trong kho lưu trữ, có các gói kháng nghị giờ mới nhất mà tfjs-tflite-node-codelab phụ thuộc. Bạn sẽ không cần phải chỉnh sửa bất kỳ tệp nào trong số này, nhưng bạn sẽ cần chạy một số kiểm thử của chúng để đảm bảo rằng môi trường của bạn được thiết lập chính xác.

Cài đặt thư viện thời gian chạy TPU của Edge

Thiết bị san hô yêu cầu bạn cài đặt thư viện thời gian chạy TPU của Edge trước khi sử dụng. Hãy cài đặt ứng dụng bằng cách làm theo hướng dẫn dành cho nền tảng của bạn.

Trên Linux / Raspberry Pi

Trên Linux, thư viện này có trong PPA của Google dưới dạng gói Debian, libedgetpu1-std, dành cho các kiến trúc x86-64 và Armv8 (64 bit). Nếu bộ xử lý của bạn sử dụng một cấu trúc khác, thì bạn cần phải biên dịch từ nguồn.

Chạy lệnh này để thêm PPA San hô của Google và cài đặt thư viện Thời gian chạy TPU của Edge.

# None of this is needed on Coral boards
# This repo is needed for almost all packages below
echo "deb https://packages.cloud.google.com/apt coral-edgetpu-stable main" | sudo tee /etc/apt/sources.list.d/coral-edgetpu.list
# This repo is needed for only python3-coral-cloudiot and python3-coral-enviro
echo "deb https://packages.cloud.google.com/apt coral-cloud-stable main" | sudo tee /etc/apt/sources.list.d/coral-cloud.list

curl https://packages.cloud.google.com/apt/doc/apt-key.gpg | sudo apt-key add -

sudo apt-get update
sudo apt-get install libedgetpu1-std

Trên Windows / các hệ điều hành khác

Tệp nhị phân được biên dịch trước có cho các phiên bản x86-64 của MacOS và Windows và có thể được cài đặt bằng cách chạy tập lệnh install.sh hoặc install.bat trong kho lưu trữ sau khi được tải xuống.

Khởi động lại thiết bị

Sau khi cài đặt Môi trường thời gian chạy TPU của Edge, hãy khởi động lại thiết bị để kích hoạt quy tắc San hô Udev mới mà trình cài đặt đã thêm.

Xác minh rằng thiết bị San hô của bạn đã được phát hiện

Để xác minh rằng thiết bị CORAL được phát hiện và đang hoạt động, hãy chạy các bài kiểm thử tích hợp cho gói coral-tflite-delegate. Gói này được tìm thấy trong thư mục gốc của kho lưu trữ. Để chạy kiểm thử tích hợp, hãy cắm trình tăng tốc san hô và chạy các lệnh sau trong thư mục của gói:

npx yarn
npx yarn build-deps
npx yarn test-integration

Bạn sẽ thấy kết quả như sau:

yarn run v1.22.17
$ yarn build && yarn test-integration-dev
$ tsc
$ jasmine --config=jasmine-integration.json
Platform node has already been set. Overwriting the platform with node.
Randomized with seed 78904
Started

============================
Hi there 👋. Looks like you are running TensorFlow.js in Node.js. To speed things up dramatically, install our node backend, which binds to TensorFlow C++, by running npm i @tensorflow/tfjs-node, or npm i @tensorflow/tfjs-node-gpu if you have CUDA. Then call require('@tensorflow/tfjs-node'); (-gpu suffix for CUDA) at the start of your program. Visit https://github.com/tensorflow/tfjs-node for more details.
============================
WARNING: converting 'int32' to 'uint8'
.


1 spec, 0 failures
Finished in 2.777 seconds
Randomized with seed 78904 (jasmine --random=true --seed=78904)
Done in 6.36s.

Đừng lo lắng về việc cài đặt @tensorflow/tfjs-node, như đề cập trong nhật ký, vì bạn sẽ chạy mô hình trong TFLite.

Thay vào đó, nếu dữ liệu đầu ra chứa Encountered unresolved custom op: edgetpu-custom-op, tức là thiết bị San hô của bạn không được phát hiện. Hãy đảm bảo rằng bạn đã cài đặt thư viện thời gian chạy TPU cạnh và cắm thiết bị san hô vào máy tính của mình. Bạn cũng có thể làm theo Hướng dẫn bắt đầu sử dụng củaCoral để kiểm thử phiên bản liên kết san hô bằng Python. Nếu phiên bản Python hoạt động nhưng các lượt kiểm thử này vẫn không thành công, vui lòng cho chúng tôi biết bằng cách gửi báo cáo lỗi.

Chạy mã khởi đầu

Bây giờ, bạn đã sẵn sàng chạy mã khởi đầu. Hãy làm theo các bước sau để bắt đầu.

  1. Chuyển đến thư mục starter_code trong thư mục tfjs-tflite-node-codelab.
  2. chạy npm install để cài đặt các phần phụ thuộc.
  3. Chạy npm start để chạy dự án. Một ứng dụng hiển thị nguồn cấp dữ liệu video từ webcam của máy tính sẽ mở ra.

Điểm xuất phát của chúng ta là gì?

Điểm bắt đầu của chúng ta là một ứng dụng máy ảnh Electron cơ bản được thiết kế cho lớp học lập trình này. Mã này đã được đơn giản hoá để hiển thị các khái niệm trong lớp học lập trình và có ít cách xử lý lỗi. Nếu bạn chọn sử dụng lại bất kỳ mã nào trong ứng dụng chính thức, hãy đảm bảo rằng bạn xử lý mọi lỗi và kiểm thử đầy đủ tất cả các mã.

Một ứng dụng điện tử cơ bản với nguồn cấp dữ liệu trực tiếp về máy ảnh của thiết bị.

Khám phá mã khởi đầu

Có nhiều tệp trong mã khởi đầu này, nhưng tệp duy nhất bạn cần chỉnh sửa là renderer.js. Thẻ này kiểm soát nội dung hiển thị trên trang, bao gồm cả nguồn cấp dữ liệu video và các phần tử HTML. Đây cũng là nơi bạn thêm mô hình học máy vào ứng dụng. Trong số các tệp khác là tệp index.html, nhưng tất cả chức năng của tệp này chỉ là tải tệp renderer.js. Ngoài ra, còn có một tệp main.js là điểm truy cập cho Electron. Lớp này kiểm soát vòng đời của ứng dụng, bao gồm cả nội dung sẽ xuất hiện khi ứng dụng được mở và việc cần làm khi ứng dụng đóng, nhưng bạn không cần thực hiện bất kỳ thay đổi nào đối với ứng dụng.

Mở trình gỡ lỗi

Có thể bạn sẽ cần gỡ lỗi ứng dụng khi theo dõi lớp học lập trình này. Vì dựa trên Electron nên ứng dụng này được tích hợp sẵn trình gỡ lỗi Chrome. Trên hầu hết các nền tảng, bạn có thể mở ứng dụng bằng tổ hợp phím Ctrl + Shift + i. Nhấp vào thẻ Bảng điều khiển để xem nhật ký và thông báo lỗi từ ứng dụng.

Không còn nhiều điều khác để khám phá ở đây, vì vậy, hãy bắt đầu huấn luyện thuật toán phân loại hình ảnh!

3. Huấn luyện công cụ phân loại hình ảnh

Trong phần này, bạn sẽ huấn luyện các phiên bản TFLite và San hô của một mô hình phân loại hình ảnh tuỳ chỉnh.

Đào tạo người phân loại

Trình phân loại hình ảnh sẽ lấy hình ảnh đầu vào và gán nhãn cho chúng. Đối với lớp học lập trình này, bạn sẽ dùng Teachable Machine để huấn luyện một mô hình trong trình duyệt. Để tăng tốc độ đào tạo cho phần này, bạn có thể sử dụng máy tính để bàn hoặc máy tính xách tay thay vì Raspberry Pi, nhưng bạn sẽ phải sao chép các tệp kết quả vào Pi.

Bây giờ, bạn đã sẵn sàng huấn luyện một mô hình. Nếu bạn không chắc chắn nên huấn luyện loại mô hình nào, thì một mô hình dễ huấn luyện là máy phát hiện người. Mô hình này chỉ phát hiện xem có người đang ở trong khung hình hay không.

  1. Mở trang đào tạo về Máy học có thể giảng dạy trong một thẻ mới.
  2. Chọn Dự án hình ảnh, sau đó chọn Mô hình hình ảnh chuẩn.
  3. Thêm hình ảnh mẫu cho mỗi lớp. Sử dụng đầu vào webcam là cách dễ nhất để thực hiện việc này. Bạn cũng có thể đổi tên các lớp học.
  4. Khi bạn đã thu thập đủ dữ liệu cho mỗi lớp (thường là đủ 50 mẫu), hãy nhấn vào Mô hình tàu.

Khi mô hình này được huấn luyện xong, bạn sẽ thấy bản xem trước kết quả của mô hình.

Một mô hình được huấn luyện dựa trên hình ảnh của hai lớp,

Hãy thử cung cấp nhiều dữ liệu đầu vào cho mô hình này. Nếu bạn nhận thấy một dữ liệu đầu vào được phân loại không chính xác, hãy thêm dữ liệu đó vào dữ liệu huấn luyện và huấn luyện lại mô hình.

  1. Khi bạn hài lòng với độ chính xác của mô hình, hãy nhấp vào Xuất mô hình. Bạn cần tải xuống hai phiên bản riêng biệt của mô hình này.
  2. Xuất mô hình của bạn dưới dạng Mô hình dấu phẩy động Tensorflow Lite. Thao tác này sẽ tải một tệp có tên là converted_tflite.zip xuống. chạy trên CPU.
  3. Xuất mô hình của bạn dưới dạng mô hình Tensorflow Lite EdgeTPU. Thao tác này sẽ tải một tệp có tên là converted_edgetpu.zip chạy trên TPU San hô san hô.

4. Chạy mô hình CPU trong ứng dụng

Bây giờ, bạn đã huấn luyện một mô hình, đã đến lúc thêm mô hình đó vào ứng dụng của bạn. Khi kết thúc phần này, ứng dụng sẽ có thể chạy mô hình của bạn bằng CPU của thiết bị.

Thêm tệp mô hình vào ứng dụng

Giải nén tệp mô hình converted_tflite.zip mà bạn đã tải xuống khi huấn luyện thuật toán phân loại. Có hai tệp trong kho lưu trữ. model_uquant.tflite là mô hình TFLite đã lưu, bao gồm cả biểu đồ mô hình và trọng số. labels.txt chứa các nhãn mà con người có thể đọc được cho các lớp mà mô hình dự đoán. Đặt cả hai tệp trong modeldirectory.

Cài đặt phần phụ thuộc

Việc tải mô hình và đầu vào xử lý trước yêu cầu một vài phần phụ thuộc từ TensorFlow.js:

  • tfjs-tflite-node: Gói của TensorFlow.js để chạy các mô hình TFLite trong Node.js.
  • @tensorflow/tfjs: Gói chính của TensorFlow.js.

@tensorflow/tfjs đã được cài đặt, nhưng bạn cần cài đặt tfjs-tflite-node bằng lệnh sau:

npm install --save tfjs-tflite-node

Sau khi cài đặt, hãy thêm thẻ này vào ứng dụng ở đầu renderer.js:

CODELAB phần 1: Nhập tfjs-tflite-node.

const {loadTFLiteModel} = require('tfjs-tflite-node');

Tải mô hình

Giờ bạn đã sẵn sàng tải mô hình. tfjs-tflite-node cung cấp hàm loadTFLiteModel để thực hiện việc này. Công cụ này có thể tải mô hình từ một đường dẫn tệp, ArrayBuffer hoặc URL TFHub. Để tải mô hình và trọng số của mô hình, hãy thêm giá trị này vào hàm main:

CODELAB phần 1: Tải mô hình tại đây.

const modelPath = './model/model_unquant.tflite';
const model = await loadTFLiteModel(modelPath);
const labels = fs.readFileSync('./model/labels.txt', 'utf8')
      .split('\n');

Chạy mô hình

Quy trình chạy mô hình gồm 3 bước. Trước tiên, bạn kéo và xử lý trước khung hình đầu vào từ webcam. Sau đó, bạn chạy mô hình trên khung đó và nhận thông tin dự đoán. Sau đó, bạn sẽ cho thấy cụm từ gợi ý trên trang.

Xử lý trước dữ liệu đầu vào qua webcam

Hiện tại, webcam chỉ là một phần tử HTML và khung mà webcam hiển thị không có sẵn cho tệp JavaScript renderer.js. Để lấy khung hình từ webcam, TensorFlow.js cung cấp tf.data.webcam, giúp cung cấp phương thức capture() dễ sử dụng để chụp khung hình từ máy ảnh.

Để sử dụng Gemini, hãy thêm mã thiết lập sau vào main():

CODELAB phần 1: Thiết lập tf.data.webcam tại đây.

const tensorCam = await tf.data.webcam(webcam);

Sau đó, để chụp ảnh ở mọi khung hình, hãy thêm đoạn mã sau vào run():

CODELAB phần 1: Chụp khung hình webcam tại đây.

const image = await tensorCam.capture();

Bạn cũng cần phải xử lý trước từng khung hình để tương thích với mô hình. Mô hình mà lớp học lập trình này sử dụng có hình dạng đầu vào [1, 224, 224, 3], vì vậy mô hình dự kiến sẽ có hình ảnh RGB 224 x 224 pixel. tensorCam.capture() có hình dạng [224, 224, 3], vì vậy, bạn cần thêm một kích thước bổ sung ở phía trước tensor bằng tf.expandDims. Ngoài ra, mẫu CPU dự kiến có đầu vào Float32 trong khoảng từ -1 đến 1, nhưng webcam sẽ ghi lại các giá trị từ 0 đến 255. Bạn có thể chia tensor đầu vào cho 127 để thay đổi phạm vi của nó từ [0, 255] thành [0, ~ 2] và sau đó trừ 1 để có phạm vi mong muốn [-1, ~ 1]. Thêm những dòng này vào tf.tidy() trong hàm run() để thực hiện việc này:

CODELAB phần 1: Xử lý trước khung hình webcam tại đây.

const expanded = tf.expandDims(image, 0);
const divided = tf.div(expanded, tf.scalar(127));
const normalized = tf.sub(divided, tf.scalar(1));

Bạn cần vứt bỏ tensor sau khi sử dụng. tf.tidy() tự động thực hiện việc này đối với mã có trong lệnh gọi lại, nhưng không hỗ trợ các hàm không đồng bộ. Bạn cần loại bỏ theo cách thủ công tensor hình ảnh đã tạo trước đó bằng cách gọi phương thức dispose().

CODELAB phần 1: vứt bỏ khung hình webcam ở đây.

image.dispose();

Chạy mô hình và hiện kết quả

Để chạy mô hình trên dữ liệu đầu vào đã xử lý trước, hãy gọi model.predict() trên tensor đã chuẩn hoá. Hàm này sẽ trả về tensor một chiều chứa xác suất dự đoán của mỗi nhãn. Nhân xác suất này với 100 để biết tỷ lệ phần trăm cơ hội của mỗi nhãn, rồi dùng hàm showPrediction đi kèm với mã khởi đầu để hiện thông tin dự đoán của mô hình trên màn hình.

Mã này cũng sử dụng stats.js để tính thời gian dự đoán cần thiết bằng cách thực hiện lệnh gọi đến stats.beginstats.end xung quanh model.predict.

CODELAB phần 1: Chạy mô hình và hiển thị kết quả tại đây.

stats.begin();
const prediction = model.predict(normalized);
stats.end();
const percentage = tf.mul(prediction, tf.scalar(100));
showPrediction(percentage.dataSync(), labels);

Chạy lại ứng dụng bằng yarn start và bạn sẽ thấy thông tin phân loại từ mô hình của mình.

Mô hình CPU TFLite chạy trong ứng dụng Electron. Trình phân loại hình ảnh sẽ phân loại hình ảnh từ webcam và hiển thị các giá trị tin cậy cho từng lớp dưới đây.

Hiệu suất

Như hiện đã được thiết lập, mô hình chạy bằng CPU. Điều này là bình thường trên máy tính để bàn và hầu hết các máy tính xách tay, nhưng có thể không như mong muốn nếu bạn chạy tính năng này trên Raspberry Pi hoặc một thiết bị điện năng thấp khác. Trên Raspberry Pi 4, bạn có thể sẽ thấy khoảng 10 FPS, có thể không đủ nhanh cho một số ứng dụng. Để đạt được hiệu suất tốt hơn mà không cần sử dụng máy nhanh hơn, bạn có thể sử dụng silicon dành riêng cho ứng dụng ở dạng TPU San hô.

5. Chạy mô hình San hô trong ứng dụng

Nếu không có thiết bị San hô, bạn có thể bỏ qua phần này.

Bước này của lớp học lập trình được xây dựng dựa trên mã bạn đã viết trong phần trước, nhưng thay vào đó, bạn có thể sử dụng điểm kiểm tra cpu_inference_working nếu muốn bắt đầu với một phương tiện chặn mới.

Các bước để chạy mô hình San hô gần giống với các bước để chạy mô hình CPU. Điểm khác biệt chính là định dạng mô hình. Vì San hô chỉ hỗ trợ tensor uint8, nên mô hình này được lượng tử hoá. Điều này ảnh hưởng đến các tensor đầu vào được truyền đến mô hình cũng như các tensor đầu ra mà mô hình trả về. Một điểm khác biệt nữa là các mô hình cần được biên dịch bằng trình biên dịch TPU của Edge để chạy trên TPU San hô. TeachableMachine đã thực hiện bước này, nhưng bạn có thể tìm hiểu cách thực hiện bước này cho các mô hình khác bằng cách truy cập vào tài liệu của San hô.

Thêm tệp mô hình San hô vào ứng dụng

Giải nén tệp mô hình converted_edgetpu.zip mà bạn đã tải xuống khi huấn luyện thuật toán phân loại. Có hai tệp được bao gồm trong kho lưu trữ. model_edgetpu.tflite là mô hình TFLite đã lưu, bao gồm cả biểu đồ mô hình và trọng số. labels.txt chứa các nhãn mà con người có thể đọc được cho các lớp mà mô hình dự đoán. Đặt tệp mô hình vào thư mục coral_model.

Cài đặt phần phụ thuộc

Để chạy các mô hình San hô cần có thư viện thời gian chạy Edge TPU. Đảm bảo bạn đã cài đặt ứng dụng bằng cách làm theo hướng dẫn thiết lập trước khi tiếp tục.

Thiết bị san hô được truy cập với tư cách là người được uỷ quyền TFLite. Để truy cập vào các tập lệnh này từ JavaScript, hãy cài đặt gói coral-tflite-authorized:

npm install --save coral-tflite-delegate

Sau đó, nhập mã uỷ quyền bằng cách thêm dòng sau vào đầu tệp renderer.js:

CODELAB phần 2: Nhập lớp uỷ quyền tại đây.

const {CoralDelegate} = require('coral-tflite-delegate');

Tải mô hình

Bây giờ, bạn đã sẵn sàng tải mô hình San hô. Bạn thực hiện việc này theo cách tương tự như đối với mô hình CPU, ngoại trừ giờ bạn truyền các tuỳ chọn vào hàm loadTFLiteModel để tải uỷ quyền San hô.

CODELAB phần 2: Tải mô hình uỷ quyền tại đây.

const coralModelPath = './coral_model/model_edgetpu.tflite';
const options = {delegates: [new CoralDelegate()]};
const coralModel = await loadTFLiteModel(coralModelPath, options);

Bạn không cần tải nhãn vì các nhãn này giống với mô hình CPU.

Thêm một nút để chuyển đổi giữa CPU và San hô

Bạn thêm mô hình San hô cùng với mô hình CPU mà bạn đã thêm ở phần trước. Việc chạy cả hai cùng lúc sẽ khiến bạn khó nhận thấy sự khác biệt về hiệu suất, vì vậy, nút bật tắt sẽ chuyển đổi giữa quá trình thực thi San hô và thực thi CPU.

Thêm nút có mã này:

CODELAB phần 2: Tạo nút uỷ quyền tại đây.

let useCoralDelegate = false;
const toggleCoralButton = document.createElement('button');
function toggleCoral() {
  useCoralDelegate = !useCoralDelegate;
  toggleCoralButton.innerText = useCoralDelegate
      ? 'Using Coral. Press to switch to CPU.'
      : 'Using CPU. Press to switch to Coral.';
}
toggleCoralButton.addEventListener('click', toggleCoral);
toggleCoral();
document.body.appendChild(toggleCoralButton);

Hãy kết nối điều kiện này trong hàm run(). Khi useCoralDelegate là false, ứng dụng sẽ chạy phiên bản CPU. Nếu không, nó sẽ chạy phiên bản San hô (nhưng hiện tại, nó sẽ không làm gì cả). Gói mã để chạy mô hình CPU trong câu lệnh if. Lưu ý rằng tensor expanded bị bỏ qua câu lệnh if vì mô hình San hô sử dụng câu lệnh này.

CODELAB phần 2: Kiểm tra xem có sử dụng tính năng uỷ quyền tại đây hay không.

// NOTE: Don't just copy-paste this code into the app.
// You'll need to edit the code from the CPU section.
const expanded = tf.expandDims(image, 0);
if (useCoralDelegate) {
  // CODELAB part 2: Run Coral prediction here.
} else {
  const divided = tf.div(expanded, tf.scalar(127));
  const normalized = tf.sub(divided, tf.scalar(1));
  stats.begin();
  const prediction = model.predict(normalized);
  stats.end();
  const percentage = tf.mul(prediction, tf.scalar(100));
  showPrediction(percentage.dataSync(), labels);
}

Chạy mô hình

Phiên bản San hô của mô hình dự kiến các tensor uint8 từ 0 đến 255, do đó, đầu vào của nó không cần được chuẩn hóa. Tuy nhiên, đầu ra cũng là một tensor uint8 trong khoảng từ 0 đến 255. Giá trị này cần được chuyển đổi thành số thực có độ chính xác đơn từ 0 đến 100 trước khi hiển thị.

CODELAB phần 2: Chạy dự đoán San hô tại đây. (Đây là một phần của đoạn mã ở trên)

stats.begin();
const prediction = coralModel.predict(expanded);
stats.end();
const percentage = tf.div(tf.mul(prediction, tf.scalar(100)), tf.scalar(255));
showPrediction(percentage.dataSync(), labels);

Chạy lại ứng dụng bằng yarn start và ứng dụng sẽ hiển thị thông tin phân loại từ trình tăng tốc mô phỏng san hô.

Các mô hình CPU và San hô lần lượt chạy trong ứng dụng và một nút sẽ chuyển đổi giữa hai mô hình. Mô hình CPU đạt khoảng 20 khung hình/giây và mô hình San hô nhận được khoảng 45.

Bạn có thể chuyển đổi giữa suy luận San hô và CPU bằng cách nhấn nút. Bạn có thể nhận thấy rằng thứ hạng tin cậy của mô hình San hô ít chính xác hơn so với mô hình CPU và thường kết thúc bằng chữ số thập phân chẵn. Sự mất độ chính xác này là sự đánh đổi khi chạy mô hình lượng tử hoá trên San hô. Thường thì điều này không quan trọng trong thực tế, nhưng bạn cần lưu ý.

Lưu ý về hiệu suất

Tốc độ khung hình mà bạn thấy bao gồm cả xử lý trước và xử lý hậu kỳ, vì vậy tốc độ này không thể hiện được khả năng của phần cứng San hô. Bạn có thể nắm rõ hơn về hiệu suất bằng cách nhấp vào đồng hồ FPS cho đến khi thấy độ trễ (tính bằng mili giây). Chỉ số này chỉ đo lường lệnh gọi đến model.predict. Tuy nhiên, điều đó vẫn bao gồm cả thời gian cần thiết để di chuyển Tensor sang các liên kết C gốc TFLite rồi đến thiết bị san hô, vì vậy đây không phải là một phép đo hoàn hảo. Để biết thêm thông tin chính xác về điểm chuẩn hiệu suất được viết bằng C++, hãy xem trang điểm chuẩn EdgeTPU.

Ngoài ra, xin lưu ý rằng video được quay trên máy tính xách tay thay vì Raspberry Pi, nên bạn có thể sẽ thấy một khung hình trên giây khác.

Đẩy nhanh quá trình xử lý san hô

Trong một số trường hợp, bạn có thể tăng tốc quá trình xử lý trước bằng cách chuyển đổi các phần phụ trợ TFJS. Phần phụ trợ mặc định là WebGL, phụ trợ phù hợp với các hoạt động lớn, có thể tải song song, nhưng ứng dụng này không làm được nhiều việc như vậy trong giai đoạn tiền xử lý (hoạt động duy nhất mà ứng dụng này sử dụng là expandDims, không song song). Bạn có thể chuyển sang phần phụ trợ CPU để tránh thêm độ trễ khi di chuyển tensor đến và đi từ GPU bằng cách thêm dòng này sau các lần nhập ở đầu tệp.

tf.setBackend(‘cpu');

Điều này cũng ảnh hưởng đến quá trình xử lý trước cho mô hình CPU TFLite được song song hoá, do đó mô hình đó sẽ chạy chậm hơn rất nhiều khi có thay đổi này.

6. Tăng tốc mô hình CPU bằng WebNN

Nếu không có trình tăng tốc CORAL hoặc nếu bạn chỉ muốn thử cách khác để tăng tốc mô hình, bạn có thể sử dụng trình uỷ quyền WebNN TFLite. Ủy quyền này sử dụng phần cứng học máy tích hợp trong bộ xử lý Intel để tăng tốc quá trình suy luận mô hình bằng bộ công cụ OpenVINO. Do đó, phiên bản này có các yêu cầu bổ sung không được đề cập trong phần thiết lập của lớp học lập trình này và bạn sẽ cần cài đặt bộ công cụ OpenVINO. Hãy nhớ kiểm tra chế độ thiết lập của bạn dựa trên Nền tảng hệ thống mục tiêu được hỗ trợ trước khi tiếp tục, nhưng lưu ý rằng uỷ quyền WebNN chưa hỗ trợ macOS.

Cài đặt bộ công cụ OpenVINO

Bộ công cụ OpenVINO sử dụng phần cứng học máy tích hợp sẵn trong bộ xử lý Intel để tăng tốc các mô hình. Bạn có thể tải một phiên bản được biên dịch trước xuống của Intel hoặc tạo phiên bản đó từ nguồn. Có một số cách cài đặt OpenVINO, nhưng để hoàn thành lớp học lập trình này, bạn nên sử dụng tập lệnh cài đặt cho Windows hoặc Linux. Hãy nhớ cài đặt phiên bản thời gian chạy LTS 2021.4.2, vì các phiên bản khác có thể không tương thích. Sau khi chạy trình cài đặt, hãy nhớ định cấu hình các biến môi trường của shell như mô tả trong hướng dẫn cài đặt dành cho Linux hoặc Windows ( giải pháp vĩnh viễn) hoặc bằng cách chạy lệnh setupvars.sh (Linux) hoặc setupvars.bat (Windows) nằm trong thư mục webnn-tflite-delegate.

Xác minh rằng tính năng Uỷ quyền WebNN đang hoạt động

Để xác minh rằng dịch vụ uỷ quyền WebNN đang hoạt động đúng cách, hãy chạy các bài kiểm thử tích hợp cho gói webnn-tflite-delegate có trong thư mục gốc của kho lưu trữ. Để chạy bài kiểm thử tích hợp, hãy chạy các lệnh sau trong thư mục của gói:

# In webnn-tflite-delegate/
npx yarn
npx yarn test-integration

Bạn sẽ thấy kết quả như sau:

WebNN delegate: WebNN device set to 0.
INFO: Created TensorFlow Lite WebNN delegate for device Default and power Default.

============================
Hi there 👋. Looks like you are running TensorFlow.js in Node.js. To speed things up dramatically, install our node backend, which binds to TensorFlow C++, by running npm i @tensorflow/tfjs-node, or npm i @tensorflow/tfjs-node-gpu if you have CUDA. Then call require('@tensorflow/tfjs-node'); (-gpu suffix for CUDA) at the start of your program. Visit https://github.com/tensorflow/tfjs-node for more details.
============================
label: wine bottle
score:  0.934505045413971
.


1 spec, 0 failures
Finished in 0.446 seconds
Randomized with seed 58441 (jasmine --random=true --seed=58441)
Done in 8.07s.

Nếu bạn thấy kết quả như sau, tức là đã xảy ra lỗi cấu hình:

Platform node has already been set. Overwriting the platform with node.
Randomized with seed 05938
Started
error Command failed with exit code 3221225477.
info Visit https://yarnpkg.com/en/docs/cli/run for documentation about this command.

Kết quả này rất có thể là bạn chưa đặt các biến môi trường của OpenVINO. Hiện tại, bạn có thể đặt các tuỳ chọn này bằng cách chạy lệnh setupvars.sh (Linux) hoặc setupvars.bat (Windows), nhưng bạn nên thiết lập vĩnh viễn bằng cách làm theo hướng dẫn dành cho Linux hoặc Windows ( giải pháp vĩnh viễn). Nếu đang sử dụng Windows,

setupvars.bat

lệnh không hỗ trợ Git bash, vì vậy hãy đảm bảo bạn chạy lệnh đó và các lệnh khác từ lớp học lập trình này qua dấu nhắc lệnh của Windows.

Cài đặt Uỷ quyền WebNN

Sau khi cài đặt OpenVINO, bạn đã sẵn sàng tăng tốc mô hình CPU bằng WebNN. Phần này của lớp học lập trình dựa trên mã mà bạn đã viết trong bài viết "Chạy mô hình CPU trong ứng dụng của bạn" . Bạn có thể sử dụng mã đã viết trong bước này, nhưng nếu bạn đã hoàn thành phần San hô, hãy sử dụng điểm kiểm tra cpu_inference_working để bạn bắt đầu với một phương tiện mới.

Phần Node.js trong thực thể đại diện WebNN được phân phối trên npmjs. Để cài đặt gói này, hãy chạy lệnh sau:

npm install --save webnn-tflite-delegate

Sau đó, nhập mã uỷ quyền bằng cách thêm dòng sau vào đầu tệp renderer.js:

CODELAB phần 2: Nhập lớp uỷ quyền tại đây.

const {WebNNDelegate, WebNNDevice} = require('webnn-tflite-delegate');

Uỷ quyền WebNN hỗ trợ chạy trên CPU hoặc GPU; WebNNDevice cho phép bạn chọn thiết bị để sử dụng.

Tải mô hình

Bây giờ, bạn đã sẵn sàng tải mô hình khi bật tính năng uỷ quyền WebNN. Đối với San hô, bạn phải tải một tệp mô hình khác, nhưng WebNN hỗ trợ cùng một định dạng mô hình như TFLite. Thêm WebNNDelegate vào danh sách người được uỷ quyền được truyền vào mô hình để bật tính năng này:

CODELAB phần 2: Tải mô hình uỷ quyền tại đây.

let webnnModel = await loadTFLiteModel(modelPath, {
  delegates: [new WebNNDelegate({webnnDevice: WebNNDevice.DEFAULT})],
});

Bạn không cần tải lại nhãn vì đây là cùng một mô hình.

Thêm một nút để chuyển đổi giữa TfLite CPU và WebNN

Hiện tại, phiên bản WebNN của mô hình đã sẵn sàng, hãy thêm một nút để chuyển đổi giữa dự đoán CPU WebNN và TfLite. Nếu chạy cả hai cùng lúc, bạn sẽ khó nhận thấy sự khác biệt về hiệu suất.

Thêm nút có mã này (lưu ý rằng nút này chưa thực sự chuyển đổi mô hình):

CODELAB phần 2: Tạo nút uỷ quyền tại đây.

let useWebNNDelegate = false;
const divElem = document.createElement('div');
const toggleWebNNButton = document.createElement('button');
function toggleWebNN() {
  useWebNNDelegate = !useWebNNDelegate;
  toggleWebNNButton.innerHTML = useWebNNDelegate
      ? 'Using WebNN. Press to switch to TFLite CPU.'
      : 'Using TFLite CPU. Press to switch to WebNN.';
  divElem.hidden = useWebNNDelegate ? false : true;
}

toggleWebNNButton.addEventListener('click', toggleWebNN);
toggleWebNN();
document.body.appendChild(toggleWebNNButton);
document.body.appendChild(divElem);

Mã này cũng thêm phần tử div mà bạn sử dụng để định cấu hình chế độ cài đặt WebNN trong phần tiếp theo.

Thêm trình đơn thả xuống để chuyển đổi giữa các thiết bị WebNN

WebNN hỗ trợ chạy trên CPU và GPU, vì vậy, hãy thêm một trình đơn thả xuống để chuyển đổi giữa hai loại CPU này. Thêm mã này sau đoạn mã tạo nút:

// Create elements for WebNN device selection
divElem.innerHTML = '<br/>WebNN Device: ';
const selectElem = document.createElement('select');
divElem.appendChild(selectElem);

const webnnDevices = ['Default', 'GPU', 'CPU'];
// append the options
for (let i = 0; i < webnnDevices.length; i++) {
  var optionElem = document.createElement('option');
  optionElem.value = i;
  optionElem.text = webnnDevices[i];
  selectElem.appendChild(optionElem);
}

Bây giờ, nếu chạy ứng dụng, bạn sẽ thấy một trình đơn thả xuống liệt kê Default, GPU và CPU. Hiện tại, bạn không cần phải chọn một trong hai lựa chọn này vì trình đơn thả xuống chưa kết nối. Ứng dụng hiển thị một trình đơn thả xuống để bạn có thể chọn thiết bị WebNN trong số Mặc định, GPU hoặc CPU.

Làm cho trình đơn thả xuống thay đổi thiết bị

Để kết nối trình đơn thả xuống nhằm thay đổi thiết bị WebNN được sử dụng, hãy thêm một trình nghe vào sự kiện thay đổi của phần tử bộ chọn thả xuống. Khi giá trị đã chọn thay đổi, hãy tạo lại mô hình WebNN bằng thiết bị WebNN tương ứng được chọn trong tuỳ chọn uỷ quyền.

Thêm mã sau đây vào sau đoạn mã đã thêm trình đơn thả xuống:

selectElem.addEventListener('change', async () => {
  let webnnDevice;
  switch(selectElem.value) {
    case '1':
      webnnDevice = WebNNDevice.GPU;
      break;
    case '2':
      webnnDevice = WebNNDevice.CPU;
      break;
    default:
      webnnDevice = WebNNDevice.DEFAULT;
      break;
  }
  webnnModel = await loadTFLiteModel(modelPath, {
    delegates: [new WebNNDelegate({webnnDevice})],
  });
});

Với thay đổi này, trình đơn thả xuống sẽ tạo một mô hình mới với các chế độ cài đặt chính xác mỗi khi bạn thay đổi. Đã đến lúc kết nối mô hình WebNN và sử dụng mô hình này để suy luận.

Chạy mô hình WebNN

Mô hình WebNN đã sẵn sàng cho bạn sử dụng, nhưng nút chuyển đổi giữa WebNN và CPU TfLite chưa thực sự chuyển đổi mô hình. Để chuyển đổi mô hình, trước tiên, bạn cần đổi tên biến model từ thời điểm tải mô hình CPU TfLite trong phần đầu tiên của lớp học lập trình này.

Thay đổi dòng sau...

const model = await loadTFLiteModel(modelPath);

...để khớp với dòng này.

const cpuModel = await loadTFLiteModel(modelPath);

Sau khi đổi tên biến model thành cpuModel, hãy thêm biến này vào hàm run để chọn đúng mô hình dựa trên trạng thái của nút:

CODELAB phần 2: Kiểm tra xem có sử dụng tính năng uỷ quyền tại đây hay không.

let model;
if (useWebNNDelegate) {
  model = webnnModel;
} else {
  model = cpuModel;
}

Giờ đây, khi bạn chạy ứng dụng, nút này sẽ chuyển đổi giữa TfLite CPU và WebNN. Mô hình CPU TFLite cũng như mô hình CPU và GPU WebNN chạy trong ứng dụng. Khi một trong các mô hình WebNN hoạt động, một trình đơn thả xuống sẽ chuyển đổi giữa các mô hình đó. Mô hình CPU nhận được khoảng 15 khung hình/giây và mô hình CPU WebNN nhận được khoảng 40.

Bạn cũng có thể chuyển đổi giữa suy luận GPU và CPU WebNN nếu có GPU Intel tích hợp.

Lưu ý về hiệu suất

Tốc độ khung hình mà bạn thấy bao gồm cả xử lý trước và xử lý hậu kỳ, vì vậy tốc độ này không thể hiện được khả năng của WebNN. Bạn có thể nắm rõ hơn về hiệu suất bằng cách nhấp vào đồng hồ FPS cho đến khi thấy độ trễ (tính bằng mili giây). Chỉ số này chỉ đo lường lệnh gọi đến model.predict. Tuy nhiên, điều đó vẫn bao gồm cả thời gian cần thiết để di chuyển Tensor sang các liên kết C gốc TFLite, vì vậy đây không phải là một phép đo hoàn hảo.

7. Xin chúc mừng

Xin chúc mừng! Bạn vừa hoàn thành dự án đầu tiên của mình trong dự án San hô / WebNN bằng tfjs-tflite-node trong Electron.

Hãy dùng thử và kiểm tra trên nhiều hình ảnh. Bạn cũng có thể huấn luyện một mô hình mới trên TeachableMachine để phân loại các mô hình hoàn toàn khác.

Tóm tắt

Trong lớp học lập trình này, bạn đã tìm hiểu:

  • Cách cài đặt và thiết lập gói npm tfjs-tflite-node để chạy các mô hình TFLite trong Node.js.
  • Cách cài đặt thư viện thời gian chạy TPU của Edge để chạy các mô hình trên thiết bị san hô.
  • Cách tăng tốc độ suy luận mô hình bằng cách sử dụng TPU cạnh san hô.
  • Cách tăng tốc độ suy luận mô hình bằng WebNN.

Tiếp theo là gì?

Giờ đây khi đã có nền tảng làm việc, bạn có thể nảy ra ý tưởng sáng tạo nào để đưa ứng dụng chạy mô hình học máy này vào trường hợp sử dụng thực tế mà bạn có thể đang nghiên cứu? Có thể bạn sẽ cách mạng hoá ngành mình làm việc bằng cách suy luận nhanh chóng với giá cả phải chăng, hoặc có thể bạn có thể điều chỉnh một chiếc máy nướng bánh mì để nó ngừng hoạt động khi bánh trông vừa phải. Có vô vàn hành động để bạn lựa chọn.

Để tìm hiểu thêm về cách TeachableMachine huấn luyện mô hình mà bạn đã sử dụng, hãy xem lớp học lập trình về Transfer Learning (Học chuyển dữ liệu). Nếu bạn đang tìm các mô hình khác hoạt động được với San hô, chẳng hạn như nhận dạng lời nói và ước tính tư thế, hãy truy cập vào coral.ai/models. Bạn cũng có thể tìm thấy phiên bản CPU của những mô hình đó và nhiều mô hình khác trên TensorFlow Hub.

Chia sẻ với chúng tôi về những video bạn làm ra

Bạn cũng có thể dễ dàng mở rộng những nội dung mình làm hôm nay cho các trường hợp sử dụng sáng tạo khác. Bạn cũng nên có tư duy sáng tạo và tiếp tục đột nhập.

Đừng quên gắn thẻ chúng tôi trên mạng xã hội bằng hashtag #MadeWithTFJS để có cơ hội xuất hiện nổi bật trên blog của TensorFlow hoặc thậm chí là các sự kiện trong tương lai. Chúng tôi rất muốn xem thành quả của bạn.

Trang web nên thanh toán