Bộ kiểm thử tăng tốc LiteRT (ATS)

Bộ kiểm thử trình tăng tốc LiteRT (ATS) là một công cụ toàn diện được dùng để xác thực tính chính xác về chức năng và đo lường hiệu suất của các hoạt động triển khai trình tăng tốc tuỳ chỉnh được tích hợp với khung LiteRT.

Tổng quan và chức năng cốt lõi

Chức năng chính của ATS là thực thi các mô hình học máy được xác định trước dựa trên một trình tăng tốc mục tiêu và so sánh kết quả với phần phụ trợ CPU tiêu chuẩn LiteRT.

  • Xác thực: Bộ này thực hiện xác thực số bằng cách so sánh các tensor đầu ra (hoạt động) do trình tăng tốc tạo ra với các tensor do phần phụ trợ CPU đã biết tạo ra. Điều này đảm bảo việc triển khai bộ tăng tốc duy trì độ chính xác và tính chính xác cần thiết.
  • Chỉ số hiệu suất: Tự động ghi lại và thu thập các thông tin chi tiết quan trọng về hiệu suất, bao gồm cả độ trễ và các chỉ số liên quan khác mà người dùng có thể truy cập.
  • Thực thi: Các kiểm thử thường được thực thi trên một thiết bị mục tiêu (ví dụ: điện thoại Android) và được quản lý bằng một trình bao tập lệnh shell xử lý việc chuyển tệp và thiết lập bằng công cụ adb (Cầu gỡ lỗi Android).

Dữ liệu kiểm thử (Mô hình)

Bộ ATS sử dụng một tập hợp .tflite mô hình được dùng rộng rãi làm dữ liệu kiểm thử. Dữ liệu đầu vào được tạo ngẫu nhiên dựa trên kiểu dữ liệu và có thể được gieo hạt khi cần.

Các mẫu được bao gồm

Các mô hình sau đây sẽ tự động được đưa vào và tải xuống để kiểm thử (có thể thay đổi):

  • hf_all_minilm_l6_v2
  • hf_mobilevit_small
  • qai_hub_midas
  • qai_hub_real_esrgan_x4plus
  • torchvision_mobilenet_v2
  • torchvision_resnet18
  • torchvision_squeezenet1_1
  • u2net_lite
  • whisper_tiny_decoder
  • whisper_tiny_encoder
  • yamnet
  • yolo11n

Truy xuất mô hình theo cách thủ công

Mặc dù các mô hình được tự động tải xuống trong bazel run, nhưng bạn có thể truy xuất toàn bộ bộ mô hình theo cách thủ công bằng cách sử dụng wget:

wget -p -O <target_file> https://storage.googleapis.com/litert/ats_models.tar.gz

Xác định một ATS Suite bằng Bazel

Sử dụng macro litert_define_ats Bazel để định cấu hình và xác định mục tiêu kiểm thử ATS dành riêng cho trình tăng tốc của họ.

Macro này tự động tạo hai mục tiêu có thể chạy:

  1. Thử nghiệm JIT trên thiết bị tiêu chuẩn (để thực thi và xác thực).
  2. Một thử nghiệm chế độ "chỉ biên dịch" AOT chuyên dụng (để biên dịch máy chủ).

Ví dụ về cách sử dụng litert_define_ats

Ví dụ này xác định một bộ ATS có tên là example_ats cho một trình tăng tốc có tên phụ trợ là example:

# Emits aot-mode and jit-mode test targets, one for running compilation test on host
# and another for running JIT and inference on device
# These targets are named with their respective suffix attribute.
litert_define_ats(
    name = "example_ats",
    backend = "example",
    compile_only_suffix = "_aot",
    do_register = [
        "*mobilenet*",
    ],
    extra_flags = ["--limit=1"],
    jit_suffix = "",
)

Thực thi

Để thực thi kiểm thử tiêu chuẩn nhắm đến Android (xử lý mọi thao tác adb):

# Handles environment setup, and build + push of library and data dependencies to the device,
# executes the suite on the target.
bazel run -c opt --config=android_arm64 :example_ats

Cách thực thi kiểm thử biên dịch AOT:

# Handle environment setup, and builds library dependencies for host platform.
# Executes the ats compile only flow. The "--compile_mode" flag is already
# bound to the program arguments.
bazel run :example_ats_aot

Thực thi Linux (Máy chủ)

Đối với quá trình thực thi Linux, khi ATS đang chạy trên cùng một máy thực hiện bản dựng, người dùng sẽ cần sử dụng trực tiếp tệp nhị phân :ats:

bazel run -c opt :ats

Thực thi IoT

