PredictionIO Phần 1 - Hướng dẫn cài đặt

- Phạm Duy Tùng
Bài này nằm trong loạt serie nghiên cứu và sử dụng công cụ PredictionIO. Đây là bài mở đầu, hướng dẫn cách cài đặt PredictionIO trên ubuntu.

1. Giới thiệu về PredictionIO

PredictionIO là một “open source Machine Learning Server built on top of a state-of-the-art open source stack” giúp cho các developers và các data scientists tạo ra các engine dự đoán trong học máy. PredictionIO giúp chúng ta

  • Xây dựng và triển khai các ứng dụng, dịch vụ một cách nhanh chóng bằng cách tuỳ chỉnh lại các template đã sẵn có.

  • Trả lời các câu truy vấn động trong thời gian thực.

  • huấn luyện và so sánh/đánh giá nhiều mô hình khác nhau dễ dàng.

  • Hợp nhất hoá dữ liệu từ nhiều nền tảng khác nhau hoặc trong thời gian thực để thực hiện phân tích dự đoán.

  • Hỗ trợ các thư viện máy học và xử lý dữ liệu như Spark MLLib và OpenNLP

  • Tự xây dựng, triển khai, customize một mô hình machine learning

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

PredictionIO bao gồm các thành phần sau:

  • PredictionIO platform: là nền tảng open source được apache xây dựng sẵn giúp chúng ta triển khai, xây dựng, đánh giá các mô hình máy học.

  • Event Server: là nơi giúp chúng ta chuẩn hoá các sự kiện từ nhiều nguồn khác nhau

  • Template Gallery: là nơi chúng ta download các engine template máy học về. PredictionIO hỗ trợ cho chúng ta rất nhiều template mẫu khác nhau. Chúng ta sẽ lần lượt tìm hiểu và implement ở các bài viết tiếp theo.

Event Server

PredictionIO Event Server chịu trách nhiệu thu thập dữ liệu từ các ứng dụng của bạn. Bạn có thể nhìn kỹ hơn ở hình bên dưới, các ứng dụng web, mobile app … khi người dùng tương tác sẽ phát sinh các sự kiện (Event Data), ví dụ sự kiện người dùng thêm 1 đơn hàng vào giỏ hàng, người dùng xem sản phẩn A, người dùng xem sản phẩm C sau khi xem sản phẩm A… Event Server sẽ ghi nhận lại đống dữ liệu này, chuẩn hoá lại. PredictionIO engine sau đó sẽ xây dựng mô hình dự đoán dựa trên các dữ liệu chúng ta thu thập được. Sau khi bạn có được mô hình tối ưu, chúng ta sẽ deploy các predict webservice, lắng nghe các truy vấn từ các ứng dụng và trả về kết quả trong thời gian thực.

Hình ảnh Hình 1: Event server trong predictionio

Event Server sẽ thu thập dữ liệu của bạn trong thời gian thực hoặc theo chu kỳ. Sau đó, nó sẽ chuẩn hoá dữ liệu hỗn độn của bạn từ nhiều nguồn khác nhau thành một dạng chuẩn chung. Event Server chủ yếu phục vụ hai mục đính chính:

  • Cung cấp dữ liệu cho các engine để huấn luyện và đánh giá

  • Cung cấp dữ liệu dạng chuẩn để data analysis

Cũng giống như một database server, Event Server có thể được sử dụng để phục vụ cho nhiều ứng dụng khác nhau. Dữ liệu được phân tách cho các ứng dụng bằng “app_name” duy nhất. Cái này sẽ nói lại lúc xây dựng ứng dụng ở bên dưới.

