xgboost
predictor.h
Go to the documentation of this file.
1 
7 #pragma once
8 #include <xgboost/base.h>
9 #include <xgboost/data.h>
12 
13 #include <functional>
14 #include <memory>
15 #include <string>
16 #include <unordered_map>
17 #include <utility>
18 #include <vector>
19 #include <mutex>
20 
21 // Forward declarations
22 namespace xgboost {
23 class TreeUpdater;
24 namespace gbm {
25 struct GBTreeModel;
26 } // namespace gbm
27 }
28 
29 namespace xgboost {
36  // A storage for caching prediction values
38  // The version of current cache, corresponding number of layers of trees
39  uint32_t version { 0 };
40  // A weak pointer for checking whether the DMatrix object has expired.
41  std::weak_ptr< DMatrix > ref;
42 
43  PredictionCacheEntry() = default;
44  /* \brief Update the cache entry by number of versions.
45  *
46  * \param v Added versions.
47  */
48  void Update(uint32_t v) {
49  version += v;
50  }
51 };
52 
53 /* \brief A container for managed prediction caches.
54  */
56  std::unordered_map<DMatrix *, PredictionCacheEntry> container_;
57  void ClearExpiredEntries();
58 
59  public:
60  PredictionContainer() = default;
61  /* \brief Add a new DMatrix to the cache, at the same time this function will clear out
62  * all expired caches by checking the `std::weak_ptr`. Caching an existing
63  * DMatrix won't renew it.
64  *
65  * Passing in a `shared_ptr` is critical here. First to create a `weak_ptr` inside the
66  * entry this shared pointer is necessary. More importantly, the life time of this
67  * cache is tied to the shared pointer.
68  *
69  * Another way to make a safe cache is create a proxy to this entry, with anther shared
70  * pointer defined inside, and pass this proxy around instead of the real entry. But
71  * seems to be too messy. In XGBoost, functions like `UpdateOneIter` will have
72  * (memory) safe access to the DMatrix as long as it's passed in as a `shared_ptr`.
73  *
74  * \param m shared pointer to the DMatrix that needs to be cached.
75  * \param device Which device should the cache be allocated on. Pass
76  * GenericParameter::kCpuId for CPU or positive integer for GPU id.
77  *
78  * \return the cache entry for passed in DMatrix, either an existing cache or newly
79  * created.
80  */
81  PredictionCacheEntry& Cache(std::shared_ptr<DMatrix> m, int32_t device);
82  /* \brief Get a prediction cache entry. This entry must be already allocated by `Cache`
83  * method. Otherwise a dmlc::Error is thrown.
84  *
85  * \param m pointer to the DMatrix.
86  * \return The prediction cache for passed in DMatrix.
87  */
89  /* \brief Get a const reference to the underlying hash map. Clear expired caches before
90  * returning.
91  */
92  decltype(container_) const& Container();
93 };
94 
103 class Predictor {
104  protected:
105  Context const* ctx_;
106 
107  public:
108  explicit Predictor(Context const* ctx) : ctx_{ctx} {}
109 
110  virtual ~Predictor() = default;
111 
117  virtual void Configure(const std::vector<std::pair<std::string, std::string>>&);
118 
127  const gbm::GBTreeModel& model) const;
128 
139  virtual void PredictBatch(DMatrix* dmat, PredictionCacheEntry* out_preds,
140  const gbm::GBTreeModel& model, uint32_t tree_begin,
141  uint32_t tree_end = 0) const = 0;
142 
156  virtual bool InplacePredict(std::shared_ptr<DMatrix> p_fmat, const gbm::GBTreeModel& model,
157  float missing, PredictionCacheEntry* out_preds,
158  uint32_t tree_begin = 0, uint32_t tree_end = 0) const = 0;
171  virtual void PredictInstance(const SparsePage::Inst& inst,
172  std::vector<bst_float>* out_preds,
173  const gbm::GBTreeModel& model,
174  unsigned tree_end = 0) const = 0;
175 
186  virtual void PredictLeaf(DMatrix* dmat, HostDeviceVector<bst_float>* out_preds,
187  const gbm::GBTreeModel& model,
188  unsigned tree_end = 0) const = 0;
189 
205  virtual void
207  const gbm::GBTreeModel &model, unsigned tree_end = 0,
208  std::vector<bst_float> const *tree_weights = nullptr,
209  bool approximate = false, int condition = 0,
210  unsigned condition_feature = 0) const = 0;
211 
213  DMatrix *dmat, HostDeviceVector<bst_float> *out_contribs,
214  const gbm::GBTreeModel &model, unsigned tree_end = 0,
215  std::vector<bst_float> const *tree_weights = nullptr,
216  bool approximate = false) const = 0;
217 
224  static Predictor* Create(
225  std::string const& name, GenericParameter const* generic_param);
226 };
227 
232  : public dmlc::FunctionRegEntryBase<
233  PredictorReg, std::function<Predictor*(GenericParameter const*)>> {};
234 
235 #define XGBOOST_REGISTER_PREDICTOR(UniqueId, Name) \
236  static DMLC_ATTRIBUTE_UNUSED ::xgboost::PredictorReg& \
237  __make_##PredictorReg##_##UniqueId##__ = \
238  ::dmlc::Registry<::xgboost::PredictorReg>::Get()->__REGISTER__(Name)
239 } // namespace xgboost
defines configuration macros of xgboost.
Internal data structured used by XGBoost during training.
Definition: data.h:490
Meta information about dataset, always sit in memory.
Definition: data.h:46
Definition: predictor.h:55
PredictionCacheEntry & Entry(DMatrix *m)
PredictionCacheEntry & Cache(std::shared_ptr< DMatrix > m, int32_t device)
decltype(container_) const & Container()
Performs prediction on individual training instances or batches of instances for GBTree....
Definition: predictor.h:103
virtual void PredictInteractionContributions(DMatrix *dmat, HostDeviceVector< bst_float > *out_contribs, const gbm::GBTreeModel &model, unsigned tree_end=0, std::vector< bst_float > const *tree_weights=nullptr, bool approximate=false) const =0
static Predictor * Create(std::string const &name, GenericParameter const *generic_param)
Creates a new Predictor*.
void InitOutPredictions(const MetaInfo &info, HostDeviceVector< bst_float > *out_predt, const gbm::GBTreeModel &model) const
Initialize output prediction.
virtual void PredictContribution(DMatrix *dmat, HostDeviceVector< bst_float > *out_contribs, const gbm::GBTreeModel &model, unsigned tree_end=0, std::vector< bst_float > const *tree_weights=nullptr, bool approximate=false, int condition=0, unsigned condition_feature=0) const =0
feature contributions to individual predictions; the output will be a vector of length (nfeats + 1) *...
virtual void Configure(const std::vector< std::pair< std::string, std::string >> &)
Configure and register input matrices in prediction cache.
Predictor(Context const *ctx)
Definition: predictor.h:108
virtual void PredictLeaf(DMatrix *dmat, HostDeviceVector< bst_float > *out_preds, const gbm::GBTreeModel &model, unsigned tree_end=0) const =0
predict the leaf index of each tree, the output will be nsample * ntree vector this is only valid in ...
Context const * ctx_
Definition: predictor.h:105
virtual void PredictInstance(const SparsePage::Inst &inst, std::vector< bst_float > *out_preds, const gbm::GBTreeModel &model, unsigned tree_end=0) const =0
online prediction function, predict score for one instance at a time NOTE: use the batch prediction i...
virtual ~Predictor()=default
virtual bool InplacePredict(std::shared_ptr< DMatrix > p_fmat, const gbm::GBTreeModel &model, float missing, PredictionCacheEntry *out_preds, uint32_t tree_begin=0, uint32_t tree_end=0) const =0
Inplace prediction.
virtual void PredictBatch(DMatrix *dmat, PredictionCacheEntry *out_preds, const gbm::GBTreeModel &model, uint32_t tree_begin, uint32_t tree_end=0) const =0
Generate batch predictions for a given feature matrix. May use cached predictions if available instea...
span class implementation, based on ISO++20 span<T>. The interface should be the same.
Definition: span.h:423
The input data structure of xgboost.
A device-and-host vector abstraction layer.
namespace of xgboost
Definition: base.h:110
Definition: generic_parameters.h:15
Contains pointer to input matrix and associated cached predictions.
Definition: predictor.h:35
uint32_t version
Definition: predictor.h:39
HostDeviceVector< bst_float > predictions
Definition: predictor.h:37
void Update(uint32_t v)
Definition: predictor.h:48
std::weak_ptr< DMatrix > ref
Definition: predictor.h:41
Registry entry for predictor.
Definition: predictor.h:233