เข้าร่วม Women in ML Symposium ในวันที่ 7 ธันวาคม ลงทะเบียนตอนนี้

สร้าง 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

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 ของคุณ โดยค่าเริ่มต้น เฟรมเวิร์กที่สร้างขึ้นจะมีไบนารี "อ้วน" ซึ่งประกอบด้วย 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 ให้ทำตามขั้นตอนที่นี่

  1. ทำการเปลี่ยนแปลงกับ Swift หรือ Objective-C APIs ในการเช็คเอาต์ tensorflow ของคุณ

  2. เปิดไฟล์ 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 ในเครื่องด้านล่าง)

  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 แบบกำหนดเองของคุณไปยังที่เก็บส่วนตัวของคุณ คุณสามารถคัดลอก ไฟล์ 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