Xây dựng LiteRT cho iOS

Tài liệu này mô tả cách tự xây dựng thư viện LiteRT iOS. Thông thường, bạn không cần xây dựng cục bộ thư viện LiteRT iOS. Nếu bạn chỉ muốn sử dụng nó, cách dễ nhất là sử dụng định dạng ổn định được tạo sẵn hoặc chạy vào ban đêm bản phát hành LiteRT CocoaPods. Xem iOS bắt đầu nhanh để biết thêm chi tiết về cách sử dụng chúng trong iOS của bạn dự án.

Xây dựng cục bộ

Trong một số trường hợp, bạn có thể muốn sử dụng bản dựng LiteRT cục bộ để ví dụ: khi bạn muốn thực hiện các thay đổi cục bộ đối với LiteRT và thử nghiệm các thay đổi đó trong ứng dụng iOS của bạn hoặc bạn muốn sử dụng khung tĩnh so với linh động. Để tạo một khung iOS chung cho LiteRT cục bộ, bạn cần tạo ứng dụng bằng Bazel trên máy macOS.

Cài đặt Xcode

Bạn cần cài đặt Xcode 8 trở lên và các công cụ nếu chưa cài đặt sử dụng xcode-select:

xcode-select --install

Nếu đây là lượt cài đặt mới, bạn sẽ cần chấp nhận thoả thuận cấp phép cho tất cả người dùng bằng lệnh sau:

sudo xcodebuild -license accept

Cài đặt Bazel

Bazel là hệ thống xây dựng chính cho TensorFlow. Cài đặt Bazel theo hướng dẫn trên trang web của Bazel. Hãy nhớ chọn một phiên bản từ _TF_MIN_BAZEL_VERSION đến _TF_MAX_BAZEL_VERSION trong Tệp configure.py ở gốc của kho lưu trữ tensorflow.

Định cấu hình WORKSPACE và .bazelrc

Chạy tập lệnh ./configure trong thư mục thanh toán gốc của TensorFlow, và trả lời "Có" khi tập lệnh hỏi bạn có muốn tạo TensorFlow bằng iOS không của Google.

Sau khi Bazel được định cấu hình đúng cách với tính năng hỗ trợ iOS, bạn có thể tạo khung TensorFlowLiteC bằng lệnh sau.

bazel build --config=ios_fat -c opt --cxxopt=--std=c++17 \
  //tensorflow/lite/ios:TensorFlowLiteC_framework

Lệnh này sẽ tạo tệp TensorFlowLiteC_framework.zip trong Thư mục bazel-bin/tensorflow/lite/ios/ trong thư mục gốc TensorFlow. Theo mặc định, khung được tạo sẽ chứa thành phần "béo" tệp nhị phân, chứa armv7, arm64 và x86_64 (nhưng không có i386). Cách xem danh sách đầy đủ các cờ bản dựng được dùng khi bạn chỉ định --config=ios_fat, vui lòng tham khảo phần cấu hình iOS trong Tệp .bazelrc.

Xây dựng khung tĩnh TensorFlowLiteC

Theo mặc định, chúng tôi chỉ phân phối khung linh động thông qua Cocoapods. Nếu bạn muốn Để sử dụng khung tĩnh, bạn có thể tạo khung hình ảnh tĩnh TensorFlowLiteC khung bằng lệnh sau:

bazel build --config=ios_fat -c opt --cxxopt=--std=c++17 \
  //tensorflow/lite/ios:TensorFlowLiteC_static_framework

Lệnh này sẽ tạo một tệp có tên TensorFlowLiteC_static_framework.zip thuộc thư mục bazel-bin/tensorflow/lite/ios/ thuộc thư mục gốc TensorFlow thư mục. Khung tĩnh này có thể được sử dụng theo cách chính xác như linh động.

Xây dựng các khung TFLite một cách có chọn lọc

