Monolith: Bí mật đằng sau Tiktok
Monolith: Real Time Recommendation System With Collisionless Embedding Table
Mới đây, ByteDance vừa cho đăng tải paper mô tả hệ thống khuyến nghị theo thời gian thực của họ. ByteDance chính là công ty mẹ của TikTok, do đó sự thành công của TikTok là minh chứng rõ ràng cho hệ thống khuyến nghị mà họ phát triển. Chúng ta cùng note lại một số điểm đáng chú ý trong paper này để hiểu điều gì đã làm nên sự thành công đằng sau Tiktok.
Hệ thống khuyến nghị mà ByteDance phát triển có tên là Monolith. Monolith được xây dựng dựa trên mô hình TensorFlow distributed Worker - Parameter Server phục vụ cho 2 phase training đó là batch training và online training.
Trong hệ thống này, hai vấn đề quan trọng nhất mà các kỹ sư của ByteDance đã chú trọng giải quyết đó là:
- Sparse Feature: Ma trận đặc trưng (feature map) là một ma trận thưa (sparse) và kích thước có thể thay đổi theo thời gian bởi vì số lượng user và item luôn tăng lên từng ngày. Hãy tưởng tượng ta phải xử lý ma trận đặt trưng cho hàng tỉ user và item, nhưng những phần tử trong ma trận đó đa số là số 0. Do đó sẽ rất lãng phí tài nguyên nếu không có một cơ chế tính toán phù hợp.
- Non-stationary distribution: Vấn đề thứ hai đó là tính bất định của data distribution. Khác với những bài toán khác, hệ thống khuyến nghị phải làm việc với dữ liệu thay đổi liên tục, cụ thể là sở thích, buy-intention, nhu cầu của người dùng. Khách hàng có thể thay đổi nhu cầu hay ý định mua một sản phẩm nào đó của mình chỉ trong một vài phút hoặc một vài cú chạm vào màn hình. Vấn đề này thường được gọi bằng cái tên là hiện tượng Concept Drift. Do đó hệ thống phải đủ linh hoạt để đưa ra danh sách gợi ý ngây lập tức để không bỏ lỡ "mood" của khách hàng.
Để đối phó với vấn đề thứ nhất, thay vì sử dụng TensorFlow variable để lưu ma trận embedding (sparse params) cho toàn bộ user-item thì Monolith sử dụng Cuckoo Hashmap cho ma trận này. Ma trận đặc trưng này được gọi là collisionless embedding table. Phần còn lại là dense parameters (weight/variable của neural network) thì được lưu bằng TensorFlow variable như bình thường. Ngoài ra, Monolith cũng thực hiện thêm một số kỹ thuật cắt tỉa (prune) ID để giảm chi phí tính toán như:
- Loại bỏ những ID với tần suất xuất hiện rất ít, phương pháp này sẽ giúp giảm đi được rất nhiều chi phí tính toán vì dữ liệu của hệ thống khuyến nghị cơ bản là long-tail distributed trong hầu hết mọi tình huống.
- Loại bỏ những ID đã lâu không hoạt động (out-date) như những user đã lâu không truy cập nền tảng hoặc những video đã không còn ai xem.
Còn với vấn đề thứ hai, để giải quyết hiện tượng Concept Drift, hệ thống phải có khả năng nhanh chóng đáp ứng và cho ra danh sách gợi ý mới dựa trên hành động tức thì của người dùng trên nền tảng. Monolith thực hiện điều này bằng cách đưa vào hệ thống quá trình online training. Tượng tự với batch training, Monolith consume realtime data từ streaming engine và thực hiện forward/backward pass ngay sau khi nhận được event từ user.
Ngoài ra, bởi vì user action sequence có tính thứ tự mà các hệ thống streaming như Kafka thì lại stream event bất đồng bộ nên phải sử dụng thêm Apache Flink làm online joiner. Tại bước này tất cả các dữ liệu sẽ được tiền xử lý, sắp xếp, deduplicate và thực hiện negative sampling trước khi được được đẩy qua pha huấn luyện.
Về kiến trúc mô hình khuyến nghị thì Monolith sử dụng mô hình học sâu cơ bản DeepFM để tính toán danh sách gợi ý. Ngoài ra do có 2 parameter server (training và serving) nên việc đồng bộ tham số cũng rất quan trọng. Để đảm bảo tính fault-tolerance của hệ thống, tham số mô hình sẽ luôn được snapshot định kỳ, bất kỳ khi nào có một parameter server bị lỗi thì sẽ được recover ngay lập tức bằng phiên bản gần nhất.
Có thể thấy, so với các hệ thống realtime analytics khác thì Monolith không phải là quá phức tạp. Ngay cả kiến trúc của mô hình khuyến nghị cũng là một mô hình rất cơ bản. Tuy nhiên, các thí nghiệm cho thấy nhờ sử dụng những kỹ thuật như collisionless embedding table và online training, Monolith đã cải thiện rất đáng kể khả năng gợi ý theo thời gian thực và mang lại trải nghiệm rất tốt cho người dùng.