AI Optimizations on Breaking barriers between Theory and reality Partner with Intel to accelerate your AI journey

Tame your data deluge Speed up development with our data layer expertise with open AI software

Choose any approach Deploy AI anywhere from analytics to community with unprecedented HW choice Intel AI DevCloud

Intel AI Developer Software Nauta™ Program * Simplify AI OpenVINO™ Scale with confidence * toolkit

via our robust community * hardware BigDL on on the platform for IT & cloud Spark* nGraph * Intel® * MKL-DNN Intel AI Builders ML Libraries

Optimization Notice *Other names and brands may be claimed as the property of others Copyright © 2018, Intel Corporation. All rights reserved. www.intel.ai © 2019 Intel*Other Corporation names and brandsOptimization may be claimed asNotice the property of others. Speed up development with open AI software

MACHINE LEARNING (ML) DEEP LEARNING FRAMEWORKS libraries Python R Distributed Optimized for CPU & more

Data * * More framework optimizations • Scikit- • Cart • MlLib (on Spark) * * FOR underway (e.g. PaddlePaddle*, scientists learn • Random • Mahout * * • Pandas Forest CNTK* & more) • NumPy • e1071 Status & installation guides

Kernels ANALYTICS & ML DEEP LEARNING DEEP LEARNING GRAPH COMPILER Intel® Intel® Data Intel® Math Kernel Intel® nGraph™ Compiler (Beta) Library Distribution Analytics Library for Deep developers Open source compiler for deep learning model for Python* Library Neural Networks computations optimized for multiple devices (CPU, GPU, NNP) from multiple frameworks (TF, MXNet, ONNX) Intel distribution Intel® Data Analytics (Intel® MKL-DNN) optimized for Acceleration Library Open source DNN functions for machine learning (incl machine learning) CPU / integrated graphics

1 An open source version is available at: 01.org/openvinotoolkit *Other names and brands may be claimed as the property of others. Developer personasOptimization show above represent Notice the primary user base for each row, but are not mutually-exclusive All products, computerCopyright systems, © 2018, dates, Intel and Corporation.figures are preliminary All rights based reserved. on current expectations, and are subject to change without notice. 3 © 2019 Intel*Other Corporation names and brandsOptimization may be claimed asNotice the property of others. Intel Distribution for Python Introduction to Python* Performance

General Python behavior (Cpython)

. Cpython provides an interpreter to run commands from Python Bytecode (.pyc)

. Compiling doesn’t go down to x86 instructions, but instead

. Python interpreter  Compiled Bytecode  Python Virtual Machine

. Allows for very flexible bytecode, and the Python interpreter is the main ingredient

. Cpython and PyPy have a Global Interpreter Lock (GIL)

Cpython Global Interpreter Lock thread w1 run run thread w2 run thread w3 rel/acq rel/acq rel/acq GIL GIL GIL

Optimization Notice Copyright © 2018, Intel Corporation. All rights reserved. 5 *Other names and brands may be claimed as the property of others. Introduction to Python* Performance, cont.

Python-level only (Single-threaded) Why does this matter? (Python layers) For loop call Loop Loop Loop (... . Example with array loops (row 1) (row 2) row n) . GIL will force loops to run in a single threaded fashion Python and NumPy dispatch . NumPy* dispatch helps get around single-threaded by using C functions For loop call . C functions can then call processor vectorization Loop Compute append (row 1) Getting out of Python layer is key for performance Loop Compute append (row 2)

Loop Compute append (… row n)

Optimization Notice Copyright © 2018, Intel Corporation. All rights reserved. 6 *Other names and brands may be claimed as the property of others. Introduction to Python* Performance, cont.

The layers of quantitative Python Enforces Global Interpreter Lock (GIL) and is single-threaded, abstraction . The Python language is interpreted and has Python overhead. No advanced types. many type checks to make it flexible

. Each level has various tradeoffs; NumPy* value proposition is immediately seen Gets around the GIL (multi-thread and multi-core) . For best performance, escaping the Python NumPy BLAS API can be the bottleneck layer early is best method *Basic Linear Algebra Subprograms (BLAS) [CBLAS]

Gets around BLAS API bottleneck Intel® Math Much stricter typing Kernel Library Fastest performance level (Intel® MKL) Dispatches to hardware vectorization

Intel® MKL included with Anaconda* standard bundle; is Free for Python

Optimization Notice Copyright © 2018, Intel Corporation. All rights reserved. 7 *Other names and brands may be claimed as the property of others. Performance of Python

Python + Numba* LLVM-based compiler Multiple threading runtimes http://numba.pydata.org/ Small %% performance gap

Optimizing compiler C OpenMP*/TBB/pthreads

https://www.anaconda.com/blog/developer-blog/parallel-python-with-numba-and-parallelaccelerator/

Optimization Notice Copyright © 2018, Intel Corporation. All rights reserved. 8 *Other names and brands may be claimed as the property of others. Accelerate libraries with Intel® Distribution for Python* High Performance Python* for Scientific Computing, Data Analytics, Machine Learning

Faster Performance Greater Productivity Ecosystem compatibility

Performance Libraries, Parallelism, Prebuilt & Accelerated Packages Supports Python 2.7 & 3.6, conda, pip Multithreading, Language Extensions

Accelerated NumPy/SciPy/scikit-learn with Prebuilt & optimized packages for Compatible & powered by Anaconda*, Intel® MKL1 & Intel® DAAL2 numerical computing, machine/deep supports conda & pip learning, HPC & data analytics Data analytics, machine learning with scikit- Distribution & individual optimized learn, pyDAAL DropDrop in replacement-in replacement for existing for existing Python - packages also available at conda & Intel MKL accelerated Numpy, and Usually with no codePython changes required Anaconda.org, YUM/APT, Docker image Optimized run-times Intel MPI®, Intel® TBB on DockerHubscipy now in Anaconda! Jupyter*Usually notebooks, No code changesMatplotlib required!included Scale with Numba* & Cython* Optimizations upstreamed to main Python Conda build recipes included in packages Includes optimized mpi4py, works with trunk Dask* & PySpark* Free download & free for all uses including Commercial support through Intel® Parallel commercial deployment Studio XE 2018 Optimized for latest Intel® architecture

Intel® Architecture Platforms

Operating System: Windows*, *, MacOS1*

1Intel® 2Intel® Data Analytics Acceleration Library

Optimization Notice Copyright © 2018, Intel Corporation. All rights reserved. 9 *Other names and brands may be claimed as the property of others. Productivity with Performance via Intel® Python*

Intel® Distribution for Python*

smp mpi4py

daal4py tbb4py

Data acquisition & Numerical/Scientific computing & Composable Distributed preprocessing machine learning multi-threading parallelism Learn More: software.intel.com/distribution-for-python https://www.anaconda.com/blog/developer-blog/parallel-python-with-numba-and-parallelaccelerator/

Optimization Notice Copyright © 2018, Intel Corporation. All rights reserved. 10 *Other names and brands may be claimed as the property of others. Intel® Distribution Python* Distribution Channels

Standalone https://software.intel.com/en-us/distribution-for-python Installer Windows* Linux*

Open-source macOS* Channels

Intel Software Tools suite Intel® AD SDK

Available on Google Cloud Platform: Deep Learning Images

https://blog.kovalevskyi.com/deeplearning-images-revision-m9-intel-optimized- images-273164612e93