Để thực thi IoT, người dùng sẽ cần tạo tệp nhị phân trên máy chủ lưu trữ và đẩy tệp đó vào thiết bị của họ theo cách thủ công.

Cờ hiệu dòng lệnh

Tệp thực thi ats chấp nhận một số cờ để kiểm soát chi tiết quá trình kiểm thử và báo cáo.

Cờ Loại Mô tả
--backend std::string Bắt buộc. Sử dụng phần phụ trợ LiteRT nào làm trình tăng tốc trong quá trình kiểm thử ("thực tế"). Các lựa chọn là cpu, npu hoặc gpu.
--compile_mode bool Nếu đúng, hãy chạy bước biên dịch AOT trên máy trạm thay vì thực thi trên thiết bị. LƯU Ý: lựa chọn này được tự động liên kết với mục tiêu bản dựng "aot" và không cần được đặt một cách rõ ràng.
--models_out std::string Đường dẫn thư mục nơi các mô hình được tuần tự hoá (được biên dịch) có hiệu ứng phụ được lưu. Chỉ áp dụng cho quá trình biên dịch AOT hoặc JIT.
--dispatch_dir std::string Đường dẫn đến thư mục chứa thư viện điều phối của trình tăng tốc (phù hợp với NPU).
--plugin_dir std::string Đường dẫn đến thư mục chứa thư viện trình bổ trợ trình biên dịch của trình tăng tốc (phù hợp với NPU).
--soc_manufacturer std::string Nhà sản xuất SOC cần nhắm đến để biên dịch AOT (phù hợp với việc biên dịch NPU).
--soc_model std::string Mô hình SOC để nhắm đến quá trình biên dịch AOT (phù hợp với quá trình biên dịch NPU).
--iters_per_test size_t Số lần lặp lại để chạy cho mỗi kiểm thử, mỗi lần có dữ liệu tensor ngẫu nhiên khác nhau.
--max_ms_per_test int64_t Thời gian tối đa (tính bằng mili giây) để chạy mỗi kiểm thử trước khi hết thời gian chờ.
--fail_on_timeout bool Liệu kiểm thử có thất bại nếu quá trình thực thi hết thời gian chờ hay không.
--csv std::string Đường dẫn tệp để lưu báo cáo chi tiết ở định dạng CSV.
--dump_report bool Có nên kết xuất toàn bộ thông tin chi tiết của báo cáo trực tiếp vào đầu ra của bảng điều khiển người dùng hay không.
--data_seed std::optional<int> Một giá trị ban đầu duy nhất để tạo dữ liệu trên toàn cầu.
--do_register std::vector<std::string> (Các) biểu thức chính quy để đưa các kiểm thử cụ thể vào một cách rõ ràng (ví dụ: *mobilenet*).
--dont_register std::vector<std::string> Biểu thức chính quy để loại trừ các kiểm thử cụ thể.
--extra_models std::vector<std::string> Danh sách không bắt buộc gồm các thư mục hoặc tệp mô hình cần thêm vào bộ kiểm thử.
--limit int32_t Giới hạn tổng số thử nghiệm đã đăng ký và chạy.
--quiet bool Giảm thiểu đầu ra ghi nhật ký trong quá trình chạy thử nghiệm.

Sử dụng các tiện ích xây dựng litert_device_script cho ATS

Các mục tiêu ATS mà người dùng thực thi tự động bao gồm một điểm nhập shell xử lý tất cả các chế độ thiết lập môi trường và mọi hoạt động đẩy các thư viện bắt buộc khi thiết bị mục tiêu khác với máy chủ lưu trữ mà bản dựng đã hoàn tất (ví dụ: adb push).

Chức năng này được cung cấp chung thông qua các tiện ích litert_device_script mà các bản dựng ATS sử dụng nâng cao. Các đơn vị tăng tốc phải thực hiện quy trình đăng ký để sử dụng chức năng tạo bản dựng này. Ngoài việc hỗ trợ ats, bạn có thể sử dụng các tiện ích này một cách độc lập để mô phỏng cc_binarycc_test nhằm thực thi trên một thiết bị khác với máy chủ lưu trữ bản dựng yêu cầu các phần phụ thuộc được đẩy.

Đăng ký phụ trợ

Để cho phép sử dụng một trình tăng tốc mới với litert_device_script (và do đó là ATS), các thư viện bắt buộc của trình tăng tốc đó phải được đăng ký trong tệp litert_device_common.bzl Bazel. Quy trình đăng ký dựa trên một tên"phần phụ trợ" duy nhất, liên kết với một nhóm thư viện có thể tạo hoặc được biên dịch sẵn cần thiết để LiteRT hoạt động với trình tăng tốc đó.

