Thêm đề xuất vào ứng dụng bằng TensorFlow Lite và Firebase – Lớp học lập trình iOS

1. Tổng quan

Chào mừng bạn đến với lớp học lập trình Đề xuất bằng TensorFlow Lite và Firebase. Trong lớp học lập trình này, bạn sẽ tìm hiểu cách sử dụng TensorFlow Lite và Firebase để triển khai mô hình đề xuất cho ứng dụng của mình. Lớp học lập trình này dựa trên ví dụ này về TensorFlow Lite.

Đề xuất cho phép ứng dụng sử dụng công nghệ học máy để phân phát nội dung phù hợp nhất cho từng người dùng một cách thông minh. Họ xem xét hành vi trước đây của người dùng để đề xuất nội dung ứng dụng mà người dùng có thể muốn tương tác trong tương lai bằng cách sử dụng một mô hình đã được huấn luyện về hành vi tổng hợp của một số lượng lớn người dùng khác.

Hướng dẫn này trình bày cách lấy dữ liệu từ người dùng ứng dụng của bạn bằng Firebase Analytics, xây dựng mô hình học máy cho các đề xuất từ dữ liệu đó, sau đó sử dụng mô hình đó trong ứng dụng iOS để chạy suy luận và nhận đề xuất. Cụ thể, các đề xuất của chúng tôi sẽ đề xuất những phim mà người dùng có nhiều khả năng sẽ xem nhất dựa trên danh sách phim mà người dùng đã thích trước đây.

Kiến thức bạn sẽ học được

  • Tích hợp Firebase Analytics vào một ứng dụng Android để thu thập dữ liệu hành vi của người dùng
  • Xuất dữ liệu đó vào Google Big Query
  • Xử lý trước dữ liệu và huấn luyện mô hình đề xuất TF Lite
  • Triển khai mô hình TF Lite cho công nghệ học máy của Firebase và truy cập vào mô hình đó từ ứng dụng của bạn
  • Chạy suy luận trên thiết bị bằng cách sử dụng mô hình này để đề xuất các đề xuất cho người dùng

Bạn cần có

  • Xcode 11 (trở lên)
  • CocoaPods 1.9.1 (trở lên)

Bạn sẽ sử dụng hướng dẫn này như thế nào?

Chỉ có thể đọc Đọc và hoàn thành bài tập

Bạn đánh giá thế nào về trải nghiệm xây dựng ứng dụng iOS?

Người mới tập Trung cấp Thành thạo

2. Tạo dự án trên bảng điều khiển Firebase

Thêm Firebase vào dự án

  1. Truy cập vào bảng điều khiển của Firebase.
  2. Chọn Tạo dự án mới rồi đặt tên cho dự án là "Lớp học lập trình iOS ML học máy Firebase".

3. Nhận dự án mẫu

Tải mã nguồn xuống

Bắt đầu bằng cách sao chép dự án mẫu và chạy pod update trong thư mục dự án:

git clone https://github.com/FirebaseExtended/codelab-contentrecommendation-ios.git
cd codelab-contentrecommendation-ios/start
pod install --repo-update

Nếu chưa cài đặt git, bạn cũng có thể tải dự án mẫu xuống từ trang GitHub hoặc bằng cách nhấp vào đường liên kết này. Sau khi bạn đã tải dự án xuống, hãy chạy dự án trong Xcode và thử nghiệm các đề xuất để cảm nhận cách hoạt động của dự án.

Thiết lập Firebase

Hãy làm theo tài liệu này để tạo một dự án Firebase mới. Sau khi bạn đã có dự án, hãy tải tệp GoogleService-Info.plist của dự án xuống từ bảng điều khiển của Firebase rồi kéo tệp đó vào thư mục gốc của dự án Xcode.

4a923d5c7ae0d8f3.pngS

Thêm Firebase vào Podfile và chạy pod install.

