Я пишу простой код сценария для обучения предсказателя 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_perf - WARNING - full garbage collections took 36% CPU time recently (threshold: 10%)
)
Я проанализировал доступную панель управления и заметил, что мой код продолжает увеличивать использование памяти, пока не достигнет предела 80% (я изменил стандартные настройки внутри папки .config), а затем он начинает замедляться из-за сборщика мусора.
Вот пример:
По сути, это продолжается до тех пор, пока не заполнится вся доступная память. Набор данных, который я использую, довольно большой, поэтому я использую Dask. Однако кажется, что он в основном загружает весь набор данных в память (я не знаю, верно ли это предположение, но кажется, что это так из-за задач чтения-паркета).
Код довольно прост и, похоже, не вызывает больших проблем.
Автор библиотеки в следующем выпуске (Dask Github Issue) говорит:
Также стоит отметить, что это сообщение об ошибке
Распределенный.utils_perf - ПРЕДУПРЕЖДЕНИЕ - в последнее время полная сборка мусора занимала 47% процессорного времени (порог: 10%) чаще всего (но не исключительно) является ошибкой кода, который вы запускаете, и не имеет ничего общего с Dask. Даск просто находится в хорошем положении, чтобы сообщить вам, если такие вещи происходят.
Однако, как я уже сказал, код действительно прост.
- Как я могу убрать это предупреждение? Это действительно снижает производительность моего кода
- Я использую Dask для работы по частям, поскольку мой набор данных слишком велик для размещения в памяти. Однако кажется, что он загружает все в память, что делает использование Dask бесполезным. Как я могу заставить его работать должным образом (по частям)?