Я выполняю поиск по сетке с 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 ГБ?
Теоретически существует три различных пути:
- Ограничить использование памяти в Scikit-Learn
- Ограничение использования памяти на Python
- Ограничение использования памяти в Linux
Пока что я экспериментировал с (1), установив разные значения на n_jobs
и pre_dispatch
, а затем проверять использование памяти соответствующими процессами в Linux (free -h
, ps aux --sort-rss
и т. д.).
Однако я думаю, что это довольно неэффективно, поскольку вы не можете точно указать ограничение памяти (например, 10 ГБ), и использование памяти этими процессами постоянно меняется с течением времени. В результате я должен постоянно следить за использованием памяти и затем изменять значения n_jobs
и pre_dispatch
и т. д.