GridSearchCV - Как ограничить использование памяти - PullRequest
0 голосов
/ 29 октября 2018

Я выполняю поиск по сетке с GridSearchCV (scikit-learn) на Spark и Linux. По этой причине я запускаю nohup ./spark_python_shell.sh > output.log & в своей оболочке bash для запуска кластера Spark, и я также запускаю свой скрипт на python (см. Ниже spark-submit \ --master yarn 'grid_search.py'):

    SPARK_HOME=/u/users/******/spark-2.3.0 \
    Q_CORE_LOC=/u/users/******/q-core \
    ENV=local \
    HIVE_HOME=/usr/hdp/current/hive-client \
    SPARK2_HOME=/u/users/******/spark-2.3.0 \
    HADOOP_CONF_DIR=/etc/hadoop/conf \
    HIVE_CONF_DIR=/etc/hive/conf \
    HDFS_PREFIX=hdfs:// \
    PYTHONPATH=/u/users/******/q-core/python-lib:/u/users/******/three-queues/python-lib:/u/users/******/pyenv/prod_python_libs/lib/python2.7/site-packages/:$PYTHON_PATH \
    YARN_HOME=/usr/hdp/current/hadoop-yarn-client \
    SPARK_DIST_CLASSPATH=$(hadoop classpath):$(yarn classpath):/etc/hive/conf/hive-site.xml \
    PYSPARK_PYTHON=/usr/bin/python2.7 \
    QQQ_LOC=/u/users/******/three-queues \
    spark-submit \
    --master yarn 'grid_search.py' \
    --executor-memory 10g \
    --num-executors 8 \
    --executor-cores 10 \
    --conf spark.port.maxRetries=80 \
    --conf spark.dynamicAllocation.enabled=False \
    --conf spark.default.parallelism=6000 \
    --conf spark.sql.shuffle.partitions=6000 \
    --principal ************************ \
    --queue default \
    --name lets_get_starting \
    --keytab /u/users/******/.******.keytab \
    --driver-memory 10g

Это часть скрипта grid_search.py python, который соединяет Grid Search с кластером Spark и выполняет Grid Search:

# Spark configuration
from pyspark import SparkContext, SparkConf
conf = SparkConf()
sc = SparkContext(conf=conf)

# Execute grid search - using spark_sklearn library
from spark_sklearn import GridSearchCV
classifiers_grid = GridSearchCV(sc, estimator=classifier, param_grid=parameters, scoring='precision', cv=3,n_jobs=5, pre_dispatch=10)
classifiers_grid.fit(X, y)

Этот поиск в сетке, по-видимому, создает множество процессов в Linux, и эти процессы имеют разные PID.

У меня следующий вопрос:

Как я могу ограничить использование памяти для этого поиска по сетке?

Например, как я могу установить максимальное использование памяти для него на 10 ГБ?

Теоретически существует три различных пути:

  1. Ограничить использование памяти в Scikit-Learn
  2. Ограничение использования памяти на Python
  3. Ограничение использования памяти в Linux

Пока что я экспериментировал с (1), установив разные значения на n_jobs и pre_dispatch, а затем проверять использование памяти соответствующими процессами в Linux (free -h, ps aux --sort-rss и т. д.).

Однако я думаю, что это довольно неэффективно, поскольку вы не можете точно указать ограничение памяти (например, 10 ГБ), и использование памяти этими процессами постоянно меняется с течением времени. В результате я должен постоянно следить за использованием памяти и затем изменять значения n_jobs и pre_dispatch и т. д.

...