Prediction.io - Tích hợp Machine Learning nhanh chóng cho ứng dụng của bạn (P1)
prediction
1
predictionIO
1
Machine Learning
17
White

Nguyễn Thế Huy viết ngày 08/03/2019

Bài toán

Machine Learning và những ứng dụng của nó đang ngày càng trở nên nổi bật trong những năm trở lại đây. Với sự phát triển thần tốc của cấu hình máy tính, tốc độ kết nối mạng, các giải pháp Machine Learning đã ra khỏi những phòng Lab truyền thống và xuất hiện nhiều hơn xung quanh cuộc sống của chúng ta. Tuy nhiên, có bao giờ bạn tự hỏi, làm sao để tích hợp Machine Learning lên ứng dụng của mình (ví dụ tính năng gợi ý bài viết trên Kipalog chẳng hạn); mà lại chưa có thời gian để nghiên cứu mô hình hay thuật toán ? . Có một giải pháp ra đời nhằm mang Học máy tiếp cận nhanh hơn, dễ hơn đối với các lập trình viên mà không cần tốn quá nhiều thời gian vào việc xây dựng các thuật toán và mô hình - đó chính là Apache PredictionIO

PredictionIO là gì

Tham khảo trên trang chủ của ứng dụng:

Apache PredictionIO® is an open source Machine Learning Server built on top of a state-of-the-art open source stack for developers and data scientists to create predictive engines for any machine learning task

PredictionIO là ứng dụng mã nguồn mở giúp tạo nên một Machine Learning Server nhanh chóng, dựa trên năng lực xử lý dữ liệu mạnh mẽ của Spark, Hadoop, ElasticSearch, tích hợp SparkML Lib để tạo ra các engine phục vụ các bài toán machine learning. Trong đó mạnh mẽ nhất chính là việc triển khai PredictionIO như một webservice, và có thể nhận sự kiện một cách real-time. Một điểm cộng nữa so với các dịch vụ tương đương như AWS Personalize, PredictionIO hoàn toán miễn phí, và hỗ trợ SDK cho nhiều ngôn ngữ lập trình khác nhau như PHP, Python, Ruby, ...

Cơ chế hoạt động của PredictionIO

PredictionIO bao gồm các thành phần chính
Event Server
Event Server lắng nghe các sự kiện đầu vào của ứng dụng. Ví dụ các sự kiện mua hàng, quan tâm, like, share, .... Đây chính là nguồn dữ liệu quan trọng để training cho model
Event Server nhận dữ liệu thông qua REST Query nên rất dễ dàng tích hợp.
Engine
Engine là phần cốt lõi của PredictionIO. PredictionIO support sẵn rất nhiều engine khác nhau phục vụ cho các bài toán cụ thể như recommendation, classification, NLP ....
Engine sẽ nhận dữ liệu từ EventServer, sau đó training và sẵn sàng cho việc query dữ liệu đầu ra thông qua REST API. Rất tiện phải không nào :D

Hình sau sẽ mô tả rõ hơn cách PredictionIO hoạt động

alt text

Cài đặt và triển khai PredictionIO trên môi trường Ubuntu

Chúng ta sẽ triển khai PredictionIO phục vụ bài toán recommendation rất phổ biến trên các website thương mại điện tử. Khi khách hàng view, hoặc purchase một item nào đó trên hệ thống, ta sẽ rất cần gợi ý các item khác để tăng lượt chuyển đổi và mua hàng. Machine Learning sẽ giúp hệ thống của chúng ta thông minh hơn nhiều so với các cách làm truyển thống.

Recommend dựa trên Collaborative Filtering

Engine Recommendation của PredictionIO dựa trên cơ chế Collaborative Filtering. Để tìm hiểu chi tiết về nó, các bạn có thể tham khảo tại đây. Nói một cách cơ bản, kỹ thuật này hoạt động trên các bước chính:

  • User thể hiện quan điểm cá nhân của họ thông qua việc đánh giá sản phẩm trên hệ thống. Điểm rating (ví dụ từ 1 đến 5) có thể được coi đại diện cho việc user có yêu thích sản phẩm hay không (1-2 là không thích, 3 là bình thường, 4-5 là thích) chẳng hạn.
  • Hệ thống tìm kiếm các user khác có nhu cầu tương tự user trên (dựa trên điểm rating)
  • Sau khi đã có danh sách các user tương tự, hệ thống sẽ recommend các sản phẩm được rating cao bởi các user trong nhóm, nhưng chưa được rate bởi user ban đầu.

