เอกสารนี้อธิบายวิธีสร้างไลบรารี TensorFlow Lite iOS ด้วยตัวคุณเอง โดยปกติ คุณไม่จำเป็นต้องสร้างไลบรารี TensorFlow Lite iOS ในเครื่อง หากคุณต้องการใช้งาน วิธีที่ง่ายที่สุดคือการใช้ TensorFlow Lite CocoaPods ที่เสถียรหรือเผยแพร่ทุกคืน ดู iOS การเริ่มต้นอย่างรวดเร็ว สำหรับรายละเอียดเพิ่มเติมเกี่ยวกับวิธีการใช้งานในโครงการ iOS ของคุณ
สร้างในประเทศ
ในบางกรณี คุณอาจต้องการใช้ TensorFlow Lite บิวด์ในเครื่อง เช่น เมื่อคุณต้องการทำการเปลี่ยนแปลงในเครื่องกับ TensorFlow Lite และทดสอบการเปลี่ยนแปลงเหล่านั้นในแอป iOS ของคุณ หรือคุณต้องการใช้เฟรมเวิร์กสแตติกกับไดนามิกที่เราให้มา ในการสร้างเฟรมเวิร์ก iOS สากลสำหรับ TensorFlow Lite ในเครื่อง คุณต้องสร้างโดยใช้ 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 ของคุณ โดยค่าเริ่มต้น เฟรมเวิร์กที่สร้างขึ้นจะมีไบนารี "อ้วน" ซึ่งประกอบด้วย 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 frameworks
คุณสามารถสร้างเฟรมเวิร์กที่มีขนาดเล็กลงโดยกำหนดเป้าหมายเฉพาะชุดโมเดลโดยใช้การบิลด์แบบเลือก ซึ่งจะข้ามการดำเนินการที่ไม่ได้ใช้ในชุดโมเดลของคุณและรวมเฉพาะเคอร์เนล op ที่จำเป็นในการรันชุดโมเดลที่กำหนด คำสั่งดังต่อไปนี้:
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
สำหรับ ops ในตัวและแบบกำหนดเองของ TensorFlow Lite และสร้างเฟรมเวิร์กแบบคงที่ bazel-bin/tensorflow/lite/ios/tmp/TensorFlowLiteSelectTfOps_framework.zip
หากโมเดลของคุณมี Select TensorFlow ops โปรดทราบว่าแฟ --target_archs
สามารถใช้เพื่อระบุสถาปัตยกรรมการปรับใช้ของคุณ
ใช้ในแอปพลิเคชันของคุณเอง
นักพัฒนา CocoaPods
CocoaPods สามตัวสำหรับ TensorFlow Lite:
-
TensorFlowLiteSwift
: จัดเตรียม Swift API สำหรับ TensorFlow Lite -
TensorFlowLiteObjC
: จัดเตรียม Objective-C API สำหรับ TensorFlow Lite -
TensorFlowLiteC
: พ็อดฐานทั่วไป ซึ่งฝังรันไทม์หลักของ TensorFlow Lite และเปิดเผย C API พื้นฐานที่ใช้โดยพ็อดสองตัวข้างต้น ไม่ได้ตั้งใจให้ผู้ใช้ใช้โดยตรง
ในฐานะนักพัฒนา คุณควรเลือกพ็อด TensorFlowLiteSwift
หรือ TensorFlowLiteObjC
ตามภาษาที่แอปของคุณเขียน แต่ไม่ใช่ทั้งสองอย่าง ขั้นตอนที่แน่นอนสำหรับการใช้บิลด์ TensorFlow Lite ในพื้นที่นั้นแตกต่างกันไป ขึ้นอยู่กับว่าคุณต้องการสร้างส่วนใด
การใช้ Swift หรือ Objective-C API ในพื้นที่
หากคุณกำลังใช้ CocoaPods และต้องการทดสอบการเปลี่ยนแปลงในเครื่องบางอย่างกับ Swift APIs หรือ Objective-C API ของ TensorFlow Lite ให้ทำตามขั้นตอนที่นี่
ทำการเปลี่ยนแปลงกับ Swift หรือ Objective-C APIs ในการเช็คเอาต์
tensorflow
ของคุณเปิดไฟล์
TensorFlowLite(Swift|ObjC).podspec
และอัปเดตบรรทัดนี้:
s.dependency 'TensorFlowLiteC', "#{s.version}"
เป็น:
s.dependency 'TensorFlowLiteC', "~> 0.0.1-nightly"
ทั้งนี้เพื่อให้แน่ใจว่าคุณกำลังสร้าง API ของ Swift หรือ Objective-C เทียบกับTensorFlowLiteC
API เวอร์ชันกลางคืนล่าสุดที่มีให้บริการ (สร้างทุกคืนระหว่างเวลา 1-4 น. ตามเวลาแปซิฟิก) แทนที่จะเป็นเวอร์ชันเสถียร ซึ่งอาจล้าสมัยเมื่อเทียบกับtensorflow
ในพื้นที่ของคุณ เช็คเอาท์. อีกทางหนึ่ง คุณสามารถเลือกเผยแพร่TensorFlowLiteC
เวอร์ชันของคุณเองและใช้เวอร์ชันนั้น (ดูหัวข้อ การใช้ TensorFlow Lite core ในเครื่องด้านล่าง)ใน
Podfile
ของโปรเจ็กต์ iOS ของคุณ ให้เปลี่ยนการพึ่งพาดังต่อไปนี้เพื่อชี้ไปที่พาธในเครื่องไปยังtensorflow
รากของเทนเซอร์โฟลว์ของคุณ
สำหรับสวิฟท์:
pod 'TensorFlowLiteSwift', :path => '<your_tensorflow_root_dir>'
สำหรับวัตถุประสงค์-C:
pod 'TensorFlowLiteObjC', :path => '<your_tensorflow_root_dir>'
อัปเดตการติดตั้งพ็อดจากไดเรกทอรีรากของโปรเจ็กต์ iOS
$ pod update
เปิดพื้นที่ทำงานที่สร้างขึ้นอีกครั้ง (
<project>.xcworkspace
) และสร้างแอปของคุณใหม่ภายใน Xcode
การใช้แกน TensorFlow Lite ในพื้นที่
คุณสามารถตั้งค่าที่เก็บข้อมูลจำเพาะ 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_library(
deps = [
"//tensorflow/lite/swift:TensorFlowLite",
],
)
สำหรับวัตถุประสงค์-C:
objc_library(
deps = [
"//tensorflow/lite/objc:TensorFlowLite",
],
)
เมื่อคุณสร้างโปรเจ็กต์แอป การเปลี่ยนแปลงใดๆ ในไลบรารี TensorFlow Lite จะถูกเลือกและสร้างไว้ในแอปของคุณ
แก้ไขการตั้งค่าโปรเจ็กต์ Xcode โดยตรง
ขอแนะนำอย่างยิ่งให้ใช้ CocoaPods หรือ Bazel เพื่อเพิ่มการพึ่งพา TensorFlow Lite ในโครงการของคุณ หากคุณยังคงต้องการเพิ่มเฟรมเวิ TensorFlowLiteC
ด้วยตนเอง คุณจะต้องเพิ่มเฟรมเวิ TensorFlowLiteC
เป็นเฟรมเวิร์กแบบฝังในโปรเจ็กต์แอปพลิเคชันของคุณ เปิดเครื่องรูด TensorFlowLiteC_framework.zip
ที่สร้างจากบิลด์ด้านบนเพื่อรับไดเร็กทอรี TensorFlowLiteC.framework
ไดเร็กทอรีนี้เป็นเฟรมเวิร์กจริงที่ Xcode สามารถเข้าใจได้
เมื่อคุณเตรียม TensorFlowLiteC.framework
แล้ว ขั้นแรกคุณต้องเพิ่มเป็นไบนารีแบบฝังลงในเป้าหมายแอปของคุณ ส่วนการตั้งค่าโปรเจ็กต์ที่แน่นอนสำหรับสิ่งนี้อาจแตกต่างกันไปตามเวอร์ชัน Xcode ของคุณ
- Xcode 11: ไปที่แท็บ 'ทั่วไป' ของตัวแก้ไขโปรเจ็กต์สำหรับเป้าหมายแอปของคุณ และเพิ่ม
TensorFlowLiteC.framework
ในส่วน 'Frameworks, Libraries และ Embedded Content' - Xcode 10 หรือต่ำกว่า: ไปที่แท็บ 'ทั่วไป' ของตัวแก้ไขโปรเจ็กต์สำหรับเป้าหมายแอปของคุณ และเพิ่ม
TensorFlowLiteC.framework
ภายใต้ 'Embedded Binaries' กรอบงานควรถูกเพิ่มโดยอัตโนมัติภายใต้ส่วน 'กรอบงานและไลบรารีที่เชื่อมโยง'
เมื่อคุณเพิ่มเฟรมเวิร์กเป็นไบนารีแบบฝัง Xcode จะอัปเดตรายการ 'เส้นทางการค้นหาเฟรมเวิร์ก' ใต้แท็บ 'การตั้งค่าการสร้าง' เพื่อรวมไดเร็กทอรีพาเรนต์ของเฟรมเวิร์กของคุณ ในกรณีที่ไม่เกิดขึ้นโดยอัตโนมัติ คุณควรเพิ่มไดเร็กทอรีพาเรนต์ของไดเร็กทอรี TensorFlowLiteC.framework
ด้วยตนเอง
เมื่อการตั้งค่าทั้งสองนี้เสร็จสิ้น คุณควรจะสามารถนำเข้าและเรียกใช้ C API ของ TensorFlow Lite ซึ่งกำหนดโดยไฟล์ส่วนหัวภายใต้ TensorFlowLiteC.framework/Headers