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.
Xây dựng khung động TensorFlowLiteC (nên dù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.
Chỉnh sửa API Swift hoặc Objective-C trong quy trình thanh toán
tensorflow
.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 APITensorFlowLiteC
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ántensorflow
tại địa phương. Ngoài ra, bạn có thể chọn phát hành phiên bảnTensorFlowLiteC
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).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ốctensorflow
.
Đối với Swift:
pod 'TensorFlowLiteSwift', :path => '<your_tensorflow_root_dir>'
Đối với Objective-C:
pod 'TensorFlowLiteObjC', :path => '<your_tensorflow_root_dir>'
Cập nhật chế độ cài đặt nhóm từ thư mục gốc của dự án iOS.
$ pod update
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
.