pod 'FirebaseAnalytics'
pod 'FirebaseMLModelDownloader', '9.3.0-beta'
pod 'TensorFlowLiteSwift'

Trong phương thức didFinishLaunchingWithOptions của AppDelegate, hãy nhập Firebase ở phần đầu tệp

import FirebaseCore

Và thêm một lệnh gọi để định cấu hình Firebase.

FirebaseApp.configure()

Chạy lại dự án để đảm bảo ứng dụng được định cấu hình chính xác và không gặp sự cố khi khởi chạy.

  1. Đảm bảo rằng chế độ "Bật Google Analytics cho dự án này" đã được bật.
  2. Hãy làm theo các bước thiết lập còn lại trong bảng điều khiển của Firebase, sau đó nhấp vào Tạo dự án (hoặc Thêm Firebase, nếu bạn đang sử dụng dự án hiện có của Google).

4. Thêm Firebase Analytics vào ứng dụng

Trong bước này, bạn sẽ thêm Firebase Analytics vào ứng dụng để ghi lại dữ liệu hành vi của người dùng (trong trường hợp này là phim người dùng thích). Dữ liệu này sẽ được dùng ở dạng dữ liệu tổng hợp trong các bước trong tương lai để huấn luyện mô hình đề xuất.

Thiết lập Firebase Analytics trong ứng dụng

ChangesMoviesViewModel chứa các hàm để lưu trữ phim mà người dùng thích. Mỗi khi người dùng thích một bộ phim mới, chúng tôi cũng muốn gửi một sự kiện trong nhật ký Analytics để ghi lại lượt thích đó.

Thêm mã bên dưới để đăng ký sự kiện phân tích khi người dùng nhấp vào nút thích một bộ phim.

AllMoviesCollectionViewController.swift

import FirebaseAnalytics
//


override func collectionView(_ collectionView: UICollectionView, didSelectItemAt indexPath: IndexPath) {
//

if movie.liked == nil {
      movie.liked = true
      Analytics.logEvent(AnalyticsEventSelectItem, parameters: [AnalyticsParameterItemID: movie.id])
    } else {
      movie.liked?.toggle()
    }
       
}

5. Kiểm tra tính năng tích hợp Analytics

Ở bước này, chúng ta sẽ tạo các sự kiện Analytics trong ứng dụng và xác minh rằng các sự kiện đó đang được gửi đến Bảng điều khiển của Firebase.

Bật tính năng ghi nhật ký gỡ lỗi của Analytics

Thông thường, các sự kiện mà ứng dụng của bạn ghi lại sẽ được nhóm lại với nhau trong khoảng một giờ và được tải lên cùng nhau. Phương pháp này giúp tiết kiệm pin của người dùng cuối thiết bị khác và giảm mức sử dụng dữ liệu mạng. Tuy nhiên, để xác thực việc triển khai số liệu phân tích (và để xem số liệu phân tích trong báo cáo DebugView), bạn có thể bật chế độ Gỡ lỗi trên thiết bị phát triển của mình để tải các sự kiện lên với độ trễ tối thiểu.

Để bật chế độ Gỡ lỗi Analytics trên thiết bị phát triển của bạn, hãy chỉ định đối số dòng lệnh sau trong Xcode:

-FIRDebugEnabled

Lúc này, bạn đã tích hợp thành công Firebase Analytics vào ứng dụng của mình. Khi người dùng sử dụng ứng dụng của bạn và thích phim, số lượt thích của họ sẽ được ghi lại tổng hợp. Chúng ta sẽ dùng dữ liệu tổng hợp này trong phần còn lại của lớp học lập trình này để huấn luyện mô hình đề xuất. Sau đây là một bước không bắt buộc để xem các sự kiện Analytics tương tự mà bạn thấy trong Logcat cũng truyền trực tuyến vào bảng điều khiển của Firebase. Vui lòng chuyển đến trang tiếp theo.