Bạn có thể xây dựng các khung làm việc nhỏ hơn chỉ nhắm mục tiêu đến một tập hợp mô hình bằng cách sử dụng các phương pháp Bản dựng này sẽ bỏ qua các thao tác không được sử dụng trong tập hợp mô hình và chỉ bao gồm hạt nhân hoạt động cần thiết để chạy tập hợp mô hình đã cho. Lệnh này có dạng như sau:

bash tensorflow/lite/ios/build_frameworks.sh \
  --input_models=model1.tflite,model2.tflite \
  --target_archs=x86_64,armv7,arm64

Lệnh trên sẽ tạo khung tĩnh bazel-bin/tensorflow/lite/ios/tmp/TensorFlowLiteC_framework.zip cho TensorFlow Hoạt động tuỳ chỉnh và tích hợp sẵn Lite; và tuỳ ý tạo khung tĩnh bazel-bin/tensorflow/lite/ios/tmp/TensorFlowLiteSelectTfOps_framework.zip nếu các mô hình của bạn có chứa Chọn hoạt động TensorFlow. Xin lưu ý rằng cờ --target_archs có thể được sử dụng để chỉ định cấu trúc triển khai của bạn.

Sử dụng trong ứng dụng của riêng bạn

Nhà phát triểncocoaPods

Có 3 CocoaPods cho LiteRT:

  • TensorFlowLiteSwift: Cung cấp các API Swift cho LiteRT.
  • TensorFlowLiteObjC: Cung cấp các API Mục tiêu-C cho LiteRT.
  • TensorFlowLiteC: Nhóm cơ sở phổ biến, nhúng lõi LiteRT thời gian chạy và hiển thị các API C cơ sở được 2 nhóm ở trên sử dụng. Không dành cho được người dùng trực tiếp sử dụng.

Là nhà phát triển, bạn nên chọn TensorFlowLiteSwift hoặc TensorFlowLiteObjC nhóm dựa trên ngôn ngữ mà ứng dụng của bạn được viết, nhưng chứ không phải cả hai. Các bước chính xác để sử dụng bản dựng cục bộ của LiteRT sẽ khác nhau tuỳ thuộc vào phần chính xác bạn muốn xây dựng.

Sử dụng API Swift hoặc Target-C cục bộ

Nếu bạn đang sử dụng CocoaPods và chỉ muốn thử nghiệm một số thay đổi cục bộ đối với API Swift hoặc API Target-C của LiteRT, hãy làm theo các bước tại đây.

  1. Thực hiện thay đổi đối với API Swift hoặc GOAL-C trong quy trình thanh toán tensorflow.

  2. Mở tệp TensorFlowLite(Swift|ObjC).podspec và cập nhật dòng này:

    s.dependency 'TensorFlowLiteC', "#{s.version}" trở thành:

    s.dependency 'TensorFlowLiteC', "~> 0.0.1-nightly" Việc này nhằm đảm bảo rằng bạn đang xây dựng các API Swift hoặc Target-C dựa trên phiên bản API TensorFlowLiteC hoạt động hằng đêm mới nhất hiện có (được tạo mỗi đêm từ 1 đến 4 giờ sáng theo Giờ Thái Bình Dương) thay vì phiên bản này có thể đã lỗi thời so với quy trình thanh toán cục bộ của bạn tensorflow. Ngoài ra, bạn có thể chọn xuất bản phiên bản TensorFlowLiteC và sử dụng phiên bản đó (xem phần Sử dụng LiteRT cục bộ phần cốt lõi ở bên dưới).

  3. Trong Podfile của dự án iOS, hãy thay đổi phần phụ thuộc như sau thành trỏ đến đường dẫn cục bộ đến thư mục gốc tensorflow của bạn.
    Đối với Swift:

    pod 'TensorFlowLiteSwift', :path => '<your_tensorflow_root_dir>' Đối với Đối tượng C:
    pod 'TensorFlowLiteObjC', :path => '<your_tensorflow_root_dir>'

  4. Cập nhật chế độ cài đặt nhóm từ thư mục gốc của dự án iOS.
    $ pod update

  5. Mở lại không gian làm việc đã tạo (<project>.xcworkspace) và thiết kế lại ứng dụng của bạn trong Xcode.

