Fix #3342 and h2oai/h2o4gpu#625: Save predictor parameters in model file (#3856)

* Fix #3342 and h2oai/h2o4gpu#625: Save predictor parameters in model file

This allows pickled models to retain predictor attributes, such as
'predictor' (whether to use CPU or GPU) and 'n_gpu' (number of GPUs
to use). Related: h2oai/h2o4gpu#625

Closes #3342.

TODO. Write a test.

* Fix lint

* Do not load GPU predictor into CPU-only XGBoost

* Add a test for pickling GPU predictors

* Make sample data big enough to pass multi GPU test

* Update test_gpu_predictor.cu
This commit is contained in:
Philip Hyunsu Cho
2018-11-03 21:45:38 -07:00
committed by GitHub
parent e04ab56b57
commit 91537e7353
7 changed files with 206 additions and 51 deletions

View File

@@ -2,20 +2,10 @@
#include <gtest/gtest.h>
#include <vector>
#include "helpers.h"
#include "./test_learner.h"
#include "xgboost/learner.h"
namespace xgboost {
class LearnerTestHookAdapter {
public:
static inline std::string GetUpdaterSequence(const Learner* learner) {
const LearnerTestHook* hook = dynamic_cast<const LearnerTestHook*>(learner);
CHECK(hook) << "LearnerImpl did not inherit from LearnerTestHook";
return hook->GetUpdaterSequence();
}
};
TEST(learner, Test) {
typedef std::pair<std::string, std::string> arg;
auto args = {arg("tree_method", "exact")};
@@ -35,20 +25,20 @@ TEST(learner, SelectTreeMethod) {
// Test if `tree_method` can be set
learner->Configure({arg("tree_method", "approx")});
ASSERT_EQ(LearnerTestHookAdapter::GetUpdaterSequence(learner.get()),
ASSERT_EQ(learner->GetConfigurationArguments().at("updater"),
"grow_histmaker,prune");
learner->Configure({arg("tree_method", "exact")});
ASSERT_EQ(LearnerTestHookAdapter::GetUpdaterSequence(learner.get()),
ASSERT_EQ(learner->GetConfigurationArguments().at("updater"),
"grow_colmaker,prune");
learner->Configure({arg("tree_method", "hist")});
ASSERT_EQ(LearnerTestHookAdapter::GetUpdaterSequence(learner.get()),
ASSERT_EQ(learner->GetConfigurationArguments().at("updater"),
"grow_fast_histmaker");
#ifdef XGBOOST_USE_CUDA
learner->Configure({arg("tree_method", "gpu_exact")});
ASSERT_EQ(LearnerTestHookAdapter::GetUpdaterSequence(learner.get()),
ASSERT_EQ(learner->GetConfigurationArguments().at("updater"),
"grow_gpu,prune");
learner->Configure({arg("tree_method", "gpu_hist")});
ASSERT_EQ(LearnerTestHookAdapter::GetUpdaterSequence(learner.get()),
ASSERT_EQ(learner->GetConfigurationArguments().at("updater"),
"grow_gpu_hist");
#endif