Repository: ignite Updated Branches: refs/heads/master 63a312518 -> 6efc4d9aa
IGNITE-7097: performance measurement for SparseDistributedMatrix multiplication this closes #3241 Project: http://git-wip-us.apache.org/repos/asf/ignite/repo Commit: http://git-wip-us.apache.org/repos/asf/ignite/commit/6efc4d9a Tree: http://git-wip-us.apache.org/repos/asf/ignite/tree/6efc4d9a Diff: http://git-wip-us.apache.org/repos/asf/ignite/diff/6efc4d9a Branch: refs/heads/master Commit: 6efc4d9aacb5ae71994b1bd4ac4bb4bc6765e5be Parents: 63a3125 Author: Oleg Ignatenko <[email protected]> Authored: Fri Dec 29 15:27:10 2017 +0300 Committer: Yury Babak <[email protected]> Committed: Fri Dec 29 15:27:10 2017 +0300 ---------------------------------------------------------------------- .../impls/matrix/SparseDistributedMatrix.java | 3 + .../yardstick/config/benchmark-ml.properties | 2 + .../math/IgniteAbstractMatrixMulBenchmark.java | 29 +++++--- ...iteSparseDistributedMatrixMul2Benchmark.java | 74 ++++++++++++++++++++ ...niteSparseDistributedMatrixMulBenchmark.java | 20 +++++- 5 files changed, 117 insertions(+), 11 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/ignite/blob/6efc4d9a/modules/ml/src/main/java/org/apache/ignite/ml/math/impls/matrix/SparseDistributedMatrix.java ---------------------------------------------------------------------- diff --git a/modules/ml/src/main/java/org/apache/ignite/ml/math/impls/matrix/SparseDistributedMatrix.java b/modules/ml/src/main/java/org/apache/ignite/ml/math/impls/matrix/SparseDistributedMatrix.java index 3288724..026138b 100644 --- a/modules/ml/src/main/java/org/apache/ignite/ml/math/impls/matrix/SparseDistributedMatrix.java +++ b/modules/ml/src/main/java/org/apache/ignite/ml/math/impls/matrix/SparseDistributedMatrix.java @@ -44,6 +44,9 @@ import org.apache.ignite.ml.math.impls.vector.SparseDistributedVector; * You also need to call {@link #destroy()} to remove the underlying cache when you no longer need this * matrix.</p> * <p> + * This class is not intended for fast calculations (for example, matrix multiplication). If better performance + * is needed, {@link SparseBlockDistributedMatrix} should be used instead.</p> + * <p> * <b>Currently fold supports only commutative operations.<b/></p> */ public class SparseDistributedMatrix extends AbstractMatrix implements StorageConstants { http://git-wip-us.apache.org/repos/asf/ignite/blob/6efc4d9a/modules/yardstick/config/benchmark-ml.properties ---------------------------------------------------------------------- diff --git a/modules/yardstick/config/benchmark-ml.properties b/modules/yardstick/config/benchmark-ml.properties index 4867c0f..5992665 100644 --- a/modules/yardstick/config/benchmark-ml.properties +++ b/modules/yardstick/config/benchmark-ml.properties @@ -85,6 +85,8 @@ CONFIGS="\ -cfg ${SCRIPT_DIR}/../config/ignite-localhost-config.xml -nn ${nodesNum} -b ${b} -w ${w} -d ${d} -t ${t} -sm ${sm} -dn IgniteDenseLocalOffHeapMatrixMulBenchmark -sn IgniteNode -ds ${ver}dense-local-offheap-matrix-mul-${b}-backup,\ -cfg ${SCRIPT_DIR}/../config/ignite-localhost-config.xml -nn ${nodesNum} -b ${b} -w ${w} -d ${d} -t ${t} -sm ${sm} -dn IgniteSparseLocalMatrixMulBenchmark -sn IgniteNode -ds ${ver}sparse-local-matrix-mul-${b}-backup,\ -cfg ${SCRIPT_DIR}/../config/ignite-localhost-config.xml -nn ${nodesNum} -b ${b} -w ${w} -d ${d} -t ${t} -sm ${sm} -dn IgniteSparseBlockDistributedMatrixMulBenchmark -sn IgniteNode -ds ${ver}sparse-block-distributed-matrix-mul-${b}-backup,\ +-cfg ${SCRIPT_DIR}/../config/ignite-localhost-config.xml -nn ${nodesNum} -b ${b} -w ${w} -d ${d} -t ${t} -sm ${sm} -dn IgniteSparseDistributedMatrixMulBenchmark -sn IgniteNode -ds ${ver}sparse-distributed-matrix-mul-${b}-backup,\ +-cfg ${SCRIPT_DIR}/../config/ignite-localhost-config.xml -nn ${nodesNum} -b ${b} -w ${w} -d ${d} -t ${t} -sm ${sm} -dn IgniteSparseDistributedMatrixMul2Benchmark -sn IgniteNode -ds ${ver}sparse-distributed-matrix-mul2-${b}-backup,\ -cfg ${SCRIPT_DIR}/../config/ignite-localhost-config.xml -nn ${nodesNum} -b ${b} -w ${w} -d ${d} -t ${t} -sm ${sm} -dn IgniteColumnDecisionTreeVarianceBenchmark -sn IgniteNode -ds ${ver}column-decision-tree-variance-${b}-backup,\ -cfg ${SCRIPT_DIR}/../config/ignite-localhost-config.xml -nn ${nodesNum} -b ${b} -w ${w} -d ${d} -t ${t} -sm ${sm} -dn IgniteColumnDecisionTreeGiniBenchmark -sn IgniteNode -ds ${ver}column-decision-tree-gini-${b}-backup,\ " http://git-wip-us.apache.org/repos/asf/ignite/blob/6efc4d9a/modules/yardstick/src/main/ml/org/apache/ignite/yardstick/ml/math/IgniteAbstractMatrixMulBenchmark.java ---------------------------------------------------------------------- diff --git a/modules/yardstick/src/main/ml/org/apache/ignite/yardstick/ml/math/IgniteAbstractMatrixMulBenchmark.java b/modules/yardstick/src/main/ml/org/apache/ignite/yardstick/ml/math/IgniteAbstractMatrixMulBenchmark.java index 9921e36..6cb2200 100644 --- a/modules/yardstick/src/main/ml/org/apache/ignite/yardstick/ml/math/IgniteAbstractMatrixMulBenchmark.java +++ b/modules/yardstick/src/main/ml/org/apache/ignite/yardstick/ml/math/IgniteAbstractMatrixMulBenchmark.java @@ -26,11 +26,11 @@ import org.apache.ignite.yardstick.IgniteAbstractBenchmark; import org.apache.ignite.yardstick.ml.DataChanger; /** - * Ignite benchmark that performs ML Grid operations. + * Ignite benchmark that performs ML Grid operations of matrix multiplication. */ abstract class IgniteAbstractMatrixMulBenchmark extends IgniteAbstractBenchmark { /** */ - private static final int SIZE = 1 << 8; + private static final int SIZE = 1 << 7; /** */ private double[][] dataSquare = createAndFill(SIZE, SIZE); @@ -58,9 +58,9 @@ abstract class IgniteAbstractMatrixMulBenchmark extends IgniteAbstractBenchmark @Override public void run() { Matrix m1, m2, m3, m4, m5, m6; - Matrix m7 = (m1 = createAndFill(dataSquare, scale)).times((m2 = createAndFill(dataSquare, scale))); - Matrix m8 = (m3 = createAndFill(dataRect1, scale)).times((m4 = createAndFill(dataRect2, scale))); - Matrix m9 = (m5 = createAndFill(dataRect2, scale)).times((m6 = createAndFill(dataRect1, scale))); + Matrix m7 = times(m1 = createAndFill(dataSquare, scale), m2 = createAndFill(dataSquare, scale)); + Matrix m8 = times(m3 = createAndFill(dataRect1, scale), m4 = createAndFill(dataRect2, scale)); + Matrix m9 = times(m5 = createAndFill(dataRect2, scale), m6 = createAndFill(dataRect1, scale)); m1.destroy(); m2.destroy(); @@ -81,11 +81,24 @@ abstract class IgniteAbstractMatrixMulBenchmark extends IgniteAbstractBenchmark return true; } - /** Override in subclasses with specific type Matrix. */ + /** + * Override in subclasses with specific type Matrix. Note that size of result matrix may be smaller than requested. + * + * @param rowSize Requested row size. + * @param colSize Requested column size. + * @return Matrix of desired type of size that doesn't exceed requested. + */ abstract Matrix newMatrix(int rowSize, int colSize); - /** */ - private Matrix createAndFill(double[][] data, double scale) { + /** Override in subclasses if needed. */ + Matrix times(Matrix m1, Matrix m2) { + return m1.times(m2); + } + + /** Override in subclasses if needed to account for smaller matrix size. */ + Matrix createAndFill(double[][] data, double scale) { + // IMPL NOTE yardstick 0.8.3 fails to discover benchmark if we try to account for smaller size + // matrix by using method with lambda parameter here: assign((row, col) -> data[row][col]). Matrix res = newMatrix(data.length, data[0].length).assign(data); for (int i = 0; i < data.length && i < data[0].length; i++) http://git-wip-us.apache.org/repos/asf/ignite/blob/6efc4d9a/modules/yardstick/src/main/ml/org/apache/ignite/yardstick/ml/math/IgniteSparseDistributedMatrixMul2Benchmark.java ---------------------------------------------------------------------- diff --git a/modules/yardstick/src/main/ml/org/apache/ignite/yardstick/ml/math/IgniteSparseDistributedMatrixMul2Benchmark.java b/modules/yardstick/src/main/ml/org/apache/ignite/yardstick/ml/math/IgniteSparseDistributedMatrixMul2Benchmark.java new file mode 100644 index 0000000..e1afc34 --- /dev/null +++ b/modules/yardstick/src/main/ml/org/apache/ignite/yardstick/ml/math/IgniteSparseDistributedMatrixMul2Benchmark.java @@ -0,0 +1,74 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.apache.ignite.yardstick.ml.math; + +import org.apache.ignite.ml.math.Matrix; +import org.apache.ignite.ml.math.StorageConstants; +import org.apache.ignite.ml.math.impls.matrix.SparseBlockDistributedMatrix; +import org.apache.ignite.ml.math.impls.matrix.SparseDistributedMatrix; + +/** + * Ignite benchmark that performs trivially optimized matrix multiplication of {@link SparseDistributedMatrix} that + * uses delegating to {@link SparseBlockDistributedMatrix}. For unoptimized benchmark refer + * {@link IgniteSparseDistributedMatrixMulBenchmark}. + */ +@SuppressWarnings("unused") +public class IgniteSparseDistributedMatrixMul2Benchmark extends IgniteAbstractMatrixMulBenchmark { + /** {@inheritDoc} */ + @Override Matrix newMatrix(int rowSize, int colSize) { + return new SparseDistributedMatrix(rowSize, colSize, + StorageConstants.ROW_STORAGE_MODE, StorageConstants.RANDOM_ACCESS_MODE); + } + + /** {@inheritDoc} */ + @Override public Matrix times(Matrix m1, Matrix m2) { + return new OptimisedTimes(m1, m2).times(); + } + + /** */ + private static class OptimisedTimes { + /** */ + private final Matrix m1; + + /** */ + private final Matrix m2; + + /** */ + OptimisedTimes(Matrix m1, Matrix m2) { + this.m1 = m1; + this.m2 = m2; + } + + /** */ + Matrix times() { + Matrix m1Block = new SparseBlockDistributedMatrix(m1.rowSize(), m1.columnSize()).assign(m1); + Matrix m2Block = new SparseBlockDistributedMatrix(m2.rowSize(), m2.columnSize()).assign(m2); + + Matrix m3Block = m1Block.times(m2Block); + + Matrix res = new SparseDistributedMatrix(m3Block.rowSize(), m3Block.columnSize(), + StorageConstants.ROW_STORAGE_MODE, StorageConstants.RANDOM_ACCESS_MODE).assign(m3Block); + + m1Block.destroy(); + m2Block.destroy(); + m3Block.destroy(); + + return res; + } + } +} http://git-wip-us.apache.org/repos/asf/ignite/blob/6efc4d9a/modules/yardstick/src/main/ml/org/apache/ignite/yardstick/ml/math/IgniteSparseDistributedMatrixMulBenchmark.java ---------------------------------------------------------------------- diff --git a/modules/yardstick/src/main/ml/org/apache/ignite/yardstick/ml/math/IgniteSparseDistributedMatrixMulBenchmark.java b/modules/yardstick/src/main/ml/org/apache/ignite/yardstick/ml/math/IgniteSparseDistributedMatrixMulBenchmark.java index d02ce88..0f9d288 100644 --- a/modules/yardstick/src/main/ml/org/apache/ignite/yardstick/ml/math/IgniteSparseDistributedMatrixMulBenchmark.java +++ b/modules/yardstick/src/main/ml/org/apache/ignite/yardstick/ml/math/IgniteSparseDistributedMatrixMulBenchmark.java @@ -22,14 +22,28 @@ import org.apache.ignite.ml.math.StorageConstants; import org.apache.ignite.ml.math.impls.matrix.SparseDistributedMatrix; /** - * Ignite benchmark that performs ML Grid operations. - * Todo: IGNITE-7097, complete implementation of this benchmark. + * Ignite benchmark that performs unoptimized matrix multiplication of {@link SparseDistributedMatrix}. + * For optimized benchmark refer {@link IgniteSparseBlockDistributedMatrixMulBenchmark}. */ @SuppressWarnings("unused") public class IgniteSparseDistributedMatrixMulBenchmark extends IgniteAbstractMatrixMulBenchmark { + /** This benchmark is unacceptably slow without scaling down, see IGNITE-7097. */ + private static final int SCALE_DOWN = 2; + /** {@inheritDoc} */ @Override Matrix newMatrix(int rowSize, int colSize) { - return new SparseDistributedMatrix(rowSize, colSize, + return new SparseDistributedMatrix(rowSize >> SCALE_DOWN, colSize >> SCALE_DOWN, StorageConstants.ROW_STORAGE_MODE, StorageConstants.RANDOM_ACCESS_MODE); } + + /** {@inheritDoc} */ + @Override Matrix createAndFill(double[][] data, double scale) { + Matrix res = newMatrix(data.length, data[0].length); + + for (int row = 0; row < res.rowSize(); row++) + for (int col = 0; col < res.columnSize(); col++) + res.set(row, col, row == col ? data[row][col] * scale : data[row][col]); + + return res; + } }