Không bắt buộc: Xác nhận sự kiện Analytics trong Bảng điều khiển của Firebase

  1. Truy cập vào bảng điều khiển của Firebase.
  2. Chọn DebugView trong Analytics
  3. Trong Xcode, hãy chọn Chạy để chạy ứng dụng và thêm một số phim vào danh sách Đã thích của bạn.
  4. Trong DebugView của bảng điều khiển của Firebase, hãy xác minh rằng những sự kiện này đang được ghi lại khi bạn thêm phim vào ứng dụng.

6. Xuất dữ liệu Analytics sang Big Query

Big Query là một sản phẩm của Google Cloud cho phép bạn kiểm tra và xử lý một lượng lớn dữ liệu. Ở bước này, bạn sẽ kết nối dự án trong Bảng điều khiển của Firebase với Big Query để hệ thống tự động xuất dữ liệu Analytics do ứng dụng của bạn tạo sang Big Query.

Bật tính năng xuất dữ liệu của Big Query

  1. Truy cập vào bảng điều khiển của Firebase.
  2. Chọn biểu tượng bánh răng Cài đặt bên cạnh Tổng quan về dự án, rồi chọn Cài đặt dự án
  3. Chọn thẻ Tích hợp.
  4. Chọn Liên kết (hoặc Quản lý) bên trong khối BigQuery.
  5. Chọn Tiếp theo trong bước Giới thiệu về cách liên kết Firebase với BigQuery.
  6. Trong mục Định cấu hình chế độ tích hợp, hãy nhấp vào nút chuyển để bật tính năng gửi dữ liệu Google Analytics rồi chọn Liên kết với BigQuery.

Bạn hiện đã bật dự án của mình trên bảng điều khiển Firebase để tự động gửi dữ liệu sự kiện Firebase Analytics đến Big Query. Điều này tự động xảy ra mà không cần thêm bất kỳ tương tác nào. Tuy nhiên, lần xuất đầu tiên tạo tập dữ liệu phân tích trong BigQuery có thể không diễn ra trong 24 giờ. Sau khi tạo tập dữ liệu, Firebase sẽ liên tục xuất các sự kiện Analytics mới sang Big Query vào bảng trong ngày và nhóm các sự kiện từ những ngày trước đó vào bảng sự kiện.

Việc huấn luyện mô hình đề xuất đòi hỏi nhiều dữ liệu. Vì chưa có ứng dụng nào tạo lượng lớn dữ liệu, nên trong bước tiếp theo, chúng ta sẽ nhập tập dữ liệu mẫu vào BigQuery để sử dụng cho phần còn lại của hướng dẫn này.

7. Sử dụng BigQuery để lấy dữ liệu huấn luyện mô hình

Bây giờ, chúng ta đã kết nối Bảng điều khiển của Firebase để xuất sang BigQuery, nên dữ liệu sự kiện phân tích ứng dụng của chúng ta sẽ tự động xuất hiện trong bảng điều khiển BigQuery sau một khoảng thời gian. Để có được một số dữ liệu ban đầu cho mục đích của hướng dẫn này, trong bước này, chúng ta sẽ nhập tập dữ liệu mẫu hiện có vào bảng điều khiển BigQuery để sử dụng cho việc huấn luyện mô hình đề xuất của mình.