Optimization Notice Copyright © 2018, Intel Corporation. All rights reserved. 11 *Other names and brands may be claimed as the property of others. Installing Intel® Distribution for Python* 2019

Standalone Download full installer from Installer https://software.intel.com/en-us/intel-distribution-for-python

> conda config --add channels intel Anaconda.org > conda install intelpython3_full Anaconda.org/intel channel > conda install intelpython3_core

pip install intel-numpy intel-scipy intel-sckit-learn PyPI https://software.intel.com/en-us/articles/installing-the-intel-distribution-for-python-and- intel-performance-libraries-with-pip-and

Docker Hub docker pull intelpython/intelpython3_full

YUM/APT Access for yum/apt: https://software.intel.com/en-us/articles/installing-intel-free-libs-and-python

Optimization Notice Copyright © 2018, Intel Corporation. All rights reserved. 12 *Other names and brands may be claimed as the property of others. Xeon Close to native code Umath Performance with Intel Python 2019 Compared to Stock Python packages on Intel® Xeon processors

100%

80%

60% 40% 87% 20% native efficiency on

0% Black-Scholes Formula code

erf

exp log10

invsqrt with Intel numpy + numba.

Performance Performance Efficiency measured

against native codewith Intel® MKL

array-array

array*array array+array

array-scalar

array*scalar array+scalar Problem Size = 2.5M

Stock Python Intel® Distribution for Python 2019

Configuration: Stock Python: python 3.6.6 hc3d631a_0 installed from conda, numpy 1.15, numba 0.39.0, llvmlite 0.24.0, scipy 1.1.0, scikit-learn 0.19.2 installed from pip;Intel Python: Intel Distribution for Python 2019 Gold: python 3.6.5 intel_11, numpy 1.14.3 intel_py36_5, mkl 2019.0 intel_101, mkl_fft 1.0.2 intel_np114py36_6,mkl_random 1.0.1 intel_np114py36_6, numba 0.39.0 intel_np114py36_0, llvmlite 0.24.0 intel_py36_0, scipy 1.1.0 intel_np114py36_6, scikit-learn 0.19.1 intel_np114py36_35; OS: CentOS Linux 7.3.1611, kernel 3.10.0-514.el7.x86_64; Hardware: Intel(R) Xeon(R) Gold 6140 CPU @ 2.30GHz (2 sockets, 18 cores/socket, HT:off), 256 GB of DDR4 RAM, 16 DIMMs of 16 GB@2666MHz Software and workloads used in performance tests may have been optimized for performance only on Intel microprocessors. Performance tests, such as SYSmark and MobileMark, are measured using specific computer systems, components, software, operations and functions. Any change to any of those factors may cause the results to vary. You should consult other information and performance tests to assist you in fully evaluating your contemplated purchases, including the performance of that product when combined with other products. For more complete information visit www.intel.com/benchmarks. Source: Intel Corporation - performance measured in Intel labs by Intel employees. Optimization Notice: Intel’s compilers may or may not optimize to the same degree for non-Intel microprocessors for optimizations that are not unique to Intel microprocessors. These optimizations include SSE2, SSE3, and SSSE3 instruction sets and other optimizations. Intel does not guarantee the availability, functionality, or effectiveness of any optimization on microprocessors not manufactured by Intel. Microprocessor-dependent optimizations in this product are intended for use with Intel microprocessors. Certain optimizations not specific to Intel microarchitecture are reserved for Intel microprocessors. Please refer to the applicable product User and Reference Guides for more information regarding the specific instruction sets covered by this notice. Notice revision #20110804. Optimization Notice Copyright © 2018, Intel Corporation. All rights reserved. 13 *Other names and brands may be claimed as the property of others. Intel® MKL: Python* Integration

Python usage Requires No Python Code Changes Intel® MKL included in Intel® Distribution of Python* Numpy accelerated out of the box No code changes

What MKL brings to Python Single-Core: vectorization, prefetching, cache utilization  SIMD support for AVX-512 ISA Multi-Many Core (processor/socket) level parallelization  OpenMP and TBB support Multi-Socket (node) level parallelization & Clusters scaling

Optimization Notice Copyright © 2018, Intel Corporation. All rights reserved. 14 *Other names and brands may be claimed as the property of others. Accelerating K-Means

https://cloudplatform.googleblog.com/2017/11/Intel-performance-libraries-and-python-distribution-enhance-performance-and-scaling-of-Intel-Xeon- Scalable-processors-on-GCP.html

Optimization Notice Copyright © 2018, Intel Corporation. All rights reserved. 15 *Other names and brands may be claimed as the property of others. Performance Against Native* Code

Optimization Notice Copyright © 2018, Intel Corporation. All rights reserved. 16 *Other names and brands may be claimed as the property of others. Performance Against Native* Code, cont.

Optimization Notice Copyright © 2018, Intel Corporation. All rights reserved. 17 *Other names and brands may be claimed as the property of others. Intel® data analytics acceleration library (intel® daal) Included in Intel® Parallel Studio and Intel® Distribution for Python*

Also available as Standalone Version (includes priority support) Faster Machine Learning & Analytics with Intel® DAAL

What’s New in 2018 and 2019 • Features highly tuned functions for classical machine learning and analytics performance across spectrum of Intel® architecture devices . New Algorithms: . Logistic regression • Optimizes data ingestion together with algorithmic computation for highest analytics throughput . Classification & Regression GBT

• Includes Python*, C++, and Java* APIs and connectors to popular data . Classification & Regression Decision Forest sources including Spark* and Hadoop* . Spark* MLlib-compatible API wrappers for easy • New High-level Python API, daal4py introduced substitution of faster Intel DAAL functions

• Out-of-box acceleration for key scikit-learn* algorithms . Improved APIs for ease of use

• Free and open source community-supported versions are available, as . Repository distribution via PIP, Conda YUM and APT well as paid versions that include premium support.

Pre-processing Transformation Analysis Modeling Validation Decision Making

Decompression, Aggregation, Summary Machine Learning (Training) Hypothesis testing Forecasting Filtering, Dimension Reduction Statistics Parameter Estimation Model errors Decision Trees, etc. Normalization Clustering, etc. Simulation

Optimization Notice Copyright © 2018, Intel Corporation. All rights reserved. 19 *Other names and brands may be claimed as the property of others. Processing Modes

Batch Distributed Online Processing Processing Processing

R1 D1 D 3 D 2 D … 1 D Dk- D k 1 R2 R 1 D2 Append

Si,Ri Dk R R = F(D1,…,Dk) k Si+1 = T(Si,Di) R = F(S ) R = F(R1,…,Rk) i+1 i+1

Optimization Notice Copyright © 2018, Intel Corporation. All rights reserved. 20 *Other names and brands may be claimed as the property of others. PCA KMeans Scikit-Learn KNeighborsClassifier LinearRegression Scikit-Learn RandomForestClassifier Ridge API SVC Equivalents RandomForestRegressor pairwise_distances Compatible logistic_regression_path

Use directly for daal4py • Scaling to multiple nodes • Streaming data • Non-homogeneous dataframes Intel® DAAL

Optimization Notice Copyright © 2018, Intel Corporation. All rights reserved. 21 *Other names and brands may be claimed as the property of others. Accelerating scikit-learn through daal4py

Monkey-patch any scikit-learn > python -m daal4py on the command-line