Khi một Event Server được triển khai, bạn có thể gửi dữ liệu cho một ‘app_name’ cụ thể nào đó, app-name được định danh bằng access key. Dữ liệu được gửi đến Event Server sử dụng EventAPI sử dụng giao thức http (tham khảo thêm ở https://predictionio.apache.org/datacollection/eventapi/) hoặc sử dụng các PredictionIO SDK. Tham khảo thêm các SDK ở https://predictionio.apache.org/sdk/.

Trong một số trường hợp, bạn muốn engine đọc dữ liệu từ một datastore nào đó thay vì Event Server. Bạn có thể thực hiện thông qua hướng dẫn ở https://predictionio.apache.org/start/customize/

Engine

Engine là nơi chịu trách nhiệu đưa ra các quyết định. Nó gồm một hoặc nhiều thuật toán học máy học khác nhau. Các Engine sẽ huấn luyện dữ liệu và xây dựng các mô hình dự đoán. Sau đó sẽ phát triển thành các webservice. Các webservice sẽ nhận các truy vấn từ ứng dụng, dự đoán và trả về kết quả cho ứng dụng.

PredictionIO’s cung cấp cho chúng ta rất nhiều các template khác nhau đáp ứng gần như là đẩy đủ các mô hình máy học mà chúng ta cần. Bạn có thể dễ dàng tạo một mô hình máy học từ các template. Các thành phần của một template dược đặt tên là Data Source, Data Preparator, Algorithm(s), Serving, các bạn có thể dễ dàng customize lại tuỳ thuộc nhu cầu của bạn.

3. Cài đặt PredictionIO trên môi trường Ubuntu

Trong thời đại docker, các bạn có thể cài đặt PredictionIO dựa vào các docker được xây dựng sẵn đầy rẫy trên mạng, chúng giúp bạn đỡ tốn công sức hơn. Tuy nhiên, trong bài viết này, mình sẽ cài đặt từng thành phần PredictiIO trên ubuntu, không sử dụng docker.

Download và build Apache Prediction IO

Chúng ta sẽ download Prediction IO từ trang github chính chủ. Phiên bản hiện tại là 0.14.0. Các bạn có thể lưu dữ liệu ở đâu tuỳ ý các bạn. Mình lưu ở thư mục /data/pio. Và trong suốt bài viết này, mình sẽ lưu các thứ liên quan trong thư mục /data/pio. Các bạn có cài đặt theo hướng dẫn của mình thì nhớ sửa lại cho đúng đường dẫn của các bạn. Chúng ta sẽ clone nguồn từ trang github predictionio. và sẽ switch qua branch release. Đây là branch chính thành phẩm, các branch khác đang trong giai đoạn phát triển nên có thể build không được. Lúc các bạn làm có thể nó đã phát triển lên bản 15, 16 hoặc 1.0 gì đó rồi. Các bạn cứ tự tin sử dụng phiên bản mới nhất.

git clone https://github.com/apache/predictionio.git
git checkout release/0.14.0

Biên dịch Prediction IO

Sau khi tải về bộ nguồn của Prediction IO, chúng ta sẽ tiền hành biên dịch. Quá trình biên dịch sẽ xảy ra khá lâu, các bạn kiên nhẫn chờ đợi

cd predictionio
./make-distribution.sh

Kết thúc quá trình biên dịch, các bạn sẽ thấy dòng chữ

PredictionIO binary distribution created at PredictionIO-0.14.0.tar.gz

Vậy là chúng ta đã thành công. Việc tiếp theo là giải nén file PredictionIO-0.14.0.tar.gz để sử dụng

tar xvzf PredictionIO-0.14.0.tar.gz -C /data/pio

Nhắc lại 1 lần nữa là do thời điểm hiện tại mình viết bài viết này, PredictionIO mới release bản 0.14.0 nên file tập tin sẽ là PredictionIO-0.14.0.tar.gz. Các bạn nhớ giải nén đúng với tên file ứng với phiên bản PredictionIO tương ứng nhé.

Download và giải nén các Dependencies

Mình sẽ sử dụng Spark, ElasticSearch, Hbase và zookeeper, nên mình download hết về. Mình có thói quen sử dụng phiên bản mới nhất. Nên mình lên trang chủ và lấy link download mới nhất của chúng thôi. Tất cả các Dependencies mình dùng đều được bỏ vào trong thư mục vendors


cd PredictionIO-0.14.0
mkdir vendors
cd vendors
wget https://archive.apache.org/dist/spark/spark-2.4.2/spark-2.4.2-bin-hadoop2.7.tgz

wget https://artifacts.elastic.co/downloads/elasticsearch/elasticsearch-5.6.9.tar.gz

wget https://www.apache.org/dyn/closer.lua/hbase/2.1.4/hbase-2.1.4-bin.tar.gz

wget https://www-us.apache.org/dist/zookeeper/zookeeper-3.4.14/zookeeper-3.4.14.tar.gz

tar xvzf spark-2.4.2-bin-hadoop2.7.tgz

tar xvzf elasticsearch-5.6.9.tar.gz

tar xvzf hbase-2.1.4-bin.tar.gz

tar xvzf zookeeper-3.4.14/zookeeper-3.4.14.tar.gz

Cấu hình chương trình

Cấu hình dependency

Chúng ta sẽ cấu hình một chút để PredictionIO nhận ra các dependency của mình và cấu hình các dependency

Đầu tiên, chúng ta sẽ chỉnh sửa file hbase-site.xml của HBase

nano /data/pio/PredictionIO-0.14.0/vendors/hbase-2.1.4/conf/hbase-site.xml

Thay đoạn

<configuration>
</configuration>

bằng đoạn

<configuration>
  <property>
    <name>hbase.rootdir</name>
    <value>file:///data/pio/PredictionIO-0.14.0/vendors/hbase-2.1.4</value>
  </property>
  <property>
    <name>hbase.zookeeper.property.dataDir</name>
    <value>/data/pio/PredictionIO-0.14.0/vendors/zookeeper-3.4.14</value>
  </property>
</configuration>

Tiếp theo, chúng ta sẽ add đường dẫn java cho hbase

nano /data/pio/PredictionIO-0.14.0/vendors/hbase-2.1.4/conf/hbase-env.sh

Thêm đoạn

 export JAVA_HOME=/usr/lib/jvm/java-8-openjdk-amd64/jre/

các bạn hãy thay đường dẫn java tương ứng với đường dẫn trong máy bạn. Nếu chưa có java thì các bạn hãy cài vào, nếu các bạn đã cài java mà không biết nó nằm ở đâu, các bạn có thể gọi lệnh bên dưới để xem đường dẫn

update-alternatives --config java

Để chắc chắn rằng trong máy của bạn có cài java bạn hãy gọi lện java -version

Ví dụ trong máy mình

$java -version
openjdk version "1.8.0_191"
OpenJDK Runtime Environment (build 1.8.0_191-8u191-b12-2ubuntu0.16.04.1-b12)
OpenJDK 64-Bit Server VM (build 25.191-b12, mixed mode)


Các bạn cố gắng sử dụng phiên bản java mới nhất. Nó sẽ tương thích tốt hơn với phiên bản mới nhất của HBase, hoặc đọc phiên bản java đề nghị trong trang chủ HBase. Tránh trường hợp sử dụng phiên bản java quá cũ HBase không hỗ trợ.

Cấu hình Prediction IO

Chỉnh sửa file pio-env.sh.


nano /data/pio/PredictionIO-0.14.0/conf/pio-env.sh

Mặc định PredictionIO sử dụng PosgresSQl làm event server. Mình không dùng nó mà thay thế bằng HBASE và ELASTICSEARCH.

Một số thay đổi mình sẽ liệt kê bên dưới

SPARK_HOME=$PIO_HOME/vendors/spark-2.3.2-bin-hadoop2.7

HBASE_CONF_DIR=$PIO_HOME/vendors/hbase-2.1.4/conf

PIO_STORAGE_REPOSITORIES_METADATA_NAME=pio_meta
PIO_STORAGE_REPOSITORIES_METADATA_SOURCE=ELASTICSEARCH

PIO_STORAGE_REPOSITORIES_EVENTDATA_NAME=pio_event
PIO_STORAGE_REPOSITORIES_EVENTDATA_SOURCE=HBASE

PIO_STORAGE_REPOSITORIES_MODELDATA_NAME=pio_model
PIO_STORAGE_REPOSITORIES_MODELDATA_SOURCE=LOCALFS

#Comment các dòng này lại, do không dùng postgres
# PIO_STORAGE_SOURCES_PGSQL_PASSWORD accordingly
# PIO_STORAGE_SOURCES_PGSQL_TYPE=jdbc
# PIO_STORAGE_SOURCES_PGSQL_URL=jdbc:postgresql://localhost/pio
# PIO_STORAGE_SOURCES_PGSQL_USERNAME=pio
# PIO_STORAGE_SOURCES_PGSQL_PASSWORD=pio

PIO_STORAGE_SOURCES_ELASTICSEARCH_HOME=$PIO_HOME/vendors/elasticsearch-5.6.9
PIO_STORAGE_SOURCES_HBASE_HOME=$PIO_HOME/vendors/hbase-2.1.4

4.Khởi chạy hệ thống

Chúng ta sẽ add path của PredictIO vào biến môi trường để sử dụng cho các lần sau


nano ~/.bashrc
erport PATH=/data/pio/PredictionIO-0.14.0/bin:$PATH

Hoặc có thể add path trong mỗi session

PATH=$PATH:/data/pio/PredictionIO-0.14.0/bin; export PATH

Tiếp theo, chúng ta sẽ cấp quyền cho thư mục PredictionIO

sudo chmod -R 775 /data/pio

Nếu không cấp quyền write cho thư mục thì PredictionIO không thể write log file được.

Chạy PredictionIO Server bằng cách gọi câu lệnh

pio-start-all

Kết quả

Stopping PredictionIO Event Server...
Stopping HBase...
stopping hbase.............
Stopping Elasticsearch...
[email protected]:/data/pio/PredictionIO-0.14.0/bin$ pio-start-all
Starting Elasticsearch...
Starting HBase...
running master, logging to /data/pio/PredictionIO-0.14.0/vendors/hbase-2.1.4/bin/../logs/hbase-tgdd-master-U1604.out
Waiting 10 seconds for Storage Repositories to fully initialize...
Starting PredictionIO Event Server...

Để kiểm tra hệ thống khi start có lỗi lầm gì không, chúng ta sử dụng lệnh

pio status

Kết quả

[INFO] [Management$] Inspecting PredictionIO...
[INFO] [Management$] PredictionIO 0.14.0 is installed at /data/pio/PredictionIO-0.14.0
[INFO] [Management$] Inspecting Apache Spark...
[INFO] [Management$] Apache Spark is installed at /data/spark-2.3.2-bin-hadoop2.7
[INFO] [Management$] Apache Spark 2.3.2 detected (meets minimum requirement of 2.0.2)
[INFO] [Management$] Inspecting storage backend connections...
[INFO] [Storage$] Verifying Meta Data Backend (Source: ELASTICSEARCH)...
[INFO] [Storage$] Verifying Model Data Backend (Source: LOCALFS)...
[INFO] [Storage$] Verifying Event Data Backend (Source: HBASE)...
[INFO] [Storage$] Test writing to Event Store (App Id 0)...
[INFO] [HBLEvents] The table pio_event:events_0 doesn't exist yet. Creating now...
[INFO] [HBLEvents] Removing table pio_event:events_0...
[INFO] [Management$] Your system is all ready to go.

Bạn thấy dòng chữ [INFO] [Management$] Your system is all ready to go. thì yên tâm, hệ thống đã chạy thành công.

Để stop hệ thống, các bạn gọi lệnh

pio-stop-all

Kết quả khi stop

Stopping PredictionIO Event Server...
Stopping HBase...
stopping hbase.............
Stopping Elasticsearch...

Vậy là chúng ta đã tiến hành cài đặt thành công PredictionIO Server rồi. Hẹn gặp bạn ở bài thứ hai, cài đặt các template cho PredictionIO và tiến hành dự đoán.

Cảm ơn các bạn đã theo dõi. Hẹn gặp bạn ở những bài viết tiếp theo.


Bài viết khác
comments powered by Disqus