สร้าง TensorFlow Lite สำหรับ iOS

เอกสารนี้อธิบายวิธีสร้างไลบรารี 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 เป็นระบบบิลด์หลักสำหรับ TensorFlow ติดตั้ง Bazel ตาม คำแนะนำบนเว็บไซต์ Bazel ตรวจสอบให้แน่ใจว่าได้เลือกเวอร์ชันระหว่าง _TF_MIN_BAZEL_VERSION และ _TF_MAX_BAZEL_VERSION ใน ไฟล์ configure.py ที่รากของที่เก็บ tensorflow

กำหนดค่า WORKSPACE และ .bazelrc

เรียกใช้สคริปต์ ./configure ในไดเรกทอรีการชำระเงินรูท TensorFlow และตอบว่า "ใช่" เมื่อสคริปต์ถามว่าคุณต้องการสร้าง TensorFlow ด้วยการรองรับ iOS หรือไม่

เมื่อกำหนดค่า 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

คุณสามารถสร้างเฟรมเวิร์กที่มีขนาดเล็กลงโดยกำหนดเป้าหมายเฉพาะชุดโมเดลโดยใช้บิลด์แบบเลือกได้ ซึ่งจะข้ามการดำเนินการที่ไม่ได้ใช้ในชุดโมเดลของคุณ และรวมเฉพาะเคอร์เนล 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 สำหรับ TensorFlow Lite ในตัวและการดำเนินการที่กำหนดเอง หรือสร้างเฟรมเวิร์กแบบคงที่ bazel-bin/tensorflow/lite/ios/tmp/TensorFlowLiteSelectTfOps_framework.zip หากโมเดลของคุณมีตัวเลือก Select TensorFlow โปรดทราบว่าสามารถใช้แฟล็ก --target_archs เพื่อระบุสถาปัตยกรรมการปรับใช้ของคุณ

ใช้ในแอปพลิเคชันของคุณเอง

นักพัฒนา CocoaPods

CocoaPods สำหรับ TensorFlow Lite มีสามรายการ:

  • TensorFlowLiteSwift : จัดเตรียม Swift API สำหรับ TensorFlow Lite
  • TensorFlowLiteObjC : จัดเตรียม Objective-C API สำหรับ TensorFlow Lite
  • TensorFlowLiteC : พ็อดฐานทั่วไปซึ่งฝังรันไทม์หลัก TensorFlow Lite และเปิดเผย API C ฐานที่ใช้โดยสองพ็อดข้างต้น ไม่ได้มีไว้สำหรับผู้ใช้โดยตรง

ในฐานะนักพัฒนาซอฟต์แวร์ คุณควรเลือกพ็อด TensorFlowLiteSwift หรือ TensorFlowLiteObjC ตามภาษาที่แอปของคุณเขียน แต่ไม่ใช่ทั้งสองอย่าง ขั้นตอนที่แน่นอนสำหรับการใช้บิวด์ภายในของ TensorFlow Lite จะแตกต่างกันไป ขึ้นอยู่กับส่วนที่คุณต้องการสร้าง

การใช้ Swift หรือ Objective-C API ในเครื่อง

หากคุณใช้ CocoaPods และต้องการทดสอบการเปลี่ยนแปลงภายในเครื่องกับ Swift API หรือ Objective-C API ของ TensorFlow Lite เท่านั้น ให้ทำตามขั้นตอนที่นี่

  1. ทำการเปลี่ยนแปลง Swift หรือ Objective-C API ในการชำระเงินเท tensorflow ของคุณ

  2. เปิดไฟล์ TensorFlowLite(Swift|ObjC).podspec และอัปเดตบรรทัดนี้:
    s.dependency 'TensorFlowLiteC', "#{s.version}"
    เป็น:
    s.dependency 'TensorFlowLiteC', "~> 0.0.1-nightly"
    นี่เป็นเพื่อให้แน่ใจว่าคุณกำลังสร้าง Swift หรือ Objective-C API เทียบกับ TensorFlowLiteC API เวอร์ชันล่าสุดที่ให้บริการทุกคืน (สร้างทุกคืนระหว่างเวลา 01.00-04.00 น. ตามเวลาแปซิฟิก) แทนที่จะเป็นเวอร์ชันเสถียร ซึ่งอาจล้าสมัยเมื่อเทียบกับ tensorflow ในพื้นที่ของคุณ เช็คเอาท์. หรือคุณสามารถเลือกที่จะเผยแพร่ TensorFlowLiteC เวอร์ชันของคุณเองและใช้เวอร์ชันนั้นได้ (ดู การใช้ส่วนหลัก TensorFlow Lite ในเครื่อง ด้านล่าง)

  3. ใน Podfile ของโปรเจ็กต์ iOS ของคุณ ให้เปลี่ยนการขึ้นต่อกันดังต่อไปนี้เพื่อชี้ไปยังพาธในเครื่องไปยัง tensorflow โฟลว์ของคุณ
    สำหรับสวิฟท์:
    pod 'TensorFlowLiteSwift', :path => '<your_tensorflow_root_dir>'
    สำหรับวัตถุประสงค์-C:
    pod 'TensorFlowLiteObjC', :path => '<your_tensorflow_root_dir>'

  4. อัปเดตการติดตั้งพ็อดของคุณจากไดเรกทอรีรากของโปรเจ็กต์ iOS
    $ pod update

  5. เปิดพื้นที่ทำงานที่สร้างขึ้นใหม่ ( <project>.xcworkspace ) และสร้างแอปของคุณใหม่ภายใน Xcode

ใช้คอร์ TensorFlow Lite ในเครื่อง

คุณสามารถตั้งค่าพื้นที่เก็บข้อมูลข้อมูลจำเพาะ CocoaPods ส่วนตัว และเผยแพร่เฟรมเวิร์ก TensorFlowLiteC ที่คุณกำหนดเองไปยัง Repo ส่วนตัวของคุณได้ คุณสามารถคัดลอก ไฟล์ 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