import daal4py.sklearn Monkey-patch any scikit-learn daal4py.sklearn.patch_sklearn() programmatically

Scikit-learn with daal4py patches applied passes scikit-learn test-suite

Optimization Notice Copyright © 2018, Intel Corporation. All rights reserved. 22 *Other names and brands may be claimed as the property of others. Get a fly with daal4py

• Close to native performance through Intel® DAAL Fast & Scalable • Efficient MPI scale-out • Streaming

• Intuitive usage model Easy to use • Picklable

• Plugs into scikit-learn Flexible • Plugs into HPAT/Numba

• Open source: Open https://github.com/IntelPython/daal4py

Optimization Notice Copyright © 2018, Intel Corporation. All rights reserved. 23 *Other names and brands may be claimed as the property of others. Scaling Machine Learning Beyond a Single Node

Simple Python API scikit-learn daal4py Powers scikit-learn

Intel® Data Analytics Acceleration Library Powered by DAAL (DAAL) Intel® MPI Intel® Math Kernel Intel® Threading Scalable to multiple nodes Library (MKL) Building Blocks (TBB)

Try it out! conda install -c intel daal4py

Optimization Notice Copyright © 2018, Intel Corporation. All rights reserved. 24 *Other names and brands may be claimed as the property of others. Intel® Distribution for Python* Scikit-learn Optimizations, cont.

Optimization Notice Copyright © 2018, Intel Corporation. All rights reserved. 25 *Other names and brands may be claimed as the property of others. Intel(R) Xeon(R) Gold 6148 CPU @ 2.40GHz, EIST/Turbo on

Hardware 2 sockets, 20 Cores per socket 192 GB RAM Strong & Weak Scaling via daal4py 16 nodes connected with Infiniband Operating Oracle Linux Server release 7.4 System Data Type double

On a 32-node cluster (1280 cores) daal4py computed linear On a 32-node cluster (1280 cores) daal4py computed K- regression of 2.15 TB of data in 1.18 seconds and 68.66 GB Means (10 clusters) of 1.12 TB of data in 107.4 seconds and of data in less than 48 milliseconds. 35.76 GB of data in 4.8 seconds.

Optimization Notice Copyright © 2018, Intel Corporation. All rights reserved. 26 *Other names and brands may be claimed as the property of others. K-Means using daal4py

import daal4py as d4p

# daal4py accepts data as CSV files, numpy arrays or pandas dataframes # here we let daal4py load process-local data from csv files data = "kmeans_dense.csv"

# Create algob object to compute initial centers init = d4p.kmeans_init(10, method="plusPlusDense") # compute initial centers ires = init.compute(data) # results can have multiple attributes, we need centroids centroids = ires.centroids # compute initial centroids & kmeans clustering result = d4p.kmeans(10).compute(data, centroids)

Optimization Notice Copyright © 2018, Intel Corporation. All rights reserved. 27 *Other names and brands may be claimed as the property of others. Distributed K-Means using daal4py

import daal4py as d4p

# initialize distributed execution environment d4p.daalinit()

# daal4py accepts data as CSV files, numpy arrays or pandas dataframes # here we let daal4py load process-local data from csv files data = "kmeans_dense_{}.csv".format(d4p.my_procid())

# compute initial centroids & kmeans clustering init = d4p.kmeans_init(10, method="plusPlusDense", distributed=True) centroids = init.compute(data).centroids result = d4p.kmeans(10, distributed=True).compute(data, centroids)

mpirun -n 4 python ./kmeans.py

Optimization Notice Copyright © 2018, Intel Corporation. All rights reserved. 28 *Other names and brands may be claimed as the property of others. Distributed K-Means Using DAAL (C++ API)

