2. Agenda
● Intro to Redis and Redis Labs - 5 min
● Using Redis-ML for Model Serving - why and how - 10 min
● Exploring the MovieLens Dataset and classification using Spark-ML and Redis-ML - 15 min
● Q&A
2
3. Redis Labs – Home of Redis
Founded in 2011
HQ in Mountain View CA, R&D center in Tel-Aviv IL
The commercial company behind Open Source Redis
Provider of the Redis Enterprise (Redise) technology,
platform and products
3
4. Redise Cloud Private
Redis Labs Products
Redise Cloud Redise Pack ManagedRedise Pack
SERVICES SOFTWARE
Fully managed Redise service in
VPCs within AWS, MS Azure, GCP
& IBM Softlayer
Fully managed Redise service on
hosted servers within AWS, MS
Azure, GCP, IBM Softlayer,
Heroku, CF & OpenShift
Downloadable Redise software
for any enterprise datacenter or
cloud environment
Fully managed Redise Pack in
private data centers
&& &
5. Redis Main Differentiations
Simplicity
(through Data Structures)
Extensibility
(through Redis Modules)
Performance
ListsSorted Sets
Hashes Hyperlog-logs
Geospatial
Indexes
Bitmaps
SetsStrings
Bit field
5
6. A Quick Recap of Redis
Key
"I'm a Plain Text String!"
{ A: “foo”, B: “bar”, C: “baz” }
Strings / Bitmaps / BitFields
Hash Tables (objects!)
Linked Lists
Sets
Sorted Sets
Geo Sets
HyperLogLog
{ A , B , C , D , E }
[ A → B → C → D → E ]
{ A: 0.1, B: 0.3, C: 100, D: 1337 }
{ A: (51.5, 0.12), B: (32.1, 34.7) }
00110101 11001110 10101010
7. What's Redis Modules
● Any C/C++ program can now run on Redis
● Modules are a native way to extend Redis for new use cases and functions
● Use existing or add new data-structures
● Enjoy simplicity, infinite scalability and high availability while keeping the
native speed of Redis
● Can be created by anyone
7
8. Modules : A Revolutionary Approach
Adapt your database to your data, not the other way around
Secure way to store data in
Redis via encrypt/decrypt with
various Themis primitives
Time Series Graph
Time series values aggregation
in Redis
Crypto Engine Wrapper
Graph database on Redis
based on Cypher language
Based on Generic Cell Rate
Algorithm (GCRA)
Rate Limiter
ReJSON
Secondary Index/RQL
JSON Engine on Redis.
Pre-released
Indexing + SQL -like syntax for
querying indexes.
Pre-released
Neural Redis Redis-ML RediSearch
Full Text Search Engine in RedisMachine Learning Model
Serving
Simple Neural Network Native
to Redis
10. The Machine / Deep Learning (ML/DL) World
(1) Load the data (2) Train a model (3) Serve the model
Homegrown
11. Typical Machine Learning Lifecycle with Spark-ML
Spark Training
Data is loaded into Spark Model is saved in files
File System Custom Server
Model is loaded to your
custom app
Serving Client
Client App
11
12. ML Models Serving Challenges
• Models are becoming bigger and more complex
• Can be challenging to deploy & serve
• Do not scale well, speed and size
• Reliable services are hard to do
• Can be very expensive
12
13. A Simpler Machine Learning Lifecycle
Any Training
Platform
Data loaded into Spark Model is saved in
Redis-ML
Redis-ML
Serving Client
Client
App
Client
App
Client
App
+
Spark Training
13
14. Redis-ML – ML Serving Engine
• Store training output as “hot model”
• Perform evaluation directly in Redis
• Easily integrate existing C/C++ ML libs
• Can be tuned on-the-fly
• Enjoy the performance, scalability and HA of Redis
14
16. Random Forest Model
• A collection of decision trees
• Supports classification & regression
• Splitter Node can be:
◦ Categorical (e.g. day == “Sunday”)
◦ Numerical (e.g. age < 43)
• Decision is taken by the majority of decision trees
16
17. Decision Tree Process
The algorithm is “greedy”
The selected splitter gives the best information gain
Information gain - the purest result
17
19. Titanic Survival Predictor on a Decision Tree
YES
Sex =
Male ?
Age <
9.5?
*Sibps >
2.5?
Survived
Died
SurvivedDied
*Sibps = siblings + spouses
NO
19
20. Titanic Survival Predictor on a Random Forest
YES
Sex =
Male ?
Age <
9.5?
*Sibps >
2.5?
Survived
Died
SurvivedDied
NO YES
Country=
US?
State =
CA?
Height>
1.60m?
Survived
Died
SurvivedDied
NO YES
Weight<
80kg?
I.Q<100?
Eye color
=blue?
Survived
Died
SurvivedDied
NO
Tree #1 Tree #2 Tree #3
21. Would John Survive The Titanic
• John’s features:
{male, 34, married + 2, US, CA, 1.78m, 78kg, 110iq, blue eyes}
• Tree#1 – Survived
• Tree#2 – Failed
• Tree#3 – Survived
• Random forest decision - Survived
21
22. Real World Challenge
• Ad serving company
• Need to serve 20,000 ads/sec @ 50msec data-center latency
• Runs 1k campaigns → 1K random forest
• Each forest has 15K trees
• On average each tree has 7 levels (depth)
22
23. Ads Model Serving: Homegrown vs. Redise + ML
Homegrown
1,247 x c4.8xlarge 35 x c4.8xlarge
Cut computing infrastructure
by 97%
23
24. Redis ML with Spark ML
Classification Time Over Spark
40x Faster
24
28. Using the Dockers
$ docker pull shaynativ/redis-ml
$ docker run --net=host shaynativ/redis-ml
$
$ docker pull shaynativ/spark-redis-ml
$ docker run --net=host shaynativ/spark-redis-ml
29. One Forest For Each Movie
29
User Features:
(Age, Gender,
MovieRatings)
Movie_1 Forest
3
Movie_2 Forest 2
Movie_n Forest
5
.
.
.
30. Step 1: Get The Data
30
Download and extract the MovieLens 100K Dataset
The data is organized in separate files:
Ratings: user id | item id | rating (1-5) | timestamp
Item (movie) info: movie id | genre info fields (1/0)
User info: user id | age | gender | occupation
Our classifier should return the expected rating (from 1 to 5) a user would give the movie in question
31. Step 2: Transform
31
The training data for each movie should contain 1 line per user:
class (rating from 1 to 5 the user gave to this movie)
user info (age, gender, occupation)
user ratings of other movies (movie_id:rating ...)
user genre rating averages (genre:avg_score ...)
Run gen_data.py to transform the files to the desired format
32. Step3: Train and Load to Redis
// Create a new forest instance
val rf = new
RandomForestClassifier().setFeatureSubsetStrategy("auto").setLabelCol("indexedLabel").setFeat
uresCol("indexedFeatures").setNumTrees(500)
…..
// Train model
val model = pipeline.fit(trainingData)
…..
val rfModel = model.stages(2).asInstanceOf[RandomForestClassificationModel]
// Load the model to redis
val f = new Forest(rfModel.trees)
f.loadToRedis(”movie-10", "127.0.0.1")
32
33. Step 3: Execute in Redis
Redis-ML
+
Spark
Training
Client App
37. Getting Actual Recommendations - Python Script
#!/usr/bin/python
import operator
import redis
config = {"host":"localhost", "port":6379}
r = redis.StrictRedis(**config)
user_profile = r.get("user-1-profile")
results = {}
for i in range(1, 11):
results[i] = r.execute_command("ML.FOREST.RUN", "movie-{}".format(i), user_profile)
print "Movies sorted by scores:"
sorted_results = sorted(results.items(), key=operator.itemgetter(1), reverse=True)
for k,v in sorted_results:
print "movie-{}:{}".format(k,v)
print ""
print "Recommended movie: movie-{}".format(sorted_results[0][0])
38. Getting Actual Recommendation
$ ./classify_user.py 1
Movies sorted by scores:
movie-4:3
movie-3:2
movie-6:2
movie-7:2
movie-8:2
movie-9:2
movie-1:1
movie-2:1
movie-5:1
movie-10:0
Recommended movie for user 1: movie-4
39. Summary
• Train with Spark, Serve with Redis
• 97% resource cost serving
• Simplify ML lifecycle
• Redise (Cloud or Pack):
‒Scaling, HA, Performance
‒PAYG – cost optimized
‒Ease of use
‒Supported by the teams who created Spark and
Redis
Spark Training
Data loaded into Spark Model is saved in
Redis-ML
Redis-ML
Serving Client
Client
App
Client
App
Client
App
+