Skip to content
This repository was archived by the owner on Nov 17, 2023. It is now read-only.
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
44 commits
Select commit Hold shift + click to select a range
a7e7fa4
add zero grad for npi_unique (#18080)
haojin2 Apr 17, 2020
b9c6a4a
flatnonzero (#17690)
Yiyan66 Feb 26, 2020
8b5cb5e
[Numpy] FFI for cumsum and add (#17747)
haojin2 Mar 5, 2020
e8e320e
[Numpy] FFI: Bincount, Percentile/Quantile, All/Any (#17717)
Tommliu Mar 10, 2020
b88092e
Add ffi benchmark (#17780)
hzfan Mar 10, 2020
2a3dbda
ffi wrappers for polyval, ediff1d, nan_to_num (#17832)
Alicia1529 Mar 17, 2020
8750350
Fix compiler warnings in new FFI (#17718)
hzfan Feb 28, 2020
8c90040
ffi invocation: expand_dims, tril, diff, broadcast_to (#17738)
Alicia1529 Mar 9, 2020
e406293
[Numpy] FFI for split and svd (#17816)
hzfan Mar 17, 2020
7ed6bf7
add ffi for full_like, binary (#17811)
Alicia1529 Mar 18, 2020
a81d5f4
* impl - FFI for np_where_op (#17817)
DwwWxx Mar 17, 2020
b816d43
ffi for roll/rot90 (#17861)
Tommliu Mar 18, 2020
34b4708
[Numpy] allow mix integer dtypes for power/add/multiply (#17921)
JiangZhaoh Apr 8, 2020
aedf66b
fix true_divide (#18393)
sxjscience May 24, 2020
f862579
* FFI for np.argmax and np.argmin (#17843)
DwwWxx Mar 18, 2020
f00c3b5
add alias for np.__version__, np._NoValue and np.dtype (#17777)
haojin2 Mar 6, 2020
27d5008
[Numpy] FFI for diag/diagonal/diag_indices_from (#17789)
Tommliu Mar 24, 2020
905eb27
ffi_atleast_1/2/3d (#17897)
Tommliu Apr 8, 2020
acb535b
add: numpy rollaxis (#17865)
yijunc Apr 10, 2020
ce37bef
* impl - FFI for np einsum (#17869)
DwwWxx Mar 25, 2020
28dbfda
[numpy] add op random.f (#17586)
Yiyan66 Mar 12, 2020
573830a
[NumPy] add op random.laplace (#17316)
AntiZpvoh Mar 16, 2020
fd17146
* impl - FFi for linalg op (#17795)
DwwWxx Apr 7, 2020
5a9bf61
[Numpy] FFI: split and svd #17816
hzfan Mar 17, 2020
0809840
ffi random (#18051)
Yiyan66 Apr 14, 2020
9a3a4e6
* impl - linalg.lstsq for cpu (#17950)
DwwWxx Apr 8, 2020
0a1f296
Add np.linalg.qr (#17851)
D-Roberts Apr 9, 2020
ef14000
[Numpy] FFI for linalg.qr and linalg.lstsq (#18040)
DwwWxx Apr 14, 2020
da2adcf
Add np.linalg.qr backward (#18050)
D-Roberts Apr 16, 2020
68a2a1a
ffi_array_split, v/h/dsplit (#17873)
Tommliu Apr 8, 2020
f998d0e
[numpy] FFI for insert \ delete \ matmul etc. (#17759)
JiangZhaoh Apr 10, 2020
be6623e
* impl debug - FFI for linalg multioutput op (#17879)
DwwWxx Apr 10, 2020
ff2dbab
* impl - linalg matrix_rank for cpu and gpu implemented (#18020)
DwwWxx Apr 14, 2020
20f70e4
[Numpy] Kron operator (#17323)
hanke580 Mar 23, 2020
2f69252
[Numpy] OP_interp (#17793)
Tommliu Apr 8, 2020
6fe903b
[numpy] add op median #17084
Yiyan66 Apr 2, 2020
3f195fb
[Numpy] Add op fmax, fmin, fmod (#17567)
hanke580 Mar 23, 2020
673d3b3
add: numpy op tril_indices (#17904)
yijunc Apr 10, 2020
5ba7a77
[NumPy] Add NumPy support for triu (#17614)
vexilligera Apr 14, 2020
9ec1c4b
fix mixed type backward (#18250)
yijunc May 9, 2020
05551d0
[Numpy] Add ffi for np.sum, np.std, np.var, np.average and np.histogr…
haojin2 Apr 16, 2020
2e57a6b
[numpy] FFI binary bitwise ops (#17812)
Yiyan66 Apr 8, 2020
1944c70
[Numpy] FFI: random.choice, take and clip (#17854)
AntiZpvoh Apr 13, 2020
327f7ad
fix np.clip scalar input case (#17788)
xidulu Mar 12, 2020
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion 3rdparty/mkldnn
4 changes: 2 additions & 2 deletions Makefile
Original file line number Diff line number Diff line change
Expand Up @@ -460,9 +460,9 @@ endif

all: lib/libmxnet.a lib/libmxnet.so $(BIN) extra-packages extension_libs

SRC = $(wildcard src/*/*/*/*.cc src/*/*/*.cc src/*/*.cc src/*.cc)
SRC = $(wildcard src/*/*/*/*/*.cc src/*/*/*/*.cc src/*/*/*.cc src/*/*.cc src/*.cc)
OBJ = $(patsubst %.cc, build/%.o, $(SRC))
CUSRC = $(wildcard src/*/*/*/*.cu src/*/*/*.cu src/*/*.cu src/*.cu)
CUSRC = $(wildcard src/*/*/*/*.cu src/*/*/*/*.cu src/*/*/*.cu src/*/*.cu src/*.cu)
CUOBJ = $(patsubst %.cu, build/%_gpu.o, $(CUSRC))

ifeq ($(USE_TVM_OP), 1)
Expand Down
231 changes: 231 additions & 0 deletions benchmark/python/ffi/benchmark_ffi.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,231 @@
# 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.
import timeit
import itertools
import argparse
import os

class OpArgMngr(object):
"""Operator argument manager for storing operator workloads."""
args = {}

@staticmethod
def add_workload(funcname, *args, **kwargs):
if "_specifier" not in kwargs:
_specifier = funcname
else:
_specifier = kwargs["_specififer"]
del kwargs["_specififer"]
if _specifier in OpArgMngr.args:
raise ValueError("duplicate {}".format(_specifier))
OpArgMngr.args[_specifier] = {'args': args, 'kwargs': kwargs, 'funcname': funcname}


def generate_workloads():
array_pool = {}
shapes = []
for ndim in range(4):
shapes.extend(list(itertools.product(range(4), repeat=ndim)))
for shape in shapes:
name = 'x'.join(str(i) for i in shape)
if name in array_pool:
raise ValueError("duplicate array {}".format(name))
array_pool[name] = dnp.ones(shape)
return array_pool


def prepare_workloads():
pool = generate_workloads()
OpArgMngr.add_workload("zeros", (2, 2))
OpArgMngr.add_workload("einsum", "ii", pool['2x2'], optimize=False)
OpArgMngr.add_workload("unique", pool['1'], return_index=True, return_inverse=True, return_counts=True, axis=-1)
OpArgMngr.add_workload("dstack", (pool['2x1'], pool['2x1'], pool['2x1'], pool['2x1']))
OpArgMngr.add_workload("polyval", dnp.arange(10), pool['2x2'])
OpArgMngr.add_workload("ediff1d", pool['2x2'], pool['2x2'], pool['2x2'])
OpArgMngr.add_workload("nan_to_num", pool['2x2'])
OpArgMngr.add_workload("tensordot", pool['2x2'], pool['2x2'], ((1, 0), (0, 1)))
OpArgMngr.add_workload("kron", pool['2x2'], pool['2x2'])
OpArgMngr.add_workload("cumsum", pool['3x2'], axis=0, out=pool['3x2'])
OpArgMngr.add_workload("sum", pool['2x2'], axis=0, keepdims=True, out=pool['1x2'])
OpArgMngr.add_workload("std", pool['2x2'], axis=0, ddof=0, keepdims=True, out=pool['1x2'])
OpArgMngr.add_workload("var", pool['2x2'], axis=0, ddof=1, keepdims=True, out=pool['1x2'])
OpArgMngr.add_workload("average", pool['2x2'], weights=pool['2'], axis=1, returned=True)
OpArgMngr.add_workload("histogram", pool['2x2'], bins=10, range=(0.0, 10.0))
OpArgMngr.add_workload("add", pool['2x2'], pool['2x2'])
OpArgMngr.add_workload("linalg.eig", pool['3x3'])
OpArgMngr.add_workload("linalg.eigh", pool['3x3'])
OpArgMngr.add_workload("linalg.det", pool['3x3'])
OpArgMngr.add_workload("linalg.slogdet", pool['3x3'])
OpArgMngr.add_workload("linalg.matrix_rank", pool['3x3'], pool['1'], hermitian=False)
OpArgMngr.add_workload("linalg.svd", pool['3x3'])
OpArgMngr.add_workload("linalg.cholesky", pool['1x1'])
OpArgMngr.add_workload("linalg.qr", pool['3x3'])
OpArgMngr.add_workload("linalg.lstsq", pool['2x1'], pool['2'], rcond=None)
OpArgMngr.add_workload("linalg.eigvals", pool['1x1'])
OpArgMngr.add_workload("linalg.eigvalsh", pool['1x1'], UPLO='L')
OpArgMngr.add_workload("linalg.inv", pool['1x1'])
OpArgMngr.add_workload("linalg.pinv", pool['2x3x3'], pool['1'], hermitian=False)
OpArgMngr.add_workload("linalg.solve", pool['1x1'], pool['1'])
OpArgMngr.add_workload("linalg.tensorinv", pool['1x1'], ind=2)
OpArgMngr.add_workload("linalg.tensorsolve", pool['1x1x1'], pool['1x1x1'], (2, 0, 1))
OpArgMngr.add_workload("linalg.svd", pool['3x3'])
OpArgMngr.add_workload("split", pool['3x3'], (0, 1, 2), axis=1)
OpArgMngr.add_workload("argmax", pool['3x2'], axis=-1)
OpArgMngr.add_workload("argmin", pool['3x2'], axis=-1)
OpArgMngr.add_workload("atleast_1d", pool['2'], pool['2x2'])
OpArgMngr.add_workload("atleast_2d", pool['2'], pool['2x2'])
OpArgMngr.add_workload("atleast_3d", pool['2'], pool['2x2'])
OpArgMngr.add_workload("indices", dimensions=(1, 2, 3))
OpArgMngr.add_workload("subtract", pool['2x2'], pool['2x2'])
OpArgMngr.add_workload("multiply", pool['2x2'], pool['2x2'])
OpArgMngr.add_workload("mod", pool['2x2'], pool['2x2'])
OpArgMngr.add_workload("remainder", pool['2x2'], pool['2x2'])
OpArgMngr.add_workload("divide", pool['2x2'], pool['2x2'])
OpArgMngr.add_workload("true_divide", pool['2x2'], pool['2x2'])
OpArgMngr.add_workload("power", pool['2x2'], pool['2x2'])
OpArgMngr.add_workload("lcm", pool['2x2'].astype('int32'), pool['2x2'].astype('int32'))
OpArgMngr.add_workload("diff", pool['2x2'], n=1, axis=-1)
OpArgMngr.add_workload("nonzero", pool['2x2'])
OpArgMngr.add_workload("tril", pool['2x2'], k=0)
OpArgMngr.add_workload("random.choice", pool['2'], size=(2, 2))
OpArgMngr.add_workload("take", pool['2'], dnp.array([1,0], dtype='int64'))
OpArgMngr.add_workload("clip", pool['2x2'], 0, 1)
OpArgMngr.add_workload("expand_dims", pool['2x2'], axis=0)
OpArgMngr.add_workload("broadcast_to", pool['2x2'], (2, 2, 2))
OpArgMngr.add_workload("full_like", pool['2x2'], 2)
OpArgMngr.add_workload("zeros_like", pool['2x2'])
OpArgMngr.add_workload("ones_like", pool['2x2'])
OpArgMngr.add_workload("bitwise_and", pool['2x2'].astype(int), pool['2x2'].astype(int))
OpArgMngr.add_workload("bitwise_xor", pool['2x2'].astype(int), pool['2x2'].astype(int))
OpArgMngr.add_workload("bitwise_or", pool['2x2'].astype(int), pool['2x2'].astype(int))
OpArgMngr.add_workload("copysign", pool['2x2'], pool['2x2'])
OpArgMngr.add_workload("arctan2", pool['2x2'], pool['2x2'])
OpArgMngr.add_workload("hypot", pool['2x2'], pool['2x2'])
OpArgMngr.add_workload("ldexp", pool['2x2'].astype(int), pool['2x2'].astype(int))
OpArgMngr.add_workload("random.uniform", low=0, high=1, size=1)
OpArgMngr.add_workload("random.exponential", scale=2, size=(2,2))
OpArgMngr.add_workload("random.rayleigh", scale=2, size=(2,2))
OpArgMngr.add_workload("random.weibull", a=2, size=(2,2))
OpArgMngr.add_workload("random.pareto", a=2, size=(2,2))
OpArgMngr.add_workload("random.power", a=2, size=(2,2))
OpArgMngr.add_workload("random.logistic", loc=2, scale=2, size=(2,2))
OpArgMngr.add_workload("random.gumbel", loc=2, scale=2, size=(2,2))
OpArgMngr.add_workload("where", pool['2x3'], pool['2x3'], pool['2x1'])
OpArgMngr.add_workload("fmax", pool['2x2'], pool['2x2'])
OpArgMngr.add_workload("fmin", pool['2x2'], pool['2x2'])
OpArgMngr.add_workload("fmod", pool['2x2'], pool['2x2'])
OpArgMngr.add_workload("may_share_memory", pool['2x3'][:0], pool['2x3'][:1])
OpArgMngr.add_workload("diag", pool['2x2'], k=1)
OpArgMngr.add_workload("diagonal", pool['2x2x2'], offset=-1, axis1=0, axis2=1)
OpArgMngr.add_workload("diag_indices_from", pool['2x2'])
OpArgMngr.add_workload("bincount", dnp.arange(3, dtype=int), pool['3'], minlength=4)
OpArgMngr.add_workload("percentile", pool['2x2x2'], 80, axis=0, out=pool['2x2'],\
interpolation='midpoint')
OpArgMngr.add_workload("quantile", pool['2x2x2'], 0.8, axis=0, out=pool['2x2'],\
interpolation='midpoint')
OpArgMngr.add_workload("all", pool['2x2x2'], axis=(0, 1),\
out=dnp.array([False, False], dtype=bool), keepdims=False)
OpArgMngr.add_workload("any", pool['2x2x2'], axis=(0, 1),\
out=dnp.array([False, False], dtype=bool), keepdims=False)
OpArgMngr.add_workload("roll", pool["2x2"], 1, axis=0)
OpArgMngr.add_workload("rot90", pool["2x2"], 2)
OpArgMngr.add_workload("triu", pool['3x3'])
OpArgMngr.add_workload("array_split", pool['2x2'], 2, axis=1)
OpArgMngr.add_workload("vsplit", pool['2x2'], 2)
OpArgMngr.add_workload("hsplit", pool['2x2'], 2)
OpArgMngr.add_workload("dsplit", pool['2x2x2'], 2)
OpArgMngr.add_workload("arange", 10)
OpArgMngr.add_workload("concatenate", (pool['1x2'], pool['1x2'], pool['1x2']), axis=0)
OpArgMngr.add_workload("append", pool['2x2'], pool['1x2'], axis=0)
OpArgMngr.add_workload("insert", pool['3x2'], 1, pool['1x1'], axis=0)
OpArgMngr.add_workload("delete", pool['3x2'], 1, axis=0)
OpArgMngr.add_workload("blackman", 12)
OpArgMngr.add_workload("eye", 5)
OpArgMngr.add_workload("hamming", 12)
OpArgMngr.add_workload("hanning", 12)
OpArgMngr.add_workload("linspace", 0, 10, 8, endpoint=False)
OpArgMngr.add_workload("logspace", 2.0, 3.0, num=4, base=2.0, dtype=onp.float32)
OpArgMngr.add_workload("matmul", pool['2x2'], pool['2x2'])
OpArgMngr.add_workload("mean", pool['2x2'], axis=0, keepdims=True)
OpArgMngr.add_workload("random.gamma", 1, size=(2, 3))
OpArgMngr.add_workload("random.normal", 1, size=(2, 3))


def benchmark_helper(f, *args, **kwargs):
number = 10000
return timeit.timeit(lambda: f(*args, **kwargs), number=number) / number


def get_op(module, funcname):
funcname = funcname.split(".")
for fname in funcname:
module = getattr(module, fname)
return module


def run_benchmark(packages):
results = {}
for (k, v) in OpArgMngr.args.items():
result = {}
for (name, package) in packages.items():
print('{}.{} running...'.format(name, k))
op = get_op(package["module"], v["funcname"])
args = [package["data"](arg) for arg in v["args"]]
kwargs = {k: package["data"](v) for (k, v) in v["kwargs"].items()}
benchmark = benchmark_helper(op, *args, **kwargs)
result[name] = benchmark
results[k] = result
return results


def show_results(results):
print("{:>24}{:>24}{:>24}".format("name", "package", "time(us)"))
for (specifier, d) in results.items():
for (k, v) in d.items():
print("{:>24}{:>24}{:>24}".format(specifier, k, v * 10 ** 6))


if __name__ == "__main__":
parser = argparse.ArgumentParser()
parser.add_argument('ffi_type')
parsed = parser.parse_args()
if parsed.ffi_type == "cython":
os.environ['MXNET_ENABLE_CYTHON'] = '1'
os.environ['MXNET_ENFORCE_CYTHON'] = '1'
elif parsed.ffi_type == "ctypes":
os.environ['MXNET_ENABLE_CYTHON'] = '0'
else:
raise ValueError("unknown ffi_type {}",format(parsed.ffi_type))
os.environ["MXNET_ENGINE_TYPE"] = "NaiveEngine"
import mxnet as mx
import numpy as onp
from mxnet import np as dnp

mx.npx.set_np()
packages = {
"onp": {
"module": onp,
"data": lambda arr: arr.asnumpy() if isinstance(arr, dnp.ndarray) else arr
},
"dnp": {
"module": dnp,
"data": lambda arr: arr
}
}
prepare_workloads()
results = run_benchmark(packages)
show_results(results)
4 changes: 2 additions & 2 deletions include/mxnet/ir/expr.h
Original file line number Diff line number Diff line change
Expand Up @@ -141,7 +141,7 @@ class IntImmNode : public PrimExprNode {
int64_t value;

static constexpr const char* _type_key = "IntImm";
MXNET_DECLARE_FINAL_OBJECT_INFO(IntImmNode, PrimExprNode);
MXNET_DECLARE_FINAL_OBJECT_INFO(IntImmNode, PrimExprNode)
};

/*!
Expand Down Expand Up @@ -186,7 +186,7 @@ class FloatImmNode : public PrimExprNode {
double value;

static constexpr const char* _type_key = "FloatImm";
MXNET_DECLARE_FINAL_OBJECT_INFO(FloatImmNode, PrimExprNode);
MXNET_DECLARE_FINAL_OBJECT_INFO(FloatImmNode, PrimExprNode)
};

/*!
Expand Down
2 changes: 1 addition & 1 deletion include/mxnet/node/container.h
Original file line number Diff line number Diff line change
Expand Up @@ -42,7 +42,7 @@ class ArrayNode : public Object {
std::vector<ObjectRef> data;

static constexpr const char* _type_key = "Array";
MXNET_DECLARE_FINAL_OBJECT_INFO(ArrayNode, Object);
MXNET_DECLARE_FINAL_OBJECT_INFO(ArrayNode, Object)
};

/*!
Expand Down
31 changes: 23 additions & 8 deletions include/mxnet/runtime/c_runtime_api.h
Original file line number Diff line number Diff line change
Expand Up @@ -47,14 +47,11 @@ typedef enum {
kNull = 4U,
kMXNetType = 5U,
kMXNetContext = 6U,
kArrayHandle = 7U,
kObjectHandle = 8U,
kModuleHandle = 9U,
kFuncHandle = 10U,
kStr = 11U,
kBytes = 12U,
kNDArrayContainer = 13U,
kNDArrayHandle = 14U,
kObjectHandle = 7U,
kStr = 8U,
kBytes = 9U,
kPyArg = 10U,
kNDArrayHandle = 11U,
// Extension codes for other frameworks to integrate MXNet PackedFunc.
// To make sure each framework's id do not conflict, use first and
// last sections to mark ranges.
Expand Down Expand Up @@ -159,6 +156,24 @@ MXNET_DLL int MXNetFuncListGlobalNames(int* out_size,
*/
MXNET_DLL int MXNetObjectFree(MXNetObjectHandle obj);


/*!
* \brief Get the type_index from an object.
*
* \param obj The object handle.
* \param out_tindex the output type index.
* \return 0 when success, -1 when failure happens
*/
MXNET_DLL int MXNetObjectGetTypeIndex(MXNetObjectHandle obj, unsigned* out_tindex);

/*!
* \brief Convert type key to type index.
* \param type_key The key of the type.
* \param out_tindex the corresponding type index.
* \return 0 when success, -1 when failure happens
*/
MXNET_DLL int MXNetObjectTypeKey2Index(const char* type_key, unsigned* out_tindex);

#ifdef __cplusplus
} // extern "C"
#endif
Expand Down
6 changes: 3 additions & 3 deletions include/mxnet/runtime/container.h
Original file line number Diff line number Diff line change
Expand Up @@ -171,9 +171,9 @@ class ADTObj : public Object, public InplaceArrayBase<ADTObj, ObjectRef> {
uint32_t size{0};
// The fields of the structure follows directly in memory.

static constexpr const uint32_t _type_index = TypeIndex::kMXNetADT;
static constexpr const char* _type_key = "MXNet.ADT";
MXNET_DECLARE_FINAL_OBJECT_INFO(ADTObj, Object);
static constexpr const uint32_t _type_index = TypeIndex::kMXNetADT;
MXNET_DECLARE_FINAL_OBJECT_INFO(ADTObj, Object)

private:
/*!
Expand Down Expand Up @@ -273,7 +273,7 @@ class ADT : public ObjectRef {
return ADT(0, std::forward<Args>(args)...);
}

MXNET_DEFINE_OBJECT_REF_METHODS(ADT, ObjectRef, ADTObj);
MXNET_DEFINE_OBJECT_REF_METHODS(ADT, ObjectRef, ADTObj)
};

} // namespace runtime
Expand Down
Loading