Có nhiều thuật toán để triển khai mô hình cho CF, tuy nhiên với PredictionIO, chúng ta sẽ chỉ cần quan tâm đến dữ liệu đầu vào và PredictionIO sẽ làm phần việc còn lại :D.

Cài đặt

Thời đại nhà nhà Docker, người người Docker, và PredictionIO cũng support Docker cho chúng ta, yeah :D. Let's start:
À link gốc ở đây để các bạn tham khảo nhé.

git clone https://github.com/apache/predictionio.git
cd predictionio/docker

Rồi, ta build docker image lên:

docker build -t predictionio/pio pio

Chạy docker compose, chúng ta sử dụng postgres là nơi lưu trữ dữ liệu về event (các sự kiện đầu vào), meta data (dữ liệu hệ thống), model (dữ liệu về mô hình). Bên cạnh postgres, PredictionIO support lưu trữ dữ liệu trên Elasticsearch, Hadoop, đảm bảo chịu tải và tính scale rất cao.


docker-compose -f docker-compose.yml \
-f pgsql/docker-compose.base.yml \
-f pgsql/docker-compose.meta.yml \
-f pgsql/docker-compose.event.yml \
-f pgsql/docker-compose.model.yml \
up

Bạn có thể detach docker container bằng cách thêm tham số -d ở cuối để nó chạy background nhé.

Set tham số môi trường cho PredictionIO
export PATH=pwd/bin:$PATH
Kiểm tra hệ thống
pio-docker status
Nếu hiện lên [INFO] [Management$] Your system is all ready to go. thì Event server của chúng ta đã sẵn sàng để lắng nghe sự kiện rồi :D (mặc định là port 7070)

Xong rồi, chúng ta sẽ cài đặt bộ engine Recommendation của PredictionIO nhé.

À nói thêm, bên cạnh bộ engine này, PredictionIO cũng support cực nhiều các engine khác nhau để phục vụ business của chúng ta (quá tiện phải không ? :D). Cách triển khai với các engine này là hoàn toàn tương tự nhau, chỉ khác một chút, các bạn có thể tham khảo README của từng engine nhé. Danh sách engine của PredictionIO các bạn có thể tham khảo tại đây

Ta quay trở lại với thư mục docker của PredictionIO ở trên nhé.

cd templates
$ git clone https://github.com/apache/predictionio-template-recommender.git MyRecommendation
$ cd MyRecommendation

