Thực tiễn triển khai AI biên trên trang chủ ứng dụng vivo

1. Bối cảnh bài toán

Trang chủ của ứng dụng chính thức vivo là nơi tập trung lưu lượng truy cập lớn nhất và đóng vai trò phân phối đến các kênh như sản phẩm mới, chương trình khuyến mãi, mặt hàng và các lối vào khác. Trong số các vị trí trên trang chủ, khu vực phần cứng thông minh trước đây được vận hành hoàn toàn thủ công: nhân viên vận hành chọn 4 sản phẩm từ danh sách phần cứng thông minh để hiển thị. Kết quả là mọi người dùng đều nhìn thấy cùng một bộ sản phẩm, bỏ lỡ cơ hội tối ưu hóa tỷ lệ nhấp.

Thách thức được đặt ra như sau: từ N sản phẩm trong danh sách, chọn ra K sản phẩm (K ≤ N) phù hợp nhất cho từng nhóm người dùng. Về cốt lõi, đây là bài toán xếp hạng lại (re-ranking) dựa trên xác suất quan tâm của người dùng đối với từng sản phẩm, sau đó lấy top K.

2. Lý do chọn AI biên

Thay vì dùng luật cứng do con người định hoặc gọi mô hình đám mây, chúng tôi chọn triển khai mô hình học sâu trực tiếp trên thiết bị vì các lợi ích sau:

  • Tiết kiệm tài nguyên đám mây: phép tính suy luận được thực hiện trên điện thoại, giảm tải cho máy chủ.
  • Độ trễ thấp: không cần chờ phản hồi mạng, phù hợp với trải nghiệm thời gian thực.
  • Bảo mật dữ liệu: dữ liệu cá nhân được xử lý ngay trên máy, không cần gửi lên đám mây.
  • Khả năng học phức tạp: mạng nơ-ron có thể nắm bắt các mối quan hệ phi tuyến tính mà luật cứng khó mô tả.

3. Kiến trúc tổng thể

Giải pháp chia thành ba khối chính:

  1. Huấn luyện ngoại tuyến: làm sạch dữ liệu, xây dựng đặc trưng, huấn luyện mô hình TensorFlow rồi chuyển đổi sang định dạng TensorFlow Lite.
  2. Nền tảng đám mây: quản lý phiên bản mô hình, phát hành có điều kiện và thu thập chỉ số giám sát.
  3. Ứng dụng khách: tải mô hình, thu thập dữ liệu cảm biến trên thiết bị, thực hiện suy luận và trả kết quả về tầng giao diện.

4. Kỹ thuật đặc trưng

Dữ liệu thô từ hệ thống bao gồm mẫu thiết bị, thành phố, giới tính, v.v. Mặc dù có thể dùng Embedding hoặc Word2Vec để chuyển văn bản thành vector liên tục, nhưng trong bối cảnh AI biên, số chiều càng lớn càng tiêu tốn tài nguyên tính toán. Do đó, chúng tôi chọn mã hóa One-Hot đơn giản để giảm kích thước đầu vào.

4.1. Đặc trưng địa lý

Các thành phố được gom cm theo mức chi tiêu trung bình. Ví dụ, Bắc Kinh và Thượng Hải rơi vào cụm A, Vũ Hán và Hợp Phì rơi vào cụm B. Mỗi cụm biểu diễn bằng một vector ba bit; nếu không lấy được địa điểm thì dùng cm mặc định.

4.2. Đặc trưng thiết bị

Thiết bị được phân loại theo dòng sản phẩm, ví dụ dòng X, S, Y của vivo. Mỗi dòng chiếm một bit trong vector ba vị trí. Nếu mẫu máy không xác định, bit dự phòng được kích hoạt.

4.3. Đặc trưng giới tính

Giới tính được mã hóa bằng vector ba bit: nữ, nam, chưa rõ.

4.4. Ghép vector đặc trưng

Một bản ghi thô như "vivo X200, Nam Kinh, Nam" sẽ được chuyển thành vector One-Hot duy nhất. Thứ tự của các trường trong vector phải khớp hoàn toàn với thứ tự trong quá trình huấn luyện.

5. Mô hình học sâu

Mô hình gồm ba phần: lớp đầu vào nhận vector đặc trưng, các lớp Dense ẩn tạo khả năng phi tuyến, và lớp đầu ra trả xác suất cho từng sản phm. Sau đó, lớp tùy chỉnh chuyển xác suất thành danh sách SKU và lọc theo ngữ cảnh.

import tensorflow as tf
from tensorflow import keras

