| 577 | } // anonymous namespace |
| 578 | |
| 579 | void TestIterationRangeColumnSplit(int world_size, bool use_gpu) { |
| 580 | std::size_t constexpr kRows = 1000, kCols = 20, kClasses = 4, kForest = 3, kIters = 10; |
| 581 | auto dmat = RandomDataGenerator(kRows, kCols, 0).Classes(kClasses).GenerateDMatrix(true); |
| 582 | Context ctx; |
| 583 | if (use_gpu) { |
| 584 | ctx = MakeCUDACtx(0); |
| 585 | } |
| 586 | auto learner = LearnerForTest(&ctx, dmat, kIters, kForest); |
| 587 | |
| 588 | bool bound = false; |
| 589 | std::unique_ptr<Learner> sliced{learner->Slice(0, 3, 1, &bound)}; |
| 590 | ASSERT_FALSE(bound); |
| 591 | |
| 592 | // margin |
| 593 | HostDeviceVector<float> margin_predt_sliced; |
| 594 | HostDeviceVector<float> margin_predt_ranged; |
| 595 | sliced->Predict(dmat, true, &margin_predt_sliced, 0, 0, false, false, false, false, false); |
| 596 | learner->Predict(dmat, true, &margin_predt_ranged, 0, 3, false, false, false, false, false); |
| 597 | auto const &margin_sliced = margin_predt_sliced.HostVector(); |
| 598 | auto const &margin_ranged = margin_predt_ranged.HostVector(); |
| 599 | |
| 600 | // Leaf |
| 601 | HostDeviceVector<float> leaf_predt_sliced; |
| 602 | HostDeviceVector<float> leaf_predt_ranged; |
| 603 | sliced->Predict(dmat, false, &leaf_predt_sliced, 0, 0, false, true, false, false, false); |
| 604 | learner->Predict(dmat, false, &leaf_predt_ranged, 0, 3, false, true, false, false, false); |
| 605 | auto const &leaf_sliced = leaf_predt_sliced.HostVector(); |
| 606 | auto const &leaf_ranged = leaf_predt_ranged.HostVector(); |
| 607 | |
| 608 | Json ranged_model{Object{}}; |
| 609 | learner->SaveModel(&ranged_model); |
| 610 | Json sliced_model{Object{}}; |
| 611 | sliced->SaveModel(&sliced_model); |
| 612 | |
| 613 | #if !defined(XGBOOST_USE_NCCL) |
| 614 | if (use_gpu) { |
| 615 | GTEST_SKIP_("Not compiled with NCCL"); |
| 616 | return; |
| 617 | } |
| 618 | #endif // defined(XGBOOST_USE_NCCL) |
| 619 | collective::TestDistributedGlobal(world_size, [&] { |
| 620 | VerifyIterationRangeColumnSplit(use_gpu, ranged_model, sliced_model, kRows, kCols, kClasses, |
| 621 | margin_ranged, margin_sliced, leaf_ranged, leaf_sliced); |
| 622 | }); |
| 623 | |
| 624 | #if defined(XGBOOST_USE_FEDERATED) |
| 625 | collective::TestFederatedGlobal(world_size, [&] { |
| 626 | VerifyIterationRangeColumnSplit(use_gpu, ranged_model, sliced_model, kRows, kCols, kClasses, |
| 627 | margin_ranged, margin_sliced, leaf_ranged, leaf_sliced); |
| 628 | }); |
| 629 | #endif // defined(XGBOOST_USE_FEDERATED) |
| 630 | } |
| 631 | |
| 632 | void TestSparsePrediction(Context const *ctx, float sparsity) { |
| 633 | size_t constexpr kRows = 512, kCols = 128, kIters = 4; |
no test coverage detected