Nhập tập dữ liệu mẫu vào BigQuery

  1. Chuyển đến trang tổng quan BigQuery trong bảng điều khiển Google Cloud.
  2. Chọn tên dự án trong trình đơn.
  3. Chọn tên dự án của bạn ở cuối bảng điều hướng bên trái trong BigQuery để xem thông tin chi tiết.
  4. Chọn Tạo tập dữ liệu để mở bảng điều khiển tạo tập dữ liệu.
  5. Nhập "firebase_recommendations_dataset" cho Mã tập dữ liệu rồi chọn Tạo tập dữ liệu.
  6. Tập dữ liệu mới sẽ xuất hiện ở trình đơn bên trái bên dưới tên dự án. Nhấp vào đó.
  7. Chọn Tạo bảng để mở bảng điều khiển tạo bảng.
  8. Đối với phần Tạo bảng từ, hãy chọn "Google Cloud Storage".
  9. Trong trường Chọn tệp từ bộ chứa GCS, hãy nhập "gs://firebase-recommendations/recommendations-test/formatted_data_filters.txt".
  10. Chọn "JSONL" trong trình đơn thả xuống Định dạng tệp.
  11. Nhập "recommendations_table" cho Tên bảng.
  12. Chọn hộp bên dưới Giản đồ > Tự động phát hiện > Giản đồ và tham số nhập
  13. Chọn Tạo bảng

Khám phá tập dữ liệu mẫu

Tại thời điểm này, bạn có thể tuỳ ý khám phá giản đồ và xem trước tập dữ liệu này.

  1. Chọn firebase-recommendations-dataset trong trình đơn bên trái để mở rộng các bảng chứa trong đó.
  2. Chọn bảng đề xuất-bảng để xem giản đồ bảng.
  3. Chọn Xem trước để xem dữ liệu sự kiện Analytics thực tế trong bảng này.

Tạo thông tin xác thực cho tài khoản dịch vụ

Bây giờ, chúng ta sẽ tạo thông tin đăng nhập cho tài khoản dịch vụ trong dự án bảng điều khiển Google Cloud mà chúng ta có thể dùng trong môi trường Colab ở bước sau để truy cập và tải dữ liệu BigQuery.

  1. Đảm bảo rằng bạn đã bật tính năng thanh toán cho dự án trên Google Cloud.
  2. Bật BigQuery Storage API và BigQuery Storage API. < nhấp vào đây>
  3. Truy cập trang Tạo khoá tài khoản dịch vụ.
  4. Trong danh sách Tài khoản dịch vụ, hãy chọn Tài khoản dịch vụ mới.
  5. Trong trường Tên tài khoản dịch vụ, hãy nhập tên.
  6. Trong danh sách Vai trò, hãy chọn Dự án > Chủ sở hữu.
  7. Nhấp vào Tạo. Tệp JSON chứa khoá của bạn sẽ tải xuống máy tính.

Ở bước tiếp theo, chúng ta sẽ sử dụng Google Colab để xử lý trước dữ liệu này và huấn luyện mô hình đề xuất.

8. Dữ liệu tiền xử lý và huấn luyện mô hình đề xuất

Ở bước này, chúng ta sẽ dùng một sổ tay Colab để thực hiện các bước sau:

  1. nhập dữ liệu BigQuery vào sổ tay Colab
  2. xử lý trước dữ liệu để chuẩn bị cho việc huấn luyện mô hình
  3. huấn luyện mô hình đề xuất dựa trên dữ liệu phân tích.
  4. xuất mô hình dưới dạng mô hình TF lite
  5. triển khai mô hình này cho Bảng điều khiển của Firebase để chúng tôi có thể sử dụng mô hình đó trong ứng dụng

Trước khi ra mắt sổ tay huấn luyện Colab, trước tiên, chúng ta sẽ bật API Quản lý mô hình Firebase để Colab có thể triển khai mô hình đã huấn luyện cho bảng điều khiển của Firebase.

Bật API Quản lý mô hình Firebase

Tạo bộ chứa để lưu trữ các mô hình học máy

Trong Bảng điều khiển của Firebase, hãy chuyển đến Bộ nhớ rồi nhấp vào Bắt đầu. fbbea78f0eb3dc9f.png.

Làm theo cuộc hội thoại để thiết lập bộ chứa của bạn.

19517c0d6d2aa14d.pngS

Bật Firebase ML API

Truy cập vào trang API Firebase ML API trên Google Cloud Console rồi nhấp vào Bật.

Sử dụng sổ tay Colab để huấn luyện và triển khai mô hình

