التدريب الموزع لنماذج XGBoost باستخدام xgboost.spark

هام

هذه الميزة في المعاينة العامة.

تحتوي حزمة Python xgboost>=1.7 على وحدة نمطية xgboost.sparkجديدة . تتضمن هذه الوحدة النمطية مقدرات xgboost.spark.SparkXGBRegressorxgboost PySpark و xgboost.spark.SparkXGBClassifierو.xgboost.spark.SparkXGBRanker تدعم هذه الفئات الجديدة تضمين مقدرات XGBoost في SparkML Pipelines. للحصول على تفاصيل واجهة برمجة التطبيقات، راجع مستند واجهة برمجة تطبيقات XGBoost python spark.

المتطلبات

Databricks Runtime 12.0 ML وما فوق.

xgboost.sparkالمعلمات

تدعم المقدرات المعرفة في xgboost.spark الوحدة معظم المعلمات والوسيطات نفسها المستخدمة في XGBoost القياسي.

  • معلمات الدالة الإنشائية fit للفئة والأسلوب والأسلوب predict مطابقة إلى حد كبير لتلك الموجودة في الوحدة النمطية xgboost.sklearn .
  • التسمية والقيم والإعدادات الافتراضية متطابقة في الغالب مع تلك الموضحة في معلمات XGBoost.
  • الاستثناءات هي بعض المعلمات غير المدعومة (مثل ، ، ، )، والمعلمات pyspark المحددة للمقدر التي تمت إضافتها (مثل featuresCol، ، labelCol، use_gpu). validationIndicatorColeval_setsample_weightnthreadgpu_id للحصول على التفاصيل، راجع وثائق واجهة برمجة تطبيقات XGBoost Python Spark.

التدريب الموزع

تدعم مقدرات PySpark المحددة في الوحدة النمطية xgboost.spark تدريب XGBoost الموزع باستخدام المعلمة num_workers . لاستخدام التدريب الموزع، قم بإنشاء مصنف أو تراجع وتعيينه num_workers إلى عدد مهام Spark قيد التشغيل المتزامنة أثناء التدريب الموزع. لاستخدام جميع فتحات مهام Spark، قم بتعيين num_workers=sc.defaultParallelism.

على سبيل المثال:

from xgboost.spark import SparkXGBClassifier
classifier = SparkXGBClassifier(num_workers=sc.defaultParallelism)

إشعار

  • لا يمكنك استخدام mlflow.xgboost.autolog مع XGBoost الموزعة. لتسجيل نموذج xgboost Spark باستخدام MLflow، استخدم mlflow.spark.log_model(spark_xgb_model, artifact_path).
  • لا يمكنك استخدام XGBoost الموزعة على نظام مجموعة تم تمكين التحجيم التلقائي له. لا يمكن أن تتلقى العقد العاملة الجديدة التي تبدأ في نموذج التحجيم المرن هذا مجموعات جديدة من المهام وتظل الخامة. للحصول على إرشادات لتعطيل التحجيم التلقائي، راجع تمكين التحجيم التلقائي.

تمكين التحسين للتدريب على مجموعة بيانات الميزات المتفرقة

PySpark Estimators المحددة في xgboost.spark تحسين دعم الوحدة للتدريب على مجموعات البيانات مع ميزات متفرقة. لتمكين تحسين مجموعات الميزات المتفرقة، تحتاج إلى توفير مجموعة بيانات للأسلوب fit الذي يحتوي على عمود ميزات يتكون من قيم من النوع pyspark.ml.linalg.SparseVector وتعيين معلمة enable_sparse_data_optim المقدر إلى True. بالإضافة إلى ذلك، تحتاج إلى تعيين المعلمة missing إلى 0.0.

على سبيل المثال:

from xgboost.spark import SparkXGBClassifier
classifier = SparkXGBClassifier(enable_sparse_data_optim=True, missing=0.0)
classifier.fit(dataset_with_sparse_features_col)

تدريب وحدة معالجة الرسومات

تدعم مقدرات PySpark المحددة في xgboost.spark الوحدة التدريب على وحدات معالجة الرسومات. قم بتعيين المعلمة use_gpu إلى True لتمكين تدريب GPU.

إشعار

لكل مهمة Spark مستخدمة في التدريب الموزع XGBoost، يتم استخدام وحدة معالجة الرسومات واحدة فقط في التدريب عند تعيين الوسيطة use_gpu إلى True. توصي Databricks باستخدام القيمة الافتراضية 1 لتكوين spark.task.resource.gpu.amountنظام مجموعة Spark . وإلا، فإن وحدات معالجة الرسومات الإضافية المخصصة لمهمة Spark هذه الخامة.

على سبيل المثال:

from xgboost.spark import SparkXGBClassifier
classifier = SparkXGBClassifier(num_workers=sc.defaultParallelism, use_gpu=True)

مثال لدفتر الملاحظات

يعرض دفتر الملاحظات هذا استخدام حزمة xgboost.spark Python مع Spark MLlib.

دفتر ملاحظات PySpark-XGBoost

الحصول على دفتر الملاحظات

