1. ภาพรวม
เป้าหมาย
Firebase ML ช่วยให้คุณสามารถปรับใช้โมเดลของคุณแบบ over-the-air วิธีนี้ช่วยให้คุณรักษาขนาดแอปให้เล็กและดาวน์โหลดโมเดล ML เมื่อจำเป็นเท่านั้น ทดลองกับหลายโมเดล หรืออัปเดตโมเดล ML โดยไม่ต้องเผยแพร่ทั้งแอปอีกครั้ง
ใน Codelab นี้ คุณจะแปลงแอป iOS โดยใช้โมเดล TFLite แบบคงที่ให้เป็นแอปโดยใช้โมเดลที่ให้บริการแบบไดนามิกจาก Firebase คุณจะได้เรียนรู้วิธีการ:
- ปรับใช้โมเดล TFLite กับ Firebase ML และเข้าถึงได้จากแอปของคุณ
- บันทึกตัวชี้วัดที่เกี่ยวข้องกับโมเดลด้วย Analytics
- เลือกรุ่นที่จะโหลดผ่าน Remote Config
- ทดสอบ A/B รุ่นต่างๆ
ข้อกำหนดเบื้องต้น
ก่อนที่จะเริ่ม Codelab นี้ ตรวจสอบให้แน่ใจว่าคุณได้ติดตั้ง:
- Xcode 11 (หรือสูงกว่า)
- CocoaPods 1.9.1 (หรือสูงกว่า)
2. สร้างโครงการคอนโซล Firebase
เพิ่ม Firebase ให้กับโปรเจ็กต์
- ไปที่ คอนโซล Firebase
- เลือก สร้างโปรเจ็กต์ใหม่ แล้วตั้งชื่อโปรเจ็กต์ของคุณ "Firebase ML iOS Codelab"
3. รับโครงการตัวอย่าง
ดาวน์โหลดรหัส
เริ่มต้นด้วยการโคลนโปรเจ็กต์ตัวอย่างและรัน pod update
ในไดเร็กทอรีโปรเจ็กต์:
git clone https://github.com/FirebaseExtended/codelab-digitclassifier-ios.git cd codelab-digitclassifier-ios pod install --repo-update
หากคุณไม่ได้ติดตั้ง git คุณสามารถดาวน์โหลดโปรเจ็กต์ตัวอย่างได้จากหน้า GitHub หรือคลิกที่ ลิงก์นี้ เมื่อคุณดาวน์โหลดโปรเจ็กต์แล้ว ให้รันใน Xcode และลองใช้ตัวแยกประเภทหลักเพื่อดูว่ามันทำงานอย่างไร
ตั้งค่า Firebase
ทำตาม เอกสารประกอบ เพื่อสร้างโปรเจ็กต์ Firebase ใหม่ เมื่อคุณมีโปรเจ็กต์แล้ว ให้ดาวน์โหลดไฟล์ GoogleService-Info.plist
ของโปรเจ็กต์จาก คอนโซล Firebase แล้วลากไปที่รูทของโปรเจ็กต์ Xcode
เพิ่ม Firebase ลงใน Podfile ของคุณและรันการติดตั้ง pod
pod 'FirebaseMLModelDownloader', '9.3.0-beta'
ในเมธอด didFinishLaunchingWithOptions
ของ AppDelegate
ให้นำเข้า Firebase ที่ด้านบนของไฟล์
import FirebaseCore
และเพิ่มการเรียกเพื่อกำหนดค่า Firebase
FirebaseApp.configure()
รันโปรเจ็กต์อีกครั้งเพื่อให้แน่ใจว่าแอปได้รับการกำหนดค่าอย่างถูกต้องและไม่ขัดข้องเมื่อเปิดใช้งาน
4. ปรับใช้โมเดลกับ Firebase ML
การปรับใช้โมเดลกับ Firebase ML มีประโยชน์ด้วยเหตุผลสองประการ:
- เราสามารถทำให้ขนาดการติดตั้งแอปมีขนาดเล็ก และดาวน์โหลดโมเดลเฉพาะเมื่อจำเป็นเท่านั้น
- โมเดลสามารถอัปเดตได้เป็นประจำและมีรอบการเผยแพร่ที่แตกต่างจากทั้งแอป
ก่อนที่เราจะสามารถแทนที่โมเดลแบบคงที่ในแอปของเราด้วยโมเดลที่ดาวน์โหลดแบบไดนามิกจาก Firebase เราจำเป็นต้องปรับใช้โมเดลดังกล่าวกับ Firebase ML โมเดลสามารถติดตั้งใช้งานได้ผ่านคอนโซลหรือโดยทางโปรแกรมโดยใช้ Firebase Admin SDK ในขั้นตอนนี้ เราจะปรับใช้ผ่านคอนโซล
เพื่อให้ทุกอย่างง่ายขึ้น เราจะใช้โมเดล TensorFlow Lite ที่มีอยู่ในแอปของเราอยู่แล้ว ขั้นแรก เปิด Firebase แล้วคลิก Machine Learning ในแผงการนำทางด้านซ้าย จากนั้นไปที่ "กำหนดเอง" และคลิกที่ปุ่ม "เพิ่มโมเดล"
เมื่อได้รับแจ้ง ให้ตั้งชื่อที่สื่อความหมายแก่โมเดล เช่น mnist_v1
และอัปโหลดไฟล์จากไดเร็กทอรีโปรเจ็กต์ Codelab
5. ดาวน์โหลดโมเดลจาก Firebase ML
การเลือกเวลาที่จะดาวน์โหลดโมเดลระยะไกลจาก Firebase ลงในแอปของคุณอาจเป็นเรื่องยุ่งยาก เนื่องจากโมเดล TFLite สามารถขยายได้ค่อนข้างใหญ่ ตามหลักการแล้ว เราต้องการหลีกเลี่ยงการโหลดโมเดลทันทีเมื่อแอปเปิดตัว เนื่องจากหากโมเดลของเราใช้สำหรับฟีเจอร์เดียวเท่านั้น และผู้ใช้ไม่เคยใช้ฟีเจอร์นั้น เราจะดาวน์โหลดข้อมูลจำนวนมากโดยไม่มีเหตุผล นอกจากนี้เรายังสามารถตั้งค่าตัวเลือกการดาวน์โหลด เช่น การดึงข้อมูลเฉพาะรุ่นเมื่อเชื่อมต่อกับ wifi หากคุณต้องการให้แน่ใจว่าโมเดลดังกล่าวพร้อมใช้งานแม้ว่าจะไม่ได้เชื่อมต่อเครือข่าย คุณควรรวมโมเดลดังกล่าวเป็นส่วนหนึ่งของแอปไว้เป็นข้อมูลสำรองด้วย
เพื่อความเรียบง่าย เราจะลบโมเดลรวมเริ่มต้นออก และดาวน์โหลดโมเดลจาก Firebase เสมอเมื่อแอปเริ่มทำงาน วิธีนี้เมื่อเรียกใช้การจดจำตัวเลข คุณจะมั่นใจได้ว่าการอนุมานกำลังทำงานกับโมเดลที่ได้รับจาก Firebase
ที่ด้านบนของ ModelLoader.swift
ให้นำเข้าโมดูล Firebase
import FirebaseCore import FirebaseMLModelDownloader
จากนั้นใช้วิธีต่อไปนี้
static func downloadModel(named name: String, completion: @escaping (CustomModel?, DownloadError?) -> Void) { guard FirebaseApp.app() != nil else { completion(nil, .firebaseNotInitialized) return } guard success == nil && failure == nil else { completion(nil, .downloadInProgress) return } let conditions = ModelDownloadConditions(allowsCellularAccess: false) ModelDownloader.modelDownloader().getModel(name: name, downloadType: .localModelUpdateInBackground, conditions: conditions) { result in switch (result) { case .success(let customModel): // Download complete. // The CustomModel object contains the local path of the model file, // which you can use to instantiate a TensorFlow Lite classifier. return completion(customModel, nil) case .failure(let error): // Download was unsuccessful. Notify error message. completion(nil, .downloadFailed(underlyingError: error)) } } }
ใน viewDidLoad
ของ ViewController.swift
ให้แทนที่การเรียกใช้การกำหนดค่าเริ่มต้น DigitClassifier ด้วยวิธีการดาวน์โหลดโมเดลใหม่ของเรา
// Download the model from Firebase print("Fetching model...") ModelLoader.downloadModel(named: "mnist_v1") { (customModel, error) in guard let customModel = customModel else { if let error = error { print(error) } return } print("Model download complete") // Initialize a DigitClassifier instance DigitClassifier.newInstance(modelPath: customModel.path) { result in switch result { case let .success(classifier): self.classifier = classifier case .error(_): self.resultLabel.text = "Failed to initialize." } } }
เรียกใช้แอปของคุณอีกครั้ง หลังจากนั้นไม่กี่วินาที คุณจะเห็นบันทึกใน Xcode ระบุว่าดาวน์โหลดโมเดลระยะไกลสำเร็จแล้ว ลองวาดตัวเลขและยืนยันว่าพฤติกรรมของแอปไม่เปลี่ยนแปลง
6. ติดตามความคิดเห็นของผู้ใช้และการแปลงเพื่อวัดความแม่นยำของโมเดล
เราจะวัดความแม่นยำของแบบจำลองโดยการติดตามความคิดเห็นของผู้ใช้เกี่ยวกับการทำนายแบบจำลอง หากผู้ใช้คลิก "ใช่" จะเป็นการระบุว่าการคาดคะเนนั้นแม่นยำ
เราสามารถบันทึกเหตุการณ์ Analytics เพื่อติดตามความถูกต้องของแบบจำลองของเรา ขั้นแรก เราต้องเพิ่ม Analytics ให้กับ Podfile ก่อนจึงจะสามารถใช้ได้ในโปรเจ็กต์:
pod 'FirebaseAnalytics'
จากนั้นใน ViewController.swift
ให้นำเข้า Firebase ที่ด้านบนของไฟล์
import FirebaseAnalytics
และเพิ่มบรรทัดของโค้ดต่อไปนี้ในเมธอด correctButtonPressed
Analytics.logEvent("correct_inference", parameters: nil)
เรียกใช้แอปอีกครั้งแล้ววาดตัวเลข กดปุ่ม "ใช่" สองสามครั้งเพื่อส่งข้อเสนอแนะว่าการอนุมานนั้นถูกต้อง
การวิเคราะห์แก้ไขข้อบกพร่อง
โดยทั่วไป กิจกรรมที่แอปของคุณบันทึกไว้จะถูกจัดกลุ่มเข้าด้วยกันในช่วงเวลาประมาณหนึ่งชั่วโมงและอัปโหลดพร้อมกัน วิธีการนี้ช่วยประหยัดแบตเตอรี่ในอุปกรณ์ของผู้ใช้ปลายทางและลดการใช้ข้อมูลเครือข่าย อย่างไรก็ตาม เพื่อวัตถุประสงค์ในการตรวจสอบการใช้งานการวิเคราะห์ของคุณ (และเพื่อดูการวิเคราะห์ในรายงาน DebugView) คุณสามารถเปิดใช้งานโหมดแก้ไขข้อบกพร่องบนอุปกรณ์การพัฒนาของคุณเพื่ออัปโหลดเหตุการณ์โดยมีความล่าช้าน้อยที่สุด
หากต้องการเปิดใช้งานโหมดแก้ไขข้อบกพร่องของ Analytics บนอุปกรณ์การพัฒนาของคุณ ให้ระบุอาร์กิวเมนต์บรรทัดคำสั่งต่อไปนี้ใน Xcode:
-FIRDebugEnabled
เรียกใช้แอปอีกครั้งแล้ววาดตัวเลข กดปุ่ม "ใช่" สองสามครั้งเพื่อส่งข้อเสนอแนะว่าการอนุมานนั้นถูกต้อง ตอนนี้คุณสามารถดูเหตุการณ์บันทึกในเวลาใกล้เคียงเรียลไทม์ผ่านมุมมองการแก้ไขข้อบกพร่องในคอนโซล Firebase คลิกที่ Analytics > DebugView จากแถบนำทางด้านซ้าย
7. ติดตามเวลาอนุมานด้วยประสิทธิภาพของ Firebase
เมื่อทดสอบโมเดลของคุณ การวัดประสิทธิภาพที่สร้างขึ้นบนอุปกรณ์การพัฒนาไม่เพียงพอที่จะจับภาพว่าโมเดลจะทำงานอย่างไรในมือผู้ใช้ของคุณ เนื่องจากเป็นการยากที่จะบอกว่าผู้ใช้ฮาร์ดแวร์ใดที่จะใช้งานแอปของคุณ โชคดีที่คุณสามารถวัดประสิทธิภาพของโมเดลบนอุปกรณ์ของผู้ใช้ด้วยประสิทธิภาพของ Firebase เพื่อให้เห็นภาพประสิทธิภาพของโมเดลได้ดีขึ้น
หากต้องการวัดเวลาที่ใช้ในการอนุมาน ให้นำเข้า Firebase ใน DigitClassifier.swift ก่อน:
import FirebasePerformance
จากนั้นเริ่มต้นการติดตามประสิทธิภาพในเมธอด classify และหยุดการติดตามเมื่อการอนุมานเสร็จสมบูรณ์ ตรวจสอบให้แน่ใจว่าคุณเพิ่มบรรทัดของโค้ดต่อไปนี้ในการปิด DispatchQueue.global.async และไม่อยู่ด้านล่างการประกาศวิธีการโดยตรง
let inferenceTrace = Performance.startTrace(name: "tflite inference") defer { inferenceTrace?.stop() }
หากคุณสงสัย คุณสามารถเปิดใช้งานการบันทึกการแก้ไขข้อบกพร่องได้ตาม คำแนะนำที่นี่ เพื่อยืนยันว่ากำลังบันทึกการติดตามประสิทธิภาพของคุณ หลังจากนั้นไม่นาน การติดตามประสิทธิภาพจะปรากฏในคอนโซล Firebase เช่นกัน
8. ปรับใช้โมเดลที่สองกับ Firebase ML
เมื่อสร้างโมเดลเวอร์ชันใหม่ของคุณ เช่น โมเดลที่มีสถาปัตยกรรมโมเดลที่ดีกว่า หรือโมเดลที่ได้รับการฝึกบนชุดข้อมูลที่ใหญ่กว่าหรืออัปเดต เราอาจรู้สึกอยากแทนที่โมเดลปัจจุบันด้วยเวอร์ชันใหม่ อย่างไรก็ตาม โมเดลที่ทำงานได้ดีในการทดสอบไม่จำเป็นต้องทำงานได้ดีเท่ากันในการผลิต ดังนั้น เรามาทำการทดสอบ A/B ในการผลิตเพื่อเปรียบเทียบรุ่นเดิมของเรากับรุ่นใหม่
เปิดใช้งาน Firebase Model Management API
ในขั้นตอนนี้ เราจะเปิดใช้งาน Firebase Model Management API เพื่อปรับใช้โมเดล TensorFlow Lite เวอร์ชันใหม่ของเราโดยใช้โค้ด Python
สร้างบัคเก็ตเพื่อจัดเก็บโมเดล ML ของคุณ
ในคอนโซล Firebase ของคุณ ไปที่พื้นที่เก็บข้อมูลแล้วคลิกเริ่มต้น
ทำตามกล่องโต้ตอบเพื่อตั้งค่าที่เก็บข้อมูลของคุณ
เปิดใช้งาน Firebase ML API
ไปที่ หน้า Firebase ML API บน Google Cloud Console แล้วคลิกเปิดใช้งาน
เลือกแอป Digit Classifier เมื่อถูกถาม
ตอนนี้เราจะฝึกโมเดลเวอร์ชันใหม่โดยใช้ชุดข้อมูลที่ใหญ่ขึ้น จากนั้นเราจะปรับใช้โมเดลดังกล่าวทางโปรแกรมโดยตรงจากสมุดบันทึกการฝึกอบรมโดยใช้ Firebase Admin SDK
ดาวน์โหลดรหัสส่วนตัวสำหรับบัญชีบริการ
ก่อนที่เราจะใช้ Firebase Admin SDK เราจะต้องสร้างบัญชีบริการก่อน เปิดแผงบัญชีบริการของคอนโซล Firebase โดยคลิกที่ ลิงก์นี้ และคลิกที่ปุ่มเพื่อสร้างบัญชีบริการใหม่สำหรับ Firebase Admin SDK เมื่อได้รับแจ้ง ให้คลิกปุ่มสร้างคีย์ส่วนตัวใหม่ เราจะใช้คีย์บัญชีบริการในการตรวจสอบคำขอของเราจากสมุดบันทึก colab
ตอนนี้เราสามารถฝึกอบรมและปรับใช้โมเดลใหม่ได้แล้ว
- เปิด สมุดบันทึก Colab นี้และทำสำเนาไว้ใต้ไดรฟ์ของคุณเอง
- เรียกใช้เซลล์แรก "ฝึกโมเดล TensorFlow Lite ที่ปรับปรุงแล้ว" โดยคลิกที่ปุ่มเล่นทางด้านซ้าย การดำเนินการนี้จะฝึกโมเดลใหม่และอาจต้องใช้เวลาระยะหนึ่ง
- การเรียกใช้เซลล์ที่สองจะสร้างพร้อมท์ให้อัพโหลดไฟล์ อัปโหลดไฟล์ json ที่คุณดาวน์โหลดจาก Firebase Console เมื่อสร้างบัญชีบริการ
- เรียกใช้สองเซลล์สุดท้าย
หลังจากเรียกใช้สมุดบันทึก colab คุณจะเห็นรุ่นที่สองในคอนโซล Firebase ตรวจสอบให้แน่ใจว่ารุ่นที่สองชื่อ mnist_v2
9. เลือกรุ่นผ่าน Remote Config
ตอนนี้เรามีโมเดลสองรุ่นที่แยกกัน เราจะเพิ่มพารามิเตอร์สำหรับเลือกโมเดลที่จะดาวน์โหลดขณะรันไทม์ ค่าของพารามิเตอร์ที่ไคลเอ็นต์ได้รับจะเป็นตัวกำหนดว่าไคลเอ็นต์จะดาวน์โหลดโมเดลใด ขั้นแรก เปิดคอนโซล Firebase แล้วคลิกปุ่ม Remote Config ในเมนูนำทางด้านซ้าย จากนั้นคลิกที่ปุ่ม "เพิ่มพารามิเตอร์"
ตั้งชื่อพารามิเตอร์ใหม่ model_name
และกำหนดค่าเริ่มต้นเป็น mnist_v1
คลิก เผยแพร่การเปลี่ยนแปลง เพื่อใช้การอัปเดต ด้วยการใส่ชื่อของโมเดลลงในพารามิเตอร์การกำหนดค่าระยะไกล เราสามารถทดสอบหลายโมเดลได้โดยไม่ต้องเพิ่มพารามิเตอร์ใหม่สำหรับทุกๆ รุ่นที่เราต้องการทดสอบ
หลังจากเพิ่มพารามิเตอร์แล้ว คุณควรเห็นมันในคอนโซล:
ในโค้ดของเรา เราจะต้องเพิ่มการตรวจสอบเมื่อโหลดโมเดลระยะไกล เมื่อเราได้รับพารามิเตอร์จาก Remote Config เราจะดึงโมเดลระยะไกลที่มีชื่อที่เกี่ยวข้อง ไม่เช่นนั้นเราจะพยายามโหลด mnist_v1
ก่อนที่เราจะใช้ Remote Config ได้ เราต้องเพิ่มมันเข้าไปในโปรเจ็กต์ของเราโดยระบุว่าเป็นการขึ้นต่อกันใน Podfile:
pod 'FirebaseRemoteConfig'
เรียกใช้การติดตั้ง pod และเปิดโครงการ Xcode อีกครั้ง ใน ModelLoader.swift
ให้ใช้เมธอด fetchParameterizedModel
static func fetchParameterizedModel(completion: @escaping (CustomModel?, DownloadError?) -> Void) { RemoteConfig.remoteConfig().fetchAndActivate { (status, error) in DispatchQueue.main.async { if let error = error { let compositeError = DownloadError.downloadFailed(underlyingError: error) completion(nil, compositeError) return } let modelName: String if let name = RemoteConfig.remoteConfig().configValue(forKey: "model_name").stringValue { modelName = name } else { let defaultName = "mnist_v1" print("Unable to fetch model name from config, falling back to default \(defaultName)") modelName = defaultName } downloadModel(named: modelName, completion: completion) } } }
สุดท้ายใน ViewController.swift
ให้แทนที่การเรียก downloadModel
ด้วยวิธีใหม่ที่เราเพิ่งนำไปใช้
// Download the model from Firebase print("Fetching model...") ModelLoader.fetchParameterizedModel { (customModel, error) in guard let customModel = customModel else { if let error = error { print(error) } return } print("Model download complete") // Initialize a DigitClassifier instance DigitClassifier.newInstance(modelPath: customModel.path) { result in switch result { case let .success(classifier): self.classifier = classifier case .error(_): self.resultLabel.text = "Failed to initialize." } } }
เรียกใช้แอปอีกครั้งและตรวจดูให้แน่ใจว่ายังคงโหลดโมเดลได้อย่างถูกต้อง
10. ทดสอบ A/B ทั้งสองรุ่น
สุดท้ายนี้ เราสามารถใช้พฤติกรรมการทดสอบ A/B ในตัวของ Firebase เพื่อดูว่าโมเดลใดในสองโมเดลของเรามีประสิทธิภาพดีกว่ากัน ไปที่ Analytics -> เหตุการณ์ในคอนโซล Firebase หากเหตุการณ์ correct_inference
แสดงอยู่ ให้ทำเครื่องหมายว่าเป็น "เหตุการณ์ Conversion" หากไม่เป็นเช่นนั้น คุณสามารถไปที่ Analytics -> เหตุการณ์ Conversion แล้วคลิก "สร้างเหตุการณ์ Conversion ใหม่" แล้ววาง correct_inference.
ลงไป
ตอนนี้ไปที่ "การกำหนดค่าระยะไกลในคอนโซล Firebase เลือกปุ่ม "การทดสอบ A/B" จากเมนูตัวเลือกเพิ่มเติมในพารามิเตอร์ "model_name" ที่เราเพิ่งเพิ่ม
ในเมนูที่ตามมา ให้ยอมรับชื่อเริ่มต้น
เลือกแอปของคุณจากเมนูแบบเลื่อนลงและเปลี่ยนเกณฑ์การกำหนดเป้าหมายเป็น 50% ของผู้ใช้ที่ใช้งานอยู่
หากคุณสามารถตั้งค่าเหตุการณ์ correct_inference
เป็น Conversion ก่อนหน้านี้ได้ ให้ใช้เหตุการณ์นี้เป็นเมตริกหลักในการติดตาม มิฉะนั้น หากคุณไม่ต้องการรอให้เหตุการณ์แสดงใน Analytics คุณสามารถเพิ่ม correct_inference
ด้วยตนเองได้
สุดท้าย บนหน้าจอตัวแปร ให้ตั้งค่าตัวแปรกลุ่มควบคุมของคุณให้ใช้ mnist_v1
และกลุ่มตัวแปร A ของคุณให้ใช้ mnist_v2
คลิกปุ่มตรวจสอบที่มุมขวาล่าง
ยินดีด้วย คุณสร้างการทดสอบ A/B สำหรับโมเดลทั้งสองที่แยกกันของคุณสำเร็จแล้ว! ขณะนี้การทดสอบ A/B อยู่ในสถานะร่างและสามารถเริ่มต้นได้ตลอดเวลาโดยคลิกปุ่ม "เริ่มการทดสอบ"
หากต้องการดูการทดสอบ A/B ให้ละเอียดยิ่งขึ้น โปรดดู เอกสารการทดสอบ A/B
11. บทสรุป
ใน Codelab นี้ คุณได้เรียนรู้วิธีแทนที่เนื้อหา tflite ที่รวมกลุ่มแบบคงที่ในแอปของคุณด้วยโมเดล TFLite ที่โหลดแบบไดนามิกจาก Firebase หากต้องการเรียนรู้เพิ่มเติมเกี่ยวกับ TFLite และ Firebase โปรดดูตัวอย่าง TFLite อื่นๆ และคู่มือเริ่มต้นใช้งาน Firebase