From 43974939f4ed79ddf650dfdc4ae6f32e3f8f80fd Mon Sep 17 00:00:00 2001 From: Jiaming Yuan Date: Tue, 28 Jan 2020 15:29:14 +0800 Subject: [PATCH] Better error message about loading pickled model. (#5236) Print the link to new tutorial. --- src/learner.cc | 15 ++++++++++++--- 1 file changed, 12 insertions(+), 3 deletions(-) diff --git a/src/learner.cc b/src/learner.cc index 56f2932de..86afaba61 100644 --- a/src/learner.cc +++ b/src/learner.cc @@ -657,8 +657,19 @@ class LearnerImpl : public Learner { std::string header; header.resize(serialisation_header_.size()); CHECK_EQ(fp.Read(&header[0], header.size()), serialisation_header_.size()); - CHECK_EQ(header, serialisation_header_); + // Avoid printing the content in loaded header, which might be random binary code. + CHECK(header == serialisation_header_) // NOLINT + << R"doc( +If you are loading a serialized model (like pickle in Python) generated by older XGBoost, +please export the model by calling `Booster.save_model` from that version first, then load +it back in current version. See: + + https://xgboost.readthedocs.io/en/latest/tutorials/saving_model.html + +for more details about differences between saving model and serializing. + +)doc"; int64_t json_offset {-1}; CHECK_EQ(fp.Read(&json_offset, sizeof(json_offset)), sizeof(json_offset)); CHECK_GT(json_offset, 0); @@ -668,8 +679,6 @@ class LearnerImpl : public Learner { common::MemoryFixSizeBuffer binary_buf(&buffer[0], json_offset); this->LoadModel(&binary_buf); - common::MemoryFixSizeBuffer json_buf {&buffer[0] + json_offset, - buffer.size() - json_offset}; auto config = Json::Load({buffer.c_str() + json_offset, buffer.size() - json_offset}); this->LoadConfig(config); }