[Breaking] Rename Quantile DMatrix C API. (#7082)

The role of ProxyDMatrix is going beyond what it was designed.  Now it's used by both
QuantileDeviceDMatrix and inplace prediction.  After the refactoring of sparse DMatrix it
will also be used for external memory.  Renaming the C API to extract it from
QuantileDeviceDMatrix.
This commit is contained in:
Jiaming Yuan 2021-07-08 11:34:14 +08:00 committed by GitHub
parent c766f143ab
commit 5d7cdf2e36
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
5 changed files with 29 additions and 26 deletions

View File

@ -234,8 +234,8 @@ XGB_DLL int XGDMatrixCreateFromDT(void** data,
* - XGProxyDMatrixCreate * - XGProxyDMatrixCreate
* - XGDMatrixCallbackNext * - XGDMatrixCallbackNext
* - DataIterResetCallback * - DataIterResetCallback
* - XGDeviceQuantileDMatrixSetDataCudaArrayInterface * - XGProxyDMatrixSetDataCudaArrayInterface
* - XGDeviceQuantileDMatrixSetDataCudaColumnar * - XGProxyDMatrixSetDataCudaColumnar
* - ... (data setters) * - ... (data setters)
*/ */
@ -371,9 +371,10 @@ XGB_DLL int XGDeviceQuantileDMatrixCreateFromCallback(
* *
* \return 0 when success, -1 when failure happens * \return 0 when success, -1 when failure happens
*/ */
XGB_DLL int XGDeviceQuantileDMatrixSetDataCudaArrayInterface( XGB_DLL int
DMatrixHandle handle, XGProxyDMatrixSetDataCudaArrayInterface(DMatrixHandle handle,
const char* c_interface_str); const char *c_interface_str);
/*! /*!
* \brief Set data on a DMatrix proxy. * \brief Set data on a DMatrix proxy.
* *
@ -383,9 +384,9 @@ XGB_DLL int XGDeviceQuantileDMatrixSetDataCudaArrayInterface(
* *
* \return 0 when success, -1 when failure happens * \return 0 when success, -1 when failure happens
*/ */
XGB_DLL int XGDeviceQuantileDMatrixSetDataCudaColumnar( XGB_DLL int XGProxyDMatrixSetDataCudaColumnar(DMatrixHandle handle,
DMatrixHandle handle, const char *c_interface_str);
const char* c_interface_str);
/* /*
* ==========================- End data callback APIs ========================== * ==========================- End data callback APIs ==========================
*/ */
@ -563,7 +564,7 @@ XGB_DLL int XGDMatrixGetStrFeatureInfo(DMatrixHandle handle, const char *field,
* \return 0 when success, -1 when failure happens * \return 0 when success, -1 when failure happens
*/ */
XGB_DLL int XGDMatrixSetDenseInfo(DMatrixHandle handle, const char *field, XGB_DLL int XGDMatrixSetDenseInfo(DMatrixHandle handle, const char *field,
void *data, bst_ulong size, int type); void const *data, bst_ulong size, int type);
/*! /*!
* \brief (deprecated) Use XGDMatrixSetUIntInfo instead. Set group of the training matrix * \brief (deprecated) Use XGDMatrixSetUIntInfo instead. Set group of the training matrix

View File

@ -322,6 +322,7 @@ class DataIter:
self._handle = _ProxyDMatrix() self._handle = _ProxyDMatrix()
self.exception = None self.exception = None
self.enable_categorical = False self.enable_categorical = False
self._allow_host = False
@property @property
def proxy(self): def proxy(self):
@ -349,12 +350,12 @@ class DataIter:
feature_types=None, feature_types=None,
**kwargs **kwargs
): ):
from .data import dispatch_device_quantile_dmatrix_set_data from .data import dispatch_proxy_set_data
from .data import _device_quantile_transform from .data import _proxy_transform
data, feature_names, feature_types = _device_quantile_transform( data, feature_names, feature_types = _proxy_transform(
data, feature_names, feature_types, self.enable_categorical, data, feature_names, feature_types, self.enable_categorical,
) )
dispatch_device_quantile_dmatrix_set_data(self.proxy, data) dispatch_proxy_set_data(self.proxy, data, self._allow_host)
self.proxy.set_info( self.proxy.set_info(
feature_names=feature_names, feature_names=feature_names,
feature_types=feature_types, feature_types=feature_types,
@ -1009,18 +1010,18 @@ class _ProxyDMatrix(DMatrix):
interface = data.__cuda_array_interface__ interface = data.__cuda_array_interface__
interface_str = bytes(json.dumps(interface, indent=2), 'utf-8') interface_str = bytes(json.dumps(interface, indent=2), 'utf-8')
_check_call( _check_call(
_LIB.XGDeviceQuantileDMatrixSetDataCudaArrayInterface( _LIB.XGProxyDMatrixSetDataCudaArrayInterface(
self.handle, self.handle,
interface_str interface_str
) )
) )
def _set_data_from_cuda_columnar(self, data): def _set_data_from_cuda_columnar(self, data):
'''Set data from CUDA columnar format.1''' '''Set data from CUDA columnar format.'''
from .data import _cudf_array_interfaces from .data import _cudf_array_interfaces
_, interfaces_str = _cudf_array_interfaces(data) _, interfaces_str = _cudf_array_interfaces(data)
_check_call( _check_call(
_LIB.XGDeviceQuantileDMatrixSetDataCudaColumnar( _LIB.XGProxyDMatrixSetDataCudaColumnar(
self.handle, self.handle,
interfaces_str interfaces_str
) )

View File

@ -775,7 +775,7 @@ class SingleBatchInternalIter(DataIter): # pylint: disable=R0902
self.it = 0 self.it = 0
def _device_quantile_transform(data, feature_names, feature_types, enable_categorical): def _proxy_transform(data, feature_names, feature_types, enable_categorical):
if _is_cudf_df(data) or _is_cudf_ser(data): if _is_cudf_df(data) or _is_cudf_ser(data):
return _transform_cudf_df( return _transform_cudf_df(
data, feature_names, feature_types, enable_categorical data, feature_names, feature_types, enable_categorical
@ -788,8 +788,8 @@ def _device_quantile_transform(data, feature_names, feature_types, enable_catego
raise TypeError("Value type is not supported for data iterator:" + str(type(data))) raise TypeError("Value type is not supported for data iterator:" + str(type(data)))
def dispatch_device_quantile_dmatrix_set_data(proxy: _ProxyDMatrix, data: Any) -> None: def dispatch_proxy_set_data(proxy: _ProxyDMatrix, data: Any, allow_host: bool) -> None:
'''Dispatch for DeviceQuantileDMatrix.''' """Dispatch for DeviceQuantileDMatrix."""
if _is_cudf_df(data): if _is_cudf_df(data):
proxy._set_data_from_cuda_columnar(data) # pylint: disable=W0212 proxy._set_data_from_cuda_columnar(data) # pylint: disable=W0212
return return
@ -803,5 +803,7 @@ def dispatch_device_quantile_dmatrix_set_data(proxy: _ProxyDMatrix, data: Any) -
data = _transform_dlpack(data) data = _transform_dlpack(data)
proxy._set_data_from_cuda_interface(data) # pylint: disable=W0212 proxy._set_data_from_cuda_interface(data) # pylint: disable=W0212
return return
# Part of https://github.com/dmlc/xgboost/pull/7070
assert allow_host is False, "host data is not yet supported."
raise TypeError('Value type is not supported for data iterator:' + raise TypeError('Value type is not supported for data iterator:' +
str(type(data))) str(type(data)))

View File

@ -197,8 +197,8 @@ XGB_DLL int XGProxyDMatrixCreate(DMatrixHandle* out) {
} }
XGB_DLL int XGB_DLL int
XGDeviceQuantileDMatrixSetDataCudaArrayInterface(DMatrixHandle handle, XGProxyDMatrixSetDataCudaArrayInterface(DMatrixHandle handle,
char const *c_interface_str) { char const *c_interface_str) {
API_BEGIN(); API_BEGIN();
CHECK_HANDLE(); CHECK_HANDLE();
auto p_m = static_cast<std::shared_ptr<xgboost::DMatrix> *>(handle); auto p_m = static_cast<std::shared_ptr<xgboost::DMatrix> *>(handle);
@ -209,9 +209,8 @@ XGDeviceQuantileDMatrixSetDataCudaArrayInterface(DMatrixHandle handle,
API_END(); API_END();
} }
XGB_DLL int XGB_DLL int XGProxyDMatrixSetDataCudaColumnar(DMatrixHandle handle,
XGDeviceQuantileDMatrixSetDataCudaColumnar(DMatrixHandle handle, char const *c_interface_str) {
char const *c_interface_str) {
API_BEGIN(); API_BEGIN();
CHECK_HANDLE(); CHECK_HANDLE();
auto p_m = static_cast<std::shared_ptr<xgboost::DMatrix> *>(handle); auto p_m = static_cast<std::shared_ptr<xgboost::DMatrix> *>(handle);
@ -433,7 +432,7 @@ XGB_DLL int XGDMatrixGetStrFeatureInfo(DMatrixHandle handle, const char *field,
} }
XGB_DLL int XGDMatrixSetDenseInfo(DMatrixHandle handle, const char *field, XGB_DLL int XGDMatrixSetDenseInfo(DMatrixHandle handle, const char *field,
void *data, xgboost::bst_ulong size, void const *data, xgboost::bst_ulong size,
int type) { int type) {
API_BEGIN(); API_BEGIN();
CHECK_HANDLE(); CHECK_HANDLE();

View File

@ -23,7 +23,7 @@ int CudaArrayIterForTest::Next() {
if (iter_ == n_batches_) { if (iter_ == n_batches_) {
return 0; return 0;
} }
XGDeviceQuantileDMatrixSetDataCudaArrayInterface(proxy_, batches_[iter_].c_str()); XGProxyDMatrixSetDataCudaArrayInterface(proxy_, batches_[iter_].c_str());
iter_++; iter_++;
return 1; return 1;
} }