samskalicky commented on a change in pull request #17885:
URL: https://github.com/apache/incubator-mxnet/pull/17885#discussion_r412352929



##########
File path: example/extensions/lib_pass/README.md
##########
@@ -0,0 +1,190 @@
+<!--- 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. -->
+
+Custom Graph Pass Example and Tutorial
+=======================================
+
+## Introduction
+
+Adding custom graph passes in MXNet used to require deep understanding of the 
MXNet backend, including nnvm pass registration and other internal classes, 
followed by recompiling MXNet from source. This feature allows adding custom 
graph passes by dynamically loading external libraries at runtime.
+
+This custom graph pass feature enables users to write custom model 
modification strategies without compiling against all of MXNet header files and 
dependencies. When a library containing custom passes is loaded dynamically, 
the components found in the library will be registered in MXNet so that users 
can use those natively just like other built-in components.
+
+## Getting Started
+
+### Have MXNet Ready
+
+To run the following example, the build type of MXNet doesn’t matter since the 
custom pass doesn’t interact with the execution of other native MXNet features. 
Note that if you want to use your custom pass with models running on GPU, you 
still need an MXNet CUDA build. 
+
+### Run An Example
+
+You can start getting familiar with custom passes by running an example 
provided in the **example/extensions/lib_pass** directory. The `myPass` example 
just copies the input graph to the output. Go to the **lib_pass** directory and 
follow these steps:
+
+1. Run `make`. The Makefile will generate the dynamic library 
**libpass_lib.so** which is compiled from the `pass_lib.cc` file. This is the 
library you are going to load that contains everything for the custom pass.
+2. Run `python test_pass.py`. It’ll first load the above library, find the 
components, register them in the MXNet backend, then execute the pass on the 
model and execute the operators like a regular MXNet operator and output the 
result. Below is the output when running the `python test_pass.py` command. 
Notice that it loads 2 passes: myPass and jsonPass.
+
+```
+[10:38:03] src/c_api/c_api.cc:286: Found 0 operators in library
+[10:38:03] src/c_api/c_api.cc:785: Found 0 partitioners in library
+[07:14:00] src/c_api/c_api.cc:887: Found 2 graph passes in library
+[07:14:00] src/c_api/c_api.cc:902:       Graph Pass [0] myPass
+[07:14:00] src/c_api/c_api.cc:902:       Graph Pass [1] jsonPass
+```
+
+### Basic Files For Custom Pass Library
+* **lib_pass/pass_lib.cc**: This file has a source code implementation of all 
required components to make a custom pass, it also shows registration of them 
so that they can be loaded by MXNet.
+* **lib_pass/Makefile**: This file compiles the source code to a dynamic 
shared library, with a header file `include/mxnet/lib_api.h` from MXNet source 
code. Currently the custom pass is compatible with C++11 onwards.
+* **lib_pass/test_pass.py**: This file calls 
`mx.library.load(‘libpass_lib.so’)` to load the library containing the custom 
components, executes the pass on the model using the `optimize_for` API, and 
prints outputs of the forward passes. The outputs should be the same as the 
regular MXNet forward pass without running the pass.
+* **include/mxnet/lib_api.h**: This file from MXNet source code is the single 
header file needed to include all necessary data types and function prototypes 
for writing a custom library. You can either specify the include path in the 
`Makefile`, or copy the header file over to `example/extensions/lib_pass` 
folder. Note that apart from this header, the custom library is independent of 
MXNet source.
+## Writing Custom Pass Library
+To build your own library containing a custom pass, compose a C++ source file 
like `mypass_lib.cc`, include `lib_api.h` header file, and write your custom 
pass with these essential functions:
+- `initialize` - Library Initialization Function
+- `REGISTER_PASS` - Pass Registration Macro
+- `graphPass` - Pass Implementation
+Then compile it to the `mypass_lib.so` dynamic library using the following 
command:
+```bash
+g++ -shared -fPIC -std=c++11 mypass_lib.cc -o libmypass_lib.so -I 
../../../include/mxnet
+```
+
+Finally, you can write a Python script to load the library and execute your 
pass on a model:
+
+```python
+import mxnet as mx
+mx.library.load(‘libmypass_lib.so’)

Review comment:
       what am i missing? looks the same to me...




----------------------------------------------------------------
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.

For queries about this service, please contact Infrastructure at:
[email protected]


Reply via email to