当前位置: 首页 > 知识库问答 >
问题:

pipeline - 如何在Pipeline中使用XGBoost进行GPU训练?

詹弘毅
2024-12-11

XGBoost如何用GPU进行训练?

结合了pipeline、FunctionTransformer、GridSearchCV、XGBoost做训练,能在XGBoost做训练中设置 device='cuda'开启训练,但是训练数据却无法送到 GPU,请问如何解决呢?

cat_columns = X.select_dtypes(include=['object']).columns.values # 注意:这里不要用train_df,否则会出现 KeyErr: Premium Amount
num_columns = X.select_dtypes(include=np.number).columns.values

print(cat_columns)
print(num_columns)

preprocess = ColumnTransformer([
    ('categorical', make_pipeline(transform_datatime, transform_drop_columns, SimpleImputer(strategy='most_frequent'), OneHotEncoder()), cat_columns),
    ('numerical', make_pipeline(transform_drop_columns, SimpleImputer(strategy='mean'), StandardScaler()), num_columns)
])

# 定义完整的pipeline
pipeline = Pipeline(steps=[
    ('preprocess', preprocess),
    ('regressor', xgbRegressor(tree_method='hist', objective='reg:squarederror', n_jobs=-1))
])

# 定义超参数网格
param_grid = {
    'regressor__n_estimators': [200, 300],
    'regressor__max_depth': [5, 7],
    'regressor__learning_rate': [0.05, 0.1],
    'regressor__subsample': [0.8, 1.0]
}

# 设置GridSearchCV
grid_search = GridSearchCV(pipeline, param_grid, cv=2, scoring='neg_mean_squared_error', verbose=2)

grid_search.fit(X, y)

参考了官方文档,但是依然无法将训练数据设置到 GPU 上。

params = dict()
params["device"] = "cuda"
params["tree_method"] = "hist"
Xy = xgboost.QuantileDMatrix(X, y)
xgboost.train(params, Xy)

共有2个答案

锺离辰沛
2024-12-11
from sklearn.compose import ColumnTransformer
from sklearn.pipeline import Pipeline, make_pipeline
from sklearn.impute import SimpleImputer
from sklearn.preprocessing import OneHotEncoder, StandardScaler
from sklearn.model_selection import GridSearchCV
from xgboost import XGBRegressor
import numpy as np

# 选择分类和数值列
cat_columns = X.select_dtypes(include=['object']).columns.values
num_columns = X.select_dtypes(include=np.number).columns.values

print(cat_columns)
print(num_columns)

# 定义预处理步骤
preprocess = ColumnTransformer([
    ('categorical', make_pipeline(transform_datetime, transform_drop_columns, SimpleImputer(strategy='most_frequent'), OneHotEncoder()), cat_columns),
    ('numerical', make_pipeline(transform_drop_columns, SimpleImputer(strategy='mean'), StandardScaler()), num_columns)
])

# 定义完整的管道
pipeline = Pipeline(steps=[
    ('preprocess', preprocess),
    ('regressor', XGBRegressor(tree_method='hist', objective='reg:squarederror', n_jobs=-1))
])

# 定义超参数网格
param_grid = {
    'regressor__n_estimators': [200, 300],
    'regressor__max_depth': [5, 7],
    'regressor__learning_rate': [0.05, 0.1],
    'regressor__subsample': [0.8, 1.0]
}

# 设置 GridSearchCV
grid_search = GridSearchCV(pipeline, param_grid, cv=2, scoring='neg_mean_squared_error', verbose=2)

# 拟合模型
grid_search.fit(X, y)
淳于博
2024-12-11

在您的Pipeline中使用XGBoost进行GPU训练时,确保数据能够正确传递到GPU上,您需要确保几个关键点被正确设置。以下是如何在您的Pipeline中配置XGBoost以使用GPU进行训练的步骤和解释:

步骤 1: 安装支持GPU的XGBoost

首先,确保您安装了支持GPU的XGBoost版本。这通常意味着您需要安装xgboost-cuda或者通过特定的安装命令来确保CUDA支持。

pip install xgboost --install-option=--enable-cuda

步骤 2: 配置XGBoostRegressor以使用GPU

在您的Pipeline中,xgbRegressor需要被配置为使用GPU。虽然您已经在params中设置了device='cuda',但这种方式在Pipeline中并不直接适用,因为Pipeline中的xgbRegressor需要直接接受这些参数。您可以通过在初始化xgbRegressor时直接传递这些参数来实现。

修改后的代码

import xgboost as xgb
from sklearn.pipeline import Pipeline
from sklearn.compose import ColumnTransformer
from sklearn.preprocessing import SimpleImputer, OneHotEncoder, StandardScaler
from sklearn.model_selection import GridSearchCV
from sklearn.pipeline import make_pipeline
import numpy as np

假设X和y已经被定义并加载

cat_columns = X.select_dtypes(include=['object']).columns.values
num_columns = X.select_dtypes(include=np.number).columns.values

print(cat_columns)
print(num_columns)