Tạo một app mới trong PredictionIO nhé:
pio-docker app new MyApp
Hệ thống sẽ trả ra thông tin về app, trong đó có access key. Bạn hãy lưu thông tin access key này lại để sử dụng sau này nhé.
Chú ý là với meta storage engine khác nhau (ví dụ Elasticsearch hoặc MySQL thì access key sẽ khác nhau nhé, và bạn cũng sẽ cần tạo lại app khi đổi meta storage engine

Trước khi build Recomendation engine, chúng ta sẽ thay đổi cấu hình file engine.json trong thư mục MyRecommendation nhé. Bạn cập nhật nội dung trong file thành tương tự như sau:

...
"datasource": {
"params" : {
"appName": "MyApp"
}
},

Sau đó thì ta sẽ build engine Recomendation lên, thao tác này có thể hơi lâu trong lần đầu tiên, các bạn hãy kiên nhẫn một chút nha :D
pio-docker build
Sau khi build thành công, engine recommendation đã có thể hoạt động. Tuy nhiên không có data đầu vào thì làm sao dự đoán được :(. Nên chúng ta sẽ cần gửi thêm data đầu vào cho Engine thông qua Event server nhé.

Việc này thì không khó chút nào, vì PredictionIO support REST API mà. Nếu bạn xài PHP - Laravel làm demo như mình, chúng ta thậm chí còn có cả package SDK nữa cơ. Nào ta cùng chạy composer :D
composer require predictionio/predictionio
Đợi composer setup xong, mỗi khi user xảy ra event Rating sản phẩm, ta sẽ đẩy nó vào event server nhé

use predictionio\EventClient;
$accessKey = 'access-key-o-ben-tren;
$client = new EventClient($accessKey, 'http://localhost:7070'); //Event Server của chúng ta
$client->createEvent([
'event' => 'rating',
'entityType' => 'user',
'entityId' => $userId,
'targetEntityType' => 'item',
'targetEntityId' => $itemId,
'eventTime' => Carbon::now()->toIso8601String()
]);

Done, bạn hãy tạo nhiều data phong phú để có kết quả predict tốt nhất nhé :D

Xong rồi, giờ ta query lấy kết quả predict thôi :D

À quên, phải train data nữa, quay trở lại với thư mục MyRecomendation bên trên:

pio-docker train
pio-docker deploy

Nếu hiện như thế này, thì server kết quả đã up and running
``
[INFO] [HttpListener] Bound to /0.0.0.0:8000
[INFO] [MasterActor] Bind successful. Ready to serve.

Đoạn code sau mình họa cách lấy ra danh sách id các sản phẩm sẽ recommend cho một userId (Lấy ra danh sách 8 sản phẩm)
$engineClient = new EngineClient('http://localhost:8000');
$suggestItems = $engineClient->sendQuery(array('user' => $userId, 'num' => 8)); // Submit user id bạn muốn dự đoán, và lấy ra 8 kết quả
$itemArr = [];
if (!empty($suggestItems)) {
$items = $suggestItems['itemScores'];
if (!empty($items)) {
foreach ($items as $item) {
$itemArr[] = $item['item'];
}
}
}
$suggests = Product::whereIn('id', $itemArr)->get(); //kết quả suggest lấy ra ở đây

Xong rồi, bạn đã tích hợp thành công tính năng gợi ý sản phẩm dựa trên Machine Learning vào ứng dụng của mình rồi, không khó mà tiết kiệm được nhiều thời gian và chi phí đúng không nào :D.

Trong phần sau bài viết, mình sẽ hướng dẫn thêm về Universal Recommender, một engine mạnh mẽ bậc nhất của Prediction IO hiện tại về recommend, cũng như cách bạn có thể đưa thuật toán của mình để custom engine PredictionIO

Cám ơn các bạn đã đọc bài viết của mình, hy vọng nó giúp ích được công việc các bạn hàng ngày :D. Thank you !

Bình luận


White
{{ comment.user.name }}
Bỏ hay Hay
{{comment.like_count}}
Male avatar
{{ comment_error }}
Hủy
   

Hiển thị thử

Chỉnh sửa

White

Nguyễn Thế Huy

9 bài viết.
39 người follow
Kipalog
{{userFollowed ? 'Following' : 'Follow'}}
Cùng một tác giả
White
30 8
Hi cả nhà, đây là bài viết đầu tiên của mình trên Kipalog nên có gì không hay mong các bạn thông cảm :D Realtime là gì ? Như chúng ta đều đã biế...
Nguyễn Thế Huy viết hơn 1 năm trước
30 8
White
27 5
Xin chào mọi người :D Trong bài viết này mình sẽ trình bày một cách cơ bản để ứng dụng kỹ thuật Http Live Streaming (HLS) để play video trên web, ...
Nguyễn Thế Huy viết hơn 1 năm trước
27 5
White
11 0
Trong bài viết nho nhỏ này mình xin chia sẻ một case mà mình mới gặp trong quá trình làm việc với Mysql, hy vọng có thể giúp được các bạn gặp phải ...
Nguyễn Thế Huy viết 10 tháng trước
11 0
{{like_count}}

kipalog

{{ comment_count }}

bình luận

{{liked ? "Đã kipalog" : "Kipalog"}}


White
{{userFollowed ? 'Following' : 'Follow'}}
9 bài viết.
39 người follow

 Đầu mục bài viết

Vẫn còn nữa! x

Kipalog vẫn còn rất nhiều bài viết hay và chủ đề thú vị chờ bạn khám phá!