BigDL is a deep learning framework modeled after Torch and open-sourced by Intel in 2016. BigDL runs on Apache Spark, a fast, general, distributed computing platform that is widely used for Big Data processing and machine learning tasks.
https://www.bigdataspain.org/2017/talk/deep-learning-in-spark-with-bigdl
Big Data Spain 2017
16th -17th November Kinépolis Madrid
13. About deep learning
Family of machine learning methods
Inspired by functioning of the nervous system
Learning units are organized in layers
Started in the 60's
Again popular due to algorithmic advances and
rise of computing resources
Every month brings new advances (e.g. "capsule
networks")
14. Deep learning applications
Computer vision
Speech recognition
Natural language processing
Handwriting transcription
Recommendation systems
Better ad targeting
Google Echo, Amazon Alexa
15. Types of neural networks
Convolutional NNs (CNNs)
Region-based CNNs (R-CNNs)
Single Shot MultiBox Detector (SSDs)
Recurrent NNs (RNNs)
Long short-term memory (LSTMs)
Autoencoders
Generative Adversarial Networks (GANs)
Many other types
29. Available frameworks
Intel BigDL
Tensor ow on Spark
Databricks Deep Learning Pipelines
Ca e on Spark
Elephas (Keras)
MXNet
mmlspark (CNTK)
Eclipse Deeplearning4j
SparkCL
SparkNet
...
30. About Intel BigDL
Open-sourced in February 2017
Uses Intel MKL for fast computations
Integrated into Spark
No GPU execution
Python and Scala APIs
Load/save Ca e, TF, Torch models
A wide variety of layers, optim methods, loss
functions
33. Starting BigDL in local mode
Add BigDL jar to the classpath
Then...
import com.intel.analytics.bigdl.utils.Engine
System.setProperty("bigdl.localMode", "true")
System.setProperty("bigdl.coreNumber", 8)
Engine.init
34. Starting BigDL on Spark
Add BigDL jar to the classpath (--jars)
Set cmdline parameters (standalone and Mesos):
Set cmdline parameters (YARN):
In your code...
spark-submit --master spark...
--executor-cores --total-executor-cores
spark-submit --master yarn
--executor-cores --num-executors
import com.intel.analytics.bigdl.utils.Engine
val conf = Engine.createSparkConf()
val sc = new SparkContext(conf)
Engine.init
35. Creating a model
Sequential model:
Graph model:
import com.intel.analytics.bigdl.nn._
val model = Sequential[Float]()
model.add(SpatialConvolution[Float](...))
model.add(Tanh[Float]())
model.add(SpatialMaxPooling[Float](...)
model.add(Sigmoid())
val input = Input[Float]()
val conv = SpatialConvolution[Float](...).inputs(input)
val tanh = Tanh[Float]().inputs(conv)
val maxp = SpatialMaxPooling[Float](...).inputs(tanh)
val sigm = Sigmoid[Float]().inputs(maxp)
val model = Graph(input, sigm)
38. Example model - continued
model.add(SpatialConvolution[Float](128, 128, 3, 3, 1, 1, 1, 1).
setInitMethod(Xavier, Xavier))
model.add(ReLU(true))
model.add(SpatialMaxPooling[Float](kW=2, kH=2, dW=2, dH=2).ceil())
model.add(View(128*7*7))
modelv2.add(Dropout(0.4))
model.add(Linear[Float](inputSize=128*7*7, outputSize=512).
setInitMethod(Xavier, Xavier))
model.add(ReLU(true))
model.add(Linear(inputSize=512, outputSize=1))
model.add(Sigmoid())
39. Preparing the data - of cial
example
But... load is a private method!
val trainSet = DataSet.array(load(trainData, trainLabel)) ->
SampleToGreyImg(28, 28) ->
GreyImgNormalizer(trainMean, trainStd) ->
GreyImgToBatch(batchSize)
41. Preparing the data
val bytes:RDD[Sample[Float]] = sc.binaryFiles(folder).
map(pathbytes => {
val buffImage = ImageIO.read(pathbytes._2.open())
BGRImage.resizeImage(buffImage, SCALE_WIDTH, SCALE_HEIGHT
}).map(b =>
new LabeledBGRImage().copy(b, 255f).setLabel(label)
).mapPartitions(iter =>
new BGRImgToSample()(iter)
)
42. Create an optimizer
val optimizer = Optimizer(module,
trainRdd,
BCECriterion[Float](),
batchSize)
optimizer.setEndWhen(Trigger.maxEpoch(10))
optimizer.setOptimMethod(new Adam[Float](1e-4))
optimizer.setValidation(Trigger.severalIteration(10),
testRdd,
Array(new Loss[Float](new BCECriterion[Float]),
new Top1Accuracy[Float]),
batchSize)
43. Tensorboard visualisation
setup
val trainSumm = TrainSummary("/tensorboard/logdir", "train")
val testSumm = ValidationSummary("/tensorboard/logdir", "test
optimizer.setTrainSummary(trainSumm)
optimizer.setValidationSummary(testSumm)
//start the optimization process:
val trainedModule = optimizer.optimize()
44. Optimization running
[Epoch 2 18432/20000][Iteration 2 67][Wall Clock 888.091331139s]
Trained 144 records in 4.064710098 seconds.
Throughput is 35.42688 records/second. Loss is 0.6683233.
========== Metrics Summary ==========
get weights average : 0.2731059603333333 s
computing time average : 0.742136533 s
send weights average : 0.004483678833333333 s
put gradient : 0.0018473921666666668 s
aggregate gradient time : 0.004468877833333333 s
aggregrateGradientParition average executor : 0.4345159966666667 s
compute weight average : 0.006117520333333333 s
get weights for each node : 0.03519228 0.03964764 0.027415565 0.040467617
computing time for each node : 0.550181791 0.765139897 0.894009244 0.89169 1
=====================================
DEBUG DistriOptimizer$: Dropped modules: 0
45. Optimization running
[Wall Clock 857.896149222s] Validate model...
Loss is (Loss: 80.587006, count: 126, Average Loss: 0.6395794)
Top1Accuracy is Accuracy(correct: 634, count: 1000, accuracy: 0.634)
53. Using the model
trainedModule.saveModule(path)
val quantizedModel = trainedModule.quantize()
val validPredicts = quantizedModel.predict(validationSet)
validPredicts.filter(a => a.toTensor[Float].value > 0.5).coun
quantizedModel.evaluate(validationSet,
Array(new Loss[Float](new BCECriterion[Float]),
new Top1Accuracy[Float]),
batchSize)
60. Conclusion
+ Interesting and clever concept
+ Good engineering
+ Well optimized code
+ Lots of layers, optim methods etc.
- Missing GPU support
- Illogical package/class naming choices
- API debug and data conversion options
- Documentation could be better