เอกสารนี้อธิบายวิธีสร้างไลบรารี LiteRT สําหรับ iOS ด้วยตนเอง โดยปกติ คุณไม่จำเป็นต้องสร้างไลบรารี LiteRT iOS ในเครื่อง หากคุณ แค่อยากใช้เท่านั้น วิธีที่ง่ายที่สุดคือการใช้เวอร์ชันเสถียรที่สร้างไว้ล่วงหน้าหรือต่อคืน รุ่นต่างๆ ของ LiteRT CocoaPods โปรดดู iOS คู่มือเริ่มใช้งานฉบับย่อ เพื่อดูรายละเอียดเพิ่มเติมเกี่ยวกับวิธีใช้ใน iOS โปรเจ็กต์
สร้างในเครื่อง
ในบางกรณี คุณอาจต้องใช้ LiteRT บิลด์ในเครื่องสำหรับ เช่น เมื่อต้องการทำการเปลี่ยนแปลงในเครื่องกับ LiteRT และทดสอบ การเปลี่ยนแปลงในแอป iOS หรือคุณต้องการใช้กรอบงานแบบคงที่ตามที่เราจัดเตรียมไว้ให้ แบบไดนามิก วิธีสร้างเฟรมเวิร์ก iOS สากลสำหรับ LiteRT ภายในเครื่อง คุณต้องสร้างแอปโดยใช้ Bazel ในเครื่อง macOS
ติดตั้ง Xcode
คุณจะต้องติดตั้ง Xcode 8 หรือรุ่นที่ใหม่กว่า และเครื่องมือต่างๆ หากยังไม่ได้ติดตั้ง
โดยใช้ xcode-select
:
xcode-select --install
หากเป็นการติดตั้งใหม่ คุณจะต้องยอมรับข้อตกลงการอนุญาตให้ใช้สิทธิทั้งหมด ผู้ใช้ที่มีคำสั่งต่อไปนี้
sudo xcodebuild -license accept
ติดตั้ง Bazel
Bazel เป็นระบบบิลด์หลักสำหรับ TensorFlow ติดตั้ง Bazel ตาม
ในเว็บไซต์ Bazel อย่าลืมเลือก
เวอร์ชันระหว่าง _TF_MIN_BAZEL_VERSION
ถึง _TF_MAX_BAZEL_VERSION
ใน
configure.py
ไฟล์ที่รูทของที่เก็บ tensorflow
กำหนดค่า WORKSPACE และ .bazelrc
เรียกใช้สคริปต์ ./configure
ในไดเรกทอรีการชำระเงินของ TensorFlow รูท และ
ตอบว่า "ใช่" เมื่อสคริปต์ถามว่าคุณต้องการสร้าง TensorFlow ด้วย iOS ไหม
การสนับสนุน
สร้างเฟรมเวิร์กแบบไดนามิกของ TensorFlowLiteC (แนะนำ)
เมื่อกำหนดค่า Bazel ด้วยการสนับสนุน iOS อย่างถูกต้องแล้ว คุณสามารถสร้าง
TensorFlowLiteC
ที่มีคำสั่งต่อไปนี้
bazel build --config=ios_fat -c opt --cxxopt=--std=c++17 \
//tensorflow/lite/ios:TensorFlowLiteC_framework
คำสั่งนี้จะสร้างไฟล์ TensorFlowLiteC_framework.zip
ภายใต้
ไดเรกทอรี bazel-bin/tensorflow/lite/ios/
ภายใต้ไดเรกทอรีรูทของ TensorFlow
โดยค่าเริ่มต้น เฟรมเวิร์กที่สร้างขึ้นจะมี "fat" ไบนารีที่มี armv7
arm64 และ x86_64 (แต่ไม่มี i386) ดูรายการแฟล็กบิลด์ทั้งหมดที่ใช้เมื่อ
คุณระบุ --config=ios_fat
โปรดดูส่วนการกำหนดค่า iOS ใน
.bazelrc
ไฟล์
สร้างเฟรมเวิร์กแบบคงที่ของ TensorFlowLiteC
โดยค่าเริ่มต้น เราจะเผยแพร่เฟรมเวิร์กแบบไดนามิกผ่าน CocoaPods เท่านั้น หากคุณต้องการ
ให้ใช้เฟรมเวิร์กแบบคงที่แทน คุณสามารถสร้าง TensorFlowLiteC
แบบคงที่
ที่มีคำสั่งต่อไปนี้
bazel build --config=ios_fat -c opt --cxxopt=--std=c++17 \
//tensorflow/lite/ios:TensorFlowLiteC_static_framework
คำสั่งจะสร้างไฟล์ชื่อ TensorFlowLiteC_static_framework.zip
ภายใต้ไดเรกทอรี bazel-bin/tensorflow/lite/ios/
ใต้ราก TensorFlow ของคุณ
ไดเรกทอรี เฟรมเวิร์กแบบคงที่นี้สามารถใช้ในลักษณะเดียวกับ
แบบไดนามิก
เลือกสร้างเฟรมเวิร์ก TFLite
คุณสามารถสร้างเฟรมเวิร์กขนาดเล็กซึ่งกำหนดเป้าหมายเฉพาะชุดโมเดลได้โดยใช้ สร้างได้ ซึ่งจะข้ามการดำเนินการที่ไม่ได้ใช้ในชุดโมเดลของคุณ และจะรวมเฉพาะ เคอร์เนล Opera เพื่อเรียกใช้ชุดของโมเดลที่ระบุ คำสั่งมีดังนี้
bash tensorflow/lite/ios/build_frameworks.sh \
--input_models=model1.tflite,model2.tflite \
--target_archs=x86_64,armv7,arm64
คำสั่งด้านบนจะสร้างเฟรมเวิร์กแบบคงที่
bazel-bin/tensorflow/lite/ios/tmp/TensorFlowLiteC_framework.zip
สำหรับ TensorFlow
Lite ในตัวและฟีเจอร์ปฏิบัติการที่กำหนดเอง และเลือกสร้างเฟรมเวิร์กแบบคงที่
bazel-bin/tensorflow/lite/ios/tmp/TensorFlowLiteSelectTfOps_framework.zip
หาก
โมเดลของคุณมีการดำเนินการ Select TensorFlow โปรดทราบว่าแฟล็ก --target_archs
เพื่อระบุสถาปัตยกรรมการทำให้ใช้งานได้
ใช้ในแอปพลิเคชันของคุณเอง
นักพัฒนาแอป CocoaPods
CocoaPods สำหรับ LiteRT มี 3 แบบ ได้แก่
TensorFlowLiteSwift
: มี Swift API สำหรับ LiteRTTensorFlowLiteObjC
: มอบ Objective-C API สําหรับ LiteRTTensorFlowLiteC
: พ็อดฐานทั่วไปที่ฝังแกน LiteRT รันไทม์และแสดง API ฐาน C ที่พ็อดทั้ง 2 ด้านบนใช้ ไม่ได้ตั้งใจ ที่ผู้ใช้ใช้ได้โดยตรง
ในฐานะนักพัฒนาซอฟต์แวร์ คุณควรเลือก TensorFlowLiteSwift
หรือ
TensorFlowLiteObjC
พ็อดตามภาษาที่ใช้เขียนแอป แต่
ไม่ใช่ทั้ง 2 อย่าง ขั้นตอนทั้งหมดสำหรับการใช้บิลด์ในเครื่องของ LiteRT จะแตกต่างกันไป
ขึ้นอยู่กับส่วนที่คุณต้องการสร้าง
การใช้ Swift หรือ Objective-C API ในเครื่อง
หากคุณใช้ CocoaPods และต้องการทดสอบการเปลี่ยนแปลงบางอย่างในเครื่องเท่านั้น Swift API หรือ Objective-C API ของ LiteRT ให้ทำตามขั้นตอนที่นี่
ทำการเปลี่ยนแปลง API ของ Swift หรือ Objective-C ที่จุดชำระเงินของ
tensorflow
เปิดไฟล์
TensorFlowLite(Swift|ObjC).podspec
และอัปเดตบรรทัดนี้:
s.dependency 'TensorFlowLiteC', "#{s.version}"
เป็น:
s.dependency 'TensorFlowLiteC', "~> 0.0.1-nightly"
การดำเนินการนี้มีขึ้นเพื่อสร้าง Swift หรือ Objective-C API เทียบกับTensorFlowLiteC
API เวอร์ชันกลางคืนล่าสุดที่มีให้บริการ (สร้างทุกคืนระหว่างเวลา 01:00 - 4:00 น. เวลาแปซิฟิก) ไม่ใช่แบบเสถียร ซึ่งอาจล้าสมัยเมื่อเทียบกับจุดชำระเงินtensorflow
ในท้องถิ่นของคุณ อีกทางเลือกหนึ่ง คุณสามารถเลือกเผยแพร่TensorFlowLiteC
และใช้เวอร์ชันนั้น (ดูการใช้ LiteRT ในเครื่อง Core ด้านล่าง)ใน
Podfile
ของโปรเจ็กต์ iOS ให้เปลี่ยนการอ้างอิงดังนี้เป็น ชี้ไปที่เส้นทางในเครื่องไปยังไดเรกทอรีรากtensorflow
สำหรับ Swift:
pod 'TensorFlowLiteSwift', :path => '<your_tensorflow_root_dir>'
สำหรับ Objective-C:
pod 'TensorFlowLiteObjC', :path => '<your_tensorflow_root_dir>'
อัปเดตการติดตั้งพ็อดจากไดเรกทอรีรากของโปรเจ็กต์ iOS
$ pod update
เปิดพื้นที่ทำงานที่สร้างขึ้นอีกครั้ง (
<project>.xcworkspace
) และสร้างพื้นที่ทำงาน ภายใน Xcode
การใช้ LiteRT Core ในเครื่อง
คุณสามารถตั้งค่าที่เก็บข้อกำหนดของ CocoaPods แบบส่วนตัวและเผยแพร่
เฟรมเวิร์ก TensorFlowLiteC
ไปยังที่เก็บส่วนตัวของคุณ คุณคัดลอก podspec นี้ได้
ไฟล์ แล้วแก้ไขค่าดังนี้
...
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'
...
หลังจากสร้างไฟล์ TensorFlowLiteC.podspec
ของคุณเองแล้ว คุณสามารถทำตาม
คำแนะนำในการใช้ CocoaPods แบบส่วนตัวเพื่อใช้ใน
ของตัวเอง คุณยังสามารถแก้ไข TensorFlowLite(Swift|ObjC).podspec
เป็น
ชี้ไปที่พ็อด TensorFlowLiteC
ที่กำหนดเองแล้วใช้ Swift หรือ Objective-C
ในโปรเจ็กต์แอปของคุณ
นักพัฒนา Bazel
ถ้าคุณใช้ Bazel เป็นเครื่องมือสร้างหลัก ก็แค่เพิ่ม
การอ้างอิง TensorFlowLite
ไปยังเป้าหมายในไฟล์ BUILD
สำหรับ Swift:
swift_library(
deps = [
"//tensorflow/lite/swift:TensorFlowLite",
],
)
สำหรับ Objective-C
objc_library(
deps = [
"//tensorflow/lite/objc:TensorFlowLite",
],
)
เมื่อคุณสร้างโปรเจ็กต์แอป การเปลี่ยนแปลงใดก็ตามในไลบรารี LiteRT จะ ถูกหยิบยกไปใส่ในแอป
แก้ไขการตั้งค่าโปรเจ็กต์ Xcode โดยตรง
เราขอแนะนำอย่างยิ่งให้ใช้ CocoaPods หรือ Bazel ในการเพิ่ม LiteRT
ที่พึ่งพิงในโปรเจ็กต์ของคุณ หากคุณยังคงต้องการเพิ่ม TensorFlowLiteC
ด้วยตนเอง คุณจะต้องเพิ่มเฟรมเวิร์ก TensorFlowLiteC
ลงใน
เฟรมเวิร์กของแอปพลิเคชันที่ฝังไว้ แตกไฟล์
TensorFlowLiteC_framework.zip
ที่สร้างขึ้นจากบิลด์ด้านบนเพื่อรับ
ไดเรกทอรี TensorFlowLiteC.framework
ไดเรกทอรีนี้เป็นเฟรมเวิร์กจริง
ที่ Xcode เข้าใจได้
เมื่อคุณจัดเตรียม TensorFlowLiteC.framework
แล้ว คุณจะต้องเพิ่มหมวดหมู่ก่อน
เป็นไบนารีแบบฝังให้กับเป้าหมายของแอป ส่วนการตั้งค่าโปรเจ็กต์ที่แน่นอนสำหรับ
ซึ่งอาจแตกต่างกันไปตามเวอร์ชันของ Xcode
- Xcode 11: ไปที่ "General" ของเครื่องมือแก้ไขโปรเจ็กต์สำหรับเป้าหมายแอป
และเพิ่ม
TensorFlowLiteC.framework
ในส่วน "เฟรมเวิร์ก ไลบรารี และ เนื้อหาที่ฝัง - Xcode 10 และต่ำกว่า: ไปที่ "General" ของเครื่องมือแก้ไขโปรเจ็กต์
เป้าหมายของแอป และเพิ่ม
TensorFlowLiteC.framework
ในส่วน "ฝัง" ไบนารี" ควรเพิ่มเฟรมเวิร์กโดยอัตโนมัติในส่วน "ลิงก์แล้ว เฟรมเวิร์กและไลบรารี
เมื่อคุณเพิ่มเฟรมเวิร์กเป็นไบนารีที่ฝัง Xcode จะอัปเดต
"เส้นทางการค้นหาเฟรมเวิร์ก" รายการภายใต้ 'การตั้งค่าการสร้าง' แท็บเพื่อรวมรายการหลัก
ของเฟรมเวิร์กของคุณ ในกรณีที่เหตุการณ์นี้จะไม่เกิดขึ้นโดยอัตโนมัติ คุณ
ควรเพิ่มไดเรกทอรีหลักของ TensorFlowLiteC.framework
ด้วยตนเอง
ไดเรกทอรี
เมื่อตั้งค่าสองอย่างนี้แล้ว คุณจะสามารถนำเข้าและเรียกใช้
C API ของ LiteRT กำหนดโดยไฟล์ส่วนหัวภายใต้
ไดเรกทอรี TensorFlowLiteC.framework/Headers