def build_ranker(input_dim, sku_count, index_map, sku_catalog):
    inputs = keras.Input(shape=(input_dim,), name="features")
    x = keras.layers.Dense(32, activation="relu", name="fc1")(inputs)
    x = keras.layers.Dense(64, activation="relu", name="fc2")(x)
    scores = keras.layers.Dense(sku_count, activation="softmax", name="scores")(x)
    filtered = FilterLayer(index_groups=index_map)(scores)
    topk_ids = TopKSkuLayer(sku_catalog, spu_count=len(sku_catalog))(filtered)
    return keras.Model(inputs=inputs, outputs=topk_ids)

5.1. Huấn luyện

Dữ liệu được chia theo tỷ lệ 80/20 cho huấn luyện và kiểm thử. Dữ liệu huấn luyện được trộn ngẫu nhiên để tăng tính ổn định. Chỉ số đánh giá chính là độ chính xác top-K.

import tensorflow as tf

def make_dataset(features, labels, length, batch_size, shuffle=True):
    ds = tf.data.Dataset.from_tensor_slices((features, labels))
    if shuffle:
        ds = ds.shuffle(buffer_size=length)
    return ds.batch(batch_size)

train_ds = make_dataset(train_x, train_y, train_count, cfg.BATCH_SIZE)
val_ds = make_dataset(test_x, test_y, test_count, cfg.BATCH_SIZE, shuffle=False)

ranker = build_ranker(
    input_dim=train_x.shape[1],
    sku_count=cfg.NUM_SKUS,
    index_map=idx_groups,
    sku_catalog=sku_list
)

ranker.compile(
    optimizer=tf.keras.optimizers.Adam(learning_rate=cfg.LR),
    loss=tf.keras.losses.SparseCategoricalCrossentropy(from_logits=False),
    metrics=[tf.keras.metrics.SparseTopKCategoricalAccuracy(k=4, name="top4_acc")]
)

ranker.fit(train_ds, validation_data=val_ds, epochs=cfg.EPOCHS)

5.2. Chuyển đổi sang TensorFlow Lite

Mô hình sau huấn luyện được lưu dưới dạng H5 hoặc SavedModel, sau đó chuyển sang định dạng TFLite để chạy trên Android. Cần chú ý tương thích các toán tử (operator) giữa TensorFlow đầy đủ và TensorFlow Lite để tránh lỗi khi nạp trên thiết bị.

def export_from_keras(model, path):
    converter = tf.lite.TFLiteConverter.from_keras_model(model)
    return converter.convert()

def export_from_savedmodel(model_dir, path):
    converter = tf.lite.TFLiteConverter.from_saved_model(model_dir)
    return converter.convert()

with open("ranker.tflite", "wb") as f:
    f.write(export_from_keras(ranker))

6. Suy luận trên thiết bị

Ứng dụng Android nạp thư viện TensorFlow Lite thông qua Gradle, sau đó khởi tạo Interpreter và chạy suy luận trực tiếp trên điện thoại.

dependencies {
    implementation 'org.tensorflow:tensorflow-lite:2.15.0'
}
public class RankerEngine {
    private final Interpreter tflite;

    public RankerEngine(Context context) throws IOException {
        tflite = new Interpreter(
            loadModelFile(context.getAssets(), "ranker.tflite")
        );
    }

    public float[] predict(float[] features, int outputLen) {
        float[][] output = new float[1][outputLen];
        tflite.run(features, output);
        return output[0];
    }
}

7. Triển khai và giám sát

Khi triển khai lên môi trường thực tế, cần giữ nguyên kích thưc đầu vào và đầu ra của mô hình giữa các phiên bản ứng dụng. Trung tâm cấu hình đám mây quản lý phiên bản mô hình, chiến lược tải xuống và kiểm tra tính toàn vẹn bằng MD5.

Các chỉ số giám sát trực tuyến bao gồm:

  • Tỷ lệ thành công: tỷ lệ nạp mô hình và chạy suy luận thành công.
  • Phân bố phiên bản: tỷ lệ thiết bị sử dụng từng phiên bản mô hình.
  • Thời gian chạy trung bình: độ trễ suy luận trên thiết bị, dùng để điều chỉnh độ phức tạp của mô hình.

Dựa vào các chỉ số này, nhóm có thể điều chỉnh kiến trúc mạng, kích thước đầu vào hoặc chiến lược gom cụm đặc trưng để cân bằng giữa hiệu năng và lợi ích kinh doanh.

Thẻ: Edge AI TensorFlow Lite On-Device Inference Recommender Systems Feature Engineering

Đăng vào ngày 19 tháng 10 lúc 18:38