Python 减少dask XG提升内存消耗

Python 减少dask XG提升内存消耗,python,dask,xgboost,dask-distributed,dask-ml,Python,Dask,Xgboost,Dask Distributed,Dask Ml,我正在编写一个简单的脚本代码,在我的数据集上训练XGBoost预测器。 这是我正在使用的代码: import dask.dataframe as dd import dask_ml from dask.distributed import Client, LocalCluster import sys from dask_ml.model_selection import train_test_split import dask import xgboost import dask_xgboos

我正在编写一个简单的脚本代码,在我的数据集上训练XGBoost预测器。 这是我正在使用的代码:

import dask.dataframe as dd
import dask_ml
from dask.distributed import Client, LocalCluster
import sys
from dask_ml.model_selection import train_test_split
import dask
import xgboost
import dask_xgboost

def start_cluster(n_workers=1, threads_per_worker=2, memory_limit="12GB", processes=False):
    cluster = LocalCluster(
        n_workers=n_workers, threads_per_worker=threads_per_worker, memory_limit=memory_limit, processes=processes
    )
    client = Client(cluster)  # use default n_threads and mem
    print(client)
    print(client.cluster)
    print("Client infos:", client.scheduler_info())
    return client

client = start_cluster()

dask_df = dd.read_parquet('./sample_dataset', engine='pyarrow')

dask_df=dask_df.drop(
    ['mapped_tweet_id',
     'mapped_creator_id',
     'mapped_engager_id',
     'engagement_retweet_timestamp',
     'engagement_comment_timestamp',
     'engagement_reply_timestamp',
     'mapped_tweet_links',
     'mapped_domains',
     'mapped_tweet_hashtags'
    ], axis=1
)

y = dask_df['engagement_like_timestamp']>0

dask_df=dask_df.drop(
    [
     'engagement_like_timestamp',
    ], axis=1
)

X_train, X_test, y_train, y_test = train_test_split(dask_df, y, test_size=0.2, shuffle= True)

params = {'objective': 'binary:logistic',
          'max_depth': 4, 'eta': 0.01, 'subsample': 0.5,
          'min_child_weight': 0.5}

bst = dask_xgboost.train(client, params, X_train, y_train, num_boost_round=10)
它运行正常,但我一直收到与Dask相关的常见垃圾收集器警告(
distributed.utils\u perf-warning-最近完整垃圾收集占用了36%的CPU时间(阈值:10%)

我分析了可用的仪表板,我注意到我的代码不断增加内存使用量,直到达到80%的限制(我更改了.config文件夹中的标准设置),然后由于垃圾收集器,它开始变慢

这里有一个例子:

它基本上一直这样运行,直到它耗尽所有可用内存。我使用的数据集非常大,这就是我使用Dask的原因。然而,它似乎基本上是将整个数据集加载到内存中(我不知道这个假设是否正确,但由于读取拼花地板任务,它似乎是正确的)

代码非常简单,似乎没有什么大问题

从图书馆的作者在下面的问题( )他说:

还值得注意的是,此错误消息

distributed.utils_perf-警告-完全垃圾收集占47% 最近的CPU时间(阈值:10%)是最常见的(但不是唯一的) 您正在运行的代码的错误,与此无关 达斯克。Dask正好可以让你知道 这一切都在发生

然而,正如我已经说过的,代码实际上是直截了当的

  • 如何删除此警告?这确实降低了代码的性能
  • 由于我的数据集太大,无法放入内存,所以我使用Dask进行“分块”工作。然而,它似乎正在将所有内容加载到内存中,这使得Dask的使用变得毫无用处。我如何“强制”它按预期工作(按块)

  • 请尝试使用
    xgboost.dask

    以下是一些文档:

    以下是该站点的一些示例代码:

    import xgboost as xgb
    import dask.array as da
    import dask.distributed
    
    cluster = dask.distributed.LocalCluster(n_workers=4, threads_per_worker=1)
    client = dask.distributed.Client(cluster)
    
    # X and y must be Dask dataframes or arrays
    num_obs = 1e5
    num_features = 20
    X = da.random.random(
        size=(num_obs, num_features),
        chunks=(1000, num_features)
    )
    y = da.random.random(
        size=(num_obs, 1),
        chunks=(1000, 1)
    )
    
    dtrain = xgb.dask.DaskDMatrix(client, X, y)
    
    output = xgb.dask.train(client,
                            {'verbosity': 2,
                             'tree_method': 'hist',
                             'objective': 'reg:squarederror'
                             },
                            dtrain,
                            num_boost_round=4, evals=[(dtrain, 'train')])
    

    您能告诉我们您在哪里提到了以前使用dask和xgboost的方法吗?如果它在我们的文档中,我很想更正它

    请您尝试使用
    xgboost.dask

    以下是一些文档:

    以下是该站点的一些示例代码:

    import xgboost as xgb
    import dask.array as da
    import dask.distributed
    
    cluster = dask.distributed.LocalCluster(n_workers=4, threads_per_worker=1)
    client = dask.distributed.Client(cluster)
    
    # X and y must be Dask dataframes or arrays
    num_obs = 1e5
    num_features = 20
    X = da.random.random(
        size=(num_obs, num_features),
        chunks=(1000, num_features)
    )
    y = da.random.random(
        size=(num_obs, 1),
        chunks=(1000, 1)
    )
    
    dtrain = xgb.dask.DaskDMatrix(client, X, y)
    
    output = xgb.dask.train(client,
                            {'verbosity': 2,
                             'tree_method': 'hist',
                             'objective': 'reg:squarederror'
                             },
                            dtrain,
                            num_boost_round=4, evals=[(dtrain, 'train')])
    

    您能告诉我们您在哪里提到了以前使用dask和xgboost的方法吗?如果它在我们的文档中,我很想更正它

    我会尽快尝试代码!然而,我阅读了以下文件:,和。我被大量不同的xgboost接口、包含和调用弄糊涂了。正如您所注意到的,在文档的每个链接中,接口略有不同(以及所需的导入语句)。您链接的文档是新的“官方”文档吗?我还想知道您链接的xgboost是否能够对不适合内存的数据集(既不是本地的,也不是分布式的)进行培训。为了更清楚地说明这一点,我使用了一台16GB的本地计算机(本地集群),其数据集比我的内存大。这个实现是否能够在不将整个数据集加载到内存的情况下对数据集进行分块训练?我将尽快尝试代码!然而,我阅读了以下文件:,和。我被大量不同的xgboost接口、包含和调用弄糊涂了。正如您所注意到的,在文档的每个链接中,接口略有不同(以及所需的导入语句)。您链接的文档是新的“官方”文档吗?我还想知道您链接的xgboost是否能够对不适合内存的数据集(既不是本地的,也不是分布式的)进行培训。为了更清楚地说明这一点,我使用了一台16GB的本地计算机(本地集群),其数据集比我的内存大。这个实现是否能够在不将整个数据集加载到内存的情况下对数据集进行分块训练?