[1/2] Remove caffe2 db and distributed from build system (#125092)

This PR tries to decompose https://github.com/pytorch/pytorch/pull/122527 into a smaller one. Caffe2 db, distributed and some binaries have been removed.
To be noted, this was inspired and is co-dev with @r-barnes.

Pull Request resolved: https://github.com/pytorch/pytorch/pull/125092
Approved by: https://github.com/malfet
diff --git a/.ci/docker/common/install_base.sh b/.ci/docker/common/install_base.sh
index c2c3003..ebaa178 100755
--- a/.ci/docker/common/install_base.sh
+++ b/.ci/docker/common/install_base.sh
@@ -113,7 +113,6 @@
     glibc-devel \
     glibc-headers \
     glog-devel \
-    hiredis-devel \
     libstdc++-devel \
     libsndfile-devel \
     make \
diff --git a/.ci/docker/common/install_db.sh b/.ci/docker/common/install_db.sh
index 7e18947..7e72340 100755
--- a/.ci/docker/common/install_db.sh
+++ b/.ci/docker/common/install_db.sh
@@ -4,11 +4,6 @@
 
 install_ubuntu() {
   apt-get update
-  apt-get install -y --no-install-recommends \
-          libhiredis-dev \
-          libleveldb-dev \
-          liblmdb-dev \
-          libsnappy-dev
 
   # Cleanup
   apt-get autoclean && apt-get clean
@@ -20,12 +15,6 @@
   # See http://fedoraproject.org/wiki/EPEL
   yum --enablerepo=extras install -y epel-release
 
-  yum install -y \
-      hiredis-devel \
-      leveldb-devel \
-      lmdb-devel \
-      snappy-devel
-
   # Cleanup
   yum clean all
   rm -rf /var/cache/yum
diff --git a/BUILD.bazel b/BUILD.bazel
index ba07c91..a48f4b0 100644
--- a/BUILD.bazel
+++ b/BUILD.bazel
@@ -504,16 +504,6 @@
 )
 
 filegroup(
-    name = "caffe2_distributed_srcs",
-    srcs = [
-        "caffe2/distributed/file_store_handler.cc",
-        "caffe2/distributed/file_store_handler_op.cc",
-        "caffe2/distributed/store_handler.cc",
-        "caffe2/distributed/store_ops.cc",
-    ],
-)
-
-filegroup(
     name = "caffe2_ideep_srcs",
     srcs = [
         "caffe2/ideep/operators/adam_op.cc",
@@ -1011,8 +1001,6 @@
         "caffe2/core/common_cudnn.cc",
         "caffe2/core/common_gpu.cc",
         "caffe2/core/event_gpu.cc",
-        "caffe2/db/create_db_op_gpu.cc",
-        "caffe2/distributed/file_store_handler_op_gpu.cc",
         "caffe2/operators/communicator_op_gpu.cc",
         "caffe2/operators/concat_split_op_gpu.cc",
         "caffe2/operators/conv_op_cache_cudnn.cc",
@@ -1262,8 +1250,6 @@
             "caffe2/core/nomnigraph/include/nomnigraph/Support/*.h",
             "caffe2/core/nomnigraph/include/nomnigraph/Transformations/*.h",
             "caffe2/core/nomnigraph/tests/*.h",
-            "caffe2/db/*.h",
-            "caffe2/distributed/*.h",
             "caffe2/ideep/*.h",
             "caffe2/ideep/operators/*.h",
             "caffe2/ideep/operators/quantization/*.h",
@@ -1335,11 +1321,8 @@
 cc_library(
     name = "caffe2",
     srcs = [
-        "caffe2/db/create_db_op.cc",
-        "caffe2/db/protodb.cc",
         "caffe2/share/contrib/depthwise/depthwise3x3_conv_op.cc",
         ":caffe2_core_srcs",
-        ":caffe2_distributed_srcs",
         ":caffe2_ideep_srcs",
         ":caffe2_onnx_srcs",
         ":caffe2_operators_srcs",
diff --git a/CMakeLists.txt b/CMakeLists.txt
index 9ce1e06..d61f3a76 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -230,9 +230,7 @@
 option(USE_FAKELOWP "Use FakeLowp operators" OFF)
 option(USE_GFLAGS "Use GFLAGS" OFF)
 option(USE_GLOG "Use GLOG" OFF)
-option(USE_LEVELDB "Use LEVELDB" OFF)
 option(USE_LITE_PROTO "Use lite protobuf instead of full." OFF)
-option(USE_LMDB "Use LMDB" OFF)
 option(USE_MAGMA "Use MAGMA" ON)
 option(USE_METAL "Use Metal for Caffe2 iOS build" ON)
 option(USE_PYTORCH_METAL "Use Metal for PyTorch iOS build" OFF)
@@ -269,8 +267,6 @@
 option(USE_PROF "Use profiling" OFF)
 option(USE_QNNPACK "Use QNNPACK (quantized 8-bit operators)" ON)
 option(USE_PYTORCH_QNNPACK "Use ATen/QNNPACK (quantized 8-bit operators)" ON)
-option(USE_REDIS "Use Redis" OFF)
-option(USE_ROCKSDB "Use RocksDB" OFF)
 option(USE_SNPE "Use Qualcomm's SNPE library" OFF)
 option(USE_SYSTEM_EIGEN_INSTALL
     "Use system Eigen instead of the one under third_party" OFF)
@@ -292,7 +288,6 @@
 option(USE_VULKAN_RELAXED_PRECISION "Vulkan - Use relaxed precision math in the kernels (mediump)" OFF)
 # option USE_XNNPACK: try to enable xnnpack by default.
 option(USE_XNNPACK "Use XNNPACK" ON)
-option(USE_ZMQ "Use ZMQ" OFF)
 option(USE_ZSTD "Use ZSTD" OFF)
 option(USE_ROCM_KERNEL_ASSERT "Use Kernel Assert for ROCm" OFF)
 # Ensure that an ITT build is the default for x86 CPUs
diff --git a/binaries/CMakeLists.txt b/binaries/CMakeLists.txt
index 15f47bf..b728cd1 100644
--- a/binaries/CMakeLists.txt
+++ b/binaries/CMakeLists.txt
@@ -8,20 +8,6 @@
 endif()
 
 if(BUILD_CAFFE2)
-  caffe2_binary_target("convert_caffe_image_db.cc")
-  caffe2_binary_target("convert_db.cc")
-  caffe2_binary_target("make_cifar_db.cc")
-  caffe2_binary_target("make_mnist_db.cc")
-  caffe2_binary_target("predictor_verifier.cc")
-  caffe2_binary_target("speed_benchmark.cc")
-  caffe2_binary_target("split_db.cc")
-  caffe2_binary_target("print_registered_core_operators.cc")
-
-  if(USE_OBSERVERS)
-    caffe2_binary_target(caffe2_benchmark "caffe2_benchmark.cc" "benchmark_helper.cc")
-    target_include_directories(caffe2_benchmark PUBLIC ${CMAKE_CURRENT_SOURCE_DIR}/../modules)
-  endif()
-
   caffe2_binary_target("at_launch_benchmark.cc")
   target_include_directories(at_launch_benchmark PUBLIC
     ${CMAKE_BINARY_DIR}/aten/src)
@@ -29,12 +15,6 @@
   caffe2_binary_target("intra_inter_benchmark.cc")
   target_include_directories(intra_inter_benchmark PUBLIC
     ${CMAKE_BINARY_DIR}/aten/src)
-
-  caffe2_binary_target("run_plan.cc")
-  caffe2_binary_target("db_throughput.cc")
-
-  # ---[ tutorials
-  caffe2_binary_target("tutorial_blob.cc")
 endif()
 
 caffe2_binary_target("parallel_info.cc")
@@ -77,34 +57,11 @@
   endif()
 endif()
 
-if(USE_ZMQ)
-  caffe2_binary_target("zmq_feeder.cc")
-  target_link_libraries(zmq_feeder ${ZMQ_LIBRARIES})
-endif()
-
 if(USE_MPI)
   caffe2_binary_target("run_plan_mpi.cc")
   target_link_libraries(run_plan_mpi ${MPI_CXX_LIBRARIES})
 endif()
 
-if(USE_OPENCV AND USE_LEVELDB)
-  caffe2_binary_target("convert_encoded_to_raw_leveldb.cc")
-  target_link_libraries(
-      convert_encoded_to_raw_leveldb
-      ${OpenCV_LIBS} ${LevelDB_LIBRARIES} ${Snappy_LIBRARIES})
-endif()
-
-if(USE_OPENCV)
-  caffe2_binary_target("make_image_db.cc")
-  target_link_libraries(make_image_db ${OpenCV_LIBS})
-  caffe2_binary_target("convert_image_to_tensor.cc")
-  target_link_libraries(convert_image_to_tensor ${OpenCV_LIBS})
-endif()
-
-if(USE_OBSERVERS AND USE_OPENCV)
-  caffe2_binary_target("convert_and_benchmark.cc")
-  target_link_libraries(convert_and_benchmark ${OpenCV_LIBS})
-endif()
 
 caffe2_binary_target("dump_operator_names.cc")
 caffe2_binary_target("optimize_for_mobile.cc")
diff --git a/binaries/benchmark_helper.cc b/binaries/benchmark_helper.cc
deleted file mode 100644
index 117e118..0000000
--- a/binaries/benchmark_helper.cc
+++ /dev/null
@@ -1,523 +0,0 @@
-/**
- * Copyright (c) 2016-present, Facebook, Inc.
- *
- * Licensed 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.
- */
-
-#include <chrono>
-#include <fstream>
-#include <iostream>
-#include <string>
-#include <thread>
-#ifdef _WIN32
-#ifndef WIN32_LEAN_AND_MEAN
-#define WIN32_LEAN_AND_MEAN
-#endif
-#include <windows.h>
-#include <psapi.h>
-#endif
-
-#include <binaries/benchmark_helper.h>
-#include "caffe2/core/blob_serialization.h"
-#ifdef __CUDA_ARCH__
-#include "caffe2/core/context_gpu.h"
-#endif
-#include "caffe2/core/init.h"
-#include "caffe2/core/logging.h"
-#include "caffe2/core/net.h"
-#include "caffe2/core/operator.h"
-#include "caffe2/core/tensor_int8.h"
-#include "caffe2/utils/bench_utils.h"
-#include "caffe2/utils/string_utils.h"
-#include <observers/net_observer_reporter_print.h>
-#include <observers/observer_config.h>
-#include <observers/perf_observer.h>
-
-#if defined(TARGET_OS_MAC) || \
-defined(TARGET_OS_IPHONE) || \
-defined(TARGET_IPHONE_SIMULATOR)
-#include <malloc/malloc.h>
-#else
-#include <malloc.h>
-#endif
-
-
-void observerConfig() {
-  caffe2::ClearGlobalNetObservers();
-  caffe2::AddGlobalNetObserverCreator([](caffe2::NetBase* subject) {
-    return std::make_unique<caffe2::PerfNetObserver>(subject);
-  });
-  caffe2::ObserverConfig::setReporter(
-      std::make_unique<caffe2::NetObserverReporterPrint>());
-}
-
-bool backendCudaSet(const string& backend) {
-  bool run_on_gpu = false;
-  if (backend == "cuda") {
-#ifdef __CUDA_ARCH__
-    if (caffe2::HasCudaGPU()) {
-      run_on_gpu = true;
-    } else {
-      CAFFE_THROW("NO GPU support on this host machine");
-    }
-#else
-    CAFFE_THROW("NO GPU support");
-#endif
-  }
-  return run_on_gpu;
-}
-
-void setDeviceType(caffe2::NetDef* net_def, caffe2::DeviceType& run_dev) {
-  for (int j = 0; j < net_def->op_size(); j++) {
-    caffe2::OperatorDef* op = net_def->mutable_op(j);
-    op->mutable_device_option()->set_device_type(caffe2::TypeToProto(run_dev));
-  }
-}
-
-void setOperatorEngine(caffe2::NetDef* net_def, const string& backend) {
-  if (backend != "builtin") {
-    string engine = backend == "nnpack"
-        ? "NNPACK"
-        : backend == "eigen" ? "EIGEN"
-                             : backend == "mkl" ? "MKLDNN"
-                                                : backend == "cuda"
-                    ? "CUDA"
-                    : backend == "dnnlowp" ? "DNNLOWP"
-                                           : backend == "dnnlowp_acc16"
-                            ? "DNNLOWP_ACC16"
-                            : backend == "default" ? "" : "NONE";
-    CAFFE_ENFORCE(engine != "NONE", "Backend is not supported");
-    for (int i = 0; i < net_def->op_size(); i++) {
-      caffe2::OperatorDef* op_def = net_def->mutable_op(i);
-      op_def->set_engine(engine);
-    }
-  }
-}
-
-int loadInput(
-    shared_ptr<caffe2::Workspace> workspace,
-    const bool run_on_gpu,
-    map<string, caffe2::TensorProtos>& tensor_protos_map,
-    const string& input,
-    const string& input_file,
-    const string& input_dims,
-    const string& input_type) {
-  // How many input blobs are in the inputs
-  int blob_num = 1;
-  // Load input.
-  if (input.size()) {
-    vector<string> input_names = caffe2::split(',', input);
-    if (input_file.size()) {
-      vector<string> input_files = caffe2::split(',', input_file);
-      CAFFE_ENFORCE_EQ(
-          input_names.size(),
-          input_files.size(),
-          "Input name and file should have the same number.");
-      for (int i = 0; i < input_names.size(); ++i) {
-        caffe2::TensorProtos tensor_protos;
-        CAFFE_ENFORCE(
-            caffe2::ReadProtoFromFile(input_files[i], &tensor_protos));
-        workspace->CreateBlob(input_names[i]);
-        tensor_protos_map.insert(std::make_pair(input_names[i], tensor_protos));
-      }
-      // Check that all blobs have the same number of entries
-      blob_num = tensor_protos_map[input_names[0]].protos_size();
-      for (int i = 1; i < input_names.size(); ++i) {
-        int bnum = tensor_protos_map[input_names[i]].protos_size();
-        CAFFE_ENFORCE_EQ(
-            blob_num,
-            bnum,
-            "Number of blobs are not the same for all inputs");
-      }
-    } else if (input_dims.size() || input_type.size()) {
-      CAFFE_ENFORCE_GE(
-          input_dims.size(),
-          0,
-          "Input dims must be specified when input tensors are used.");
-      CAFFE_ENFORCE_GE(
-          input_type.size(),
-          0,
-          "Input type must be specified when input tensors are used.");
-
-      vector<string> input_dims_list = caffe2::split(';', input_dims);
-      CAFFE_ENFORCE_EQ(
-          input_names.size(),
-          input_dims_list.size(),
-          "Input name and dims should have the same number of items.");
-      vector<string> input_type_list = caffe2::split(';', input_type);
-      CAFFE_ENFORCE_EQ(
-          input_names.size(),
-          input_type_list.size(),
-          "Input name and type should have the same number of items.");
-      for (size_t i = 0; i < input_names.size(); ++i) {
-        vector<string> input_dims_str = caffe2::split(',', input_dims_list[i]);
-        vector<int> input_dims;
-        for (const string& s : input_dims_str) {
-          input_dims.push_back(std::stoi(s));
-        }
-        caffe2::Blob* blob = workspace->GetBlob(input_names[i]);
-        if (blob == nullptr) {
-          blob = workspace->CreateBlob(input_names[i]);
-        }
-        if (run_on_gpu) {
-          LOG(INFO) << "Running on GPU.";
-#ifdef __CUDA_ARCH__
-          caffe2::TensorCUDA* tensor = blob->GetMutable<caffe2::TensorCUDA>();
-          TORCH_CHECK_NOTNULL(tensor);
-          tensor->Resize(input_dims);
-          if (input_type_list[i] == "uint8_t") {
-            tensor->mutable_data<uint8_t>();
-          } else if (input_type_list[i] == "float") {
-            tensor->mutable_data<float>();
-          } else {
-            CAFFE_THROW("Unsupported input type: ", input_type_list[i]);
-          }
-#else
-          CAFFE_THROW("Not support GPU on mobile.");
-#endif
-        } else {
-          if (input_type_list[i] == "uint8_t") {
-            caffe2::int8::Int8TensorCPU* tensor =
-                blob->GetMutable<caffe2::int8::Int8TensorCPU>();
-            TORCH_CHECK_NOTNULL(tensor);
-            tensor->t.Resize(input_dims);
-            tensor->t.mutable_data<uint8_t>();
-          } else if (input_type_list[i] == "float") {
-            caffe2::TensorCPU* tensor = BlobGetMutableTensor(blob, caffe2::CPU);
-            TORCH_CHECK_NOTNULL(tensor);
-            tensor->Resize(input_dims);
-            tensor->mutable_data<float>();
-          } else if (input_type_list[i] == "int") {
-            caffe2::TensorCPU* tensor = BlobGetMutableTensor(blob, caffe2::CPU);
-            TORCH_CHECK_NOTNULL(tensor);
-            tensor->Resize(input_dims);
-            tensor->mutable_data<int>();
-          } else {
-            CAFFE_THROW("Unsupported input type: ", input_type_list[i]);
-          }
-        }
-      }
-    } else {
-      CAFFE_THROW(
-          "You requested input tensors, but neither input_file nor "
-          "input_dims is set.");
-    }
-  }
-  return blob_num;
-}
-
-void fillInputBlob(
-    shared_ptr<caffe2::Workspace> workspace,
-    map<string, caffe2::TensorProtos>& tensor_protos_map,
-    int iteration) {
-  if (tensor_protos_map.empty()) {
-    return;
-  }
-  static caffe2::TensorDeserializer deserializer;
-  for (auto& tensor_kv : tensor_protos_map) {
-    caffe2::Blob* blob = workspace->GetBlob(tensor_kv.first);
-    if (blob == nullptr) {
-      blob = workspace->CreateBlob(tensor_kv.first);
-    }
-    // todo: support gpu and make this function a template
-    int protos_size = tensor_kv.second.protos_size();
-    if (protos_size == 1 && iteration > 0) {
-      // Do not override the input data if there is only one input data,
-      // since it will clear all caches. Rely on wipe_cache to
-      // clear caches
-      continue;
-    }
-    caffe2::TensorProto* tensor_proto =
-        tensor_kv.second.mutable_protos(iteration % protos_size);
-    BlobSetTensor(blob, deserializer.Deserialize(*tensor_proto));
-    // todo: for other types
-  }
-}
-
-void runNetwork(
-    shared_ptr<caffe2::Workspace> workspace,
-    caffe2::NetBase* net,
-    map<string, caffe2::TensorProtos>& tensor_protos_map,
-    const bool wipe_cache,
-    const bool run_individual,
-    const bool run_on_gpu,
-    const bool text_output,
-    const int warmup,
-    const int iter,
-    const int num_blobs,
-    const int sleep_before_run,
-    const int sleep_between_iteration,
-    const int sleep_between_net_and_operator,
-    const std::string& output,
-    const std::string& output_folder) {
-
-  LOG(INFO) << "Starting benchmark.";
-  caffe2::ObserverConfig::initSampleRate(1, 1, 1, run_individual, warmup);
-  LOG(INFO) << "Running warmup runs.";
-  for (int i = 0; i < warmup; ++i) {
-    fillInputBlob(workspace, tensor_protos_map, i);
-    CAFFE_ENFORCE(net->Run(), "Warmup run ", i, " has failed.");
-  }
-
-  if (wipe_cache) {
-    caffe2::wipe_cache();
-  }
-  if (sleep_before_run > 0) {
-    std::this_thread::sleep_for(std::chrono::seconds(sleep_before_run));
-  }
-  LOG(INFO) << "Main runs.";
-  CAFFE_ENFORCE(
-      iter >= 0,
-      "Number of main runs should be non negative, provided ",
-      iter,
-      ".");
-  LOG(INFO) << "net runs.";
-  long long duration_sum = 0;
-  for (int i = 0; i < iter; ++i) {
-    caffe2::ObserverConfig::initSampleRate(1, 1, 1, 0, warmup);
-    fillInputBlob(workspace, tensor_protos_map, i);
-    if (wipe_cache) {
-      caffe2::wipe_cache();
-    }
-    auto start = std::chrono::high_resolution_clock::now();
-    CAFFE_ENFORCE(net->Run(), "Main run ", i, " has failed.");
-    auto stop = std::chrono::high_resolution_clock::now();
-    auto duration = std::chrono::duration_cast<std::chrono::microseconds>(stop - start);
-    duration_sum += duration.count();
-    // Write the output for the first num_blobs times
-    writeOutput(
-        workspace,
-        run_on_gpu,
-        output,
-        output_folder,
-        text_output,
-        i,
-        num_blobs);
-    if (wipe_cache) {
-      caffe2::wipe_cache();
-    }
-    if (sleep_between_iteration > 0) {
-      std::this_thread::sleep_for(
-          std::chrono::seconds(sleep_between_iteration));
-    }
-  }
-  std::cout << "Average Duration: " << (duration_sum/iter) << " us" << std::endl;
-  if (run_individual) {
-    LOG(INFO) << "operator runs.";
-    if (sleep_between_net_and_operator > 0) {
-      std::this_thread::sleep_for(
-          std::chrono::seconds(sleep_between_net_and_operator));
-    }
-    for (int i = 0; i < iter; ++i) {
-      caffe2::ObserverConfig::initSampleRate(1, 1, 1, 1, warmup);
-      fillInputBlob(workspace, tensor_protos_map, i);
-      CAFFE_ENFORCE(net->Run(), "Main run ", i, " with operator has failed.");
-      if (wipe_cache) {
-        caffe2::wipe_cache();
-      }
-      if (sleep_between_iteration > 0) {
-        std::this_thread::sleep_for(
-            std::chrono::seconds(sleep_between_iteration));
-      }
-    }
-  }
-}
-
-void writeOutput(
-    shared_ptr<caffe2::Workspace> workspace,
-    const bool run_on_gpu,
-    const string& output,
-    const string& output_folder,
-    const bool text_output,
-    const int index,
-    const int num_blobs) {
-  if (output.size() == 0) {
-    return;
-  }
-  string output_prefix = output_folder.size() ? output_folder + "/" : "";
-  vector<string> output_names = caffe2::split(',', output);
-  if (output == "*") {
-    output_names = workspace->Blobs();
-  }
-  for (const string& name : output_names) {
-    CAFFE_ENFORCE(
-        workspace->HasBlob(name),
-        "You requested a non-existing blob: ",
-        name);
-    if (text_output) {
-      if (run_on_gpu) {
-#ifdef __CUDA_ARCH__
-        writeTextOutput<caffe2::CUDAContext, caffe2::TensorCUDA>(
-            workspace->GetBlob(name)->GetMutable<caffe2::TensorCUDA>(),
-            output_prefix,
-            name,
-            index,
-            num_blobs);
-#else
-        CAFFE_THROW("Not support GPU.");
-#endif
-      } else {
-        writeTextOutput<caffe2::CPUContext, caffe2::TensorCPU>(
-            BlobGetMutableTensor(workspace->GetBlob(name), caffe2::CPU),
-            output_prefix,
-            name,
-            index,
-            num_blobs);
-      }
-    } else {
-      // Do not support multiple entries per blob.
-      CAFFE_ENFORCE(
-          index == 0,
-          "Binary file only support one output.");
-      string serialized = SerializeBlob(*workspace->GetBlob(name), name);
-      string output_filename = output_prefix + name;
-      caffe2::WriteStringToFile(serialized, output_filename.c_str());
-    }
-  }
-}
-
-void logBenchmarkResult(
-    const std::string& type,
-    const std::string& metric,
-    const std::string& unit,
-    const int value) {
-  LOG(INFO) << caffe2::NetObserverReporterPrint::IDENTIFIER << "{"
-            << "\"type\": \"" << type << "\", "
-            << "\"metric\": \"" << metric << "\", "
-            << "\"unit\": \"" << unit << "\", "
-            << "\"value\": " << c10::to_string(value) << "}\n";
-}
-
-long getVirtualMemoryIfOptionEnabled(bool FLAGS_measure_memory) {
-  if (FLAGS_measure_memory) {
-#if defined(TARGET_OS_IPHONE) || \
-defined(TARGET_OS_MAC) || \
-defined(TARGET_IPHONE_SIMULATOR)
-    malloc_statistics_t stats = {0};
-    malloc_zone_statistics(nullptr, &stats);
-    return stats.size_allocated;
-#elif defined(_WIN32)
-    PROCESS_MEMORY_COUNTERS_EX pmc;
-    GetProcessMemoryInfo(
-        GetCurrentProcess(), (PROCESS_MEMORY_COUNTERS*)&pmc, sizeof(pmc));
-    return pmc.PrivateUsage;
-#else
-    struct mallinfo info = mallinfo();
-    return info.uordblks;
-#endif
-  }
-
-  return 0;
-}
-
-int benchmark(
-    int argc,
-    char* argv[],
-    const string& FLAGS_backend,
-    const string& FLAGS_init_net,
-    const string& FLAGS_input,
-    const string& FLAGS_input_dims,
-    const string& FLAGS_input_file,
-    const string& FLAGS_input_type,
-    int FLAGS_iter,
-    bool FLAGS_measure_memory,
-    const string& FLAGS_net,
-    const string& FLAGS_output,
-    const string& FLAGS_output_folder,
-    bool FLAGS_run_individual,
-    int FLAGS_sleep_before_run,
-    int FLAGS_sleep_between_iteration,
-    int FLAGS_sleep_between_net_and_operator,
-    bool FLAGS_text_output,
-    int FLAGS_warmup,
-    bool FLAGS_wipe_cache) {
-  // Check arguments to be correct
-  {
-    // Need to check whether file exists, as the file reader does not assert if
-    // file does not exist
-    std::ifstream net_file(FLAGS_net);
-    CAFFE_ENFORCE(net_file.good());
-    net_file.close();
-
-    std::ifstream init_net_file(FLAGS_init_net);
-    CAFFE_ENFORCE(init_net_file.good());
-    init_net_file.close();
-
-    if (FLAGS_input_file.size() > 0) {
-      vector<string> input_files = caffe2::split(',', FLAGS_input_file);
-      for (auto input_file : input_files) {
-        std::ifstream ifile(input_file);
-        CAFFE_ENFORCE(ifile.good());
-        ifile.close();
-      }
-    }
-  }
-
-  observerConfig();
-  caffe2::ShowLogInfoToStderr();
-
-  auto workspace = std::make_shared<caffe2::Workspace>(new caffe2::Workspace());
-  bool run_on_gpu = backendCudaSet(FLAGS_backend);
-  // Run initialization network, measure resources used.
-  long init_vmem = getVirtualMemoryIfOptionEnabled(FLAGS_measure_memory);
-  caffe2::NetDef init_net_def;
-  CAFFE_ENFORCE(ReadProtoFromFile(FLAGS_init_net, &init_net_def));
-  setOperatorEngine(&init_net_def, FLAGS_backend);
-  CAFFE_ENFORCE(workspace->RunNetOnce(init_net_def));
-  init_vmem = getVirtualMemoryIfOptionEnabled(FLAGS_measure_memory) - init_vmem;
-
-  map<string, caffe2::TensorProtos> tensor_protos_map;
-  int num_blobs = loadInput(
-      workspace,
-      run_on_gpu,
-      tensor_protos_map,
-      FLAGS_input,
-      FLAGS_input_file,
-      FLAGS_input_dims,
-      FLAGS_input_type);
-
-  // Run main network.
-  long predict_vmem = getVirtualMemoryIfOptionEnabled(FLAGS_measure_memory);
-  caffe2::NetDef net_def;
-  CAFFE_ENFORCE(ReadProtoFromFile(FLAGS_net, &net_def));
-  setOperatorEngine(&net_def, FLAGS_backend);
-  if (!net_def.has_name()) {
-    net_def.set_name("benchmark");
-  }
-  caffe2::NetBase* net = workspace->CreateNet(net_def);
-  TORCH_CHECK_NOTNULL(net);
-  runNetwork(
-      workspace,
-      net,
-      tensor_protos_map,
-      FLAGS_wipe_cache,
-      FLAGS_run_individual,
-      run_on_gpu,
-      FLAGS_text_output,
-      FLAGS_warmup,
-      FLAGS_iter,
-      num_blobs,
-      FLAGS_sleep_before_run,
-      FLAGS_sleep_between_iteration,
-      FLAGS_sleep_between_net_and_operator,
-      FLAGS_output,
-      FLAGS_output_folder);
-  predict_vmem = getVirtualMemoryIfOptionEnabled(
-      FLAGS_measure_memory) - predict_vmem;
-  if (FLAGS_measure_memory) {
-    logBenchmarkResult(
-        "NET_", "memory", "kB", (init_vmem + predict_vmem) / 1024);
-  }
-
-  return 0;
-}
diff --git a/binaries/benchmark_helper.h b/binaries/benchmark_helper.h
deleted file mode 100644
index bd48be7..0000000
--- a/binaries/benchmark_helper.h
+++ /dev/null
@@ -1,169 +0,0 @@
-/**
- * Copyright (c) 2016-present, Facebook, Inc.
- *
- * Licensed 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.
- */
-#pragma once
-
-#include <string>
-
-#include "caffe2/core/blob_serialization.h"
-#include "caffe2/core/init.h"
-#include "caffe2/core/logging.h"
-#include "caffe2/core/net.h"
-#include "caffe2/core/operator.h"
-#include "caffe2/utils/string_utils.h"
-#include "c10/util/string_utils.h"
-#include <c10/util/irange.h>
-
-using std::map;
-using std::shared_ptr;
-using std::string;
-using std::vector;
-
-template <typename ContextType, typename TensorType>
-void writeTextOutput(
-    TensorType* tensor,
-    const string& output_prefix,
-    const string& name,
-    int index,
-    int num_blobs) {
-  if (index >= num_blobs) {
-    return;
-  }
-  string filename = name;
-  std::replace(filename.begin(), filename.end(), '/', '_');
-  string output_name = output_prefix + "/" + filename + ".txt";
-  caffe2::TensorSerializer ser;
-  caffe2::BlobProto blob_proto;
-
-  ser.Serialize(
-      *tensor, output_name, blob_proto.mutable_tensor(), 0, tensor->numel());
-  blob_proto.set_name(output_name);
-  blob_proto.set_type("Tensor");
-  CAFFE_ENFORCE(blob_proto.has_tensor());
-  caffe2::TensorProto tensor_proto = blob_proto.tensor();
-  int dims_size = tensor_proto.dims_size();
-  long long elem_dim_size =
-      dims_size > 1 ? tensor_proto.dims(1) : tensor_proto.dims(0);
-  for (const auto i : c10::irange(2, dims_size)) {
-    elem_dim_size *= tensor_proto.dims(i);
-  }
-  std::vector<std::string> lines;
-  std::string dims;
-  for (const auto i : c10::irange(dims_size)) {
-    int dim = tensor_proto.dims(i);
-    if (i > 0) {
-      dims += ", ";
-    }
-    dims += c10::to_string(dim);
-  }
-  lines.push_back(dims);
-  std::stringstream line;
-  if (tensor_proto.data_type() == caffe2::TensorProto::FLOAT) {
-    auto start = tensor_proto.float_data().begin();
-    auto end = tensor_proto.float_data().end();
-    copy(start, end, std::ostream_iterator<float>(line, ","));
-  } else if (tensor_proto.data_type() == caffe2::TensorProto::INT32) {
-    auto start = tensor_proto.int32_data().begin();
-    auto end = tensor_proto.int32_data().end();
-    copy(start, end, std::ostream_iterator<int>(line, ","));
-  } else {
-    CAFFE_THROW("Unimplemented Blob type.");
-  }
-  // remove the last ,
-  string str = line.str();
-  if(str.length() != 0) {
-    str.pop_back();
-  }
-  lines.push_back(str);
-
-  // static casts are workaround for MSVC build
-  auto flags = static_cast<std::ios_base::openmode>(std::ios::out);
-  if (index != 0) {
-    flags |= static_cast<std::ios_base::openmode>(std::ios::app);
-  } else {
-    flags |= static_cast<std::ios_base::openmode>(std::ios::trunc);
-  }
-  std::ofstream output_file(output_name, flags);
-  std::ostream_iterator<std::string> output_iterator(output_file, "\n");
-  std::copy(lines.begin(), lines.end(), output_iterator);
-}
-
-void observerConfig();
-bool backendCudaSet(const string&);
-void setDeviceType(caffe2::NetDef*, caffe2::DeviceType&);
-void setOperatorEngine(caffe2::NetDef*, const string&);
-int loadInput(
-    shared_ptr<caffe2::Workspace> workspace,
-    const bool run_on_gpu,
-    map<string, caffe2::TensorProtos>& tensor_protos_map,
-    const string& input,
-    const string& input_file,
-    const string& input_dims,
-    const string& input_type);
-void fillInputBlob(
-    shared_ptr<caffe2::Workspace> workspace,
-    map<string, caffe2::TensorProtos>& tensor_protos_map,
-    int iteration);
-void writeOutput(
-    shared_ptr<caffe2::Workspace> workspace,
-    const bool run_on_gpu,
-    const string& output,
-    const string& output_folder,
-    const bool text_output,
-    const int index,
-    const int num_blobs);
-void logBenchmarkResult(
-    const std::string& type,
-    const std::string& metric,
-    const std::string& unit,
-    const int value);
-long getVirtualMemoryIfOptionEnabled(bool FLAGS_measure_memory);
-void runNetwork(
-    shared_ptr<caffe2::Workspace> workspace,
-    caffe2::NetBase* net,
-    map<string, caffe2::TensorProtos>& tensor_protos_map,
-    const bool wipe_cache,
-    const bool run_individual,
-    const bool run_on_gpu,
-    const bool text_output,
-    const int warmup,
-    const int iter,
-    const int num_blobs,
-    const int sleep_before_run,
-    const int sleep_between_iteration,
-    const int sleep_between_net_and_operator,
-    const std::string& output,
-    const std::string& output_folder);
-int benchmark(
-    int argc,
-    char* argv[],
-    const string& FLAGS_backend,
-    const string& FLAGS_init_net,
-    const string& FLAGS_input,
-    const string& FLAGS_input_dims,
-    const string& FLAGS_input_file,
-    const string& FLAGS_input_type,
-    int FLAGS_iter,
-    bool FLAGS_measure_memory,
-    const string& FLAGS_net,
-    const string& FLAGS_output,
-    const string& FLAGS_output_folder,
-    bool FLAGS_run_individual,
-    int FLAGS_sleep_before_run,
-    int FLAGS_sleep_between_iteration,
-    int FLAGS_sleep_between_net_and_operator,
-    bool FLAGS_text_output,
-    int FLAGS_warmup,
-    bool FLAGS_wipe_cache);
diff --git a/binaries/caffe2_benchmark.cc b/binaries/caffe2_benchmark.cc
deleted file mode 100644
index 65eb7b7..0000000
--- a/binaries/caffe2_benchmark.cc
+++ /dev/null
@@ -1,32 +0,0 @@
-#include <fstream>
-#include <iterator>
-#include <string>
-
-#include "binaries/benchmark_args.h"
-#include "binaries/benchmark_helper.h"
-
-
-int main(int argc, char** argv) {
-  caffe2::GlobalInit(&argc, &argv);
-  benchmark(
-      argc,
-      argv,
-      FLAGS_backend,
-      FLAGS_init_net,
-      FLAGS_input,
-      FLAGS_input_dims,
-      FLAGS_input_file,
-      FLAGS_input_type,
-      FLAGS_iter,
-      FLAGS_measure_memory,
-      FLAGS_net,
-      FLAGS_output,
-      FLAGS_output_folder,
-      FLAGS_run_individual,
-      FLAGS_sleep_before_run,
-      FLAGS_sleep_between_iteration,
-      FLAGS_sleep_between_net_and_operator,
-      FLAGS_text_output,
-      FLAGS_warmup,
-      FLAGS_wipe_cache);
-}
diff --git a/binaries/convert_and_benchmark.cc b/binaries/convert_and_benchmark.cc
deleted file mode 100644
index ceb029c..0000000
--- a/binaries/convert_and_benchmark.cc
+++ /dev/null
@@ -1,770 +0,0 @@
-/**
- * Copyright (c) 2016-present, Facebook, Inc.
- *
- * Licensed 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.
- */
-
-#include <opencv2/opencv.hpp>
-#include <cmath>
-#include <fstream>
-
-#include "caffe2/core/common.h"
-#include "caffe2/core/db.h"
-#include "caffe2/core/init.h"
-#include "caffe2/core/logging.h"
-#include "caffe2/core/timer.h"
-#include "caffe2/proto/caffe2_pb.h"
-#include "caffe2/utils/proto_utils.h"
-#include "caffe2/utils/string_utils.h"
-#include "caffe2/utils/bench_utils.h"
-
-#include "binaries/benchmark_args.h"
-#include "binaries/benchmark_helper.h"
-
-#include <observers/net_observer_reporter_print.h>
-#include <observers/observer_config.h>
-#include <observers/perf_observer.h>
-
-
-C10_DEFINE_int(
-    batch_size,
-    -1,
-    "Specify the batch size of the input. The number of items in the "
-    "input needs to be multiples of the batch size. If the batch size "
-    "is less than 0, all inputs are in one batch.")
-C10_DEFINE_bool(color, true, "If set, load images in color.");
-C10_DEFINE_string(
-    crop,
-    "-1,-1",
-    "The center cropped hight and width. If the value is less than zero, "
-    "it is not cropped.");
-C10_DEFINE_string(input_image_files, "", "Files containing imput images");
-C10_DEFINE_string(input_text_files, "", "Text files to be written to blobs");
-C10_DEFINE_string(
-    preprocess,
-    "",
-    "Options to specify the preprocess routines. The available options are "
-    "subtract128, normalize, mean, std, bgrtorgb. If multiple steps are provided, they "
-    "are separated by comma (,) in sequence.");
-C10_DEFINE_string(
-    report_time,
-    "",
-    "Report the conversion stage time to screen. "
-    "The format of the string is <type>|<identifier>. "
-    "The valid type is 'json'. "
-    "The valid identifier is nothing or an identifier that prefix every line");
-C10_DEFINE_string(
-    scale,
-    "-1,-1",
-    "Scale the images to be within the min,max box. The shorter edge is "
-    "min pixels. But if the other edge is more than the max pixels, the "
-    "other edge and scaled to max pixels (and the shorter edge can be less "
-    "than the min pixels");
-C10_DEFINE_bool(warp, false, "If warp is set, warp the images to square.");
-
-namespace caffe2 {
-
-void reportTime(
-    std::string type,
-    double ts,
-    std::string metric,
-    std::string unit) {
-  if (FLAGS_report_time == "") {
-    return;
-  }
-  vector<string> s = caffe2::split('|', FLAGS_report_time);
-  assert(s[0] == "json");
-  std::string identifier = "";
-  if (s.size() > 1) {
-    identifier = s[1];
-  }
-  std::cout << identifier << "{\"type\": \"" << type << "\", \"value\": " << ts
-            << ", \"metric\": \"" << metric << "\", \"unit\": \"" << unit
-            << "\"}" << std::endl;
-}
-
-void splitSizes(const std::string& arg, int* ptr0, int* ptr1) {
-  vector<string> sizes = caffe2::split(',', arg);
-  if (sizes.size() == 2) {
-    *ptr0 = std::stoi(sizes[0]);
-    *ptr1 = std::stoi(sizes[1]);
-  } else if (sizes.size() == 1) {
-    *ptr0 = std::stoi(sizes[0]);
-    *ptr1 = std::stoi(sizes[0]);
-  } else {
-    assert(false);
-  }
-}
-
-
-cv::Mat resizeImage(cv::Mat& img) {
-  int min_size, max_size;
-  splitSizes(FLAGS_scale, &min_size, &max_size);
-  if ((min_size <= 0) && (max_size <= 0)) {
-    return img;
-  }
-  if (max_size < 0) {
-    max_size = INT_MAX;
-  }
-  assert(min_size <= max_size);
-
-  int im_min_size = img.rows > img.cols ? img.cols : img.rows;
-  int im_max_size = img.rows > img.cols ? img.rows : img.cols;
-
-  double im_scale = 1.0 * min_size / im_min_size;
-  if (im_scale * im_max_size > max_size) {
-    im_scale = 1.0 * max_size / im_max_size;
-  }
-  int scaled_width = int(round(img.cols * im_scale));
-  int scaled_height = int(round(img.rows * im_scale));
-  assert((scaled_width <= max_size) && (scaled_height <= max_size));
-  if ((scaled_width < min_size) || (scaled_height < min_size)) {
-    assert((scaled_width == max_size) || (scaled_height == max_size));
-  } else {
-    assert((scaled_width == min_size) || (scaled_height == min_size));
-  }
-  cv::Mat resized_img;
-  cv::resize(
-      img,
-      resized_img,
-      cv::Size(),
-      im_scale,
-      im_scale,
-      cv::INTER_LINEAR);
-  return resized_img;
-}
-
-cv::Mat cropToRec(cv::Mat& img, int* height_ptr, int* width_ptr) {
-  int height = *height_ptr;
-  int width = *width_ptr;
-  if ((height > 0) && (width > 0) &&
-      ((img.rows != height) || (img.cols != width))) {
-    cv::Mat cropped_img, cimg;
-    cv::Rect roi;
-    roi.x = int((img.cols - width) / 2);
-    roi.y = int((img.rows - height) / 2);
-    roi.x = roi.x < 0 ? 0 : roi.x;
-    roi.y = roi.y < 0 ? 0 : roi.y;
-    width = width > img.cols ? img.cols : width;
-    height = height > img.rows ? img.rows : height;
-    roi.width = width;
-    roi.height = height;
-    assert(
-        0 <= roi.x && 0 <= roi.width && roi.x + roi.width <= img.cols &&
-        0 <= roi.y && 0 <= roi.height && roi.y + roi.height <= img.rows);
-    cropped_img = img(roi);
-    // Make the image in continuous space in memory
-    cimg = cropped_img.clone();
-    *height_ptr = height;
-    *width_ptr = width;
-    return cimg;
-  } else {
-    return img;
-  }
-}
-
-std::vector<float> convertToVector(cv::Mat& img) {
-  std::vector<float> normalize(3, 1);
-  std::vector<float> mean(3, 0);
-  std::vector<float> std(3, 1);
-  bool bgrtorgb = false;
-  int size = img.cols * img.rows;
-  vector<string> steps = caffe2::split(',', FLAGS_preprocess);
-  for (int i = 0; i < steps.size(); i++) {
-    auto step = steps[i];
-    if (step == "subtract128") {
-      mean = {128, 128, 128};
-      std = {1, 1, 1};
-      normalize = {1, 1, 1};
-    } else if (step == "normalize") {
-      normalize = {255, 255, 255};
-    } else if (step == "mean") {
-      mean = {0.406f, 0.456f, 0.485f};
-    } else if (step == "std") {
-      std = {0.225f, 0.224f, 0.229f};
-    } else if (step == "bgrtorgb") {
-      bgrtorgb = true;
-    } else {
-      CAFFE_ENFORCE(
-          false,
-          "Unsupported preprocess step. The supported steps are: subtract128, "
-          "normalize,mean, std, swaprb.");
-    }
-  }
-
-  int C = FLAGS_color ? 3 : 1;
-  int total_size = C * size;
-  std::vector<float> values(total_size);
-  if (C == 1) {
-    cv::MatIterator_<float> it, end;
-    int idx = 0;
-    for (it = img.begin<float>(), end = img.end<float>(); it != end; ++it) {
-      values[idx++] = (*it / normalize[0] - mean[0]) / std[0];
-    }
-  } else {
-    int i = 0;
-    cv::MatIterator_<cv::Vec3f> it, end;
-    int b = bgrtorgb ? 2 : 0;
-    int g = 1;
-    int r = bgrtorgb ? 0 : 2;
-    for (it = img.begin<cv::Vec3f>(), end = img.end<cv::Vec3f>(); it != end;
-         ++it, i++) {
-      values[i] = (((*it)[b] / normalize[0] - mean[0]) / std[0]);
-      int offset = size + i;
-      values[offset] = (((*it)[g] / normalize[1] - mean[1]) / std[1]);
-      offset = size + offset;
-      values[offset] = (((*it)[r] / normalize[2] - mean[2]) / std[2]);
-    }
-  }
-  return values;
-}
-
-std::vector<float> convertOneImage(
-    std::string& filename,
-    int* height_ptr,
-    int* width_ptr) {
-  assert(filename[0] != '~');
-
-  std::cout << "Converting " << filename << std::endl;
-
-  // Load image
-  cv::Mat img_uint8 = cv::imread(
-#if CV_MAJOR_VERSION <= 3
-      filename, FLAGS_color ? CV_LOAD_IMAGE_COLOR : CV_LOAD_IMAGE_GRAYSCALE);
-#else
-      filename, FLAGS_color ? cv::IMREAD_COLOR : cv::IMREAD_GRAYSCALE);
-#endif
-  caffe2::Timer timer;
-  timer.Start();
-  cv::Mat img;
-  // Convert image to floating point values
-  img_uint8.convertTo(img, CV_32F);
-  // Resize image
-  cv::Mat resized_img = resizeImage(img);
-
-  int height, width;
-  splitSizes(FLAGS_crop, &height, &width);
-  if ((height <= 0) || (width <= 0)) {
-    height = resized_img.rows;
-    width = resized_img.cols;
-  }
-  cv::Mat crop = cropToRec(resized_img, &height, &width);
-
-  // Assert we don't have to deal with alignment
-  DCHECK(crop.isContinuous());
-  assert(crop.rows == height);
-  assert(crop.cols == width);
-  std::vector<float> one_image_values = convertToVector(crop);
-  *height_ptr = height;
-  *width_ptr = width;
-  double ts = timer.MicroSeconds();
-  reportTime("image_preprocess", ts, "convert", "us");
-  return one_image_values;
-}
-
-int getBatchSize(int num_items) {
-  int batch_size = FLAGS_batch_size;
-  if (batch_size < 0) {
-    batch_size = num_items;
-  } else {
-    assert(num_items % batch_size == 0);
-  }
-  return batch_size;
-}
-
-TensorProtos writeValues(
-    std::vector<std::vector<std::vector<float>>>& values,
-    std::vector<std::vector<int>>& dims) {
-
-  caffe2::Timer timer;
-  timer.Start();
-
-  assert(dims.size() == values.size());
-  int num_batches = dims.size();
-
-  TensorProtos protos;
-  for (int k = 0; k < num_batches; k++) {
-    TensorProto* data;
-    data = protos.add_protos();
-    data->set_data_type(TensorProto::FLOAT);
-    auto one_dim = dims[k];
-    for (int dim : one_dim) {
-      data->add_dims(dim);
-    }
-    int batch_size = one_dim[0];
-    long long int entry_size = 1;
-    for (int i = 1; i < one_dim.size(); i++) {
-      entry_size *= one_dim[i];
-    }
-
-    // Not optimized
-    for (int i = 0; i < batch_size; i++) {
-      assert(values[k][i].size() == entry_size);
-      for (int j = 0; j < values[k][i].size(); j++) {
-        data->add_float_data(values[k][i][j]);
-      }
-    }
-  }
-  double ts = timer.MicroSeconds();
-  reportTime("preprocess", ts, "data_pack", "us");
-
-  return protos;
-}
-
-TensorProtos convertImages(std::string& image_file) {
-  vector<string> file_names;
-  if (image_file != "") {
-    std::ifstream infile(image_file);
-    std::string line;
-    while (std::getline(infile, line)) {
-      vector<string> file_name = caffe2::split(',', line);
-      string name;
-      if (file_name.size() == 3) {
-        name = file_name[2];
-      } else {
-        name = line;
-      }
-      file_names.push_back(name);
-    }
-  } else {
-    TensorProtos proto;
-    return proto;
-  }
-  int batch_size = getBatchSize(file_names.size());
-  int num_batches = file_names.size() / batch_size;
-  assert(file_names.size() == batch_size * num_batches);
-  std::vector<std::vector<std::vector<float>>> values;
-  std::vector<std::vector<int>> dims;
-  int C = FLAGS_color ? 3 : 1;
-  for (int k = 0; k < num_batches; k++) {
-    std::vector<std::vector<float>> one_value;
-    int height = -1;
-    int width = -1;
-    for (int i = 0; i < batch_size; i++) {
-      int idx = k * batch_size + i;
-      int one_height, one_width;
-      std::vector<float> one_image_values =
-          convertOneImage(file_names[idx], &one_height, &one_width);
-      if (height < 0 && width < 0) {
-        height = one_height;
-        width = one_width;
-      } else {
-        assert(height == one_height);
-        assert(width == one_width);
-      }
-      one_value.push_back(one_image_values);
-    }
-    vector<int> one_dim = {batch_size, C, height, width};
-    dims.push_back(one_dim);
-    values.push_back(one_value);
-  }
-  return writeValues(values, dims);
-}
-
-template <class TYPE>
-vector<TYPE> splitString(std::string& line) {
-  vector<string> vector_str = caffe2::split(',', line);
-  vector<TYPE> vector_int;
-  for (string str : vector_str) {
-    vector_int.push_back((TYPE)std::stod(str));
-  }
-  return vector_int;
-}
-
-/* Convert the values in a json file to blobs
-   The format of the json file should be:
-   <number of items>,  <dim2>.... (dimensions of items)
-   <entry>, <entry>, <entry>... (all entries in one item)
-   <entry>, <entry>, <entry>...
-   ....
-*/
-TensorProtos convertValues(std::string& file_name) {
-  if (file_name == "") {
-    TensorProtos proto;
-    return proto;
-  }
-  std::ifstream infile(file_name);
-  std::string line;
-  std::getline(infile, line);
-  vector<int> file_dims = splitString <int>(line);
-  assert(file_dims.size() >= 2);
-
-  int num_items = file_dims[0];
-  int batch_size = getBatchSize(num_items);
-  int num_batches = num_items / batch_size;
-  assert(num_items == batch_size * num_batches);
-  vector<string> lines;
-  while (std::getline(infile, line)) {
-    lines.push_back(line);
-  }
-  assert(lines.size() == num_items);
-  std::vector<std::vector<std::vector<float>>> values;
-  std::vector<std::vector<int>> dims;
-  for (int i = 0; i < num_batches; i++) {
-    std::vector<std::vector<float>> one_value;
-    int num = -1;
-    for (int j = 0; j < batch_size; j++) {
-      int idx = i * batch_size + j;
-      std::string line = lines[idx];
-      vector<float> item = splitString<float>(line);
-      if (num < 0) {
-        num = item.size();
-      } else {
-        assert(num == item.size());
-      }
-      one_value.push_back(item);
-    }
-    vector<int> batch_dims = file_dims;
-    batch_dims[0] = batch_size;
-    dims.push_back(batch_dims);
-    values.push_back(one_value);
-  }
-
-  return writeValues(values, dims);
-}
-
-} // namespace caffe2
-
-void observerConfig() {
-  caffe2::ClearGlobalNetObservers();
-  caffe2::AddGlobalNetObserverCreator([](caffe2::NetBase* subject) {
-    return std::make_unique<caffe2::PerfNetObserver>(subject);
-  });
-  caffe2::ObserverConfig::setReporter(
-      std::make_unique<caffe2::NetObserverReporterPrint>());
-}
-
-bool backendCudaSet(const string& backend) {
-  bool run_on_gpu = false;
-  if (backend == "cuda") {
-#ifdef __CUDA_ARCH__
-    if (caffe2::HasCudaGPU()) {
-      run_on_gpu = true;
-    } else {
-      CAFFE_THROW("NO GPU support on this host machine");
-    }
-#else
-    CAFFE_THROW("NO GPU support");
-#endif
-  }
-  return run_on_gpu;
-}
-
-void setOperatorEngine(caffe2::NetDef* net_def, const string& backend) {
-  if (backend != "builtin") {
-    string engine;
-    if( backend == "nnpack" ) {
-      engine = "NNPACK";
-    } else if ( backend == "eigen" ) {
-      engine = "EIGEN";
-    } else if ( backend == "mkl" ) {
-      engine = "MKLDNN";
-    } else if ( backend == "cuda" ) {
-      engine = "CUDA";
-    } else if ( backend == "dnnlowp" ) {
-      engine = "DNNLOWP";
-    } else if ( backend == "dnnlowp_acc16" ) {
-      engine = "DNNLOWP_ACC16";
-    } else if ( backend == "default" ) {
-      engine = "";
-    } else {
-      engine = "NONE";
-    }
-    CAFFE_ENFORCE(engine != "NONE", "Backend is not supported");
-    for (int i = 0; i < net_def->op_size(); i++) {
-      caffe2::OperatorDef* op_def = net_def->mutable_op(i);
-      op_def->set_engine(engine);
-    }
-  }
-}
-
-void fillInputBlob(
-    shared_ptr<caffe2::Workspace> workspace,
-    map<string, caffe2::TensorProtos>& tensor_protos_map,
-    int iteration) {
-  if (tensor_protos_map.empty()) {
-    return;
-  }
-  static caffe2::TensorDeserializer deserializer;
-  for (auto& tensor_kv : tensor_protos_map) {
-    caffe2::Blob* blob = workspace->GetBlob(tensor_kv.first);
-    if (blob == nullptr) {
-      blob = workspace->CreateBlob(tensor_kv.first);
-    }
-    // todo: support gpu and make this function a template
-    int protos_size = tensor_kv.second.protos_size();
-    if (protos_size == 1 && iteration > 0) {
-      // Do not override the input data if there is only one input data,
-      // since it will clear all caches. Rely on wipe_cache to
-      // clear caches
-      continue;
-    }
-    caffe2::TensorProto* tensor_proto =
-        tensor_kv.second.mutable_protos(iteration % protos_size);
-    BlobSetTensor(blob, deserializer.Deserialize(*tensor_proto));
-    // todo: for other types
-  }
-}
-
-void writeOutput(
-    shared_ptr<caffe2::Workspace> workspace,
-    const bool run_on_gpu,
-    const string& output,
-    const string& output_folder,
-    const bool text_output,
-    const int index,
-    const int num_blobs) {
-  if (output.size() == 0) {
-    return;
-  }
-  string output_prefix = output_folder.size() ? output_folder + "/" : "";
-  vector<string> output_names = caffe2::split(',', output);
-  if (output == "*") {
-    output_names = workspace->Blobs();
-  }
-  for (const string& name : output_names) {
-    CAFFE_ENFORCE(
-        workspace->HasBlob(name),
-        "You requested a non-existing blob: ",
-        name);
-    if (text_output) {
-      if (run_on_gpu) {
-#ifdef __CUDA_ARCH__
-        writeTextOutput<caffe2::CUDAContext, caffe2::TensorCUDA>(
-            workspace->GetBlob(name)->GetMutable<caffe2::TensorCUDA>(),
-            output_prefix,
-            name,
-            index,
-            num_blobs);
-#else
-        CAFFE_THROW("Not support GPU.");
-#endif
-      } else {
-        writeTextOutput<caffe2::CPUContext, caffe2::TensorCPU>(
-            BlobGetMutableTensor(workspace->GetBlob(name), caffe2::CPU),
-            output_prefix,
-            name,
-            index,
-            num_blobs);
-      }
-    } else {
-      // Do not support multiple entries per blob.
-      CAFFE_ENFORCE(
-          index == 0,
-          "Binary file only support one output.");
-      string serialized = SerializeBlob(*workspace->GetBlob(name), name);
-      string output_filename = output_prefix + name;
-      caffe2::WriteStringToFile(serialized, output_filename.c_str());
-    }
-  }
-}
-
-void runNetwork(
-    shared_ptr<caffe2::Workspace> workspace,
-    caffe2::NetDef& net_def,
-    map<string, caffe2::TensorProtos>& tensor_protos_map,
-    const bool wipe_cache,
-    const bool run_individual,
-    const bool run_on_gpu,
-    const bool text_output,
-    const int warmup,
-    const int iter,
-    const int num_blobs,
-    const int sleep_before_run,
-    const int sleep_between_iteration,
-    const int sleep_between_net_and_operator,
-    const std::string& output,
-    const std::string& output_folder) {
-
-  if (!net_def.has_name()) {
-    net_def.set_name("benchmark");
-  }
-
-  caffe2::NetBase* net = workspace->CreateNet(net_def);
-  TORCH_CHECK_NOTNULL(net);
-
-  LOG(INFO) << "Starting benchmark.";
-  caffe2::ObserverConfig::initSampleRate(1, 1, 1, run_individual, warmup);
-  LOG(INFO) << "Running warmup runs.";
-  for (int i = 0; i < warmup; ++i) {
-    fillInputBlob(workspace, tensor_protos_map, i);
-    CAFFE_ENFORCE(net->Run(), "Warmup run ", i, " has failed.");
-  }
-
-  if (wipe_cache) {
-    caffe2::wipe_cache();
-  }
-  if (sleep_before_run > 0) {
-    std::this_thread::sleep_for(std::chrono::seconds(sleep_before_run));
-  }
-  LOG(INFO) << "Main runs.";
-  CAFFE_ENFORCE(
-      iter >= 0,
-      "Number of main runs should be non negative, provided ",
-      iter,
-      ".");
-  LOG(INFO) << "net runs.";
-  for (int i = 0; i < iter; ++i) {
-    caffe2::ObserverConfig::initSampleRate(1, 1, 1, 0, warmup);
-    fillInputBlob(workspace, tensor_protos_map, i);
-    if (wipe_cache) {
-      caffe2::wipe_cache();
-    }
-    CAFFE_ENFORCE(net->Run(), "Main run ", i, " has failed.");
-    // Write the output for the first num_blobs times
-    writeOutput(
-        workspace,
-        run_on_gpu,
-        output,
-        output_folder,
-        text_output,
-        i,
-        num_blobs);
-    if (wipe_cache) {
-      caffe2::wipe_cache();
-    }
-    if (sleep_between_iteration > 0) {
-      std::this_thread::sleep_for(
-          std::chrono::seconds(sleep_between_iteration));
-    }
-  }
-  if (run_individual) {
-    LOG(INFO) << "operator runs.";
-    if (sleep_between_net_and_operator > 0) {
-      std::this_thread::sleep_for(
-          std::chrono::seconds(sleep_between_net_and_operator));
-    }
-    for (int i = 0; i < iter; ++i) {
-      caffe2::ObserverConfig::initSampleRate(1, 1, 1, 1, warmup);
-      fillInputBlob(workspace, tensor_protos_map, i);
-      CAFFE_ENFORCE(net->Run(), "Main run ", i, " with operator has failed.");
-      if (wipe_cache) {
-        caffe2::wipe_cache();
-      }
-      if (sleep_between_iteration > 0) {
-        std::this_thread::sleep_for(
-            std::chrono::seconds(sleep_between_iteration));
-      }
-    }
-  }
-}
-
-int benchmark(
-    int argc,
-    char* argv[],
-    const string& FLAGS_backend,
-    const string& FLAGS_init_net,
-    const string& FLAGS_input_dims,
-    int FLAGS_iter,
-    const string& FLAGS_net,
-    const string& FLAGS_output,
-    const string& FLAGS_output_folder,
-    bool FLAGS_run_individual,
-    int FLAGS_sleep_before_run,
-    int FLAGS_sleep_between_iteration,
-    int FLAGS_sleep_between_net_and_operator,
-    bool FLAGS_text_output,
-    int FLAGS_warmup,
-    bool FLAGS_wipe_cache) {
-  // Check arguments to be correct
-  {
-    // Need to check whether file exists, as the file reader does not assert if
-    // file does not exist
-    std::ifstream net_file(FLAGS_net);
-    CAFFE_ENFORCE(net_file.good());
-    net_file.close();
-
-    std::ifstream init_net_file(FLAGS_init_net);
-    CAFFE_ENFORCE(init_net_file.good());
-    init_net_file.close();
-  }
-
-  observerConfig();
-  caffe2::ShowLogInfoToStderr();
-
-  auto workspace = std::make_shared<caffe2::Workspace>(new caffe2::Workspace());
-  bool run_on_gpu = backendCudaSet(FLAGS_backend);
-  // Run initialization network.
-  caffe2::NetDef init_net_def;
-  CAFFE_ENFORCE(ReadProtoFromFile(FLAGS_init_net, &init_net_def));
-  setOperatorEngine(&init_net_def, FLAGS_backend);
-  CAFFE_ENFORCE(workspace->RunNetOnce(init_net_def));
-
-  // Run main network.
-  caffe2::NetDef net_def;
-  CAFFE_ENFORCE(ReadProtoFromFile(FLAGS_net, &net_def));
-  setOperatorEngine(&net_def, FLAGS_backend);
-
-  map<string, caffe2::TensorProtos> tensor_protos_map;
-
-  int num_blobs;
-  vector<string> images = caffe2::split(';', FLAGS_input_image_files);
-  for (int i = 0; i < images.size(); ++i) {
-    vector<string> mapping = caffe2::split(',', images[i]);
-    caffe2::TensorProtos proto_images = caffe2::convertImages(mapping[1]);
-    workspace->CreateBlob(mapping[0]);
-    tensor_protos_map.insert(std::make_pair(mapping[0], proto_images));
-    num_blobs = proto_images.protos_size();
-  }
-
-  vector<string> values = caffe2::split(';', FLAGS_input_text_files);
-  for (int i = 0; i < values.size(); ++i) {
-    vector<string> mapping = caffe2::split(',', values[i]);
-    caffe2::TensorProtos proto_values = caffe2::convertValues(mapping[1]);
-    workspace->CreateBlob(mapping[0]);
-    tensor_protos_map.insert(std::make_pair(mapping[0], proto_values));
-    num_blobs = proto_values.protos_size();
-  }
-
-  runNetwork(
-      workspace,
-      net_def,
-      tensor_protos_map,
-      FLAGS_wipe_cache,
-      FLAGS_run_individual,
-      run_on_gpu,
-      FLAGS_text_output,
-      FLAGS_warmup,
-      FLAGS_iter,
-      num_blobs,
-      FLAGS_sleep_before_run,
-      FLAGS_sleep_between_iteration,
-      FLAGS_sleep_between_net_and_operator,
-      FLAGS_output,
-      FLAGS_output_folder);
-
-  return 0;
-}
-
-int main(int argc, char** argv) {
-  caffe2::GlobalInit(&argc, &argv);
-  benchmark(
-      argc,
-      argv,
-      FLAGS_backend,
-      FLAGS_init_net,
-      FLAGS_input_dims,
-      FLAGS_iter,
-      FLAGS_net,
-      FLAGS_output,
-      FLAGS_output_folder,
-      FLAGS_run_individual,
-      FLAGS_sleep_before_run,
-      FLAGS_sleep_between_iteration,
-      FLAGS_sleep_between_net_and_operator,
-      FLAGS_text_output,
-      FLAGS_warmup,
-      FLAGS_wipe_cache);
-
-  return 0;
-}
diff --git a/binaries/convert_caffe_image_db.cc b/binaries/convert_caffe_image_db.cc
deleted file mode 100644
index dca13d6..0000000
--- a/binaries/convert_caffe_image_db.cc
+++ /dev/null
@@ -1,90 +0,0 @@
-/**
- * Copyright (c) 2016-present, Facebook, Inc.
- *
- * Licensed 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.
- */
-
-#include "caffe2/core/db.h"
-#include "caffe2/core/init.h"
-#include "caffe2/proto/caffe2_pb.h"
-#include "caffe2/proto/caffe2_legacy.pb.h"
-#include "caffe2/core/logging.h"
-
-C10_DEFINE_string(input_db, "", "The input db.");
-C10_DEFINE_string(input_db_type, "", "The input db type.");
-C10_DEFINE_string(output_db, "", "The output db.");
-C10_DEFINE_string(output_db_type, "", "The output db type.");
-C10_DEFINE_int(batch_size, 1000, "The write batch size.");
-
-using caffe2::db::Cursor;
-using caffe2::db::DB;
-using caffe2::db::Transaction;
-using caffe2::CaffeDatum;
-using caffe2::TensorProto;
-using caffe2::TensorProtos;
-
-int main(int argc, char** argv) {
-  caffe2::GlobalInit(&argc, &argv);
-
-  std::unique_ptr<DB> in_db(caffe2::db::CreateDB(
-      FLAGS_input_db_type, FLAGS_input_db, caffe2::db::READ));
-  std::unique_ptr<DB> out_db(caffe2::db::CreateDB(
-      FLAGS_output_db_type, FLAGS_output_db, caffe2::db::NEW));
-  std::unique_ptr<Cursor> cursor(in_db->NewCursor());
-  std::unique_ptr<Transaction> transaction(out_db->NewTransaction());
-  int count = 0;
-  for (; cursor->Valid(); cursor->Next()) {
-    CaffeDatum datum;
-    CAFFE_ENFORCE(datum.ParseFromString(cursor->value()));
-    TensorProtos protos;
-    TensorProto* data = protos.add_protos();
-    TensorProto* label = protos.add_protos();
-    label->set_data_type(TensorProto::INT32);
-    label->add_dims(1);
-    label->add_int32_data(datum.label());
-    if (datum.encoded()) {
-      // This is an encoded image. we will copy over the data directly.
-      data->set_data_type(TensorProto::STRING);
-      data->add_dims(1);
-      data->add_string_data(datum.data());
-    } else {
-      // float data not supported right now.
-      CAFFE_ENFORCE_EQ(datum.float_data_size(), 0);
-      std::vector<char> buffer_vec(datum.data().size());
-      char* buffer = buffer_vec.data();
-      // swap order from CHW to HWC
-      int channels = datum.channels();
-      int size = datum.height() * datum.width();
-      CAFFE_ENFORCE_EQ(datum.data().size(), channels * size);
-      for (int c = 0; c < channels; ++c) {
-        char* dst = buffer + c;
-        const char* src = datum.data().c_str() + c * size;
-        for (int n = 0; n < size; ++n) {
-          dst[n*channels] = src[n];
-        }
-      }
-      data->set_data_type(TensorProto::BYTE);
-      data->add_dims(datum.height());
-      data->add_dims(datum.width());
-      data->add_dims(datum.channels());
-      data->set_byte_data(buffer, datum.data().size());
-    }
-    transaction->Put(cursor->key(), SerializeAsString_EnforceCheck(protos));
-    if (++count % FLAGS_batch_size == 0) {
-      transaction->Commit();
-      LOG(INFO) << "Converted " << count << " items so far.";
-    }
-  }
-  LOG(INFO) << "A total of " << count << " items processed.";
-  return 0;
-}
diff --git a/binaries/convert_db.cc b/binaries/convert_db.cc
deleted file mode 100644
index 0fc73c3..0000000
--- a/binaries/convert_db.cc
+++ /dev/null
@@ -1,51 +0,0 @@
-/**
- * Copyright (c) 2016-present, Facebook, Inc.
- *
- * Licensed 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.
- */
-
-#include "caffe2/core/db.h"
-#include "caffe2/core/init.h"
-#include "caffe2/proto/caffe2_pb.h"
-#include "caffe2/core/logging.h"
-
-C10_DEFINE_string(input_db, "", "The input db.");
-C10_DEFINE_string(input_db_type, "", "The input db type.");
-C10_DEFINE_string(output_db, "", "The output db.");
-C10_DEFINE_string(output_db_type, "", "The output db type.");
-C10_DEFINE_int(batch_size, 1000, "The write batch size.");
-
-using caffe2::db::Cursor;
-using caffe2::db::DB;
-using caffe2::db::Transaction;
-
-int main(int argc, char** argv) {
-  caffe2::GlobalInit(&argc, &argv);
-
-  std::unique_ptr<DB> in_db(caffe2::db::CreateDB(
-      FLAGS_input_db_type, FLAGS_input_db, caffe2::db::READ));
-  std::unique_ptr<DB> out_db(caffe2::db::CreateDB(
-      FLAGS_output_db_type, FLAGS_output_db, caffe2::db::NEW));
-  std::unique_ptr<Cursor> cursor(in_db->NewCursor());
-  std::unique_ptr<Transaction> transaction(out_db->NewTransaction());
-  int count = 0;
-  for (; cursor->Valid(); cursor->Next()) {
-    transaction->Put(cursor->key(), cursor->value());
-    if (++count % FLAGS_batch_size == 0) {
-      transaction->Commit();
-      LOG(INFO) << "Converted " << count << " items so far.";
-    }
-  }
-  LOG(INFO) << "A total of " << count << " items processed.";
-  return 0;
-}
diff --git a/binaries/convert_encoded_to_raw_leveldb.cc b/binaries/convert_encoded_to_raw_leveldb.cc
deleted file mode 100644
index c0727d7..0000000
--- a/binaries/convert_encoded_to_raw_leveldb.cc
+++ /dev/null
@@ -1,155 +0,0 @@
-/**
- * Copyright (c) 2016-present, Facebook, Inc.
- *
- * Licensed 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.
- */
-
-// This script converts an image dataset to leveldb.
-//
-// FLAGS_input_folder is the root folder that holds all the images, and
-// FLAGS_list_file should be a list of files as well as their labels, in
-// the format as
-//   subfolder1/file1.JPEG 7
-//   ....
-
-#include <opencv2/opencv.hpp>
-
-#include <fstream>  // NOLINT(readability/streams)
-#include <memory>
-#include <random>
-#include <string>
-
-#include "caffe2/core/init.h"
-#include "caffe2/proto/caffe2_pb.h"
-#include "caffe2/core/logging.h"
-#include "leveldb/db.h"
-#include "leveldb/write_batch.h"
-
-C10_DEFINE_string(input_db_name, "", "The input image file name.");
-C10_DEFINE_string(output_db_name, "", "The output training leveldb name.");
-C10_DEFINE_bool(color, true, "If set, load images in color.");
-C10_DEFINE_int(
-    scale,
-    256,
-    "If FLAGS_raw is set, scale all the images' shorter edge to the given "
-    "value.");
-C10_DEFINE_bool(warp, false, "If warp is set, warp the images to square.");
-
-namespace caffe2 {
-
-
-void ConvertToRawDataset(
-    const string& input_db_name, const string& output_db_name) {
-  // input leveldb
-  std::unique_ptr<leveldb::DB> input_db;
-  LOG(INFO) << "Opening input leveldb " << input_db_name;
-  {
-    leveldb::Options options;
-    options.create_if_missing = false;
-    leveldb::DB* db_temp;
-    leveldb::Status status = leveldb::DB::Open(
-        options, input_db_name, &db_temp);
-    CAFFE_ENFORCE(status.ok(), "Failed to open leveldb ", input_db_name, ".");
-    input_db.reset(db_temp);
-  }
-
-  // output leveldb
-  std::unique_ptr<leveldb::DB> output_db;
-  std::unique_ptr<leveldb::WriteBatch> batch;
-  LOG(INFO) << "Opening leveldb " << output_db_name;
-  {
-    leveldb::Options options;
-    options.error_if_exists = true;
-    options.create_if_missing = true;
-    options.write_buffer_size = 268435456;
-    leveldb::DB* db_temp;
-    leveldb::Status status = leveldb::DB::Open(
-        options, output_db_name, &db_temp);
-    CAFFE_ENFORCE(
-        status.ok(),
-        "Failed to open leveldb ",
-        output_db_name,
-        ". Is it already existing?");
-    output_db.reset(db_temp);
-  }
-  batch.reset(new leveldb::WriteBatch());
-
-  TensorProtos input_protos;
-  TensorProtos output_protos;
-  TensorProto* data = output_protos.add_protos();
-  TensorProto* label = output_protos.add_protos();
-  data->set_data_type(TensorProto::BYTE);
-  data->add_dims(0);
-  data->add_dims(0);
-  if (FLAGS_color) {
-    data->add_dims(3);
-  }
-  string value;
-
-  unique_ptr<leveldb::Iterator> iter;
-  iter.reset(input_db->NewIterator(leveldb::ReadOptions()));
-  iter->SeekToFirst();
-  int count = 0;
-  for (; iter->Valid(); iter->Next()) {
-    CAFFE_ENFORCE(input_protos.ParseFromString(iter->value().ToString()));
-    label->CopyFrom(input_protos.protos(1));
-    const string& encoded_image = input_protos.protos(0).string_data(0);
-    int encoded_size = encoded_image.size();
-    cv::Mat img = cv::imdecode(
-        cv::Mat(
-            1, &encoded_size, CV_8UC1, const_cast<char*>(encoded_image.data())),
-        FLAGS_color ? cv::IMREAD_COLOR : cv::IMREAD_GRAYSCALE);
-    cv::Mat resized_img;
-    int scaled_width, scaled_height;
-    if (FLAGS_warp) {
-      scaled_width = FLAGS_scale;
-      scaled_height = FLAGS_scale;
-    } else if (img.rows > img.cols) {
-      scaled_width = FLAGS_scale;
-      scaled_height = static_cast<float>(img.rows) * FLAGS_scale / img.cols;
-    } else {
-      scaled_height = FLAGS_scale;
-      scaled_width = static_cast<float>(img.cols) * FLAGS_scale / img.rows;
-    }
-    cv::resize(img, resized_img, cv::Size(scaled_width, scaled_height), 0, 0,
-                 cv::INTER_LINEAR);
-    data->set_dims(0, scaled_height);
-    data->set_dims(1, scaled_width);
-    DCHECK(resized_img.isContinuous());
-    data->set_byte_data(
-        resized_img.ptr(),
-        scaled_height * scaled_width * (FLAGS_color ? 3 : 1));
-    output_protos.SerializeToString(&value);
-    // Put in db
-    batch->Put(iter->key(), value);
-    if (++count % 1000 == 0) {
-      output_db->Write(leveldb::WriteOptions(), batch.get());
-      batch.reset(new leveldb::WriteBatch());
-      LOG(INFO) << "Processed " << count << " files.";
-    }
-  }
-  // write the last batch
-  if (count % 1000 != 0) {
-    output_db->Write(leveldb::WriteOptions(), batch.get());
-  }
-  LOG(INFO) << "Processed a total of " << count << " files.";
-}
-
-}  // namespace caffe2
-
-
-int main(int argc, char** argv) {
-  caffe2::GlobalInit(&argc, &argv);
-  caffe2::ConvertToRawDataset(FLAGS_input_db_name, FLAGS_output_db_name);
-  return 0;
-}
diff --git a/binaries/convert_image_to_tensor.cc b/binaries/convert_image_to_tensor.cc
deleted file mode 100644
index 2cbfb07..0000000
--- a/binaries/convert_image_to_tensor.cc
+++ /dev/null
@@ -1,450 +0,0 @@
-/**
- * Copyright (c) 2016-present, Facebook, Inc.
- *
- * Licensed 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.
- */
-
-#include <opencv2/opencv.hpp>
-#include <cmath>
-#include <fstream>
-
-#include "caffe2/core/common.h"
-#include "caffe2/core/db.h"
-#include "caffe2/core/init.h"
-#include "caffe2/core/logging.h"
-#include "caffe2/core/timer.h"
-#include "caffe2/proto/caffe2_pb.h"
-#include "caffe2/utils/proto_utils.h"
-#include "caffe2/utils/string_utils.h"
-
-
-C10_DEFINE_int(
-    batch_size,
-    -1,
-    "Specify the batch size of the input. The number of items in the "
-    "input needs to be multiples of the batch size. If the batch size "
-    "is less than 0, all inputs are in one batch.")
-C10_DEFINE_bool(color, true, "If set, load images in color.");
-C10_DEFINE_string(
-    crop,
-    "-1,-1",
-    "The center cropped hight and width. If the value is less than zero, "
-    "it is not cropped.");
-C10_DEFINE_string(input_images, "", "Comma separated images");
-C10_DEFINE_string(input_image_file, "", "The file containing imput images");
-C10_DEFINE_string(input_text_file, "", "the text file to be written to blobs");
-C10_DEFINE_string(
-    output_tensor,
-    "",
-    "The output tensor file in NCHW for input images");
-C10_DEFINE_string(
-    output_text_tensor,
-    "",
-    "The output tensor file for the text input specified in input_text_file");
-C10_DEFINE_string(
-    preprocess,
-    "",
-    "Options to specify the preprocess routines. The available options are "
-    "subtract128, normalize, mean, std, bgrtorgb. If multiple steps are provided, they "
-    "are separated by comma (,) in sequence.");
-C10_DEFINE_string(
-    report_time,
-    "",
-    "Report the conversion stage time to screen. "
-    "The format of the string is <type>|<identifier>. "
-    "The valid type is 'json'. "
-    "The valid identifier is nothing or an identifier that prefix every line");
-C10_DEFINE_string(
-    scale,
-    "-1,-1",
-    "Scale the images to be within the min,max box. The shorter edge is "
-    "min pixels. But if the other edge is more than the max pixels, the "
-    "other edge and scaled to max pixels (and the shorter edge can be less "
-    "than the min pixels");
-C10_DEFINE_bool(text_output, false, "Write the output in text format.");
-C10_DEFINE_bool(warp, false, "If warp is set, warp the images to square.");
-
-namespace caffe2 {
-
-void reportTime(
-    std::string type,
-    double ts,
-    std::string metric,
-    std::string unit) {
-  if (FLAGS_report_time == "") {
-    return;
-  }
-  vector<string> s = caffe2::split('|', FLAGS_report_time);
-  assert(s[0] == "json");
-  std::string identifier = "";
-  if (s.size() > 1) {
-    identifier = s[1];
-  }
-  std::cout << identifier << "{\"type\": \"" << type << "\", \"value\": " << ts
-            << ", \"metric\": \"" << metric << "\", \"unit\": \"" << unit
-            << "\"}" << std::endl;
-}
-
-void splitSizes(const std::string& arg, int* ptr0, int* ptr1) {
-  vector<string> sizes = caffe2::split(',', arg);
-  if (sizes.size() == 2) {
-    *ptr0 = std::stoi(sizes[0]);
-    *ptr1 = std::stoi(sizes[1]);
-  } else if (sizes.size() == 1) {
-    *ptr0 = std::stoi(sizes[0]);
-    *ptr1 = std::stoi(sizes[0]);
-  } else {
-    assert(false);
-  }
-}
-
-
-cv::Mat resizeImage(cv::Mat& img) {
-  int min_size, max_size;
-  splitSizes(FLAGS_scale, &min_size, &max_size);
-  if ((min_size <= 0) && (max_size <= 0)) {
-    return img;
-  }
-  if (max_size < 0) {
-    max_size = INT_MAX;
-  }
-  assert(min_size <= max_size);
-
-  int im_min_size = img.rows > img.cols ? img.cols : img.rows;
-  int im_max_size = img.rows > img.cols ? img.rows : img.cols;
-
-  double im_scale = 1.0 * min_size / im_min_size;
-  if (im_scale * im_max_size > max_size) {
-    im_scale = 1.0 * max_size / im_max_size;
-  }
-  int scaled_width = int(round(img.cols * im_scale));
-  int scaled_height = int(round(img.rows * im_scale));
-  assert((scaled_width <= max_size) && (scaled_height <= max_size));
-  if ((scaled_width < min_size) || (scaled_height < min_size)) {
-    assert((scaled_width == max_size) || (scaled_height == max_size));
-  } else {
-    assert((scaled_width == min_size) || (scaled_height == min_size));
-  }
-  cv::Mat resized_img;
-  cv::resize(
-      img,
-      resized_img,
-      cv::Size(),
-      im_scale,
-      im_scale,
-      cv::INTER_LINEAR);
-  return resized_img;
-}
-
-cv::Mat cropToRec(cv::Mat& img, int* height_ptr, int* width_ptr) {
-  int height = *height_ptr;
-  int width = *width_ptr;
-  if ((height > 0) && (width > 0) &&
-      ((img.rows != height) || (img.cols != width))) {
-    cv::Mat cropped_img, cimg;
-    cv::Rect roi;
-    roi.x = int((img.cols - width) / 2);
-    roi.y = int((img.rows - height) / 2);
-    roi.x = roi.x < 0 ? 0 : roi.x;
-    roi.y = roi.y < 0 ? 0 : roi.y;
-    width = width > img.cols ? img.cols : width;
-    height = height > img.rows ? img.rows : height;
-    roi.width = width;
-    roi.height = height;
-    assert(
-        0 <= roi.x && 0 <= roi.width && roi.x + roi.width <= img.cols &&
-        0 <= roi.y && 0 <= roi.height && roi.y + roi.height <= img.rows);
-    cropped_img = img(roi);
-    // Make the image in continuous space in memory
-    cimg = cropped_img.clone();
-    *height_ptr = height;
-    *width_ptr = width;
-    return cimg;
-  } else {
-    return img;
-  }
-}
-
-std::vector<float> convertToVector(cv::Mat& img) {
-  std::vector<float> normalize(3, 1);
-  std::vector<float> mean(3, 0);
-  std::vector<float> std(3, 1);
-  bool bgrtorgb = false;
-  int size = img.cols * img.rows;
-  vector<string> steps = caffe2::split(',', FLAGS_preprocess);
-  for (int i = 0; i < steps.size(); i++) {
-    auto step = steps[i];
-    if (step == "subtract128") {
-      mean = {128, 128, 128};
-      std = {1, 1, 1};
-      normalize = {1, 1, 1};
-    } else if (step == "normalize") {
-      normalize = {255, 255, 255};
-    } else if (step == "mean") {
-      mean = {0.406f, 0.456f, 0.485f};
-    } else if (step == "std") {
-      std = {0.225f, 0.224f, 0.229f};
-    } else if (step == "bgrtorgb") {
-      bgrtorgb = true;
-    } else {
-      CAFFE_ENFORCE(
-          false,
-          "Unsupported preprocess step. The supported steps are: subtract128, "
-          "normalize,mean, std, swaprb.");
-    }
-  }
-
-  int C = FLAGS_color ? 3 : 1;
-  int total_size = C * size;
-  std::vector<float> values(total_size);
-  if (C == 1) {
-    cv::MatIterator_<float> it, end;
-    int idx = 0;
-    for (it = img.begin<float>(), end = img.end<float>(); it != end; ++it) {
-      values[idx++] = (*it / normalize[0] - mean[0]) / std[0];
-    }
-  } else {
-    int i = 0;
-    cv::MatIterator_<cv::Vec3f> it, end;
-    int b = bgrtorgb ? 2 : 0;
-    int g = 1;
-    int r = bgrtorgb ? 0 : 2;
-    for (it = img.begin<cv::Vec3f>(), end = img.end<cv::Vec3f>(); it != end;
-         ++it, i++) {
-      values[i] = (((*it)[b] / normalize[0] - mean[0]) / std[0]);
-      int offset = size + i;
-      values[offset] = (((*it)[g] / normalize[1] - mean[1]) / std[1]);
-      offset = size + offset;
-      values[offset] = (((*it)[r] / normalize[2] - mean[2]) / std[2]);
-    }
-  }
-  return values;
-}
-
-std::vector<float> convertOneImage(
-    std::string& filename,
-    int* height_ptr,
-    int* width_ptr) {
-  assert(filename[0] != '~');
-
-  std::cout << "Converting " << filename << std::endl;
-
-  // Load image
-  cv::Mat img_uint8 = cv::imread(
-#if CV_MAJOR_VERSION <= 3
-      filename, FLAGS_color ? CV_LOAD_IMAGE_COLOR : CV_LOAD_IMAGE_GRAYSCALE);
-#else
-      filename, FLAGS_color ? cv::IMREAD_COLOR : cv::IMREAD_GRAYSCALE);
-#endif
-  caffe2::Timer timer;
-  timer.Start();
-  cv::Mat img;
-  // Convert image to floating point values
-  img_uint8.convertTo(img, CV_32F);
-  // Resize image
-  cv::Mat resized_img = resizeImage(img);
-
-  int height, width;
-  splitSizes(FLAGS_crop, &height, &width);
-  if ((height <= 0) || (width <= 0)) {
-    height = resized_img.rows;
-    width = resized_img.cols;
-  }
-  cv::Mat crop = cropToRec(resized_img, &height, &width);
-
-  // Assert we don't have to deal with alignment
-  DCHECK(crop.isContinuous());
-  assert(crop.rows == height);
-  assert(crop.cols == width);
-  std::vector<float> one_image_values = convertToVector(crop);
-  *height_ptr = height;
-  *width_ptr = width;
-  double ts = timer.MicroSeconds();
-  reportTime("image_preprocess", ts, "convert", "us");
-  return one_image_values;
-}
-
-int getBatchSize(int num_items) {
-  int batch_size = FLAGS_batch_size;
-  if (batch_size < 0) {
-    batch_size = num_items;
-  } else {
-    assert(num_items % batch_size == 0);
-  }
-  return batch_size;
-}
-
-void writeValues(
-    std::vector<std::vector<std::vector<float>>>& values,
-    std::vector<std::vector<int>>& dims,
-    std::string output_file) {
-
-  caffe2::Timer timer;
-  timer.Start();
-
-  assert(dims.size() == values.size());
-  int num_batches = dims.size();
-
-  TensorProtos protos;
-  for (int k = 0; k < num_batches; k++) {
-    TensorProto* data;
-    data = protos.add_protos();
-    data->set_data_type(TensorProto::FLOAT);
-    auto one_dim = dims[k];
-    for (int dim : one_dim) {
-      data->add_dims(dim);
-    }
-    int batch_size = one_dim[0];
-    long long int entry_size = 1;
-    for (int i = 1; i < one_dim.size(); i++) {
-      entry_size *= one_dim[i];
-    }
-
-    // Not optimized
-    for (int i = 0; i < batch_size; i++) {
-      assert(values[k][i].size() == entry_size);
-      for (int j = 0; j < values[k][i].size(); j++) {
-        data->add_float_data(values[k][i][j]);
-      }
-    }
-  }
-  double ts = timer.MicroSeconds();
-  reportTime("preprocess", ts, "data_pack", "us");
-
-  if (FLAGS_text_output) {
-    caffe2::WriteProtoToTextFile(protos, output_file);
-  } else {
-    caffe2::WriteProtoToBinaryFile(protos, output_file);
-  }
-}
-
-void convertImages() {
-  vector<string> file_names;
-  if (FLAGS_input_images != "") {
-    file_names = caffe2::split(',', FLAGS_input_images);
-  } else if (FLAGS_input_image_file != "") {
-    std::ifstream infile(FLAGS_input_image_file);
-    std::string line;
-    while (std::getline(infile, line)) {
-      vector<string> file_name = caffe2::split(',', line);
-      string name;
-      if (file_name.size() == 3) {
-        name = file_name[2];
-      } else {
-        name = line;
-      }
-      file_names.push_back(name);
-    }
-  } else {
-    return;
-  }
-  int batch_size = getBatchSize(file_names.size());
-  int num_batches = file_names.size() / batch_size;
-  assert(file_names.size() == batch_size * num_batches);
-  std::vector<std::vector<std::vector<float>>> values;
-  std::vector<std::vector<int>> dims;
-  int C = FLAGS_color ? 3 : 1;
-  for (int k = 0; k < num_batches; k++) {
-    std::vector<std::vector<float>> one_value;
-    int height = -1;
-    int width = -1;
-    for (int i = 0; i < batch_size; i++) {
-      int idx = k * batch_size + i;
-      int one_height, one_width;
-      std::vector<float> one_image_values =
-          convertOneImage(file_names[idx], &one_height, &one_width);
-      if (height < 0 && width < 0) {
-        height = one_height;
-        width = one_width;
-      } else {
-        assert(height == one_height);
-        assert(width == one_width);
-      }
-      one_value.push_back(one_image_values);
-    }
-    vector<int> one_dim = {batch_size, C, height, width};
-    dims.push_back(one_dim);
-    values.push_back(one_value);
-  }
-  writeValues(values, dims, FLAGS_output_tensor);
-}
-
-template <class TYPE>
-vector<TYPE> splitString(std::string& line) {
-  vector<string> vector_str = caffe2::split(',', line);
-  vector<TYPE> vector_int;
-  for (string str : vector_str) {
-    vector_int.push_back((TYPE)std::stod(str));
-  }
-  return vector_int;
-}
-
-/* Convert the values in a json file to blobs
-   The format of the json file should be:
-   <number of items>,  <dim2>.... (dimensions of items)
-   <entry>, <entry>, <entry>... (all entries in one item)
-   <entry>, <entry>, <entry>...
-   ....
-*/
-void convertValues() {
-  if (FLAGS_input_text_file == "") {
-    return;
-  }
-  std::ifstream infile(FLAGS_input_text_file);
-  std::string line;
-  std::getline(infile, line);
-  vector<int> file_dims = splitString <int>(line);
-  assert(file_dims.size() >= 2);
-
-  int num_items = file_dims[0];
-  int batch_size = getBatchSize(num_items);
-  int num_batches = num_items / batch_size;
-  assert(num_items == batch_size * num_batches);
-  vector<string> lines;
-  while (std::getline(infile, line)) {
-    lines.push_back(line);
-  }
-  assert(lines.size() == num_items);
-  std::vector<std::vector<std::vector<float>>> values;
-  std::vector<std::vector<int>> dims;
-  for (int i = 0; i < num_batches; i++) {
-    std::vector<std::vector<float>> one_value;
-    int num = -1;
-    for (int j = 0; j < batch_size; j++) {
-      int idx = i * batch_size + j;
-      std::string line = lines[idx];
-      vector<float> item = splitString<float>(line);
-      if (num < 0) {
-        num = item.size();
-      } else {
-        assert(num == item.size());
-      }
-      one_value.push_back(item);
-    }
-    vector<int> batch_dims = file_dims;
-    batch_dims[0] = batch_size;
-    dims.push_back(batch_dims);
-    values.push_back(one_value);
-  }
-
-  writeValues(values, dims, FLAGS_output_text_tensor);
-}
-
-} // namespace caffe2
-
-int main(int argc, char** argv) {
-  caffe2::GlobalInit(&argc, &argv);
-  caffe2::convertImages();
-  caffe2::convertValues();
-  return 0;
-}
diff --git a/binaries/db_throughput.cc b/binaries/db_throughput.cc
deleted file mode 100644
index 851447a..0000000
--- a/binaries/db_throughput.cc
+++ /dev/null
@@ -1,104 +0,0 @@
-/**
- * Copyright (c) 2016-present, Facebook, Inc.
- *
- * Licensed 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.
- */
-
-#include <cstdio>
-#include <thread>
-#include <vector>
-
-#include "caffe2/core/db.h"
-#include "caffe2/core/init.h"
-#include "caffe2/core/timer.h"
-#include "caffe2/core/logging.h"
-
-C10_DEFINE_string(input_db, "", "The input db.");
-C10_DEFINE_string(input_db_type, "", "The input db type.");
-C10_DEFINE_int(report_interval, 1000, "The report interval.");
-C10_DEFINE_int(repeat, 10, "The number to repeat the throughput test.");
-C10_DEFINE_bool(use_reader, false, "If true, use the reader interface.");
-C10_DEFINE_int(
-    num_read_threads,
-    1,
-    "The number of concurrent reading threads.");
-
-using caffe2::db::Cursor;
-using caffe2::db::DB;
-using caffe2::db::DBReader;
-using caffe2::string;
-
-void TestThroughputWithDB() {
-  std::unique_ptr<DB> in_db(caffe2::db::CreateDB(
-      FLAGS_input_db_type, FLAGS_input_db, caffe2::db::READ));
-  std::unique_ptr<Cursor> cursor(in_db->NewCursor());
-  for (int iter_id = 0; iter_id < FLAGS_repeat; ++iter_id) {
-    caffe2::Timer timer;
-    for (int i = 0; i < FLAGS_report_interval; ++i) {
-      string key = cursor->key();
-      string value = cursor->value();
-      //VLOG(1) << "Key " << key;
-      cursor->Next();
-      if (!cursor->Valid()) {
-        cursor->SeekToFirst();
-      }
-    }
-    double elapsed_seconds = timer.Seconds();
-    printf(
-        "Iteration %03d, took %4.5f seconds, throughput %f items/sec.\n",
-        iter_id,
-        elapsed_seconds,
-        FLAGS_report_interval / elapsed_seconds);
-  }
-}
-
-void TestThroughputWithReaderWorker(const DBReader* reader, int thread_id) {
-  string key, value;
-  for (int iter_id = 0; iter_id < FLAGS_repeat; ++iter_id) {
-    caffe2::Timer timer;
-    for (int i = 0; i < FLAGS_report_interval; ++i) {
-      reader->Read(&key, &value);
-    }
-    double elapsed_seconds = timer.Seconds();
-    printf(
-        "Thread %03d iteration %03d, took %4.5f seconds, "
-        "throughput %f items/sec.\n",
-        thread_id,
-        iter_id,
-        elapsed_seconds,
-        FLAGS_report_interval / elapsed_seconds);
-  }
-}
-
-void TestThroughputWithReader() {
-  caffe2::db::DBReader reader(FLAGS_input_db_type, FLAGS_input_db);
-  std::vector<std::unique_ptr<std::thread>> reading_threads(
-      FLAGS_num_read_threads);
-  for (int i = 0; i < reading_threads.size(); ++i) {
-    reading_threads[i].reset(new std::thread(
-        TestThroughputWithReaderWorker, &reader, i));
-  }
-  for (int i = 0; i < reading_threads.size(); ++i) {
-    reading_threads[i]->join();
-  }
-}
-
-int main(int argc, char** argv) {
-  caffe2::GlobalInit(&argc, &argv);
-  if (FLAGS_use_reader) {
-    TestThroughputWithReader();
-  } else {
-    TestThroughputWithDB();
-  }
-  return 0;
-}
diff --git a/binaries/intra_inter_benchmark.cc b/binaries/intra_inter_benchmark.cc
deleted file mode 100644
index 0f191dc..0000000
--- a/binaries/intra_inter_benchmark.cc
+++ /dev/null
@@ -1,166 +0,0 @@
-#include "ATen/ATen.h"
-#include "ATen/Parallel.h"
-
-#include "c10/util/Flags.h"
-#include "caffe2/core/init.h"
-
-#include <chrono>
-#include <condition_variable>
-#include <ctime>
-#include <iostream>
-#include <mutex>
-#include <thread>
-
-C10_DEFINE_int(iter_pow, 10, "Number of tasks, 2^N");
-C10_DEFINE_int(sub_iter, 1024, "Number of subtasks");
-C10_DEFINE_int(warmup_iter_pow, 3, "Number of warmup tasks, 2^N");
-C10_DEFINE_int(inter_op_threads, 0, "Number of inter-op threads");
-C10_DEFINE_int(intra_op_threads, 0, "Number of intra-op threads");
-C10_DEFINE_int(tensor_dim, 50, "Tensor dim");
-C10_DEFINE_int(benchmark_iter, 10, "Number of times to run benchmark")
-C10_DEFINE_bool(extra_stats, false,
-    "Collect extra stats; warning: skews results");
-C10_DEFINE_string(task_type, "add", "Tensor operation: add or mm");
-
-namespace {
-std::atomic<int> counter{0};
-int overall_tasks = 0;
-std::condition_variable cv;
-std::mutex tasks_mutex;
-bool run_mm = false;
-
-std::mutex stats_mutex;
-std::unordered_set<std::thread::id> tids;
-}
-
-void wait() {
-  std::unique_lock<std::mutex> lk(tasks_mutex);
-  while (counter < overall_tasks) {
-    cv.wait(lk);
-  }
-}
-
-void _launch_tasks_tree(
-    int level, int end_level, at::Tensor& left, at::Tensor& right) {
-  if (level == end_level) {
-    at::parallel_for(0, FLAGS_sub_iter, 1,
-        [&left, &right](int64_t begin, int64_t end) {
-      if (FLAGS_extra_stats) {
-        std::unique_lock<std::mutex> lk(stats_mutex);
-        tids.insert(std::this_thread::get_id());
-      }
-      for (auto k = begin; k < end; ++k) {
-        if (run_mm) {
-          left.mm(right);
-        } else {
-          left.add(right);
-        }
-        auto cur_ctr = ++counter;
-        if (cur_ctr == overall_tasks) {
-          std::unique_lock<std::mutex> lk(tasks_mutex);
-          cv.notify_one();
-        }
-      }
-    });
-  } else {
-    at::launch([&left, &right, level, end_level]() {
-      _launch_tasks_tree(level + 1, end_level, left, right);
-    });
-    at::launch([&left, &right, level, end_level]() {
-      _launch_tasks_tree(level + 1, end_level, left, right);
-    });
-  }
-};
-
-void launch_tasks_and_wait(at::Tensor& left, at::Tensor& right, int iter_pow) {
-  overall_tasks = pow(2, iter_pow) * FLAGS_sub_iter;
-  counter = 0;
-
-  _launch_tasks_tree(0, iter_pow, left, right);
-  wait();
-}
-
-void reset_extra_stats() {
-  tids.clear();
-}
-
-void print_extra_stats() {
-  std::cout << "# threads: " << tids.size() << std::endl;
-}
-
-void print_runtime_stats(const std::vector<float>& runtimes) {
-  TORCH_INTERNAL_ASSERT(!runtimes.empty());
-  float sum = 0.0;
-  float sqr_sum = 0.0;
-  size_t N = runtimes.size();
-  for (size_t idx = 0; idx < N; ++idx) {
-    sum += runtimes[idx];
-    sqr_sum += runtimes[idx] * runtimes[idx];
-  }
-  float mean = sum / N;
-  float sd = std::sqrt(sqr_sum / N - mean * mean);
-  std::cout << "N = " << N << ", mean = " << mean << ", sd = " << sd
-            << std::endl;
-}
-
-int main(int argc, char** argv) {
-  if (!c10::ParseCommandLineFlags(&argc, &argv)) {
-    std::cout << "Failed to parse command line flags" << std::endl;
-    return -1;
-  }
-  caffe2::unsafeRunCaffe2InitFunction("registerThreadPools");
-  at::init_num_threads();
-
-  if (FLAGS_inter_op_threads > 0) {
-    at::set_num_interop_threads(FLAGS_inter_op_threads);
-  }
-  if (FLAGS_intra_op_threads > 0) {
-    at::set_num_threads(FLAGS_intra_op_threads);
-  }
-
-  TORCH_CHECK(FLAGS_task_type == "add" || FLAGS_task_type == "mm");
-  run_mm = FLAGS_task_type == "mm";
-
-  auto left = at::ones({FLAGS_tensor_dim, FLAGS_tensor_dim}, at::kFloat);
-  auto right = at::ones({FLAGS_tensor_dim, FLAGS_tensor_dim}, at::kFloat);
-
-  std::cout << "Launching " << pow(2, FLAGS_warmup_iter_pow)
-            << " warmup tasks" << std::endl;
-
-  typedef std::chrono::high_resolution_clock clock;
-  typedef std::chrono::milliseconds ms;
-
-  std::chrono::time_point<clock> start_time = clock::now();
-  launch_tasks_and_wait(left, right, FLAGS_warmup_iter_pow);
-  auto duration = static_cast<float>(
-      std::chrono::duration_cast<ms>(clock::now() - start_time).count());
-
-  std::cout << "Warmup time: " << duration << " ms." << std::endl;
-
-  std::cout << "Launching " << pow(2, FLAGS_iter_pow) << " tasks with "
-            << FLAGS_sub_iter << " subtasks each, using "
-            << at::get_num_interop_threads() << " inter-op threads and "
-            << at::get_num_threads() << " intra-op threads, "
-            << "tensor dim: " << FLAGS_tensor_dim
-            << ", task type: " << FLAGS_task_type << std::endl;
-
-  std::vector<float> runtimes;
-  for (auto bench_iter = 0; bench_iter < FLAGS_benchmark_iter; ++bench_iter) {
-    reset_extra_stats();
-    start_time = clock::now();
-    launch_tasks_and_wait(left, right, FLAGS_iter_pow);
-    duration = static_cast<float>(
-        std::chrono::duration_cast<ms>(clock::now() - start_time).count());
-    runtimes.push_back(duration);
-
-    if (FLAGS_extra_stats) {
-      print_extra_stats();
-    }
-
-    std::cout << "Runtime: " << duration << " ms." << std::endl;
-  }
-
-  print_runtime_stats(runtimes);
-
-  return 0;
-}
diff --git a/binaries/make_cifar_db.cc b/binaries/make_cifar_db.cc
deleted file mode 100644
index 3c62710..0000000
--- a/binaries/make_cifar_db.cc
+++ /dev/null
@@ -1,144 +0,0 @@
-/**
- * Copyright (c) 2016-present, Facebook, Inc.
- *
- * Licensed 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.
- */
-
-//
-// This script converts the CIFAR dataset to the leveldb format used
-// by caffe to perform classification.
-// Usage:
-//    convert_cifar_data input_folder output_db_file
-// The CIFAR dataset could be downloaded at
-//    http://www.cs.toronto.edu/~kriz/cifar.html
-
-#include <array>
-#include <fstream>  // NOLINT(readability/streams)
-#include <sstream>
-#include <string>
-
-#include "caffe2/core/common.h"
-#include "caffe2/core/db.h"
-#include "caffe2/core/init.h"
-#include "caffe2/proto/caffe2_pb.h"
-#include "caffe2/core/logging.h"
-
-C10_DEFINE_string(input_folder, "", "The input folder name.");
-C10_DEFINE_string(output_train_db_name, "", "The output training db name.");
-C10_DEFINE_string(output_test_db_name, "", "The output testing db name.");
-C10_DEFINE_string(db, "leveldb", "The db type.");
-C10_DEFINE_bool(
-    is_cifar100,
-    false,
-    "If set, convert cifar100. Otherwise do cifar10.");
-
-namespace caffe2 {
-
-using std::stringstream;
-
-const int kCIFARSize = 32;
-const int kCIFARImageNBytes = kCIFARSize * kCIFARSize * 3;
-const int kCIFAR10BatchSize = 10000;
-const int kCIFAR10TestDataSize = 10000;
-const int kCIFAR10TrainBatches = 5;
-
-const int kCIFAR100TrainDataSize = 50000;
-const int kCIFAR100TestDataSize = 10000;
-
-void ReadImage(std::ifstream* file, int* label, char* buffer) {
-  char label_char;
-  if (FLAGS_is_cifar100) {
-    // Skip the coarse label.
-    file->read(&label_char, 1);
-  }
-  file->read(&label_char, 1);
-  *label = label_char;
-  // Yes, there are better ways to do it, like in-place swap... but I am too
-  // lazy so let's just write it in a memory-wasteful way.
-  std::array<char, kCIFARImageNBytes> channel_first_storage;
-  file->read(channel_first_storage.data(), kCIFARImageNBytes);
-  for (int c = 0; c < 3; ++c) {
-    for (int i = 0; i < kCIFARSize * kCIFARSize; ++i) {
-      buffer[i * 3 + c] =
-          channel_first_storage[c * kCIFARSize * kCIFARSize + i];
-    }
-  }
-  return;
-}
-
-void WriteToDB(const string& filename, const int num_items,
-                    const int& offset, db::DB* db) {
-  TensorProtos protos;
-  TensorProto* data = protos.add_protos();
-  TensorProto* label = protos.add_protos();
-  data->set_data_type(TensorProto::BYTE);
-  data->add_dims(kCIFARSize);
-  data->add_dims(kCIFARSize);
-  data->add_dims(3);
-  label->set_data_type(TensorProto::INT32);
-  label->add_dims(1);
-  label->add_int32_data(0);
-
-  LOG(INFO) << "Converting file " << filename;
-  std::ifstream data_file(filename.c_str(),
-      std::ios::in | std::ios::binary);
-  CAFFE_ENFORCE(data_file, "Unable to open file ", filename);
-  char str_buffer[kCIFARImageNBytes];
-  int label_value;
-  std::unique_ptr<db::Transaction> transaction(db->NewTransaction());
-  for (int itemid = 0; itemid < num_items; ++itemid) {
-    ReadImage(&data_file, &label_value, str_buffer);
-    data->set_byte_data(str_buffer, kCIFARImageNBytes);
-    label->set_int32_data(0, label_value);
-    snprintf(str_buffer, kCIFARImageNBytes, "%05d",
-        offset + itemid);
-    transaction->Put(string(str_buffer), protos.SerializeAsString());
-  }
-}
-
-void ConvertCIFAR() {
-  std::unique_ptr<db::DB> train_db(
-      db::CreateDB(FLAGS_db, FLAGS_output_train_db_name, db::NEW));
-  std::unique_ptr<db::DB> test_db(
-      db::CreateDB(FLAGS_db, FLAGS_output_test_db_name, db::NEW));
-
-  if (!FLAGS_is_cifar100) {
-    // This is cifar 10.
-    for (int fileid = 0; fileid < kCIFAR10TrainBatches; ++fileid) {
-      stringstream train_file;
-      train_file << FLAGS_input_folder << "/data_batch_" << fileid + 1
-                 << ".bin";
-      WriteToDB(train_file.str(), kCIFAR10BatchSize,
-                fileid * kCIFAR10BatchSize, train_db.get());
-    }
-    stringstream test_file;
-    test_file << FLAGS_input_folder << "/test_batch.bin";
-    WriteToDB(test_file.str(), kCIFAR10TestDataSize, 0, test_db.get());
-  } else {
-    // This is cifar 100.
-    stringstream train_file;
-    train_file << FLAGS_input_folder << "/train.bin";
-    WriteToDB(train_file.str(), kCIFAR100TrainDataSize, 0, train_db.get());
-    stringstream test_file;
-    test_file << FLAGS_input_folder << "/test.bin";
-    WriteToDB(test_file.str(), kCIFAR100TestDataSize, 0, test_db.get());
-  }
-}
-
-}  // namespace caffe2
-
-int main(int argc, char** argv) {
-  caffe2::GlobalInit(&argc, &argv);
-  caffe2::ConvertCIFAR();
-  return 0;
-}
diff --git a/binaries/make_image_db.cc b/binaries/make_image_db.cc
deleted file mode 100644
index 3bbe15a..0000000
--- a/binaries/make_image_db.cc
+++ /dev/null
@@ -1,279 +0,0 @@
-/**
- * Copyright (c) 2016-present, Facebook, Inc.
- *
- * Licensed 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.
- */
-
-// This script converts an image dataset to a database.
-//
-// FLAGS_input_folder is the root folder that holds all the images
-//
-// FLAGS_list_file is the path to a file containing a list of files
-// and their labels, as follows:
-//
-//   subfolder1/file1.JPEG 7
-//   subfolder1/file2.JPEG 7
-//   subfolder2/file1.JPEG 8
-//   ...
-//
-
-#include <opencv2/opencv.hpp>
-
-#include <algorithm>
-#include <fstream>
-#include <queue>
-#include <random>
-#include <string>
-#include <thread>
-
-#include "caffe2/core/common.h"
-#include "caffe2/core/db.h"
-#include "caffe2/core/init.h"
-#include "caffe2/proto/caffe2_pb.h"
-#include "caffe2/core/logging.h"
-
-C10_DEFINE_bool(
-    shuffle,
-    false,
-    "Randomly shuffle the order of images and their labels");
-C10_DEFINE_string(input_folder, "", "The input image file name.");
-C10_DEFINE_string(
-    list_file,
-    "",
-    "The text file containing the list of images.");
-C10_DEFINE_string(output_db_name, "", "The output training leveldb name.");
-C10_DEFINE_string(db, "leveldb", "The db type.");
-C10_DEFINE_bool(
-    raw,
-    false,
-    "If set, we pre-read the images and store the raw buffer.");
-C10_DEFINE_bool(color, true, "If set, load images in color.");
-C10_DEFINE_int(
-    scale,
-    256,
-    "If FLAGS_raw is set, scale the shorter edge to the given value.");
-C10_DEFINE_bool(warp, false, "If warp is set, warp the images to square.");
-C10_DEFINE_int(
-    num_threads,
-    -1,
-    "Number of image parsing and conversion threads.");
-
-namespace caffe2 {
-
-class Converter {
- public:
-  explicit Converter() {
-    data_ = protos_.add_protos();
-    label_ = protos_.add_protos();
-    if (FLAGS_raw) {
-      data_->set_data_type(TensorProto::BYTE);
-      data_->add_dims(0);
-      data_->add_dims(0);
-      if (FLAGS_color) {
-        data_->add_dims(3);
-      }
-    } else {
-      data_->set_data_type(TensorProto::STRING);
-      data_->add_dims(1);
-      data_->add_string_data("");
-    }
-    label_->set_data_type(TensorProto::INT32);
-    label_->add_dims(1);
-    label_->add_int32_data(0);
-  }
-
-  ~Converter() {
-    if (thread_.joinable()) {
-      thread_.join();
-    }
-  }
-
-  void queue(const std::pair<std::string, int>& pair) {
-    in_.push(pair);
-  }
-
-  void start() {
-    thread_ = std::thread(&Converter::run, this);
-  }
-
-  std::string get() {
-    std::unique_lock<std::mutex> lock(mutex_);
-    while (out_.empty()) {
-      cv_.wait(lock);
-    }
-
-    auto value = out_.front();
-    out_.pop();
-    cv_.notify_one();
-    return value;
-  }
-
-  void run() {
-    const auto& input_folder = FLAGS_input_folder;
-    std::unique_lock<std::mutex> lock(mutex_);
-    std::string value;
-    while (!in_.empty()) {
-      auto pair = in_.front();
-      in_.pop();
-      lock.unlock();
-
-      label_->set_int32_data(0, pair.second);
-
-      // Add raw file contents to DB if !raw
-      if (!FLAGS_raw) {
-        std::ifstream image_file_stream(input_folder + pair.first);
-        if (!image_file_stream) {
-          LOG(ERROR) << "Cannot open " << input_folder << pair.first
-                     << ". Skipping.";
-        } else {
-          data_->mutable_string_data(0)->assign(
-              std::istreambuf_iterator<char>(image_file_stream),
-              std::istreambuf_iterator<char>());
-        }
-      } else {
-        // Load image
-        cv::Mat img = cv::imread(
-            input_folder + pair.first,
-            FLAGS_color ? cv::IMREAD_COLOR : cv::IMREAD_GRAYSCALE);
-
-        // Resize image
-        cv::Mat resized_img;
-        int scaled_width, scaled_height;
-        if (FLAGS_warp) {
-          scaled_width = FLAGS_scale;
-          scaled_height = FLAGS_scale;
-        } else if (img.rows > img.cols) {
-          scaled_width = FLAGS_scale;
-          scaled_height = static_cast<float>(img.rows) * FLAGS_scale / img.cols;
-        } else {
-          scaled_height = FLAGS_scale;
-          scaled_width = static_cast<float>(img.cols) * FLAGS_scale / img.rows;
-        }
-        cv::resize(
-            img,
-            resized_img,
-            cv::Size(scaled_width, scaled_height),
-            0,
-            0,
-            cv::INTER_LINEAR);
-        data_->set_dims(0, scaled_height);
-        data_->set_dims(1, scaled_width);
-
-        // Assert we don't have to deal with alignment
-        DCHECK(resized_img.isContinuous());
-        auto nbytes = resized_img.total() * resized_img.elemSize();
-        data_->set_byte_data(resized_img.ptr(), nbytes);
-      }
-
-      protos_.SerializeToString(&value);
-
-      // Add serialized proto to out queue or wait if it is not empty
-      lock.lock();
-      while (!out_.empty()) {
-        cv_.wait(lock);
-      }
-      out_.push(value);
-      cv_.notify_one();
-    }
-  }
-
- protected:
-  TensorProtos protos_;
-  TensorProto* data_;
-  TensorProto* label_;
-  std::queue<std::pair<std::string, int>> in_;
-  std::queue<std::string> out_;
-
-  std::mutex mutex_;
-  std::condition_variable cv_;
-  std::thread thread_;
-};
-
-void ConvertImageDataset(
-    const string& input_folder,
-    const string& list_filename,
-    const string& output_db_name,
-    const bool /*shuffle*/) {
-  std::ifstream list_file(list_filename);
-  std::vector<std::pair<std::string, int> > lines;
-  std::string filename;
-  int file_label;
-  while (list_file >> filename >> file_label) {
-    lines.push_back(std::make_pair(filename, file_label));
-  }
-
-  if (FLAGS_shuffle) {
-    LOG(INFO) << "Shuffling data";
-    std::shuffle(lines.begin(), lines.end(), std::default_random_engine(1701));
-  }
-
-  auto num_threads = FLAGS_num_threads;
-  if (num_threads < 1) {
-    num_threads = std::thread::hardware_concurrency();
-  }
-
-  LOG(INFO) << "Processing " << lines.size() << " images...";
-  LOG(INFO) << "Opening DB " << output_db_name;
-
-  auto db = db::CreateDB(FLAGS_db, output_db_name, db::NEW);
-  auto transaction = db->NewTransaction();
-
-  LOG(INFO) << "Using " << num_threads << " processing threads...";
-  std::vector<Converter> converters(num_threads);
-
-  // Queue entries across converters
-  for (auto i = 0; i < lines.size(); i++) {
-    converters[i % converters.size()].queue(lines[i]);
-  }
-
-  // Start all converters
-  for (auto& converter : converters) {
-    converter.start();
-  }
-
-  constexpr auto key_max_length = 256;
-  char key_cstr[key_max_length];
-  int count = 0;
-  for (auto i = 0; i < lines.size(); i++) {
-    // Get serialized proto for this entry
-    auto value = converters[i % converters.size()].get();
-
-    // Synthesize key for this entry
-    auto key_len = snprintf(
-        key_cstr, sizeof(key_cstr), "%08d_%s", i, lines[i].first.c_str());
-    TORCH_DCHECK_LE(key_len, sizeof(key_cstr));
-
-    // Put in db
-    transaction->Put(string(key_cstr), std::move(value));
-
-    if (++count % 1000 == 0) {
-      // Commit the current writes.
-      transaction->Commit();
-      LOG(INFO) << "Processed " << count << " files.";
-    }
-  }
-
-  // Commit final transaction
-  transaction->Commit();
-  LOG(INFO) << "Processed " << count << " files.";
-}
-
-}  // namespace caffe2
-
-
-int main(int argc, char** argv) {
-  caffe2::GlobalInit(&argc, &argv);
-  caffe2::ConvertImageDataset(
-      FLAGS_input_folder, FLAGS_list_file, FLAGS_output_db_name, FLAGS_shuffle);
-  return 0;
-}
diff --git a/binaries/make_mnist_db.cc b/binaries/make_mnist_db.cc
deleted file mode 100644
index 53e9d87..0000000
--- a/binaries/make_mnist_db.cc
+++ /dev/null
@@ -1,144 +0,0 @@
-/**
- * Copyright (c) 2016-present, Facebook, Inc.
- *
- * Licensed 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.
- */
-
-// This script converts the MNIST dataset to leveldb.
-// The MNIST dataset could be downloaded at
-//    http://yann.lecun.com/exdb/mnist/
-
-#include <fstream>  // NOLINT(readability/streams)
-#include <string>
-
-#include "caffe2/core/common.h"
-#include "caffe2/core/db.h"
-#include "caffe2/core/init.h"
-#include "caffe2/proto/caffe2_pb.h"
-#include "caffe2/core/logging.h"
-
-C10_DEFINE_string(image_file, "", "The input image file name.");
-C10_DEFINE_string(label_file, "", "The label file name.");
-C10_DEFINE_string(output_file, "", "The output db name.");
-C10_DEFINE_string(db, "leveldb", "The db type.");
-C10_DEFINE_int(
-    data_limit,
-    -1,
-    "If set, only output this number of data points.");
-C10_DEFINE_bool(
-    channel_first,
-    false,
-    "If set, write the data as channel-first (CHW order) as the old "
-    "Caffe does.");
-
-namespace caffe2 {
-uint32_t swap_endian(uint32_t val) {
-    val = ((val << 8) & 0xFF00FF00) | ((val >> 8) & 0xFF00FF);
-    return (val << 16) | (val >> 16);
-}
-
-void convert_dataset(const char* image_filename, const char* label_filename,
-        const char* db_path, const int data_limit) {
-  // Open files
-  std::ifstream image_file(image_filename, std::ios::in | std::ios::binary);
-  std::ifstream label_file(label_filename, std::ios::in | std::ios::binary);
-  CAFFE_ENFORCE(image_file, "Unable to open file ", image_filename);
-  CAFFE_ENFORCE(label_file, "Unable to open file ", label_filename);
-  // Read the magic and the meta data
-  uint32_t magic;
-  uint32_t num_items;
-  uint32_t num_labels;
-  uint32_t rows;
-  uint32_t cols;
-
-  image_file.read(reinterpret_cast<char*>(&magic), 4);
-  magic = swap_endian(magic);
-  if (magic == 529205256) {
-    LOG(FATAL) <<
-        "It seems that you forgot to unzip the mnist dataset. You should "
-        "first unzip them using e.g. gunzip on Linux.";
-  }
-  CAFFE_ENFORCE_EQ(magic, 2051, "Incorrect image file magic.");
-  label_file.read(reinterpret_cast<char*>(&magic), 4);
-  magic = swap_endian(magic);
-  CAFFE_ENFORCE_EQ(magic, 2049, "Incorrect label file magic.");
-  image_file.read(reinterpret_cast<char*>(&num_items), 4);
-  num_items = swap_endian(num_items);
-  label_file.read(reinterpret_cast<char*>(&num_labels), 4);
-  num_labels = swap_endian(num_labels);
-  CAFFE_ENFORCE_EQ(num_items, num_labels);
-  image_file.read(reinterpret_cast<char*>(&rows), 4);
-  rows = swap_endian(rows);
-  image_file.read(reinterpret_cast<char*>(&cols), 4);
-  cols = swap_endian(cols);
-
-  // leveldb
-  std::unique_ptr<db::DB> mnist_db(db::CreateDB(FLAGS_db, db_path, db::NEW));
-  std::unique_ptr<db::Transaction> transaction(mnist_db->NewTransaction());
-  // Storing to db
-  char label_value;
-  std::vector<char> pixels(rows * cols);
-  int count = 0;
-  const int kMaxKeyLength = 11;
-  char key_cstr[kMaxKeyLength];
-
-  TensorProtos protos;
-  TensorProto* data = protos.add_protos();
-  TensorProto* label = protos.add_protos();
-  data->set_data_type(TensorProto::BYTE);
-  if (FLAGS_channel_first) {
-    data->add_dims(1);
-    data->add_dims(rows);
-    data->add_dims(cols);
-  } else {
-    data->add_dims(rows);
-    data->add_dims(cols);
-    data->add_dims(1);
-  }
-  label->set_data_type(TensorProto::INT32);
-  label->add_int32_data(0);
-
-  LOG(INFO) << "A total of " << num_items << " items.";
-  LOG(INFO) << "Rows: " << rows << " Cols: " << cols;
-  for (int item_id = 0; item_id < num_items; ++item_id) {
-    image_file.read(pixels.data(), rows * cols);
-    label_file.read(&label_value, 1);
-    for (int i = 0; i < rows * cols; ++i) {
-      data->set_byte_data(pixels.data(), rows * cols);
-    }
-    label->set_int32_data(0, static_cast<int>(label_value));
-    snprintf(key_cstr, kMaxKeyLength, "%08d", item_id);
-    string keystr(key_cstr);
-
-    // Put in db
-    transaction->Put(keystr, protos.SerializeAsString());
-    if (++count % 1000 == 0) {
-      transaction->Commit();
-    }
-    if (data_limit > 0 && count == data_limit) {
-      LOG(INFO) << "Reached data limit of " << data_limit << ", stop.";
-      break;
-    }
-  }
-}
-}  // namespace caffe2
-
-int main(int argc, char** argv) {
-  caffe2::GlobalInit(&argc, &argv);
-  caffe2::convert_dataset(
-      FLAGS_image_file.c_str(),
-      FLAGS_label_file.c_str(),
-      FLAGS_output_file.c_str(),
-      FLAGS_data_limit);
-  return 0;
-}
diff --git a/binaries/predictor_verifier.cc b/binaries/predictor_verifier.cc
deleted file mode 100644
index 47332dd..0000000
--- a/binaries/predictor_verifier.cc
+++ /dev/null
@@ -1,57 +0,0 @@
-/**
- * Copyright (c) 2016-present, Facebook, Inc.
- *
- * Licensed 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.
- */
-
-#include "caffe2/core/flags.h"
-#include "caffe2/core/init.h"
-#include "caffe2/predictor/predictor.h"
-#include "caffe2/utils/proto_utils.h"
-
-C10_DEFINE_string(init_net, "", "The given path to the init protobuffer.");
-C10_DEFINE_string(
-    predict_net,
-    "",
-    "The given path to the predict protobuffer.");
-
-namespace caffe2 {
-
-void run() {
-  if (FLAGS_init_net.empty()) {
-    LOG(FATAL) << "No init net specified. Use --init_net=/path/to/net.";
-  }
-  if (FLAGS_predict_net.empty()) {
-    LOG(FATAL) << "No predict net specified. Use --predict_net=/path/to/net.";
-  }
-  caffe2::NetDef init_net, predict_net;
-  CAFFE_ENFORCE(ReadProtoFromFile(FLAGS_init_net, &init_net));
-  CAFFE_ENFORCE(ReadProtoFromFile(FLAGS_predict_net, &predict_net));
-  // Can be large due to constant fills
-  VLOG(1) << "Init net: " << ProtoDebugString(init_net);
-  LOG(INFO) << "Predict net: " << ProtoDebugString(predict_net);
-  auto predictor = std::make_unique<Predictor>(init_net, predict_net);
-  LOG(INFO) << "Checking that a null forward-pass works";
-  Predictor::TensorList inputVec, outputVec;
-  (*predictor)(inputVec, &outputVec);
-  CAFFE_ENFORCE_GT(outputVec.size(), 0);
-}
-}
-
-int main(int argc, char** argv) {
-  caffe2::GlobalInit(&argc, &argv);
-  caffe2::run();
-  // This is to allow us to use memory leak checks.
-  caffe2::ShutdownProtobufLibrary();
-  return 0;
-}
diff --git a/binaries/print_registered_core_operators.cc b/binaries/print_registered_core_operators.cc
deleted file mode 100644
index a96af0d..0000000
--- a/binaries/print_registered_core_operators.cc
+++ /dev/null
@@ -1,70 +0,0 @@
-/**
- * Copyright (c) 2016-present, Facebook, Inc.
- *
- * Licensed 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.
- */
-
-#include <iostream>
-#include <string>
-
-#include "caffe2/core/init.h"
-#include "caffe2/core/operator.h"
-#include "caffe2/core/operator_schema.h"
-
-C10_DEFINE_string(schema, "", "Print doc and schema of a particular operator");
-
-static bool HasSchema(const std::string& str) {
-  return caffe2::OpSchemaRegistry::Schema(str);
-}
-
-static bool HasDoc(const std::string& str) {
-  const auto* schema = caffe2::OpSchemaRegistry::Schema(str);
-  return (schema != nullptr) && (schema->doc() != nullptr);
-}
-
-int main(int argc, char** argv) {
-  caffe2::GlobalInit(&argc, &argv);
-
-  if (!FLAGS_schema.empty()) {
-    const auto* schema = caffe2::OpSchemaRegistry::Schema(FLAGS_schema);
-    if (!schema) {
-      std::cerr << "Operator " << FLAGS_schema << " doesn't have a schema"
-                << std::endl;
-      return 1;
-    }
-    std::cout << "Operator " << FLAGS_schema << ": " << std::endl << *schema;
-    return 0;
-  }
-
-  for (const auto& pair : *caffe2::gDeviceTypeRegistry()) {
-    std::cout << "Device type " << pair.first
-#ifndef CAFFE2_USE_LITE_PROTO
-              << " ("
-              << at::DeviceTypeName(static_cast<caffe2::DeviceType>(pair.first))
-              << ")"
-#endif
-              << std::endl;
-    for (const auto& key : pair.second->Keys()) {
-      std::cout << "\t(schema: " << HasSchema(key) << ", doc: " << HasDoc(key)
-                << ")\t" << key << std::endl;
-    }
-  }
-
-  std::cout << "Operators that have gradients registered:" << std::endl;
-  for (const auto& key : caffe2::GradientRegistry()->Keys()) {
-    std::cout << "\t(schema: " << HasSchema(key) << ", doc: "
-              << HasDoc(key) << ")\t"
-              << key << std::endl;
-  }
-  return 0;
-}
diff --git a/binaries/run_plan.cc b/binaries/run_plan.cc
deleted file mode 100644
index c5d467b..0000000
--- a/binaries/run_plan.cc
+++ /dev/null
@@ -1,40 +0,0 @@
-/**
- * Copyright (c) 2016-present, Facebook, Inc.
- *
- * Licensed 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.
- */
-
-#include "caffe2/core/init.h"
-#include "caffe2/core/operator.h"
-#include "caffe2/proto/caffe2_pb.h"
-#include "caffe2/utils/proto_utils.h"
-#include "caffe2/core/logging.h"
-
-C10_DEFINE_string(plan, "", "The given path to the plan protobuffer.");
-
-int main(int argc, char** argv) {
-  caffe2::GlobalInit(&argc, &argv);
-  if (FLAGS_plan.size() == 0) {
-    LOG(ERROR) << "No plan specified. Use --plan=/path/to/plan.";
-    return 0;
-  }
-  LOG(INFO) << "Loading plan: " << FLAGS_plan;
-  caffe2::PlanDef plan_def;
-  CAFFE_ENFORCE(ReadProtoFromFile(FLAGS_plan, &plan_def));
-  std::unique_ptr<caffe2::Workspace> workspace(new caffe2::Workspace());
-  workspace->RunPlan(plan_def);
-
-  // This is to allow us to use memory leak checks.
-  caffe2::ShutdownProtobufLibrary();
-  return 0;
-}
diff --git a/binaries/run_plan_mpi.cc b/binaries/run_plan_mpi.cc
deleted file mode 100644
index 476aec1..0000000
--- a/binaries/run_plan_mpi.cc
+++ /dev/null
@@ -1,49 +0,0 @@
-/**
- * Copyright (c) 2016-present, Facebook, Inc.
- *
- * Licensed 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.
- */
-
-#include <mpi.h>
-
-#include "c10/util/Flags.h"
-#include "caffe2/core/init.h"
-#include "caffe2/core/logging.h"
-#include "caffe2/core/operator.h"
-#include "caffe2/proto/caffe2_pb.h"
-#include "caffe2/utils/proto_utils.h"
-
-C10_DEFINE_string(plan, "", "The given path to the plan protobuffer.");
-
-int main(int argc, char** argv) {
-  c10::SetUsageMessage("Runs a caffe2 plan that has MPI operators in it.");
-  int mpi_ret;
-  MPI_Init_thread(&argc, &argv, MPI_THREAD_MULTIPLE, &mpi_ret);
-  if (mpi_ret != MPI_THREAD_MULTIPLE &&
-      mpi_ret != MPI_THREAD_SERIALIZED) {
-    std::cerr << "Caffe2 MPI requires the underlying MPI to support the "
-                 "MPI_THREAD_SERIALIZED or MPI_THREAD_MULTIPLE mode.\n";
-    return 1;
-  }
-  caffe2::GlobalInit(&argc, &argv);
-  LOG(INFO) << "Loading plan: " << FLAGS_plan;
-  caffe2::PlanDef plan_def;
-  CAFFE_ENFORCE(ReadProtoFromFile(FLAGS_plan, &plan_def));
-  std::unique_ptr<caffe2::Workspace> workspace(new caffe2::Workspace());
-  workspace->RunPlan(plan_def);
-
-  // This is to allow us to use memory leak checks.
-  caffe2::ShutdownProtobufLibrary();
-  MPI_Finalize();
-  return 0;
-}
diff --git a/binaries/speed_benchmark.cc b/binaries/speed_benchmark.cc
deleted file mode 100644
index 6028cef..0000000
--- a/binaries/speed_benchmark.cc
+++ /dev/null
@@ -1,210 +0,0 @@
-/**
- * Copyright (c) 2016-present, Facebook, Inc.
- *
- * Licensed 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.
- */
-
-#include <string>
-
-#include "caffe2/core/blob_serialization.h"
-#include "caffe2/core/init.h"
-#include "caffe2/core/logging.h"
-#include "caffe2/core/operator.h"
-#include "caffe2/core/tensor_int8.h"
-#ifdef CAFFE2_OPTIMIZER
-#include "caffe2/opt/optimizer.h"
-#endif
-#include "caffe2/proto/caffe2_pb.h"
-#include "caffe2/utils/proto_utils.h"
-#include "caffe2/utils/string_utils.h"
-
-C10_DEFINE_string(net, "", "The given net to benchmark.");
-C10_DEFINE_string(init_net, "", "The given net to initialize any parameters.");
-C10_DEFINE_string(
-    input,
-    "",
-    "Input that is needed for running the network. If "
-    "multiple input needed, use comma separated string.");
-C10_DEFINE_string(
-    input_file,
-    "",
-    "Input file that contain the serialized protobuf for "
-    "the input blobs. If multiple input needed, use comma "
-    "separated string. Must have the same number of items "
-    "as input does.");
-C10_DEFINE_string(
-    input_dims,
-    "",
-    "Alternate to input_files, if all inputs are simple "
-    "float TensorCPUs, specify the dimension using comma "
-    "separated numbers. If multiple input needed, use "
-    "semicolon to separate the dimension of different "
-    "tensors.");
-C10_DEFINE_string(input_type, "", "Input type (uint8_t/float)");
-C10_DEFINE_string(
-    output,
-    "",
-    "Output that should be dumped after the execution "
-    "finishes. If multiple outputs are needed, use comma "
-    "separated string. If you want to dump everything, pass "
-    "'*' as the output value.");
-C10_DEFINE_string(
-    output_folder,
-    "",
-    "The folder that the output should be written to. This "
-    "folder must already exist in the file system.");
-C10_DEFINE_int(warmup, 0, "The number of iterations to warm up.");
-C10_DEFINE_int(iter, 10, "The number of iterations to run.");
-C10_DEFINE_int(opt, 0, "The level of optimization to run automatically.");
-C10_DEFINE_bool(
-    run_individual,
-    false,
-    "Whether to benchmark individual operators.");
-
-C10_DEFINE_bool(force_engine, false, "Force engine field for all operators");
-C10_DEFINE_string(engine, "", "Forced engine field value");
-C10_DEFINE_bool(force_algo, false, "Force algo arg for all operators");
-C10_DEFINE_string(algo, "", "Forced algo arg value");
-
-using std::string;
-using std::unique_ptr;
-using std::vector;
-
-int main(int argc, char** argv) {
-  caffe2::GlobalInit(&argc, &argv);
-  unique_ptr<caffe2::Workspace> workspace(new caffe2::Workspace());
-
-  // Run initialization network.
-  caffe2::NetDef net_def;
-  CAFFE_ENFORCE(ReadProtoFromFile(FLAGS_init_net, &net_def));
-  CAFFE_ENFORCE(workspace->RunNetOnce(net_def));
-
-  // Load input.
-  if (FLAGS_input.size()) {
-    vector<string> input_names = caffe2::split(',', FLAGS_input);
-    if (FLAGS_input_file.size()) {
-      vector<string> input_files = caffe2::split(',', FLAGS_input_file);
-      CAFFE_ENFORCE_EQ(
-          input_names.size(),
-          input_files.size(),
-          "Input name and file should have the same number.");
-      for (int i = 0; i < input_names.size(); ++i) {
-        caffe2::BlobProto blob_proto;
-        CAFFE_ENFORCE(caffe2::ReadProtoFromFile(input_files[i], &blob_proto));
-        DeserializeBlob(blob_proto, workspace->CreateBlob(input_names[i]));
-      }
-    } else if (FLAGS_input_dims.size() || FLAGS_input_type.size()) {
-      CAFFE_ENFORCE_GE(
-          FLAGS_input_dims.size(),
-          0,
-          "Input dims must be specified when input tensors are used.");
-      CAFFE_ENFORCE_GE(
-          FLAGS_input_type.size(),
-          0,
-          "Input type must be specified when input tensors are used.");
-
-      vector<string> input_dims_list = caffe2::split(';', FLAGS_input_dims);
-      CAFFE_ENFORCE_EQ(
-          input_names.size(),
-          input_dims_list.size(),
-          "Input name and dims should have the same number of items.");
-      vector<string> input_type_list = caffe2::split(';', FLAGS_input_type);
-      CAFFE_ENFORCE_EQ(
-          input_names.size(),
-          input_type_list.size(),
-          "Input name and type should have the same number of items.");
-      for (size_t i = 0; i < input_names.size(); ++i) {
-        vector<string> input_dims_str = caffe2::split(',', input_dims_list[i]);
-        vector<int> input_dims;
-        for (const string& s : input_dims_str) {
-          input_dims.push_back(std::stoi(s));
-        }
-        caffe2::Blob* blob = workspace->GetBlob(input_names[i]);
-        if (blob == nullptr) {
-          blob = workspace->CreateBlob(input_names[i]);
-        }
-        if (input_type_list[i] == "uint8_t") {
-          caffe2::int8::Int8TensorCPU* tensor =
-              blob->GetMutable<caffe2::int8::Int8TensorCPU>();
-          TORCH_CHECK_NOTNULL(tensor);
-          tensor->t.Resize(input_dims);
-          tensor->t.mutable_data<uint8_t>();
-        } else if (input_type_list[i] == "float") {
-          caffe2::TensorCPU* tensor = BlobGetMutableTensor(blob, caffe2::CPU);
-          TORCH_CHECK_NOTNULL(tensor);
-          tensor->Resize(input_dims);
-          tensor->mutable_data<float>();
-        } else {
-          CAFFE_THROW("Unsupported input type: ", input_type_list[i]);
-        }
-      }
-    } else {
-      CAFFE_THROW(
-          "You requested input tensors, but neither input_file nor "
-          "input_dims is set.");
-    }
-  }
-
-  // Run main network.
-  CAFFE_ENFORCE(ReadProtoFromFile(FLAGS_net, &net_def));
-  if (!net_def.has_name()) {
-    net_def.set_name("benchmark");
-  }
-  // force changing engine and algo
-  if (FLAGS_force_engine) {
-    LOG(INFO) << "force engine be: " << FLAGS_engine;
-    for (const auto& op : net_def.op()) {
-      const_cast<caffe2::OperatorDef*>(&op)->set_engine(FLAGS_engine);
-    }
-  }
-  if (FLAGS_force_algo) {
-    LOG(INFO) << "force algo be: " << FLAGS_algo;
-    for (const auto& op : net_def.op()) {
-      caffe2::GetMutableArgument(
-          "algo", true, const_cast<caffe2::OperatorDef*>(&op))
-          ->set_s(FLAGS_algo);
-    }
-  }
-  if (FLAGS_opt) {
-#ifdef CAFFE2_OPTIMIZER
-    net_def = caffe2::opt::optimize(net_def, workspace.get(), FLAGS_opt);
-#else
-    LOG(WARNING) << "Caffe2 not compiled with optimization passes.";
-#endif
-  }
-
-  caffe2::NetBase* net = workspace->CreateNet(net_def);
-  TORCH_CHECK_NOTNULL(net);
-  CAFFE_ENFORCE(net->Run());
-  net->TEST_Benchmark(FLAGS_warmup, FLAGS_iter, FLAGS_run_individual);
-
-  string output_prefix =
-      FLAGS_output_folder.size() ? FLAGS_output_folder + "/" : "";
-  if (FLAGS_output.size()) {
-    vector<string> output_names = caffe2::split(',', FLAGS_output);
-    if (FLAGS_output == "*") {
-      output_names = workspace->Blobs();
-    }
-    for (const string& name : output_names) {
-      CAFFE_ENFORCE(
-          workspace->HasBlob(name),
-          "You requested a non-existing blob: ",
-          name);
-      string serialized = SerializeBlob(*workspace->GetBlob(name), name);
-      string output_filename = output_prefix + name;
-      caffe2::WriteStringToFile(serialized, output_filename.c_str());
-    }
-  }
-
-  return 0;
-}
diff --git a/binaries/split_db.cc b/binaries/split_db.cc
deleted file mode 100644
index 34c0b60..0000000
--- a/binaries/split_db.cc
+++ /dev/null
@@ -1,77 +0,0 @@
-/**
- * Copyright (c) 2016-present, Facebook, Inc.
- *
- * Licensed 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.
- */
-
-#include <string>
-#include <sstream>
-
-#include "caffe2/core/db.h"
-#include "caffe2/core/init.h"
-#include "caffe2/proto/caffe2_pb.h"
-#include "caffe2/core/logging.h"
-
-C10_DEFINE_string(input_db, "", "The input db.");
-C10_DEFINE_int(splits, 0, "The number of splits.");
-C10_DEFINE_string(db_type, "", "The db type.");
-C10_DEFINE_int(batch_size, 1000, "The write batch size.");
-
-namespace caffe2 {
-
-static int Split(int argc, char** argv) {
-  GlobalInit(&argc, &argv);
-
-  CAFFE_ENFORCE(FLAGS_input_db.size(), "Must specify --input_db=/path/to/db.");
-  CAFFE_ENFORCE(FLAGS_splits > 0, "Must specify a nonnegative split number.");
-  CAFFE_ENFORCE(FLAGS_db_type.size(), "Must specify --db_type=[a db type].");
-
-  unique_ptr<db::DB> in_db(
-      db::CreateDB(FLAGS_db_type, FLAGS_input_db, db::READ));
-  CAFFE_ENFORCE(in_db != nullptr, "Cannot open input db: ", FLAGS_input_db);
-  unique_ptr<db::Cursor> cursor(in_db->NewCursor());
-  // This usually won't happen, but FWIW.
-  CAFFE_ENFORCE(
-      cursor != nullptr, "Cannot obtain cursor for input db: ", FLAGS_input_db);
-
-  vector<unique_ptr<db::DB>> out_dbs;
-  vector<unique_ptr<db::Transaction>> transactions;
-  for (int i = 0; i < FLAGS_splits; ++i) {
-    out_dbs.push_back(unique_ptr<db::DB>(db::CreateDB(
-        FLAGS_db_type, FLAGS_input_db + "_split_" + to_string(i), db::NEW)));
-    CAFFE_ENFORCE(out_dbs.back().get(), "Cannot create output db #", i);
-    transactions.push_back(
-        unique_ptr<db::Transaction>(out_dbs[i]->NewTransaction()));
-    CAFFE_ENFORCE(
-        transactions.back().get(), "Cannot get transaction for output db #", i);
-  }
-
-  int count = 0;
-  for (; cursor->Valid(); cursor->Next()) {
-    transactions[count % FLAGS_splits]->Put(cursor->key(), cursor->value());
-    if (++count % FLAGS_batch_size == 0) {
-      for (int i = 0; i < FLAGS_splits; ++i) {
-        transactions[i]->Commit();
-      }
-      LOG(INFO) << "Split " << count << " items so far.";
-    }
-  }
-  LOG(INFO) << "A total of " << count << " items processed.";
-  return 0;
-}
-
-} // namespace caffe2
-
-int main(int argc, char** argv) {
-  return caffe2::Split(argc, argv);
-}
diff --git a/binaries/tutorial_blob.cc b/binaries/tutorial_blob.cc
deleted file mode 100644
index ac74ebb..0000000
--- a/binaries/tutorial_blob.cc
+++ /dev/null
@@ -1,89 +0,0 @@
-/**
- * Copyright (c) 2016-present, Facebook, Inc.
- *
- * Licensed 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.
- */
-
-#include "caffe2/core/blob.h"
-#include "caffe2/core/init.h"
-#include "caffe2/core/tensor.h"
-#include "caffe2/core/logging.h"
-
-// We will be lazy and just use the whole namespace.
-using namespace caffe2;
-
-
-int main(int argc, char** argv) {
-  caffe2::GlobalInit(&argc, &argv);
-  caffe2::ShowLogInfoToStderr();
-
-  LOG(INFO) <<
-      "This script corresponds to the Blob part of the Caffe2 C++ "
-      "tutorial.";
-
-  LOG(INFO) << "Let's create a blob myblob.";
-
-  Blob myblob;
-
-  LOG(INFO) << "Let's set it to int and set the value to 10.";
-
-  int* myint = myblob.GetMutable<int>();
-  *myint = 10;
-
-  LOG(INFO)
-      << "Is the blob type int? "
-      << myblob.IsType<int>();
-
-  LOG(INFO)
-      << "Is the blob type float? "
-      << myblob.IsType<float>();
-
-  const int& myint_const = myblob.Get<int>();
-  LOG(INFO)
-      << "The value of the int number stored in the blob is: "
-      << myint_const;
-
-  LOG(INFO)
-      << "Let's try to get a float pointer. This will trigger an exception.";
-
-  try {
-    const float& myfloat = myblob.Get<float>();
-    LOG(FATAL) << "This line should never happen.";
-  } catch (std::exception& e) {
-    LOG(INFO)
-        << "As expected, we got an exception. Its content says: "
-        << e.what();
-  }
-
-  LOG(INFO) <<
-      "However, we can change the content type (and destroy the old "
-      "content) by calling GetMutable. Let's change it to double.";
-
-  double* mydouble = myblob.GetMutable<double>();
-  *mydouble = 3.14;
-
-  LOG(INFO) << "The new content is: " << myblob.Get<double>();
-
-  LOG(INFO) <<
-      "If we have a pre-created object, we can use Reset() to transfer the "
-      "object to a blob.";
-
-  std::string* pvec = new std::string();
-  myblob.Reset(pvec); // no need to release pvec, myblob takes ownership.
-
-  LOG(INFO) << "Is the blob now of type string? "
-            << myblob.IsType<std::string>();
-
-  LOG(INFO) << "This concludes the blob tutorial.";
-  return 0;
-}
diff --git a/binaries/zmq_feeder.cc b/binaries/zmq_feeder.cc
deleted file mode 100644
index 8a6a71f..0000000
--- a/binaries/zmq_feeder.cc
+++ /dev/null
@@ -1,63 +0,0 @@
-/**
- * Copyright (c) 2016-present, Facebook, Inc.
- *
- * Licensed 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.
- */
-
-// This binary provides an easy way to open a zeromq server and feeds data to
-// clients connect to it. It uses the Caffe2 db as the backend, thus allowing
-// one to convert any db-compliant storage to a zeromq service.
-
-#include "caffe2/core/db.h"
-#include "caffe2/core/init.h"
-#include "caffe2/core/logging.h"
-#include "caffe2/utils/zmq_helper.h"
-
-C10_DEFINE_string(server, "tcp://*:5555", "The server address.");
-C10_DEFINE_string(input_db, "", "The input db.");
-C10_DEFINE_string(input_db_type, "", "The input db type.");
-
-
-int main(int argc, char** argv) {
-  caffe2::GlobalInit(&argc, &argv);
-
-  LOG(INFO) << "Opening DB...";
-  auto in_db = caffe2::db::CreateDB(
-      FLAGS_input_db_type, FLAGS_input_db, caffe2::db::READ);
-  CAFFE_ENFORCE(
-      in_db,
-      "Cannot load input db " + FLAGS_input_db + " of expected type " +
-          FLAGS_input_db_type);
-  auto cursor = in_db->NewCursor();
-  LOG(INFO) << "DB opened.";
-
-  LOG(INFO) << "Starting ZeroMQ server...";
-
-  //  Socket to talk to clients
-  caffe2::ZmqSocket sender(ZMQ_PUSH);
-  sender.Bind(FLAGS_server);
-  LOG(INFO) << "Server created at " << FLAGS_server;
-
-  while (1) {
-    VLOG(1) << "Sending " << cursor->key();
-    sender.SendTillSuccess(cursor->key(), ZMQ_SNDMORE);
-    sender.SendTillSuccess(cursor->value(), 0);
-    cursor->Next();
-    if (!cursor->Valid()) {
-      cursor->SeekToFirst();
-    }
-  }
-  // We do not do an elegant quit since this binary is going to be terminated by
-  // control+C.
-  return 0;
-}
diff --git a/caffe2/CMakeLists.txt b/caffe2/CMakeLists.txt
index bcd171f..569bc01 100644
--- a/caffe2/CMakeLists.txt
+++ b/caffe2/CMakeLists.txt
@@ -122,8 +122,6 @@
   if(USE_NVRTC)
     add_subdirectory(cuda_rtc)
   endif()
-  add_subdirectory(db)
-  add_subdirectory(distributed)
   add_subdirectory(ideep)
   add_subdirectory(mobile)
   add_subdirectory(mpi)
diff --git a/cmake/Dependencies.cmake b/cmake/Dependencies.cmake
index a8313f2..3000e2d 100644
--- a/cmake/Dependencies.cmake
+++ b/cmake/Dependencies.cmake
@@ -865,18 +865,6 @@
   caffe2_update_option(USE_FAKELOWP OFF)
 endif()
 
-# ---[ LMDB
-if(USE_LMDB)
-  find_package(LMDB)
-  if(LMDB_FOUND)
-    include_directories(SYSTEM ${LMDB_INCLUDE_DIR})
-    list(APPEND Caffe2_DEPENDENCY_LIBS ${LMDB_LIBRARIES})
-  else()
-    message(WARNING "Not compiling with LMDB. Suppress this warning with -DUSE_LMDB=OFF")
-    caffe2_update_option(USE_LMDB OFF)
-  endif()
-endif()
-
 if(USE_OPENCL)
   message(INFO "USING OPENCL")
   find_package(OpenCL REQUIRED)
@@ -884,22 +872,6 @@
   list(APPEND Caffe2_DEPENDENCY_LIBS ${OpenCL_LIBRARIES})
 endif()
 
-# ---[ LevelDB
-# ---[ Snappy
-if(USE_LEVELDB)
-  find_package(LevelDB)
-  find_package(Snappy)
-  if(LEVELDB_FOUND AND SNAPPY_FOUND)
-    include_directories(SYSTEM ${LevelDB_INCLUDE})
-    list(APPEND Caffe2_DEPENDENCY_LIBS ${LevelDB_LIBRARIES})
-    include_directories(SYSTEM ${Snappy_INCLUDE_DIR})
-    list(APPEND Caffe2_DEPENDENCY_LIBS ${Snappy_LIBRARIES})
-  else()
-    message(WARNING "Not compiling with LevelDB. Suppress this warning with -DUSE_LEVELDB=OFF")
-    caffe2_update_option(USE_LEVELDB OFF)
-  endif()
-endif()
-
 # ---[ NUMA
 if(USE_NUMA)
   if(LINUX)
@@ -914,30 +886,6 @@
   endif()
 endif()
 
-# ---[ ZMQ
-if(USE_ZMQ)
-  find_package(ZMQ)
-  if(ZMQ_FOUND)
-    include_directories(SYSTEM ${ZMQ_INCLUDE_DIR})
-    list(APPEND Caffe2_DEPENDENCY_LIBS ${ZMQ_LIBRARIES})
-  else()
-    message(WARNING "Not compiling with ZMQ. Suppress this warning with -DUSE_ZMQ=OFF")
-    caffe2_update_option(USE_ZMQ OFF)
-  endif()
-endif()
-
-# ---[ Redis
-if(USE_REDIS)
-  find_package(Hiredis)
-  if(HIREDIS_FOUND)
-    include_directories(SYSTEM ${Hiredis_INCLUDE})
-    list(APPEND Caffe2_DEPENDENCY_LIBS ${Hiredis_LIBRARIES})
-  else()
-    message(WARNING "Not compiling with Redis. Suppress this warning with -DUSE_REDIS=OFF")
-    caffe2_update_option(USE_REDIS OFF)
-  endif()
-endif()
-
 if(USE_ITT)
   find_package(ITT)
   if(ITT_FOUND)
diff --git a/cmake/Modules/FindHiredis.cmake b/cmake/Modules/FindHiredis.cmake
deleted file mode 100644
index f1389de..0000000
--- a/cmake/Modules/FindHiredis.cmake
+++ /dev/null
@@ -1,23 +0,0 @@
-# Find the Hiredis libraries
-#
-# The following variables are optionally searched for defaults
-#  HIREDIS_ROOT_DIR:    Base directory where all Hiredis components are found
-#
-# The following are set after configuration is done:
-#  HIREDIS_FOUND
-#  Hiredis_INCLUDE_DIR
-#  Hiredis_LIBRARIES
-
-find_path(Hiredis_INCLUDE_DIR NAMES hiredis/hiredis.h
-                             PATHS ${HIREDIS_ROOT_DIR} ${HIREDIS_ROOT_DIR}/include)
-
-find_library(Hiredis_LIBRARIES NAMES hiredis
-                              PATHS ${HIREDIS_ROOT_DIR} ${HIREDIS_ROOT_DIR}/lib)
-
-include(FindPackageHandleStandardArgs)
-find_package_handle_standard_args(Hiredis DEFAULT_MSG Hiredis_INCLUDE_DIR Hiredis_LIBRARIES)
-
-if(HIREDIS_FOUND)
-  message(STATUS "Found Hiredis  (include: ${Hiredis_INCLUDE_DIR}, library: ${Hiredis_LIBRARIES})")
-  mark_as_advanced(Hiredis_INCLUDE_DIR Hiredis_LIBRARIES)
-endif()
diff --git a/cmake/Modules/FindLMDB.cmake b/cmake/Modules/FindLMDB.cmake
deleted file mode 100644
index 2f0adb1..0000000
--- a/cmake/Modules/FindLMDB.cmake
+++ /dev/null
@@ -1,32 +0,0 @@
-# Try to find the LMBD libraries and headers
-#  LMDB_FOUND - system has LMDB lib
-#  LMDB_INCLUDE_DIR - the LMDB include directory
-#  LMDB_LIBRARIES - Libraries needed to use LMDB
-
-# FindCWD based on FindGMP by:
-# Copyright (c) 2006, Laurent Montel, <montel@kde.org>
-#
-# Redistribution and use is allowed according to the terms of the BSD license.
-
-# Adapted from FindCWD by:
-# Copyright 2013 Conrad Steenberg <conrad.steenberg@gmail.com>
-# Aug 31, 2013
-
-if(MSVC)
-  find_package(LMDB NO_MODULE)
-else()
-  find_path(LMDB_INCLUDE_DIR NAMES  lmdb.h PATHS "$ENV{LMDB_DIR}/include")
-  find_library(LMDB_LIBRARIES NAMES lmdb   PATHS "$ENV{LMDB_DIR}/lib" )
-endif()
-
-include(FindPackageHandleStandardArgs)
-find_package_handle_standard_args(LMDB DEFAULT_MSG LMDB_INCLUDE_DIR LMDB_LIBRARIES)
-
-if(LMDB_FOUND)
-  message(STATUS "Found lmdb    (include: ${LMDB_INCLUDE_DIR}, library: ${LMDB_LIBRARIES})")
-  mark_as_advanced(LMDB_INCLUDE_DIR LMDB_LIBRARIES)
-
-  caffe_parse_header(${LMDB_INCLUDE_DIR}/lmdb.h
-                     LMDB_VERSION_LINES MDB_VERSION_MAJOR MDB_VERSION_MINOR MDB_VERSION_PATCH)
-  set(LMDB_VERSION "${MDB_VERSION_MAJOR}.${MDB_VERSION_MINOR}.${MDB_VERSION_PATCH}")
-endif()
diff --git a/cmake/Modules/FindLevelDB.cmake b/cmake/Modules/FindLevelDB.cmake
deleted file mode 100644
index 320c246..0000000
--- a/cmake/Modules/FindLevelDB.cmake
+++ /dev/null
@@ -1,44 +0,0 @@
-# - Find LevelDB
-#
-#  LevelDB_INCLUDES  - List of LevelDB includes
-#  LevelDB_LIBRARIES - List of libraries when using LevelDB.
-#  LevelDB_FOUND     - True if LevelDB found.
-
-# Look for the header file.
-find_path(LevelDB_INCLUDE NAMES leveldb/db.h
-                          PATHS $ENV{LEVELDB_ROOT}/include /opt/local/include /usr/local/include /usr/include
-                          DOC "Path in which the file leveldb/db.h is located." )
-
-# Look for the library.
-find_library(LevelDB_LIBRARY NAMES leveldb
-                             PATHS /usr/lib $ENV{LEVELDB_ROOT}/lib
-                             DOC "Path to leveldb library." )
-
-include(FindPackageHandleStandardArgs)
-find_package_handle_standard_args(LevelDB DEFAULT_MSG LevelDB_INCLUDE LevelDB_LIBRARY)
-
-if(LEVELDB_FOUND)
-  message(STATUS "Found LevelDB (include: ${LevelDB_INCLUDE}, library: ${LevelDB_LIBRARY})")
-  set(LevelDB_INCLUDES ${LevelDB_INCLUDE})
-  set(LevelDB_LIBRARIES ${LevelDB_LIBRARY})
-  mark_as_advanced(LevelDB_INCLUDE LevelDB_LIBRARY)
-
-  if(EXISTS "${LevelDB_INCLUDE}/leveldb/db.h")
-    file(STRINGS "${LevelDB_INCLUDE}/leveldb/db.h" __version_lines
-           REGEX "static const int k[^V]+Version[ \t]+=[ \t]+[0-9]+;")
-
-    foreach(__line ${__version_lines})
-      if(__line MATCHES "[^k]+kMajorVersion[ \t]+=[ \t]+([0-9]+);")
-        set(LEVELDB_VERSION_MAJOR ${CMAKE_MATCH_1})
-      elseif(__line MATCHES "[^k]+kMinorVersion[ \t]+=[ \t]+([0-9]+);")
-        set(LEVELDB_VERSION_MINOR ${CMAKE_MATCH_1})
-      endif()
-    endforeach()
-
-    if(LEVELDB_VERSION_MAJOR AND LEVELDB_VERSION_MINOR)
-      set(LEVELDB_VERSION "${LEVELDB_VERSION_MAJOR}.${LEVELDB_VERSION_MINOR}")
-    endif()
-
-    # caffe_clear_vars(__line __version_lines)
-  endif()
-endif()
diff --git a/cmake/Modules/FindRocksDB.cmake b/cmake/Modules/FindRocksDB.cmake
deleted file mode 100644
index ef7f3b5..0000000
--- a/cmake/Modules/FindRocksDB.cmake
+++ /dev/null
@@ -1,23 +0,0 @@
-# Find the RocksDB libraries
-#
-# The following variables are optionally searched for defaults
-#  ROCKSDB_ROOT_DIR:    Base directory where all RocksDB components are found
-#
-# The following are set after configuration is done:
-#  ROCKSDB_FOUND
-#  RocksDB_INCLUDE_DIR
-#  RocksDB_LIBRARIES
-
-find_path(RocksDB_INCLUDE_DIR NAMES rocksdb/db.h
-                             PATHS ${ROCKSDB_ROOT_DIR} ${ROCKSDB_ROOT_DIR}/include)
-
-find_library(RocksDB_LIBRARIES NAMES rocksdb
-                              PATHS ${ROCKSDB_ROOT_DIR} ${ROCKSDB_ROOT_DIR}/lib)
-
-include(FindPackageHandleStandardArgs)
-find_package_handle_standard_args(RocksDB DEFAULT_MSG RocksDB_INCLUDE_DIR RocksDB_LIBRARIES)
-
-if(ROCKSDB_FOUND)
-  message(STATUS "Found RocksDB  (include: ${RocksDB_INCLUDE_DIR}, library: ${RocksDB_LIBRARIES})")
-  mark_as_advanced(RocksDB_INCLUDE_DIR RocksDB_LIBRARIES)
-endif()
diff --git a/cmake/Modules/FindSnappy.cmake b/cmake/Modules/FindSnappy.cmake
deleted file mode 100644
index 97219e8..0000000
--- a/cmake/Modules/FindSnappy.cmake
+++ /dev/null
@@ -1,26 +0,0 @@
-# Find the Snappy libraries
-#
-# The following variables are optionally searched for defaults
-#  SNAPPY_ROOT_DIR:    Base directory where all Snappy components are found
-#
-# The following are set after configuration is done:
-#  SNAPPY_FOUND
-#  Snappy_INCLUDE_DIR
-#  Snappy_LIBRARIES
-
-find_path(Snappy_INCLUDE_DIR NAMES snappy.h
-                             PATHS ${SNAPPY_ROOT_DIR} ${SNAPPY_ROOT_DIR}/include)
-
-find_library(Snappy_LIBRARIES NAMES snappy
-                              PATHS ${SNAPPY_ROOT_DIR} ${SNAPPY_ROOT_DIR}/lib)
-
-include(FindPackageHandleStandardArgs)
-find_package_handle_standard_args(Snappy DEFAULT_MSG Snappy_INCLUDE_DIR Snappy_LIBRARIES)
-
-if(SNAPPY_FOUND)
-  message(STATUS "Found Snappy  (include: ${Snappy_INCLUDE_DIR}, library: ${Snappy_LIBRARIES})")
-  mark_as_advanced(Snappy_INCLUDE_DIR Snappy_LIBRARIES)
-  caffe_parse_header(${Snappy_INCLUDE_DIR}/snappy-stubs-public.h
-                     SNAPPY_VERION_LINES SNAPPY_MAJOR SNAPPY_MINOR SNAPPY_PATCHLEVEL)
-  set(Snappy_VERSION "${SNAPPY_MAJOR}.${SNAPPY_MINOR}.${SNAPPY_PATCHLEVEL}")
-endif()
diff --git a/cmake/Modules/FindZMQ.cmake b/cmake/Modules/FindZMQ.cmake
deleted file mode 100644
index 43ce50b..0000000
--- a/cmake/Modules/FindZMQ.cmake
+++ /dev/null
@@ -1,32 +0,0 @@
-# Find the ZMQ libraries
-#
-# The following variables are optionally searched for defaults
-#  ZMQ_ROOT_DIR:    Base directory where all ZMQ components are found
-#
-# The following are set after configuration is done:
-#  ZMQ_FOUND
-#  ZMQ_INCLUDE_DIR
-#  ZMQ_LIBRARIES
-#  ZMQ_VERSION_MAJOR
-
-find_path(ZMQ_INCLUDE_DIR NAMES zmq.h
-                             PATHS ${ZMQ_ROOT_DIR} ${ZMQ_ROOT_DIR}/include)
-
-find_library(ZMQ_LIBRARIES NAMES zmq
-                              PATHS ${ZMQ_ROOT_DIR} ${ZMQ_ROOT_DIR}/lib)
-
-include(FindPackageHandleStandardArgs)
-find_package_handle_standard_args(ZMQ DEFAULT_MSG ZMQ_INCLUDE_DIR ZMQ_LIBRARIES)
-
-if(ZMQ_FOUND)
-  message(STATUS "Found ZMQ  (include: ${ZMQ_INCLUDE_DIR}, library: ${ZMQ_LIBRARIES})")
-  mark_as_advanced(ZMQ_INCLUDE_DIR ZMQ_LIBRARIES)
-
-  caffe_parse_header(${ZMQ_INCLUDE_DIR}/zmq.h ZMQ_VERSION_LINES ZMQ_VERSION_MAJOR)
-  if(${ZMQ_VERSION_MAJOR} VERSION_LESS "3")
-    message(WARNING "Caffe2 requires zmq version 3 or above, but found " ${ZMQ_VERSION_MAJOR} ". Disabling zmq for now.")
-    set(ZMQ_FOUND)
-  else()
-
-  endif()
-endif()
diff --git a/cmake/Summary.cmake b/cmake/Summary.cmake
index 8a0ae2e..9b28599 100644
--- a/cmake/Summary.cmake
+++ b/cmake/Summary.cmake
@@ -130,16 +130,7 @@
   message(STATUS "  USE_KINETO            : ${USE_KINETO}")
   message(STATUS "  USE_GFLAGS            : ${USE_GFLAGS}")
   message(STATUS "  USE_GLOG              : ${USE_GLOG}")
-  message(STATUS "  USE_LEVELDB           : ${USE_LEVELDB}")
-  if(${USE_LEVELDB})
-    message(STATUS "    LevelDB version     : ${LEVELDB_VERSION}")
-    message(STATUS "    Snappy version      : ${Snappy_VERSION}")
-  endif()
   message(STATUS "  USE_LITE_PROTO        : ${USE_LITE_PROTO}")
-  message(STATUS "  USE_LMDB              : ${USE_LMDB}")
-  if(${USE_LMDB})
-    message(STATUS "    LMDB version        : ${LMDB_VERSION}")
-  endif()
   message(STATUS "  USE_METAL             : ${USE_METAL}")
   message(STATUS "  USE_PYTORCH_METAL     : ${USE_PYTORCH_METAL}")
   message(STATUS "  USE_PYTORCH_METAL_EXPORT     : ${USE_PYTORCH_METAL_EXPORT}")
@@ -178,9 +169,6 @@
   message(STATUS "  USE_QNNPACK           : ${USE_QNNPACK}")
   message(STATUS "  USE_PYTORCH_QNNPACK   : ${USE_PYTORCH_QNNPACK}")
   message(STATUS "  USE_XNNPACK           : ${USE_XNNPACK}")
-  message(STATUS "  USE_REDIS             : ${USE_REDIS}")
-  message(STATUS "  USE_ROCKSDB           : ${USE_ROCKSDB}")
-  message(STATUS "  USE_ZMQ               : ${USE_ZMQ}")
   message(STATUS "  USE_DISTRIBUTED       : ${USE_DISTRIBUTED}")
   if(${USE_DISTRIBUTED})
     message(STATUS "    USE_MPI               : ${USE_MPI}")
diff --git a/modules/CMakeLists.txt b/modules/CMakeLists.txt
index 9a5e727..598cac6 100644
--- a/modules/CMakeLists.txt
+++ b/modules/CMakeLists.txt
@@ -2,7 +2,6 @@
 add_subdirectory(detectron)
 add_subdirectory(module_test)
 add_subdirectory(observers)
-add_subdirectory(rocksdb)
 
 # Finally, set Caffe2_MODULES to parent scope.
 set(Caffe2_MODULES ${Caffe2_MODULES} PARENT_SCOPE)
diff --git a/modules/rocksdb/CMakeLists.txt b/modules/rocksdb/CMakeLists.txt
deleted file mode 100644
index 7983ab9..0000000
--- a/modules/rocksdb/CMakeLists.txt
+++ /dev/null
@@ -1,78 +0,0 @@
-# ---[ RocksDB module
-# In addition to being a useful module itself, RocksDB is also an exemplar
-# case where show how one should built a Caffe2 module inside the Caffe2
-# repository.
-#
-# This cmake file achieves two build modes:
-# (1) If one is invoking the main Caffe2 build, we will check a USE_* option,
-#     in this case USE_ROCKSDB, to test if we want to build this module.
-# (2) if we are building it in a standalone way, we will find the preinstalled
-#     Caffe2 library, and then build the library and install it.
-
-# ---[ First, determine if we are building with the main repo or not.
-# This is guarded by the CAFFE2_CMAKE_BUILDING_WITH_MAIN_REPO variable. It then
-# routes build to two paths:
-# (1) When we are building with the main repo, the caffe2_library is going to
-#     be already defined, and all related paths will be defined too. So we will
-#     simply test if the main repo build wants to build this module, in our
-#     case by the variable "USE_ROCKSDB".
-# (2) When we are not building with the main repo, we will need to do the usual
-#     cmake setup: version checks, project options, find dependent packages,
-#     etc.
-if(CAFFE2_CMAKE_BUILDING_WITH_MAIN_REPO)
-  if(NOT USE_ROCKSDB)
-    return()
-  endif()
-else()
-  cmake_minimum_required(VERSION 3.0 FATAL_ERROR)
-  project(caffe2_rocksdb CXX)
-  find_package(Caffe2 REQUIRED)
-  option(BUILD_SHARED_LIBS "Build shared libs." ON)
-  list(APPEND CMAKE_MODULE_PATH ${CMAKE_CURRENT_LIST_DIR}/../../cmake/Modules)
-endif()
-
-
-# ---[ Second, find dependencies.
-# This one should be similar to the standard dependency discovery in normal
-# cmake. Note that for modules that are located in the Caffe2 repository,
-# cmake related files, such as FindRocksDB in this case, should live in the
-# cmake/ folder under root.
-find_package(RocksDB CONFIG)
-if((DEFINED RocksDB_DIR) AND RocksDB_DIR)
-  list(APPEND RocksDB_LIBRARIES RocksDB::rocksdb)
-else()
-  message("RocksDB config not found. Fallback to legacy find.")
-  find_package(RocksDB)
-  if(NOT ROCKSDB_FOUND)
-    message(
-       FATAL_ERROR
-       "RocksDB not found. If you do not need caffe2_rocksdb, set "
-       "-DUSE_ROCKSDB=OFF to solve this error.")
-  endif()
-endif()
-
-# ---[ Third, create the CMake target.
-# The key to note is that this library will need to depend on caffe2_library,
-# which is the main lib of Caffe2. If your library explicitly depends on cuda,
-# then you will need to depend on the caffe2_gpu_library as well.
-add_library(caffe2_rocksdb ${CMAKE_CURRENT_SOURCE_DIR}/rocksdb.cc)
-# RocksDB 7 uses C++17 STL in header.
-if(RocksDB_VERSION_MAJOR VERSION_GREATER_EQUAL 7)
-  set_target_properties(caffe2_rocksdb PROPERTIES CXX_STANDARD 17)
-endif()
-target_link_libraries(caffe2_rocksdb PUBLIC torch_library)
-target_link_libraries(caffe2_rocksdb PRIVATE ${RocksDB_LIBRARIES})
-target_include_directories(caffe2_rocksdb PRIVATE ${RocksDB_INCLUDE_DIR})
-install(TARGETS caffe2_rocksdb DESTINATION lib)
-
-# ---[ Last, Append the library to Caffe2_MODULES, if we are building with
-# the main repo.
-# The purpose of this is that, for all binaries built in the Caffe2 main repo,
-# they will be built with the first class modules that are built. As a result,
-# these binaries will not need to explicitly load these modules before using
-# them.
-# Note(jiayq): this also depends on a separate cmake move to reorg test builds
-# and binary builds after modules. When it is done, this note should be removed.
-if(CAFFE2_CMAKE_BUILDING_WITH_MAIN_REPO)
-  set(Caffe2_MODULES ${Caffe2_MODULES} caffe2_rocksdb PARENT_SCOPE)
-endif()
diff --git a/modules/rocksdb/rocksdb.cc b/modules/rocksdb/rocksdb.cc
deleted file mode 100644
index 2db4691..0000000
--- a/modules/rocksdb/rocksdb.cc
+++ /dev/null
@@ -1,118 +0,0 @@
-/**
- * Copyright (c) 2016-present, Facebook, Inc.
- *
- * Licensed 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.
- */
-
-#include "caffe2/core/db.h"
-#include "caffe2/core/logging.h"
-#include "caffe2/core/module.h"
-#include "caffe2/core/flags.h"
-#include "rocksdb/db.h"
-#include "rocksdb/utilities/leveldb_options.h"
-
-C10_DEFINE_int(
-    caffe2_rocksdb_block_size,
-    65536,
-    "The caffe2 rocksdb block size when writing a rocksdb.");
-
-namespace caffe2 {
-namespace db {
-
-class RocksDBCursor : public Cursor {
- public:
-  explicit RocksDBCursor(rocksdb::DB* db)
-      : iter_(db->NewIterator(rocksdb::ReadOptions())) {
-    SeekToFirst();
-  }
-  ~RocksDBCursor() {}
-  void Seek(const string& key) override { iter_->Seek(key); }
-  bool SupportsSeek() override { return true; }
-  void SeekToFirst() override { iter_->SeekToFirst(); }
-  void Next() override { iter_->Next(); }
-  string key() override { return iter_->key().ToString(); }
-  string value() override { return iter_->value().ToString(); }
-  bool Valid() override { return iter_->Valid(); }
-
- private:
-  std::unique_ptr<rocksdb::Iterator> iter_;
-};
-
-class RocksDBTransaction : public Transaction {
- public:
-  explicit RocksDBTransaction(rocksdb::DB* db) : db_(db) {
-    CAFFE_ENFORCE(db_);
-    batch_.reset(new rocksdb::WriteBatch());
-  }
-  ~RocksDBTransaction() { Commit(); }
-  void Put(const string& key, string&& value) override {
-    batch_->Put(key, value);
-  }
-  void Commit() override {
-    rocksdb::Status status = db_->Write(rocksdb::WriteOptions(), batch_.get());
-    batch_.reset(new rocksdb::WriteBatch());
-    CAFFE_ENFORCE(
-        status.ok(), "Failed to write batch to rocksdb: " + status.ToString());
-  }
-
- private:
-  rocksdb::DB* db_;
-  std::unique_ptr<rocksdb::WriteBatch> batch_;
-
-  C10_DISABLE_COPY_AND_ASSIGN(RocksDBTransaction);
-};
-
-class RocksDB : public DB {
- public:
-  RocksDB(const string& source, Mode mode) : DB(source, mode) {
-    rocksdb::LevelDBOptions options;
-    options.block_size = FLAGS_caffe2_rocksdb_block_size;
-    options.write_buffer_size = 268435456;
-    options.max_open_files = 100;
-    options.error_if_exists = mode == NEW;
-    options.create_if_missing = mode != READ;
-    rocksdb::Options rocksdb_options = rocksdb::ConvertOptions(options);
-
-    rocksdb::DB* db_temp;
-    rocksdb::Status status = rocksdb::DB::Open(
-      rocksdb_options, source, &db_temp);
-    CAFFE_ENFORCE(
-        status.ok(),
-        "Failed to open rocksdb ",
-        source,
-        "\n",
-        status.ToString());
-    db_.reset(db_temp);
-    VLOG(1) << "Opened rocksdb " << source;
-  }
-
-  void Close() override { db_.reset(); }
-  unique_ptr<Cursor> NewCursor() override {
-    return make_unique<RocksDBCursor>(db_.get());
-  }
-  unique_ptr<Transaction> NewTransaction() override {
-    return make_unique<RocksDBTransaction>(db_.get());
-  }
-
- private:
-  std::unique_ptr<rocksdb::DB> db_;
-};
-
-REGISTER_CAFFE2_DB(RocksDB, RocksDB);
-// For lazy-minded, one can also call with lower-case name.
-REGISTER_CAFFE2_DB(rocksdb, RocksDB);
-
-}  // namespace db
-
-CAFFE2_MODULE(caffe2_rocksdb, "RocksDB implementation for caffe2::DB.");
-}  // namespace caffe2
diff --git a/scripts/build_android.sh b/scripts/build_android.sh
index b0d1dd4..0a842a2 100755
--- a/scripts/build_android.sh
+++ b/scripts/build_android.sh
@@ -128,8 +128,6 @@
 CMAKE_ARGS+=("-DUSE_ITT=OFF")
 CMAKE_ARGS+=("-DUSE_GFLAGS=OFF")
 CMAKE_ARGS+=("-DUSE_OPENCV=OFF")
-CMAKE_ARGS+=("-DUSE_LMDB=OFF")
-CMAKE_ARGS+=("-DUSE_LEVELDB=OFF")
 CMAKE_ARGS+=("-DUSE_MPI=OFF")
 CMAKE_ARGS+=("-DUSE_OPENMP=OFF")
 # Only toggle if VERBOSE=1
diff --git a/scripts/build_ios.sh b/scripts/build_ios.sh
index 8262eec..abe6471 100755
--- a/scripts/build_ios.sh
+++ b/scripts/build_ios.sh
@@ -107,8 +107,6 @@
 CMAKE_ARGS+=("-DUSE_ITT=OFF")
 CMAKE_ARGS+=("-DUSE_GFLAGS=OFF")
 CMAKE_ARGS+=("-DUSE_OPENCV=OFF")
-CMAKE_ARGS+=("-DUSE_LMDB=OFF")
-CMAKE_ARGS+=("-DUSE_LEVELDB=OFF")
 CMAKE_ARGS+=("-DUSE_MPI=OFF")
 CMAKE_ARGS+=("-DUSE_NUMPY=OFF")
 CMAKE_ARGS+=("-DUSE_NNPACK=OFF")
diff --git a/scripts/build_mobile.sh b/scripts/build_mobile.sh
index 902458b..a144418 100755
--- a/scripts/build_mobile.sh
+++ b/scripts/build_mobile.sh
@@ -68,8 +68,6 @@
 CMAKE_ARGS+=("-DUSE_ITT=OFF")
 CMAKE_ARGS+=("-DUSE_GFLAGS=OFF")
 CMAKE_ARGS+=("-DUSE_OPENCV=OFF")
-CMAKE_ARGS+=("-DUSE_LMDB=OFF")
-CMAKE_ARGS+=("-DUSE_LEVELDB=OFF")
 CMAKE_ARGS+=("-DUSE_MPI=OFF")
 CMAKE_ARGS+=("-DUSE_OPENMP=OFF")
 CMAKE_ARGS+=("-DUSE_MKLDNN=OFF")
diff --git a/scripts/build_tegra_x1.sh b/scripts/build_tegra_x1.sh
index b1121ff..063e17d 100755
--- a/scripts/build_tegra_x1.sh
+++ b/scripts/build_tegra_x1.sh
@@ -29,10 +29,7 @@
 # obtain optional dependencies that are usually useful to have.
 echo "Installing optional dependencies."
 sudo apt-get install \
-  libleveldb-dev \
-  liblmdb-dev \
   libpython-dev \
-  libsnappy-dev \
   python-numpy \
   python-pip \
   python-protobuf
diff --git a/scripts/build_tizen.sh b/scripts/build_tizen.sh
index 33fc65c..ce64b6c 100755
--- a/scripts/build_tizen.sh
+++ b/scripts/build_tizen.sh
@@ -55,9 +55,6 @@
     -DRUN_HAVE_POSIX_REGEX=0 \
     -DHAVE_GNU_POSIX_REGEX=0 \
     -DUSE_MPI=OFF -DUSE_OPENMP=OFF \
-    -DUSE_ROCKSDB=OFF \
-    -DUSE_LEVELDB=OFF \
-    -DUSE_LMDB=OFF \
     -DBUILD_PYTHON=OFF \
     -DUSE_GLOO=OFF \
     -DUSE_OPENCV=OFF \
@@ -84,10 +81,7 @@
 # Obtain optional dependencies that are usually useful to have.
 echo "Installing optional dependencies."
 sudo zypper install \
-  libleveldb-dev \
-  liblmdb-dev \
   libpython-dev \
-  libsnappy-dev \
   python-numpy \
   python-pip \
   python-protobuf
@@ -110,7 +104,6 @@
     -DUSE_CUDA=OFF \
     -DUSE_ITT=OFF \
     -DUSE_OPENCV=OFF \
-    -DUSE_LMDB=OFF \
     -DCAFFE2_CPU_FLAGS="-mfpu=neon -mfloat-abi=soft" \
     || exit 1