You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@mxnet.apache.org by zh...@apache.org on 2020/07/25 17:00:22 UTC

[incubator-mxnet] branch master updated: Remove caffe plugin (#18787)

This is an automated email from the ASF dual-hosted git repository.

zhasheng pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/incubator-mxnet.git


The following commit(s) were added to refs/heads/master by this push:
     new c1db2d5  Remove caffe plugin (#18787)
c1db2d5 is described below

commit c1db2d5636a98084392b90ad3f020a9f9d197852
Author: Leonard Lausen <la...@amazon.com>
AuthorDate: Sat Jul 25 16:58:45 2020 +0000

    Remove caffe plugin (#18787)
    
    * Remove caffe plugin
    
    * Fix
    
    * Remove CXX14 feature flag
    
    * Update test
---
 CMakeLists.txt                              |  42 ----
 docs/static_site/src/pages/api/faq/caffe.md | 148 ------------
 include/mxnet/libinfo.h                     |   6 -
 plugin/caffe/README.md                      |  58 -----
 plugin/caffe/caffe.mk                       |  32 ---
 plugin/caffe/caffe_blob.cc                  |  94 --------
 plugin/caffe/caffe_blob.h                   | 117 ----------
 plugin/caffe/caffe_common.cc                |  48 ----
 plugin/caffe/caffe_common.h                 |  97 --------
 plugin/caffe/caffe_data_iter.cc             | 273 ----------------------
 plugin/caffe/caffe_fieldentry.h             | 113 ---------
 plugin/caffe/caffe_loss-inl.h               | 303 ------------------------
 plugin/caffe/caffe_loss.cc                  |  73 ------
 plugin/caffe/caffe_loss.cu                  |  53 -----
 plugin/caffe/caffe_op-inl.h                 | 348 ----------------------------
 plugin/caffe/caffe_op.cc                    |  74 ------
 plugin/caffe/caffe_op.cu                    |  53 -----
 plugin/caffe/caffe_stream.cc                |  37 ---
 plugin/caffe/caffe_stream.h                 |  38 ---
 python/mxnet/gluon/metric.py                |   9 -
 python/mxnet/runtime.py                     |   3 +-
 src/libinfo.cc                              |   3 -
 tests/jenkins/run_test.sh                   |  56 -----
 tests/jenkins/run_test_amzn_linux_gpu.sh    |  65 ------
 tests/jenkins/run_test_ubuntu.sh            |  65 ------
 tests/python/unittest/test_runtime.py       |   2 +-
 26 files changed, 2 insertions(+), 2208 deletions(-)

diff --git a/CMakeLists.txt b/CMakeLists.txt
index 688dd42..d3e6c74 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -74,7 +74,6 @@ option(USE_JEMALLOC "Build with Jemalloc support" OFF)
 option(USE_LIBJPEG_TURBO "Use libjpeg-turbo" OFF)
 option(USE_DIST_KVSTORE "Build with DIST_KVSTORE support" OFF)
 option(USE_PLUGINS_WARPCTC "Use WARPCTC Plugins" OFF)
-option(USE_PLUGIN_CAFFE "Use Caffe Plugin" OFF)
 option(USE_CPP_PACKAGE "Build C++ Package" OFF)
 option(USE_MXNET_LIB_NAMING "Use MXNet library naming conventions." ON)
 option(USE_GPROF "Compile with gprof (profiling) flag" OFF)
@@ -521,39 +520,6 @@ if(USE_OPERATOR_TUNING AND USE_OPENMP)
   add_definitions(-DMXNET_USE_OPERATOR_TUNING=1)
 endif()
 
-if(USE_PLUGIN_CAFFE)
-  if(NOT USE_CUDA)
-    set(CPU_ONLY ON)
-    add_definitions(-DCPU_ONLY=1)
-  endif()
-  if(NOT DEFINED CAFFE_PATH)
-    if(EXISTS ${CMAKE_CURRENT_SOURCE_DIR}/caffe)
-      set(CAFFE_PATH ${CMAKE_CURRENT_SOURCE_DIR}/caffe)
-    else()
-      set(CAFFE_PATH $ENV{CAFFE_PATH})
-    endif()
-  endif()
-  list(APPEND CMAKE_MODULE_PATH ${CAFFE_PATH}/cmake)
-  include_directories(${CAFFE_PATH}/include)
-  include_directories(${CAFFE_PATH}/build/src)
-  include_directories(${CMAKE_BINARY_DIR}/caffe/include)
-  link_directories(${CAFFE_PATH}/build/lib)
-  if(NOT DEFINED CAFFE_PATH)
-    message(FATAL_ERROR "Please set CAFFE_PATH to point to the caffe source installation")
-  endif()
-  FILE(GLOB_RECURSE PLUGINS_SOURCE "plugin/caffe/*.cc" "plugin/caffe/*.h")
-  FILE(GLOB_RECURSE PLUGINS_CUSRC "plugin/caffe/*.cu")
-  list(APPEND SOURCE ${PLUGINS_SOURCE})
-  list(APPEND CUDA ${PLUGINS_CUSRC})
-  include_directories(${CMAKE_BINARY_DIR}/include)
-  add_definitions(-DMXNET_USE_CAFFE=1)
-  list(APPEND mxnet_LINKER_LIBS
-    protobuf boost_system boost_thread boost_filesystem
-    gflags glog caffe
-    ${Caffe_LINKER_LIBS}
-)
-endif()
-
 if (NOT (EXTRA_OPERATORS STREQUAL ""))
     mxnet_source_group("Extra"   GLOB_RECURSE "${EXTRA_OPERATORS}/*.cc")
     mxnet_source_group("Extra\\Cuda"   GLOB_RECURSE "${EXTRA_OPERATORS}/*.cu")
@@ -640,14 +606,6 @@ if(USE_CUDA)
   link_directories(${CUDAToolkit_LIBRARY_DIR})
 endif()
 
-# unsupported: if caffe is a subdirectory of mxnet, load its CMakeLists.txt as well
-if(USE_PLUGIN_CAFFE)
-  if(EXISTS ${CMAKE_CURRENT_SOURCE_DIR}/caffe)
-    add_subdirectory(caffe)
-  endif()
-endif()
-
-
 if(MSVC)
   set(CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG} /EHsc")
   set(CMAKE_CXX_FLAGS_RELEASE "${CMAKE_CXX_FLAGS_RELEASE} /EHsc /Gy")
diff --git a/docs/static_site/src/pages/api/faq/caffe.md b/docs/static_site/src/pages/api/faq/caffe.md
deleted file mode 100644
index ba84b8b..0000000
--- a/docs/static_site/src/pages/api/faq/caffe.md
+++ /dev/null
@@ -1,148 +0,0 @@
----
-layout: page_category
-title:  Convert from Caffe to MXNet
-category: faq
-faq_c: Deployment Environments
-question: How to convert a Caffe model to MXNet?
-permalink: /api/faq/caffe
----
-<!--- 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. -->
-# How to | Convert from Caffe to MXNet
-
-Key topics covered include the following:
-
-- [Calling Caffe operators in MXNet](#calling-caffe-operators-in-mxnet)
-
-## Calling Caffe operators in MXNet
-
-MXNet supports calling most Caffe operators,
-including network layer, data layer, and loss function, directly. It is
-particularly useful if there are customized operators implemented in Caffe, then
-we do not need to re-implement them in MXNet.
-
-### How to install
-
-This feature requires Caffe. In particular, we need to re-compile Caffe before
-[PR #4527](https://github.com/BVLC/caffe/pull/4527) is merged into Caffe. There
-are the steps of how to rebuild Caffe:
-
-1. Download [Caffe](https://github.com/BVLC/caffe). E.g. `git clone
-   https://github.com/BVLC/caffe`
-2. Download the
-   [patch for the MXNet interface](https://github.com/BVLC/caffe/pull/4527.patch)
-   and apply to Caffe. E.g.
-   ```bash
-   cd caffe && wget https://github.com/BVLC/caffe/pull/4527.patch && git apply 4527.patch
-   ```
-3. Build and install Caffe by following the
-   [official guide](https://caffe.berkeleyvision.org/installation.html).
-
-Next we need to compile MXNet with Caffe supports
-
-1. Copy `make/config.mk` (for Linux) or `make/osx.mk`
-   (for Mac) into the MXNet root folder as `config.mk` if you have not done it yet
-2. Open the copied `config.mk` and uncomment these two lines
-   ```bash
-   CAFFE_PATH = $(HOME)/caffe
-   MXNET_PLUGINS += plugin/caffe/caffe.mk
-   ```
-   Modify `CAFFE_PATH` to your Caffe installation, if necessary.
-3. Then build with 8 threads `make clean && make -j8`.
-
-### How to use
-
-This Caffe plugin adds three components into MXNet:
-
-- `sym.CaffeOp` : Caffe neural network layer
-- `sym.CaffeLoss` : Caffe loss functions
-- `io.CaffeDataIter` : Caffe data layer
-
-#### Use `sym.CaffeOp`
-The following example shows the definition of a 10 classes multi-layer perceptron:
-
-```Python
-data = mx.sym.Variable('data')
-fc1  = mx.sym.CaffeOp(data_0=data, num_weight=2, name='fc1', prototxt="layer{type:\"InnerProduct\" inner_product_param{num_output: 128} }")
-act1 = mx.sym.CaffeOp(data_0=fc1, prototxt="layer{type:\"TanH\"}")
-fc2  = mx.sym.CaffeOp(data_0=act1, num_weight=2, name='fc2', prototxt="layer{type:\"InnerProduct\" inner_product_param{num_output: 64} }")
-act2 = mx.sym.CaffeOp(data_0=fc2, prototxt="layer{type:\"TanH\"}")
-fc3 = mx.sym.CaffeOp(data_0=act2, num_weight=2, name='fc3', prototxt="layer{type:\"InnerProduct\" inner_product_param{num_output: 10}}")
-```
-
-Let's break it down. First, `data = mx.sym.Variable('data')` defines a variable
-as a placeholder for input.  Then, it's fed through Caffe operators with `fc1 =
-mx.sym.CaffeOp(...)`. `CaffeOp` accepts several arguments:
-
-- The inputs to Caffe operators are named as `data_i` for *i=0, ..., num_data-1*
-- `num_data` is the number of inputs. In default it is 1, and therefore
-skipped in the above example.
-- `num_out` is the number of outputs. In default it is 1 and also skipped.
-- `num_weight` is the number of weights (`blobs_`).  Its default value is 0. We
-need to explicitly specify it for a non-zero value.
-- `prototxt` is the protobuf configuration string.
-
-#### Use `sym.CaffeLoss`
-
-Using Caffe loss is similar.
-We can replace the MXNet loss with Caffe loss.
-We can replace
-
-Replacing the last line of the above example with the following two lines we can
-call Caffe loss instead of MXNet loss.
-
-```Python
-label = mx.sym.Variable('softmax_label')
-mlp = mx.sym.CaffeLoss(data=fc3, label=label, grad_scale=1, name='softmax', prototxt="layer{type:\"SoftmaxWithLoss\"}")
-```
-
-Similar to `CaffeOp`, `CaffeLoss` has arguments `num_data` (2 in default) and
-`num_out` (1 in default). But there are two differences
-
-1. Inputs are `data` and `label`. And we need to explicitly create a variable
-   placeholder for label, which is implicitly done in MXNet loss.
-2. `grad_scale` is the weight of this loss.
-
-#### Use `io.CaffeDataIter`
-
-We can also wrap a Caffe data layer into MXNet's data iterator. Below is an
-example for creating a data iterator for MNIST
-
-```python
-train = mx.io.CaffeDataIter(
-    prototxt =
-    'layer { \
-        name: "mnist" \
-        type: "Data" \
-        top: "data" \
-        top: "label" \
-        include { \
-            phase: TEST \
-        } \
-        transform_param { \
-            scale: 0.00390625 \
-        } \
-        data_param { \
-            source: "caffe/examples/mnist/mnist_test_lmdb" \
-            batch_size: 100 \
-            backend: LMDB \
-        } \
-    }',
-    flat           = flat,
-    num_examples   = 60000,
-)
-```
diff --git a/include/mxnet/libinfo.h b/include/mxnet/libinfo.h
index ade1c73..dd77900 100644
--- a/include/mxnet/libinfo.h
+++ b/include/mxnet/libinfo.h
@@ -115,10 +115,6 @@
 #define MXNET_USE_F16C MSHADOW_USE_F16C
 #endif
 
-#ifndef MXNET_USE_CAFFE
-#define MXNET_USE_CAFFE 0
-#endif
-
 #ifndef MXNET_USE_DIST_KVSTORE
 #define MXNET_USE_DIST_KVSTORE 0
 #endif
@@ -183,9 +179,7 @@ enum : unsigned {
   OPENCV,
 
   // Misc
-  CAFFE,
   DIST_KVSTORE,
-  CXX14,
   INT64_TENSOR_SIZE,
 
   // Signal handler to print stack traces on exceptions
diff --git a/plugin/caffe/README.md b/plugin/caffe/README.md
deleted file mode 100644
index 7e60f2e..0000000
--- a/plugin/caffe/README.md
+++ /dev/null
@@ -1,58 +0,0 @@
-<!--- 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. -->
-
-# How to use Caffe operator in MXNet
-
-[Caffe](http://caffe.berkeleyvision.org/) has been a well-known and widely-used deep learning framework. Now MXNet has supported calling most caffe operators(layers) and loss functions directly in its symbolic graph! Using one's own customized caffe layer is also effortless.
-
-Besides Caffe, MXNet has already embedded Torch modules and its tensor mathematical functions. ([link](https://github.com/dmlc/mxnet/blob/master/docs/faq/torch.md))
-
-This blog demonstrates two steps to use Caffe op in MXNet:
-
-* How to install MXNet with Caffe support.
-
-* How to embed Caffe op into MXNet's symbolic graph.
-
-## Install Caffe With MXNet interface
-* Download offical Caffe repository [BVLC/Caffe](https://github.com/BVLC/caffe).
-* Download [caffe patch for mxnet interface] (https://github.com/BVLC/caffe/pull/4527.patch). Move patch file under your caffe root folder and apply the patch by `git apply patch_file_name`.
-* Install caffe following [official guide](http://caffe.berkeleyvision.org/installation.html).
-
-## Compile with Caffe
-* In mxnet folder, open `config.mk` (if you haven't already, copy `make/config.mk` (Linux) or `make/osx.mk` (Mac) into MXNet root folder as `config.mk`) and uncomment the lines `CAFFE_PATH = $(HOME)/caffe` and `MXNET_PLUGINS += plugin/caffe/caffe.mk`. Modify `CAFFE_PATH` to your caffe installation if necessary. 
-* Run `make clean && make` to build with caffe support.
-
-## Caffe Operator (Layer)
-Caffe's neural network operator and loss functions are supported by MXNet through `mxnet.symbol.CaffeOp` and `mxnet.symbol.CaffeLoss` respectively.
-For example, the following code shows multi-layer perception network for classifying MNIST digits ([full code](https://github.com/dmlc/mxnet/blob/master/example/caffe/caffe_net.py)):
-
-### Python
-```Python
-data = mx.symbol.Variable('data')
-label = mx.symbol.Variable('softmax_label')
-fc1  = mx.symbol.CaffeOp(data_0=data, num_weight=2, name='fc1', prototxt="layer{type:\"InnerProduct\" inner_product_param{num_output: 128} }")
-act1 = mx.symbol.CaffeOp(data_0=fc1, prototxt="layer{type:\"TanH\"}")
-fc2  = mx.symbol.CaffeOp(data_0=act1, num_weight=2, name='fc2', prototxt="layer{type:\"InnerProduct\" inner_product_param{num_output: 64} }")
-act2 = mx.symbol.CaffeOp(data_0=fc2, prototxt="layer{type:\"TanH\"}")
-fc3 = mx.symbol.CaffeOp(data_0=act2, num_weight=2, name='fc3', prototxt="layer{type:\"InnerProduct\" inner_product_param{num_output: 10}}")
-mlp = mx.symbol.CaffeLoss(data=fc3, label=label, grad_scale=1, name='softmax', prototxt="layer{type:\"SoftmaxWithLoss\"}")
-```
-
-Let's break it down. First `data = mx.symbol.Variable('data')` defines a variable as placeholder for input.
-Then it's fed through Caffe operators with `fc1  = mx.symbol.CaffeOp(data_0=data, num_weight=2, name='fc1', prototxt="layer{type:\"InnerProduct\" inner_product_param{num_output: 128} }")`.
-
-The inputs to caffe op are named as data_i for i=0 ... num_data-1 as `num_data` is the number of inputs. You may skip the argument, as the example does, if its value is 1. While `num_weight` is number of `blobs_`(weights). Its default value is 0, as many ops maintain no weight. `prototxt` is the configuration string.
diff --git a/plugin/caffe/caffe.mk b/plugin/caffe/caffe.mk
deleted file mode 100644
index c115e47..0000000
--- a/plugin/caffe/caffe.mk
+++ /dev/null
@@ -1,32 +0,0 @@
-# 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.
-
-CFLAGS += -I$(CAFFE_PATH)/include -I$(CAFFE_PATH)/build/src -I$(CAFFE_PATH)/build/include
-LDFLAGS += -lprotobuf -lboost_system -lboost_thread -lboost_filesystem -lgflags -lglog -L$(CAFFE_PATH)/build/lib -lcaffe
-
-ifeq ($(USE_CUDNN), 1)
-	CFLAGS += -DUSE_CUDNN=1
-endif
-
-ifeq ($(USE_CUDA), 0)
-	CFLAGS += -DCPU_ONLY=1
-endif
-
-CAFFE_SRC = $(wildcard plugin/caffe/*.cc)
-PLUGIN_OBJ += $(patsubst %.cc, build/%.o, $(CAFFE_SRC))
-CAFFE_CUSRC = $(wildcard plugin/caffe/*.cu)
-PLUGIN_CUOBJ += $(patsubst %.cu, build/%_gpu.o, $(CAFFE_CUSRC))
diff --git a/plugin/caffe/caffe_blob.cc b/plugin/caffe/caffe_blob.cc
deleted file mode 100644
index 6a75439..0000000
--- a/plugin/caffe/caffe_blob.cc
+++ /dev/null
@@ -1,94 +0,0 @@
-/*
- * 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.
- */
-
-/*!
- * Copyright (c) 2016 by Contributors
- * \file caffe_blob.cc
- * \brief Implementations of SetDataGradToBlob given various device/dimension
- * \author Haoran Wang
-*/
-#include "caffe_blob.h"
-namespace mxnet {
-namespace op {
-namespace caffe {
-
-template<>
-void SetDataGradToBlob<mshadow::cpu, float>(caffeMemoryTypes memType,
-                            std::vector<::caffe::Blob<float>*>::iterator blob,
-                            std::vector<TBlob>::const_iterator itr) {
-  float *data_ptr = reinterpret_cast<float*>((*itr).dptr_);
-  if (memType == Data)
-    (*blob)->set_cpu_data(data_ptr);
-  else
-    MXCAFFEBLOB(*blob, float)->set_cpu_diff(data_ptr);
-}
-
-template<>
-void SetDataGradToBlob<mshadow::cpu, double>(caffeMemoryTypes memType,
-                            std::vector<::caffe::Blob<double>*>::iterator blob,
-                            std::vector<TBlob>::const_iterator itr) {
-  double *data_ptr = reinterpret_cast<double*>((*itr).dptr_);
-  if (memType == Data)
-    (*blob)->set_cpu_data(data_ptr);
-  else
-    MXCAFFEBLOB(*blob, double)->set_cpu_diff(data_ptr);
-}
-
-template<>
-void SetDataGradToBlob<mshadow::gpu, float>(caffeMemoryTypes memType,
-                            std::vector<::caffe::Blob<float>*>::iterator blob,
-                            std::vector<TBlob>::const_iterator itr) {
-  float *data_ptr = reinterpret_cast<float*>((*itr).dptr_);
-  if (memType == Data)
-    (*blob)->set_gpu_data(data_ptr);
-  else
-    MXCAFFEBLOB(*blob, float)->set_gpu_diff(data_ptr);
-}
-
-template<>
-void SetDataGradToBlob<mshadow::gpu, double>(caffeMemoryTypes memType,
-                            std::vector<::caffe::Blob<double>*>::iterator blob,
-                            std::vector<TBlob>::const_iterator itr) {
-  double *data_ptr = reinterpret_cast<double*>((*itr).dptr_);
-  if (memType == Data)
-    (*blob)->set_gpu_data(data_ptr);
-  else
-    MXCAFFEBLOB(*blob, double)->set_gpu_diff(data_ptr);
-}
-
-mxnet::TShape Vector2TShape(const std::vector<int> &vec_int) {
-  std::vector<mshadow::index_t> vec;
-  for (uint32_t i = 0; i < vec_int.size(); ++i)
-    vec.push_back(vec_int[i]);
-  // 0-dim represents scalar in caffe
-  if (vec_int.size() == 0)
-    vec.push_back(1);
-  return {vec.begin(), vec.end()};
-}
-
-std::vector<int> TShape2Vector(const mxnet::TShape &tshape) {
-  std::vector<int> s;
-  for (uint32_t i =0 ; i < tshape.ndim(); ++i)
-    s.push_back(tshape[i]);
-  return s;
-}
-
-}  // namespace caffe
-}  // namespace op
-}  // namespace mxnet
diff --git a/plugin/caffe/caffe_blob.h b/plugin/caffe/caffe_blob.h
deleted file mode 100644
index 6243b5d..0000000
--- a/plugin/caffe/caffe_blob.h
+++ /dev/null
@@ -1,117 +0,0 @@
-/*
- * 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.
- */
-
-/*!
- * Copyright (c) 2016 by Contributors
- * \file caffe_blob.h
- * \brief conversion between tensor and caffeBlob
- * \author Haoran Wang
-*/
-#ifndef PLUGIN_CAFFE_CAFFE_BLOB_H_
-#define PLUGIN_CAFFE_CAFFE_BLOB_H_
-
-#include <mxnet/tensor_blob.h>
-#include <vector>
-#include <caffe/blob.hpp>
-#include <caffe/layer.hpp>
-
-namespace mxnet {
-namespace op {
-
-namespace caffe {
-
-// Declare Memory Type for Caffe blob
-enum caffeMemoryTypes {Data, Grad, Non};
-
-mxnet::TShape Vector2TShape(const std::vector<int> &vec_int);
-std::vector<int> TShape2Vector(const mxnet::TShape &tshape);
-
-// implementation of tensor to blob, called by TensorToBlob
-template<typename Device, typename Dtype>
-void SetDataGradToBlob(caffeMemoryTypes memType,
-                       typename std::vector< ::caffe::Blob<Dtype>*>::iterator blob,
-                       typename std::vector<TBlob>::const_iterator itr);
-
-/**
- * \brief The interface to convert mxnet's tensor to caffe's blob
- * \brief called in caffe_operator_inl.h
- */
-template<typename Device, typename Dtype>
-void TBlob2CaffeBlob(caffeMemoryTypes memType,
-                     typename std::vector< ::caffe::Blob<Dtype>*>::iterator blob,
-                     typename std::vector<TBlob>::const_iterator tblob,
-                     int n = 1) {
-  for (int i = 0; i < n; ++i, ++blob, ++tblob) {
-    (*blob)->Reshape(TShape2Vector((*tblob).shape_));
-    SetDataGradToBlob<Device, Dtype>(memType, blob, tblob);
-  }
-}
-
-template<typename Dtype>
-void SetOpBlobs(::caffe::Layer<Dtype> *caffeOp,
-                const std::vector< ::caffe::Blob<Dtype>*>& weights) {
-  CHECK_EQ(caffeOp->blobs().size(), weights.size());
-  for (int i = 0; i < weights.size(); ++i)
-    caffeOp->blobs()[i].reset(weights[i]);
-}
-
-/**!
- * \brief Workaround for missing functions in ::caffe::Blob
- * \warning Do not add or override any virtual functions in this class
- * @tparam Dtype
- */
-template<class Dtype>
-class CaffeBlobFriend : public ::caffe::Blob<Dtype> {
- public:
-  inline void set_cpu_diff(Dtype* diff) {
-    CHECK(diff);
-    this->diff_->set_cpu_data(diff);
-  }
-
-  inline void set_gpu_diff(Dtype* diff) {
-    CHECK(diff);
-    this->diff_->set_gpu_data(diff);
-  }
-};
-
-#define MXCAFFEBLOB(__object$, __type$) \
-  (static_cast<mxnet::op::caffe::CaffeBlobFriend<__type$> *>(__object$))
-
-/**!
- * \brief Workaround for missing functions in ::caffe::Layer
- * \warning Do not add or override any virtual functions in this class
- * @tparam Dtype
- */
-template <typename Dtype>
-class CaffeLayerFriend : public ::caffe::Layer<Dtype> {
-  explicit CaffeLayerFriend(const ::caffe::LayerParameter& param) = delete;
- public:
-  inline void SetPhase(::caffe::Phase p) {
-    this->phase_ = p;
-  }
-};
-
-#define MXCAFFELAYER(__object$, __type$) \
-  (static_cast<mxnet::op::caffe::CaffeLayerFriend<__type$> *>(__object$))
-
-}  // namespace caffe
-}  // namespace op
-}  // namespace mxnet
-
-#endif  // PLUGIN_CAFFE_CAFFE_BLOB_H_
diff --git a/plugin/caffe/caffe_common.cc b/plugin/caffe/caffe_common.cc
deleted file mode 100644
index dd445ef..0000000
--- a/plugin/caffe/caffe_common.cc
+++ /dev/null
@@ -1,48 +0,0 @@
-/*
- * 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.
- */
-
-/*!
- * Copyright (c) 2016 by Contributors
- * \file caffe_common.h
- * \brief Common functions for caffeOp and caffeLoss symbols
- * \author Haoran Wang
-*/
-#include<mshadow/tensor.h>
-#include<caffe/common.hpp>
-#include"caffe_common.h"
-
-namespace mxnet {
-namespace op {
-namespace caffe {
-
-// Cpu implementation of set_mode
-template<>
-void CaffeMode::SetMode<mshadow::cpu>() {
-  ::caffe::Caffe::set_mode(::caffe::Caffe::CPU);
-}
-
-// Gpu implementation of set_mode
-template<>
-void CaffeMode::SetMode<mshadow::gpu>() {
-  ::caffe::Caffe::set_mode(::caffe::Caffe::GPU);
-}
-
-}  // namespace caffe
-}  // namespace op
-}  // namespace mxnet
diff --git a/plugin/caffe/caffe_common.h b/plugin/caffe/caffe_common.h
deleted file mode 100644
index 211d8c4..0000000
--- a/plugin/caffe/caffe_common.h
+++ /dev/null
@@ -1,97 +0,0 @@
-/*
- * 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.
- */
-
-/*!
- * Copyright (c) 2016 by Contributors
- * \file caffe_common.h
- * \brief Common functions for caffeOp and caffeLoss symbols
- * \author Haoran Wang
-*/
-
-#ifndef PLUGIN_CAFFE_CAFFE_COMMON_H_
-#define PLUGIN_CAFFE_CAFFE_COMMON_H_
-
-#include <mxnet/operator.h>
-#include <dmlc/type_traits.h>
-
-#include <caffe/proto/caffe.pb.h>
-
-#include <vector>
-#include <iostream>
-#include <exception>
-
-#include <caffe/layer.hpp>
-#include <caffe/blob.hpp>
-#include <caffe/layer_factory.hpp>
-
-namespace mxnet {
-namespace op {
-namespace caffe {
-
-/**
- * \brief The class sets caffe's mode before doing forward/backward
- * \tparam xpu The device that the op will be executed on.
- */
-class CaffeMode {
- public:
-  template<typename xpu> static void SetMode();
-};
-
-// Initialization funciton called by caffeOp & caffeLoss
-template<typename Dtype>
-void InitCaffeBlobs(std::vector< ::caffe::Blob<Dtype>*>* v, int n_num) {
-  for (index_t i=0; i < n_num; ++i)
-    v->push_back(new ::caffe::Blob<Dtype>());
-}
-
-template<typename Dtype>
-void DelCaffeBlobs(std::vector< ::caffe::Blob<Dtype>*>* v, int n_num) {
-  for (index_t i=0; i < n_num; ++i)
-    delete v->at(i);
-}
-
-
-struct NULLDeleter {template<typename T> void operator()(T*){}};
-
-template <typename Dtype>
-void Deleter(::caffe::Layer<Dtype> *ptr) {
-}
-
-template <typename Dtype>
-class LayerRegistry {
- public:
-  static ::caffe::Layer<Dtype> * CreateLayer(const ::caffe::LayerParameter& param) {
-    ::caffe::shared_ptr< ::caffe::Layer<Dtype> > ptr =
-      ::caffe::LayerRegistry<Dtype>::CreateLayer(param);
-    // avoid caffe::layer destructor, which deletes the weights layer owns
-    new ::caffe::shared_ptr< ::caffe::Layer<Dtype> >(ptr);
-    return ptr.get();
-  }
-};
-
-}  // namespace caffe
-}  // namespace op
-}  // namespace mxnet
-
-/*! \brief override type_name for caffe::LayerParameter */
-namespace dmlc {
-  DMLC_DECLARE_TYPE_NAME(::caffe::LayerParameter, "caffe-layer-parameter");
-}
-
-#endif  // PLUGIN_CAFFE_CAFFE_COMMON_H_
diff --git a/plugin/caffe/caffe_data_iter.cc b/plugin/caffe/caffe_data_iter.cc
deleted file mode 100644
index 552b9dc..0000000
--- a/plugin/caffe/caffe_data_iter.cc
+++ /dev/null
@@ -1,273 +0,0 @@
-/*
- * 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.
- */
-
-/*!
- * Copyright (c) 2015 by Contributors
- * \file caffe_data_iter.cc
- * \brief register mnist iterator
-*/
-#include <sys/time.h>
-#include <caffe/proto/caffe.pb.h>
-#include <dmlc/parameter.h>
-#include <atomic>
-
-#include "caffe_common.h"
-#include "caffe_stream.h"
-#include "caffe_fieldentry.h"
-#include "caffe_blob.h"
-#include "../../src/io/inst_vector.h"
-#include "../../src/io/iter_prefetcher.h"
-
-#define CHECK_NEXT_TIMING
-
-#ifdef CHECK_NEXT_TIMING
-#define IF_CHECK_TIMING(__t$) __t$
-#else
-#define IF_CHECK_TIMING(__t$)
-#endif
-
-namespace mxnet {
-namespace io {
-
-struct CaffeDataParam : public dmlc::Parameter<CaffeDataParam> {
-  /*! \brief protobuf text */
-  ::caffe::LayerParameter prototxt;
-  /*! \brief number of iterations per epoch */
-  int num_examples;
-  /*! \brief data mode */
-  bool flat;
-
-  DMLC_DECLARE_PARAMETER(CaffeDataParam) {
-    DMLC_DECLARE_FIELD(prototxt).set_default("layer{}")
-      .describe("Caffe's layer parameter");
-    DMLC_DECLARE_FIELD(flat).set_default(false)
-      .describe("Augmentation Param: Whether to flat the data into 1D.");
-    DMLC_DECLARE_FIELD(num_examples).set_lower_bound(1).set_default(10000)
-      .describe("Number of examples in the epoch.");
-  }
-};
-
-template<typename Dtype>
-class CaffeDataIter : public IIterator<TBlobBatch> {
- public:
-  explicit CaffeDataIter(int type_flag) : batch_size_(0), channels_(1), width_(1), height_(1)
-                               , type_flag_(type_flag), loc_(0)
-  {}
-  virtual ~CaffeDataIter(void) {}
-
-  // intialize iterator loads data in
-  virtual void Init(const std::vector<std::pair<std::string, std::string> >& kwargs) {
-    std::map<std::string, std::string> kmap(kwargs.begin(), kwargs.end());
-    param_.InitAllowUnknown(kmap);
-
-    // Caffe seems to understand phase inside an "include {}" block
-    if (!param_.prototxt.has_phase()) {
-      if (param_.prototxt.include().size()) {
-        if (param_.prototxt.include(0).has_phase()) {
-          param_.prototxt.set_phase(param_.prototxt.include(0).phase());
-        }
-      }
-    }
-
-    std::string type = param_.prototxt.type();
-    caffe_data_layer_ = caffe::LayerRegistry<Dtype>::CreateLayer(param_.prototxt);
-    CHECK(caffe_data_layer_ != nullptr) << "Failed creating caffe data layer";
-    const size_t top_size = param_.prototxt.top_size();
-    if (top_size > 0) {
-      if (top_size > NR_SUPPORTED_TOP_ITEMS) {
-        LOG(WARNING)
-          << "Too may \"top\" items, only two (one data, one label) are currently supported";
-      }
-      top_.reserve(top_size);
-      for (size_t x = 0; x < top_size; ++x) {
-        ::caffe::Blob<Dtype> *blob = new ::caffe::Blob<Dtype>();
-        cleanup_blobs_.push_back(std::unique_ptr<::caffe::Blob<Dtype>>(blob));
-        top_.push_back(blob);
-      }
-      caffe_data_layer_->SetUp(bottom_, top_);
-      const std::vector<int> &shape = top_[DATA]->shape();
-      const size_t shapeDimCount = shape.size();
-      if (shapeDimCount > 0) {
-        batch_size_ = shape[0];
-        if (shapeDimCount > 1) {
-          channels_ = shape[1];
-          if (shapeDimCount > 2) {
-            width_ = shape[2];
-            if (shapeDimCount > 3) {
-              height_ = shape[3];
-            }
-          }
-        }
-      }
-
-      if (top_size > DATA) {
-        if (param_.flat) {
-          batch_data_ = TBlob(nullptr, mshadow::Shape2(batch_size_,
-                                                       channels_ * width_ * height_),
-                              cpu::kDevCPU, type_flag_);
-        } else {
-          batch_data_ = TBlob(nullptr, mxnet::TShape(top_[DATA]->shape().begin(),
-                                                     top_[DATA]->shape().end()),
-                              cpu::kDevCPU, type_flag_);
-        }
-      }
-      out_.data.clear();
-      if (top_size > LABEL) {
-          batch_label_ = TBlob(nullptr, mxnet::TShape(top_[LABEL]->shape().begin(),
-                                                      top_[LABEL]->shape().end()),
-                               cpu::kDevCPU, type_flag_);
-      }
-      out_.batch_size = batch_size_;
-    }
-  }
-
-  virtual void BeforeFirst(void) {
-    loc_ = 0;
-  }
-
-  virtual bool Next(void) {
-    // MxNet iterator is expected to return CPU-accessible memory
-    if (::caffe::Caffe::mode() != ::caffe::Caffe::CPU) {
-      ::caffe::Caffe::set_mode(::caffe::Caffe::CPU);
-      CHECK_EQ(::caffe::Caffe::mode(), ::caffe::Caffe::CPU);
-    }
-    caffe_data_layer_->Forward(bottom_, top_);
-    CHECK_GT(batch_size_, 0) << "batch size must be greater than zero";
-    CHECK_EQ(out_.batch_size, batch_size_) << "Internal Error: batch size mismatch";
-
-    if (loc_ + batch_size_ <= param_.num_examples) {
-      batch_data_.dptr_ = top_[DATA]->mutable_cpu_data();
-      batch_label_.dptr_ = top_[LABEL]->mutable_cpu_data();
-
-      out_.data.clear();
-      out_.data.push_back(batch_data_);
-      out_.data.push_back(batch_label_);
-      loc_ += batch_size_;
-      return true;
-    }
-
-    return false;
-  }
-
-  virtual const TBlobBatch &Value(void) const {
-    return out_;
-  }
-
- private:
-  /*! \brief indexes into top_ */
-  enum { DATA = 0, LABEL, NR_SUPPORTED_TOP_ITEMS };
-
-  /*! \brief MNISTCass iter params */
-  CaffeDataParam param_;
-  /*! \brief Shape scalar values */
-  index_t batch_size_, channels_, width_, height_;
-  /*! \brief Caffe data layer */
-  boost::shared_ptr<caffe::Layer<Dtype> >  caffe_data_layer_;
-  /*! \brief batch data blob */
-  mxnet::TBlob batch_data_;
-  /*! \brief batch label blob */
-  mxnet::TBlob batch_label_;
-  /*! \brief Output blob data for this iteration */
-  TBlobBatch out_;
-  /*! \brief Bottom and top connection-point blob data */
-  std::vector<::caffe::Blob<Dtype>*> bottom_, top_;
-  /*! \brief Cleanup these blobs on exit */
-  std::list<std::unique_ptr<::caffe::Blob<Dtype>>> cleanup_blobs_;
-  /*! \brief type flag of the tensor blob */
-  const int type_flag_;
-  /*! \brief Blobs done so far */
-  std::atomic<size_t>  loc_;
-};  // class CaffeDataIter
-
-class CaffeDataIterWrapper : public PrefetcherIter {
- public:
-  CaffeDataIterWrapper() : PrefetcherIter(NULL), next_time_(0) {}
-  virtual ~CaffeDataIterWrapper() {
-    IF_CHECK_TIMING(
-      if (next_time_.load() > 0) {
-        LOG(WARNING) << "Caffe data loader was blocked for "
-                     << next_time_.load()
-                     << " ms waiting for incoming data";
-      }
-    )
-  }
-  virtual void Init(const std::vector<std::pair<std::string, std::string> >& kwargs) {
-    // We need to init prefetcher args in order to get dtype
-    this->param_.InitAllowUnknown(kwargs);
-    if (!this->param_.dtype) this->param_.dtype = mshadow::kFloat32;
-    switch (this->param_.dtype.value()) {
-      case mshadow::kFloat32:
-        this->loader_.reset(new CaffeDataIter<float>(this->param_.dtype.value()));
-        break;
-      case mshadow::kFloat64:
-        this->loader_.reset(new CaffeDataIter<double>(this->param_.dtype.value()));
-        break;
-      case mshadow::kFloat16:
-        LOG(FATAL) << "float16 layer is not supported by caffe";
-        return;
-      case mshadow::kBfloat16:
-        LOG(FATAL) << "bfloat16 layer is not supported by caffe";
-        return;
-      default:
-        LOG(FATAL) << "Unsupported type " << this->param_.dtype.value();
-        return;
-    }
-    PrefetcherIter::Init(kwargs);
-    this->param_.prefetch_buffer = 1;
-  }
-  virtual void BeforeFirst(void) {
-    return PrefetcherIter::BeforeFirst();
-  }
-  virtual bool Next(void) {
-    IF_CHECK_TIMING(
-      const uint64_t start_time = GetTickCountMS();
-    )
-    const bool rc = PrefetcherIter::Next();
-    IF_CHECK_TIMING(
-      const uint64_t diff_time  = GetTickCountMS() - start_time;
-      next_time_.fetch_add(diff_time);
-    )
-    return rc;
-  }
-
- protected:
-  IF_CHECK_TIMING(
-    static uint64_t GetTickCountMS() {
-      struct timeval tv;
-      gettimeofday(&tv, 0);
-      return uint64_t( tv.tv_sec ) * 1000 + tv.tv_usec / 1000;
-    }
-  )
-
-  /*! \brief milliseconds spent in Next() */
-  std::atomic<uint64_t> next_time_;
-};  // class CaffeDataIterWrapper
-
-DMLC_REGISTER_PARAMETER(CaffeDataParam);
-
-MXNET_REGISTER_IO_ITER(CaffeDataIter)
-.describe("Create MxNet iterator for a Caffe data layer.")
-.add_arguments(CaffeDataParam::__FIELDS__())
-.add_arguments(PrefetcherParam::__FIELDS__())
-.set_body([]() {
-    return new CaffeDataIterWrapper();
-});
-
-}  // namespace io
-}  // namespace mxnet
diff --git a/plugin/caffe/caffe_fieldentry.h b/plugin/caffe/caffe_fieldentry.h
deleted file mode 100644
index f97b765..0000000
--- a/plugin/caffe/caffe_fieldentry.h
+++ /dev/null
@@ -1,113 +0,0 @@
-/*
- * 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.
- */
-
-/*!
- * Copyright (c) 2016 by Contributors
- * \file caffe_fieldentry.h
- * \brief Implement FieldEntry<caffe::LayerParameter>
- * \author Haoran Wang
- */
-#ifndef PLUGIN_CAFFE_CAFFE_FIELDENTRY_H_
-#define PLUGIN_CAFFE_CAFFE_FIELDENTRY_H_
-
-#include <caffe/proto/caffe.pb.h>
-#include <dmlc/parameter.h>
-#include <dmlc/base.h>
-#include <dmlc/json.h>
-#include <dmlc/logging.h>
-#include <dmlc/type_traits.h>
-#include <google/protobuf/message.h>
-#include <google/protobuf/text_format.h>
-
-#include <cstddef>
-#include <cstdlib>
-#include <sstream>
-#include <limits>
-#include <map>
-#include <set>
-#include <typeinfo>
-#include <string>
-#include <vector>
-#include <algorithm>
-#include <utility>
-
-#include <caffe/util/io.hpp>
-namespace dmlc {
-namespace parameter {
-
-// specialize define for Layer Parameter
-template<>
-class FieldEntry<caffe::LayerParameter>
-    : public FieldEntryBase<FieldEntry<caffe::LayerParameter>, caffe::LayerParameter> {
- public:
-  // parent class
-  typedef FieldEntryBase<FieldEntry<caffe::LayerParameter>, caffe::LayerParameter> Parent;
-
-
-  bool ReadProtoFromTextContent(const std::string& text,
-                                ::google::protobuf::Message* proto) const {
-    bool success = google::protobuf::TextFormat::ParseFromString(text, proto);
-    return success;
-  }
-
-  /**
-   * /brief Customize set method for LayerParameter
-   * /tparam value string of caffe's layer configuration
-   * */
-  virtual void Set(void *head, const std::string &value) const {
-    caffe::NetParameter net_param;
-    if (!ReadProtoFromTextContent(value, &net_param))
-      CHECK(false)<< "Caffe Net Prototxt: " << value << "Initialized Failed";
-
-    CHECK_EQ(net_param.layer_size(), 1) << "Prototxt" << value <<" more than a layer";
-    caffe::LayerParameter *layer_param = new caffe::LayerParameter(net_param.layer(0));
-    this->Get(head) = (*layer_param);
-  }
-
-  virtual void PrintValue(std::ostream &os, caffe::LayerParameter value) const { // NOLINT(*)
-  }
-
-  virtual void PrintDefaultValueString(std::ostream &os) const {  // NOLINT(*)
-    std::string s;
-    caffe::NetParameter np;
-    // Avoid wasting time making a copy -- just push in out default object's pointer
-    np.mutable_layer()->AddAllocated(const_cast<::caffe::LayerParameter *>(&default_value_));
-    google::protobuf::TextFormat::PrintToString(np, &s);
-    np.mutable_layer()->ReleaseLast();
-    os << '\'' << s << '\'';
-  }
-
-  // override set_default
-  inline FieldEntry<caffe::LayerParameter> &set_default(const std::string &value) {
-    caffe::NetParameter net_param;
-    if (!ReadProtoFromTextContent(value, &net_param))
-      CHECK(false)<< "Caffe Net Prototxt: " << value << "Initialized Failed";
-
-    CHECK_EQ(net_param.layer_size(), 1) << "Protoxt " << value <<" is more than one layer";
-    default_value_ = caffe::LayerParameter(net_param.layer(0));
-    has_default_ = true;
-    // return self to allow chaining
-    return this->self();
-  }
-};
-
-}  // namespace parameter
-}  // namespace dmlc
-
-#endif  // PLUGIN_CAFFE_CAFFE_FIELDENTRY_H_
diff --git a/plugin/caffe/caffe_loss-inl.h b/plugin/caffe/caffe_loss-inl.h
deleted file mode 100644
index 98c7146..0000000
--- a/plugin/caffe/caffe_loss-inl.h
+++ /dev/null
@@ -1,303 +0,0 @@
-/*
- * 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.
- */
-
-/*!
- * Copyright (c) 2016 by Contributors
- * \file caffe_loss-inl.h
- * \brief Caffe Operator
- * \author Haoran Wang
-*/
-#ifndef PLUGIN_CAFFE_CAFFE_LOSS_INL_H_
-#define PLUGIN_CAFFE_CAFFE_LOSS_INL_H_
-
-#include <caffe/proto/caffe.pb.h>
-#include <dmlc/logging.h>
-#include <dmlc/parameter.h>
-#include <mxnet/operator.h>
-
-#include <map>
-#include <vector>
-#include <string>
-#include <utility>
-
-#include "../../src/operator/operator_common.h"
-#include "caffe_common.h"
-#include "caffe_stream.h"
-#include "caffe_fieldentry.h"
-#include "caffe_blob.h"
-
-namespace mxnet {
-namespace op {
-
-struct CaffeLossParam : public dmlc::Parameter<CaffeLossParam> {
-  ::caffe::LayerParameter prototxt;
-  int num_data, num_out;
-  float grad_scale;
-
-  DMLC_DECLARE_PARAMETER(CaffeLossParam) {
-    DMLC_DECLARE_FIELD(prototxt).set_default("layer{}")
-    .describe("Caffe's layer parameter");
-    DMLC_DECLARE_FIELD(num_data).set_range(0, 100).set_default(2)
-    .describe("Operator input number");
-    DMLC_DECLARE_FIELD(num_out).set_range(0, 100).set_default(1)
-    .describe("Operator output number");
-    DMLC_DECLARE_FIELD(grad_scale)
-    .set_default(1.0f)
-    .describe("Scale the gradient by a float factor (a.k.a weight of this loss).");
-  }
-};
-
-/**
- * \brief this is the implementation of caffe operator in caffe.
- * \tparam xpu the device that the op will be executed on.
- */
-template<typename xpu, typename Dtype>
-class CaffeLoss : public Operator {
- public:
-  explicit CaffeLoss(CaffeLossParam p):param_(p),
-                                       setup_(false) {
-    std::string type = param_.prototxt.type();
-    caffeOp_ = caffe::LayerRegistry<Dtype>::CreateLayer(param_.prototxt);
-    grad_scale_ = (Dtype)param_.grad_scale;
-
-    caffe::InitCaffeBlobs<Dtype>(&bot_, param_.num_data);
-    caffe::InitCaffeBlobs<Dtype>(&top_, param_.num_out);
-    flags_.resize(param_.num_data);
-  }
-
-  ~CaffeLoss() {
-    caffe::DelCaffeBlobs(&bot_, param_.num_data);
-    caffe::DelCaffeBlobs(&top_, param_.num_out);
-  }
-
-  virtual void Forward(const OpContext &ctx,
-                       const std::vector<TBlob> &in_data,
-                       const std::vector<OpReqType> &req,
-                       const std::vector<TBlob> &out_data,
-                       const std::vector<TBlob> &aux_args) {
-    // Set mode before forward
-    caffe::CaffeMode::SetMode<xpu>();
-    using ::caffe::Blob;
-    using std::vector;
-    using namespace mshadow;
-    using namespace mshadow::expr;
-    for (uint32_t i = 0; i < req.size(); ++i)
-      CHECK_EQ(req[i], kWriteTo);
-
-    CHECK_EQ(in_data.size(), param_.num_data);
-    CHECK_EQ(out_data.size(), param_.num_out);
-
-#if defined(__CUDACC__)
-    Stream<xpu> *s = ctx.get_stream<xpu>();
-    // TODO(Haoran): when need cublas handle in stream?
-    CHECK_EQ(s->blas_handle_ownership_, Stream<xpu>::OwnHandle)
-          << "Must init CuBLAS handle in stream";
-#endif  // __CUDACC__
-
-    caffe::TBlob2CaffeBlob<xpu, Dtype>(caffe::Data,
-                                      bot_.begin(),
-                                      in_data.begin(),
-                                      param_.num_data);
-    caffe::TBlob2CaffeBlob<xpu, Dtype>(caffe::Data,
-                                      top_.begin(),
-                                      out_data.begin(),
-                                      param_.num_out);
-    CaffeOpSetup();
-    if (ctx.is_train)
-      MXCAFFELAYER(caffeOp_, Dtype)->SetPhase(::caffe::TRAIN);
-    else
-      MXCAFFELAYER(caffeOp_, Dtype)->SetPhase(::caffe::TEST);
-    caffeOp_->Forward(bot_, top_);
-
-#if defined(__CUDACC__)
-    // Sync cpu data to gpu data
-    for (uint32_t i = 0; i < top_.size(); ++i)
-      top_[i]->gpu_data();
-
-    CHECK_EQ(cudaStreamSynchronize(NULL), cudaSuccess);
-#endif  // __CUDACC__
-  }
-
-  // Set up caffe op with real data
-  void CaffeOpSetup() {
-    if (!setup_) {
-      setup_ = true;
-      caffeOp_->SetUp(bot_, top_);
-    }
-  }
-
-  virtual void Backward(const OpContext &ctx,
-                        const std::vector<TBlob> &out_grad,
-                        const std::vector<TBlob> &in_data,
-                        const std::vector<TBlob> &out_data,
-                        const std::vector<OpReqType> &req,
-                        const std::vector<TBlob> &in_grad,
-                        const std::vector<TBlob> &aux_args) {
-    // Set mode before backward
-    caffe::CaffeMode::SetMode<xpu>();
-    using namespace mshadow;
-    using namespace mshadow::expr;
-    CHECK_EQ(out_grad.size(), param_.num_out);
-    for (int i = 0; i < param_.num_data; ++i)
-      CHECK(req[i] != kAddTo) << "caffe doesn't accm diff on bottom data";
-    CHECK(in_data.size() == param_.num_data);
-
-#if defined(__CUDACC__)
-    Stream<xpu> *s = ctx.get_stream<xpu>();
-    // TODO(Haoran): when need cublas handle in stream?
-    CHECK_EQ(s->blas_handle_ownership_, Stream<xpu>::OwnHandle)
-          << "Must init CuBLAS handle in stream";
-#endif  // __CUDACC__
-
-    caffe::TBlob2CaffeBlob<xpu, Dtype>(caffe::Grad,
-                                      bot_.begin(),
-                                      in_grad.begin(),
-                                      param_.num_data);
-    // Pass grad scale to caffe blob
-    MXCAFFEBLOB(top_[0], Dtype)->set_cpu_diff(&grad_scale_);
-
-    // Set BP flag
-    for (int i = 0; i < param_.num_data; ++i)
-      flags_[i] = req[i] != kNullOp;
-
-    caffeOp_->Backward(top_, flags_, bot_);
-
-#if defined(__CUDACC__)
-    // Sync cpu diff to gpu diff
-    for (uint32_t i = 0; i < bot_.size(); ++i)
-      bot_[i]->gpu_diff();
-
-    CHECK_EQ(cudaStreamSynchronize(NULL), cudaSuccess);
-#endif  // __CUDACC__
-  }
-
- private:
-  CaffeLossParam param_;
-  ::caffe::Layer<Dtype> *caffeOp_;
-  Dtype grad_scale_;
-  std::vector< ::caffe::Blob<Dtype> *> bot_, top_;
-  std::vector<bool> flags_;
-  bool setup_;
-};  // class CaffeLoss
-
-// Decalre Factory function, used for dispatch specialization
-template<typename xpu>
-Operator* CreateOp(CaffeLossParam param, int);
-
-#if DMLC_USE_CXX11
-class CaffeLossProp : public OperatorProperty {
- public:
-  std::vector<std::string> ListArguments() const override {
-    return {"data", "label"};
-  }
-
-  void Init(const std::vector<std::pair<std::string, std::string> >& kwargs) override {
-    param_.Init(kwargs);
-    CHECK_EQ(param_.num_out, 1);
-    CHECK_EQ(param_.num_data, 2);
-
-    // Fetch grad_scale from prototxt
-    if ((param_.prototxt.loss_weight_size() > 0))
-      param_.grad_scale = param_.prototxt.loss_weight(0);
-  }
-
-  std::map<std::string, std::string> GetParams() const override {
-    return param_.__DICT__();
-  }
-
-  /*brief Set up caffeop to infer output shape*/
-  bool InferShape(mxnet::ShapeVector *in_shape,
-                  mxnet::ShapeVector *out_shape,
-                  mxnet::ShapeVector *aux_shape) const override {
-    using namespace mshadow;
-    using ::caffe::Blob;
-    using std::vector;
-    if (caffeOp_ == NULL)
-      caffeOp_ = caffe::LayerRegistry<float>::CreateLayer(param_.prototxt);
-
-    CHECK_GE(in_shape->size(), param_.num_data);
-    // Initialize empty bottom & top blobs for caffeOp setup
-    vector<Blob<float> *> bot_blobs, top_blobs;
-
-    for (int i = 0; i < param_.num_data; ++i) {
-      mxnet::TShape tshape = (*in_shape)[i];
-      if (tshape.ndim() == 0) return false;
-      auto blob_ptr = new Blob<float>();
-      blob_ptr->Reshape(caffe::TShape2Vector(tshape));
-      bot_blobs.push_back(blob_ptr);
-    }
-
-    for (int i = 0; i < param_.num_out; ++i)
-      top_blobs.push_back(new Blob<float>());
-
-    caffeOp_->SetUp(bot_blobs, top_blobs);
-    CHECK_EQ(in_shape->size(), caffeOp_->blobs().size() + param_.num_data);
-    // Initialize out shapes
-    out_shape->clear();
-    for (auto blob : top_blobs) {
-      mxnet::TShape tshape = caffe::Vector2TShape(blob->shape());
-      out_shape->push_back(tshape);
-    }
-
-    for (auto blob_ptr : bot_blobs)
-      delete blob_ptr;
-    for (auto blob_ptr : top_blobs)
-      delete blob_ptr;
-
-    return true;
-  }
-
-  OperatorProperty* Copy() const override {
-    auto copy_prop = new CaffeLossProp();
-    copy_prop->param_ = this->param_;
-    return copy_prop;
-  }
-
-  std::string TypeString() const override {
-    return "CaffeLoss";
-  }
-
-  std::vector<int> DeclareBackwardDependency(
-    const std::vector<int> &out_grad,
-    const std::vector<int> &in_data,
-    const std::vector<int> &out_data) const override {
-    std::vector<int> dep;
-    dep.insert(dep.end(), in_data.begin(), in_data.end());
-    dep.insert(dep.end(), out_data.begin(), out_data.end());
-    return dep;
-  }
-
-  Operator* CreateOperator(Context ctx) const override {
-    LOG(FATAL) << "Not Implemented.";
-    return NULL;
-  }
-
-  Operator* CreateOperatorEx(Context ctx, mxnet::ShapeVector *in_shape,
-                             std::vector<int> *in_type) const override;
-
-
- private:
-  mutable CaffeLossParam param_;
-  mutable ::caffe::Layer<float> *caffeOp_;
-};  // class CaffeLossSymbol
-#endif
-
-}  // namespace op
-}  // namespace mxnet
-#endif  // PLUGIN_CAFFE_CAFFE_LOSS_INL_H_
diff --git a/plugin/caffe/caffe_loss.cc b/plugin/caffe/caffe_loss.cc
deleted file mode 100644
index c2d1c1b..0000000
--- a/plugin/caffe/caffe_loss.cc
+++ /dev/null
@@ -1,73 +0,0 @@
-/*
- * 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.
- */
-
-/*!
- * Copyright (c) 2016 by Contributors
- * \file caffe_loss.cc
- * \brief caffe loss
- * \author Haoran Wang
-*/
-#include "./caffe_loss-inl.h"
-
-namespace mxnet {
-namespace op {
-template<>
-Operator *CreateOp<cpu>(CaffeLossParam param, int dtype) {
-  Operator *op = NULL;
-  switch (dtype) {
-  case mshadow::kFloat32:
-    op = new CaffeLoss<cpu, float>(param);
-    break;
-  case mshadow::kFloat64:
-    op = new CaffeLoss<cpu, double>(param);
-    break;
-  case mshadow::kFloat16:
-    LOG(FATAL) << "float16 layer is not supported by caffe";
-    break;
-  case mshadow::kBfloat16:
-    LOG(FATAL) << "bfloat16 layer is not supported by caffe";
-    return;
-  default:
-    LOG(FATAL) << "Unsupported type " << dtype;
-  }
-  return op;
-}
-
-// DO_BIND_DISPATCH comes from static_operator_common.h
-Operator *CaffeLossProp::CreateOperatorEx(Context ctx, mxnet::ShapeVector *in_shape,
-                                     std::vector<int> *in_type) const {
-  std::vector<int> out_type, aux_type;
-  mxnet::ShapeVector out_shape, aux_shape;
-  out_type.resize(this->ListOutputs().size());
-  out_shape.resize(this->ListOutputs().size());
-  aux_type.resize(this->ListAuxiliaryStates().size());
-  aux_shape.resize(this->ListAuxiliaryStates().size());
-  CHECK(InferType(in_type, &out_type, &aux_type));
-  CHECK(InferShape(in_shape, &out_shape, &aux_shape));
-  DO_BIND_DISPATCH(CreateOp, param_, (*in_type)[0]);
-}
-
-DMLC_REGISTER_PARAMETER(CaffeLossParam);
-
-MXNET_REGISTER_OP_PROPERTY(CaffeLoss, CaffeLossProp)
-.describe("Caffe loss layer")
-.add_arguments(CaffeLossParam::__FIELDS__());
-
-}  // namespace op
-}  // namespace mxnet
diff --git a/plugin/caffe/caffe_loss.cu b/plugin/caffe/caffe_loss.cu
deleted file mode 100644
index ff81e1c..0000000
--- a/plugin/caffe/caffe_loss.cu
+++ /dev/null
@@ -1,53 +0,0 @@
-/*
- * 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.
- */
-
-/*!
- * Copyright (c) 2016 by Contributors
- * \file caffe_loss_gpu.cc
- * \brief caffe loss
- * \author Haoran Wang
-*/
-#include "./caffe_loss-inl.h"
-
-namespace mxnet {
-namespace op {
-template<>
-Operator* CreateOp<gpu>(CaffeLossParam param, int dtype) {
-  Operator *op = NULL;
-  switch (dtype) {
-  case mshadow::kFloat32:
-    op = new CaffeLoss<gpu, float>(param);
-    break;
-  case mshadow::kFloat64:
-    op = new CaffeLoss<gpu, double>(param);
-    break;
-  case mshadow::kFloat16:
-    LOG(FATAL) << "float16 layer is not supported by caffe";
-    break;
-  case mshadow::kBfloat16:
-    LOG(FATAL) << "bfloat16 layer is not supported by caffe";
-    break;
-  default:
-    LOG(FATAL) << "Unsupported type " << dtype;
-  }
-  return op;
-}
-
-}  // namespace op
-}  // namespace mxnet
diff --git a/plugin/caffe/caffe_op-inl.h b/plugin/caffe/caffe_op-inl.h
deleted file mode 100644
index b4ab092..0000000
--- a/plugin/caffe/caffe_op-inl.h
+++ /dev/null
@@ -1,348 +0,0 @@
-/*
- * 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.
- */
-
-/*!
- * Copyright (c) 2016 by Contributors
- * \file caffe_op-inl.h
- * \brief Caffe Operator
- * \author Haoran Wang
-*/
-#ifndef PLUGIN_CAFFE_CAFFE_OP_INL_H_
-#define PLUGIN_CAFFE_CAFFE_OP_INL_H_
-
-#include <dmlc/logging.h>
-#include <dmlc/parameter.h>
-#include <mxnet/operator.h>
-#include <caffe/proto/caffe.pb.h>
-
-#include <map>
-#include <vector>
-#include <string>
-#include <utility>
-
-#include "../../src/operator/operator_common.h"
-#include "caffe_common.h"
-#include "caffe_stream.h"
-#include "caffe_fieldentry.h"
-#include "caffe_blob.h"
-
-namespace mxnet {
-namespace op {
-
-struct CaffeOpParam : public dmlc::Parameter<CaffeOpParam> {
-  ::caffe::LayerParameter prototxt;
-  int num_data, num_weight, num_out;
-
-  DMLC_DECLARE_PARAMETER(CaffeOpParam) { DMLC_DECLARE_FIELD(prototxt).set_default("layer{}")
-    .describe("Caffe's layer parameter");
-    DMLC_DECLARE_FIELD(num_data).set_default(1)
-    .describe("Operator input number");
-    DMLC_DECLARE_FIELD(num_weight).set_default(0)
-    .describe("Weight number");
-    DMLC_DECLARE_FIELD(num_out).set_default(1)
-    .describe("Operator output number");
-  }
-};
-
-
-/**
- * \brief this is the implementation of caffe operator in caffe.
- * \tparam xpu the device that the op will be executed on.
- */
-template<typename xpu, typename Dtype>
-class CaffeOp : public Operator {
- public:
-  explicit CaffeOp(CaffeOpParam p):param_(p),
-                                   init_w_(false),
-                                   init_wd_(false),
-                                   setup_(false) {
-    std::string type = param_.prototxt.type();
-    caffeOp_ = caffe::LayerRegistry<Dtype>::CreateLayer(param_.prototxt);
-
-    caffe::InitCaffeBlobs<Dtype>(&bot_, param_.num_data);
-    caffe::InitCaffeBlobs<Dtype>(&top_, param_.num_out);
-    caffe::InitCaffeBlobs<Dtype>(&wei_, param_.num_weight);
-    flags_.resize(param_.num_data);
-  }
-
-  ~CaffeOp() {
-    caffe::DelCaffeBlobs(&bot_, param_.num_data);
-    caffe::DelCaffeBlobs(&top_, param_.num_out);
-    caffe::DelCaffeBlobs(&wei_, param_.num_weight);
-  }
-
-  virtual void Forward(const OpContext &ctx,
-                       const std::vector<TBlob> &in_data,
-                       const std::vector<OpReqType> &req,
-                       const std::vector<TBlob> &out_data,
-                       const std::vector<TBlob> &aux_args) {
-    // Set mode before forward
-    caffe::CaffeMode::SetMode<xpu>();
-    using ::caffe::Blob;
-    using std::vector;
-    using namespace mshadow;
-    using namespace mshadow::expr;
-    for (uint32_t i = 0; i < req.size(); ++i)
-      CHECK_EQ(req[i], kWriteTo);
-    int expected_num_data = param_.num_weight + param_.num_data;
-    CHECK_EQ(in_data.size(), expected_num_data);
-    CHECK_EQ(out_data.size(), param_.num_out);
-
-#if defined(__CUDACC__)
-    Stream<xpu> *s = ctx.get_stream<xpu>();
-    // TODO(Haoran): when need cublas handle in stream?
-    CHECK_EQ(s->blas_handle_ownership_, Stream<xpu>::OwnHandle)
-          << "Must init CuBLAS handle in stream";
-#endif  // __CUDACC__
-
-    caffe::TBlob2CaffeBlob<xpu, Dtype>(caffe::Data,
-                                       bot_.begin(),
-                                       in_data.begin(),
-                                       param_.num_data);
-    caffe::TBlob2CaffeBlob<xpu, Dtype>(caffe::Data,
-                                       top_.begin(),
-                                       out_data.begin(),
-                                       param_.num_out);
-    CaffeOpSetup();
-    // Init caffe's weight pointer
-    if (!init_w_) {
-      init_w_ = true;
-      caffe::TBlob2CaffeBlob<xpu, Dtype>(caffe::Data,
-                                         wei_.begin(),
-                                         in_data.begin() + param_.num_data,
-                                         param_.num_weight);
-      caffe::SetOpBlobs(caffeOp_, wei_);
-    }
-    if (ctx.is_train)
-      MXCAFFELAYER(caffeOp_, Dtype)->SetPhase(::caffe::TRAIN);
-    else
-      MXCAFFELAYER(caffeOp_, Dtype)->SetPhase(::caffe::TEST);
-    caffeOp_->Forward(bot_, top_);
-
-#if defined(__CUDACC__)
-    // Sync cpu data to gpu data
-    for (uint32_t i = 0; i < top_.size(); ++i)
-      top_[i]->gpu_data();
-
-    CHECK_EQ(cudaStreamSynchronize(NULL), cudaSuccess);
-#endif  // __CUDACC__
-  }
-
-  // Set up caffe op with real data
-  void CaffeOpSetup() {
-    if (!setup_) {
-      setup_ = true;
-      caffeOp_->SetUp(bot_, top_);
-    }
-  }
-
-  virtual void Backward(const OpContext &ctx,
-                        const std::vector<TBlob> &out_grad,
-                        const std::vector<TBlob> &in_data,
-                        const std::vector<TBlob> &out_data,
-                        const std::vector<OpReqType> &req,
-                        const std::vector<TBlob> &in_grad,
-                        const std::vector<TBlob> &aux_args) {
-    // Set mode before backward
-    caffe::CaffeMode::SetMode<xpu>();
-    using namespace mshadow;
-    using namespace mshadow::expr;
-    CHECK_EQ(out_grad.size(), param_.num_out);
-    for (int i = 0; i < param_.num_data; ++i)
-      CHECK(req[i] != kAddTo) << "caffe doesn't accm diff on bottom data";
-
-    int expected_num_data = param_.num_weight + param_.num_data;
-    CHECK(in_data.size() == expected_num_data && in_grad.size() == expected_num_data);
-    CHECK_EQ(req.size(), expected_num_data);
-
-    Stream<xpu> *s = ctx.get_stream<xpu>();
-#if defined(__CUDACC__)
-    // TODO(Haoran): when need cublas handle in stream?
-    CHECK_EQ(s->blas_handle_ownership_, Stream<xpu>::OwnHandle)
-          << "Must init CuBLAS handle in stream";
-#endif  // __CUDACC__
-
-    caffe::TBlob2CaffeBlob<xpu, Dtype>(caffe::Grad,
-                                       bot_.begin(),
-                                       in_grad.begin(),
-                                       param_.num_data);
-    caffe::TBlob2CaffeBlob<xpu, Dtype>(caffe::Grad,
-                                       top_.begin(),
-                                       out_grad.begin(),
-                                       param_.num_out);
-
-    // Init caffe's gradient pointer
-    if (!init_wd_) {
-      init_wd_ = true;
-      caffe::TBlob2CaffeBlob<xpu, Dtype>(caffe::Grad,
-                                         wei_.begin(),
-                                         in_grad.begin() + param_.num_data,
-                                         param_.num_weight);
-    }
-
-    // Handle OpReqType of weights
-    for (int i = param_.num_data; i < expected_num_data; ++i)
-      HandleOpReq(s, req[i], in_grad[i]);
-
-    // Set BP flag
-    for (int i = 0; i < param_.num_data; ++i)
-      flags_[i] = req[i] != kNullOp;
-
-    caffeOp_->Backward(top_, flags_, bot_);
-
-#if defined(__CUDACC__)
-    // Sync cpu diff to gpu diff
-    for (uint32_t i = 0; i < bot_.size(); ++i)
-      bot_[i]->gpu_diff();
-
-    CHECK_EQ(cudaStreamSynchronize(NULL), cudaSuccess);
-#endif  // __CUDACC__
-  }
-
-  void HandleOpReq(mshadow::Stream<xpu>*s, OpReqType req, const TBlob& in_g) {
-    if ((req == kWriteInplace) || (req == kWriteTo)) {
-      mshadow::Tensor<xpu, 2, Dtype> grad = in_g.FlatTo2D<xpu, Dtype>(s);
-      grad = 0;
-    }
-  }
-
- private:
-  CaffeOpParam param_;
-  ::caffe::Layer<Dtype> *caffeOp_;
-  std::vector< ::caffe::Blob<Dtype> *> bot_, top_, wei_;
-  std::vector<bool> flags_;
-  bool init_w_, init_wd_, setup_;
-};  // class CaffeOp
-
-// Decalre Factory function, used for dispatch specialization
-template<typename xpu>
-Operator* CreateOp(CaffeOpParam param, int);
-
-#if DMLC_USE_CXX11
-class CaffeOpProp : public OperatorProperty {
- public:
-  std::vector<std::string> ListArguments() const override {
-    std::vector<std::string> res;
-    for (int i = 0; i < param_.num_data; ++i)
-      res.push_back(std::string("data_") + std::to_string(i));
-
-    for (int i = 0; i < param_.num_weight; ++i) {
-      if (i == 0)
-        res.push_back(std::to_string(i) + "_weight");
-      else
-        res.push_back(std::to_string(i) + "_bias");
-    }
-    return res;
-  }
-
-  std::vector<std::string> ListOutputs() const override {
-    if (param_.num_out > 1) {
-      std::vector<std::string> ret;
-      for (int i = 0; i < param_.num_out; ++i)
-        ret.push_back("output" + std::to_string(i));
-      return ret;
-    } else {
-      return {"output"};
-    }
-  }
-
-  void Init(const std::vector<std::pair<std::string, std::string> >& kwargs) override {
-    param_.Init(kwargs);
-  }
-
-  std::map<std::string, std::string> GetParams() const override {
-    return param_.__DICT__();
-  }
-
-  /*
-   * \brief Set up caffeOp_ to infer weights & output shape
-   * \brief Initialize param_'s in & out dims
-   */
-  bool InferShape(mxnet::ShapeVector *in_shape,
-                  mxnet::ShapeVector *out_shape,
-                  mxnet::ShapeVector *aux_shape) const override {
-    if (caffeOp_ == NULL)
-      caffeOp_ = caffe::LayerRegistry<float>::CreateLayer(param_.prototxt);
-    using namespace mshadow;
-    using ::caffe::Blob;
-    using std::vector;
-    CHECK_GE(in_shape->size(), param_.num_data);
-    // Initialize emtryp bottom & top blobs for caffeop
-    vector<Blob<float> *> bot_blobs, top_blobs;
-
-    for (int i = 0; i < param_.num_data; ++i) {
-      mxnet::TShape tshape = (*in_shape)[i];
-      if (tshape.ndim() == 0) return false;
-      auto blob_ptr = new Blob<float>();
-      blob_ptr->Reshape(caffe::TShape2Vector(tshape));
-      bot_blobs.push_back(blob_ptr);
-    }
-
-    for (int i = 0; i < param_.num_out; ++i)
-      top_blobs.push_back(new Blob<float>());
-
-    caffeOp_->SetUp(bot_blobs, top_blobs);
-    CHECK_EQ(in_shape->size(), caffeOp_->blobs().size() + param_.num_data);
-    // Set weight shape
-    CHECK_EQ(param_.num_weight, caffeOp_->blobs().size());
-    for (int i = 0; i < param_.num_weight ; ++i) {
-      mxnet::TShape tshape = caffe::Vector2mxnet::TShape(caffeOp_->blobs()[i]->shape());
-      SHAPE_ASSIGN_CHECK(*in_shape, i + param_.num_data, tshape);
-    }
-    // Initialize out shapes
-    out_shape->clear();
-    for (auto blob : top_blobs) {
-      mxnet::TShape tshape = caffe::Vector2mxnet::TShape(blob->shape());
-      out_shape->push_back(tshape);
-    }
-
-    for (auto blob_ptr : bot_blobs)
-      delete blob_ptr;
-    for (auto blob_ptr : top_blobs)
-      delete blob_ptr;
-    return true;
-  }
-
-  OperatorProperty* Copy() const override {
-    auto copy_prop = new CaffeOpProp();
-    copy_prop->param_ = this->param_;
-    return copy_prop;
-  }
-
-  std::string TypeString() const override {
-    return "CaffeOp";
-  }
-
-  Operator* CreateOperator(Context ctx) const override {
-    LOG(FATAL) << "Not Implemented.";
-    return NULL;
-  }
-
-  Operator* CreateOperatorEx(Context ctx, mxnet::ShapeVector *in_shape,
-                             std::vector<int> *in_type) const override;
-
- private:
-  mutable CaffeOpParam param_;
-  mutable ::caffe::Layer<float> *caffeOp_;
-};  // class CaffeOpSymbol
-#endif
-
-}  // namespace op
-}  // namespace mxnet
-#endif  // PLUGIN_CAFFE_CAFFE_OP_INL_H_
diff --git a/plugin/caffe/caffe_op.cc b/plugin/caffe/caffe_op.cc
deleted file mode 100644
index db80f4a..0000000
--- a/plugin/caffe/caffe_op.cc
+++ /dev/null
@@ -1,74 +0,0 @@
-/*
- * 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.
- */
-
-/*!
- * Copyright (c) 2016 by Contributors
- * \file caffe_op.cc
- * \brief caffe operator
- * \author Haoran Wang
-*/
-#include "./caffe_op-inl.h"
-namespace mxnet {
-namespace op {
-
-template<>
-Operator* CreateOp<cpu>(CaffeOpParam param, int dtype) {
-  Operator *op = NULL;
-  switch (dtype) {
-  case mshadow::kFloat32:
-    op = new CaffeOp<cpu, float>(param);
-    break;
-  case mshadow::kFloat64:
-    op = new CaffeOp<cpu, double>(param);
-    break;
-  case mshadow::kFloat16:
-    LOG(FATAL) << "float16 layer is not supported by caffe";
-    break;
-  case mshadow::kBfloat16:
-    LOG(FATAL) << "bfloat16 layer is not supported by caffe";
-    break;
-  default:
-    LOG(FATAL) << "Unsupported type " << dtype;
-  }
-  return op;
-}
-
-// DO_BIND_DISPATCH comes from static_operator_common.h
-Operator *CaffeOpProp::CreateOperatorEx(Context ctx, mxnet::ShapeVector *in_shape,
-                                     std::vector<int> *in_type) const {
-  std::vector<int> out_type, aux_type;
-  mxnet::ShapeVector out_shape, aux_shape;
-  out_type.resize(this->ListOutputs().size());
-  out_shape.resize(this->ListOutputs().size());
-  aux_type.resize(this->ListAuxiliaryStates().size());
-  aux_shape.resize(this->ListAuxiliaryStates().size());
-  CHECK(InferType(in_type, &out_type, &aux_type));
-  CHECK(InferShape(in_shape, &out_shape, &aux_shape));
-  DO_BIND_DISPATCH(CreateOp, param_, (*in_type)[0]);
-}
-
-DMLC_REGISTER_PARAMETER(CaffeOpParam);
-
-MXNET_REGISTER_OP_PROPERTY(CaffeOp, CaffeOpProp)
-.describe("Apply caffe operator")
-.add_argument("data", "Symbol[]", "List of tensors")
-.add_arguments(CaffeOpParam::__FIELDS__());
-
-}  // namespace op
-}  // namespace mxnet
diff --git a/plugin/caffe/caffe_op.cu b/plugin/caffe/caffe_op.cu
deleted file mode 100644
index 7d4017b..0000000
--- a/plugin/caffe/caffe_op.cu
+++ /dev/null
@@ -1,53 +0,0 @@
-/*
- * 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.
- */
-
-/*!
- * Copyright (c) 2016 by Contributors
- * \file caffe_operator_gpu.cc
- * \brief caffe operator
- * \author Haoran Wang
-*/
-#include "./caffe_op-inl.h"
-namespace mxnet {
-namespace op {
-
-template<>
-Operator *CreateOp<gpu>(CaffeOpParam param, int dtype) {
-  Operator *op = NULL;
-  switch (dtype) {
-  case mshadow::kFloat32:
-    op = new CaffeOp<gpu, float>(param);
-    break;
-  case mshadow::kFloat64:
-    op = new CaffeOp<gpu, double>(param);
-    break;
-  case mshadow::kFloat16:
-    LOG(FATAL) << "float16 layer is not supported by caffe";
-    break;
-  case mshadow::kBfloat16:
-    LOG(FATAL) << "bfloat16 layer is not supported by caffe";
-    break;
-  default:
-    LOG(FATAL) << "Unsupported type " << dtype;
-  }
-  return op;
-}
-
-}  // namespace op
-}  // namespace mxnet
diff --git a/plugin/caffe/caffe_stream.cc b/plugin/caffe/caffe_stream.cc
deleted file mode 100644
index 823948a..0000000
--- a/plugin/caffe/caffe_stream.cc
+++ /dev/null
@@ -1,37 +0,0 @@
-/*
- * 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.
- */
-
-/*!
- * Copyright (c) 2016 by Contributors
- * \file caffe_stream.cc
- * \brief define stream opertors >> and <<
- * \author Haoran Wang
-*/
-#include"caffe_stream.h"
-
-namespace dmlc {
-namespace parameter {
-  std::istringstream &operator>>(std::istringstream &is, ::caffe::LayerParameter &para_) {
-    return is;
-  }
-  std::ostream &operator<<(std::ostream &os, ::caffe::LayerParameter &para_) {
-    return os;
-  }
-}
-}
diff --git a/plugin/caffe/caffe_stream.h b/plugin/caffe/caffe_stream.h
deleted file mode 100644
index 228e372..0000000
--- a/plugin/caffe/caffe_stream.h
+++ /dev/null
@@ -1,38 +0,0 @@
-/*
- * 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.
- */
-
-/*!
- * Copyright (c) 2016 by Contributors
- * \file caffe_stream.h
- * \brief define stream opertors >> and <<
- * \author Haoran Wang
-*/
-#ifndef PLUGIN_CAFFE_CAFFE_STREAM_H_
-#define PLUGIN_CAFFE_CAFFE_STREAM_H_
-
-#include<caffe/proto/caffe.pb.h>
-#include<iostream>
-namespace dmlc {
-namespace parameter {
-  std::istringstream &operator>>(std::istringstream &is, ::caffe::LayerParameter &para_);
-  std::ostream &operator<<(std::ostream &os, ::caffe::LayerParameter &para_);
-}
-}
-
-#endif  // PLUGIN_CAFFE_CAFFE_STREAM_H_
diff --git a/python/mxnet/gluon/metric.py b/python/mxnet/gluon/metric.py
index 5b081ce..08ee141 100644
--- a/python/mxnet/gluon/metric.py
+++ b/python/mxnet/gluon/metric.py
@@ -1805,15 +1805,6 @@ class Torch(Loss):
 
 
 @register
-class Caffe(Loss):
-    """Dummy metric for caffe criterions."""
-    def __init__(self, name='caffe',
-                 output_names=None, label_names=None):
-        super(Caffe, self).__init__(
-            name, output_names=output_names, label_names=label_names)
-
-
-@register
 @use_np
 class CustomMetric(EvalMetric):
     """Computes a customized evaluation metric.
diff --git a/python/mxnet/runtime.py b/python/mxnet/runtime.py
index 27500e7..28525ae 100644
--- a/python/mxnet/runtime.py
+++ b/python/mxnet/runtime.py
@@ -40,8 +40,7 @@ Example usage:
     [✖ CUDA, ✖ CUDNN, ✖ NCCL, ✖ CUDA_RTC, ✖ TENSORRT, ✔ CPU_SSE, ✔ CPU_SSE2, ✔ CPU_SSE3,
     ✔ CPU_SSE4_1, ✔ CPU_SSE4_2, ✖ CPU_SSE4A, ✔ CPU_AVX, ✖ CPU_AVX2, ✔ OPENMP, ✖ SSE,
     ✔ F16C, ✔ JEMALLOC, ✔ BLAS_OPEN, ✖ BLAS_ATLAS, ✖ BLAS_MKL, ✖ BLAS_APPLE, ✔ LAPACK,
-    ✖ MKLDNN, ✔ OPENCV, ✖ CAFFE, ✖ DIST_KVSTORE, ✖ CXX14, ✖ INT64_TENSOR_SIZE,
-    ✔ SIGNAL_HANDLER, ✔ DEBUG, ✖ TVM_OP]
+    ✖ MKLDNN, ✔ OPENCV, ✖ DIST_KVSTORE, ✖ INT64_TENSOR_SIZE, ✔ SIGNAL_HANDLER, ✔ DEBUG, ✖ TVM_OP]
 
 
 """
diff --git a/src/libinfo.cc b/src/libinfo.cc
index 211444e..d14aaf5 100644
--- a/src/libinfo.cc
+++ b/src/libinfo.cc
@@ -84,7 +84,6 @@ class FeatureSet {
     feature_bits.set(OPENCV, MXNET_USE_OPENCV);
 
     // Misc
-    feature_bits.set(CAFFE, MXNET_USE_CAFFE);
     feature_bits.set(DIST_KVSTORE, MXNET_USE_DIST_KVSTORE);
     feature_bits.set(INT64_TENSOR_SIZE, MXNET_USE_INT64_TENSOR_SIZE);
     feature_bits.set(SIGNAL_HANDLER, MXNET_USE_SIGNAL_HANDLER);
@@ -155,9 +154,7 @@ const std::vector<std::string> EnumNames::names = {
   "LAPACK",
   "MKLDNN",
   "OPENCV",
-  "CAFFE",
   "DIST_KVSTORE",
-  "CXX14",
   "INT64_TENSOR_SIZE",
   "SIGNAL_HANDLER",
   "DEBUG",
diff --git a/tests/jenkins/run_test.sh b/tests/jenkins/run_test.sh
deleted file mode 100755
index 59516d4..0000000
--- a/tests/jenkins/run_test.sh
+++ /dev/null
@@ -1,56 +0,0 @@
-#!/bin/bash
-
-# 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.
-
-
-# Exit script with error if any errors occur
-
-echo "BUILD make"
-cp make/config.mk .
-echo "USE_CUDA=1" >> config.mk
-echo "USE_CUDA_PATH=/usr/local/cuda" >> config.mk
-echo "USE_CUDNN=1" >> config.mk
-echo "DEV=1" >> config.mk
-echo "EXTRA_OPERATORS=example/ssd/operator" >> config.mk
-echo "USE_CPP_PACKAGE=1" >> config.mk
-
-set -e
-
-make -j$(nproc) || exit -1
-
-echo "BUILD cpp_test"
-make -j$(nproc) test || exit -1
-export MXNET_ENGINE_INFO=true
-./build/tests/cpp/mxnet_test
-
-export MXNET_ENGINE_INFO=false
-export PYTHONPATH=$(pwd)/python
-
-echo "BUILD python_test"
-pytest --verbose tests/python/unittest || exit -1
-pytest --verbose tests/python/gpu/test_operator_gpu.py || exit -1
-pytest --verbose tests/python/train || exit -1
-
-echo "BUILD scala_test"
-export PATH=$PATH:/opt/apache-maven/bin
-cd scala-package
-mvn install || exit -1
-
-# echo "BUILD julia_test"
-# export MXNET_HOME="${PWD}"
-# /home/ubuntu/julia/bin/julia -e 'try Pkg.clone("MXNet"); catch end; Pkg.checkout("MXNet"); Pkg.build("MXNet"); Pkg.test("MXNet")' || exit -1
diff --git a/tests/jenkins/run_test_amzn_linux_gpu.sh b/tests/jenkins/run_test_amzn_linux_gpu.sh
deleted file mode 100755
index a257b96..0000000
--- a/tests/jenkins/run_test_amzn_linux_gpu.sh
+++ /dev/null
@@ -1,65 +0,0 @@
-#!/bin/bash
-
-# 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.
-
-
-# Exit script with error if any errors occur
-
-echo "BUILD make"
-cp make/config.mk .
-echo "USE_CUDA=0" >> config.mk
-echo "USE_CUDNN=0" >> config.mk
-echo "USE_BLAS=openblas" >> config.mk
-echo "USE_CPP_PACKAGE=1" >> config.mk
-echo "ADD_CFLAGS += -I/usr/include/openblas" >>config.mk
-echo "GTEST_PATH=/usr/local/gtest" >> config.mk
-echo 'export PKG_CONFIG_PATH=/usr/local/lib/pkgconfig:$PKG_CONFIG_PATH' >> ~/.profile
-echo 'export LD_LIBRARY_PATH=/usr/local/lib:$LD_LIBRARY_PATH' >> ~/.profile
-JAVA_HOME=`/usr/lib/jvm/java-1.8.0-openjdk-1.8.0.*.amzn1.x86_64[-1]`
-echo 'export JAVA_HOME=${JAVA_HOME}' >> ~/.profile
-echo 'export JRE_HOME=${JAVA_HOME}/jre' >> ~/.profile
-echo 'export PATH=$PATH:/apache-maven-3.3.9/bin/:/usr/bin:${JAVA_HOME}/bin' >> ~/.profile
-source ~/.profile
-user=`id -u -n`
-
-set -e
-
-make -j 4
-
-echo "BUILD cpp_test"
-make -j 4 test
-export MXNET_ENGINE_INFO=true
-./build/tests/cpp/mxnet_test
-
-echo "BUILD valgrind_test"
-valgrind ./build/tests/cpp/mxnet_test
-
-export MXNET_ENGINE_INFO=false
-export PYTHONPATH=${PWD}/python
-
-echo "BUILD python_test"
-pytest --verbose tests/python/unittest
-pytest --verbose tests/python/train
-
-#echo "BUILD julia_test"
-#export MXNET_HOME="${PWD}"
-#julia -e 'try Pkg.clone("MXNet"); catch end; Pkg.checkout("MXNet"); Pkg.build("MXNet"); Pkg.test("MXNet")' || exit -1
-
-echo "BUILD scala_test"
-cd scala-package
-mvn integration-test
diff --git a/tests/jenkins/run_test_ubuntu.sh b/tests/jenkins/run_test_ubuntu.sh
deleted file mode 100755
index 835bce9..0000000
--- a/tests/jenkins/run_test_ubuntu.sh
+++ /dev/null
@@ -1,65 +0,0 @@
-#!/bin/bash
-
-# 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.
-
-
-set -e
-
-echo "BUILD make"
-
-WITH_CAFFE_PLUGIN=0
-
-if [ "$WITH_CAFFE_PLUGIN" == "1" ]; then
-# Check out caffe
-  git clone https://github.com/BVLC/caffe
-  mkdir -p caffe/build
-  cd caffe/build
-  cmake ..
-  make -j$(nproc)
-  cd ../..
-fi
-
-cp make/config.mk .
-echo "USE_CUDA=1" >> config.mk
-echo "USE_CUDA_PATH=/usr/local/cuda" >> config.mk
-echo "USE_CUDNN=1" >> config.mk
-echo "DEV=1" >> config.mk
-echo "EXTRA_OPERATORS=example/ssd/operator" >> config.mk
-echo "USE_CPP_PACKAGE=1" >> config.mk
-
-if [ "$WITH_CAFFE_PLUGIN" == "1" ]; then
-    echo "CAFFE_PATH = $(pwd)/caffe" >> config.mk
-    echo "MXNET_PLUGINS += plugin/caffe/caffe.mk" >> config.mk
-fi
-
-user=`id -u -n`
-
-make -j$(nproc)
-
-export PYTHONPATH=${PWD}/python
-
-echo "BUILD python_test"
-pytest --verbose tests/python/unittest || exit 1
-pytest --verbose tests/python/gpu/test_operator_gpu.py || exit 1
-pytest --verbose tests/python/train || exit 1
-
-echo "BUILD scala_test"
-export PATH=$PATH:/opt/apache-maven/bin
-cd scala-package
-mvn integration-test || exit 1
-
diff --git a/tests/python/unittest/test_runtime.py b/tests/python/unittest/test_runtime.py
index d7017cf..f181155 100644
--- a/tests/python/unittest/test_runtime.py
+++ b/tests/python/unittest/test_runtime.py
@@ -26,7 +26,7 @@ def test_features():
     features = Features()
     print(features)
     assert 'CUDA' in features
-    assert len(features) >= 30
+    assert len(features) >= 20
 
 
 def test_is_singleton():