Poe*_*dit 6 python linux memory-management scikit-learn grid-search
我正在使用GridSearchCV( scikit-learn)Spark和执行网格搜索Linux。出于这个原因,我nohup ./spark_python_shell.sh > output.log &在我的bashshell 中运行以点燃 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
Run Code Online (Sandbox Code Playgroud)
这是grid_search.py将网格搜索连接到 Spark 集群并执行网格搜索的python 脚本的一部分:
# 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)
Run Code Online (Sandbox Code Playgroud)
这种网格搜索显然在 Linux 上创建了多个进程,并且这些进程具有不同的 PID。
我的问题如下:
如何限制此网格搜索的内存使用量?
例如,如何将其最大内存使用量设置为 10GB?
从理论上讲,可以遵循三种不同的路线:
现在,我通过不同的值设定为与(1)试验n_jobs
和pre_dispatch然后cheking相关流程在Linux(存储器使用free -h,ps aux --sort-rss等等)。
但是,我认为这非常低效,因为您无法准确指定内存上限(例如 10 GB),并且这些进程的内存使用会随着时间的推移而不断变化。其结果是,我必须对眼睛不断地保持对内存的使用情况,然后修改的值n_jobs
和pre_dispatch等。