Sử dụng lõi LiteRT cục bộ

Bạn có thể thiết lập kho lưu trữ riêng thông số kỹ thuật của CocoaPods và xuất bản TensorFlowLiteC vào kho lưu trữ riêng tư của bạn. Bạn có thể sao chép podspec này và sửa đổi một vài giá trị:

  ...
  s.version      = <your_desired_version_tag>
  ...
  # Note the `///`, two from the `file://` and one from the `/path`.
  s.source       = { :http => "file:///path/to/TensorFlowLiteC_framework.zip" }
  ...
  s.vendored_frameworks = 'TensorFlowLiteC.framework'
  ...

Sau khi tạo tệp TensorFlowLiteC.podspec của riêng mình, bạn có thể làm theo hướng dẫn cách sử dụng CocoaPods riêng tư để sử dụng tính năng này trong dự án của riêng bạn. Bạn cũng có thể sửa đổi TensorFlowLite(Swift|ObjC).podspec thành trỏ đến nhóm TensorFlowLiteC tuỳ chỉnh và sử dụng Swift hoặc Mục tiêu-C pod trong dự án ứng dụng của bạn.

Nhà phát triển Bazel

Nếu đang sử dụng Bazel làm công cụ xây dựng chính, bạn chỉ cần thêm Phần phụ thuộc TensorFlowLite với mục tiêu trong tệp BUILD.

Đối với Swift:

swift_library(
  deps = [
      "//tensorflow/lite/swift:TensorFlowLite",
  ],
)

Đối với Mục tiêu-C:

objc_library(
  deps = [
      "//tensorflow/lite/objc:TensorFlowLite",
  ],
)

Khi bạn tạo dự án ứng dụng, mọi thay đổi đối với thư viện LiteRT sẽ được chọn và tích hợp vào ứng dụng của bạn.

Sửa đổi trực tiếp các chế độ cài đặt dự án Xcode

Bạn nên sử dụng CocoaPods hoặc Bazel để thêm LiteRT vào dự án của bạn. Nếu bạn vẫn muốn thêm TensorFlowLiteC khung theo cách thủ công, bạn sẽ cần thêm khung TensorFlowLiteC làm khung được nhúng vào dự án ứng dụng của mình. Giải nén TensorFlowLiteC_framework.zip được tạo từ bản dựng ở trên để lấy giá trị Thư mục TensorFlowLiteC.framework. Thư mục này là khung thực tế mà Xcode có thể hiểu được.

Sau khi chuẩn bị TensorFlowLiteC.framework, trước tiên, bạn cần thêm thẻ này dưới dạng tệp nhị phân được nhúng vào mục tiêu ứng dụng của bạn. Phần cài đặt dự án chính xác cho quá trình này có thể khác nhau tuỳ thuộc vào phiên bản Xcode của bạn.

  • Xcode 11: Chuyển đến trang 'Chung' tab của trình chỉnh sửa dự án cho mục tiêu ứng dụng của bạn, rồi thêm TensorFlowLiteC.framework trong phần 'Frameworks, Libraries, and Nội dung được nhúng .
  • Xcode 10 trở xuống: Chuyển đến trang "Chung" trong trình chỉnh sửa dự án cho mục tiêu ứng dụng và thêm TensorFlowLiteC.framework trong 'Được nhúng nhị phân'. Khung này cũng sẽ được tự động thêm vào trong mục "Đã liên kết" Khung và thư viện .

Khi bạn thêm khung này làm tệp nhị phân được nhúng, Xcode cũng sẽ cập nhật "Đường dẫn tìm kiếm khung" mục nhập trong 'Cài đặt bản dựng' để bao gồm phần tử mẹ của khung. Trong trường hợp điều này không tự động xảy ra, bạn phải tự thêm thư mục mẹ của TensorFlowLiteC.framework thư mục.

Sau khi hoàn tất hai chế độ cài đặt này, bạn có thể nhập và gọi hàm C API của LiteRT, được xác định bởi các tệp tiêu đề trong Thư mục TensorFlowLiteC.framework/Headers.