Các bước đăng ký

  1. Xác định hàm BackendSpec: Tạo một hàm trả về từ điển chứa thông số kỹ thuật của trình tăng tốc mới.

  2. Chỉ định thư viện (libs): Đây là danh sách các bộ dữ liệu trình bày chi tiết đường dẫn mục tiêu Bazel cho thư viện dùng chung và biến môi trường (LD_LIBRARY_PATH) mà trình liên kết thiết bị cần để tìm thấy thư viện đó.

    • Thư viện Dispatch: Bắt buộc để thực thi thời gian chạy.
    • Thư viện trình bổ trợ trình biên dịch: Bắt buộc đối với chế độ biên dịch AOT.
  3. Chỉ định tên thư viện (plugin, dispatch): Cung cấp tên tệp của trình bổ trợ và thư viện điều phối.

  4. Đăng ký Spec: Hợp nhất hàm spec mới vào hàm _Specs chính để cung cấp hàm này theo mã nhận dạng phụ trợ duy nhất.

Ví dụ về quy trình đăng ký (_ExampleSpec)

Đoạn mã sau đây từ litert_device_common.bzl minh hoạ cách đăng ký phím tắt "example":

def _ExampleSpec():
    return {
        # The unique backend ID
        "example": BackendSpec(
            id = "example",
            libs = [
                # Dispatch Library and how to find it on device
                ("//third_party/odml/litert/litert/vendors/examples:libLiteRtDispatch_Example.so", "LD_LIBRARY_PATH"),
                # Compiler Plugin Library
                ("//third_party/odml/litert/litert/vendors/examples:libLiteRtCompilerPlugin_Example.so", "LD_LIBRARY_PATH"),
            ],
            plugin = "libLiteRtCompilerPlugin_Example.so",
            dispatch = "libLiteRtDispatch_Example.so",
        ),
    }

# ... (Other specs are defined here)

def _Specs(name):
    # Your new spec function must be included here
    return (_QualcommSpec() | _GoogleTensorSpec() | _MediatekSpec() | _CpuSpec() | _GpuSpec() | _ExampleSpec())[name]

Tận dụng tính năng Đăng ký bằng litert_device_exec

Sau khi đăng ký, hãy sử dụng litert_device_exec và các macro liên quan với backend_id mới. Macro này tự động kết hợp các thư viện bắt buộc và mọi tệp dữ liệu được chỉ định với tệp nhị phân đích.

cc_binary(
    name = "example_bin",
    srcs = ["example_bin.cc"],
)

litert_device_exec(
    name = "example_bin_device",
    backend_id = "example",  # Uses the libraries registered under "example"
    data = [
        "//third_party/odml/litert/litert/test:testdata/constant_output_tensor.tflite",
    ],
    target = ":example_bin",
)

Việc chạy mục tiêu này (bazel run ... :example_bin_device) sẽ:

  1. Tạo tệp nhị phân example_bin C++.
  2. Đẩy tệp nhị phân, libLiteRtDispatch_Example.so, libLiteRtCompilerPlugin_Example.so.tflite vào thiết bị.
  3. Thực thi tệp nhị phân bằng cách sử dụng adb shell.

Lưu ý về đường dẫn thiết bị: Vị trí chuẩn cho các tệp trên thiết bị phản ánh cây runfile của Bazel, cụ thể là /data/local/tmp/runfiles/runfiles_relative_path. Tập lệnh thiết bị sẽ tự động xử lý việc thiết lập các đường dẫn thích hợp cho trình liên kết động.

Chế độ biên dịch (AOT)

Đối với những bộ tăng tốc hỗ trợ bước biên dịch trước khi thực thi (AOT), ATS có thể được thực thi ở "chế độ biên dịch" chuyên dụng.

  • Mục đích: Chế độ này được thiết kế để chạy trên một máy trạm (máy chủ), chứ không phải thiết bị mục tiêu. Thao tác này sẽ biên dịch các mô hình cho phần cứng mục tiêu đã chỉ định mà không thực thi chúng.
  • Đầu ra: Tất cả các mô hình đã biên dịch đều được xuất ra một thư mục được chỉ định trên máy trạm.
  • Kích hoạt: Các macro bản dựng ATS sẽ phát ra một mục tiêu cụ thể cho aot, trong đó các thư viện được tạo cho nền tảng lưu trữ. Bạn có thể bật quy trình này trên mọi tệp nhị phân bằng cờ --compile_mode, nhưng quy trình này sẽ tự động liên kết với các đối số của bản dựng aot.

Kế hoạch mở rộng trong tương lai

Bộ kiểm thử này dự kiến sẽ được mở rộng để bao gồm các bài kiểm thử chuyên biệt cho các thao tác (ops) riêng lẻ, ngoài các mô hình đầy đủ.