*******************************************************************************/ const bool isRoot = (rankId == mpi_root); NumericTablePtr step2Input = initStep1(rankId, pData); /* aRes.clear(); pCentroids->addNumericTable(step2Input); ! Content: ByteBuffer dataToSend; /* Create an algorithm object for the step 3 */ ! C++ sample of K-Means clustering in the distributed processing mode if(value.get()) typedef kmeans::init::Distributed Step3Master; !******************************************************************************/ serializeDAALObject(value.get(), dataToSend); SharedPtr step3(isRoot ? new Step3Master(nClusters) : NULL); const int dataToSendLength = dataToSend.size(); for(size_t iCenter = 1; iCenter < nClusters; ++iCenter) #include int perNodeArchLength[nBlocks]; { #include "daal.h" for(size_t i = 0; i < nBlocks; i++) std::vector step2ResultsOnMaster; #include "service.h" perNodeArchLength[i] = 0; initStep2(rankId, pData, localNodeData, step2Input, iCenter == 1, step2ResultsOnMaster); #include "stdio.h" NumericTablePtr step4Input = (step3 ? initStep3(*step3, step2ResultsOnMaster) : receiveStep3Output(rankId)); #include MPI_Gather(&dataToSendLength, sizeof(int), MPI_CHAR, isRoot ? perNodeArchLength : NULL, sizeof(int), step2Input = initStep4(rankId, pData, localNodeData, step4Input); MPI_CHAR, mpi_root, MPI_COMM_WORLD); pCentroids->addNumericTable(step2Input); using namespace std; } using namespace daal; ByteBuffer dataToReceive; return daal::data_management::convertToHomogen(*pCentroids); /* can be returned as pCentroids as well */ using namespace daal::algorithms; int perNodeArchShift[nBlocks]; } using namespace daal::services; if(isRoot) { template<> typedef std::vector ByteBuffer; const int totalToReceive = lengthsToShifts(perNodeArchLength, perNodeArchShift); NumericTablePtr initCentroids(int rankId, const NumericTablePtr& pData) typedef float algorithmFPType; /* Algorithm floating-point type */ if(!totalToReceive) { return; const bool isRoot = (rankId == mpi_root); /* K-Means algorithm parameters */ dataToReceive.resize(totalToReceive); const kmeans::init::Method method = kmeans::init::parallelPlusDense; const size_t nClusters = 20; } /* default value of nRounds used by all steps */ const size_t nIterations = 5; MPI_Gatherv(&dataToSend[0], dataToSendLength, MPI_CHAR, isRoot ? &dataToReceive[0] : NULL, const size_t nRounds = kmeans::init::Parameter(nClusters).nRounds; const size_t nBlocks = 4; perNodeArchLength, perNodeArchShift, MPI_CHAR, mpi_root, MPI_COMM_WORLD); /* Create an algorithm object for the step 5 */ /* Input data set parameters */ if(!isRoot) typedef kmeans::init::Distributed Step5Master; const string dataFileNames[4] = return; SharedPtr step5(isRoot ? new Step5Master(nClusters) : NULL); { aRes.resize(nBlocks); "./data/distributed/kmeans_dense.csv", "./data/distributed/kmeans_dense.csv", for(size_t i = 0, shift = 0; i < nBlocks; shift += perNodeArchLength[i], ++i) /* Internal data to be stored on the local nodes */ "./data/distributed/kmeans_dense.csv", "./data/distributed/kmeans_dense.csv" { DataCollectionPtr localNodeData; }; if(perNodeArchLength[i]) aRes[i] = NumericTable::cast(deserializeDAALObject(&dataToReceive[shift], perNodeArchLength[i])); /* First step on the local nodes */ #define mpi_root 0 } NumericTablePtr step2Input = initStep1(rankId, pData); const int step3ResultSizeTag = 1; } if(step5) const int step3ResultTag = 2; step5->input.add(kmeans::init::inputCentroids, step2Input); template NumericTablePtr loadData(int rankId) NumericTablePtr initStep1(int rankId, const NumericTablePtr& pData) /* Create an algorithm object for the step 3 */ { { typedef kmeans::init::Distributed Step3Master; /* Initialize FileDataSource to retrieve the input data from a .csv file */ const size_t nVectorsInBlock = pData->getNumberOfRows(); SharedPtr step3(isRoot ? new Step3Master(nClusters) : NULL); FileDataSource dataSource(dataFileNames[rankId], DataSource::doAllocateNumericTable, /* Create an algorithm object for the K-Means algorithm */ for(size_t iRound = 0; iRound < nRounds; ++iRound) DataSource::doDictionaryFromContext); kmeans::init::Distributed local(nClusters, nBlocks*nVectorsInBlock, rankId*nVectorsInBlock); { local.input.set(kmeans::init::data, pData); /* Perform step 2 */ /* Retrieve the data from the input file */ local.compute(); std::vector step2ResultsOnMaster; dataSource.loadDataBlock(); return allToAll(local.getPartialResult()->get(kmeans::init::partialCentroids)); initStep2(rankId, pData, localNodeData, step2Input, iRound == 0, step2ResultsOnMaster); return dataSource.getNumericTable(); } /* Perform step 3 */ } NumericTablePtr step4Input = (step3 ? initStep3(*step3, step2ResultsOnMaster) : receiveStep3Output(rankId)); template /* Perform step 4 */ template void initStep2(int rankId, const NumericTablePtr& pData, DataCollectionPtr& localNodeData, step2Input = initStep4(rankId, pData, localNodeData, step4Input); NumericTablePtr initCentroids(int rankId, const NumericTablePtr& pData); const NumericTablePtr& step2Input, bool bFirstIteration, std::vector& step2Results, if(step5) NumericTablePtr computeCentroids(int rankId, const NumericTablePtr& pData, const NumericTablePtr& initialCentroids); bool bOutputForStep5Required = false) step5->input.add(kmeans::init::inputCentroids, step2Input); { } template kmeans::init::Distributed step2(nClusters, bFirstIteration); void runKMeans(int rankId, const NumericTablePtr& pData, const char* methodName) step2.parameter.outputForStep5Required = bOutputForStep5Required; /* One more step 2 */ { step2.input.set(kmeans::init::data, pData); std::vector step2Results; if(rankId == mpi_root) step2.input.set(kmeans::init::internalInput, localNodeData); initStep2(rankId, pData, localNodeData, step2Input, false, step2Results, true); std::cout << "K-means init parameters: method = " << methodName << std::endl; step2.input.set(kmeans::init::inputOfStep2, step2Input); if(step5) /* isRoot == true */ NumericTablePtr centroids = initCentroids(rankId, pData); step2.compute(); { for(size_t it = 0; it < nIterations; it++) if(bFirstIteration) for(size_t i = 0; i < step2Results.size(); ++i) centroids = computeCentroids(rankId, pData, centroids); localNodeData = step2.getPartialResult()->get(kmeans::init::internalResult); step5->input.add(kmeans::init::inputOfStep5FromStep2, step2Results[i]); /* Print the clusterization results */ ~400allToMaster(rankId, step2.getPartialResult() LOC->get( total step5->input.set(kmeans::init::inputOfStep5FromStep3, step3->getPartialResult()->get(kmeans::init::outputOfStep3ForStep5)); if(rankId == mpi_root) bOutputForStep5Required ? kmeans::init::outputOfStep2ForStep5 : kmeans::init::outputOfStep2ForStep3), step2Results); step5->compute(); printNumericTable(centroids, "First 10 dimensions of centroids:", 20, 10); } step5->finalizeCompute(); } return step5->getResult()->get(kmeans::init::centroids); template } int main(int argc, char *argv[]) NumericTablePtr initStep3(kmeans::init::Distributed& step3, std::vector& step2Results) return NumericTablePtr(); { { } int rankId, comm_size; for(size_t i = 0; i < step2Results.size(); ++i) MPI_Init(&argc, &argv); step3.input.add(kmeans::init::inputOfStep3FromStep2, i, step2Results[i]); NumericTablePtr computeCentroids(int rankId, const NumericTablePtr& pData, const NumericTablePtr& initialCentroids) MPI_Comm_size(MPI_COMM_WORLD, &comm_size); step3.compute(); { MPI_Comm_rank(MPI_COMM_WORLD, &rankId); ByteBuffer buff; const bool isRoot = (rankId == mpi_root); NumericTablePtr step4InputOnRoot; ByteBuffer nodeCentroids; NumericTablePtr pData = loadData(rankId); for(size_t i = 0; i < nBlocks; ++i) size_t CentroidsArchLength = (isRoot ? serializeDAALObject(initialCentroids.get(), nodeCentroids) : 0); { runKMeans(rankId, pData, "plusPlusDense"); NumericTablePtr pTbl = step3.getPartialResult()->get(kmeans::init::outputOfStep3ForStep4, i); /* can be null */ /* Get centroids from the root node */ runKMeans(rankId, pData, "parallelPlusDense"); if(i == mpi_root) MPI_Bcast(&CentroidsArchLength, sizeof(size_t), MPI_CHAR, mpi_root, MPI_COMM_WORLD); { MPI_Finalize(); step4InputOnRoot = pTbl; if(!isRoot) return 0; continue; nodeCentroids.resize(CentroidsArchLength); } } MPI_Bcast(&nodeCentroids[0], CentroidsArchLength, MPI_CHAR, mpi_root, MPI_COMM_WORLD); buff.clear(); static int lengthsToShifts(const int lengths[nBlocks], int shifts[nBlocks]) size_t size = pTbl.get() ? serializeDAALObject(pTbl.get(), buff) : 0; NumericTablePtr centroids = NumericTable::cast(deserializeDAALObject(&nodeCentroids[0], CentroidsArchLength)); { MPI_Send(&size, sizeof(size_t), MPI_BYTE, int(i), step3ResultSizeTag, MPI_COMM_WORLD); int shift = 0; if(size) /* Create an algorithm to compute k-means on local nodes */ for(size_t i = 0; i < nBlocks; shift += lengths[i], ++i) MPI_Send(&buff[0], size, MPI_BYTE, int(i), step3ResultTag, MPI_COMM_WORLD); kmeans::Distributed localAlgorithm(nClusters); shifts[i] = shift; } return shift; return step4InputOnRoot; /* Set the input data set to the algorithm */ } } localAlgorithm.input.set(kmeans::data, pData); localAlgorithm.input.set(kmeans::inputCentroids, centroids); /* Send the value to all processes in the group and collect received values into one table */ NumericTablePtr receiveStep3Output(int rankId) static NumericTablePtr allToAll(const NumericTablePtr& value) { /* Compute k-means */ { size_t size = 0; localAlgorithm.compute(); std::vector aRes; MPI_Status status; ByteBuffer dataToSend; MPI_Recv(&size, sizeof(size_t), MPI_BYTE, mpi_root, step3ResultSizeTag, MPI_COMM_WORLD, &status); /* Serialize partial results required by step 2 */ if(value.get()) if(size) ByteBuffer nodeResults; serializeDAALObject(value.get(), dataToSend); { size_t perNodeArchLength = serializeDAALObject(localAlgorithm.getPartialResult().get(), nodeResults); const int dataToSendLength = dataToSend.size(); ByteBuffer buff(size); int perNodeArchLength[nBlocks]; MPI_Recv(&buff[0], size, MPI_BYTE, mpi_root, step3ResultTag, MPI_COMM_WORLD, &status); /* Serialized data is of equal size on each node if each node called compute() equal number of times */ for(size_t i = 0; i < nBlocks; i++) return NumericTable::cast(deserializeDAALObject(&buff[0], size)); ByteBuffer serializedData; perNodeArchLength[i] = 0; } if(isRoot) return NumericTablePtr(); serializedData.resize(perNodeArchLength * nBlocks); MPI_Allgather(&dataToSendLength, sizeof(int), MPI_CHAR, perNodeArchLength, sizeof(int), MPI_CHAR, MPI_COMM_WORLD); } /* Transfer partial results to step 2 on the root node */ int perNodeArchShift[nBlocks]; template MPI_Gather(&nodeResults[0], perNodeArchLength, MPI_CHAR, serializedData.size() ? &serializedData[0] : NULL, const int totalToReceive = lengthsToShifts(perNodeArchLength, perNodeArchShift); NumericTablePtr initStep4(int rankId, const NumericTablePtr& pData, const DataCollectionPtr& localNodeData, perNodeArchLength, MPI_CHAR, mpi_root, MPI_COMM_WORLD); if(!totalToReceive) const NumericTablePtr& step4Input) return NumericTablePtr(); { if(isRoot) NumericTablePtr step4Result; { ByteBuffer dataToReceive(totalToReceive); if(step4Input) /* Create an algorithm to compute k-means on the master node */ MPI_Allgatherv(&dataToSend[0], dataToSendLength, MPI_CHAR, &dataToReceive[0], perNodeArchLength, perNodeArchShift, MPI_CHAR, MPI_COMM_WORLD); { kmeans::Distributed masterAlgorithm(nClusters); /* Create an algorithm object for the step 4 */ for(size_t i = 0, shift = 0; i < nBlocks; shift += perNodeArchLength[i], ++i) kmeans::init::Distributed step4(nClusters); for(size_t i = 0; i < nBlocks; i++) { /* Set the input data to the algorithm */ { if(!perNodeArchLength[i]) step4.input.set(kmeans::init::data, pData); /* Deserialize partial results from step 1 */ continue; step4.input.set(kmeans::init::internalInput, localNodeData); SerializationIfacePtr ptr = deserializeDAALObject(&serializedData[perNodeArchLength * i], perNodeArchLength); NumericTablePtr pTbl = NumericTable::cast(deserializeDAALObject(&dataToReceive[shift], perNodeArchLength[i])); step4.input.set(kmeans::init::inputOfStep4FromStep3, step4Input); kmeans::PartialResultPtr dataForStep2FromStep1 = dynamicPointerCast(ptr); aRes.push_back(pTbl); /* Compute and get the result */ } step4.compute(); /* Set local partial results as input for the master-node algorithm */ if(!aRes.size()) step4Result = step4.getPartialResult()->get(kmeans::init::outputOfStep4); masterAlgorithm.input.add(kmeans::partialResults, dataForStep2FromStep1); return NumericTablePtr(); } } if(aRes.size() == 1) return allToAll(step4Result); return aRes[0]; } /* Merge and finalizeCompute k-means on the master node */ masterAlgorithm.compute(); /* For parallelPlus algorithm */ template<> masterAlgorithm.finalizeCompute(); RowMergedNumericTablePtr pMerged(new RowMergedNumericTable()); NumericTablePtr initCentroids(int rankId, const NumericTablePtr& pData) for(size_t i = 0; i < aRes.size(); ++i) { /* Retrieve the algorithm results */ pMerged->addNumericTable(aRes[i]); const bool isRoot = (rankId == mpi_root); return masterAlgorithm.getResult()->get(kmeans::centroids); return NumericTable::cast(pMerged); const kmeans::init::Method method = kmeans::init::plusPlusDense; } } /* Internal data to be stored on the local nodes */ return NumericTablePtr(); DataCollectionPtr localNodeData; } /* Send the value to all processes in the group and collect received values into one table */ /* Numeric table to collect the results */ static void allToMaster(int rankId, const NumericTablePtr& value, std::vector& aRes) RowMergedNumericTablePtr pCentroids(new RowMergedNumericTable()); { /* First step on the local nodes */ Optimization Notice Copyright © 2018, Intel Corporation. All rights reserved. 29 *Other names and brands may be claimed as the property of others. Streaming data (linear regression) using daal4py

