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 iOS. Thông thường, bạn không cần phải xây dựng cục bộ thư viện TensorFlow Lite iOS. Nếu bạn chỉ muốn sử dụng nó, cách dễ nhất là sử dụng các bản phát hành ổn định hàng đêm hoặc ổn định dựng sẵn của TensorFlow Lite CocoaPods. Xem phần khởi động nhanh iOS để biết thêm chi tiết về cách sử dụng chúng trong các dự án iOS của bạn.

Xây dựng tại địa phương

Trong một số trường hợp, bạn có thể muốn sử dụng 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à kiểm tra những thay đổi đó trong ứng dụng iOS của mình hoặc bạn thích sử dụng khung tĩnh hơn khung động được cung cấp của chúng tôi. Để tạo cục bộ một khung iOS phổ biến cho TensorFlow Lite, bạn cần xây dựng nó bằng Bazel trên máy macOS.

Cài đặt Xcode

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

xcode-select --install

Nếu đây là bản cài đặt mới, bạn sẽ cần chấp nhận thỏa 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 Bazel . Đảm bảo chọn phiên bản giữa _TF_MIN_BAZEL_VERSION_TF_MAX_BAZEL_VERSION trong tệp configure.py ở thư mục 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 kiểm tra TensorFlow gốc và trả lời "Có" khi tập lệnh hỏi bạn có muốn xây dựng TensorFlow với sự hỗ trợ của iOS hay không.

Sau khi Bazel được định cấu hình đúng cách với sự hỗ trợ của iOS, bạn có thể xây dựng 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 của bạn. Theo mặc định, khung được tạo chứa nhị phân "béo", chứa armv7, arm64 và x86_64 (nhưng không có i386). Để xem danh sách đầy đủ các cờ xây 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 Cocoapod. Nếu muốn sử dụng khung tĩnh thay thế, bạn có thể xây dựng 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 sẽ tạo một tệp có tên TensorFlowLiteC_static_framework.zip trong thư mục bazel-bin/tensorflow/lite/ios/ trong thư mục gốc TensorFlow của bạn. Khung tĩnh này có thể được sử dụng theo cách giống hệt như khung động.

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

Bạn có thể xây dựng các khung 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 bản dựng chọn lọc, điều này sẽ bỏ qua các hoạt động không được sử dụng trong tập hợp mô hình của bạn và chỉ bao gồm các hạt nhân op cần thiết để chạy tập hợp mô hình nhất định. Lệnh 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 tùy chỉnh và tích hợp sẵn của TensorFlow Lite; và tùy ý tạo khung tĩnh bazel-bin/tensorflow/lite/ios/tmp/TensorFlowLiteSelectTfOps_framework.zip nếu mô hình của bạn chứa các hoạt động Chọn TensorFlow. Lưu ý rằng cờ --target_archs có thể được sử dụng để chỉ định kiến ​​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ển CocoaPods

Có ba CocoaPod dành cho TensorFlow Lite:

  • TensorFlowLiteSwift : Cung cấp API Swift cho TensorFlow Lite.
  • TensorFlowLiteObjC : Cung cấp 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ở được sử dụng bởi hai nhóm trên. Không có nghĩa là được sử dụng trực tiếp bởi người dùng.

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ữ mà ứng dụng của bạn được viết 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, tùy thuộc vào phần chính xác mà bạn muốn xây dựng.

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. Thực hiện các thay đổi đối với API Swift hoặc Objective-C trong quá trình kiểm tra tensorflow của bạn.

  2. Mở tệp TensorFlowLite(Swift|ObjC).podspec và cập nhật dòng này:
    s.dependency 'TensorFlowLiteC', "#{s.version}"
    được:
    s.dependency 'TensorFlowLiteC', "~> 0.0.1-nightly"
    Điều này là để đảm bảo rằng bạn đang xây dựng API Swift hoặc Objective-C của mình dựa trên phiên bản API TensorFlowLiteC hàng đêm mới nhất (được xây dựng hàng đê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 tensorflow cục bộ của bạn Thủ tục thanh toán. Ngoài ra, bạn có thể chọn xuất bản 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 của bạn, hãy thay đổi phần phụ thuộc như sau để trỏ đến đường dẫn cục bộ tới thư mục gốc tensorflow của bạn.
    Đối với Swift:
    pod 'TensorFlowLiteSwift', :path => '<your_tensorflow_root_dir>'
    Đối với Mục tiêu-C:
    pod 'TensorFlowLiteObjC', :path => '<your_tensorflow_root_dir>'

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

  5. Mở lại không gian làm việc đã tạo ( <project>.xcworkspace ) và xây dựng lại ứng dụng của bạn 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à xuất bản khung TensorFlowLiteC tùy chỉnh lên kho lưu trữ riêng tư của mình. 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 để sử dụng nó 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 tùy chỉnh của mình và sử dụng nhóm Swift hoặc Objective-C trong dự án ứng dụng của bạn.

Nhà phát triển Bazel

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

Đố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 xây dựng dự án ứng dụng của mình, 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 của bạn.

Sửa đổi trực tiếp 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 sẽ cần thêm khung TensorFlowLiteC làm khung 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 thư mục TensorFlowLiteC.framework . Thư mục này là framework thực tế mà Xcode có thể hiểu được.

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

  • Xcode 11: Chuyển đến tab '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 phần 'Khung, Thư viện và Nội dung nhúng'.
  • Xcode 10 trở xuống: Chuyển đến tab '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 'Các tệp nhị phân được nhúng'. Khung cũng phải được thêm tự động trong phần 'Thư viện và khung được liên kết'.

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

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