Pass shared pointer instead of raw pointer to Learner. (#5302)
Extracted from https://github.com/dmlc/xgboost/pull/5220 .
This commit is contained in:
@@ -1,4 +1,6 @@
|
||||
// Copyright (c) 2019 by Contributors
|
||||
/*!
|
||||
* Copyright 2019-2020 XGBoost contributors
|
||||
*/
|
||||
#include <gtest/gtest.h>
|
||||
#include <xgboost/version_config.h>
|
||||
#include <xgboost/c_api.h>
|
||||
@@ -92,7 +94,7 @@ TEST(c_api, ConfigIO) {
|
||||
std::shared_ptr<Learner> learner { Learner::Create(mat) };
|
||||
|
||||
BoosterHandle handle = learner.get();
|
||||
learner->UpdateOneIter(0, p_dmat.get());
|
||||
learner->UpdateOneIter(0, p_dmat);
|
||||
|
||||
char const* out[1];
|
||||
bst_ulong len {0};
|
||||
@@ -127,7 +129,7 @@ TEST(c_api, JsonModelIO) {
|
||||
|
||||
std::shared_ptr<Learner> learner { Learner::Create(mat) };
|
||||
|
||||
learner->UpdateOneIter(0, p_dmat.get());
|
||||
learner->UpdateOneIter(0, p_dmat);
|
||||
BoosterHandle handle = learner.get();
|
||||
|
||||
std::string modelfile_0 = tempdir.path + "/model_0.json";
|
||||
|
||||
@@ -1,3 +1,6 @@
|
||||
/*!
|
||||
* Copyright 2019-2020 XGBoost contributors
|
||||
*/
|
||||
#include <gtest/gtest.h>
|
||||
#include <dmlc/filesystem.h>
|
||||
#include <xgboost/generic_parameters.h>
|
||||
@@ -62,7 +65,7 @@ TEST(GBTree, ChoosePredictor) {
|
||||
auto learner = std::unique_ptr<Learner>(Learner::Create({p_dmat}));
|
||||
learner->SetParams(Args{{"tree_method", "gpu_hist"}, {"gpu_id", "0"}});
|
||||
for (size_t i = 0; i < 4; ++i) {
|
||||
learner->UpdateOneIter(i, p_dmat.get());
|
||||
learner->UpdateOneIter(i, p_dmat);
|
||||
}
|
||||
ASSERT_TRUE(data.HostCanWrite());
|
||||
dmlc::TemporaryDirectory tempdir;
|
||||
@@ -81,7 +84,7 @@ TEST(GBTree, ChoosePredictor) {
|
||||
}
|
||||
learner->SetParams(Args{{"tree_method", "gpu_hist"}, {"gpu_id", "0"}});
|
||||
for (size_t i = 0; i < 4; ++i) {
|
||||
learner->UpdateOneIter(i, p_dmat.get());
|
||||
learner->UpdateOneIter(i, p_dmat);
|
||||
}
|
||||
ASSERT_TRUE(data.HostCanWrite());
|
||||
|
||||
@@ -94,7 +97,7 @@ TEST(GBTree, ChoosePredictor) {
|
||||
learner = std::unique_ptr<Learner>(Learner::Create({p_dmat}));
|
||||
learner->SetParams(Args{{"tree_method", "gpu_hist"}, {"gpu_id", "0"}});
|
||||
for (size_t i = 0; i < 4; ++i) {
|
||||
learner->UpdateOneIter(i, p_dmat.get());
|
||||
learner->UpdateOneIter(i, p_dmat);
|
||||
}
|
||||
// data is not pulled back into host
|
||||
ASSERT_FALSE(data.HostCanWrite());
|
||||
@@ -196,13 +199,13 @@ TEST(Dart, Prediction) {
|
||||
learner->Configure();
|
||||
|
||||
for (size_t i = 0; i < 16; ++i) {
|
||||
learner->UpdateOneIter(i, p_mat.get());
|
||||
learner->UpdateOneIter(i, p_mat);
|
||||
}
|
||||
|
||||
HostDeviceVector<float> predts_training;
|
||||
learner->Predict(p_mat.get(), false, &predts_training, 0, true);
|
||||
learner->Predict(p_mat, false, &predts_training, 0, true);
|
||||
HostDeviceVector<float> predts_inference;
|
||||
learner->Predict(p_mat.get(), false, &predts_inference, 0, false);
|
||||
learner->Predict(p_mat, false, &predts_inference, 0, false);
|
||||
|
||||
auto& h_predts_training = predts_training.ConstHostVector();
|
||||
auto& h_predts_inference = predts_inference.ConstHostVector();
|
||||
|
||||
@@ -1,4 +1,6 @@
|
||||
// Copyright by Contributors
|
||||
/*!
|
||||
* Copyright 2017-2020 XGBoost contributors
|
||||
*/
|
||||
#include <gtest/gtest.h>
|
||||
#include <vector>
|
||||
#include "helpers.h"
|
||||
@@ -79,13 +81,13 @@ TEST(Learner, CheckGroup) {
|
||||
std::vector<std::shared_ptr<xgboost::DMatrix>> mat = {p_mat};
|
||||
auto learner = std::unique_ptr<Learner>(Learner::Create(mat));
|
||||
learner->SetParams({Arg{"objective", "rank:pairwise"}});
|
||||
EXPECT_NO_THROW(learner->UpdateOneIter(0, p_mat.get()));
|
||||
EXPECT_NO_THROW(learner->UpdateOneIter(0, p_mat));
|
||||
|
||||
group.resize(kNumGroups+1);
|
||||
group[3] = 4;
|
||||
group[4] = 1;
|
||||
p_mat->Info().SetInfo("group", group.data(), DataType::kUInt32, kNumGroups+1);
|
||||
EXPECT_ANY_THROW(learner->UpdateOneIter(0, p_mat.get()));
|
||||
EXPECT_ANY_THROW(learner->UpdateOneIter(0, p_mat));
|
||||
|
||||
delete pp_mat;
|
||||
}
|
||||
@@ -107,7 +109,7 @@ TEST(Learner, SLOW_CheckMultiBatch) {
|
||||
std::vector<std::shared_ptr<DMatrix>> mat{dmat};
|
||||
auto learner = std::unique_ptr<Learner>(Learner::Create(mat));
|
||||
learner->SetParams(Args{{"objective", "binary:logistic"}});
|
||||
learner->UpdateOneIter(0, dmat.get());
|
||||
learner->UpdateOneIter(0, dmat);
|
||||
}
|
||||
|
||||
TEST(Learner, Configuration) {
|
||||
@@ -142,6 +144,7 @@ TEST(Learner, JsonModelIO) {
|
||||
auto pp_dmat = CreateDMatrix(kRows, 10, 0);
|
||||
std::shared_ptr<DMatrix> p_dmat {*pp_dmat};
|
||||
p_dmat->Info().labels_.Resize(kRows);
|
||||
CHECK_NE(p_dmat->Info().num_col_, 0);
|
||||
|
||||
{
|
||||
std::unique_ptr<Learner> learner { Learner::Create({p_dmat}) };
|
||||
@@ -160,7 +163,7 @@ TEST(Learner, JsonModelIO) {
|
||||
{
|
||||
std::unique_ptr<Learner> learner { Learner::Create({p_dmat}) };
|
||||
for (int32_t iter = 0; iter < kIters; ++iter) {
|
||||
learner->UpdateOneIter(iter, p_dmat.get());
|
||||
learner->UpdateOneIter(iter, p_dmat);
|
||||
}
|
||||
learner->SetAttr("best_score", "15.2");
|
||||
|
||||
@@ -197,20 +200,20 @@ TEST(Learner, GPUConfiguration) {
|
||||
std::unique_ptr<Learner> learner {Learner::Create(mat)};
|
||||
learner->SetParams({Arg{"booster", "gblinear"},
|
||||
Arg{"updater", "gpu_coord_descent"}});
|
||||
learner->UpdateOneIter(0, p_dmat.get());
|
||||
learner->UpdateOneIter(0, p_dmat);
|
||||
ASSERT_EQ(learner->GetGenericParameter().gpu_id, 0);
|
||||
}
|
||||
{
|
||||
std::unique_ptr<Learner> learner {Learner::Create(mat)};
|
||||
learner->SetParams({Arg{"tree_method", "gpu_hist"}});
|
||||
learner->UpdateOneIter(0, p_dmat.get());
|
||||
learner->UpdateOneIter(0, p_dmat);
|
||||
ASSERT_EQ(learner->GetGenericParameter().gpu_id, 0);
|
||||
}
|
||||
{
|
||||
// with CPU algorithm
|
||||
std::unique_ptr<Learner> learner {Learner::Create(mat)};
|
||||
learner->SetParams({Arg{"tree_method", "hist"}});
|
||||
learner->UpdateOneIter(0, p_dmat.get());
|
||||
learner->UpdateOneIter(0, p_dmat);
|
||||
ASSERT_EQ(learner->GetGenericParameter().gpu_id, -1);
|
||||
}
|
||||
{
|
||||
@@ -218,7 +221,7 @@ TEST(Learner, GPUConfiguration) {
|
||||
std::unique_ptr<Learner> learner {Learner::Create(mat)};
|
||||
learner->SetParams({Arg{"tree_method", "hist"},
|
||||
Arg{"gpu_id", "0"}});
|
||||
learner->UpdateOneIter(0, p_dmat.get());
|
||||
learner->UpdateOneIter(0, p_dmat);
|
||||
ASSERT_EQ(learner->GetGenericParameter().gpu_id, 0);
|
||||
}
|
||||
{
|
||||
@@ -228,7 +231,7 @@ TEST(Learner, GPUConfiguration) {
|
||||
std::unique_ptr<Learner> learner {Learner::Create(mat)};
|
||||
learner->SetParams({Arg{"tree_method", "hist"},
|
||||
Arg{"predictor", "gpu_predictor"}});
|
||||
learner->UpdateOneIter(0, p_dmat.get());
|
||||
learner->UpdateOneIter(0, p_dmat);
|
||||
ASSERT_EQ(learner->GetGenericParameter().gpu_id, 0);
|
||||
}
|
||||
|
||||
|
||||
@@ -1,3 +1,4 @@
|
||||
// Copyright (c) 2019-2020 by Contributors
|
||||
#include <gtest/gtest.h>
|
||||
#include <dmlc/filesystem.h>
|
||||
#include <string>
|
||||
@@ -24,12 +25,13 @@ void TestLearnerSerialization(Args args, FeatureMap const& fmap, std::shared_ptr
|
||||
std::vector<std::string> dumped_0;
|
||||
std::string model_at_kiter;
|
||||
|
||||
// Train for kIters.
|
||||
{
|
||||
std::unique_ptr<dmlc::Stream> fo(dmlc::Stream::Create(fname.c_str(), "w"));
|
||||
std::unique_ptr<Learner> learner {Learner::Create({p_dmat})};
|
||||
learner->SetParams(args);
|
||||
for (int32_t iter = 0; iter < kIters; ++iter) {
|
||||
learner->UpdateOneIter(iter, p_dmat.get());
|
||||
learner->UpdateOneIter(iter, p_dmat);
|
||||
}
|
||||
dumped_0 = learner->DumpModel(fmap, true, "json");
|
||||
learner->Save(fo.get());
|
||||
@@ -38,6 +40,7 @@ void TestLearnerSerialization(Args args, FeatureMap const& fmap, std::shared_ptr
|
||||
learner->Save(&mem_out);
|
||||
}
|
||||
|
||||
// Assert dumped model is same after loading
|
||||
std::vector<std::string> dumped_1;
|
||||
{
|
||||
std::unique_ptr<dmlc::Stream> fi(dmlc::Stream::Create(fname.c_str(), "r"));
|
||||
@@ -73,7 +76,7 @@ void TestLearnerSerialization(Args args, FeatureMap const& fmap, std::shared_ptr
|
||||
}
|
||||
|
||||
for (int32_t iter = kIters; iter < 2 * kIters; ++iter) {
|
||||
learner->UpdateOneIter(iter, p_dmat.get());
|
||||
learner->UpdateOneIter(iter, p_dmat);
|
||||
}
|
||||
common::MemoryBufferStream fo(&continued_model);
|
||||
learner->Save(&fo);
|
||||
@@ -84,7 +87,7 @@ void TestLearnerSerialization(Args args, FeatureMap const& fmap, std::shared_ptr
|
||||
std::unique_ptr<Learner> learner{Learner::Create({p_dmat})};
|
||||
learner->SetParams(args);
|
||||
for (int32_t iter = 0; iter < 2 * kIters; ++iter) {
|
||||
learner->UpdateOneIter(iter, p_dmat.get());
|
||||
learner->UpdateOneIter(iter, p_dmat);
|
||||
|
||||
// Verify model is same at the same iteration during two training
|
||||
// sessions.
|
||||
@@ -98,6 +101,7 @@ void TestLearnerSerialization(Args args, FeatureMap const& fmap, std::shared_ptr
|
||||
common::MemoryBufferStream fo(&model_at_2kiter);
|
||||
learner->Save(&fo);
|
||||
}
|
||||
|
||||
Json m_0 = Json::Load(StringView{continued_model.c_str(), continued_model.size()});
|
||||
Json m_1 = Json::Load(StringView{model_at_2kiter.c_str(), model_at_2kiter.size()});
|
||||
ASSERT_EQ(m_0, m_1);
|
||||
@@ -127,7 +131,7 @@ void TestLearnerSerialization(Args args, FeatureMap const& fmap, std::shared_ptr
|
||||
}
|
||||
|
||||
for (int32_t iter = kIters; iter < 2 * kIters; ++iter) {
|
||||
learner->UpdateOneIter(iter, p_dmat.get());
|
||||
learner->UpdateOneIter(iter, p_dmat);
|
||||
}
|
||||
serialised_model_tmp = std::string{};
|
||||
common::MemoryBufferStream fo(&serialised_model_tmp);
|
||||
@@ -306,7 +310,7 @@ TEST_F(SerializationTest, ConfigurationCount) {
|
||||
learner->SetParam("enable_experimental_json_serialization", "1");
|
||||
|
||||
for (size_t i = 0; i < 10; ++i) {
|
||||
learner->UpdateOneIter(i, p_dmat.get());
|
||||
learner->UpdateOneIter(i, p_dmat);
|
||||
}
|
||||
common::MemoryBufferStream fo(&model_str);
|
||||
learner->Save(&fo);
|
||||
@@ -317,7 +321,7 @@ TEST_F(SerializationTest, ConfigurationCount) {
|
||||
auto learner = std::unique_ptr<Learner>(Learner::Create(mat));
|
||||
learner->Load(&fi);
|
||||
for (size_t i = 0; i < 10; ++i) {
|
||||
learner->UpdateOneIter(i, p_dmat.get());
|
||||
learner->UpdateOneIter(i, p_dmat);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
/*!
|
||||
* Copyright 2017-2019 XGBoost contributors
|
||||
* Copyright 2017-2020 XGBoost contributors
|
||||
*/
|
||||
#include <thrust/device_vector.h>
|
||||
#include <dmlc/filesystem.h>
|
||||
@@ -387,6 +387,7 @@ TEST(GpuHist, UniformSampling) {
|
||||
constexpr size_t kRows = 4096;
|
||||
constexpr size_t kCols = 2;
|
||||
constexpr float kSubsample = 0.99;
|
||||
common::GlobalRandom().seed(1994);
|
||||
|
||||
// Create an in-memory DMatrix.
|
||||
std::unique_ptr<DMatrix> dmat(CreateSparsePageDMatrixWithRC(kRows, kCols, 0, true));
|
||||
@@ -415,6 +416,7 @@ TEST(GpuHist, GradientBasedSampling) {
|
||||
constexpr size_t kRows = 4096;
|
||||
constexpr size_t kCols = 2;
|
||||
constexpr float kSubsample = 0.99;
|
||||
common::GlobalRandom().seed(1994);
|
||||
|
||||
// Create an in-memory DMatrix.
|
||||
std::unique_ptr<DMatrix> dmat(CreateSparsePageDMatrixWithRC(kRows, kCols, 0, true));
|
||||
@@ -478,6 +480,7 @@ TEST(GpuHist, ExternalMemoryWithSampling) {
|
||||
constexpr size_t kPageSize = 1024;
|
||||
constexpr float kSubsample = 0.5;
|
||||
const std::string kSamplingMethod = "gradient_based";
|
||||
common::GlobalRandom().seed(0);
|
||||
|
||||
// Create an in-memory DMatrix.
|
||||
std::unique_ptr<DMatrix> dmat(CreateSparsePageDMatrixWithRC(kRows, kCols, 0, true));
|
||||
@@ -503,7 +506,7 @@ TEST(GpuHist, ExternalMemoryWithSampling) {
|
||||
auto preds_h = preds.ConstHostVector();
|
||||
auto preds_ext_h = preds_ext.ConstHostVector();
|
||||
for (int i = 0; i < kRows; i++) {
|
||||
EXPECT_NEAR(preds_h[i], preds_ext_h[i], 3e-3);
|
||||
EXPECT_NEAR(preds_h[i], preds_ext_h[i], 2e-3);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user