Mở sổ tay colab bằng đường liên kết sau đây rồi hoàn thành các bước trong đó. Sau khi hoàn tất các bước trong sổ tay Colab, bạn sẽ thấy một tệp mô hình TF lite được triển khai trên bảng điều khiển của Firebase. Tệp này sẽ được chúng ta đồng bộ hoá với ứng dụng.

Mở trong Colab

9. Tải mô hình xuống trong ứng dụng của bạn

Trong bước này, chúng ta sẽ sửa đổi ứng dụng để tải mô hình mà chúng ta vừa huấn luyện từ công nghệ Học máy Firebase xuống.

Thêm phần phụ thuộc công nghệ học máy của Firebase

Bạn cần có phần phụ thuộc sau để sử dụng các mô hình Học máy của Firebase trong ứng dụng. Bạn cần thêm dữ liệu này từ trước (xác minh).

Podfile

import FirebaseCore
import FirebaseMLModelDownloader

Tải mô hình xuống bằng API Trình quản lý mô hình Firebase

Sao chép mã bên dưới vào ModelLoader.swift để thiết lập các điều kiện diễn ra quá trình tải mô hình xuống, đồng thời tạo tác vụ tải xuống để đồng bộ hoá mô hình từ xa với ứng dụng của chúng ta.

ModelLoader.swift

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))
            }
    }
  }

10. Tích hợp mô hình đề xuất Tensorflow Lite vào ứng dụng của bạn

Thời gian chạy Tensorflow Lite sẽ cho phép bạn sử dụng mô hình của mình trong ứng dụng để tạo các đề xuất. Ở bước trước, chúng ta đã khởi chạy trình thông dịch TFlite bằng tệp mô hình mà chúng ta đã tải xuống. Ở bước này, trước tiên chúng ta sẽ tải từ điển và nhãn để đi kèm với mô hình của mình trong bước suy luận. Sau đó, chúng ta sẽ xử lý trước để tạo dữ liệu đầu vào cho mô hình và xử lý hậu kỳ để trích xuất kết quả từ suy luận của chúng ta.

Tải từ điển và nhãn

Các nhãn dùng để tạo các đề xuất theo mô hình đề xuất sẽ xuất hiện trong tệp sort_movie_vocab.json trong thư mục thành phần. Sao chép mã sau đây để tải các đề xuất này.

Đề xuấtViewController.swift

  func getMovies() -> [MovieItem] {
    let barController = self.tabBarController as! TabBarController
    return barController.movies
  }

Triển khai Quy trình tiền xử lý

Trong bước tiền xử lý, chúng ta thay đổi dạng dữ liệu đầu vào để phù hợp với những gì mô hình của chúng ta mong đợi. Ở đây, chúng ta đặt độ dài nhập bằng một giá trị phần giữ chỗ nếu chưa thu hút được nhiều lượt thích của người dùng. Sao chép mã bên dưới:

Đề xuấtViewController.swift

  // Given a list of selected items, preprocess to get tflite input.
  func preProcess() -> Data {
    let likedMovies = getLikedMovies().map { (MovieItem) -> Int32 in
      return MovieItem.id
    }
    var inputData = Data(copyingBufferOf: Array(likedMovies.prefix(10)))

    // Pad input data to have a minimum of 10 context items (4 bytes each)
    while inputData.count < 10*4 {
      inputData.append(0)
    }
    return inputData
  }

Chạy trình phiên dịch để tạo các đề xuất

Ở đây, chúng ta sử dụng mô hình đã tải xuống ở bước trước để chạy suy luận dựa trên dữ liệu đầu vào đã xử lý trước. Chúng ta đặt loại đầu vào và đầu ra cho mô hình và chạy suy luận để đưa ra các đề xuất về phim. Sao chép mã sau đây vào ứng dụng.

Đề xuấtViewController.swift

import TensorFlowLite

