สร้าง LiteRT สำหรับ iOS

เอกสารนี้อธิบายวิธีสร้างไลบรารี 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 ไหม การสนับสนุน

เมื่อกำหนดค่า 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 สำหรับ LiteRT
  • TensorFlowLiteObjC: มอบ Objective-C API สําหรับ LiteRT
  • TensorFlowLiteC: พ็อดฐานทั่วไปที่ฝังแกน LiteRT รันไทม์และแสดง API ฐาน C ที่พ็อดทั้ง 2 ด้านบนใช้ ไม่ได้ตั้งใจ ที่ผู้ใช้ใช้ได้โดยตรง

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

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

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

  1. ทำการเปลี่ยนแปลง API ของ Swift หรือ Objective-C ที่จุดชำระเงินของ 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 - 4:00 น. เวลาแปซิฟิก) ไม่ใช่แบบเสถียร ซึ่งอาจล้าสมัยเมื่อเทียบกับจุดชำระเงิน tensorflow ในท้องถิ่นของคุณ อีกทางเลือกหนึ่ง คุณสามารถเลือกเผยแพร่ TensorFlowLiteC และใช้เวอร์ชันนั้น (ดูการใช้ LiteRT ในเครื่อง Core ด้านล่าง)

  3. ใน Podfile ของโปรเจ็กต์ iOS ให้เปลี่ยนการอ้างอิงดังนี้เป็น ชี้ไปที่เส้นทางในเครื่องไปยังไดเรกทอรีราก tensorflow
    สำหรับ Swift:

    pod 'TensorFlowLiteSwift', :path => '<your_tensorflow_root_dir>' สำหรับ Objective-C:
    pod 'TensorFlowLiteObjC', :path => '<your_tensorflow_root_dir>'

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

  5. เปิดพื้นที่ทำงานที่สร้างขึ้นอีกครั้ง (<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