Резюме:
Я создал конвейер машинного обучения, в котором я использую функциональность pandas_udf
для обучения XGBoost моделей. Время обучения модели на моей локальной машине составляет 20-25 минут, тогда как когда я запускаю ее на Red Hat , время обучения уходит до 4 часов, при этом все остальные факторы, такие как среда, остаются неизменными. То, что мы смогли воспроизвести, запустив код на разных серверах, выглядит следующим образом:
Если Task
имеет уровень локальности PROCESS_LOCAL
, он завершается очень быстро независимо оттот факт, что мы запускаем его (локально или на сервере), но если locality
задания равно ANY
, то время, необходимое для его выполнения в Red Hat, очень велико по сравнению с моим локальным компьютером. Например - выполнение задачи с локальностью ANY
на моем локальном компьютере может занять 2 или 3 секунды, но задача с таким же уровнем локальности в Red hat будет где-то около 15-20 минут.
ПРИМЕЧАНИЕ : Task
в вышеприведенном пункте относится к процессу обучения моделей XGBoost с использованием функциональности pandas_udf
На основании других задержек, которые мы видели, плюс вышеупомянутыепроблема, заставила нас сделать вывод, что в Red Hat происходит какая-то проблема ввода-вывода или проблемы с сетью. Потому что, когда модели проходят обучение, и если я использую htop
, это показывает мне, что все ядра используются и процесс запущен.
Мы будем очень признательны за любые рекомендации или помощь по приведению времени выполнения на сервере в соответствие с моим локальным. Если требуется какая-либо другая информация, пожалуйста, дайте мне знать.
ENV и PySpark Config
pandas : 0.25.1
pyspark : 2.4.3
pyarrow : 0.13.0
def create_spark_session():
conf = SparkConf() .set('spark.driver.extraClassPath', os.environ['ANALYTICS'] +
'/mysql-connector-java-8.0.17/mysql-connector-java-8.0.17.jar') \
.set('spark.executor.extraClassPath', os.environ['ANALYTICS'] +
'/mysql-connector-java-8.0.17/mysql-connector-java-8.0.17.jar')\
.setAppName("APP") \
.setMaster("local[*]") \
.set("spark.network.timeout", '3s') \
.set('spark.executor.memory', '6g') \
.set('spark.driver.memory', '6g')\
.set('spark.executor.heartbeatInterval', '2s') \
.set("spark.sql.execution.arrow.enabled", "true") \
.set('spark.default.parallelism', 32)
spark = SparkSession \
.builder \
.config(conf=conf) \
.getOrCreate()
sc = spark.sparkContext
sc.setLogLevel("DEBUG")
return spark
MacOs Config
Red Hat Config