Skip to content
Projects
Groups
Snippets
Help
This project
Loading...
Sign in / Register
Toggle navigation
T
tic
Overview
Overview
Details
Activity
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
0
Issues
0
List
Board
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Charts
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
wenyuanbo
tic
Commits
65246a71
Commit
65246a71
authored
Jul 07, 2016
by
tqchen
Committed by
Tianqi Chen
May 29, 2018
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
change project to NNVM
parent
cd49ed0e
Expand all
Hide whitespace changes
Inline
Side-by-side
Showing
15 changed files
with
129 additions
and
98 deletions
+129
-98
nnvm/LICENSE
+0
-0
nnvm/README.md
+37
-6
nnvm/include/nnvm/base.h
+6
-6
nnvm/include/nnvm/graph.h
+6
-6
nnvm/include/nnvm/graph_attr_types.h
+10
-10
nnvm/include/nnvm/node.h
+6
-6
nnvm/include/nnvm/op.h
+20
-20
nnvm/include/nnvm/pass.h
+9
-9
nnvm/include/nnvm/tuple.h
+5
-5
nnvm/src/core/graph_attr_types.cc
+4
-4
nnvm/src/core/node.cc
+3
-3
nnvm/src/core/op.cc
+5
-5
nnvm/src/core/pass.cc
+4
-4
nnvm/src/example/operator.cc
+4
-4
nnvm/src/test_main.cc
+10
-10
No files found.
nnvm/LICENSE
View file @
65246a71
This diff is collapsed.
Click to expand it.
nnvm/README.md
View file @
65246a71
# mxnngraph
Prototype of graph optimizer and construction API for next generation core engine in MXNet and beyond
# NNVM: Build deep learning system by parts
## Goal
-
Construct graph easily
-
Pluggable inference, optimization algorithms
-
Can be used as input graph execution in various settings, specifically be able to support mxnet's symbolic execution API
NNVM is not a deep learning library. It is a modular, lightweight library to
help build deep learning libraries efficiently.
## What is it
While most deep learning systems offer end to end solutions,
it is interesting to ask if we can actually assemble a deep learning system by parts.
The goal is to enable hackers can customize optimizations, target platforms and set of operators they care about.
We believe that the modular system is an interesting direction.
The hope is that effective parts can be assembled together just like you assemble your own desktops.
So the customized deep learning solution can be minimax, minimum in terms of dependencies,
while maxiziming the users' need.
NNVM offers one such part, it provides a generic to do generic
computation graph optimization such as memory reduction, device allocation,
operator fusion while being agnostic to the operator
interface defintion and how operators are executed.
NNVM is inspired by LLVM, aiming to be an intermediate representation library
for neural nets and computation graphs in general.
## Deep learning system by parts
This is one way to divide the deep learning system into common parts.
Each can be isolated to a modular part.
-
Computation graph definition, manipulation.
-
Computation graph intermediate optimization.
-
Computation graph execution.
-
Operator kernel libraries.
-
Imperative task scheduling and parallel task coordination.
We hope that there will be more modular parts in the future,
so system building can be fun and rewarding.
## Links
[
MXNet
](
https://github.com/dmlc/mxnet
)
will be using NNVM as its intermediate
representation layer for symbolic graphs.
nnvm/include/nn
graph
/base.h
→
nnvm/include/nn
vm
/base.h
View file @
65246a71
/*!
* Copyright (c) 2016 by Contributors
* \file base.h
* \brief Configuation of nn
graph
as well as basic data structure.
* \brief Configuation of nn
vm
as well as basic data structure.
*/
#ifndef NN
GRAPH
_BASE_H_
#define NN
GRAPH
_BASE_H_
#ifndef NN
VM
_BASE_H_
#define NN
VM
_BASE_H_
#include <dmlc/base.h>
#include <dmlc/any.h>
...
...
@@ -12,7 +12,7 @@
#include <dmlc/registry.h>
#include <dmlc/array_view.h>
namespace
nn
graph
{
namespace
nn
vm
{
/*! \brief any type */
using
any
=
dmlc
::
any
;
...
...
@@ -47,6 +47,6 @@ inline const T& get(const any& src) {
return
dmlc
::
get
<
T
>
(
src
);
}
}
// namespace nn
graph
}
// namespace nn
vm
#endif // NN
GRAPH
_BASE_H_
#endif // NN
VM
_BASE_H_
nnvm/include/nn
graph
/graph.h
→
nnvm/include/nn
vm
/graph.h
View file @
65246a71
/*!
* Copyright (c) 2016 by Contributors
* \file graph.h
* \brief Configuation of nn
graph
as well as basic data structure.
* \brief Configuation of nn
vm
as well as basic data structure.
*/
#ifndef NN
GRAPH
_GRAPH_H_
#define NN
GRAPH
_GRAPH_H_
#ifndef NN
VM
_GRAPH_H_
#define NN
VM
_GRAPH_H_
#include <vector>
#include <string>
...
...
@@ -15,7 +15,7 @@
#include "./base.h"
#include "./node.h"
namespace
nn
graph
{
namespace
nn
vm
{
/*!
* \brief Symbolic computation graph.
...
...
@@ -98,6 +98,6 @@ inline void Graph::DFSVisit(FVisit fvisit) const {
});
}
}
// namespace nn
graph
}
// namespace nn
vm
#endif // NN
GRAPH
_GRAPH_H_
#endif // NN
VM
_GRAPH_H_
nnvm/include/nn
graph
/graph_attr_types.h
→
nnvm/include/nn
vm
/graph_attr_types.h
View file @
65246a71
...
...
@@ -3,14 +3,14 @@
* \file graph_attr_types.h
* \brief Data structures that can appear in graph attributes.
*/
#ifndef NN
GRAPH
_GRAPH_ATTR_TYPES_H_
#define NN
GRAPH
_GRAPH_ATTR_TYPES_H_
#ifndef NN
VM
_GRAPH_ATTR_TYPES_H_
#define NN
VM
_GRAPH_ATTR_TYPES_H_
#include <vector>
#include <unordered_map>
#include "./graph.h"
namespace
nn
graph
{
namespace
nn
vm
{
/*!
* \brief Auxililary data structure to index a graph.
...
...
@@ -39,7 +39,7 @@ struct IndexedGraph {
/*! \brief Node data structure in IndexedGraph */
struct
Node
{
/*! \brief pointer to the source node */
const
nn
graph
::
Node
*
source
;
const
nn
vm
::
Node
*
source
;
/*! \brief inputs to the node */
array_view
<
NodeEntry
>
inputs
;
/*! \brief control flow dependencies to the node */
...
...
@@ -68,7 +68,7 @@ struct IndexedGraph {
* \param e The entry to query for index.
* \return the unique index.
*/
inline
uint32_t
entry_id
(
const
nn
graph
::
NodeEntry
&
e
)
const
{
inline
uint32_t
entry_id
(
const
nn
vm
::
NodeEntry
&
e
)
const
{
return
entry_rptr_
[
node_id
(
e
.
node
.
get
())]
+
e
.
index
;
}
/*!
...
...
@@ -76,7 +76,7 @@ struct IndexedGraph {
* \param node The Node to query for index.
* \return the node index.
*/
inline
uint32_t
node_id
(
const
nn
graph
::
Node
*
node
)
const
{
inline
uint32_t
node_id
(
const
nn
vm
::
Node
*
node
)
const
{
return
node2index_
.
at
(
node
);
}
/*!
...
...
@@ -92,7 +92,7 @@ struct IndexedGraph {
* \param node The pointer to the Node structure
* \return const reference to the corresponding IndexedGraph::Node
*/
inline
const
Node
&
operator
[](
const
nn
graph
::
Node
*
node
)
const
{
inline
const
Node
&
operator
[](
const
nn
vm
::
Node
*
node
)
const
{
return
nodes_
[
node_id
(
node
)];
}
/*! \return list of argument nodes */
...
...
@@ -113,7 +113,7 @@ struct IndexedGraph {
// index to argument nodes
std
::
vector
<
uint32_t
>
arg_nodes_
;
// mapping from node to index.
std
::
unordered_map
<
const
nn
graph
::
Node
*
,
uint32_t
>
node2index_
;
std
::
unordered_map
<
const
nn
vm
::
Node
*
,
uint32_t
>
node2index_
;
// CSR pointer of node entries
std
::
vector
<
size_t
>
entry_rptr_
;
// space to store input entries of each
...
...
@@ -122,6 +122,6 @@ struct IndexedGraph {
std
::
vector
<
uint32_t
>
control_deps_
;
};
}
// namespace nn
graph
}
// namespace nn
vm
#endif // NN
GRAPH
_GRAPH_ATTR_TYPES_H_
#endif // NN
VM
_GRAPH_ATTR_TYPES_H_
nnvm/include/nn
graph
/node.h
→
nnvm/include/nn
vm
/node.h
View file @
65246a71
/*!
* Copyright (c) 2016 by Contributors
* \file
bas
e.h
* \file
nod
e.h
* \brief Graph node data structure.
*/
#ifndef NN
GRAPH
_NODE_H_
#define NN
GRAPH
_NODE_H_
#ifndef NN
VM
_NODE_H_
#define NN
VM
_NODE_H_
#include <memory>
#include <string>
...
...
@@ -13,7 +13,7 @@
#include "./base.h"
#include "./op.h"
namespace
nn
graph
{
namespace
nn
vm
{
// Forward declare node.
class
Node
;
...
...
@@ -93,6 +93,6 @@ inline uint32_t Node::num_outputs() const {
}
}
}
// namespace nn
graph
}
// namespace nn
vm
#endif // NN
GRAPH
_NODE_H_
#endif // NN
VM
_NODE_H_
nnvm/include/nn
graph
/op.h
→
nnvm/include/nn
vm
/op.h
View file @
65246a71
...
...
@@ -3,8 +3,8 @@
* \file op.h
* \brief Operator information structor.
*/
#ifndef NN
GRAPH
_OP_H_
#define NN
GRAPH
_OP_H_
#ifndef NN
VM
_OP_H_
#define NN
VM
_OP_H_
#include <string>
#include <vector>
...
...
@@ -13,7 +13,7 @@
#include <functional>
#include "./base.h"
namespace
nn
graph
{
namespace
nn
vm
{
// forward declarations
class
Node
;
...
...
@@ -38,18 +38,18 @@ static const int kVarg = -1;
* // registeration of oeprators
* // NOTE that the attr function can register any
* // additional attributes to the operator
* NN
GRAPH
_REGISTER_OP(add)
* NN
VM
_REGISTER_OP(add)
* .describe("add two inputs together")
* .set_num_inputs(2)
* .attr<OpKernel>("gpu_kernel", AddKernel);
*
* NN
GRAPH
_REGISTER_OP(sub)
* NN
VM
_REGISTER_OP(sub)
* .describe("substract one tensor from another")
* .set_num_inputs(2);
*
* // Can call regster multiple times in different files
* // to register different part of information
* NN
GRAPH
_REGISTER_OP(sub)
* NN
VM
_REGISTER_OP(sub)
* .attr<OpKernel>("gpu_kernel", SubKernel);
*
* // get operators from registry.
...
...
@@ -124,7 +124,7 @@ class Op {
* const std::vector<TShape>& ishapes) {
* // we can use the parsed version of param
* // without repeatively parsing the parameter
* const SumParam& param = nn
graph
::get<SumParam>(attrs.parsed);
* const SumParam& param = nn
vm
::get<SumParam>(attrs.parsed);
* }
* \endcode
*/
...
...
@@ -234,36 +234,36 @@ class OpMap {
};
// internal macros to make
#define NN
GRAPH
_STR_CONCAT_(__x, __y) __x##__y
#define NN
GRAPH_STR_CONCAT(__x, __y) NNGRAPH
_STR_CONCAT_(__x, __y)
#define NN
GRAPH
_REGISTER_VAR_DEF(OpName) \
static ::nn
graph::Op & __make_ ## NNGraph
Op ## _ ## OpName
#define NN
VM
_STR_CONCAT_(__x, __y) __x##__y
#define NN
VM_STR_CONCAT(__x, __y) NNVM
_STR_CONCAT_(__x, __y)
#define NN
VM
_REGISTER_VAR_DEF(OpName) \
static ::nn
vm::Op & __make_ ## Nnvm
Op ## _ ## OpName
/*!
* \def NN
GRAPH
_REGISTER_OP
* \def NN
VM
_REGISTER_OP
* \brief Register
* This macro must be used under namespace dmlc, and only used once in cc file.
* \param OpName The name of registry
*
* \code
*
* NN
GRAPH
_REGISTER_OP(add)
* NN
VM
_REGISTER_OP(add)
* .describe("add two inputs together")
* .set_num_inputs(2)
* .attr<OpKernel>("gpu_kernel", AddKernel);
*
* \endcode
*/
#define NN
GRAPH
_REGISTER_OP(OpName) \
NN
GRAPH_STR_CONCAT(NNGRAPH
_REGISTER_VAR_DEF(OpName), __COUNTER__) = \
::dmlc::Registry<::nn
graph
::Op>::Get()->__REGISTER_OR_GET__(#OpName)
#define NN
VM
_REGISTER_OP(OpName) \
NN
VM_STR_CONCAT(NNVM
_REGISTER_VAR_DEF(OpName), __COUNTER__) = \
::dmlc::Registry<::nn
vm
::Op>::Get()->__REGISTER_OR_GET__(#OpName)
// implementations of template functions after this.
// member function of Op
template
<
typename
ValueType
>
inline
const
OpMap
<
ValueType
>&
Op
::
GetAttr
(
const
std
::
string
&
key
)
{
const
any
&
ref
=
GetAttrMap
(
key
);
return
nn
graph
::
get
<
OpMap
<
ValueType
>
>
(
ref
);
return
nn
vm
::
get
<
OpMap
<
ValueType
>
>
(
ref
);
}
template
<
typename
ValueType
>
...
...
@@ -282,7 +282,7 @@ inline Op& Op::attr( // NOLINT(*)
<<
" previously "
<<
pmap
->
type
().
name
()
<<
" current "
<<
typeid
(
OpMap
<
ValueType
>
).
name
();
std
::
vector
<
std
::
pair
<
ValueType
,
int
>
>&
vec
=
nn
graph
::
get
<
OpMap
<
ValueType
>
>
(
*
pmap
).
data_
;
nn
vm
::
get
<
OpMap
<
ValueType
>
>
(
*
pmap
).
data_
;
// resize the value type.
vec
.
resize
(
index_
+
1
,
std
::
make_pair
(
ValueType
(),
0
));
...
...
@@ -338,6 +338,6 @@ inline const ValueType& OpMap<ValueType>::operator[](const Op* op) const {
return
data_
[
idx
].
first
;
}
}
// namespace nn
graph
}
// namespace nn
vm
#endif // NN
GRAPH
_OP_H_
#endif // NN
VM
_OP_H_
nnvm/include/nn
graph
/pass.h
→
nnvm/include/nn
vm
/pass.h
View file @
65246a71
...
...
@@ -3,15 +3,15 @@
* \file pass.h
* \brief Pass that can be applied to a graph.
*/
#ifndef NN
GRAPH
_PASS_H_
#define NN
GRAPH
_PASS_H_
#ifndef NN
VM
_PASS_H_
#define NN
VM
_PASS_H_
#include <vector>
#include <functional>
#include "./base.h"
#include "./graph.h"
namespace
nn
graph
{
namespace
nn
vm
{
/*!
* \brief A PassFunction is a basic "Operator on Graph"
...
...
@@ -90,12 +90,12 @@ struct PassFunctionReg
};
/*!
* \def NN
GRAPH
_REGISTER_PASS
* \def NN
VM
_REGISTER_PASS
* \brief Macro to register pass fuctions.
*
* \code
* // example of registering a shape inference pass
* NN
GRAPH
_REGISTER_PASS(InferShape)
* NN
VM
_REGISTER_PASS(InferShape)
* .describe("Shape Inference function, generate graph attributes")
* .provide_graph_attr("data_shape")
* .depend_graph_attr("indexed_graph")
...
...
@@ -105,9 +105,9 @@ struct PassFunctionReg
* });
* \endcode
*/
#define NN
GRAPH
_REGISTER_PASS(name) \
DMLC_REGISTRY_REGISTER(::nn
graph
::PassFunctionReg, PassFunctionReg, name)
#define NN
VM
_REGISTER_PASS(name) \
DMLC_REGISTRY_REGISTER(::nn
vm
::PassFunctionReg, PassFunctionReg, name)
}
// namespace nn
graph
}
// namespace nn
vm
#endif // NN
GRAPH
_PASS_H_
#endif // NN
VM
_PASS_H_
nnvm/include/nn
graph
/tuple.h
→
nnvm/include/nn
vm
/tuple.h
View file @
65246a71
...
...
@@ -3,15 +3,15 @@
* \file tuple.h
* \brief Data structure Tuple and TShape to store dynamic sized shapes.
*/
#ifndef NN
GRAPH
_TUPLE_H_
#define NN
GRAPH
_TUPLE_H_
#ifndef NN
VM
_TUPLE_H_
#define NN
VM
_TUPLE_H_
#include <vector>
#include <type_traits>
#include <algorithm>
#include <iostream>
namespace
nn
graph
{
namespace
nn
vm
{
/*! \brief data type to store array index */
typedef
uint32_t
index_t
;
...
...
@@ -329,6 +329,6 @@ class TShape : public Tuple<index_t> {
}
};
}
// namespace nn
graph
}
// namespace nn
vm
#endif // NN
GRAPH
_TUPLE_H_
#endif // NN
VM
_TUPLE_H_
nnvm/src/core/graph_attr_types.cc
View file @
65246a71
...
...
@@ -3,10 +3,10 @@
* \file graph_attr_types.cc
* \brief Graph node data structure.
*/
#include <nn
graph
/graph_attr_types.h>
#include <nn
vm
/graph_attr_types.h>
#include <limits>
namespace
nn
graph
{
namespace
nn
vm
{
// implement constructor from graph
IndexedGraph
::
IndexedGraph
(
const
Graph
&
g
)
{
...
...
@@ -14,7 +14,7 @@ IndexedGraph::IndexedGraph(const Graph &g) {
std
::
vector
<
size_t
>
inputs_rptr
{
0
},
control_rptr
{
0
};
g
.
DFSVisit
([
this
,
&
inputs_rptr
,
&
control_rptr
]
(
const
std
::
shared_ptr
<
nn
graph
::
Node
>&
n
)
{
(
const
std
::
shared_ptr
<
nn
vm
::
Node
>&
n
)
{
CHECK_LT
(
nodes_
.
size
(),
std
::
numeric_limits
<
uint32_t
>::
max
());
uint32_t
nid
=
static_cast
<
uint32_t
>
(
nodes_
.
size
());
// nodes_
...
...
@@ -59,4 +59,4 @@ IndexedGraph::IndexedGraph(const Graph &g) {
}
}
}
// namespace nn
graph
}
// namespace nn
vm
nnvm/src/core/node.cc
View file @
65246a71
...
...
@@ -3,9 +3,9 @@
* \file node.cc
* \brief Graph node data structure.
*/
#include <nn
graph
/node.h>
#include <nn
vm
/node.h>
namespace
nn
graph
{
namespace
nn
vm
{
Node
::~
Node
()
{
if
(
inputs
.
size
()
!=
0
)
{
...
...
@@ -42,4 +42,4 @@ std::shared_ptr<Node> Node::Create() {
return
std
::
make_shared
<
Node
>
();
}
}
// namespace nn
graph
}
// namespace nn
vm
nnvm/src/core/op.cc
View file @
65246a71
...
...
@@ -3,18 +3,18 @@
* \file op.cc
* \brief Support for operator registry.
*/
#include <nn
graph
/base.h>
#include <nn
graph
/op.h>
#include <nn
vm
/base.h>
#include <nn
vm
/op.h>
#include <atomic>
#include <mutex>
namespace
dmlc
{
// enable registry
DMLC_REGISTRY_ENABLE
(
nn
graph
::
Op
);
DMLC_REGISTRY_ENABLE
(
nn
vm
::
Op
);
}
// namespace dmlc
namespace
nn
graph
{
namespace
nn
vm
{
// single manager of operator information.
struct
OpManager
{
...
...
@@ -66,4 +66,4 @@ void Op::UpdateAttrMap(const std::string& key,
updater
(
&
value
);
}
}
// namespace nn
graph
}
// namespace nn
vm
nnvm/src/core/pass.cc
View file @
65246a71
...
...
@@ -3,15 +3,15 @@
* \file pass.cc
* \brief Support for pass registry.
*/
#include <nn
graph
/pass.h>
#include <nn
vm
/pass.h>
#include <algorithm>
namespace
dmlc
{
// enable registry
DMLC_REGISTRY_ENABLE
(
nn
graph
::
PassFunctionReg
);
DMLC_REGISTRY_ENABLE
(
nn
vm
::
PassFunctionReg
);
}
// namespace dmlc
namespace
nn
graph
{
namespace
nn
vm
{
const
PassFunctionReg
*
FindPassDep
(
const
std
::
string
&
attr_name
)
{
for
(
auto
*
r
:
dmlc
::
Registry
<
PassFunctionReg
>::
List
())
{
...
...
@@ -54,4 +54,4 @@ Graph ApplyPass(const Graph& src,
return
g
;
}
}
// namespace nn
graph
}
// namespace nn
vm
nnvm/src/example/operator.cc
View file @
65246a71
// Copyright (c) 2016 by Contributors
// This is an example on how we can register operator information to NN
GRAPH
// This is an example on how we can register operator information to NN
VM
#include <nn
graph
/op.h>
#include <nn
vm
/op.h>
#include <utility>
NN
GRAPH
_REGISTER_OP
(
add
)
NN
VM
_REGISTER_OP
(
add
)
.
describe
(
"add two data together"
)
.
set_num_inputs
(
2
)
.
attr
(
"inplace_pair"
,
std
::
make_pair
(
0
,
0
));
NN
GRAPH
_REGISTER_OP
(
add
)
NN
VM
_REGISTER_OP
(
add
)
.
attr
<
std
::
string
>
(
"nick_name"
,
"plus"
);
nnvm/src/test_main.cc
View file @
65246a71
// Copyright (c) 2016 by Contributors
#include <nn
graph
/op.h>
#include <nn
graph
/graph.h>
#include <nn
graph
/tuple.h>
#include <nn
graph
/graph_attr_types.h>
#include <nn
vm
/op.h>
#include <nn
vm
/graph.h>
#include <nn
vm
/tuple.h>
#include <nn
vm
/graph_attr_types.h>
#include <string>
void
test_op
()
{
using
namespace
nn
graph
;
using
namespace
nn
vm
;
auto
add
=
Op
::
Get
(
"add"
);
auto
nick
=
Op
::
GetAttr
<
std
::
string
>
(
"nick_name"
);
LOG
(
INFO
)
<<
"nick="
<<
nick
[
add
];
}
void
test_tuple
()
{
using
nn
graph
::
Tuple
;
using
nn
graph
::
TShape
;
using
nn
vm
::
Tuple
;
using
nn
vm
::
TShape
;
Tuple
<
int
>
x
{
1
,
2
,
3
};
Tuple
<
int
>
y
{
1
,
2
,
3
,
5
,
6
};
x
=
std
::
move
(
y
);
...
...
@@ -27,7 +27,7 @@ void test_tuple() {
std
::
istringstream
is
(
os
.
str
());
is
>>
y
;
CHECK_EQ
(
x
,
y
);
Tuple
<
nn
graph
::
index_t
>
ss
{
1
,
2
,
3
};
Tuple
<
nn
vm
::
index_t
>
ss
{
1
,
2
,
3
};
TShape
s
=
ss
;
s
=
std
::
move
(
ss
);
CHECK
((
s
==
TShape
{
1
,
2
,
3
}));
...
...
@@ -35,8 +35,8 @@ void test_tuple() {
void
test_graph
()
{
nn
graph
::
Graph
g
;
g
.
DFSVisit
([](
const
std
::
shared_ptr
<
const
nn
graph
::
Node
>&
n
){
nn
vm
::
Graph
g
;
g
.
DFSVisit
([](
const
std
::
shared_ptr
<
const
nn
vm
::
Node
>&
n
){
});
}
int
main
()
{
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment