当我增加Dask工人的数量时,为什么Featuretools会变慢?

时间:2020-03-07 00:23:55

标签: jupyter-notebook dask amazon-sagemaker feature-engineering featuretools

我正在使用具有72个内核和144 GB RAM的Amazon SageMaker Notebook,我对整个数据进行了两次测试,以检查Dask集群是否正常工作。

该样本具有来自5个不同“资产”的4500行和735列(我的意思是每个资产147列)。该代码正在过滤列并为每个过滤后的数据框创建一个特征矩阵。

首先,我按如下所示初始化集群,我接收了72个工作程序,并运行了17分钟。 (我假设我创建了72个工人,每个工人只有一个核心。)

    from dask.distributed import Client, LocalCluster
    cluster = LocalCluster(processes=True,n_workers=72,threads_per_worker=72)

    def main():
      import featuretools as ft
      list_columns = list(df_concat_02.columns)

      list_df_features=[]
      from tqdm.notebook import tqdm

      for asset in tqdm(list_columns,total=len(list_columns)):
        dataframe = df_sma.filter(regex="^"+asset, axis=1).reset_index()

        es = ft.EntitySet()  
        es = es.entity_from_dataframe(entity_id = 'MARKET', dataframe =dataframe, 
                                      index = 'index', 
                                      time_index = 'Date')
        fm, features = ft.dfs(entityset=es, 
                              target_entity='MARKET',
                              trans_primitives = ['divide_numeric'],
                              agg_primitives = [],
                              max_depth=1,
                              verbose=True,
                              dask_kwargs={'cluster': client.scheduler.address}

                              )
        list_df_features.append(fm)
      return list_df_features

    if __name__ == "__main__":
        list_df = main()

第二,我按如下所示初始化集群,我收到了9个工作程序,并运行了3.5分钟。 (我假设我创建了9个工人,每个工人有8个核心。)

from dask.distributed import Client, LocalCluster
cluster = LocalCluster(processes=True)

def main():
  import featuretools as ft
  list_columns = list(df_concat_02.columns)

  list_df_features=[]
  from tqdm.notebook import tqdm

  for asset in tqdm(list_columns,total=len(list_columns)):
    dataframe = df_sma.filter(regex="^"+asset, axis=1).reset_index()

    es = ft.EntitySet()  
    es = es.entity_from_dataframe(entity_id = 'MARKET', dataframe =dataframe, 
                                  index = 'index', 
                                  time_index = 'Date')
    fm, features = ft.dfs(entityset=es, 
                          target_entity='MARKET',
                          trans_primitives = ['divide_numeric'],
                          agg_primitives = [],
                          max_depth=1,
                          verbose=True,
                          dask_kwargs={'cluster': client.scheduler.address}

                          )
    list_df_features.append(fm)
  return list_df_features

if __name__ == "__main__":
    list_df = main()

对我来说,这真是令人难以置信,因为我认为72名工人可以更快地完成工作!一旦我既不是Dask也不是FeatureTools的专家,我都想我设置错了。

我将不胜感激!

谢谢!

1 个答案:

答案 0 :(得分:1)

您正在DFS中正确设置dask_kwargs。我认为速度下降是由于额外的开销和每个工作人员的内核减少而导致的。工人越多,传输数据的开销就越大。此外,可以利用1位工作人员的8个内核来使计算运行快于8位工作人员的1个内核。