sync upstream code
This commit is contained in:
@@ -439,7 +439,7 @@ void MakeLabelForTest(std::shared_ptr<DMatrix> Xy, DMatrixHandle cxy) {
|
||||
XGDMatrixSetInfoFromInterface(cxy, "label", s_y_int.c_str());
|
||||
}
|
||||
|
||||
auto MakeSimpleDMatrixForTest(bst_row_t n_samples, bst_feature_t n_features, Json dconfig) {
|
||||
auto MakeSimpleDMatrixForTest(bst_idx_t n_samples, bst_feature_t n_features, Json dconfig) {
|
||||
HostDeviceVector<float> storage;
|
||||
auto arr_int = RandomDataGenerator{n_samples, n_features, 0.5f}.GenerateArrayInterface(&storage);
|
||||
|
||||
@@ -456,7 +456,7 @@ auto MakeSimpleDMatrixForTest(bst_row_t n_samples, bst_feature_t n_features, Jso
|
||||
return std::pair{p_fmat, Xy};
|
||||
}
|
||||
|
||||
auto MakeQDMForTest(Context const *ctx, bst_row_t n_samples, bst_feature_t n_features,
|
||||
auto MakeQDMForTest(Context const *ctx, bst_idx_t n_samples, bst_feature_t n_features,
|
||||
Json dconfig) {
|
||||
bst_bin_t n_bins{16};
|
||||
dconfig["max_bin"] = Integer{n_bins};
|
||||
@@ -488,7 +488,7 @@ auto MakeQDMForTest(Context const *ctx, bst_row_t n_samples, bst_feature_t n_fea
|
||||
return std::pair{p_fmat, Xy};
|
||||
}
|
||||
|
||||
auto MakeExtMemForTest(bst_row_t n_samples, bst_feature_t n_features, Json dconfig) {
|
||||
auto MakeExtMemForTest(bst_idx_t n_samples, bst_feature_t n_features, Json dconfig) {
|
||||
std::size_t n_batches{4};
|
||||
NumpyArrayIterForTest iter_0{0.0f, n_samples, n_features, n_batches};
|
||||
std::string s_dconfig;
|
||||
@@ -530,7 +530,7 @@ void CheckResult(Context const *ctx, bst_feature_t n_features, std::shared_ptr<D
|
||||
}
|
||||
|
||||
void TestXGDMatrixGetQuantileCut(Context const *ctx) {
|
||||
bst_row_t n_samples{1024};
|
||||
bst_idx_t n_samples{1024};
|
||||
bst_feature_t n_features{16};
|
||||
|
||||
Json dconfig{Object{}};
|
||||
|
||||
@@ -181,7 +181,7 @@ void TestMixedSketch() {
|
||||
TEST(HistUtil, DeviceSketchMixedFeatures) { TestMixedSketch(); }
|
||||
|
||||
TEST(HistUtil, RemoveDuplicatedCategories) {
|
||||
bst_row_t n_samples = 512;
|
||||
bst_idx_t n_samples = 512;
|
||||
bst_feature_t n_features = 3;
|
||||
bst_cat_t n_categories = 5;
|
||||
|
||||
@@ -210,13 +210,13 @@ TEST(HistUtil, RemoveDuplicatedCategories) {
|
||||
FeatureType::kNumerical, FeatureType::kCategorical, FeatureType::kNumerical};
|
||||
ASSERT_EQ(info.feature_types.Size(), n_features);
|
||||
|
||||
HostDeviceVector<bst_row_t> cuts_ptr{0, n_samples, n_samples * 2, n_samples * 3};
|
||||
HostDeviceVector<bst_idx_t> cuts_ptr{0, n_samples, n_samples * 2, n_samples * 3};
|
||||
cuts_ptr.SetDevice(DeviceOrd::CUDA(0));
|
||||
|
||||
dh::device_vector<float> weight(n_samples * n_features, 0);
|
||||
dh::Iota(dh::ToSpan(weight), ctx.CUDACtx()->Stream());
|
||||
|
||||
dh::caching_device_vector<bst_row_t> columns_ptr(4);
|
||||
dh::caching_device_vector<bst_idx_t> columns_ptr(4);
|
||||
for (std::size_t i = 0; i < columns_ptr.size(); ++i) {
|
||||
columns_ptr[i] = i * n_samples;
|
||||
}
|
||||
@@ -641,7 +641,7 @@ void TestGetColumnSize(std::size_t n_samples) {
|
||||
} // namespace
|
||||
|
||||
TEST(HistUtil, GetColumnSize) {
|
||||
bst_row_t n_samples = 4096;
|
||||
bst_idx_t n_samples = 4096;
|
||||
TestGetColumnSize(n_samples);
|
||||
}
|
||||
|
||||
@@ -797,11 +797,11 @@ TEST(HistUtil, AdapterSketchFromWeights) {
|
||||
|
||||
namespace {
|
||||
class DeviceSketchWithHessianTest
|
||||
: public ::testing::TestWithParam<std::tuple<bool, bst_row_t, bst_bin_t>> {
|
||||
: public ::testing::TestWithParam<std::tuple<bool, bst_idx_t, bst_bin_t>> {
|
||||
bst_feature_t n_features_ = 5;
|
||||
bst_group_t n_groups_{3};
|
||||
|
||||
auto GenerateHessian(Context const* ctx, bst_row_t n_samples) const {
|
||||
auto GenerateHessian(Context const* ctx, bst_idx_t n_samples) const {
|
||||
HostDeviceVector<float> hessian;
|
||||
auto& h_hess = hessian.HostVector();
|
||||
h_hess = GenerateRandomWeights(n_samples);
|
||||
@@ -846,7 +846,7 @@ class DeviceSketchWithHessianTest
|
||||
protected:
|
||||
Context ctx_ = MakeCUDACtx(0);
|
||||
|
||||
void TestLTR(Context const* ctx, bst_row_t n_samples, bst_bin_t n_bins,
|
||||
void TestLTR(Context const* ctx, bst_idx_t n_samples, bst_bin_t n_bins,
|
||||
std::size_t n_elements) const {
|
||||
auto x = GenerateRandom(n_samples, n_features_);
|
||||
|
||||
@@ -899,7 +899,7 @@ class DeviceSketchWithHessianTest
|
||||
}
|
||||
}
|
||||
|
||||
void TestRegression(Context const* ctx, bst_row_t n_samples, bst_bin_t n_bins,
|
||||
void TestRegression(Context const* ctx, bst_idx_t n_samples, bst_bin_t n_bins,
|
||||
std::size_t n_elements) const {
|
||||
auto x = GenerateRandom(n_samples, n_features_);
|
||||
auto p_fmat = GetDMatrixFromData(x, n_samples, n_features_);
|
||||
@@ -912,9 +912,9 @@ class DeviceSketchWithHessianTest
|
||||
};
|
||||
|
||||
auto MakeParamsForTest() {
|
||||
std::vector<bst_row_t> sizes = {1, 2, 256, 512, 1000, 1500};
|
||||
std::vector<bst_idx_t> sizes = {1, 2, 256, 512, 1000, 1500};
|
||||
std::vector<bst_bin_t> bin_sizes = {2, 16, 256, 512};
|
||||
std::vector<std::tuple<bool, bst_row_t, bst_bin_t>> configs;
|
||||
std::vector<std::tuple<bool, bst_idx_t, bst_bin_t>> configs;
|
||||
for (auto n_samples : sizes) {
|
||||
for (auto n_bins : bin_sizes) {
|
||||
configs.emplace_back(true, n_samples, n_bins);
|
||||
|
||||
@@ -50,7 +50,7 @@ void DoTestDistributedQuantile(size_t rows, size_t cols) {
|
||||
SimpleLCG lcg;
|
||||
SimpleRealUniformDistribution<float> dist(3, 1000);
|
||||
std::generate(h_weights.begin(), h_weights.end(), [&]() { return dist(&lcg); });
|
||||
std::vector<bst_row_t> column_size(cols, rows);
|
||||
std::vector<bst_idx_t> column_size(cols, rows);
|
||||
bst_bin_t n_bins = 64;
|
||||
|
||||
// Generate cuts for distributed environment.
|
||||
@@ -192,7 +192,7 @@ void DoTestColSplitQuantile(size_t rows, size_t cols) {
|
||||
return dmat->SliceCol(world, rank);
|
||||
}()};
|
||||
|
||||
std::vector<bst_row_t> column_size(cols, 0);
|
||||
std::vector<bst_idx_t> column_size(cols, 0);
|
||||
auto const slice_size = cols / world;
|
||||
auto const slice_start = slice_size * rank;
|
||||
auto const slice_end = (rank == world - 1) ? cols : slice_start + slice_size;
|
||||
|
||||
@@ -27,7 +27,7 @@ TEST(GPUQuantile, Basic) {
|
||||
HostDeviceVector<FeatureType> ft;
|
||||
SketchContainer sketch(ft, kBins, kCols, kRows, FstCU());
|
||||
dh::caching_device_vector<Entry> entries;
|
||||
dh::device_vector<bst_row_t> cuts_ptr(kCols+1);
|
||||
dh::device_vector<bst_idx_t> cuts_ptr(kCols+1);
|
||||
thrust::fill(cuts_ptr.begin(), cuts_ptr.end(), 0);
|
||||
// Push empty
|
||||
sketch.Push(dh::ToSpan(entries), dh::ToSpan(cuts_ptr), dh::ToSpan(cuts_ptr), 0);
|
||||
@@ -87,11 +87,11 @@ TEST(GPUQuantile, Unique) {
|
||||
|
||||
// if with_error is true, the test tolerates floating point error
|
||||
void TestQuantileElemRank(DeviceOrd device, Span<SketchEntry const> in,
|
||||
Span<bst_row_t const> d_columns_ptr, bool with_error = false) {
|
||||
Span<bst_idx_t const> d_columns_ptr, bool with_error = false) {
|
||||
dh::safe_cuda(cudaSetDevice(device.ordinal));
|
||||
std::vector<SketchEntry> h_in(in.size());
|
||||
dh::CopyDeviceSpanToVector(&h_in, in);
|
||||
std::vector<bst_row_t> h_columns_ptr(d_columns_ptr.size());
|
||||
std::vector<bst_idx_t> h_columns_ptr(d_columns_ptr.size());
|
||||
dh::CopyDeviceSpanToVector(&h_columns_ptr, d_columns_ptr);
|
||||
|
||||
for (size_t i = 1; i < d_columns_ptr.size(); ++i) {
|
||||
@@ -164,7 +164,7 @@ TEST(GPUQuantile, MergeEmpty) {
|
||||
|
||||
std::vector<SketchEntry> entries_before(sketch_0.Data().size());
|
||||
dh::CopyDeviceSpanToVector(&entries_before, sketch_0.Data());
|
||||
std::vector<bst_row_t> ptrs_before(sketch_0.ColumnsPtr().size());
|
||||
std::vector<bst_idx_t> ptrs_before(sketch_0.ColumnsPtr().size());
|
||||
dh::CopyDeviceSpanToVector(&ptrs_before, sketch_0.ColumnsPtr());
|
||||
thrust::device_vector<size_t> columns_ptr(kCols + 1);
|
||||
// Merge an empty sketch
|
||||
@@ -172,7 +172,7 @@ TEST(GPUQuantile, MergeEmpty) {
|
||||
|
||||
std::vector<SketchEntry> entries_after(sketch_0.Data().size());
|
||||
dh::CopyDeviceSpanToVector(&entries_after, sketch_0.Data());
|
||||
std::vector<bst_row_t> ptrs_after(sketch_0.ColumnsPtr().size());
|
||||
std::vector<bst_idx_t> ptrs_after(sketch_0.ColumnsPtr().size());
|
||||
dh::CopyDeviceSpanToVector(&ptrs_after, sketch_0.ColumnsPtr());
|
||||
|
||||
CHECK_EQ(entries_before.size(), entries_after.size());
|
||||
@@ -222,7 +222,7 @@ TEST(GPUQuantile, MergeBasic) {
|
||||
}
|
||||
|
||||
auto columns_ptr = sketch_0.ColumnsPtr();
|
||||
std::vector<bst_row_t> h_columns_ptr(columns_ptr.size());
|
||||
std::vector<bst_idx_t> h_columns_ptr(columns_ptr.size());
|
||||
dh::CopyDeviceSpanToVector(&h_columns_ptr, columns_ptr);
|
||||
ASSERT_EQ(h_columns_ptr.back(), sketch_1.Data().size() + size_before_merge);
|
||||
|
||||
@@ -278,7 +278,7 @@ void TestMergeDuplicated(int32_t n_bins, size_t cols, size_t rows, float frac) {
|
||||
TestQuantileElemRank(FstCU(), sketch_0.Data(), sketch_0.ColumnsPtr());
|
||||
|
||||
auto columns_ptr = sketch_0.ColumnsPtr();
|
||||
std::vector<bst_row_t> h_columns_ptr(columns_ptr.size());
|
||||
std::vector<bst_idx_t> h_columns_ptr(columns_ptr.size());
|
||||
dh::CopyDeviceSpanToVector(&h_columns_ptr, columns_ptr);
|
||||
ASSERT_EQ(h_columns_ptr.back(), sketch_1.Data().size() + size_before_merge);
|
||||
|
||||
|
||||
@@ -1,13 +1,15 @@
|
||||
/*!
|
||||
* Copyright 2018 XGBoost contributors
|
||||
/**
|
||||
* Copyright 2018-2024, XGBoost contributors
|
||||
*/
|
||||
#include <gtest/gtest.h>
|
||||
|
||||
#include <thrust/host_vector.h>
|
||||
#include <thrust/device_vector.h>
|
||||
#include <thrust/execution_policy.h>
|
||||
#include "../../../src/common/device_helpers.cuh"
|
||||
#include <thrust/host_vector.h>
|
||||
#include <xgboost/span.h>
|
||||
|
||||
#include <numeric> // for iota
|
||||
|
||||
#include "../../../src/common/device_helpers.cuh"
|
||||
#include "test_span.h"
|
||||
|
||||
namespace xgboost {
|
||||
|
||||
@@ -36,7 +36,7 @@ TEST(Adapter, CSRAdapter) {
|
||||
}
|
||||
|
||||
TEST(Adapter, CSRArrayAdapter) {
|
||||
HostDeviceVector<bst_row_t> indptr;
|
||||
HostDeviceVector<std::size_t> indptr;
|
||||
HostDeviceVector<float> values;
|
||||
HostDeviceVector<bst_feature_t> indices;
|
||||
size_t n_features = 100, n_samples = 10;
|
||||
@@ -155,7 +155,7 @@ TEST(Adapter, IteratorAdapter) {
|
||||
ASSERT_EQ(data->Info().num_row_, kRows);
|
||||
int num_batch = 0;
|
||||
for (auto const& batch : data->GetBatches<SparsePage>()) {
|
||||
ASSERT_EQ(batch.offset.HostVector(), std::vector<bst_row_t>({0, 2, 4, 5, 5, 7, 9, 10, 10}));
|
||||
ASSERT_EQ(batch.offset.HostVector(), std::vector<bst_idx_t>({0, 2, 4, 5, 5, 7, 9, 10, 10}));
|
||||
++num_batch;
|
||||
}
|
||||
ASSERT_EQ(num_batch, 1);
|
||||
|
||||
@@ -13,7 +13,7 @@
|
||||
|
||||
namespace xgboost {
|
||||
TEST(SparsePage, PushCSC) {
|
||||
std::vector<bst_row_t> offset {0};
|
||||
std::vector<bst_idx_t> offset {0};
|
||||
std::vector<Entry> data;
|
||||
SparsePage batch;
|
||||
batch.offset.HostVector() = offset;
|
||||
|
||||
@@ -64,7 +64,7 @@ TEST(DeviceAdapter, GetRowCounts) {
|
||||
.Device(ctx.Device())
|
||||
.GenerateArrayInterface(&storage);
|
||||
auto adapter = CupyAdapter{str_arr};
|
||||
HostDeviceVector<bst_row_t> offset(adapter.NumRows() + 1, 0);
|
||||
HostDeviceVector<bst_idx_t> offset(adapter.NumRows() + 1, 0);
|
||||
offset.SetDevice(ctx.Device());
|
||||
auto rstride = GetRowCounts(adapter.Value(), offset.DeviceSpan(), ctx.Device(),
|
||||
std::numeric_limits<float>::quiet_NaN());
|
||||
|
||||
@@ -231,7 +231,7 @@ TEST(MetaInfo, LoadQid) {
|
||||
const std::vector<xgboost::bst_uint> expected_group_ptr{0, 4, 8, 12};
|
||||
CHECK(info.group_ptr_ == expected_group_ptr);
|
||||
|
||||
const std::vector<xgboost::bst_row_t> expected_offset{
|
||||
const std::vector<xgboost::bst_idx_t> expected_offset{
|
||||
0, 5, 10, 15, 20, 25, 30, 35, 40, 45, 50, 55, 60
|
||||
};
|
||||
const std::vector<xgboost::Entry> expected_data{
|
||||
|
||||
@@ -223,7 +223,7 @@ TEST(SimpleDMatrix, FromFile) {
|
||||
auto batch = page.GetView();
|
||||
EXPECT_EQ(batch.Size(), kExpectedNumRow);
|
||||
EXPECT_EQ(page.offset.HostVector(),
|
||||
std::vector<bst_row_t>({0, 3, 6, 9, 12, 15, 15}));
|
||||
std::vector<bst_idx_t>({0, 3, 6, 9, 12, 15, 15}));
|
||||
EXPECT_EQ(page.base_rowid, 0);
|
||||
|
||||
for (auto i = 0ull; i < batch.Size() - 1; i++) {
|
||||
|
||||
@@ -171,7 +171,7 @@ TEST(GBTree, ChoosePredictor) {
|
||||
}
|
||||
|
||||
TEST(GBTree, ChooseTreeMethod) {
|
||||
bst_row_t n_samples{128};
|
||||
bst_idx_t n_samples{128};
|
||||
bst_feature_t n_features{64};
|
||||
auto Xy = RandomDataGenerator{n_samples, n_features, 0.5f}.GenerateDMatrix(true);
|
||||
|
||||
|
||||
@@ -18,7 +18,7 @@
|
||||
namespace xgboost {
|
||||
void TestInplaceFallback(Context const* ctx) {
|
||||
// prepare data
|
||||
bst_row_t n_samples{1024};
|
||||
bst_idx_t n_samples{1024};
|
||||
bst_feature_t n_features{32};
|
||||
HostDeviceVector<float> X_storage;
|
||||
// use a different device than the learner
|
||||
|
||||
@@ -216,7 +216,7 @@ SimpleLCG::StateType SimpleLCG::Max() const { return max(); }
|
||||
static_assert(SimpleLCG::max() - SimpleLCG::min());
|
||||
|
||||
void RandomDataGenerator::GenerateLabels(std::shared_ptr<DMatrix> p_fmat) const {
|
||||
RandomDataGenerator{static_cast<bst_row_t>(p_fmat->Info().num_row_), this->n_targets_, 0.0f}.GenerateDense(
|
||||
RandomDataGenerator{static_cast<bst_idx_t>(p_fmat->Info().num_row_), this->n_targets_, 0.0f}.GenerateDense(
|
||||
p_fmat->Info().labels.Data());
|
||||
CHECK_EQ(p_fmat->Info().labels.Size(), this->rows_ * this->n_targets_);
|
||||
p_fmat->Info().labels.Reshape(this->rows_, this->n_targets_);
|
||||
@@ -334,7 +334,7 @@ std::string RandomDataGenerator::GenerateColumnarArrayInterface(
|
||||
}
|
||||
|
||||
void RandomDataGenerator::GenerateCSR(
|
||||
HostDeviceVector<float>* value, HostDeviceVector<bst_row_t>* row_ptr,
|
||||
HostDeviceVector<float>* value, HostDeviceVector<std::size_t>* row_ptr,
|
||||
HostDeviceVector<bst_feature_t>* columns) const {
|
||||
auto& h_value = value->HostVector();
|
||||
auto& h_rptr = row_ptr->HostVector();
|
||||
@@ -381,7 +381,7 @@ void RandomDataGenerator::GenerateCSR(
|
||||
[[nodiscard]] std::shared_ptr<DMatrix> RandomDataGenerator::GenerateDMatrix(
|
||||
bool with_label, bool float_label, size_t classes, DataSplitMode data_split_mode) const {
|
||||
HostDeviceVector<float> data;
|
||||
HostDeviceVector<bst_row_t> rptrs;
|
||||
HostDeviceVector<std::size_t> rptrs;
|
||||
HostDeviceVector<bst_feature_t> columns;
|
||||
this->GenerateCSR(&data, &rptrs, &columns);
|
||||
data::CSRAdapter adapter(rptrs.HostPointer(), columns.HostPointer(), data.HostPointer(), rows_,
|
||||
@@ -447,7 +447,7 @@ void RandomDataGenerator::GenerateCSR(
|
||||
|
||||
// Loop over the batches and count the number of pages
|
||||
std::size_t batch_count = 0;
|
||||
bst_row_t row_count = 0;
|
||||
bst_idx_t row_count = 0;
|
||||
for (const auto& batch : dmat->GetBatches<xgboost::SparsePage>()) {
|
||||
batch_count++;
|
||||
row_count += batch.Size();
|
||||
@@ -458,7 +458,7 @@ void RandomDataGenerator::GenerateCSR(
|
||||
EXPECT_EQ(row_count, dmat->Info().num_row_);
|
||||
|
||||
if (with_label) {
|
||||
RandomDataGenerator{static_cast<bst_row_t>(dmat->Info().num_row_), this->n_targets_, 0.0f}.GenerateDense(
|
||||
RandomDataGenerator{static_cast<bst_idx_t>(dmat->Info().num_row_), this->n_targets_, 0.0f}.GenerateDense(
|
||||
dmat->Info().labels.Data());
|
||||
CHECK_EQ(dmat->Info().labels.Size(), this->rows_ * this->n_targets_);
|
||||
dmat->Info().labels.Reshape(this->rows_, this->n_targets_);
|
||||
@@ -488,7 +488,7 @@ int CudaArrayIterForTest::Next() {
|
||||
}
|
||||
#endif // !defined(XGBOOST_USE_CUDA)
|
||||
|
||||
NumpyArrayIterForTest::NumpyArrayIterForTest(float sparsity, size_t rows, size_t cols,
|
||||
NumpyArrayIterForTest::NumpyArrayIterForTest(float sparsity, bst_idx_t rows, size_t cols,
|
||||
size_t batches)
|
||||
: ArrayIterForTest{sparsity, rows, cols, batches} {
|
||||
rng_->Device(DeviceOrd::CPU());
|
||||
@@ -515,7 +515,7 @@ std::shared_ptr<DMatrix> GetDMatrixFromData(const std::vector<float>& x, std::si
|
||||
return p_fmat;
|
||||
}
|
||||
|
||||
std::unique_ptr<DMatrix> CreateSparsePageDMatrix(bst_row_t n_samples, bst_feature_t n_features,
|
||||
std::unique_ptr<DMatrix> CreateSparsePageDMatrix(bst_idx_t n_samples, bst_feature_t n_features,
|
||||
size_t n_batches, std::string prefix) {
|
||||
CHECK_GE(n_samples, n_batches);
|
||||
NumpyArrayIterForTest iter(0, n_samples, n_features, n_batches);
|
||||
@@ -662,7 +662,7 @@ std::unique_ptr<GradientBooster> CreateTrainedGBM(std::string name, Args kwargs,
|
||||
return gbm;
|
||||
}
|
||||
|
||||
ArrayIterForTest::ArrayIterForTest(float sparsity, size_t rows, size_t cols, size_t batches)
|
||||
ArrayIterForTest::ArrayIterForTest(float sparsity, bst_idx_t rows, size_t cols, size_t batches)
|
||||
: rows_{rows}, cols_{cols}, n_batches_{batches} {
|
||||
XGProxyDMatrixCreate(&proxy_);
|
||||
rng_ = std::make_unique<RandomDataGenerator>(rows_, cols_, sparsity);
|
||||
|
||||
@@ -223,7 +223,7 @@ Json GetArrayInterface(HostDeviceVector<T> const* storage, size_t rows, size_t c
|
||||
|
||||
// Generate in-memory random data without using DMatrix.
|
||||
class RandomDataGenerator {
|
||||
bst_row_t rows_;
|
||||
bst_idx_t rows_;
|
||||
size_t cols_;
|
||||
float sparsity_;
|
||||
|
||||
@@ -246,7 +246,7 @@ class RandomDataGenerator {
|
||||
void GenerateLabels(std::shared_ptr<DMatrix> p_fmat) const;
|
||||
|
||||
public:
|
||||
RandomDataGenerator(bst_row_t rows, size_t cols, float sparsity)
|
||||
RandomDataGenerator(bst_idx_t rows, size_t cols, float sparsity)
|
||||
: rows_{rows}, cols_{cols}, sparsity_{sparsity}, lcg_{seed_} {}
|
||||
|
||||
RandomDataGenerator& Lower(float v) {
|
||||
@@ -308,7 +308,7 @@ class RandomDataGenerator {
|
||||
|
||||
std::string GenerateColumnarArrayInterface(std::vector<HostDeviceVector<float>>* data) const;
|
||||
|
||||
void GenerateCSR(HostDeviceVector<float>* value, HostDeviceVector<bst_row_t>* row_ptr,
|
||||
void GenerateCSR(HostDeviceVector<float>* value, HostDeviceVector<std::size_t>* row_ptr,
|
||||
HostDeviceVector<bst_feature_t>* columns) const;
|
||||
|
||||
[[nodiscard]] std::shared_ptr<DMatrix> GenerateDMatrix(
|
||||
@@ -354,7 +354,7 @@ std::shared_ptr<DMatrix> GetDMatrixFromData(const std::vector<float>& x, std::si
|
||||
*
|
||||
* \return A Sparse DMatrix with n_batches.
|
||||
*/
|
||||
std::unique_ptr<DMatrix> CreateSparsePageDMatrix(bst_row_t n_samples, bst_feature_t n_features,
|
||||
std::unique_ptr<DMatrix> CreateSparsePageDMatrix(bst_idx_t n_samples, bst_feature_t n_features,
|
||||
size_t n_batches, std::string prefix = "cache");
|
||||
|
||||
/**
|
||||
@@ -413,12 +413,12 @@ inline HostDeviceVector<GradientPair> GenerateRandomGradients(const size_t n_row
|
||||
return gpair;
|
||||
}
|
||||
|
||||
inline linalg::Matrix<GradientPair> GenerateRandomGradients(Context const* ctx, bst_row_t n_rows,
|
||||
inline linalg::Matrix<GradientPair> GenerateRandomGradients(Context const* ctx, bst_idx_t n_rows,
|
||||
bst_target_t n_targets,
|
||||
float lower = 0.0f,
|
||||
float upper = 1.0f) {
|
||||
auto g = GenerateRandomGradients(n_rows * n_targets, lower, upper);
|
||||
linalg::Matrix<GradientPair> gpair({n_rows, static_cast<bst_row_t>(n_targets)}, ctx->Device());
|
||||
linalg::Matrix<GradientPair> gpair({n_rows, static_cast<bst_idx_t>(n_targets)}, ctx->Device());
|
||||
gpair.Data()->Copy(g);
|
||||
return gpair;
|
||||
}
|
||||
@@ -434,12 +434,12 @@ class ArrayIterForTest {
|
||||
|
||||
std::vector<std::string> batches_;
|
||||
std::string interface_;
|
||||
size_t rows_;
|
||||
bst_idx_t rows_;
|
||||
size_t cols_;
|
||||
size_t n_batches_;
|
||||
|
||||
public:
|
||||
size_t static constexpr Rows() { return 1024; }
|
||||
bst_idx_t static constexpr Rows() { return 1024; }
|
||||
size_t static constexpr Batches() { return 100; }
|
||||
size_t static constexpr Cols() { return 13; }
|
||||
|
||||
@@ -451,7 +451,7 @@ class ArrayIterForTest {
|
||||
[[nodiscard]] std::size_t Iter() const { return iter_; }
|
||||
auto Proxy() -> decltype(proxy_) { return proxy_; }
|
||||
|
||||
explicit ArrayIterForTest(float sparsity, size_t rows, size_t cols, size_t batches);
|
||||
explicit ArrayIterForTest(float sparsity, bst_idx_t rows, size_t cols, size_t batches);
|
||||
/**
|
||||
* \brief Create iterator with user provided data.
|
||||
*/
|
||||
@@ -470,7 +470,7 @@ class CudaArrayIterForTest : public ArrayIterForTest {
|
||||
|
||||
class NumpyArrayIterForTest : public ArrayIterForTest {
|
||||
public:
|
||||
explicit NumpyArrayIterForTest(float sparsity, size_t rows = Rows(), size_t cols = Cols(),
|
||||
explicit NumpyArrayIterForTest(float sparsity, bst_idx_t rows = Rows(), size_t cols = Cols(),
|
||||
size_t batches = Batches());
|
||||
explicit NumpyArrayIterForTest(Context const* ctx, HostDeviceVector<float> const& data,
|
||||
std::size_t n_samples, bst_feature_t n_features,
|
||||
|
||||
@@ -47,7 +47,7 @@ inline std::unique_ptr<EllpackPageImpl> BuildEllpackPage(int n_rows, int n_cols,
|
||||
0.26f, 0.71f, 1.83f});
|
||||
cmat.SetMins({0.1f, 0.2f, 0.3f, 0.1f, 0.2f, 0.3f, 0.2f, 0.2f});
|
||||
|
||||
bst_row_t row_stride = 0;
|
||||
bst_idx_t row_stride = 0;
|
||||
const auto &offset_vec = batch.offset.ConstHostVector();
|
||||
for (size_t i = 1; i < offset_vec.size(); ++i) {
|
||||
row_stride = std::max(row_stride, offset_vec[i] - offset_vec[i-1]);
|
||||
|
||||
@@ -43,7 +43,7 @@ TEST(SyclPredictor, ExternalMemory) {
|
||||
}
|
||||
|
||||
TEST(SyclPredictor, InplacePredict) {
|
||||
bst_row_t constexpr kRows{128};
|
||||
bst_idx_t constexpr kRows{128};
|
||||
bst_feature_t constexpr kCols{64};
|
||||
Context ctx;
|
||||
auto gen = RandomDataGenerator{kRows, kCols, 0.5}.Device(ctx.Device());
|
||||
@@ -106,4 +106,4 @@ TEST(SyclPredictor, Multi) {
|
||||
TestVectorLeafPrediction(&ctx);
|
||||
}
|
||||
|
||||
} // namespace xgboost
|
||||
} // namespace xgboost
|
||||
|
||||
134
tests/cpp/plugin/test_sycl_split_evaluator.cc
Normal file
134
tests/cpp/plugin/test_sycl_split_evaluator.cc
Normal file
@@ -0,0 +1,134 @@
|
||||
/**
|
||||
* Copyright 2020-2024 by XGBoost contributors
|
||||
*/
|
||||
#include <gtest/gtest.h>
|
||||
#include <vector>
|
||||
|
||||
#pragma GCC diagnostic push
|
||||
#pragma GCC diagnostic ignored "-Wtautological-constant-compare"
|
||||
#pragma GCC diagnostic ignored "-W#pragma-messages"
|
||||
#include "../../../plugin/sycl/tree/split_evaluator.h"
|
||||
#pragma GCC diagnostic pop
|
||||
|
||||
#include "../../../plugin/sycl/device_manager.h"
|
||||
#include "../helpers.h"
|
||||
|
||||
namespace xgboost::sycl::tree {
|
||||
|
||||
template<typename GradientSumT>
|
||||
void BasicTestSplitEvaluator(const std::string& monotone_constraints, bool has_constrains) {
|
||||
const size_t n_columns = 2;
|
||||
|
||||
xgboost::tree::TrainParam param;
|
||||
param.UpdateAllowUnknown(Args{{"min_child_weight", "0"},
|
||||
{"reg_lambda", "0"},
|
||||
{"monotone_constraints", monotone_constraints}});
|
||||
|
||||
DeviceManager device_manager;
|
||||
auto qu = device_manager.GetQueue(DeviceOrd::SyclDefault());
|
||||
|
||||
TreeEvaluator<GradientSumT> tree_evaluator(qu, param, n_columns);
|
||||
{
|
||||
// Check correctness of has_constrains flag
|
||||
ASSERT_EQ(tree_evaluator.HasConstraint(), has_constrains);
|
||||
}
|
||||
|
||||
auto split_evaluator = tree_evaluator.GetEvaluator();
|
||||
{
|
||||
// Check if params were inititialised correctly
|
||||
ASSERT_EQ(split_evaluator.param.min_child_weight, param.min_child_weight);
|
||||
ASSERT_EQ(split_evaluator.param.reg_lambda, param.reg_lambda);
|
||||
ASSERT_EQ(split_evaluator.param.reg_alpha, param.reg_alpha);
|
||||
ASSERT_EQ(split_evaluator.param.max_delta_step, param.max_delta_step);
|
||||
}
|
||||
}
|
||||
|
||||
template<typename GradientSumT>
|
||||
void TestSplitEvaluator(const std::string& monotone_constraints) {
|
||||
const size_t n_columns = 2;
|
||||
|
||||
xgboost::tree::TrainParam param;
|
||||
param.UpdateAllowUnknown(Args{{"min_child_weight", "0"},
|
||||
{"reg_lambda", "0"},
|
||||
{"monotone_constraints", monotone_constraints}});
|
||||
|
||||
DeviceManager device_manager;
|
||||
auto qu = device_manager.GetQueue(DeviceOrd::SyclDefault());
|
||||
|
||||
TreeEvaluator<GradientSumT> tree_evaluator(qu, param, n_columns);
|
||||
auto split_evaluator = tree_evaluator.GetEvaluator();
|
||||
{
|
||||
// Test ThresholdL1
|
||||
const GradientSumT alpha = 0.5;
|
||||
{
|
||||
const GradientSumT val = 0.0;
|
||||
const auto trh = split_evaluator.ThresholdL1(val, alpha);
|
||||
ASSERT_EQ(trh, 0.0);
|
||||
}
|
||||
|
||||
{
|
||||
const GradientSumT val = 1.0;
|
||||
const auto trh = split_evaluator.ThresholdL1(val, alpha);
|
||||
ASSERT_EQ(trh, val - alpha);
|
||||
}
|
||||
|
||||
{
|
||||
const GradientSumT val = -1.0;
|
||||
const auto trh = split_evaluator.ThresholdL1(val, alpha);
|
||||
ASSERT_EQ(trh, val + alpha);
|
||||
}
|
||||
}
|
||||
|
||||
{
|
||||
constexpr float eps = 1e-8;
|
||||
tree_evaluator.AddSplit(0, 1, 2, 0, 0.3, 0.7);
|
||||
|
||||
GradStats<GradientSumT> left(0.1, 0.2);
|
||||
GradStats<GradientSumT> right(0.3, 0.4);
|
||||
bst_node_t nidx = 0;
|
||||
bst_feature_t fidx = 0;
|
||||
|
||||
GradientSumT wleft = split_evaluator.CalcWeight(nidx, left);
|
||||
// wleft = -grad/hess = -0.1/0.2
|
||||
EXPECT_NEAR(wleft, -0.5, eps);
|
||||
GradientSumT wright = split_evaluator.CalcWeight(nidx, right);
|
||||
// wright = -grad/hess = -0.3/0.4
|
||||
EXPECT_NEAR(wright, -0.75, eps);
|
||||
|
||||
GradientSumT gweight_left = split_evaluator.CalcGainGivenWeight(nidx, left, wleft);
|
||||
// gweight_left = left.grad**2 / left.hess = 0.1*0.1/0.2 = 0.05
|
||||
EXPECT_NEAR(gweight_left, 0.05, eps);
|
||||
// gweight_left = right.grad**2 / right.hess = 0.3*0.3/0.4 = 0.225
|
||||
GradientSumT gweight_right = split_evaluator.CalcGainGivenWeight(nidx, right, wright);
|
||||
EXPECT_NEAR(gweight_right, 0.225, eps);
|
||||
|
||||
GradientSumT split_gain = split_evaluator.CalcSplitGain(nidx, fidx, left, right);
|
||||
if (!tree_evaluator.HasConstraint()) {
|
||||
EXPECT_NEAR(split_gain, gweight_left + gweight_right, eps);
|
||||
} else {
|
||||
// Parameters are chosen to have -inf here
|
||||
ASSERT_EQ(split_gain, -std::numeric_limits<GradientSumT>::infinity());
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
TEST(SyclSplitEvaluator, BasicTest) {
|
||||
BasicTestSplitEvaluator<float>("( 0, 0)", false);
|
||||
BasicTestSplitEvaluator<float>("( 1, 0)", true);
|
||||
BasicTestSplitEvaluator<float>("( 0, 1)", true);
|
||||
BasicTestSplitEvaluator<float>("(-1, 0)", true);
|
||||
BasicTestSplitEvaluator<float>("( 0, -1)", true);
|
||||
BasicTestSplitEvaluator<float>("( 1, 1)", true);
|
||||
BasicTestSplitEvaluator<float>("(-1, -1)", true);
|
||||
BasicTestSplitEvaluator<float>("( 1, -1)", true);
|
||||
BasicTestSplitEvaluator<float>("(-1, 1)", true);
|
||||
}
|
||||
|
||||
TEST(SyclSplitEvaluator, TestMath) {
|
||||
// Without constraints
|
||||
TestSplitEvaluator<float>("( 0, 0)");
|
||||
// With constraints
|
||||
TestSplitEvaluator<float>("( 1, 0)");
|
||||
}
|
||||
|
||||
} // namespace xgboost::sycl::tree
|
||||
@@ -65,7 +65,7 @@ TEST(CpuPredictor, ExternalMemory) {
|
||||
}
|
||||
|
||||
TEST(CpuPredictor, InplacePredict) {
|
||||
bst_row_t constexpr kRows{128};
|
||||
bst_idx_t constexpr kRows{128};
|
||||
bst_feature_t constexpr kCols{64};
|
||||
Context ctx;
|
||||
auto gen = RandomDataGenerator{kRows, kCols, 0.5}.Device(ctx.Device());
|
||||
@@ -83,7 +83,7 @@ TEST(CpuPredictor, InplacePredict) {
|
||||
|
||||
{
|
||||
HostDeviceVector<float> data;
|
||||
HostDeviceVector<bst_row_t> rptrs;
|
||||
HostDeviceVector<std::size_t> rptrs;
|
||||
HostDeviceVector<bst_feature_t> columns;
|
||||
gen.GenerateCSR(&data, &rptrs, &columns);
|
||||
auto data_interface = GetArrayInterface(&data, kRows * kCols, 1);
|
||||
|
||||
@@ -186,7 +186,7 @@ void TestTrainingPrediction(Context const *ctx, size_t rows, size_t bins,
|
||||
}
|
||||
}
|
||||
|
||||
void TestInplacePrediction(Context const *ctx, std::shared_ptr<DMatrix> x, bst_row_t rows,
|
||||
void TestInplacePrediction(Context const *ctx, std::shared_ptr<DMatrix> x, bst_idx_t rows,
|
||||
bst_feature_t cols) {
|
||||
std::size_t constexpr kClasses { 4 };
|
||||
auto gen = RandomDataGenerator{rows, cols, 0.5}.Device(ctx->Device());
|
||||
@@ -255,7 +255,7 @@ std::unique_ptr<Learner> LearnerForTest(Context const *ctx, std::shared_ptr<DMat
|
||||
return learner;
|
||||
}
|
||||
|
||||
void VerifyPredictionWithLesserFeatures(Learner *learner, bst_row_t kRows,
|
||||
void VerifyPredictionWithLesserFeatures(Learner *learner, bst_idx_t kRows,
|
||||
std::shared_ptr<DMatrix> m_test,
|
||||
std::shared_ptr<DMatrix> m_invalid) {
|
||||
HostDeviceVector<float> prediction;
|
||||
|
||||
@@ -92,7 +92,7 @@ void TestTrainingPrediction(Context const* ctx, size_t rows, size_t bins,
|
||||
std::shared_ptr<DMatrix> p_full, std::shared_ptr<DMatrix> p_hist,
|
||||
bool check_contribs = false);
|
||||
|
||||
void TestInplacePrediction(Context const* ctx, std::shared_ptr<DMatrix> x, bst_row_t rows,
|
||||
void TestInplacePrediction(Context const* ctx, std::shared_ptr<DMatrix> x, bst_idx_t rows,
|
||||
bst_feature_t cols);
|
||||
|
||||
void TestPredictionWithLesserFeatures(Context const* ctx);
|
||||
|
||||
@@ -11,7 +11,7 @@ TEST(RandomDataGenerator, DMatrix) {
|
||||
auto p_dmatrix = RandomDataGenerator{kRows, kCols, kSparsity}.GenerateDMatrix();
|
||||
|
||||
HostDeviceVector<float> csr_value;
|
||||
HostDeviceVector<bst_row_t> csr_rptr;
|
||||
HostDeviceVector<std::size_t> csr_rptr;
|
||||
HostDeviceVector<bst_feature_t> csr_cidx;
|
||||
RandomDataGenerator{kRows, kCols, kSparsity}.GenerateCSR(&csr_value, &csr_rptr, &csr_cidx);
|
||||
|
||||
|
||||
@@ -217,7 +217,7 @@ TEST(Learner, JsonModelIO) {
|
||||
}
|
||||
|
||||
TEST(Learner, ConfigIO) {
|
||||
bst_row_t n_samples = 128;
|
||||
bst_idx_t n_samples = 128;
|
||||
bst_feature_t n_features = 12;
|
||||
std::shared_ptr<DMatrix> p_fmat{
|
||||
RandomDataGenerator{n_samples, n_features, 0}.GenerateDMatrix(true, false, 2)};
|
||||
|
||||
@@ -363,7 +363,7 @@ TEST(GpuHist, EvaluateSingleSplitMissing) {
|
||||
GPUTrainingParam param{tparam};
|
||||
|
||||
thrust::device_vector<bst_feature_t> feature_set = std::vector<bst_feature_t>{0};
|
||||
thrust::device_vector<uint32_t> feature_segments = std::vector<bst_row_t>{0, 2};
|
||||
thrust::device_vector<uint32_t> feature_segments = std::vector<bst_idx_t>{0, 2};
|
||||
thrust::device_vector<float> feature_values = std::vector<float>{1.0, 2.0};
|
||||
thrust::device_vector<float> feature_min_values = std::vector<float>{0.0};
|
||||
auto feature_histogram = ConvertToInteger(&ctx, {{-0.5, 0.5}, {0.5, 0.5}});
|
||||
@@ -412,7 +412,7 @@ TEST(GpuHist, EvaluateSingleSplitFeatureSampling) {
|
||||
GPUTrainingParam param{tparam};
|
||||
|
||||
thrust::device_vector<bst_feature_t> feature_set = std::vector<bst_feature_t>{1};
|
||||
thrust::device_vector<uint32_t> feature_segments = std::vector<bst_row_t>{0, 2, 4};
|
||||
thrust::device_vector<uint32_t> feature_segments = std::vector<bst_idx_t>{0, 2, 4};
|
||||
thrust::device_vector<float> feature_values = std::vector<float>{1.0, 2.0, 11.0, 12.0};
|
||||
thrust::device_vector<float> feature_min_values = std::vector<float>{0.0, 10.0};
|
||||
auto feature_histogram =
|
||||
@@ -446,7 +446,7 @@ TEST(GpuHist, EvaluateSingleSplitBreakTies) {
|
||||
GPUTrainingParam param{tparam};
|
||||
|
||||
thrust::device_vector<bst_feature_t> feature_set = std::vector<bst_feature_t>{0, 1};
|
||||
thrust::device_vector<uint32_t> feature_segments = std::vector<bst_row_t>{0, 2, 4};
|
||||
thrust::device_vector<uint32_t> feature_segments = std::vector<bst_idx_t>{0, 2, 4};
|
||||
thrust::device_vector<float> feature_values = std::vector<float>{1.0, 2.0, 11.0, 12.0};
|
||||
thrust::device_vector<float> feature_min_values = std::vector<float>{0.0, 10.0};
|
||||
auto feature_histogram =
|
||||
@@ -478,7 +478,7 @@ TEST(GpuHist, EvaluateSplits) {
|
||||
GPUTrainingParam param{tparam};
|
||||
|
||||
thrust::device_vector<bst_feature_t> feature_set = std::vector<bst_feature_t>{0, 1};
|
||||
thrust::device_vector<uint32_t> feature_segments = std::vector<bst_row_t>{0, 2, 4};
|
||||
thrust::device_vector<uint32_t> feature_segments = std::vector<bst_idx_t>{0, 2, 4};
|
||||
thrust::device_vector<float> feature_values = std::vector<float>{1.0, 2.0, 11.0, 12.0};
|
||||
thrust::device_vector<float> feature_min_values = std::vector<float>{0.0, 0.0};
|
||||
auto feature_histogram_left =
|
||||
|
||||
@@ -409,9 +409,9 @@ void TestHistogramExternalMemory(Context const *ctx, BatchParam batch_param, boo
|
||||
batch_param.hess = hess;
|
||||
}
|
||||
|
||||
std::vector<std::size_t> partition_size(1, 0);
|
||||
std::vector<bst_idx_t> partition_size(1, 0);
|
||||
bst_bin_t total_bins{0};
|
||||
bst_row_t n_samples{0};
|
||||
bst_idx_t n_samples{0};
|
||||
|
||||
auto gpair = GenerateRandomGradients(m->Info().num_row_, 0.0, 1.0);
|
||||
auto const &h_gpair = gpair.HostVector();
|
||||
|
||||
@@ -441,7 +441,7 @@ RegTree GetHistTree(Context const* ctx, DMatrix* dmat) {
|
||||
return tree;
|
||||
}
|
||||
|
||||
void VerifyHistColumnSplit(bst_row_t rows, bst_feature_t cols, RegTree const& expected_tree) {
|
||||
void VerifyHistColumnSplit(bst_idx_t rows, bst_feature_t cols, RegTree const& expected_tree) {
|
||||
Context ctx(MakeCUDACtx(GPUIDX));
|
||||
|
||||
auto Xy = RandomDataGenerator{rows, cols, 0}.GenerateDMatrix(true);
|
||||
@@ -491,7 +491,7 @@ RegTree GetApproxTree(Context const* ctx, DMatrix* dmat) {
|
||||
return tree;
|
||||
}
|
||||
|
||||
void VerifyApproxColumnSplit(bst_row_t rows, bst_feature_t cols, RegTree const& expected_tree) {
|
||||
void VerifyApproxColumnSplit(bst_idx_t rows, bst_feature_t cols, RegTree const& expected_tree) {
|
||||
Context ctx(MakeCUDACtx(GPUIDX));
|
||||
|
||||
auto Xy = RandomDataGenerator{rows, cols, 0}.GenerateDMatrix(true);
|
||||
|
||||
@@ -201,7 +201,7 @@ TEST(QuantileHist, PartitionerColSplit) { TestColumnSplitPartitioner<CPUExpandEn
|
||||
TEST(QuantileHist, MultiPartitionerColSplit) { TestColumnSplitPartitioner<MultiExpandEntry>(3); }
|
||||
|
||||
namespace {
|
||||
void VerifyColumnSplit(Context const* ctx, bst_row_t rows, bst_feature_t cols, bst_target_t n_targets,
|
||||
void VerifyColumnSplit(Context const* ctx, bst_idx_t rows, bst_feature_t cols, bst_target_t n_targets,
|
||||
RegTree const& expected_tree) {
|
||||
auto Xy = RandomDataGenerator{rows, cols, 0}.GenerateDMatrix(true);
|
||||
linalg::Matrix<GradientPair> gpair = GenerateRandomGradients(ctx, rows, n_targets);
|
||||
|
||||
@@ -15,7 +15,7 @@
|
||||
|
||||
namespace xgboost::tree {
|
||||
TEST(Updater, Refresh) {
|
||||
bst_row_t constexpr kRows = 8;
|
||||
bst_idx_t constexpr kRows = 8;
|
||||
bst_feature_t constexpr kCols = 16;
|
||||
Context ctx;
|
||||
|
||||
|
||||
Reference in New Issue
Block a user