Đề xuấtViewController.swift

 private var interpreter: Interpreter?

 func loadModel() {
    // Download the model from Firebase
    print("Fetching recommendations model...")
    ModelDownloader.fetchModel(named: "recommendations") { (filePath, error) in
      guard let path = filePath else {
        if let error = error {
          print(error)
        }
        return
      }
      print("Recommendations model download complete")
      self.loadInterpreter(path: path)
    }
  }

 func loadInterpreter(path: String) {
    do {
      interpreter = try Interpreter(modelPath: path)

      // Allocate memory for the model's input `Tensor`s.
      try interpreter?.allocateTensors()

      let inputData = preProcess()

      // Copy the input data to the input `Tensor`.
      try self.interpreter?.copy(inputData, toInputAt: 0)

      // Run inference by invoking the `Interpreter`.
      try self.interpreter?.invoke()

      // Get the output `Tensor`
      let confidenceOutputTensor = try self.interpreter?.output(at: 0)
      let idOutputTensor = try self.interpreter?.output(at: 1)

      // Copy output to `Data` to process the inference results.
      let confidenceOutputSize = confidenceOutputTensor?.shape.dimensions.reduce(1, {x, y in x * y})

      let idOutputSize = idOutputTensor?.shape.dimensions.reduce(1, {x, y in x * y})

      let confidenceResults =
        UnsafeMutableBufferPointer<Float32>.allocate(capacity: confidenceOutputSize!)
      let idResults =
        UnsafeMutableBufferPointer<Int32>.allocate(capacity: idOutputSize!)
      _ = confidenceOutputTensor?.data.copyBytes(to: confidenceResults)
      _ = idOutputTensor?.data.copyBytes(to: idResults)

      postProcess(idResults, confidenceResults)

      print("Successfully ran inference")
      DispatchQueue.main.async {
        self.tableView.reloadData()
      }
    } catch {
      print("Error occurred creating model interpreter: \(error)")
    }
  }

Triển khai quy trình hậu xử lý

Cuối cùng, trong bước này, chúng tôi xử lý hậu kỳ kết quả từ mô hình của mình, chọn các kết quả có độ tin cậy cao nhất và xoá các giá trị có trong đó (phim mà người dùng đã thích). Sao chép mã sau đây vào ứng dụng.

Đề xuấtViewController.swift

  // Postprocess to get results from tflite inference.
  func postProcess(_ idResults: UnsafeMutableBufferPointer<Int32>, _ confidenceResults: UnsafeMutableBufferPointer<Float32>) {
    for i in 0..<10 {
      let id = idResults[i]
      let movieIdx = getMovies().firstIndex { $0.id == id }
      let title = getMovies()[movieIdx!].title
      recommendations.append(Recommendation(title: title, confidence: confidenceResults[i]))
    }
  }

Kiểm thử ứng dụng!

Chạy lại ứng dụng của bạn. Khi bạn chọn một vài phim, phim sẽ tự động tải mô hình mới xuống và bắt đầu tạo nội dung đề xuất!

11. Xin chúc mừng!

Bạn đã tích hợp một tính năng đề xuất vào ứng dụng của mình bằng TensorFlow Lite và Firebase. Xin lưu ý rằng các kỹ thuật và quy trình trình bày trong lớp học lập trình này cũng có thể khái quát hoá và dùng để thực hiện các loại đề xuất khác.

Nội dung đã đề cập

  • Firebase ML
  • Firebase Analytics
  • Xuất sự kiện phân tích sang BigQuery
  • Sự kiện phân tích trước quy trình
  • Đào tạo mô hình TensorFlow
  • Xuất mô hình và triển khai sang Bảng điều khiển của Firebase
  • Phân phát đề xuất phim trong ứng dụng

Các bước tiếp theo

  • Triển khai các đề xuất về công nghệ học máy của Firebase trong ứng dụng của bạn.

Tìm hiểu thêm

Bạn có thắc mắc?

Báo cáo vấn đề