import daal4py as d4p

# Configure a Linear regression training object for streaming train_algo = d4p.linear_regression_training(interceptFlag=True, streaming=True)

# assume we have a generator returning blocks of (X,y)... rn = read_next(infile)

# on which we iterate for chunk in rn: algo.compute(chunk.X. chunk.y)

# finalize computation result = algo.finalize()

Optimization Notice Copyright © 2018, Intel Corporation. All rights reserved. 30 *Other names and brands may be claimed as the property of others. Intel® DAAL Algorithms supported by daal4py Data Transformation and Analysis

Basic statistics Correlation and Dimensionality Matrix factorizations Outlier detection for datasets dependence reduction

Low order Cosine SVD PCA Univariate moments distance

Correlation Quantiles QR Association rule Multivariate distance mining (Apriori)

Variance- Order Optimization solvers Math functions statistics Covariance Cholesky matrix (SGD, AdaGrad, lBFGS) (exp, log,…)

Algorithms supporting batch processing

Algorithms supporting batch, online and/or distributed processing

Optimization Notice Copyright © 2018, Intel Corporation. All rights reserved. 31 *Other names and brands may be claimed as the property of others. Intel® DAAL Algorithms supported by daal4py Machine Learning

Linear Ridge Regression Regression K-Means Clustering Regression Unsupervised learning Decision Tree Weak EM for GMM learner* Supervised Decision Forest learning Boosting* (Ada, Brown, Logit) GradientBoosting Alternating Collaborative Classification Naïve Bayes Least filtering Squares

kNN

*Expected with DAAL® 2020 Algorithms supporting batch processing Support Vector Machine Algorithms supporting batch, online and/or distributed processing

Optimization Notice Copyright © 2018, Intel Corporation. All rights reserved. 32 *Other names and brands may be claimed as the property of others. Scalable Python Solutions in Incubation

daal4py HPAT

Ease-of-use of scikit-learn Drop-in acceleration of Python ETL + Performance of DAAL (Pandas, Numpy & select custom Python)

• High-level Python API for DAAL • Statically compiles analytics code to binary • 10x fewer LOC wrt DAAL for single node, • Simply annotate with @hpat.jit 100x fewer LOC wrt DAAL for multi-node • Built on Anaconda Numba compiler

Automatically scales to multiple nodes with MPI https://github.com/IntelLabs/hpat Optimization Notice Copyright © 2018, Intel Corporation. All rights reserved. 33 *Other names and brands may be claimed as the property of others. Accelerating Pandas using HPAT

import pandas as pd import hpat

