Xây dựng TensorFlow Lite cho iOS

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

Xây dựng ở địa phương

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

Cài đặt Xcode

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

xcode-select --install

Nếu đây là một lượt cài đặt mới, bạn 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 nằm trong khoảng 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 xây dựng TensorFlow có hỗ trợ iOS hay không.

Sau khi định cấu hình Bazel đúng cách bằng 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/ thuộc thư mục gốc TensorFlow. Theo mặc định, khung được tạo sẽ chứa một tệp nhị phân "chất béo", chứa armv7, arm64 và x86_64 (nhưng không có i386). Để xem danh sách đầy đủ các cờ bản dựng được sử 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 động thông qua CocoaPods. Nếu muốn dùng khung tĩnh, bạn có thể tạo khung tĩnh TensorFlowLiteC 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 trong thư mục bazel-bin/tensorflow/lite/ios/ thuộc thư mục gốc TensorFlow. Bạn có thể sử dụng khung tĩnh này theo cách tương tự như khung động.

Tạo khung TFLite có chọn lọc

Bạn có thể tạo các khung nhỏ hơn chỉ nhắm đến một tập hợp mô hình bằng cách sử dụng bản dựng có chọn lọc. Thao tác này sẽ bỏ qua các thao tác không dùng đến trong tập hợp mô hình và chỉ bao gồm các nhân điều hành cần thiết để chạy tập hợp mô hình nhất định. 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 các hoạt động tuỳ chỉnh và tích hợp sẵn của TensorFlow Lite; và cũng có thể 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 chứa các hoạt động Chọn TensorFlow. Xin lưu ý rằng bạn có thể dùng cờ --target_archs để chỉ định cấu trúc triển khai.

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

Nhà phát triển CocoaPods

Có 3 loại CocoaPods cho TensorFlow Lite:

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

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

Sử dụng API Swift hoặc Objective-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 Objective-C của TensorFlow Lite, hãy làm theo các bước tại đây.

  1. Chỉnh sửa API Swift hoặc Objective-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}"
    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 API Swift hoặc Objective-C dựa trên phiên bản API TensorFlowLiteC có sẵn hằng đêm mới nhất (được tạo mỗi đêm trong khoảng thời gian từ 1 đến 4 giờ sáng theo giờ Thái Bình Dương) thay vì phiên bản ổn định có thể đã lỗi thời so với quy trình thanh toán tensorflow tại địa phương. Ngoài ra, bạn có thể chọn phát hành phiên bản TensorFlowLiteC của riêng mình và sử dụng phiên bản đó (xem phần Sử dụng lõi TensorFlow Lite cục bộ bên dưới).

  3. Trong Podfile của dự án iOS, hãy thay đổi phần phụ thuộc như sau để trỏ đến đường dẫn cục bộ đến thư mục gốc tensorflow.
    Đối với Swift:
    pod 'TensorFlowLiteSwift', :path => '<your_tensorflow_root_dir>'
    Đối với Objective-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à tạo lại ứng dụng trong Xcode.

Sử dụng lõi TensorFlow Lite cục bộ

Bạn có thể thiết lập kho lưu trữ thông số kỹ thuật CocoaPods riêng tư và phát hành khung TensorFlowLiteC tuỳ chỉnh lên kho lưu trữ riêng tư. Bạn có thể sao chép tệ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 về cách sử dụng CocoaPods riêng tư để sử dụng tệp đó trong dự án của riêng bạn. Bạn cũng có thể sửa đổi TensorFlowLite(Swift|ObjC).podspec để trỏ đến nhóm TensorFlowLiteC tuỳ chỉnh và sử dụng nhóm Swift hoặc Objective-C trong dự án ứng dụng.

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ào mục tiêu trong tệp BUILD.

Đối với Swift:

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

Đối với Objective-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 TensorFlow Lite sẽ được chọn và tích hợp vào ứng dụng.

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

Bạn nên sử dụng CocoaPods hoặc Bazel để thêm phần phụ thuộc TensorFlow Lite vào dự án của mình. Nếu vẫn muốn thêm khung TensorFlowLiteC theo cách thủ công, bạn cần thêm khung TensorFlowLiteC dưới dạng một khung được nhúng vào dự án ứng dụng. Giải nén TensorFlowLiteC_framework.zip được tạo từ bản dựng ở trên để lấy 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 tệp này dưới dạng tệp nhị phân được nhúng vào mục tiêu ứng dụng. Mục cài đặt dự án chính xác cho phần 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 thẻ "General" (Chung) 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 mục "Frameworks, Libraries and Embedded Content" (Nội dung được nhúng và Khung).
  • Xcode 10 trở xuống: Chuyển đến thẻ "General" (Chung) của trình chỉnh sửa dự án cho mục tiêu ứng dụng của bạn và thêm TensorFlowLiteC.framework trong mục "EmbeddedBinaries". Khung này cũng sẽ được thêm tự động trong phần "Khung hình và thư viện được liên kết".

Khi bạn thêm khung này dưới dạng một tệp nhị phân được nhúng, Xcode cũng sẽ cập nhật mục "Framework Search nước" (Đường dẫn tìm kiếm khung) trong thẻ "Build Settings" (Cài đặt bản dựng) để thêm thư mục mẹ của khung. Trong trường hợp việc này không tự động xảy ra, bạn nên thêm thư mục mẹ của thư mục TensorFlowLiteC.framework theo cách thủ công.

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