[feature request] [Caffe2] Enable MKLDNN support for inference (#6699)
* Add operators based-on IDEEP interfaces
Signed-off-by: Gu, Jinghui <jinghui.gu@intel.com>
* Enable IDEEP as a caffe2 device
Signed-off-by: Gu, Jinghui <jinghui.gu@intel.com>
* Add test cases for IDEEP ops
Signed-off-by: Gu, Jinghui <jinghui.gu@intel.com>
* Add IDEEP as a caffe2 submodule
Signed-off-by: Gu, Jinghui <jinghui.gu@intel.com>
* Skip test cases if no IDEEP support
Signed-off-by: Gu, Jinghui <jinghui.gu@intel.com>
* Correct cmake options for IDEEP
Signed-off-by: Gu, Jinghui <jinghui.gu@intel.com>
* Add dependences on ideep libraries
Signed-off-by: Gu, Jinghui <jinghui.gu@intel.com>
* Fix issues in IDEEP conv ops and etc.
Signed-off-by: Gu, Jinghui <jinghui.gu@intel.com>
* Move ideep from caffe2/ideep to caffe2/contrib/ideep
Signed-off-by: Gu Jinghui <jinghui.gu@intel.com>
* Update IDEEP to fix cmake issue
Signed-off-by: Gu, Jinghui <jinghui.gu@intel.com>
* Fix cmake issue caused by USE_MKL option
Signed-off-by: Gu, Jinghui <jinghui.gu@intel.com>
* Correct comments in MKL cmake file
Signed-off-by: Gu, Jinghui <jinghui.gu@intel.com>
2018-04-23 04:58:14 +00:00
|
|
|
// Note(jiayq): the import_array function is done inside
|
|
|
|
|
// caffe2_python.cc. Read
|
|
|
|
|
// http://docs.scipy.org/doc/numpy-1.10.1/reference/c-api.array.html#miscellaneous
|
|
|
|
|
// for more details.
|
|
|
|
|
#define NO_IMPORT_ARRAY
|
|
|
|
|
|
|
|
|
|
#include "pybind_state.h"
|
|
|
|
|
|
|
|
|
|
#include <pybind11/pybind11.h>
|
|
|
|
|
#include <pybind11/stl.h>
|
|
|
|
|
|
2018-08-29 21:56:55 +00:00
|
|
|
#include "caffe2/ideep/operators/operator_fallback_ideep.h"
|
2018-05-01 04:10:46 +00:00
|
|
|
#include <caffe2/ideep/ideep_utils.h>
|
[feature request] [Caffe2] Enable MKLDNN support for inference (#6699)
* Add operators based-on IDEEP interfaces
Signed-off-by: Gu, Jinghui <jinghui.gu@intel.com>
* Enable IDEEP as a caffe2 device
Signed-off-by: Gu, Jinghui <jinghui.gu@intel.com>
* Add test cases for IDEEP ops
Signed-off-by: Gu, Jinghui <jinghui.gu@intel.com>
* Add IDEEP as a caffe2 submodule
Signed-off-by: Gu, Jinghui <jinghui.gu@intel.com>
* Skip test cases if no IDEEP support
Signed-off-by: Gu, Jinghui <jinghui.gu@intel.com>
* Correct cmake options for IDEEP
Signed-off-by: Gu, Jinghui <jinghui.gu@intel.com>
* Add dependences on ideep libraries
Signed-off-by: Gu, Jinghui <jinghui.gu@intel.com>
* Fix issues in IDEEP conv ops and etc.
Signed-off-by: Gu, Jinghui <jinghui.gu@intel.com>
* Move ideep from caffe2/ideep to caffe2/contrib/ideep
Signed-off-by: Gu Jinghui <jinghui.gu@intel.com>
* Update IDEEP to fix cmake issue
Signed-off-by: Gu, Jinghui <jinghui.gu@intel.com>
* Fix cmake issue caused by USE_MKL option
Signed-off-by: Gu, Jinghui <jinghui.gu@intel.com>
* Correct comments in MKL cmake file
Signed-off-by: Gu, Jinghui <jinghui.gu@intel.com>
2018-04-23 04:58:14 +00:00
|
|
|
|
|
|
|
|
namespace caffe2 {
|
|
|
|
|
namespace python {
|
|
|
|
|
|
|
|
|
|
USE_IDEEP_DEF_ALIASES();
|
|
|
|
|
|
|
|
|
|
class IDeepFetcher;
|
|
|
|
|
class IDeepFeeder;
|
|
|
|
|
|
2018-08-29 21:56:55 +00:00
|
|
|
REGISTER_IDEEP_OPERATOR(Python, IDEEPFallbackOp<PythonOp<CPUContext, false>>);
|
|
|
|
|
|
|
|
|
|
REGISTER_BLOB_FETCHER((TypeMeta::Id<itensor>()), IDeepFetcher);
|
[feature request] [Caffe2] Enable MKLDNN support for inference (#6699)
* Add operators based-on IDEEP interfaces
Signed-off-by: Gu, Jinghui <jinghui.gu@intel.com>
* Enable IDEEP as a caffe2 device
Signed-off-by: Gu, Jinghui <jinghui.gu@intel.com>
* Add test cases for IDEEP ops
Signed-off-by: Gu, Jinghui <jinghui.gu@intel.com>
* Add IDEEP as a caffe2 submodule
Signed-off-by: Gu, Jinghui <jinghui.gu@intel.com>
* Skip test cases if no IDEEP support
Signed-off-by: Gu, Jinghui <jinghui.gu@intel.com>
* Correct cmake options for IDEEP
Signed-off-by: Gu, Jinghui <jinghui.gu@intel.com>
* Add dependences on ideep libraries
Signed-off-by: Gu, Jinghui <jinghui.gu@intel.com>
* Fix issues in IDEEP conv ops and etc.
Signed-off-by: Gu, Jinghui <jinghui.gu@intel.com>
* Move ideep from caffe2/ideep to caffe2/contrib/ideep
Signed-off-by: Gu Jinghui <jinghui.gu@intel.com>
* Update IDEEP to fix cmake issue
Signed-off-by: Gu, Jinghui <jinghui.gu@intel.com>
* Fix cmake issue caused by USE_MKL option
Signed-off-by: Gu, Jinghui <jinghui.gu@intel.com>
* Correct comments in MKL cmake file
Signed-off-by: Gu, Jinghui <jinghui.gu@intel.com>
2018-04-23 04:58:14 +00:00
|
|
|
REGISTER_BLOB_FEEDER(IDEEP, IDeepFeeder);
|
|
|
|
|
|
|
|
|
|
class IDeepFetcher : public BlobFetcherBase {
|
|
|
|
|
TypeMeta type_transform(const itensor &atensor) {
|
2018-08-29 21:56:55 +00:00
|
|
|
switch (atensor.get_data_type()) {
|
|
|
|
|
case itensor::data_type::f32:
|
|
|
|
|
return TypeMeta::Make<float>();
|
|
|
|
|
case itensor::data_type::s32:
|
|
|
|
|
return TypeMeta::Make<int>();
|
|
|
|
|
case itensor::data_type::s8:
|
|
|
|
|
return TypeMeta::Make<int8_t>();
|
|
|
|
|
case itensor::data_type::u8:
|
|
|
|
|
return TypeMeta::Make<uint8_t>();
|
|
|
|
|
default:
|
|
|
|
|
// Should we throw exception?
|
|
|
|
|
return TypeMeta();
|
[feature request] [Caffe2] Enable MKLDNN support for inference (#6699)
* Add operators based-on IDEEP interfaces
Signed-off-by: Gu, Jinghui <jinghui.gu@intel.com>
* Enable IDEEP as a caffe2 device
Signed-off-by: Gu, Jinghui <jinghui.gu@intel.com>
* Add test cases for IDEEP ops
Signed-off-by: Gu, Jinghui <jinghui.gu@intel.com>
* Add IDEEP as a caffe2 submodule
Signed-off-by: Gu, Jinghui <jinghui.gu@intel.com>
* Skip test cases if no IDEEP support
Signed-off-by: Gu, Jinghui <jinghui.gu@intel.com>
* Correct cmake options for IDEEP
Signed-off-by: Gu, Jinghui <jinghui.gu@intel.com>
* Add dependences on ideep libraries
Signed-off-by: Gu, Jinghui <jinghui.gu@intel.com>
* Fix issues in IDEEP conv ops and etc.
Signed-off-by: Gu, Jinghui <jinghui.gu@intel.com>
* Move ideep from caffe2/ideep to caffe2/contrib/ideep
Signed-off-by: Gu Jinghui <jinghui.gu@intel.com>
* Update IDEEP to fix cmake issue
Signed-off-by: Gu, Jinghui <jinghui.gu@intel.com>
* Fix cmake issue caused by USE_MKL option
Signed-off-by: Gu, Jinghui <jinghui.gu@intel.com>
* Correct comments in MKL cmake file
Signed-off-by: Gu, Jinghui <jinghui.gu@intel.com>
2018-04-23 04:58:14 +00:00
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
2018-08-29 21:56:55 +00:00
|
|
|
public:
|
|
|
|
|
pybind11::object Fetch(const Blob &blob) override {
|
[feature request] [Caffe2] Enable MKLDNN support for inference (#6699)
* Add operators based-on IDEEP interfaces
Signed-off-by: Gu, Jinghui <jinghui.gu@intel.com>
* Enable IDEEP as a caffe2 device
Signed-off-by: Gu, Jinghui <jinghui.gu@intel.com>
* Add test cases for IDEEP ops
Signed-off-by: Gu, Jinghui <jinghui.gu@intel.com>
* Add IDEEP as a caffe2 submodule
Signed-off-by: Gu, Jinghui <jinghui.gu@intel.com>
* Skip test cases if no IDEEP support
Signed-off-by: Gu, Jinghui <jinghui.gu@intel.com>
* Correct cmake options for IDEEP
Signed-off-by: Gu, Jinghui <jinghui.gu@intel.com>
* Add dependences on ideep libraries
Signed-off-by: Gu, Jinghui <jinghui.gu@intel.com>
* Fix issues in IDEEP conv ops and etc.
Signed-off-by: Gu, Jinghui <jinghui.gu@intel.com>
* Move ideep from caffe2/ideep to caffe2/contrib/ideep
Signed-off-by: Gu Jinghui <jinghui.gu@intel.com>
* Update IDEEP to fix cmake issue
Signed-off-by: Gu, Jinghui <jinghui.gu@intel.com>
* Fix cmake issue caused by USE_MKL option
Signed-off-by: Gu, Jinghui <jinghui.gu@intel.com>
* Correct comments in MKL cmake file
Signed-off-by: Gu, Jinghui <jinghui.gu@intel.com>
2018-04-23 04:58:14 +00:00
|
|
|
try {
|
|
|
|
|
return FetchTensor(blob.Get<itensor>(), true).obj;
|
2018-08-29 21:56:55 +00:00
|
|
|
} catch (ideep::error &e) {
|
|
|
|
|
LOG(ERROR) << "IDEEP error: " << e.message;
|
[feature request] [Caffe2] Enable MKLDNN support for inference (#6699)
* Add operators based-on IDEEP interfaces
Signed-off-by: Gu, Jinghui <jinghui.gu@intel.com>
* Enable IDEEP as a caffe2 device
Signed-off-by: Gu, Jinghui <jinghui.gu@intel.com>
* Add test cases for IDEEP ops
Signed-off-by: Gu, Jinghui <jinghui.gu@intel.com>
* Add IDEEP as a caffe2 submodule
Signed-off-by: Gu, Jinghui <jinghui.gu@intel.com>
* Skip test cases if no IDEEP support
Signed-off-by: Gu, Jinghui <jinghui.gu@intel.com>
* Correct cmake options for IDEEP
Signed-off-by: Gu, Jinghui <jinghui.gu@intel.com>
* Add dependences on ideep libraries
Signed-off-by: Gu, Jinghui <jinghui.gu@intel.com>
* Fix issues in IDEEP conv ops and etc.
Signed-off-by: Gu, Jinghui <jinghui.gu@intel.com>
* Move ideep from caffe2/ideep to caffe2/contrib/ideep
Signed-off-by: Gu Jinghui <jinghui.gu@intel.com>
* Update IDEEP to fix cmake issue
Signed-off-by: Gu, Jinghui <jinghui.gu@intel.com>
* Fix cmake issue caused by USE_MKL option
Signed-off-by: Gu, Jinghui <jinghui.gu@intel.com>
* Correct comments in MKL cmake file
Signed-off-by: Gu, Jinghui <jinghui.gu@intel.com>
2018-04-23 04:58:14 +00:00
|
|
|
throw;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
2018-08-29 21:56:55 +00:00
|
|
|
FetchedBlob FetchTensor(const itensor &atensor, bool force_copy) {
|
2018-10-04 19:00:29 +00:00
|
|
|
#ifdef USE_NUMPY
|
[feature request] [Caffe2] Enable MKLDNN support for inference (#6699)
* Add operators based-on IDEEP interfaces
Signed-off-by: Gu, Jinghui <jinghui.gu@intel.com>
* Enable IDEEP as a caffe2 device
Signed-off-by: Gu, Jinghui <jinghui.gu@intel.com>
* Add test cases for IDEEP ops
Signed-off-by: Gu, Jinghui <jinghui.gu@intel.com>
* Add IDEEP as a caffe2 submodule
Signed-off-by: Gu, Jinghui <jinghui.gu@intel.com>
* Skip test cases if no IDEEP support
Signed-off-by: Gu, Jinghui <jinghui.gu@intel.com>
* Correct cmake options for IDEEP
Signed-off-by: Gu, Jinghui <jinghui.gu@intel.com>
* Add dependences on ideep libraries
Signed-off-by: Gu, Jinghui <jinghui.gu@intel.com>
* Fix issues in IDEEP conv ops and etc.
Signed-off-by: Gu, Jinghui <jinghui.gu@intel.com>
* Move ideep from caffe2/ideep to caffe2/contrib/ideep
Signed-off-by: Gu Jinghui <jinghui.gu@intel.com>
* Update IDEEP to fix cmake issue
Signed-off-by: Gu, Jinghui <jinghui.gu@intel.com>
* Fix cmake issue caused by USE_MKL option
Signed-off-by: Gu, Jinghui <jinghui.gu@intel.com>
* Correct comments in MKL cmake file
Signed-off-by: Gu, Jinghui <jinghui.gu@intel.com>
2018-04-23 04:58:14 +00:00
|
|
|
FetchedBlob result;
|
2019-01-05 06:30:48 +00:00
|
|
|
CAFFE_ENFORCE((atensor.ndims() != 0) &&
|
|
|
|
|
(atensor.get_nelems() == 0 ||
|
|
|
|
|
atensor.get_data_handle() != nullptr),
|
2018-08-29 21:56:55 +00:00
|
|
|
"Trying to fetch uninitialized tensor");
|
2019-04-03 17:29:19 +00:00
|
|
|
// NOTE: Only support float so far.
|
|
|
|
|
const int numpy_type = NPY_FLOAT;
|
[feature request] [Caffe2] Enable MKLDNN support for inference (#6699)
* Add operators based-on IDEEP interfaces
Signed-off-by: Gu, Jinghui <jinghui.gu@intel.com>
* Enable IDEEP as a caffe2 device
Signed-off-by: Gu, Jinghui <jinghui.gu@intel.com>
* Add test cases for IDEEP ops
Signed-off-by: Gu, Jinghui <jinghui.gu@intel.com>
* Add IDEEP as a caffe2 submodule
Signed-off-by: Gu, Jinghui <jinghui.gu@intel.com>
* Skip test cases if no IDEEP support
Signed-off-by: Gu, Jinghui <jinghui.gu@intel.com>
* Correct cmake options for IDEEP
Signed-off-by: Gu, Jinghui <jinghui.gu@intel.com>
* Add dependences on ideep libraries
Signed-off-by: Gu, Jinghui <jinghui.gu@intel.com>
* Fix issues in IDEEP conv ops and etc.
Signed-off-by: Gu, Jinghui <jinghui.gu@intel.com>
* Move ideep from caffe2/ideep to caffe2/contrib/ideep
Signed-off-by: Gu Jinghui <jinghui.gu@intel.com>
* Update IDEEP to fix cmake issue
Signed-off-by: Gu, Jinghui <jinghui.gu@intel.com>
* Fix cmake issue caused by USE_MKL option
Signed-off-by: Gu, Jinghui <jinghui.gu@intel.com>
* Correct comments in MKL cmake file
Signed-off-by: Gu, Jinghui <jinghui.gu@intel.com>
2018-04-23 04:58:14 +00:00
|
|
|
CAFFE_ENFORCE(
|
|
|
|
|
numpy_type != -1,
|
|
|
|
|
"Unsupported ideep memory data type? This usually should not happen "
|
|
|
|
|
"since ideep memory usually only do float and double.");
|
2019-03-30 01:51:50 +00:00
|
|
|
itensor::dims dims = atensor.get_public_format_dims();
|
[feature request] [Caffe2] Enable MKLDNN support for inference (#6699)
* Add operators based-on IDEEP interfaces
Signed-off-by: Gu, Jinghui <jinghui.gu@intel.com>
* Enable IDEEP as a caffe2 device
Signed-off-by: Gu, Jinghui <jinghui.gu@intel.com>
* Add test cases for IDEEP ops
Signed-off-by: Gu, Jinghui <jinghui.gu@intel.com>
* Add IDEEP as a caffe2 submodule
Signed-off-by: Gu, Jinghui <jinghui.gu@intel.com>
* Skip test cases if no IDEEP support
Signed-off-by: Gu, Jinghui <jinghui.gu@intel.com>
* Correct cmake options for IDEEP
Signed-off-by: Gu, Jinghui <jinghui.gu@intel.com>
* Add dependences on ideep libraries
Signed-off-by: Gu, Jinghui <jinghui.gu@intel.com>
* Fix issues in IDEEP conv ops and etc.
Signed-off-by: Gu, Jinghui <jinghui.gu@intel.com>
* Move ideep from caffe2/ideep to caffe2/contrib/ideep
Signed-off-by: Gu Jinghui <jinghui.gu@intel.com>
* Update IDEEP to fix cmake issue
Signed-off-by: Gu, Jinghui <jinghui.gu@intel.com>
* Fix cmake issue caused by USE_MKL option
Signed-off-by: Gu, Jinghui <jinghui.gu@intel.com>
* Correct comments in MKL cmake file
Signed-off-by: Gu, Jinghui <jinghui.gu@intel.com>
2018-04-23 04:58:14 +00:00
|
|
|
std::vector<npy_intp> npy_dims(dims.begin(), dims.end());
|
|
|
|
|
|
|
|
|
|
result.copied = force_copy || atensor.need_reorder();
|
2018-08-29 21:56:55 +00:00
|
|
|
void *outPtr;
|
[feature request] [Caffe2] Enable MKLDNN support for inference (#6699)
* Add operators based-on IDEEP interfaces
Signed-off-by: Gu, Jinghui <jinghui.gu@intel.com>
* Enable IDEEP as a caffe2 device
Signed-off-by: Gu, Jinghui <jinghui.gu@intel.com>
* Add test cases for IDEEP ops
Signed-off-by: Gu, Jinghui <jinghui.gu@intel.com>
* Add IDEEP as a caffe2 submodule
Signed-off-by: Gu, Jinghui <jinghui.gu@intel.com>
* Skip test cases if no IDEEP support
Signed-off-by: Gu, Jinghui <jinghui.gu@intel.com>
* Correct cmake options for IDEEP
Signed-off-by: Gu, Jinghui <jinghui.gu@intel.com>
* Add dependences on ideep libraries
Signed-off-by: Gu, Jinghui <jinghui.gu@intel.com>
* Fix issues in IDEEP conv ops and etc.
Signed-off-by: Gu, Jinghui <jinghui.gu@intel.com>
* Move ideep from caffe2/ideep to caffe2/contrib/ideep
Signed-off-by: Gu Jinghui <jinghui.gu@intel.com>
* Update IDEEP to fix cmake issue
Signed-off-by: Gu, Jinghui <jinghui.gu@intel.com>
* Fix cmake issue caused by USE_MKL option
Signed-off-by: Gu, Jinghui <jinghui.gu@intel.com>
* Correct comments in MKL cmake file
Signed-off-by: Gu, Jinghui <jinghui.gu@intel.com>
2018-04-23 04:58:14 +00:00
|
|
|
if (result.copied) {
|
|
|
|
|
result.obj = py::reinterpret_steal<py::object>(
|
|
|
|
|
PyArray_SimpleNew(atensor.ndims(), npy_dims.data(), numpy_type));
|
|
|
|
|
outPtr = static_cast<void *>(
|
2018-08-29 21:56:55 +00:00
|
|
|
PyArray_DATA(reinterpret_cast<PyArrayObject *>(result.obj.ptr())));
|
[feature request] [Caffe2] Enable MKLDNN support for inference (#6699)
* Add operators based-on IDEEP interfaces
Signed-off-by: Gu, Jinghui <jinghui.gu@intel.com>
* Enable IDEEP as a caffe2 device
Signed-off-by: Gu, Jinghui <jinghui.gu@intel.com>
* Add test cases for IDEEP ops
Signed-off-by: Gu, Jinghui <jinghui.gu@intel.com>
* Add IDEEP as a caffe2 submodule
Signed-off-by: Gu, Jinghui <jinghui.gu@intel.com>
* Skip test cases if no IDEEP support
Signed-off-by: Gu, Jinghui <jinghui.gu@intel.com>
* Correct cmake options for IDEEP
Signed-off-by: Gu, Jinghui <jinghui.gu@intel.com>
* Add dependences on ideep libraries
Signed-off-by: Gu, Jinghui <jinghui.gu@intel.com>
* Fix issues in IDEEP conv ops and etc.
Signed-off-by: Gu, Jinghui <jinghui.gu@intel.com>
* Move ideep from caffe2/ideep to caffe2/contrib/ideep
Signed-off-by: Gu Jinghui <jinghui.gu@intel.com>
* Update IDEEP to fix cmake issue
Signed-off-by: Gu, Jinghui <jinghui.gu@intel.com>
* Fix cmake issue caused by USE_MKL option
Signed-off-by: Gu, Jinghui <jinghui.gu@intel.com>
* Correct comments in MKL cmake file
Signed-off-by: Gu, Jinghui <jinghui.gu@intel.com>
2018-04-23 04:58:14 +00:00
|
|
|
} else {
|
|
|
|
|
outPtr = atensor.get_data_handle();
|
2018-08-29 21:56:55 +00:00
|
|
|
result.obj = py::reinterpret_steal<py::object>(PyArray_SimpleNewFromData(
|
|
|
|
|
atensor.ndims(), npy_dims.data(), numpy_type, outPtr));
|
[feature request] [Caffe2] Enable MKLDNN support for inference (#6699)
* Add operators based-on IDEEP interfaces
Signed-off-by: Gu, Jinghui <jinghui.gu@intel.com>
* Enable IDEEP as a caffe2 device
Signed-off-by: Gu, Jinghui <jinghui.gu@intel.com>
* Add test cases for IDEEP ops
Signed-off-by: Gu, Jinghui <jinghui.gu@intel.com>
* Add IDEEP as a caffe2 submodule
Signed-off-by: Gu, Jinghui <jinghui.gu@intel.com>
* Skip test cases if no IDEEP support
Signed-off-by: Gu, Jinghui <jinghui.gu@intel.com>
* Correct cmake options for IDEEP
Signed-off-by: Gu, Jinghui <jinghui.gu@intel.com>
* Add dependences on ideep libraries
Signed-off-by: Gu, Jinghui <jinghui.gu@intel.com>
* Fix issues in IDEEP conv ops and etc.
Signed-off-by: Gu, Jinghui <jinghui.gu@intel.com>
* Move ideep from caffe2/ideep to caffe2/contrib/ideep
Signed-off-by: Gu Jinghui <jinghui.gu@intel.com>
* Update IDEEP to fix cmake issue
Signed-off-by: Gu, Jinghui <jinghui.gu@intel.com>
* Fix cmake issue caused by USE_MKL option
Signed-off-by: Gu, Jinghui <jinghui.gu@intel.com>
* Correct comments in MKL cmake file
Signed-off-by: Gu, Jinghui <jinghui.gu@intel.com>
2018-04-23 04:58:14 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (numpy_type == NPY_OBJECT) {
|
|
|
|
|
CAFFE_THROW("We don't support strings.");
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (result.copied) {
|
2019-04-03 17:29:19 +00:00
|
|
|
atensor.to_public(outPtr);
|
[feature request] [Caffe2] Enable MKLDNN support for inference (#6699)
* Add operators based-on IDEEP interfaces
Signed-off-by: Gu, Jinghui <jinghui.gu@intel.com>
* Enable IDEEP as a caffe2 device
Signed-off-by: Gu, Jinghui <jinghui.gu@intel.com>
* Add test cases for IDEEP ops
Signed-off-by: Gu, Jinghui <jinghui.gu@intel.com>
* Add IDEEP as a caffe2 submodule
Signed-off-by: Gu, Jinghui <jinghui.gu@intel.com>
* Skip test cases if no IDEEP support
Signed-off-by: Gu, Jinghui <jinghui.gu@intel.com>
* Correct cmake options for IDEEP
Signed-off-by: Gu, Jinghui <jinghui.gu@intel.com>
* Add dependences on ideep libraries
Signed-off-by: Gu, Jinghui <jinghui.gu@intel.com>
* Fix issues in IDEEP conv ops and etc.
Signed-off-by: Gu, Jinghui <jinghui.gu@intel.com>
* Move ideep from caffe2/ideep to caffe2/contrib/ideep
Signed-off-by: Gu Jinghui <jinghui.gu@intel.com>
* Update IDEEP to fix cmake issue
Signed-off-by: Gu, Jinghui <jinghui.gu@intel.com>
* Fix cmake issue caused by USE_MKL option
Signed-off-by: Gu, Jinghui <jinghui.gu@intel.com>
* Correct comments in MKL cmake file
Signed-off-by: Gu, Jinghui <jinghui.gu@intel.com>
2018-04-23 04:58:14 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return result;
|
2018-10-04 19:00:29 +00:00
|
|
|
#else
|
|
|
|
|
CAFFE_THROW("Caffe2 was compiled without NumPy support.");
|
|
|
|
|
#endif // USE_NUMPY
|
[feature request] [Caffe2] Enable MKLDNN support for inference (#6699)
* Add operators based-on IDEEP interfaces
Signed-off-by: Gu, Jinghui <jinghui.gu@intel.com>
* Enable IDEEP as a caffe2 device
Signed-off-by: Gu, Jinghui <jinghui.gu@intel.com>
* Add test cases for IDEEP ops
Signed-off-by: Gu, Jinghui <jinghui.gu@intel.com>
* Add IDEEP as a caffe2 submodule
Signed-off-by: Gu, Jinghui <jinghui.gu@intel.com>
* Skip test cases if no IDEEP support
Signed-off-by: Gu, Jinghui <jinghui.gu@intel.com>
* Correct cmake options for IDEEP
Signed-off-by: Gu, Jinghui <jinghui.gu@intel.com>
* Add dependences on ideep libraries
Signed-off-by: Gu, Jinghui <jinghui.gu@intel.com>
* Fix issues in IDEEP conv ops and etc.
Signed-off-by: Gu, Jinghui <jinghui.gu@intel.com>
* Move ideep from caffe2/ideep to caffe2/contrib/ideep
Signed-off-by: Gu Jinghui <jinghui.gu@intel.com>
* Update IDEEP to fix cmake issue
Signed-off-by: Gu, Jinghui <jinghui.gu@intel.com>
* Fix cmake issue caused by USE_MKL option
Signed-off-by: Gu, Jinghui <jinghui.gu@intel.com>
* Correct comments in MKL cmake file
Signed-off-by: Gu, Jinghui <jinghui.gu@intel.com>
2018-04-23 04:58:14 +00:00
|
|
|
}
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
class IDeepFeeder : public BlobFeederBase {
|
|
|
|
|
itensor::data_type type_transform(const TypeMeta &meta) {
|
|
|
|
|
if (meta == TypeMeta::Make<float>())
|
|
|
|
|
return itensor::data_type::f32;
|
|
|
|
|
else if (meta == TypeMeta::Make<int>())
|
|
|
|
|
return itensor::data_type::s32;
|
|
|
|
|
else if (meta == TypeMeta::Make<int8_t>())
|
|
|
|
|
return itensor::data_type::s8;
|
|
|
|
|
else if (meta == TypeMeta::Make<uint8_t>())
|
|
|
|
|
return itensor::data_type::u8;
|
|
|
|
|
else
|
Upgrade MKL-DNN to DNNL v1.2 (#32422)
Summary:
## Motivation
This PR upgrades MKL-DNN from v0.20 to DNNL v1.2 and resolves https://github.com/pytorch/pytorch/issues/30300.
DNNL (Deep Neural Network Library) is the new brand of MKL-DNN, which improves performance, quality, and usability over the old version.
This PR focuses on the migration of all existing functionalities, including minor fixes, performance improvement and code clean up. It serves as the cornerstone of our future efforts to accommodate new features like OpenCL support, BF16 training, INT8 inference, etc. and to let the Pytorch community derive more benefits from the Intel Architecture.
<br>
## What's included?
Even DNNL has many breaking changes to the API, we managed to absorb most of them in ideep. This PR contains minimalist changes to the integration code in pytorch. Below is a summary of the changes:
<br>
**General:**
1. Replace op-level allocator with global-registered allocator
```
// before
ideep::sum::compute<AllocForMKLDNN>(scales, {x, y}, z);
// after
ideep::sum::compute(scales, {x, y}, z);
```
The allocator is now being registeted at `aten/src/ATen/native/mkldnn/IDeepRegistration.cpp`. Thereafter all tensors derived from the `cpu_engine` (by default) will use the c10 allocator.
```
RegisterEngineAllocator cpu_alloc(
ideep::engine::cpu_engine(),
[](size_t size) {
return c10::GetAllocator(c10::DeviceType::CPU)->raw_allocate(size);
},
[](void* p) {
c10::GetAllocator(c10::DeviceType::CPU)->raw_deallocate(p);
}
);
```
------
2. Simplify group convolution
We had such a scenario in convolution where ideep tensor shape mismatched aten tensor: when `groups > 1`, DNNL expects weights tensors to be 5-d with an extra group dimension, e.g. `goihw` instead of `oihw` in 2d conv case.
As shown below, a lot of extra checks came with this difference in shape before. Now we've completely hidden this difference in ideep and all tensors are going to align with pytorch's definition. So we could safely remove these checks from both aten and c2 integration code.
```
// aten/src/ATen/native/mkldnn/Conv.cpp
if (w.ndims() == x.ndims() + 1) {
AT_ASSERTM(
groups > 1,
"Only group _mkldnn_conv2d weights could have been reordered to 5d");
kernel_size[0] = w.get_dim(0) * w.get_dim(1);
std::copy_n(
w.get_dims().cbegin() + 2, x.ndims() - 1, kernel_size.begin() + 1);
} else {
std::copy_n(w.get_dims().cbegin(), x.ndims(), kernel_size.begin());
}
```
------
3. Enable DNNL built-in cache
Previously, we stored DNNL jitted kernels along with intermediate buffers inside ideep using an LRU cache. Now we are switching to the newly added DNNL built-in cache, and **no longer** caching buffers in order to reduce memory footprint.
This change will be mainly reflected in lower memory usage from memory profiling results. On the code side, we removed couple of lines of `op_key_` that depended on the ideep cache before.
------
4. Use 64-bit integer to denote dimensions
We changed the type of `ideep::dims` from `vector<int32_t>` to `vector<int64_t>`. This renders ideep dims no longer compatible with 32-bit dims used by caffe2. So we use something like `{stride_.begin(), stride_.end()}` to cast parameter `stride_` into a int64 vector.
<br>
**Misc changes in each commit:**
**Commit:** change build options
Some build options were slightly changed, mainly to avoid name collisions with other projects that include DNNL as a subproject. In addition, DNNL built-in cache is enabled by option `DNNL_ENABLE_PRIMITIVE_CACHE`.
Old | New
-- | --
WITH_EXAMPLE | MKLDNN_BUILD_EXAMPLES
WITH_TEST | MKLDNN_BUILD_TESTS
MKLDNN_THREADING | MKLDNN_CPU_RUNTIME
MKLDNN_USE_MKL | N/A (not use MKL anymore)
------
**Commit:** aten reintegration
- aten/src/ATen/native/mkldnn/BinaryOps.cpp
Implement binary ops using new operation `binary` provided by DNNL
- aten/src/ATen/native/mkldnn/Conv.cpp
Clean up group convolution checks
Simplify conv backward integration
- aten/src/ATen/native/mkldnn/MKLDNNConversions.cpp
Simplify prepacking convolution weights
- test/test_mkldnn.py
Fixed an issue in conv2d unit test: it didn't check conv results between mkldnn and aten implementation before. Instead, it compared the mkldnn with mkldnn as the default cpu path will also go into mkldnn. Now we use `torch.backends.mkldnn.flags` to fix this issue
- torch/utils/mkldnn.py
Prepack weight tensor on module `__init__` to achieve better performance significantly
------
**Commit:** caffe2 reintegration
- caffe2/ideep/ideep_utils.h
Clean up unused type definitions
- caffe2/ideep/operators/adam_op.cc & caffe2/ideep/operators/momentum_sgd_op.cc
Unify tensor initialization with `ideep::tensor::init`. Obsolete `ideep::tensor::reinit`
- caffe2/ideep/operators/conv_op.cc & caffe2/ideep/operators/quantization/int8_conv_op.cc
Clean up group convolution checks
Revamp convolution API
- caffe2/ideep/operators/conv_transpose_op.cc
Clean up group convolution checks
Clean up deconv workaround code
------
**Commit:** custom allocator
- Register c10 allocator as mentioned above
<br><br>
## Performance
We tested inference on some common models based on user scenarios, and most performance numbers are either better than or on par with DNNL 0.20.
ratio: new / old | Latency (batch=1 4T) | Throughput (batch=64 56T)
-- | -- | --
pytorch resnet18 | 121.4% | 99.7%
pytorch resnet50 | 123.1% | 106.9%
pytorch resnext101_32x8d | 116.3% | 100.1%
pytorch resnext50_32x4d | 141.9% | 104.4%
pytorch mobilenet_v2 | 163.0% | 105.8%
caffe2 alexnet | 303.0% | 99.2%
caffe2 googlenet-v3 | 101.1% | 99.2%
caffe2 inception-v1 | 102.2% | 101.7%
caffe2 mobilenet-v1 | 356.1% | 253.7%
caffe2 resnet101 | 100.4% | 99.8%
caffe2 resnet152 | 99.8% | 99.8%
caffe2 shufflenet | 141.1% | 69.0% †
caffe2 squeezenet | 98.5% | 99.2%
caffe2 vgg16 | 136.8% | 100.6%
caffe2 googlenet-v3 int8 | 100.0% | 100.7%
caffe2 mobilenet-v1 int8 | 779.2% | 943.0%
caffe2 resnet50 int8 | 99.5% | 95.5%
_Configuration:
Platform: Skylake 8180
Latency Test: 4 threads, warmup 30, iteration 500, batch size 1
Throughput Test: 56 threads, warmup 30, iteration 200, batch size 64_
† Shufflenet is one of the few models that require temp buffers during inference. The performance degradation is an expected issue since we no longer cache any buffer in the ideep. As for the solution, we suggest users opt for caching allocator like **jemalloc** as a drop-in replacement for system allocator in such heavy workloads.
Pull Request resolved: https://github.com/pytorch/pytorch/pull/32422
Test Plan:
Perf results: https://our.intern.facebook.com/intern/fblearner/details/177790608?tab=Experiment%20Results
10% improvement for ResNext with avx512, neutral on avx2
More results: https://fb.quip.com/ob10AL0bCDXW#NNNACAUoHJP
Reviewed By: yinghai
Differential Revision: D20381325
Pulled By: dzhulgakov
fbshipit-source-id: 803b906fd89ed8b723c5fcab55039efe3e4bcb77
2020-03-27 05:01:21 +00:00
|
|
|
return itensor::data_type::undef;
|
[feature request] [Caffe2] Enable MKLDNN support for inference (#6699)
* Add operators based-on IDEEP interfaces
Signed-off-by: Gu, Jinghui <jinghui.gu@intel.com>
* Enable IDEEP as a caffe2 device
Signed-off-by: Gu, Jinghui <jinghui.gu@intel.com>
* Add test cases for IDEEP ops
Signed-off-by: Gu, Jinghui <jinghui.gu@intel.com>
* Add IDEEP as a caffe2 submodule
Signed-off-by: Gu, Jinghui <jinghui.gu@intel.com>
* Skip test cases if no IDEEP support
Signed-off-by: Gu, Jinghui <jinghui.gu@intel.com>
* Correct cmake options for IDEEP
Signed-off-by: Gu, Jinghui <jinghui.gu@intel.com>
* Add dependences on ideep libraries
Signed-off-by: Gu, Jinghui <jinghui.gu@intel.com>
* Fix issues in IDEEP conv ops and etc.
Signed-off-by: Gu, Jinghui <jinghui.gu@intel.com>
* Move ideep from caffe2/ideep to caffe2/contrib/ideep
Signed-off-by: Gu Jinghui <jinghui.gu@intel.com>
* Update IDEEP to fix cmake issue
Signed-off-by: Gu, Jinghui <jinghui.gu@intel.com>
* Fix cmake issue caused by USE_MKL option
Signed-off-by: Gu, Jinghui <jinghui.gu@intel.com>
* Correct comments in MKL cmake file
Signed-off-by: Gu, Jinghui <jinghui.gu@intel.com>
2018-04-23 04:58:14 +00:00
|
|
|
}
|
|
|
|
|
|
2018-08-29 21:56:55 +00:00
|
|
|
public:
|
|
|
|
|
void FeedTensor(
|
|
|
|
|
const DeviceOption &option,
|
|
|
|
|
PyArrayObject *original_array,
|
|
|
|
|
itensor *tensor) {
|
2018-10-04 19:00:29 +00:00
|
|
|
#ifdef USE_NUMPY
|
2018-08-29 21:56:55 +00:00
|
|
|
PyArrayObject *array = PyArray_GETCONTIGUOUS(original_array);
|
|
|
|
|
auto g = MakeGuard([&]() { Py_XDECREF(array); });
|
|
|
|
|
const auto npy_type = PyArray_TYPE(array);
|
|
|
|
|
const TypeMeta &meta = NumpyTypeToCaffe(npy_type);
|
|
|
|
|
CAFFE_ENFORCE_NE(
|
|
|
|
|
meta.id(),
|
|
|
|
|
TypeIdentifier::uninitialized(),
|
[feature request] [Caffe2] Enable MKLDNN support for inference (#6699)
* Add operators based-on IDEEP interfaces
Signed-off-by: Gu, Jinghui <jinghui.gu@intel.com>
* Enable IDEEP as a caffe2 device
Signed-off-by: Gu, Jinghui <jinghui.gu@intel.com>
* Add test cases for IDEEP ops
Signed-off-by: Gu, Jinghui <jinghui.gu@intel.com>
* Add IDEEP as a caffe2 submodule
Signed-off-by: Gu, Jinghui <jinghui.gu@intel.com>
* Skip test cases if no IDEEP support
Signed-off-by: Gu, Jinghui <jinghui.gu@intel.com>
* Correct cmake options for IDEEP
Signed-off-by: Gu, Jinghui <jinghui.gu@intel.com>
* Add dependences on ideep libraries
Signed-off-by: Gu, Jinghui <jinghui.gu@intel.com>
* Fix issues in IDEEP conv ops and etc.
Signed-off-by: Gu, Jinghui <jinghui.gu@intel.com>
* Move ideep from caffe2/ideep to caffe2/contrib/ideep
Signed-off-by: Gu Jinghui <jinghui.gu@intel.com>
* Update IDEEP to fix cmake issue
Signed-off-by: Gu, Jinghui <jinghui.gu@intel.com>
* Fix cmake issue caused by USE_MKL option
Signed-off-by: Gu, Jinghui <jinghui.gu@intel.com>
* Correct comments in MKL cmake file
Signed-off-by: Gu, Jinghui <jinghui.gu@intel.com>
2018-04-23 04:58:14 +00:00
|
|
|
"This numpy data type is not supported: ",
|
2018-08-29 21:56:55 +00:00
|
|
|
PyArray_TYPE(array), ".");
|
[feature request] [Caffe2] Enable MKLDNN support for inference (#6699)
* Add operators based-on IDEEP interfaces
Signed-off-by: Gu, Jinghui <jinghui.gu@intel.com>
* Enable IDEEP as a caffe2 device
Signed-off-by: Gu, Jinghui <jinghui.gu@intel.com>
* Add test cases for IDEEP ops
Signed-off-by: Gu, Jinghui <jinghui.gu@intel.com>
* Add IDEEP as a caffe2 submodule
Signed-off-by: Gu, Jinghui <jinghui.gu@intel.com>
* Skip test cases if no IDEEP support
Signed-off-by: Gu, Jinghui <jinghui.gu@intel.com>
* Correct cmake options for IDEEP
Signed-off-by: Gu, Jinghui <jinghui.gu@intel.com>
* Add dependences on ideep libraries
Signed-off-by: Gu, Jinghui <jinghui.gu@intel.com>
* Fix issues in IDEEP conv ops and etc.
Signed-off-by: Gu, Jinghui <jinghui.gu@intel.com>
* Move ideep from caffe2/ideep to caffe2/contrib/ideep
Signed-off-by: Gu Jinghui <jinghui.gu@intel.com>
* Update IDEEP to fix cmake issue
Signed-off-by: Gu, Jinghui <jinghui.gu@intel.com>
* Fix cmake issue caused by USE_MKL option
Signed-off-by: Gu, Jinghui <jinghui.gu@intel.com>
* Correct comments in MKL cmake file
Signed-off-by: Gu, Jinghui <jinghui.gu@intel.com>
2018-04-23 04:58:14 +00:00
|
|
|
|
2018-08-29 21:56:55 +00:00
|
|
|
int ndim = PyArray_NDIM(array);
|
|
|
|
|
npy_intp *npy_dims = PyArray_DIMS(array);
|
[feature request] [Caffe2] Enable MKLDNN support for inference (#6699)
* Add operators based-on IDEEP interfaces
Signed-off-by: Gu, Jinghui <jinghui.gu@intel.com>
* Enable IDEEP as a caffe2 device
Signed-off-by: Gu, Jinghui <jinghui.gu@intel.com>
* Add test cases for IDEEP ops
Signed-off-by: Gu, Jinghui <jinghui.gu@intel.com>
* Add IDEEP as a caffe2 submodule
Signed-off-by: Gu, Jinghui <jinghui.gu@intel.com>
* Skip test cases if no IDEEP support
Signed-off-by: Gu, Jinghui <jinghui.gu@intel.com>
* Correct cmake options for IDEEP
Signed-off-by: Gu, Jinghui <jinghui.gu@intel.com>
* Add dependences on ideep libraries
Signed-off-by: Gu, Jinghui <jinghui.gu@intel.com>
* Fix issues in IDEEP conv ops and etc.
Signed-off-by: Gu, Jinghui <jinghui.gu@intel.com>
* Move ideep from caffe2/ideep to caffe2/contrib/ideep
Signed-off-by: Gu Jinghui <jinghui.gu@intel.com>
* Update IDEEP to fix cmake issue
Signed-off-by: Gu, Jinghui <jinghui.gu@intel.com>
* Fix cmake issue caused by USE_MKL option
Signed-off-by: Gu, Jinghui <jinghui.gu@intel.com>
* Correct comments in MKL cmake file
Signed-off-by: Gu, Jinghui <jinghui.gu@intel.com>
2018-04-23 04:58:14 +00:00
|
|
|
|
2018-08-29 21:56:55 +00:00
|
|
|
itensor::dims adims;
|
|
|
|
|
for (int i = 0; i < ndim; i++) {
|
|
|
|
|
adims.push_back(static_cast<itensor::dims::value_type>(npy_dims[i]));
|
|
|
|
|
}
|
[feature request] [Caffe2] Enable MKLDNN support for inference (#6699)
* Add operators based-on IDEEP interfaces
Signed-off-by: Gu, Jinghui <jinghui.gu@intel.com>
* Enable IDEEP as a caffe2 device
Signed-off-by: Gu, Jinghui <jinghui.gu@intel.com>
* Add test cases for IDEEP ops
Signed-off-by: Gu, Jinghui <jinghui.gu@intel.com>
* Add IDEEP as a caffe2 submodule
Signed-off-by: Gu, Jinghui <jinghui.gu@intel.com>
* Skip test cases if no IDEEP support
Signed-off-by: Gu, Jinghui <jinghui.gu@intel.com>
* Correct cmake options for IDEEP
Signed-off-by: Gu, Jinghui <jinghui.gu@intel.com>
* Add dependences on ideep libraries
Signed-off-by: Gu, Jinghui <jinghui.gu@intel.com>
* Fix issues in IDEEP conv ops and etc.
Signed-off-by: Gu, Jinghui <jinghui.gu@intel.com>
* Move ideep from caffe2/ideep to caffe2/contrib/ideep
Signed-off-by: Gu Jinghui <jinghui.gu@intel.com>
* Update IDEEP to fix cmake issue
Signed-off-by: Gu, Jinghui <jinghui.gu@intel.com>
* Fix cmake issue caused by USE_MKL option
Signed-off-by: Gu, Jinghui <jinghui.gu@intel.com>
* Correct comments in MKL cmake file
Signed-off-by: Gu, Jinghui <jinghui.gu@intel.com>
2018-04-23 04:58:14 +00:00
|
|
|
|
2018-08-29 21:56:55 +00:00
|
|
|
switch (npy_type) {
|
[feature request] [Caffe2] Enable MKLDNN support for inference (#6699)
* Add operators based-on IDEEP interfaces
Signed-off-by: Gu, Jinghui <jinghui.gu@intel.com>
* Enable IDEEP as a caffe2 device
Signed-off-by: Gu, Jinghui <jinghui.gu@intel.com>
* Add test cases for IDEEP ops
Signed-off-by: Gu, Jinghui <jinghui.gu@intel.com>
* Add IDEEP as a caffe2 submodule
Signed-off-by: Gu, Jinghui <jinghui.gu@intel.com>
* Skip test cases if no IDEEP support
Signed-off-by: Gu, Jinghui <jinghui.gu@intel.com>
* Correct cmake options for IDEEP
Signed-off-by: Gu, Jinghui <jinghui.gu@intel.com>
* Add dependences on ideep libraries
Signed-off-by: Gu, Jinghui <jinghui.gu@intel.com>
* Fix issues in IDEEP conv ops and etc.
Signed-off-by: Gu, Jinghui <jinghui.gu@intel.com>
* Move ideep from caffe2/ideep to caffe2/contrib/ideep
Signed-off-by: Gu Jinghui <jinghui.gu@intel.com>
* Update IDEEP to fix cmake issue
Signed-off-by: Gu, Jinghui <jinghui.gu@intel.com>
* Fix cmake issue caused by USE_MKL option
Signed-off-by: Gu, Jinghui <jinghui.gu@intel.com>
* Correct comments in MKL cmake file
Signed-off-by: Gu, Jinghui <jinghui.gu@intel.com>
2018-04-23 04:58:14 +00:00
|
|
|
case NPY_OBJECT:
|
|
|
|
|
case NPY_UNICODE:
|
|
|
|
|
CAFFE_THROW("IDeep doesn't support string");
|
|
|
|
|
break;
|
|
|
|
|
default:
|
|
|
|
|
auto type = type_transform(meta);
|
2018-08-29 21:56:55 +00:00
|
|
|
if (tensor->get_dims() != adims || type != tensor->get_data_type()) {
|
|
|
|
|
tensor->resize(adims, type);
|
|
|
|
|
}
|
2019-04-03 17:29:19 +00:00
|
|
|
tensor->feed_from(adims, type,
|
2018-08-29 21:56:55 +00:00
|
|
|
static_cast<void *>(PyArray_DATA(array)));
|
|
|
|
|
}
|
2018-10-04 19:00:29 +00:00
|
|
|
#else
|
|
|
|
|
CAFFE_THROW("Caffe2 was compiled without NumPy support.");
|
|
|
|
|
#endif // USE_NUMPY
|
2018-08-29 21:56:55 +00:00
|
|
|
}
|
[feature request] [Caffe2] Enable MKLDNN support for inference (#6699)
* Add operators based-on IDEEP interfaces
Signed-off-by: Gu, Jinghui <jinghui.gu@intel.com>
* Enable IDEEP as a caffe2 device
Signed-off-by: Gu, Jinghui <jinghui.gu@intel.com>
* Add test cases for IDEEP ops
Signed-off-by: Gu, Jinghui <jinghui.gu@intel.com>
* Add IDEEP as a caffe2 submodule
Signed-off-by: Gu, Jinghui <jinghui.gu@intel.com>
* Skip test cases if no IDEEP support
Signed-off-by: Gu, Jinghui <jinghui.gu@intel.com>
* Correct cmake options for IDEEP
Signed-off-by: Gu, Jinghui <jinghui.gu@intel.com>
* Add dependences on ideep libraries
Signed-off-by: Gu, Jinghui <jinghui.gu@intel.com>
* Fix issues in IDEEP conv ops and etc.
Signed-off-by: Gu, Jinghui <jinghui.gu@intel.com>
* Move ideep from caffe2/ideep to caffe2/contrib/ideep
Signed-off-by: Gu Jinghui <jinghui.gu@intel.com>
* Update IDEEP to fix cmake issue
Signed-off-by: Gu, Jinghui <jinghui.gu@intel.com>
* Fix cmake issue caused by USE_MKL option
Signed-off-by: Gu, Jinghui <jinghui.gu@intel.com>
* Correct comments in MKL cmake file
Signed-off-by: Gu, Jinghui <jinghui.gu@intel.com>
2018-04-23 04:58:14 +00:00
|
|
|
|
2018-08-29 21:56:55 +00:00
|
|
|
bool ZeroDim(PyArrayObject *array) {
|
2018-10-04 19:00:29 +00:00
|
|
|
#ifdef USE_NUMPY
|
2018-08-29 21:56:55 +00:00
|
|
|
int ndim = PyArray_NDIM(array);
|
2019-01-05 06:30:48 +00:00
|
|
|
return ndim == 0;
|
2018-10-04 19:00:29 +00:00
|
|
|
#else
|
|
|
|
|
CAFFE_THROW("Caffe2 was compiled without NumPy support.");
|
|
|
|
|
#endif
|
2018-08-29 21:56:55 +00:00
|
|
|
}
|
|
|
|
|
|
2019-02-14 04:51:55 +00:00
|
|
|
void Feed(
|
|
|
|
|
const DeviceOption& option,
|
|
|
|
|
PyArrayObject* original_array,
|
|
|
|
|
Blob* blob,
|
|
|
|
|
bool in_place) override {
|
2018-10-04 19:00:29 +00:00
|
|
|
#ifdef USE_NUMPY
|
2018-08-29 21:56:55 +00:00
|
|
|
try {
|
|
|
|
|
PyArrayObject *array = PyArray_GETCONTIGUOUS(original_array);
|
|
|
|
|
auto g = MakeGuard([&]() { Py_XDECREF(array); });
|
|
|
|
|
|
|
|
|
|
const auto npy_type = PyArray_TYPE(array);
|
|
|
|
|
const TypeMeta &meta = NumpyTypeToCaffe(npy_type);
|
2019-03-29 21:06:09 +00:00
|
|
|
|
2018-08-29 21:56:55 +00:00
|
|
|
// TODO: if necessary, use dispatcher.
|
2019-03-29 21:06:09 +00:00
|
|
|
if ((in_place && blob->IsType<itensor>())
|
|
|
|
|
|| (meta.Match<float>() && !ZeroDim(original_array))) {
|
[feature request] [Caffe2] Enable MKLDNN support for inference (#6699)
* Add operators based-on IDEEP interfaces
Signed-off-by: Gu, Jinghui <jinghui.gu@intel.com>
* Enable IDEEP as a caffe2 device
Signed-off-by: Gu, Jinghui <jinghui.gu@intel.com>
* Add test cases for IDEEP ops
Signed-off-by: Gu, Jinghui <jinghui.gu@intel.com>
* Add IDEEP as a caffe2 submodule
Signed-off-by: Gu, Jinghui <jinghui.gu@intel.com>
* Skip test cases if no IDEEP support
Signed-off-by: Gu, Jinghui <jinghui.gu@intel.com>
* Correct cmake options for IDEEP
Signed-off-by: Gu, Jinghui <jinghui.gu@intel.com>
* Add dependences on ideep libraries
Signed-off-by: Gu, Jinghui <jinghui.gu@intel.com>
* Fix issues in IDEEP conv ops and etc.
Signed-off-by: Gu, Jinghui <jinghui.gu@intel.com>
* Move ideep from caffe2/ideep to caffe2/contrib/ideep
Signed-off-by: Gu Jinghui <jinghui.gu@intel.com>
* Update IDEEP to fix cmake issue
Signed-off-by: Gu, Jinghui <jinghui.gu@intel.com>
* Fix cmake issue caused by USE_MKL option
Signed-off-by: Gu, Jinghui <jinghui.gu@intel.com>
* Correct comments in MKL cmake file
Signed-off-by: Gu, Jinghui <jinghui.gu@intel.com>
2018-04-23 04:58:14 +00:00
|
|
|
FeedTensor(option, original_array, blob->GetMutable<itensor>());
|
2018-08-29 21:56:55 +00:00
|
|
|
} else {
|
|
|
|
|
DeviceOption cpu_option(option);
|
caffe2::DeviceType -> at::DeviceType (#11254)
Summary:
Pull Request resolved: https://github.com/pytorch/pytorch/pull/11254
Previously we use DeviceType in caffe2.proto directly, but it's an `enum` and have implicit conversion to int, which does not have type safety, e.g. we have to explicitly check for a device type is valid in event.h:
```
template <int d>
struct EventCreateFunctionRegisterer {
explicit EventCreateFunctionRegisterer(EventCreateFunction f) {
static_assert(d < MaxDeviceTypes, "");
Event::event_creator_[d] = f;
}
};
```
at::DeviceType is an `enum class`, and it does not have implicit conversion to int, and provides better type safety guarantees. In this diff we have done the following refactor(taking CPU as an example):
1. caffe2::DeviceType → caffe2::DeviceTypeProto
2. caffe2::CPU → caffe2::PROTO_CPU
3. caffe2::DeviceType = at::DeviceType
4. caffe2::CPU = at::DeviceType::CPU
codemod -d caffe2/caffe2 --extensions h,cc,cpp 'device_type\(\), ' 'device_type(), PROTO_'
+ some manual changes
In short, after this diff, in c++, caffe2::CPU refers to the at::DeviceType::CPU and the old proto caffe2::CPU will be caffe2::PROTO_CPU.
In python side, we have a temporary workaround that alias `caffe2_pb2.CPU = caffe2_pb2.PROOT_CPU` to make the change easier to review and this will be removed later.
Reviewed By: ezyang
Differential Revision: D9545704
fbshipit-source-id: 461a28a4ca74e616d3ee183a607078a717fd38a7
2018-09-05 23:13:54 +00:00
|
|
|
cpu_option.set_device_type(DeviceTypeProto::PROTO_CPU);
|
2018-08-29 21:56:55 +00:00
|
|
|
TensorFeeder<CPUContext> cpu_tensor_feeder;
|
2018-12-04 20:42:32 +00:00
|
|
|
if (in_place) {
|
|
|
|
|
cpu_tensor_feeder.FeedTensor(
|
2019-03-29 21:06:09 +00:00
|
|
|
cpu_option,
|
2018-12-04 20:42:32 +00:00
|
|
|
original_array,
|
2019-03-29 21:06:09 +00:00
|
|
|
BlobGetMutableTensor(blob, OptionToDevice(cpu_option).type()),
|
2019-01-18 08:28:26 +00:00
|
|
|
true);
|
2018-12-04 20:42:32 +00:00
|
|
|
} else {
|
|
|
|
|
blob->Reset<Tensor>(new Tensor(
|
|
|
|
|
cpu_tensor_feeder.FeedTensor(cpu_option, original_array)));
|
|
|
|
|
}
|
[feature request] [Caffe2] Enable MKLDNN support for inference (#6699)
* Add operators based-on IDEEP interfaces
Signed-off-by: Gu, Jinghui <jinghui.gu@intel.com>
* Enable IDEEP as a caffe2 device
Signed-off-by: Gu, Jinghui <jinghui.gu@intel.com>
* Add test cases for IDEEP ops
Signed-off-by: Gu, Jinghui <jinghui.gu@intel.com>
* Add IDEEP as a caffe2 submodule
Signed-off-by: Gu, Jinghui <jinghui.gu@intel.com>
* Skip test cases if no IDEEP support
Signed-off-by: Gu, Jinghui <jinghui.gu@intel.com>
* Correct cmake options for IDEEP
Signed-off-by: Gu, Jinghui <jinghui.gu@intel.com>
* Add dependences on ideep libraries
Signed-off-by: Gu, Jinghui <jinghui.gu@intel.com>
* Fix issues in IDEEP conv ops and etc.
Signed-off-by: Gu, Jinghui <jinghui.gu@intel.com>
* Move ideep from caffe2/ideep to caffe2/contrib/ideep
Signed-off-by: Gu Jinghui <jinghui.gu@intel.com>
* Update IDEEP to fix cmake issue
Signed-off-by: Gu, Jinghui <jinghui.gu@intel.com>
* Fix cmake issue caused by USE_MKL option
Signed-off-by: Gu, Jinghui <jinghui.gu@intel.com>
* Correct comments in MKL cmake file
Signed-off-by: Gu, Jinghui <jinghui.gu@intel.com>
2018-04-23 04:58:14 +00:00
|
|
|
}
|
2018-08-29 21:56:55 +00:00
|
|
|
} catch (ideep::error &e) {
|
|
|
|
|
LOG(ERROR) << "IDEEP error: " << e.message;
|
|
|
|
|
throw;
|
|
|
|
|
}
|
2018-10-04 19:00:29 +00:00
|
|
|
#else
|
|
|
|
|
CAFFE_THROW("Caffe2 was compiled without NumPy support.");
|
|
|
|
|
#endif
|
2018-08-29 21:56:55 +00:00
|
|
|
}
|
[feature request] [Caffe2] Enable MKLDNN support for inference (#6699)
* Add operators based-on IDEEP interfaces
Signed-off-by: Gu, Jinghui <jinghui.gu@intel.com>
* Enable IDEEP as a caffe2 device
Signed-off-by: Gu, Jinghui <jinghui.gu@intel.com>
* Add test cases for IDEEP ops
Signed-off-by: Gu, Jinghui <jinghui.gu@intel.com>
* Add IDEEP as a caffe2 submodule
Signed-off-by: Gu, Jinghui <jinghui.gu@intel.com>
* Skip test cases if no IDEEP support
Signed-off-by: Gu, Jinghui <jinghui.gu@intel.com>
* Correct cmake options for IDEEP
Signed-off-by: Gu, Jinghui <jinghui.gu@intel.com>
* Add dependences on ideep libraries
Signed-off-by: Gu, Jinghui <jinghui.gu@intel.com>
* Fix issues in IDEEP conv ops and etc.
Signed-off-by: Gu, Jinghui <jinghui.gu@intel.com>
* Move ideep from caffe2/ideep to caffe2/contrib/ideep
Signed-off-by: Gu Jinghui <jinghui.gu@intel.com>
* Update IDEEP to fix cmake issue
Signed-off-by: Gu, Jinghui <jinghui.gu@intel.com>
* Fix cmake issue caused by USE_MKL option
Signed-off-by: Gu, Jinghui <jinghui.gu@intel.com>
* Correct comments in MKL cmake file
Signed-off-by: Gu, Jinghui <jinghui.gu@intel.com>
2018-04-23 04:58:14 +00:00
|
|
|
};
|
|
|
|
|
|
|
|
|
|
} // namespace python
|
|
|
|
|
} // namespace caffe2
|