@hpat.jit def process_times(): df = pq.read_table(‘data.parquet’).to_pandas(); df[‘event_time’] = pd.DatetimeIndex(df[‘event_time’]) df[‘hr’] = df.event_time.map(lambda x: x.hour) df[‘minute’] = df.event_time.map(lambda x: x.minute) df[‘second’] = df.event_time.map(lambda x: x.second) df[‘minute_day’] = df.apply(lambda row: row.hr*60 + row.minute, axis = 1) df[‘event_date’] = df.event_time.map(lambda x: x.date()) df[‘indicator_cleaned’] = df.indicator.map(lambda x: -1 if x == ‘na’ else int(x))

$ mpirun -n 4 python ./process_times.py

Optimization Notice Copyright © 2018, Intel Corporation. All rights reserved. 34 *Other names and brands may be claimed as the property of others. Intel-optimized DL frameworks Deep learning usages & Key topologies

Image Recognition Language Translation

Resnet-50, 101 GNMT Inception V3 Transformer LT MobileNet SqueezeNet

Object Detection Text to Speech

R-FCN Wavenet Faster-RCNN Yolo V2 SSD-VGG16, SSD-MobileNet

Image Segmentation Recommendation System

Wide & Deep Mask R-CNN NCF 3D-Unet

There are many deep learning usages and topologies for each

Optimization Notice Copyright © 2018, Intel Corporation. All rights reserved. *Other names and brands may be claimed as the property of others. AI (ML & DL) Software Stack for Intel® Processors

Deep learning and AI ecosystem includes edge and datacenter applications. • Open source frameworks (Tensorflow*, MXNet*, PyTorch*, PaddlePaddle*) • Intel deep learning products (Nauta , BigDL, OpenVINO™ toolkit) • In-house user applications

Intel® MKL and Intel® MKL-DNN optimize deep learning and machine learning applications for Intel® processors : • Through the collaboration with framework maintainers to upstream changes (Tensorflow*, MXNet*, PyTorch, PaddlePaddle*) • Through Intel-optimized forks (*) • By partnering to enable proprietary solutions