دليل الترحيل للوحدة النمطية المهملة sparkdl.xgboost

  • استبدل from sparkdl.xgboost import XgboostRegressor ب from xgboost.spark import SparkXGBRegressor واستبدل from sparkdl.xgboost import XgboostClassifier ب from xgboost.spark import SparkXGBClassifier.
  • تغيير كافة أسماء المعلمات في الدالة الإنشائية المقدر من نمط camelCase إلى نمط snake_case. على سبيل المثال، قم بتغيير XgboostRegressor(featuresCol=XXX) إلى SparkXGBRegressor(features_col=XXX).
  • المعلمات use_external_storage وتمت external_storage_precision إزالتها. xgboost.spark تستخدم أدوات التقدير واجهة برمجة تطبيقات تكرار بيانات DMatrix لاستخدام الذاكرة بشكل أكثر كفاءة. لم تعد هناك حاجة لاستخدام وضع التخزين الخارجي غير الفعال. بالنسبة لمجموعات البيانات الكبيرة للغاية، توصي Databricks بزيادة المعلمة num_workers ، ما يجعل كل مهمة تدريب تقسم البيانات إلى أقسام بيانات أصغر وأكثر قابلية للإدارة. ضع في اعتبارك الإعداد num_workers = sc.defaultParallelism، الذي يعين num_workers إلى العدد الإجمالي لفتحات مهام Spark في نظام المجموعة.
  • بالنسبة إلى المقدرات المحددة في xgboost.spark، ينفذ الإعداد num_workers=1 تدريب النموذج باستخدام مهمة Spark واحدة. يستخدم هذا عدد مراكز وحدة المعالجة المركزية المحددة بواسطة إعداد spark.task.cpusتكوين نظام مجموعة Spark ، وهو 1 افتراضيا. لاستخدام المزيد من الذاكرات الأساسية لوحدة المعالجة المركزية لتدريب النموذج، قم بزيادة num_workers أو spark.task.cpus. لا يمكنك تعيين المعلمة nthread أو n_jobs للمقدرات المعرفة في xgboost.spark. يختلف هذا السلوك عن السلوك السابق للمقدرات المعرفة في الحزمة المهملة sparkdl.xgboost .

تحويل sparkdl.xgboost النموذج إلى xgboost.spark نموذج

sparkdl.xgboost يتم حفظ النماذج بتنسيق مختلف عن xgboost.spark النماذج و يكون لها إعدادات معلمة مختلفة. استخدم دالة الأداة المساعدة التالية لتحويل النموذج:

def convert_sparkdl_model_to_xgboost_spark_model(
  xgboost_spark_estimator_cls,
  sparkdl_xgboost_model,
):
  """
  :param xgboost_spark_estimator_cls:
      `xgboost.spark` estimator class, e.g. `xgboost.spark.SparkXGBRegressor`
  :param sparkdl_xgboost_model:
      `sparkdl.xgboost` model instance e.g. the instance of
       `sparkdl.xgboost.XgboostRegressorModel` type.

  :return
      A `xgboost.spark` model instance
  """

  def convert_param_key(key):
    from xgboost.spark.core import _inverse_pyspark_param_alias_map
    if key == "baseMarginCol":
      return "base_margin_col"
    if key in _inverse_pyspark_param_alias_map:
      return _inverse_pyspark_param_alias_map[key]
    if key in ['use_external_storage', 'external_storage_precision', 'nthread', 'n_jobs', 'base_margin_eval_set']:
      return None
    return key

  xgboost_spark_params_dict = {}
  for param in sparkdl_xgboost_model.params:
    if param.name == "arbitraryParamsDict":
      continue
    if sparkdl_xgboost_model.isDefined(param):
      xgboost_spark_params_dict[param.name] = sparkdl_xgboost_model.getOrDefault(param)

  xgboost_spark_params_dict.update(sparkdl_xgboost_model.getOrDefault("arbitraryParamsDict"))

  xgboost_spark_params_dict = {
    convert_param_key(k): v
    for k, v in xgboost_spark_params_dict.items()
    if convert_param_key(k) is not None
  }

  booster = sparkdl_xgboost_model.get_booster()
  booster_bytes = booster.save_raw("json")
  booster_config = booster.save_config()
  estimator = xgboost_spark_estimator_cls(**xgboost_spark_params_dict)
  sklearn_model = estimator._convert_to_sklearn_model(booster_bytes, booster_config)
  return estimator._copyValues(estimator._create_pyspark_model(sklearn_model))

# Example
from xgboost.spark import SparkXGBRegressor

new_model = convert_sparkdl_model_to_xgboost_spark_model(
  xgboost_spark_estimator_cls=SparkXGBRegressor,
  sparkdl_xgboost_model=model,
)

إذا كان لديك pyspark.ml.PipelineModel نموذج يحتوي على sparkdl.xgboost نموذج كمرحلة أخيرة، يمكنك استبدال مرحلة sparkdl.xgboost النموذج بالنموذج المحول xgboost.spark .

pipeline_model.stages[-1] = convert_sparkdl_model_to_xgboost_spark_model(
  xgboost_spark_estimator_cls=SparkXGBRegressor,
  sparkdl_xgboost_model=pipeline_model.stages[-1],
)