preprocess = ColumnTransformer([

('categorical', make_pipeline(SimpleImputer(strategy='most_frequent'), OneHotEncoder()), cat_columns),
('numerical', make_pipeline(SimpleImputer(strategy='mean'), StandardScaler()), num_columns)

])

定义XGBoostRegressor并配置为使用GPU

xgb_regressor = xgb.XGBRegressor(

tree_method='hist',
objective='reg:squarederror',
use_label_encoder=False,  # 注意:对于XGBoost 1.3.0及以上版本,需要设置
gpu_id=0,                 # 指定GPU设备ID
predictor='gpu_predictor' # 明确指定使用GPU预测器

)

定义完整的pipeline

pipeline = Pipeline(steps=[

('preprocess', preprocess),
('regressor', xgb_regressor)

])

定义超参数网格

param_grid = {

'regressor__n_estimators': [200, 300],
'regressor__max_depth': [5, 7],
'regressor__learning_rate': [0.05, 0.1],
'regressor__subsample': [0.8, 1.0]

}

设置GridSearchCV

grid_search = GridSearchCV(pipeline, param_grid, cv=2, scoring='neg_mean_squared_error', verbose=2)

grid_search.fit(X, y)


### 解释

1. **GPU支持**:确保安装了支持CUDA的XGBoost。
2. **XGBoostRegressor参数**:
   - `gpu_id`:指定使用的GPU设备ID。
   - `predictor`:设置为`'gpu_predictor'`以在预测时使用GPU。
   - 注意`use_label_encoder`参数,这是为了避免在新版本XGBoost中可能遇到的标签编码问题。
3. **Pipeline配置**:直接在`xgbRegressor`的初始化中设置GPU相关参数,这样Pipeline中的每一步都能正确地处理和传递数据。
 类似资料:
  • Banzai Pipeline, or simply Pipeline is a tabletop reef break located in Hawaii, Oahu's North Shore. The most famous and infamous reef in the universe is the benchmark by which all other waves are meas

  • 我有一个groovy文件,我想从Jenkinsfile运行。 即加载脚本。groovy 但是,我不确定如何引用这个文件,如果它存储在与Jenkinsfile相同的目录中。我正在从git加载Jenkinsfile。我注意到它创建了一个名为的文件夹。它没有将其放在工作区目录中。我可以对文件夹进行硬编码,但我不确定这方面的规则,再次签出代码似乎有点多余。 默认情况下,它从工作区加载,而不是 我正在尝试将

  • 问题内容: 我们正在尝试迭代,但没有成功。我们将问题简化为以下最小示例: 如果我们尝试迭代: 仅输出第一个条目: 我们所知道的替代方法甚至无法进入循环: 要么 都失败了,都只显示异常。(这可能与在引发“真实”异常时发生的异常有关,使我们无法知道发生了什么)。 我们正在使用最新稳定的jenkins(2.19.1),并将所有插件更新为今天(2016/10/20)。 是否有解决方案来迭代Jenkins管

  • 问题内容: 我正在研究Jenkins Pipeline:Multibranch的功能。据说最近采取的步骤可能有用,但是我无法了解它的工作原理和目的。 它的提示消息似乎不太清楚: 更新运行此步骤的作业的属性。多分支工作流主要有用,因此Jenkinsfile本身可以编码静态作业配置。 因此,我以此为脚本创建了一个新管道(直接粘贴到Jenkins中而不是SCM中): 我运行了它,但没有任何反应,作业没有

  • 问题内容: 我需要在链接到Azure Key Vault机密的Azure管道中使用Variable组。该机密将用于连接到sql数据库。 在Azure管道中以生成方式运行它时,是否可以通过此方法将变量组传递给Jmeter.jmx ? 这是我运行Jmeter.jmx负载测试文件时使用的模板。 https://docs.microsoft.com/zh-cn/azure/devops/pipelines

  • 问题内容: 我在声明性jenkins管道中执行以下步骤:我使用libraryResource 创建来自文件夹的脚本。该脚本包含我的用户和某些用户的凭据。 这很好。我可以使用我的用户。现在,我正在寻找最好的方式来包括用户的凭据。我是否需要“嵌套”第二部分,还是可以再次添加“数组”? 问题答案: 当然,您可以使用一个块将多个凭证分配给不同的变量。

  • 当Item在Spider中被收集之后,它将会被传递到Item Pipeline,一些组件会按照一定的顺序执行对Item的处理。 每个item pipeline组件(有时称之为“Item Pipeline”)是实现了简单方法的Python类。他们接收到Item并通过它执行一些行为,同时也决定此Item是否继续通过pipeline,或是被丢弃而不再进行处理。 以下是item pipeline的一些典型

  • Asset Pipeline 本文介绍 Asset Pipeline。 读完本文,你将学到: Asset Pipeline 是什么以及其作用; 如何合理组织程序的静态资源; Asset Pipeline 的优势; 如何向 Asset Pipeline 中添加预处理器; 如何在 gem 中打包静态资源; 1 Asset Pipeline 是什么? Asset Pipeline 提供了一个框架,用于连