Intel® MKL-DNN is an open source performance library for deep learning applications (available at https://github.com/intel/mkl-dnn) • Fast open source implementations for wide range of DNN functions • Early access to new and experimental functionality Intel MKL Intel MKL-DNN • Open for community contributions

Intel® MKL is a proprietary performance library for wide range of math and science applications Distribution: Intel Registration Center, package repositories (apt, yum, conda, Intel Processors pip), Intel® Parallel Studio XE, Intel® System Studio

Optimization Notice Copyright © 2018, Intel Corporation. All rights reserved. *Other names and brands may be claimed as the property of others. Examples of speedups on Intel® Xeon® Scalable Processors

Optimization Notice *Other names and brands may be claimed as the property of CopyrightSource: © TENSORFLOW 2018, Intel Corporation. OPTIMIZED All rights reserved. FOR INTEL® XEON™ others *Other names and brands may be claimed as the property of others. What’s Happening Under The Hood? Intel® MKL-DNN Functionality

Features: Intel® MKL-DNN v0.16 Convolution Direct 3D, Depthwise separable convolution . Training (float32) and inference (float32, int8) Winograd convolution Deconvolution . CNNs (1D, 2D and 3D), RNNs (plain, LSTM, GRU) Fully Connected Layer Inner Product . Optimized for Intel processors Pooling Maximum Average (include/exclude padding) Portability: Normalization LRN across/within channel, Batch . Compilers: Intel® C++ Compiler/Clang/GCC/MSVC* normalization Eltwise ReLU(bounded/soft), ELU, Tanh; . OSes: Linux*, Windows*, Mac* (Loss/activation) Softmax, Logistic, linear; square, sqrt, abs

Data manipulation Reorder, sum, concat, View . Threading: OpenMP*, TBB cell RNN cell, LSTM cell, GRU cell Frameworks that use Intel ® MKL-DNN: Fused primitive Conv+ReLU+sum, BatchNorm+ReLU IntelCaffe, TensorFlow*, MxNet*, PaddlePaddle*, Pytorch*, … Data type f32, s32, s16, s8, u8

Intel and the Intel logo are trademarks of Intel Corporation in the U. S. and/or other countries. *Other names and brands Optimization Notice may be claimed as the property of others. Copyright © 2016, Intel Corporation. Copyright © 2018, Intel Corporation. All rights reserved. *Other names and brands may be claimed as the property of others. Intel Confidential Graph-level optimizations AI Framework Software Optimizations Fusion

Optimization Notice Copyright © 2018, Intel Corporation. All rights reserved. *Other names and brands may be claimed as the property of others. AI Framework Software Optimizations Layout Conversion

Input Filter Input • Converting to/from optimized Filter layout can be less expensive Convert Convert than operating on un-optimized Conv2D MklConv2D layout. Convert

ReLU Convert • All Intel® MKL-DNN operators MklReLU Convert use highly-optimized layouts Shape for TensorFlow* tensors. Shape

Initial Graph After Layout Conversions

Optimization Notice Copyright © 2018, Intel Corporation. All rights reserved. *Other names and brands may be claimed as the property of others. AI Framework Software Optimizations Layout Propogation

Input Filter Input Filter

Did you notice anything Convert Convert Convert Convert wrong with previous MklConv2D MklConv2D graph? Convert

Convert Problem: redundant MklReLU MklReLU conversions Convert Convert

Shape Shape

After Layout Conversion After Layout Propagation

Optimization Notice Copyright © 2018, Intel Corporation. All rights reserved. *Other names and brands may be claimed as the property of others. Graph-level optimizations (contd)

• Batch Normalization Folding

• Filter Caching

• Primitive Reuse

Optimization Notice Copyright © 2018, Intel Corporation. All rights reserved. *Other names and brands may be claimed as the property of others. AI Framework Software Optimizations Load Balancing Input Filter

Convert Convert TensorFlow* graphs offer opportunities for parallel execution. MklConv2D Threading model, Tune you Intel® MKL w/ 1. inter_op_parallelism_threads = max number of operators that can be executed in MklReLU parallel Convert 2. intra_op_parallelism_threads = max number of threads to use for executing an Shape operator

3. OMP_NUM_THREADS = MKL-DNN equivalent of >>> config = tf.ConfigProto() intra_op_parallelism_threads >>> config.intra_op_parallelism_threads = 56 >>> config.inter_op_parallelism_threads = 2 More details: >>> tf.Session(config=config) https://www.tensorflow.org/performance/perfor mance_guide

Optimization Notice Copyright © 2018, Intel Corporation. All rights reserved. *Other names and brands may be claimed as the property of others. Profiling Intel MKL-DNN verbose mode overview

Simple yet powerful analysis tool: Output includes: . The marker, state and primitive kind . Similar to Intel MKL verbose . Implementation details (e.g. jit:avx2) . Enabled via environment variable or . Primitive parameters function call . Creation or execution time (in ms) . Output is in CSV format Example below (details here) $ # MKLDNN_VERBOSE is unset $ ./examples/simple-net-c passed $ export MKLDNN_VERBOSE=1 # report only execution parameters and runtime $ ./examples/simple-net-c # | grep "mkldnn_verbose" mkldnn_verbose,exec,reorder,jit:uni,undef,in:f32_oihw out:f32_Ohwi8o,num:1,96x3x11x11,12.2249 mkldnn_verbose,exec,eltwise,jit:avx2,forward_training,fdata:nChw8c,alg:eltwise_relu,mb8ic96ih55iw55,0.437988 mkldnn_verbose,exec,lrn,jit:avx2,forward_training,fdata:nChw8c,alg:lrn_across_channels,mb8ic96ih55iw55,1.70093 mkldnn_verbose,exec,reorder,jit:uni,undef,in:f32_nChw8c out:f32_nchw,num:1,8x96x27x27,0.924805 passed

Optimization Notice Copyright © 2018, Intel Corporation. All rights reserved. *Other names and brands may be claimed as the property of others. Integration with Intel VTune Amplifier

Full application analysis

Report types:

. CPU utilization

. Parallelization efficiency

. Memory traffic

Profiling of run-time generated code must be enabled at compile time

$ # building Intel MKL-DNN using cmake $ cmake –DVTUNEROOT=/opt/intel/vtune_amplifier_2018 .. && make install $ # an alternative: building Intel MKL-DNN using sources directly, e.g. in TensorFlow $ CFLAGS="-I$VTUNEROOT/include -DJIT_PROFILING_VTUNE" LDFLAGS="-L$VTUNEROOT/lib64 -ljitprofiling" bazel build

Optimization Notice Copyright © 2018, Intel Corporation. All rights reserved. *Other names and brands may be claimed as the property of others. Intel-Optimized Frameworks: How To Get?

Check out our intel.ai for the framework optimizations page

https://www.intel.ai/framework-optimizations

Optimization Notice Copyright © 2018, Intel Corporation. All rights reserved. *Other names and brands may be claimed as the property of others. Intel® Optimization of Tensorflow*: How To Get?

Intel Tensorflow* install guide is available  https://software.intel.com/en-us/articles/intel-optimization-for--installation-guide

• Main trunk conda install tensorflow –c anaconda Conda Package • Intel Channel conda install tensorflow –c intel • IDP Full conda create –n IDP intelpython3_full

PyPI Package • pip install intel-tensorflow

• $ docker pull docker.io/intelaipg/intel-optimized- tensorflow:latest Docker Images • $ docker run -it -p 8888:8888 intelaipg/intel-optimized- tensorflow

• https://github.com/tensorflow/tensorflow Build from Source • Refer install guide for more details

Optimization Notice Copyright © 2018, Intel Corporation. All rights reserved. *Other names and brands may be claimed as the property of others. Intel® Optimization of MxNet* and Pytorch*: How To Get?

PyPI Package • pip install mxnet-mkl==1.2.0 [–user]

Build from • https://github.com/apache/incubator-mxnet Source • Refer install guide for more details

Intel® Math Kernel Library for Deep Neural Network (MKL-DNN) has been integrated into official release of PyTorch by default, thus users can get performance benefit on Intel platform without additional installation steps. https://pytorch.org/

Optimization Notice Copyright © 2018, Intel Corporation. All rights reserved. *Other names and brands may be claimed as the property of others. Scale AI workloads with Intel optimizations Scale AI workloads:

Designed for Spark* or Apache* Hadoop* clusters running on Intel® Xeon® processors!

Feature Parity Lower TCO and Deep Learning on with Caffe* and improved ease of Big Data Platform, * use with existing Enabling Efficient infrastructure Scale-Out software.intel.com/bigdl Rich deep learning support https://software.intel.com/en-us/articles/bigdl-distributed-deep- learning-on-apache-spark Extremely high performance. High Performance Deep Learning for FREE on CPU Infrastructure1 1Open-sourceOptimization software is available Notice for download at no cost; ‘free’ is also contingent upon running on existing idle CPU infrastructure where the operating cost is treated as a ‘sunk’ cost Copyright © 2018, Intel Corporation. All rights reserved. *Other names and brandsOptimization may be claimed asNotice the property of others. Scale AI workloads: Horovod

With Parameter Distributed Server Tensorflow with Parameter Server

The parameter server model for distributed training jobs can be configured with different ratios of parameter servers to workers, each with different performance profiles.

Intel optimized AI frameworks support Horovod seemlessly

No Parameter Server

Uber’s open source Distributed training framework for TensorFlow

The ring all-reduce algorithm allows worker nodes to average gradients and disperse them to all nodes without the need for a parameter server. Source: https://eng.uber.com/horovod/

Intel and the Intel logo are trademarks of Intel Corporation in the U. S. and/or other countries. *Other names and brands Optimization Notice may be claimed as the property of others. Copyright © 2018, Intel Corporation. Copyright © 2018, Intel Corporation. All rights reserved. *Other names and brands may be claimed as the property of others. SCALE AI: Intel® machine learning scaling library (mlsl)

https://Optimizationgithub.com/intel/MLSL Notice Copyright © 2018, Intel Corporation. All rights reserved. https://usermanual.wiki/Document/DeveloperGuide.95427288.pdf*Other names and brands may be claimed as the property of others. nd formerly known as 2 generation INTEL® XEON® SCALABLE PROCESSOR Cascade Lake

Drop-in compatible CPU on Intel® Xeon® Scalable platform TCO/Flexibility Performance SecUrity Begin your AI journey efficiently, Built-in Acceleration with Hardware-Enhanced now with even more agility… Intel® Deep Learning Boost… Security…  Intel® Security Essentials  IMT – Intel® Infrastructure Up to deep  Intel® SecL: Intel® Security Management Technologies learning Libraries for Data Center  ADQ – Application Device Queues 30X throughput!1  SST – Intel® Speed Select Technology  TDT – Intel® Threat Detection Throughput (img/s) Technology

1 Based on Intel internal testing: 1X,5.7x,14x and 30x performance improvement based on Intel® Optimization for Café ResNet-50 inference throughput performance on Intel® Xeon® Scalable Processor. See Configuration Details 3 Performance results are based on testing as of 7/11/2017(1x) ,11/8/2018 (5.7x), 2/20/2019 (14x) and 2/26/2019 (30x) and may not reflect all publically available security updates. No product can be absolutely secure. See configuration disclosure for details. , Optimization Notice: Intel's compilers may or may not optimize to the same degree for non-Intel microprocessors for optimizations that are not unique to Intel microprocessors. These optimizations include SSE2, SSE3, and SSSE3 instruction sets and other optimizations. Intel does not guarantee the availability, functionality, or effectiveness of any optimization on microprocessors not manufactured by Intel. Microprocessor-dependent optimizations in this product are intended for use with Intel microprocessors. Certain optimizations not specific to Intel microarchitecture are reserved for Intel microprocessors. Please refer to the applicable product User and Reference Guides for more information regarding the specific instruction sets covered by this notice. Software and workloads used in performance tests may have been optimized for performance only on Intel microprocessors. Performance tests, such as SYSmark and MobileMark, are measured using specific computer systems, components, software, operations and functions. Any change to any of those factors may cause the results to vary. You should consult other information and performance tests to assist you in fully evaluating your contemplated purchases, including the performance of that product when combined with other products. For more complete information visit: http://www.intel.com/performance Optimization Notice Copyright © 2018, Intel Corporation. All rights reserved. © 2019 Intel*Other Corporation names and brands may be claimed as the property of others. Intel® Deep Learning Boost (DL Boost) featuring Vector Neural Network Instructions (VNNI) Sign Mantissa INT8 07 06 05 04 03 02 01 00

1. Fused multiply-add instruction NEW 2. MKLDNN is optimized for VNNI

Speeds-up image classification, speech recognition, language translation, object detection and more Optimization Notice Copyright © 2018, Intel Corporation. All rights reserved. *Other names and brands may be claimed as the property of others. Deep learning performance on CPU Hardware + Software Improvements for Intel® Xeon® Processors Resnet-50 I 1.9x2 V

Inception v3 1.8x2 Caffe 285x SSD-VGG16 N 2.0x2 N T N 50x Resnet-50 1.9x2

Baseline vs. Baseline vs. Baseline 2 Inception v3 8 1.8x I July 2017 July 2017 Skylake launch February 2019 TensorFlow CASCADE SKYLAKE 2S Intel® Xeon® Scalable Processor (Skylake) LAKE 1 5.7x inference throughput improvement with Intel® Optimizations for Caffe ResNet-50 on Intel® Xeon® Platinum 8180 Processor in Feb 2019 compared to performance at launch in July 2017. See configuration details on Config 1 Performance results are based on testing as of dates shown in configuration and may not reflect all publicly available security updates. 28/24/2018) Results have been estimated using internal Intel analysis or architecture simulation or modeling, and provided to you for informational purposes. Any differences in your system hardware, software or configuration may affect your actual performance. Certain optimizations not specific to Intel microarchitecture are reserved for Intel microprocessors. Please refer to the applicable product User and Reference Guides for more information regarding the specific instruction sets covered by this notice. No product can be absolutely secure. See configuration disclosure for details. Optimization Notice: Intel's compilers may or may not optimize to the same degree for non-Intel microprocessors for optimizations that are not unique to Intel microprocessors. These optimizations include SSE2, SSE3, and SSSE3 instruction sets and other optimizations. Intel does not guarantee the availability, functionality, or effectiveness of any optimization on microprocessors not manufactured by Intel. Microprocessor-dependent optimizations in this product are intended for use with Intel microprocessors. Certain optimizations not specific to Intel microarchitecture are reserved for Intel microprocessors. Please refer to the applicable product User and Reference Guides for more information regarding the specific instruction sets covered by this notice. Software and workloads used in performance tests may have been optimized for performance only on Intel microprocessors. Performance tests, such as SYSmark and MobileMark, are measured using specific computer systems, components, software, operations and functions. Any change to any of those factors may cause the results to vary. You should consult other information and performance tests to assist you in fully evaluating your contemplated purchases, including the performance of that product when combined with other products. For more complete information visit: http://www.intel.com/performance Optimization Notice Copyright © 2018, Intel Corporation. All rights reserved. *Other names and brands may be claimed as the property of others. VNNI usage verification by dumping JIT kernel

