Skip to content

Commit

Permalink
add gpu python op test
Browse files Browse the repository at this point in the history
  • Loading branch information
QiJune committed Jul 31, 2017
1 parent 47d8bca commit 4a1f7bd
Show file tree
Hide file tree
Showing 5 changed files with 70 additions and 47 deletions.
8 changes: 5 additions & 3 deletions paddle/framework/detail/tensor-inl.h
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,7 @@ See the License for the specific language governing permissions and
limitations under the License. */

#pragma once

#include <string>
#include "paddle/memory/memcpy.h"

namespace paddle {
Expand Down Expand Up @@ -62,9 +62,11 @@ inline T* Tensor::mutable_data(platform::Place place) {
if (platform::is_cpu_place(place)) {
holder_.reset(new PlaceholderImpl<T, platform::CPUPlace>(
boost::get<platform::CPUPlace>(place), size));
} else if (platform::is_gpu_place(place)) {
#ifdef PADDLE_ONLY_CPU
PADDLE_THROW("'GPUPlace' is not supported in CPU only device.");
}
#ifndef PADDLE_ONLY_CPU
else if (platform::is_gpu_place(place)) {
#else
holder_.reset(new PlaceholderImpl<T, platform::GPUPlace>(
boost::get<platform::GPUPlace>(place), size));
}
Expand Down
12 changes: 6 additions & 6 deletions paddle/platform/enforce.h
Original file line number Diff line number Diff line change
Expand Up @@ -132,12 +132,12 @@ inline void throw_on_error(T e) {
throw_on_error(e, "");
}

#define PADDLE_THROW(...) \
do { \
throw ::paddle::platform::EnforceNotMet( \
std::make_exception_ptr( \
std::runtime_error(string::Sprintf(__VA_ARGS__))), \
__FILE__, __LINE__); \
#define PADDLE_THROW(...) \
do { \
throw ::paddle::platform::EnforceNotMet( \
std::make_exception_ptr( \
std::runtime_error(paddle::string::Sprintf(__VA_ARGS__))), \
__FILE__, __LINE__); \
} while (0)

#define PADDLE_ENFORCE(...) \
Expand Down
33 changes: 24 additions & 9 deletions paddle/pybind/pybind.cc
Original file line number Diff line number Diff line change
Expand Up @@ -56,6 +56,14 @@ static size_t UniqueIntegerGenerator() {
return generator.fetch_add(1);
}

bool IsCompileGPU() {
#ifdef PADDLE_ONLY_CPU
return false;
#else
return true;
#endif
}

PYBIND11_PLUGIN(core) {
py::module m("core", "C++ core of PaddlePaddle");

Expand Down Expand Up @@ -148,18 +156,23 @@ All parameter, weight, gradient are variables in Paddle.
.def("temp", pd::OperatorBase::TMP_VAR_NAME);

py::class_<paddle::platform::DeviceContext>(m, "DeviceContext")
.def_static("cpu_context",
[]() -> paddle::platform::DeviceContext* {
return new paddle::platform::CPUDeviceContext();
})
#ifndef PADDLE_ONLY_CPU
.def_static("gpu_context",
[](paddle::platform::GPUPlace& place)
.def_static("create",
[](paddle::platform::CPUPlace& place)
-> paddle::platform::DeviceContext* {
return new paddle::platform::CUDADeviceContext(place);
return new paddle::platform::CPUDeviceContext();
})
.def_static(
"create",
[](paddle::platform::GPUPlace& place)
-> paddle::platform::DeviceContext* {
#ifdef PADDLE_ONLY_CPU
PADDLE_THROW("'GPUPlace' is not supported in CPU only device.");

#else
return new paddle::platform::CUDADeviceContext(place);
#endif
; // NOLINT
});

py::class_<paddle::platform::GPUPlace>(m, "GPUPlace").def(py::init<int>());

py::class_<paddle::platform::CPUPlace>(m, "CPUPlace").def(py::init<>());
Expand Down Expand Up @@ -198,5 +211,7 @@ All parameter, weight, gradient are variables in Paddle.

m.def("unique_integer", UniqueIntegerGenerator);

m.def("is_compile_gpu", IsCompileGPU);

return m.ptr();
}
62 changes: 34 additions & 28 deletions python/paddle/v2/framework/tests/op_test_util.py
Original file line number Diff line number Diff line change
Expand Up @@ -25,42 +25,48 @@ def test_all(self):
self.assertIsNotNone(func)

scope = core.Scope(None)
place = core.CPUPlace()

kwargs = dict()

for in_name in func.all_input_args:
if hasattr(self, in_name):
kwargs[in_name] = in_name
var = scope.create_var(in_name).get_tensor()
arr = getattr(self, in_name)
var.set_dims(arr.shape)
var.set(arr, place)
else:
kwargs[in_name] = "@EMPTY@"
places = []
places.append(core.CPUPlace())
if core.is_compile_gpu():
places.append(core.GPUPlace(0))

for place in places:
for in_name in func.all_input_args:
if hasattr(self, in_name):
kwargs[in_name] = in_name
var = scope.create_var(in_name).get_tensor()
arr = getattr(self, in_name)
var.set_dims(arr.shape)
var.set(arr, place)
else:
kwargs[in_name] = "@EMPTY@"

for out_name in func.all_output_args:
if hasattr(self, out_name):
kwargs[out_name] = out_name
scope.create_var(out_name).get_tensor()
for out_name in func.all_output_args:
if hasattr(self, out_name):
kwargs[out_name] = out_name
scope.create_var(out_name).get_tensor()

for attr_name in func.all_attr_args:
if hasattr(self, attr_name):
kwargs[attr_name] = getattr(self, attr_name)
for attr_name in func.all_attr_args:
if hasattr(self, attr_name):
kwargs[attr_name] = getattr(self, attr_name)

op = func(**kwargs)
op = func(**kwargs)

op.infer_shape(scope)
op.infer_shape(scope)

ctx = core.DeviceContext.cpu_context()
op.run(scope, ctx)
ctx = core.DeviceContext.create(place)
op.run(scope, ctx)

for out_name in func.all_output_args:
actual = numpy.array(scope.get_var(out_name).get_tensor())
expect = getattr(self, out_name)
# TODO(qijun) The default decimal is 7, but numpy.dot and eigen.mul
# has some diff, and could not pass unittest. So I set decimal 3 here.
# And I will check this in future.
numpy.testing.assert_almost_equal(actual, expect, decimal=3)
for out_name in func.all_output_args:
actual = numpy.array(scope.get_var(out_name).get_tensor())
expect = getattr(self, out_name)
# TODO(qijun) The default decimal is 7, but numpy.dot and eigen.mul
# has some diff, and could not pass unittest. So I set decimal 3 here.
# And I will check this in future.
numpy.testing.assert_almost_equal(actual, expect, decimal=3)

obj.test_all = test_all
return obj
2 changes: 1 addition & 1 deletion python/paddle/v2/framework/tests/test_fc_op.py
Original file line number Diff line number Diff line change
Expand Up @@ -33,7 +33,7 @@ def test_fc(self):
op.infer_shape(scope)
self.assertEqual([1000, 100], tensor.shape())

ctx = core.DeviceContext.cpu_context()
ctx = core.DeviceContext.create(place)

op.run(scope, ctx)

Expand Down

0 comments on commit 4a1f7bd

Please sign in to comment.