• Please refer to : https://intel.github.io/mkl- dnn/perf_profile.html

• $export MKLDNN_JIT_DUMP=1 • $./build/simple_net_int8_cpp • $ objdump -D -b binary -mi386:x86-64 mkldnn_dump__jit_avx512_core_x8s8s32x_conv_fwd_ ker_t.2.bin | grep vpdpbusd • The sample output with VNNI instruction sets

Optimization Notice Copyright © 2018, Intel Corporation. All rights reserved. *Other names and brands may be claimed as the property of others. Performance SuMMARY Training Performance on AWS C5 instance

Data collected from AWS Machine learning blog From the blog post “Training a ResNet-50 benchmark with synthetic ImageNet dataset using our optimized build of TensorFlow 1.6 on a c5.18xlarge instance type was 7.4X faster than training on the stock TensorFlow 1.6 binaries”

- Sumit Thakur, AWS

System configuration and hardware specs at:

https://aws.amazon.com/blogs/machine-learning/ faster-training-with-optimized-tensorflow-1-6- on-amazon-ec2-c5-and-p3-instances/

Now intel-optimized TensorFlow 1.13 is available on AWS DLAMI and 9.5x faster https://aws.amazon.com/blogs/machine- learning/aws-deep-learning-amis-now-come-with- tensorflow-1-13-mxnet-1-4-and-support-amazon- AWS Machine Learning Blog: Faster training with optimized TensorFlow 1.6 on Amazon EC2 C5 and P3 instances linux-2/

Optimization Notice Copyright © 2018, Intel Corporation. All rights reserved. *Other names and brands may be claimed as the property of others. Up to 89 percent (ResNet- TF Scaling Efficiency w/ horovod 50*) of scaling efficiency w/ 1 MPI Process

Up to 94% of scaling w/ 2 MPI process

InceptionResNet-v2 was able to maintain at least 80 percent scalability for up to 32 nodes w/ 1 MPI Process/node https://www.intel.ai/multiOptimization Notice -node-convergence-and-scaling-of-inception-resnet-v2-model-using-intel-xeon-processors/#gs.b1r0xv Copyright © 2018, Intel Corporation. All rights reserved. https://software.intel.com/en*Other names and brands may be claimed-us/articles/using as the property of others.-intel-xeon-processors-for-multi-node-scaling-of-tensorflow-with-horovod Inference Throughput Performance CPU optimized TensorFlow compared with unoptimized (stock) TensorFlow

For More Details: https://www.anaconda.com/tensorflow-cpu-optimizations-in-anaconda/

Optimization Notice Copyright © 2018, Intel Corporation. All rights reserved. © 2019 Intel*Other Corporation names and brands may be claimed as the property of others. Intel AI OOB Tools for Cascade Lake INTEL MODEL ZOO INTEL QUANTIZATION TOOLS (int8 inference) 1. Demonstrate the AI workloads and deep learning models (fp32 and int8) Intel has 1. Post-training model optimization+ quantization process on Intel® Xeon processors optimized and validated to run on Intel hardware 2. Reduced model size resulting in FASTER inference utilizing 2. Deliver E2E inference solution at scale on VNNI instructions, while maintaining accuracy selective use cases Low Precision Inference (Data, AI model)  model zoo inference script  inference results INT8 Scale

3. Make it easy to benchmark model INT8 FP32 model MKL DNN Primitive performance on Intel hardware both in the cloud FP32 or baremetal Quantized model INT8 Model https://github.com/IntelAI/models https://github.com/IntelAI/tools

Optimization Notice https://github.com/intel/Detectron Copyright © 2018, Intel Corporation. All rights reserved. © 2019 Intel*Other Corporation names and brands may be claimed as the property of others. PretrAINED models pubhlished on top toplogies

Optimization Notice Copyright © 2018, Intel Corporation. All rights reserved. © 2019 Intel*Other Corporation names and brands may be claimed as the property of others. Article Plug Intel–Optimized TensorFlow* Performance Considerations

https://software.intel.com/en-us/articles/maximize- tensorflow-performance-on-cpu-considerations-and- recommendations-for-inference

Optimization Notice Copyright © 2018, Intel Corporation. All rights reserved. *Other names and brands may be claimed as the property of others. Free Support: Intel® AI Frameworks Forum https://forums.intel.com

Optimization Notice Copyright © 2018, Intel Corporation. All rights reserved. *Other names and brands may be claimed as the property of others. Call to Action

More information at LEARN www.intel.ai/framework-optimizations/

Use Intel’s performance- EXPLORE optimized libraries & frameworks

Use Our Free Support: forums.intel.com ENGAGE Choose “Intel Optimized AI Frameworks” from list

Optimization Notice Copyright © 2018, Intel Corporation. All rights reserved. *Other names and brands may be claimed as the property of others.