From e090e4ec166619f10e25b70f382764207921095e Mon Sep 17 00:00:00 2001 From: liyuan Date: Mon, 21 Nov 2022 12:34:13 +0800 Subject: [PATCH 01/14] update getting started doc for python run for xgboost1.7.0 Signed-off-by: liyuan --- .../on-prem-cluster/standalone-python.md | 22 +++++++++-- .../on-prem-cluster/yarn-python.md | 37 +++++++++++++++++-- 2 files changed, 52 insertions(+), 7 deletions(-) diff --git a/docs/get-started/xgboost-examples/on-prem-cluster/standalone-python.md b/docs/get-started/xgboost-examples/on-prem-cluster/standalone-python.md index 6132a7563..544977453 100644 --- a/docs/get-started/xgboost-examples/on-prem-cluster/standalone-python.md +++ b/docs/get-started/xgboost-examples/on-prem-cluster/standalone-python.md @@ -12,11 +12,13 @@ Prerequisites * Multi-node clusters with homogenous GPU configuration * Software Requirements * Ubuntu 18.04, 20.04/CentOS7, CentOS8 - * CUDA 11.0+ + * CUDA 11.5+ * NVIDIA driver compatible with your CUDA * NCCL 2.7.8+ - * Python 3.6+ + * Python 3.8 or 3.9 * NumPy + * XGBoost 1.7.0+ + * cudf-cu11 The number of GPUs in each host dictates the number of Spark executors that can run there. Additionally, cores per Spark executor and cores per Spark task must match, such that each executor can run 1 task at any given time. @@ -47,6 +49,13 @@ And here are the steps to enable the GPU resources discovery for Spark 3.1+. spark.worker.resource.gpu.amount 1 spark.worker.resource.gpu.discoveryScript ${SPARK_HOME}/examples/src/main/scripts/getGpusResources.sh ``` +3. Install the XGBoost, cudf-cu11, numpy libraries on all nodes before running XGBoost application. + +``` bash +pip install xgboost==1.7.0 +pip install cudf-cu11 --extra-index-url=https://pypi.ngc.nvidia.com +pip install numpy +``` Get Application Files, Jar and Dataset ------------------------------- @@ -182,6 +191,10 @@ export EXAMPLE_CLASS=com.nvidia.spark.examples.mortgage.gpu_main # tree construction algorithm export TREE_METHOD=gpu_hist + +# if you enable archive python environment +export PYSPARK_DRIVER_PYTHON=python +export PYSPARK_PYTHON=./environment/bin/python ``` Run spark-submit: @@ -197,8 +210,9 @@ ${SPARK_HOME}/bin/spark-submit --driver-memory ${SPARK_DRIVER_MEMORY} \ --executor-memory ${SPARK_EXECUTOR_MEMORY} \ --conf spark.cores.max=${TOTAL_CORES} \ - --jars ${RAPIDS_JAR},${XGBOOST4J_JAR},${XGBOOST4J_SPARK_JAR} \ - --py-files ${XGBOOST4J_SPARK_JAR},${SAMPLE_ZIP} \ + --archives your_pyspark_venv.tar.gz#environment #if you enabled archive python environment \ + --jars ${RAPIDS_JAR} \ + --py-files ${SAMPLE_ZIP} \ ${MAIN_PY} \ --mainClass=${EXAMPLE_CLASS} \ --dataPath=train::${SPARK_XGBOOST_DIR}/mortgage/output/train/ \ diff --git a/docs/get-started/xgboost-examples/on-prem-cluster/yarn-python.md b/docs/get-started/xgboost-examples/on-prem-cluster/yarn-python.md index 9d92da01a..79efe3cef 100644 --- a/docs/get-started/xgboost-examples/on-prem-cluster/yarn-python.md +++ b/docs/get-started/xgboost-examples/on-prem-cluster/yarn-python.md @@ -12,12 +12,14 @@ Prerequisites * Multi-node clusters with homogenous GPU configuration * Software Requirements * Ubuntu 18.04, 20.04/CentOS7, CentOS8 - * CUDA 11.0+ + * CUDA 11.5+ * NVIDIA driver compatible with your CUDA * NCCL 2.7.8+ - * Python 3.6+ + * Python 3.8 or 3.9 * NumPy - + * XGBoost 1.7.0+ + * cudf-cu11 + The number of GPUs per NodeManager dictates the number of Spark executors that can run in that NodeManager. Additionally, cores per Spark executor and cores per Spark task must match, such that each executor can run 1 task at any given time. @@ -32,6 +34,30 @@ We use `SPARK_HOME` environment variable to point to the Apache Spark cluster. And as to how to enable GPU scheduling and isolation for Yarn, please refer to [here](https://hadoop.apache.org/docs/r3.1.0/hadoop-yarn/hadoop-yarn-site/UsingGpus.html). +Please make sure to install the XGBoost, cudf-cu11, numpy libraries on all nodes before running XGBoost application. +``` bash +pip install xgboost==1.7.0 +pip install cudf-cu11 --extra-index-url=https://pypi.ngc.nvidia.com +pip install numpy +``` +You can also create an isolated python environment by using (Virtualenv)[https://virtualenv.pypa.io/en/latest/], +and then directly pass/unpack the archive file and enable the environment on executors +by leveraging the --archives option or spark.archives configuration. +``` bash +# create an isolated python environment and install libraries +python -m venv pyspark_venv +source pyspark_venv/bin/activate +pip install xgboost==1.7.0 +pip install cudf-cu11 --extra-index-url=https://pypi.ngc.nvidia.com +pip install numpy +venv-pack -o pyspark_venv.tar.gz + +# enable archive python environment on executors +export PYSPARK_DRIVER_PYTHON=python # Do not set in cluster modes. +export PYSPARK_PYTHON=./environment/bin/python +spark-submit --archives pyspark_venv.tar.gz#environment app.py +``` + Get Application Files, Jar and Dataset ------------------------------- @@ -114,6 +140,10 @@ export EXAMPLE_CLASS=com.nvidia.spark.examples.mortgage.gpu_main # tree construction algorithm export TREE_METHOD=gpu_hist + +# if you enable archive python environment +export PYSPARK_DRIVER_PYTHON=python +export PYSPARK_PYTHON=./environment/bin/python ``` Run spark-submit: @@ -129,6 +159,7 @@ ${SPARK_HOME}/bin/spark-submit --files ${SPARK_HOME}/examples/src/main/scripts/getGpusResources.sh \ --master yarn \ --deploy-mode ${SPARK_DEPLOY_MODE} \ + --archives your_pyspark_venv.tar.gz#environment #if you enabled archive python environment \ --num-executors ${SPARK_NUM_EXECUTORS} \ --driver-memory ${SPARK_DRIVER_MEMORY} \ --executor-memory ${SPARK_EXECUTOR_MEMORY} \ From cc0891943feea6a22ecfe80c60bc7963eda67d91 Mon Sep 17 00:00:00 2001 From: liyuan Date: Mon, 21 Nov 2022 13:36:32 +0800 Subject: [PATCH 02/14] do the same changes for cpu xgboost1.7.0 Signed-off-by: liyuan --- .../on-prem-cluster/standalone-python.md | 4 ++-- .../xgboost-examples/on-prem-cluster/yarn-python.md | 13 +++++++++---- 2 files changed, 11 insertions(+), 6 deletions(-) diff --git a/docs/get-started/xgboost-examples/on-prem-cluster/standalone-python.md b/docs/get-started/xgboost-examples/on-prem-cluster/standalone-python.md index 544977453..920567dfe 100644 --- a/docs/get-started/xgboost-examples/on-prem-cluster/standalone-python.md +++ b/docs/get-started/xgboost-examples/on-prem-cluster/standalone-python.md @@ -285,8 +285,8 @@ ${SPARK_HOME}/bin/spark-submit --driver-memory ${SPARK_DRIVER_MEMORY} \ --executor-memory ${SPARK_EXECUTOR_MEMORY} \ --conf spark.cores.max=${TOTAL_CORES} \ - --jars ${XGBOOST4J_JAR},${XGBOOST4J_SPARK_JAR} \ - --py-files ${XGBOOST4J_SPARK_JAR},${SAMPLE_ZIP} \ + --jars ${RAPIDS_JAR} \ + --py-files ${SAMPLE_ZIP} \ ${SPARK_PYTHON_ENTRYPOINT} \ --mainClass=${EXAMPLE_CLASS} \ --dataPath=train::${DATA_PATH}/mortgage/output/train/ \ diff --git a/docs/get-started/xgboost-examples/on-prem-cluster/yarn-python.md b/docs/get-started/xgboost-examples/on-prem-cluster/yarn-python.md index 79efe3cef..5cf23ffc1 100644 --- a/docs/get-started/xgboost-examples/on-prem-cluster/yarn-python.md +++ b/docs/get-started/xgboost-examples/on-prem-cluster/yarn-python.md @@ -163,8 +163,8 @@ ${SPARK_HOME}/bin/spark-submit --num-executors ${SPARK_NUM_EXECUTORS} \ --driver-memory ${SPARK_DRIVER_MEMORY} \ --executor-memory ${SPARK_EXECUTOR_MEMORY} \ - --jars ${RAPIDS_JAR},${XGBOOST4J_JAR} \ - --py-files ${XGBOOST4J_SPARK_JAR},${SAMPLE_ZIP} \ + --jars ${RAPIDS_JAR} \ + --py-files ${SAMPLE_ZIP} \ ${MAIN_PY} \ --mainClass=${EXAMPLE_CLASS} \ --dataPath=train::${DATA_PATH}/mortgage/out/train/ \ @@ -221,6 +221,10 @@ export EXAMPLE_CLASS=com.nvidia.spark.examples.mortgage.cpu_main # tree construction algorithm export TREE_METHOD=hist + +# if you enable archive python environment +export PYSPARK_DRIVER_PYTHON=python +export PYSPARK_PYTHON=./environment/bin/python ``` This is the same command as for the GPU example, repeated for convenience: @@ -228,12 +232,13 @@ This is the same command as for the GPU example, repeated for convenience: ``` bash ${SPARK_HOME}/bin/spark-submit \ --master yarn \ + --archives your_pyspark_venv.tar.gz#environment #if you enabled archive python environment \ --deploy-mode ${SPARK_DEPLOY_MODE} \ --num-executors ${SPARK_NUM_EXECUTORS} \ --driver-memory ${SPARK_DRIVER_MEMORY} \ --executor-memory ${SPARK_EXECUTOR_MEMORY} \ - --jars ${XGBOOST4J_JAR},${XGBOOST4J_SPARK_JAR} \ - --py-files ${XGBOOST4J_SPARK_JAR},${SAMPLE_ZIP} \ + --jars ${RAPIDS_JAR} \ + --py-files ${SAMPLE_ZIP} \ ${MAIN_PY} \ --mainClass=${EXAMPLE_CLASS} \ --dataPath=train::${DATA_PATH}/mortgage/output/train/ \ From 32aa708b1976e771d7d40b34dde5c9609c984f12 Mon Sep 17 00:00:00 2001 From: liyuan Date: Mon, 21 Nov 2022 16:17:07 +0800 Subject: [PATCH 03/14] update outofdate ec2 doc Signed-off-by: liyuan --- docs/get-started/xgboost-examples/csp/aws/ec2.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/get-started/xgboost-examples/csp/aws/ec2.md b/docs/get-started/xgboost-examples/csp/aws/ec2.md index b64fa7a77..0565ce601 100644 --- a/docs/get-started/xgboost-examples/csp/aws/ec2.md +++ b/docs/get-started/xgboost-examples/csp/aws/ec2.md @@ -177,8 +177,8 @@ spark-submit --master spark://$HOSTNAME:7077 \ ${SAMPLE_JAR} \ -num_workers=${NUM_EXECUTORS} \ -format=csv \ - -dataPath="train::s3a://spark-xgboost-mortgage-dataset/csv/train/2000Q1" \ - -dataPath="trans::s3a://spark-xgboost-mortgage-dataset/csv/eval/2000Q1" \ + -dataPath="train::your-train-data-path" \ + -dataPath="trans::your-eval-data-path" \ -numRound=100 -max_depth=8 -nthread=$NUM_EXECUTOR_CORES -showFeatures=0 \ -tree_method=gpu_hist ``` From 19057a6b6245a628b7691f97f9c3e45880418848 Mon Sep 17 00:00:00 2001 From: liyuan Date: Thu, 24 Nov 2022 11:08:45 +0800 Subject: [PATCH 04/14] update document for pyspark xgboost cpu runs Signed-off-by: liyuan --- .../xgboost-examples/on-prem-cluster/standalone-python.md | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/docs/get-started/xgboost-examples/on-prem-cluster/standalone-python.md b/docs/get-started/xgboost-examples/on-prem-cluster/standalone-python.md index 920567dfe..b10f16d19 100644 --- a/docs/get-started/xgboost-examples/on-prem-cluster/standalone-python.md +++ b/docs/get-started/xgboost-examples/on-prem-cluster/standalone-python.md @@ -275,6 +275,10 @@ export EXAMPLE_CLASS=com.nvidia.spark.examples.mortgage.cpu_main # tree construction algorithm export TREE_METHOD=hist + +# if you enable archive python environment +export PYSPARK_DRIVER_PYTHON=python +export PYSPARK_PYTHON=./environment/bin/python ``` This is the same command as for the GPU example, repeated for convenience: @@ -285,6 +289,7 @@ ${SPARK_HOME}/bin/spark-submit --driver-memory ${SPARK_DRIVER_MEMORY} \ --executor-memory ${SPARK_EXECUTOR_MEMORY} \ --conf spark.cores.max=${TOTAL_CORES} \ + --archives your_pyspark_venv.tar.gz#environment #if you enabled archive python environment \ --jars ${RAPIDS_JAR} \ --py-files ${SAMPLE_ZIP} \ ${SPARK_PYTHON_ENTRYPOINT} \ From 01ea8a71318f1f1c96bad4cff079b70abc4556a9 Mon Sep 17 00:00:00 2001 From: liyuan Date: Thu, 24 Nov 2022 17:43:41 +0800 Subject: [PATCH 05/14] update mortgage gpu/end2end/crossvalidation notebooks Signed-off-by: liyuan --- .../python/MortgageETL+XGBoost.ipynb | 40 +- .../notebooks/python/mortgage-gpu.ipynb | 396 ++++++++++++++---- 2 files changed, 345 insertions(+), 91 deletions(-) diff --git a/examples/XGBoost-Examples/mortgage/notebooks/python/MortgageETL+XGBoost.ipynb b/examples/XGBoost-Examples/mortgage/notebooks/python/MortgageETL+XGBoost.ipynb index 56463f90a..d46adb3a3 100644 --- a/examples/XGBoost-Examples/mortgage/notebooks/python/MortgageETL+XGBoost.ipynb +++ b/examples/XGBoost-Examples/mortgage/notebooks/python/MortgageETL+XGBoost.ipynb @@ -10,16 +10,13 @@ "\n", "# ETL + XGBoost train & transform\n", "\n", - "This notebook is an end-to-end example of ETL + XGBoost Train & Transform by using [Spark-Rapids](https://github.com/NVIDIA/spark-rapids) and [XGBoost](https://github.com/nvidia/spark-xgboost) with GPU accelerated.\n", + "This notebook is an end-to-end example of ETL + XGBoost Train & Transform by using [Spark-Rapids](https://github.com/NVIDIA/spark-rapids) and [XGBoost](https://github.com/dmlc/xgboost) with GPU accelerated.\n", "
The main steps:\n", "1. Run ETL to generate 2 datasets for train and test
\n", " You can choose to save the datasets or not by setting \"is_save_dataset\" to True or False.
\n", " It means you don't need to save the dataset to disk after ETL and directly feed the dataframe to XGBoost train or transform.\n", "2. Run XGBoost train with the train dataset\n", - "3. Run XGBoost transform with the test dataset\n", - "\n", - "Note: For PySpark based XGBoost, please refer to the [Spark-RAPIDS-examples 22.04 branch](https://github.com/NVIDIA/spark-rapids-examples/tree/branch-22.04) that\n", - "uses [NVIDIA’s Spark XGBoost version](https://repo1.maven.org/maven2/com/nvidia/xgboost4j-spark_3.0/1.4.2-0.3.0/)." + "3. Run XGBoost transform with the test dataset" ] }, { @@ -54,8 +51,7 @@ "source": [ "# The input path of dataset\n", "dataRoot = os.getenv(\"DATA_ROOT\", \"/data\")\n", - "orig_raw_path = dataRoot + \"/mortgage/input/\"\n", - "orig_raw_path_csv2parquet = dataRoot + \"/mortgage/output/csv2parquet/\"" + "orig_raw_path = dataRoot + \"/mortgage/input/\"orig_raw_path_csv2parquet = dataRoot + \"/mortgage/output/csv2parquet/\"" ] }, { @@ -737,9 +733,7 @@ "spark.conf.set(\"spark.rapids.sql.explain\", \"ALL\")\n", "spark.conf.set(\"spark.rapids.sql.batchSizeBytes\", \"512M\")\n", "spark.conf.set(\"spark.rapids.sql.reader.batchSizeBytes\", \"768M\")\n", - "spark.conf.set(\"spark.rapids.sql.hasNans\", \"false\")\n", - "# use GPU to read CSV\n", - "spark.conf.set(\"spark.rapids.sql.csv.read.double.enabled\", \"true\")" + "spark.conf.set(\"spark.rapids.sql.hasNans\", \"false\")" ] }, { @@ -805,7 +799,7 @@ "metadata": {}, "outputs": [], "source": [ - "from ml.dmlc.xgboost4j.scala.spark import XGBoostClassificationModel, XGBoostClassifier\n", + "from xgboost.spark import SparkXGBClassifier, SparkXGBClassifierModel\n", "from pyspark.ml.evaluation import MulticlassClassificationEvaluator" ] }, @@ -896,13 +890,15 @@ "# This sample uses 2 workers(GPUs) to run XGBoost training \n", "params = { \n", " \"treeMethod\": \"gpu_hist\",\n", - " \"objective\":\"binary:logistic\",\n", " \"growPolicy\": \"depthwise\",\n", - " \"nthread\": 1,\n", " \"numRound\": 100,\n", - " \"numWorkers\": 1,\n", + " \"numWorkers\": 2,\n", + " \"use_gpu\": \"true\",\n", "}\n", - "classifier = XGBoostClassifier(**params).setLabelCol(label).setFeaturesCols(features)" + "params['features_col'] = features\n", + "params['label_col'] = label\n", + " \n", + "classifier = SparkXGBClassifier(**params)" ] }, { @@ -934,8 +930,16 @@ "metadata": {}, "outputs": [], "source": [ - "model.write().overwrite().save(output_path_model)\n", - "loaded_model = XGBoostClassificationModel().load(output_path_model)" + "model.write().overwrite().save(output_path_model)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "loaded_model = SparkXGBClassifierModel().load(output_path_model)" ] }, { @@ -1018,7 +1022,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.8.2" + "version": "3.8.13" }, "name": "gpu-mortgage", "notebookId": 4440374682851873 diff --git a/examples/XGBoost-Examples/mortgage/notebooks/python/mortgage-gpu.ipynb b/examples/XGBoost-Examples/mortgage/notebooks/python/mortgage-gpu.ipynb index e2c64c15e..7bd27e73e 100644 --- a/examples/XGBoost-Examples/mortgage/notebooks/python/mortgage-gpu.ipynb +++ b/examples/XGBoost-Examples/mortgage/notebooks/python/mortgage-gpu.ipynb @@ -9,16 +9,12 @@ "The goal of this notebook is to show how to train a XGBoost Model with Spark RAPIDS XGBoost library on GPUs. The dataset used with this notebook is derived from Fannie Mae’s Single-Family Loan Performance Data with all rights reserved by Fannie Mae. This processed dataset is redistributed with permission and consent from Fannie Mae. This notebook uses XGBoost to train 12-month mortgage loan delinquency prediction model .\n", "\n", "A few libraries required for this notebook:\n", - " 1. NumPy\n", - " 2. cudf jar\n", - " 3. xgboost4j jar\n", - " 4. xgboost4j-spark jar\n", - " 5. rapids-4-spark.jar\n", + " 1. cudf-cu11\n", + " 2. xgboost\n", + " 3. scikit-learn\n", + " 4. numpy\n", "\n", - "This notebook also illustrates the ease of porting a sample CPU based Spark xgboost4j code into GPU. There is only one change required for running Spark XGBoost on GPU. That is replacing the API `setFeaturesCol(feature)` on CPU with the new API `setFeaturesCols(features)`. This also eliminates the need for vectorization (assembling multiple feature columns in to one column) since we can read multiple columns.\n", - "\n", - "Note: For PySpark based XGBoost, please refer to the [Spark-RAPIDS-examples 22.04 branch](https://github.com/NVIDIA/spark-rapids-examples/tree/branch-22.04) that\n", - "uses [NVIDIA’s Spark XGBoost version](https://repo1.maven.org/maven2/com/nvidia/xgboost4j-spark_3.0/1.4.2-0.3.0/)." + "This notebook also illustrates the ease of porting a sample CPU based Spark xgboost4j code into GPU. There is no change required for running Spark XGBoost on GPU because both CPU and GPU call the same API. For CPU run, we need to vectorize the trained dataset before fitting data to classifier." ] }, { @@ -34,12 +30,24 @@ "metadata": {}, "outputs": [], "source": [ - "from ml.dmlc.xgboost4j.scala.spark import XGBoostClassificationModel, XGBoostClassifier\n", + "import os\n", + "\n", + "# if you pass/unpack the archive file and enable the environment\n", + "# os.environ['PYSPARK_PYTHON'] = \"./environment/bin/python\"" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "metadata": {}, + "outputs": [], + "source": [ + "from xgboost.spark import SparkXGBClassifier, SparkXGBClassifierModel\n", "from pyspark.ml.evaluation import MulticlassClassificationEvaluator\n", "from pyspark.sql import SparkSession\n", "from pyspark.sql.types import FloatType, IntegerType, StructField, StructType, DoubleType\n", - "from time import time\n", - "import os" + "from pyspark.conf import SparkConf\n", + "from time import time" ] }, { @@ -62,11 +70,66 @@ }, { "cell_type": "code", - "execution_count": 2, + "execution_count": 3, "metadata": {}, - "outputs": [], + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "Setting default log level to \"WARN\".\n", + "To adjust logging level use sc.setLogLevel(newLevel). For SparkR, use setLogLevel(newLevel).\n", + "22/11/24 06:14:05 WARN org.apache.spark.resource.ResourceUtils: The configuration of cores (exec = 4 task = 1, runnable tasks = 4) will result in wasted resources due to resource gpu limiting the number of runnable tasks per executor to: 1. Please adjust your configuration.\n", + "22/11/24 06:14:06 INFO org.apache.spark.SparkEnv: Registering MapOutputTracker\n", + "22/11/24 06:14:06 INFO org.apache.spark.SparkEnv: Registering BlockManagerMaster\n", + "22/11/24 06:14:06 INFO org.apache.spark.SparkEnv: Registering BlockManagerMasterHeartbeat\n", + "22/11/24 06:14:06 INFO org.apache.spark.SparkEnv: Registering OutputCommitCoordinator\n", + "22/11/24 06:14:07 WARN com.nvidia.spark.rapids.RapidsPluginUtils: RAPIDS Accelerator 22.08.0 using cudf 22.08.0.\n", + "22/11/24 06:14:07 WARN com.nvidia.spark.rapids.RapidsPluginUtils: spark.rapids.sql.multiThreadedRead.numThreads is set to 20.\n", + "22/11/24 06:14:07 WARN com.nvidia.spark.rapids.RapidsPluginUtils: RAPIDS Accelerator is enabled, to disable GPU support set `spark.rapids.sql.enabled` to false.\n", + "22/11/24 06:14:07 WARN com.nvidia.spark.rapids.RapidsPluginUtils: spark.rapids.sql.explain is set to `NOT_ON_GPU`. Set it to 'NONE' to suppress the diagnostics logging about the query placement on the GPU.\n" + ] + } + ], "source": [ - "spark = SparkSession.builder.getOrCreate()\n", + "SPARK_MASTER_URL = os.getenv(\"SPARK_MASTER_URL\", \"/your-url\")\n", + "RAPIDS_JAR = os.getenv(\"RAPIDS_JAR\", \"/your-jar-path\")\n", + "\n", + "# You need to update with your real hardware resource \n", + "driverMem = os.getenv(\"DRIVER_MEM\", \"10g\")\n", + "executorMem = os.getenv(\"EXECUTOR_MEM\", \"10g\")\n", + "pinnedPoolSize = os.getenv(\"PINNED_POOL_SIZE\", \"2g\")\n", + "concurrentGpuTasks = os.getenv(\"CONCURRENT_GPU_TASKS\", \"2\")\n", + "executorCores = int(os.getenv(\"EXECUTOR_CORES\", \"4\"))\n", + "\n", + "# Common spark settings\n", + "conf = SparkConf()\n", + "conf.setMaster(SPARK_MASTER_URL)\n", + "conf.setAppName(\"Microbenchmark on GPU\")\n", + "conf.set(\"spark.driver.memory\", driverMem)\n", + "## The tasks will run on GPU memory, so there is no need to set a high host memory\n", + "conf.set(\"spark.executor.memory\", executorMem)\n", + "## The tasks will run on GPU cores, so there is no need to use many cpu cores\n", + "conf.set(\"spark.executor.cores\", executorCores)\n", + "\n", + "# Plugin settings\n", + "conf.set(\"spark.executor.resource.gpu.amount\", \"1\")\n", + "conf.set(\"spark.rapids.sql.concurrentGpuTasks\", concurrentGpuTasks)\n", + "conf.set(\"spark.rapids.memory.pinnedPool.size\", pinnedPoolSize)\n", + "##############note: only support value=1 see https://github.com/dmlc/xgboost/blame/master/python-package/xgboost/spark/core.py#L370-L374\n", + "conf.set(\"spark.task.resource.gpu.amount\", 1) \n", + "conf.set(\"spark.rapids.sql.enabled\", \"true\") \n", + "conf.set(\"spark.plugins\", \"com.nvidia.spark.SQLPlugin\")\n", + "conf.set(\"spark.sql.cache.serializer\",\"com.nvidia.spark.ParquetCachedBatchSerializer\")\n", + "conf.set(\"spark.driver.extraClassPath\", RAPIDS_JAR)\n", + "conf.set(\"spark.executor.extraClassPath\", RAPIDS_JAR)\n", + "conf.set(\"spark.jars\", RAPIDS_JAR)\n", + "\n", + "# if you pass/unpack the archive file and enable the environment\n", + "# conf.set(\"spark.yarn.dist.archives\", \"your_pyspark_venv.tar.gz#environment\")\n", + "\n", + "# Create spark session\n", + "spark = SparkSession.builder.config(conf=conf).getOrCreate()\n", "reader = spark.read" ] }, @@ -79,7 +142,7 @@ }, { "cell_type": "code", - "execution_count": 3, + "execution_count": 4, "metadata": {}, "outputs": [], "source": [ @@ -117,12 +180,19 @@ "features = [ x.name for x in schema if x.name != label ]\n", "\n", "# You need to update them to your real paths!\n", - "dataRoot = os.getenv(\"DATA_ROOT\", \"/data\")\n", - "train_path = dataRoot + \"/mortgage/output/train\"\n", - "eval_path = dataRoot + \"/mortgage/output/eval\"\n", + "dataRoot = os.getenv(\"DATA_ROOT\", \"/your-path\")\n", + "train_path = dataRoot + \"/your-path\"\n", + "eval_path = dataRoot + \"/your-path\"\n", "\n", - "train_data = reader.parquet(train_path)\n", - "trans_data = reader.parquet(eval_path)" + "data_format = 'csv'\n", + "has_header = 'true'\n", + "if data_format == 'csv':\n", + " train_data = reader.schema(schema).option('header',has_header).csv(train_path)\n", + " trans_data = reader.schema(schema).option('header',has_header).csv(eval_path)\n", + "else :\n", + " train_data = reader.load(train_path)\n", + " trans_data = reader.load(eval_path)\n", + " " ] }, { @@ -154,40 +224,28 @@ }, { "cell_type": "code", - "execution_count": 4, + "execution_count": 5, "metadata": {}, "outputs": [], "source": [ "params = { \n", - " 'eta': 0.1,\n", - " 'gamma': 0.1,\n", - " 'missing': 0.0,\n", - " 'treeMethod': 'gpu_hist',\n", - " 'maxDepth': 10, \n", - " 'maxLeaves': 256,\n", - " 'objective':'binary:logistic',\n", - " 'growPolicy': 'depthwise',\n", - " 'minChildWeight': 30.0,\n", - " 'lambda_': 1.0,\n", - " 'scalePosWeight': 2.0,\n", - " 'subsample': 1.0,\n", - " 'nthread': 1,\n", - " 'numRound': 100,\n", - " 'numWorkers': 1,\n", + " \"treeMethod\": \"gpu_hist\",\n", + " \"growPolicy\": \"depthwise\",\n", + " \"numRound\": 100,\n", + " \"numWorkers\": 2,\n", + " \"use_gpu\": \"true\",\n", "}\n", - "classifier = XGBoostClassifier(**params).setLabelCol(label).setFeaturesCols(features)" + "params['features_col'] = features\n", + "params['label_col'] = label\n", + " \n", + "classifier = SparkXGBClassifier(**params)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ - "The CPU version classifier provides the API `setFeaturesCol` which only accepts a single column name, so vectorization for multiple feature columns is required.\n", - "```Python\n", - "classifier = XGBoostClassifier(**params).setLabelCol(label).setFeaturesCol('features')\n", - "```\n", - "\n", - "The parameter `num_workers` should be set to the number of GPUs in Spark cluster for GPU version, while for CPU version it is usually equal to the number of the CPU cores.\n", + "The parameter `numWorkers` should be set to the number of GPUs in Spark cluster for GPU version, while for CPU version it is usually equal to the number of the CPU cores.\n", "\n", "Concerning the tree method, GPU version only supports `gpu_hist` currently, while `hist` is designed and used here for CPU training." ] @@ -201,14 +259,42 @@ }, { "cell_type": "code", - "execution_count": 5, + "execution_count": 6, "metadata": {}, "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "If features_cols param set, then features_col param is ignored.\n", + "22/11/24 06:14:44 WARN org.apache.spark.sql.catalyst.util.package: Truncated the string representation of a plan since it was too large. This behavior can be adjusted by setting 'spark.sql.debug.maxToStringFields'.\n", + "[Stage 12:> (0 + 1) / 1]\r" + ] + }, { "name": "stdout", "output_type": "stream", "text": [ - "Training takes 25.67 seconds\n" + "[06:15:10] WARNING: ../src/learner.cc:553: \n", + " If you are loading a serialized model (like pickle in Python, RDS in R) generated by\n", + " older XGBoost, please export the model by calling `Booster.save_model` from that version\n", + " first, then load it back in current version. See:\n", + "\n", + " https://xgboost.readthedocs.io/en/latest/tutorials/saving_model.html\n", + "\n", + " for more details about differences between saving model and serializing.\n", + "\n", + "Training takes 28.6 seconds\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "\r", + " \r", + "/home/yuali_nvidia_com/.local/lib/python3.8/site-packages/xgboost/sklearn.py:808: UserWarning: Loading a native XGBoost model with Scikit-Learn interface.\n", + " warnings.warn(\"Loading a native XGBoost model with Scikit-Learn interface.\")\n" ] } ], @@ -231,12 +317,29 @@ }, { "cell_type": "code", - "execution_count": 6, + "execution_count": 7, + "metadata": {}, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "If features_cols param set, then features_col param is ignored.\n", + " \r" + ] + } + ], + "source": [ + "model.write().overwrite().save(dataRoot + '/your-path')" + ] + }, + { + "cell_type": "code", + "execution_count": 8, "metadata": {}, "outputs": [], "source": [ - "model.write().overwrite().save(dataRoot + '/mortgage/model')\n", - "loaded_model = XGBoostClassificationModel().load(dataRoot + '/mortgage/model')" + "loaded_model = SparkXGBClassifierModel().load(dataRoot + '/mortgage/model')" ] }, { @@ -248,22 +351,126 @@ }, { "cell_type": "code", - "execution_count": 7, + "execution_count": 9, "metadata": {}, "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "22/11/24 06:15:13 WARN com.nvidia.spark.rapids.GpuOverrides: \n", + "!Exec cannot run on GPU because not all expressions can be replaced; unsupported data types in output: org.apache.spark.ml.linalg.VectorUDT@3bfc3ba7 [rawPrediction#209, probability#275]\n", + " @Expression orig_channel#56 could run on GPU\n", + " @Expression first_home_buyer#57 could run on GPU\n", + " @Expression loan_purpose#58 could run on GPU\n", + " @Expression property_type#59 could run on GPU\n", + " @Expression occupancy_status#60 could run on GPU\n", + " @Expression property_state#61 could run on GPU\n", + " @Expression product_type#62 could run on GPU\n", + " @Expression relocation_mortgage_indicator#63 could run on GPU\n", + " @Expression seller_name#64 could run on GPU\n", + " @Expression mod_flag#65 could run on GPU\n", + " @Expression orig_interest_rate#66 could run on GPU\n", + " @Expression orig_upb#67 could run on GPU\n", + " @Expression orig_loan_term#68 could run on GPU\n", + " @Expression orig_ltv#69 could run on GPU\n", + " @Expression orig_cltv#70 could run on GPU\n", + " @Expression num_borrowers#71 could run on GPU\n", + " @Expression dti#72 could run on GPU\n", + " @Expression borrower_credit_score#73 could run on GPU\n", + " @Expression num_units#74 could run on GPU\n", + " @Expression zip#75 could run on GPU\n", + " @Expression mortgage_insurance_percent#76 could run on GPU\n", + " @Expression current_loan_delinquency_status#77 could run on GPU\n", + " @Expression current_actual_upb#78 could run on GPU\n", + " @Expression interest_rate#79 could run on GPU\n", + " @Expression loan_age#80 could run on GPU\n", + " @Expression msa#81 could run on GPU\n", + " @Expression non_interest_bearing_upb#82 could run on GPU\n", + " @Expression delinquency_12#83 could run on GPU\n", + " !Expression UDF(pythonUDF0#342.rawPrediction) AS rawPrediction#209 cannot run on GPU because input expression ScalaUDF UDF(pythonUDF0#342.rawPrediction) (org.apache.spark.ml.linalg.VectorUDT@3bfc3ba7 is not supported); expression Alias UDF(pythonUDF0#342.rawPrediction) AS rawPrediction#209 produces an unsupported type org.apache.spark.ml.linalg.VectorUDT@3bfc3ba7\n", + " !Expression UDF(pythonUDF0#342.rawPrediction) cannot run on GPU because expression ScalaUDF UDF(pythonUDF0#342.rawPrediction) produces an unsupported type org.apache.spark.ml.linalg.VectorUDT@3bfc3ba7; neither UDF implemented by class org.apache.spark.ml.functions$$$Lambda$3898/645590696 provides a GPU implementation, nor the conf `spark.rapids.sql.rowBasedUDF.enabled` is enabled\n", + " @Expression pythonUDF0#342.rawPrediction could run on GPU\n", + " @Expression pythonUDF0#342 could run on GPU\n", + " @Expression pythonUDF0#342.prediction AS prediction#243 could run on GPU\n", + " @Expression pythonUDF0#342.prediction could run on GPU\n", + " @Expression pythonUDF0#342 could run on GPU\n", + " !Expression UDF(pythonUDF0#342.probability) AS probability#275 cannot run on GPU because input expression ScalaUDF UDF(pythonUDF0#342.probability) (org.apache.spark.ml.linalg.VectorUDT@3bfc3ba7 is not supported); expression Alias UDF(pythonUDF0#342.probability) AS probability#275 produces an unsupported type org.apache.spark.ml.linalg.VectorUDT@3bfc3ba7\n", + " !Expression UDF(pythonUDF0#342.probability) cannot run on GPU because neither UDF implemented by class org.apache.spark.ml.functions$$$Lambda$3898/645590696 provides a GPU implementation, nor the conf `spark.rapids.sql.rowBasedUDF.enabled` is enabled; expression ScalaUDF UDF(pythonUDF0#342.probability) produces an unsupported type org.apache.spark.ml.linalg.VectorUDT@3bfc3ba7\n", + " @Expression pythonUDF0#342.probability could run on GPU\n", + " @Expression pythonUDF0#342 could run on GPU\n", + "\n", + "22/11/24 06:15:13 WARN com.nvidia.spark.rapids.GpuOverrides: \n", + "!Exec cannot run on GPU because unsupported data types in output: org.apache.spark.ml.linalg.VectorUDT@3bfc3ba7 [rawPrediction, probability]; not all expressions can be replaced; unsupported data types in output: org.apache.spark.ml.linalg.VectorUDT@3bfc3ba7 [rawPrediction#209, probability#275]\n", + " @Expression orig_channel#56 could run on GPU\n", + " @Expression first_home_buyer#57 could run on GPU\n", + " @Expression loan_purpose#58 could run on GPU\n", + " @Expression property_type#59 could run on GPU\n", + " @Expression occupancy_status#60 could run on GPU\n", + " @Expression property_state#61 could run on GPU\n", + " @Expression product_type#62 could run on GPU\n", + " @Expression relocation_mortgage_indicator#63 could run on GPU\n", + " @Expression seller_name#64 could run on GPU\n", + " @Expression mod_flag#65 could run on GPU\n", + " @Expression orig_interest_rate#66 could run on GPU\n", + " @Expression orig_upb#67 could run on GPU\n", + " @Expression orig_loan_term#68 could run on GPU\n", + " @Expression orig_ltv#69 could run on GPU\n", + " @Expression orig_cltv#70 could run on GPU\n", + " @Expression num_borrowers#71 could run on GPU\n", + " @Expression dti#72 could run on GPU\n", + " @Expression borrower_credit_score#73 could run on GPU\n", + " @Expression num_units#74 could run on GPU\n", + " @Expression zip#75 could run on GPU\n", + " @Expression mortgage_insurance_percent#76 could run on GPU\n", + " @Expression current_loan_delinquency_status#77 could run on GPU\n", + " @Expression current_actual_upb#78 could run on GPU\n", + " @Expression interest_rate#79 could run on GPU\n", + " @Expression loan_age#80 could run on GPU\n", + " @Expression msa#81 could run on GPU\n", + " @Expression non_interest_bearing_upb#82 could run on GPU\n", + " @Expression delinquency_12#83 could run on GPU\n", + " !Expression rawPrediction#209 cannot run on GPU because expression AttributeReference rawPrediction#209 produces an unsupported type org.apache.spark.ml.linalg.VectorUDT@3bfc3ba7\n", + " @Expression prediction#243 could run on GPU\n", + " !Expression probability#275 cannot run on GPU because expression AttributeReference probability#275 produces an unsupported type org.apache.spark.ml.linalg.VectorUDT@3bfc3ba7\n", + "\n", + "22/11/24 06:15:28 WARN com.nvidia.spark.rapids.GpuOverrides: \n", + "!Exec cannot run on GPU because the Exec CollectLimitExec has been disabled, and is disabled by default because Collect Limit replacement can be slower on the GPU, if huge number of rows in a batch it could help by limiting the number of rows transferred from GPU to CPU. Set spark.rapids.sql.exec.CollectLimitExec to true if you wish to enable it\n", + " @Partitioning could run on GPU\n", + " !Exec cannot run on GPU because not all expressions can be replaced; unsupported data types in input: org.apache.spark.ml.linalg.VectorUDT@3bfc3ba7 [probability#275, rawPrediction#209]\n", + " @Expression cast(delinquency_12#83 as string) AS delinquency_12#971 could run on GPU\n", + " @Expression cast(delinquency_12#83 as string) could run on GPU\n", + " @Expression delinquency_12#83 could run on GPU\n", + " @Expression cast(rawPrediction#209 as string) AS rawPrediction#972 could run on GPU\n", + " !Expression cast(rawPrediction#209 as string) cannot run on GPU because Cast from org.apache.spark.ml.linalg.VectorUDT@3bfc3ba7 to StringType is not supported\n", + " !Expression rawPrediction#209 cannot run on GPU because expression AttributeReference rawPrediction#209 produces an unsupported type org.apache.spark.ml.linalg.VectorUDT@3bfc3ba7\n", + " @Expression cast(probability#275 as string) AS probability#973 could run on GPU\n", + " !Expression cast(probability#275 as string) cannot run on GPU because Cast from org.apache.spark.ml.linalg.VectorUDT@3bfc3ba7 to StringType is not supported\n", + " !Expression probability#275 cannot run on GPU because expression AttributeReference probability#275 produces an unsupported type org.apache.spark.ml.linalg.VectorUDT@3bfc3ba7\n", + " @Expression cast(prediction#243 as string) AS prediction#974 could run on GPU\n", + " @Expression cast(prediction#243 as string) could run on GPU\n", + " @Expression prediction#243 could run on GPU\n", + " !Exec cannot run on GPU because unsupported data types in output: org.apache.spark.ml.linalg.VectorUDT@3bfc3ba7 [rawPrediction, probability]; unsupported data types in output: org.apache.spark.ml.linalg.VectorUDT@3bfc3ba7 [probability#275, rawPrediction#209]; not all expressions can be replaced\n", + " @Expression delinquency_12#83 could run on GPU\n", + " @Expression prediction#243 could run on GPU\n", + " !Expression probability#275 cannot run on GPU because expression AttributeReference probability#275 produces an unsupported type org.apache.spark.ml.linalg.VectorUDT@3bfc3ba7\n", + " !Expression rawPrediction#209 cannot run on GPU because expression AttributeReference rawPrediction#209 produces an unsupported type org.apache.spark.ml.linalg.VectorUDT@3bfc3ba7\n", + "\n" + ] + }, { "name": "stdout", "output_type": "stream", "text": [ - "Transformation takes 11.39 seconds\n", + "Transformation takes 15.62 seconds\n", "+--------------+--------------------+--------------------+----------+\n", "|delinquency_12| rawPrediction| probability|prediction|\n", "+--------------+--------------------+--------------------+----------+\n", - "| 0|[7.76566505432128...|[0.99957613222068...| 0.0|\n", - "| 0|[4.50240230560302...|[0.98903913144022...| 0.0|\n", - "| 0|[4.50240230560302...|[0.98903913144022...| 0.0|\n", - "| 0|[4.50240230560302...|[0.98903913144022...| 0.0|\n", - "| 0|[4.50240230560302...|[0.98903913144022...| 0.0|\n", + "| 0|[8.84631538391113...|[0.99985611438751...| 0.0|\n", + "| 0|[9.41864871978759...|[0.99991881847381...| 0.0|\n", + "| 0|[9.41864871978759...|[0.99991881847381...| 0.0|\n", + "| 0|[9.41864871978759...|[0.99991881847381...| 0.0|\n", + "| 0|[8.84631538391113...|[0.99985611438751...| 0.0|\n", "+--------------+--------------------+--------------------+----------+\n", "only showing top 5 rows\n", "\n" @@ -288,40 +495,83 @@ }, { "cell_type": "code", - "execution_count": 8, + "execution_count": 10, + "metadata": {}, + "outputs": [], + "source": [ + "def check_classification_accuracy(data_frame, label):\n", + " accuracy = (MulticlassClassificationEvaluator()\n", + " .setLabelCol(label)\n", + " .evaluate(data_frame))\n", + " print('-' * 100)\n", + " print('Accuracy is ' + str(accuracy))" + ] + }, + { + "cell_type": "code", + "execution_count": 11, "metadata": {}, "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "22/11/24 06:15:28 WARN com.nvidia.spark.rapids.GpuOverrides: \n", + "! cannot run on GPU because not all expressions can be replaced; GPU does not currently support the operator class org.apache.spark.sql.execution.DeserializeToObjectExec\n", + " ! createexternalrow(prediction#243, delinquency_12#1450, 1.0#1449, newInstance(class org.apache.spark.ml.linalg.VectorUDT).deserialize, StructField(prediction,DoubleType,true), StructField(delinquency_12,DoubleType,true), StructField(1.0,DoubleType,false), StructField(probability,org.apache.spark.ml.linalg.VectorUDT@3bfc3ba7,true)) cannot run on GPU because GPU does not currently support the operator class org.apache.spark.sql.catalyst.expressions.objects.CreateExternalRow\n", + " @Expression prediction#243 could run on GPU\n", + " @Expression delinquency_12#1450 could run on GPU\n", + " @Expression 1.0#1449 could run on GPU\n", + " ! newInstance(class org.apache.spark.ml.linalg.VectorUDT).deserialize cannot run on GPU because GPU does not currently support the operator class org.apache.spark.sql.catalyst.expressions.objects.Invoke\n", + " ! newInstance(class org.apache.spark.ml.linalg.VectorUDT) cannot run on GPU because GPU does not currently support the operator class org.apache.spark.sql.catalyst.expressions.objects.NewInstance\n", + " !Expression probability#275 cannot run on GPU because expression AttributeReference probability#275 produces an unsupported type org.apache.spark.ml.linalg.VectorUDT@3bfc3ba7\n", + " !Expression obj#1455 cannot run on GPU because expression AttributeReference obj#1455 produces an unsupported type ObjectType(interface org.apache.spark.sql.Row)\n", + " !Exec cannot run on GPU because unsupported data types in output: org.apache.spark.ml.linalg.VectorUDT@3bfc3ba7 [probability#275]; unsupported data types in input: org.apache.spark.ml.linalg.VectorUDT@3bfc3ba7 [probability#275]; not all expressions can be replaced\n", + " @Expression prediction#243 could run on GPU\n", + " @Expression cast(delinquency_12#83 as double) AS delinquency_12#1450 could run on GPU\n", + " @Expression cast(delinquency_12#83 as double) could run on GPU\n", + " @Expression delinquency_12#83 could run on GPU\n", + " @Expression 1.0 AS 1.0#1449 could run on GPU\n", + " @Expression 1.0 could run on GPU\n", + " !Expression probability#275 cannot run on GPU because expression AttributeReference probability#275 produces an unsupported type org.apache.spark.ml.linalg.VectorUDT@3bfc3ba7\n", + " !Exec cannot run on GPU because unsupported data types in output: org.apache.spark.ml.linalg.VectorUDT@3bfc3ba7 [rawPrediction, probability]; unsupported data types in output: org.apache.spark.ml.linalg.VectorUDT@3bfc3ba7 [probability#275]; not all expressions can be replaced\n", + " @Expression delinquency_12#83 could run on GPU\n", + " @Expression prediction#243 could run on GPU\n", + " !Expression probability#275 cannot run on GPU because expression AttributeReference probability#275 produces an unsupported type org.apache.spark.ml.linalg.VectorUDT@3bfc3ba7\n", + "\n", + "[Stage 19:> (0 + 1) / 1]\r" + ] + }, { "name": "stdout", "output_type": "stream", "text": [ - "Evaluation takes 1.03 seconds\n", - "Accuracy is 0.9876786703104035\n" + "----------------------------------------------------------------------------------------------------\n", + "Accuracy is 1.0\n", + "Evaluation takes 2.29 seconds\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "\r", + " \r" ] } ], "source": [ - "accuracy = with_benchmark(\n", - " 'Evaluation',\n", - " lambda: MulticlassClassificationEvaluator().setLabelCol(label).evaluate(result))\n", - "print('Accuracy is ' + str(accuracy))" + "with_benchmark('Evaluation', lambda: check_classification_accuracy(result, label))" ] }, { "cell_type": "code", - "execution_count": 9, + "execution_count": 12, "metadata": {}, "outputs": [], "source": [ "spark.stop()" ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [] } ], "metadata": { @@ -340,9 +590,9 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.8.2" + "version": "3.8.13" } }, "nbformat": 4, "nbformat_minor": 2 -} +} \ No newline at end of file From ef6668c614ff1ba8c6415fe6b775712ab2e8a765 Mon Sep 17 00:00:00 2001 From: liyuan Date: Fri, 25 Nov 2022 17:39:06 +0800 Subject: [PATCH 06/14] update mortgage cross validation notebook Signed-off-by: liyuan --- .../notebooks/python/cv-mortgage-gpu.ipynb | 534 ++++++++++++++++-- 1 file changed, 482 insertions(+), 52 deletions(-) diff --git a/examples/XGBoost-Examples/mortgage/notebooks/python/cv-mortgage-gpu.ipynb b/examples/XGBoost-Examples/mortgage/notebooks/python/cv-mortgage-gpu.ipynb index 94a682cef..a759cf53a 100644 --- a/examples/XGBoost-Examples/mortgage/notebooks/python/cv-mortgage-gpu.ipynb +++ b/examples/XGBoost-Examples/mortgage/notebooks/python/cv-mortgage-gpu.ipynb @@ -11,13 +11,10 @@ "Here takes the application 'Mortgage' as an example.\n", "\n", "A few libraries are required for this notebook:\n", - " 1. NumPy\n", - " 2. cudf jar\n", - " 2. xgboost4j jar\n", - " 3. xgboost4j-spark jar\n", - " \n", - "Note: For PySpark based XGBoost, please refer to the [Spark-RAPIDS-examples 22.04 branch](https://github.com/NVIDIA/spark-rapids-examples/tree/branch-22.04) that\n", - "uses [NVIDIA’s Spark XGBoost version](https://repo1.maven.org/maven2/com/nvidia/xgboost4j-spark_3.0/1.4.2-0.3.0/)." + " 1. cudf-cu11\n", + " 2. xgboost\n", + " 3. scikit-learn\n", + " 4. numpy" ] }, { @@ -33,14 +30,18 @@ "metadata": {}, "outputs": [], "source": [ - "from ml.dmlc.xgboost4j.scala.spark import XGBoostClassificationModel, XGBoostClassifier\n", - "from ml.dmlc.xgboost4j.scala.spark.rapids import CrossValidator\n", + "from xgboost.spark import SparkXGBClassifier, SparkXGBClassifierModel\n", + "from pyspark.ml.tuning import ParamGridBuilder, CrossValidator\n", "from pyspark.ml.evaluation import MulticlassClassificationEvaluator\n", - "from pyspark.ml.tuning import ParamGridBuilder\n", "from pyspark.sql import SparkSession\n", "from pyspark.sql.types import FloatType, IntegerType, StructField, StructType, DoubleType\n", + "from pyspark.conf import SparkConf\n", "from time import time\n", - "import os" + "import os\n", + "os.environ['PYSPARK_PYTHON'] = \"./environment/bin/python\"\n", + "os.environ['PYSPARK_DRIVER_PYTHON'] = \"./environment/bin/python\"\n", + "# export PYSPARK_DRIVER_PYTHON=/home/yuali_nvidia_com/review/pr232/my-env-2/bin/python\n", + "# os.environ['PYSPARK_PYTHON'] = \"/home/yuanli/work/reviews/pr252/python-vir-env/bin/python\"" ] }, { @@ -61,9 +62,66 @@ "cell_type": "code", "execution_count": 2, "metadata": {}, - "outputs": [], + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "2022-11-25 09:34:43,524 WARN util.NativeCodeLoader: Unable to load native-hadoop library for your platform... using builtin-java classes where applicable\n", + "Setting default log level to \"WARN\".\n", + "To adjust logging level use sc.setLogLevel(newLevel). For SparkR, use setLogLevel(newLevel).\n", + "2022-11-25 09:34:43,952 WARN resource.ResourceUtils: The configuration of cores (exec = 4 task = 1, runnable tasks = 4) will result in wasted resources due to resource gpu limiting the number of runnable tasks per executor to: 1. Please adjust your configuration.\n", + "2022-11-25 09:34:58,155 WARN rapids.RapidsPluginUtils: RAPIDS Accelerator 22.10.0-SNAPSHOT using cudf 22.10.0-SNAPSHOT.\n", + "2022-11-25 09:34:58,171 WARN rapids.RapidsPluginUtils: spark.rapids.sql.multiThreadedRead.numThreads is set to 20.\n", + "2022-11-25 09:34:58,175 WARN rapids.RapidsPluginUtils: RAPIDS Accelerator is enabled, to disable GPU support set `spark.rapids.sql.enabled` to false.\n", + "2022-11-25 09:34:58,175 WARN rapids.RapidsPluginUtils: spark.rapids.sql.explain is set to `NOT_ON_GPU`. Set it to 'NONE' to suppress the diagnostics logging about the query placement on the GPU.\n" + ] + } + ], "source": [ - "spark = SparkSession.builder.appName(\"mortgage-cv-gpu-python\").getOrCreate()" + "# SPARK_MASTER_URL = os.getenv(\"SPARK_MASTER_URL\", \"yarn\")\n", + "SPARK_MASTER_URL = os.getenv(\"SPARK_MASTER_URL\", \"spark://10.19.183.210:7077\")\n", + "\n", + "# RAPIDS_JAR = os.getenv(\"RAPIDS_JAR\", \"/usr/lib/spark/jars/rapids-4-spark_2.12-22.08.0.jar\")\n", + "RAPIDS_JAR = os.getenv(\"RAPIDS_JAR\", \"/home/yuanli/work/jars/v22.10.0/rapids-4-spark_2.12-22.10.0-20220924.131241-34.jar\")\n", + "\n", + "# You need to update with your real hardware resource \n", + "driverMem = os.getenv(\"DRIVER_MEM\", \"2g\")\n", + "executorMem = os.getenv(\"EXECUTOR_MEM\", \"2g\")\n", + "pinnedPoolSize = os.getenv(\"PINNED_POOL_SIZE\", \"2g\")\n", + "concurrentGpuTasks = os.getenv(\"CONCURRENT_GPU_TASKS\", \"2\")\n", + "executorCores = int(os.getenv(\"EXECUTOR_CORES\", \"4\"))\n", + "# Common spark settings\n", + "conf = SparkConf()\n", + "conf.setMaster(SPARK_MASTER_URL)\n", + "conf.setAppName(\"Microbenchmark on GPU\")\n", + "conf.set(\"spark.driver.memory\", driverMem)\n", + "## The tasks will run on GPU memory, so there is no need to set a high host memory\n", + "conf.set(\"spark.executor.memory\", executorMem)\n", + "## The tasks will run on GPU cores, so there is no need to use many cpu cores\n", + "conf.set(\"spark.executor.cores\", executorCores)\n", + "\n", + "\n", + "# Plugin settings\n", + "conf.set(\"spark.executor.resource.gpu.amount\", \"1\")\n", + "conf.set(\"spark.rapids.sql.concurrentGpuTasks\", concurrentGpuTasks)\n", + "conf.set(\"spark.rapids.memory.pinnedPool.size\", pinnedPoolSize)\n", + "conf.set(\"spark.rapids.memory.gpu.allocFraction\",\"0.7\")\n", + "conf.set(\"spark.locality.wait\",\"0\")\n", + "##############note: only support value=1 https://github.com/dmlc/xgboost/blame/master/python-package/xgboost/spark/core.py#L370-L374\n", + "conf.set(\"spark.task.resource.gpu.amount\", 1) \n", + "conf.set(\"spark.rapids.sql.enabled\", \"true\") \n", + "conf.set(\"spark.plugins\", \"com.nvidia.spark.SQLPlugin\")\n", + "conf.set(\"spark.sql.cache.serializer\",\"com.nvidia.spark.ParquetCachedBatchSerializer\")\n", + "conf.set(\"spark.driver.extraClassPath\", RAPIDS_JAR)\n", + "conf.set(\"spark.executor.extraClassPath\", RAPIDS_JAR)\n", + "# conf.set(\"spark.yarn.dist.archives\", \"pyspark_venv_20221124.tar.gz#environment\")\n", + "conf.set(\"spark.archives\", \"pyspark_venv_20221125.tar.gz#environment\")\n", + "\n", + "# Create spark session\n", + "spark = SparkSession.builder.config(conf=conf).getOrCreate()\n", + "\n", + "reader = spark.read" ] }, { @@ -113,12 +171,18 @@ "features = [ x.name for x in schema if x.name != label ]\n", "\n", "# You need to update them to your real paths!\n", - "dataRoot = os.getenv(\"DATA_ROOT\", \"/data\")\n", - "train_path = dataRoot + \"/mortgage/output/train\"\n", - "eval_path = dataRoot + \"/mortgage/output/eval\"\n", + "dataRoot = os.getenv(\"DATA_ROOT\", \"file:///home/yuanli/work/reviews/pr252/datasets\")\n", + "train_path = dataRoot + \"/mortgage/csv/train/mortgage-small.csv\"\n", + "eval_path = dataRoot + \"/mortgage/csv/test/test.csv\"\n", "\n", - "train_data = spark.read.parquet(train_path)\n", - "trans_data = spark.read.parquet(eval_path)" + "data_format = 'csv'\n", + "has_header = 'true'\n", + "if data_format == 'csv':\n", + " train_data = reader.schema(schema).option('header',has_header).csv(train_path)\n", + " trans_data = reader.schema(schema).option('header',has_header).csv(eval_path)\n", + "else :\n", + " train_data = reader.load(train_path)\n", + " trans_data = reader.load(eval_path)" ] }, { @@ -134,38 +198,31 @@ "metadata": {}, "outputs": [], "source": [ - "# First build a classifier of GPU version using *setFeaturesCols* to set feature columns\n", "params = { \n", - " 'eta': 0.1,\n", - " 'gamma': 0.1,\n", - " 'missing': 0.0,\n", - " 'treeMethod': 'gpu_hist',\n", - " 'maxDepth': 10, \n", - " 'maxLeaves': 256,\n", - " 'growPolicy': 'depthwise',\n", - " 'objective': 'binary:logistic',\n", - " 'minChildWeight': 30.0,\n", - " 'lambda_': 1.0,\n", - " 'scalePosWeight': 2.0,\n", - " 'subsample': 1.0,\n", - " 'nthread': 1,\n", - " 'numRound': 100,\n", - " 'numWorkers': 1,\n", + " \"tree_method\": \"gpu_hist\",\n", + " \"grow_policy\": \"depthwise\",\n", + " \"num_workers\": 1,\n", + " \"use_gpu\": \"true\",\n", "}\n", - "classifier = XGBoostClassifier(**params).setLabelCol(label).setFeaturesCols(features)\n", + "\n", + "params['features_col'] = features\n", + "params['label_col'] = label\n", + " \n", + "classifier = SparkXGBClassifier(**params)\n", + "\n", "# Then build the evaluator and the hyperparameters\n", "evaluator = (MulticlassClassificationEvaluator()\n", " .setLabelCol(label))\n", "param_grid = (ParamGridBuilder()\n", - " .addGrid(classifier.maxDepth, [3, 6])\n", - " .addGrid(classifier.numRound, [100, 200])\n", + " .addGrid(classifier.max_depth, [3, 6])\n", + " .addGrid(classifier.n_estimators, [100, 200])\n", " .build())\n", "# Finally the corss validator\n", "cross_validator = (CrossValidator()\n", " .setEstimator(classifier)\n", " .setEvaluator(evaluator)\n", " .setEstimatorParamMaps(param_grid)\n", - " .setNumFolds(3))" + " .setNumFolds(2))" ] }, { @@ -180,11 +237,242 @@ "execution_count": 5, "metadata": {}, "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "2022-11-25 09:35:01,049 WARN util.package: Truncated the string representation of a plan since it was too large. This behavior can be adjusted by setting 'spark.sql.debug.maxToStringFields'.\n", + "If features_cols param set, then features_col param is ignored.\n", + "/data/home/yuanli/work/reviews/pr252/pyspark_venv_20221125/lib/python3.8/site-packages/xgboost/sklearn.py:808: UserWarning: Loading a native XGBoost model with Scikit-Learn interface.\n", + " warnings.warn(\"Loading a native XGBoost model with Scikit-Learn interface.\")\n", + "2022-11-25 09:35:26,758 WARN rapids.GpuOverrides: \n", + "! cannot run on GPU because not all expressions can be replaced; GPU does not currently support the operator class org.apache.spark.sql.execution.DeserializeToObjectExec\n", + " ! createexternalrow(prediction#2153, delinquency_12#2255, 1.0#2256, newInstance(class org.apache.spark.ml.linalg.VectorUDT).deserialize, StructField(prediction,DoubleType,true), StructField(delinquency_12,DoubleType,true), StructField(1.0,DoubleType,false), StructField(probability,org.apache.spark.ml.linalg.VectorUDT@3bfc3ba7,true)) cannot run on GPU because GPU does not currently support the operator class org.apache.spark.sql.catalyst.expressions.objects.CreateExternalRow\n", + " @Expression prediction#2153 could run on GPU\n", + " @Expression delinquency_12#2255 could run on GPU\n", + " @Expression 1.0#2256 could run on GPU\n", + " ! newInstance(class org.apache.spark.ml.linalg.VectorUDT).deserialize cannot run on GPU because GPU does not currently support the operator class org.apache.spark.sql.catalyst.expressions.objects.Invoke\n", + " ! newInstance(class org.apache.spark.ml.linalg.VectorUDT) cannot run on GPU because GPU does not currently support the operator class org.apache.spark.sql.catalyst.expressions.objects.NewInstance\n", + " !Expression probability#2186 cannot run on GPU because expression AttributeReference probability#2186 produces an unsupported type org.apache.spark.ml.linalg.VectorUDT@3bfc3ba7\n", + " !Expression obj#2261 cannot run on GPU because expression AttributeReference obj#2261 produces an unsupported type ObjectType(interface org.apache.spark.sql.Row)\n", + " !Exec cannot run on GPU because not all expressions can be replaced; unsupported data types in output: org.apache.spark.ml.linalg.VectorUDT@3bfc3ba7 [probability#2186]\n", + " @Expression pythonUDF0#2552.prediction AS prediction#2153 could run on GPU\n", + " @Expression pythonUDF0#2552.prediction could run on GPU\n", + " @Expression pythonUDF0#2552 could run on GPU\n", + " @Expression cast(delinquency_12#27 as double) AS delinquency_12#2255 could run on GPU\n", + " @Expression cast(delinquency_12#27 as double) could run on GPU\n", + " @Expression delinquency_12#27 could run on GPU\n", + " @Expression 1.0 AS 1.0#2256 could run on GPU\n", + " @Expression 1.0 could run on GPU\n", + " !Expression UDF(pythonUDF0#2552.probability) AS probability#2186 cannot run on GPU because input expression ScalaUDF UDF(pythonUDF0#2552.probability) (org.apache.spark.ml.linalg.VectorUDT@3bfc3ba7 is not supported); expression Alias UDF(pythonUDF0#2552.probability) AS probability#2186 produces an unsupported type org.apache.spark.ml.linalg.VectorUDT@3bfc3ba7\n", + " !Expression UDF(pythonUDF0#2552.probability) cannot run on GPU because expression ScalaUDF UDF(pythonUDF0#2552.probability) produces an unsupported type org.apache.spark.ml.linalg.VectorUDT@3bfc3ba7; neither UDF implemented by class org.apache.spark.ml.functions$$$Lambda$3606/1625633331 provides a GPU implementation, nor the conf `spark.rapids.sql.rowBasedUDF.enabled` is enabled\n", + " @Expression pythonUDF0#2552.probability could run on GPU\n", + " @Expression pythonUDF0#2552 could run on GPU\n", + "\n", + "If features_cols param set, then features_col param is ignored. \n", + "2022-11-25 09:35:34,074 WARN rapids.GpuOverrides: \n", + "! cannot run on GPU because not all expressions can be replaced; GPU does not currently support the operator class org.apache.spark.sql.execution.DeserializeToObjectExec\n", + " ! createexternalrow(prediction#4415, delinquency_12#4517, 1.0#4518, newInstance(class org.apache.spark.ml.linalg.VectorUDT).deserialize, StructField(prediction,DoubleType,true), StructField(delinquency_12,DoubleType,true), StructField(1.0,DoubleType,false), StructField(probability,org.apache.spark.ml.linalg.VectorUDT@3bfc3ba7,true)) cannot run on GPU because GPU does not currently support the operator class org.apache.spark.sql.catalyst.expressions.objects.CreateExternalRow\n", + " @Expression prediction#4415 could run on GPU\n", + " @Expression delinquency_12#4517 could run on GPU\n", + " @Expression 1.0#4518 could run on GPU\n", + " ! newInstance(class org.apache.spark.ml.linalg.VectorUDT).deserialize cannot run on GPU because GPU does not currently support the operator class org.apache.spark.sql.catalyst.expressions.objects.Invoke\n", + " ! newInstance(class org.apache.spark.ml.linalg.VectorUDT) cannot run on GPU because GPU does not currently support the operator class org.apache.spark.sql.catalyst.expressions.objects.NewInstance\n", + " !Expression probability#4448 cannot run on GPU because expression AttributeReference probability#4448 produces an unsupported type org.apache.spark.ml.linalg.VectorUDT@3bfc3ba7\n", + " !Expression obj#4523 cannot run on GPU because expression AttributeReference obj#4523 produces an unsupported type ObjectType(interface org.apache.spark.sql.Row)\n", + " !Exec cannot run on GPU because unsupported data types in output: org.apache.spark.ml.linalg.VectorUDT@3bfc3ba7 [probability#4448]; not all expressions can be replaced\n", + " @Expression pythonUDF0#4814.prediction AS prediction#4415 could run on GPU\n", + " @Expression pythonUDF0#4814.prediction could run on GPU\n", + " @Expression pythonUDF0#4814 could run on GPU\n", + " @Expression cast(delinquency_12#27 as double) AS delinquency_12#4517 could run on GPU\n", + " @Expression cast(delinquency_12#27 as double) could run on GPU\n", + " @Expression delinquency_12#27 could run on GPU\n", + " @Expression 1.0 AS 1.0#4518 could run on GPU\n", + " @Expression 1.0 could run on GPU\n", + " !Expression UDF(pythonUDF0#4814.probability) AS probability#4448 cannot run on GPU because expression Alias UDF(pythonUDF0#4814.probability) AS probability#4448 produces an unsupported type org.apache.spark.ml.linalg.VectorUDT@3bfc3ba7; input expression ScalaUDF UDF(pythonUDF0#4814.probability) (org.apache.spark.ml.linalg.VectorUDT@3bfc3ba7 is not supported)\n", + " !Expression UDF(pythonUDF0#4814.probability) cannot run on GPU because neither UDF implemented by class org.apache.spark.ml.functions$$$Lambda$3606/1625633331 provides a GPU implementation, nor the conf `spark.rapids.sql.rowBasedUDF.enabled` is enabled; expression ScalaUDF UDF(pythonUDF0#4814.probability) produces an unsupported type org.apache.spark.ml.linalg.VectorUDT@3bfc3ba7\n", + " @Expression pythonUDF0#4814.probability could run on GPU\n", + " @Expression pythonUDF0#4814 could run on GPU\n", + "\n", + "If features_cols param set, then features_col param is ignored.\n", + "2022-11-25 09:35:37,859 WARN rapids.GpuOverrides: \n", + "! cannot run on GPU because not all expressions can be replaced; GPU does not currently support the operator class org.apache.spark.sql.execution.DeserializeToObjectExec\n", + " ! createexternalrow(prediction#6677, delinquency_12#6779, 1.0#6780, newInstance(class org.apache.spark.ml.linalg.VectorUDT).deserialize, StructField(prediction,DoubleType,true), StructField(delinquency_12,DoubleType,true), StructField(1.0,DoubleType,false), StructField(probability,org.apache.spark.ml.linalg.VectorUDT@3bfc3ba7,true)) cannot run on GPU because GPU does not currently support the operator class org.apache.spark.sql.catalyst.expressions.objects.CreateExternalRow\n", + " @Expression prediction#6677 could run on GPU\n", + " @Expression delinquency_12#6779 could run on GPU\n", + " @Expression 1.0#6780 could run on GPU\n", + " ! newInstance(class org.apache.spark.ml.linalg.VectorUDT).deserialize cannot run on GPU because GPU does not currently support the operator class org.apache.spark.sql.catalyst.expressions.objects.Invoke\n", + " ! newInstance(class org.apache.spark.ml.linalg.VectorUDT) cannot run on GPU because GPU does not currently support the operator class org.apache.spark.sql.catalyst.expressions.objects.NewInstance\n", + " !Expression probability#6710 cannot run on GPU because expression AttributeReference probability#6710 produces an unsupported type org.apache.spark.ml.linalg.VectorUDT@3bfc3ba7\n", + " !Expression obj#6785 cannot run on GPU because expression AttributeReference obj#6785 produces an unsupported type ObjectType(interface org.apache.spark.sql.Row)\n", + " !Exec cannot run on GPU because unsupported data types in output: org.apache.spark.ml.linalg.VectorUDT@3bfc3ba7 [probability#6710]; not all expressions can be replaced\n", + " @Expression pythonUDF0#7076.prediction AS prediction#6677 could run on GPU\n", + " @Expression pythonUDF0#7076.prediction could run on GPU\n", + " @Expression pythonUDF0#7076 could run on GPU\n", + " @Expression cast(delinquency_12#27 as double) AS delinquency_12#6779 could run on GPU\n", + " @Expression cast(delinquency_12#27 as double) could run on GPU\n", + " @Expression delinquency_12#27 could run on GPU\n", + " @Expression 1.0 AS 1.0#6780 could run on GPU\n", + " @Expression 1.0 could run on GPU\n", + " !Expression UDF(pythonUDF0#7076.probability) AS probability#6710 cannot run on GPU because input expression ScalaUDF UDF(pythonUDF0#7076.probability) (org.apache.spark.ml.linalg.VectorUDT@3bfc3ba7 is not supported); expression Alias UDF(pythonUDF0#7076.probability) AS probability#6710 produces an unsupported type org.apache.spark.ml.linalg.VectorUDT@3bfc3ba7\n", + " !Expression UDF(pythonUDF0#7076.probability) cannot run on GPU because expression ScalaUDF UDF(pythonUDF0#7076.probability) produces an unsupported type org.apache.spark.ml.linalg.VectorUDT@3bfc3ba7; neither UDF implemented by class org.apache.spark.ml.functions$$$Lambda$3606/1625633331 provides a GPU implementation, nor the conf `spark.rapids.sql.rowBasedUDF.enabled` is enabled\n", + " @Expression pythonUDF0#7076.probability could run on GPU\n", + " @Expression pythonUDF0#7076 could run on GPU\n", + "\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "If features_cols param set, then features_col param is ignored.\n", + "2022-11-25 09:35:41,551 WARN rapids.GpuOverrides: \n", + "! cannot run on GPU because not all expressions can be replaced; GPU does not currently support the operator class org.apache.spark.sql.execution.DeserializeToObjectExec\n", + " ! createexternalrow(prediction#8939, delinquency_12#9041, 1.0#9042, newInstance(class org.apache.spark.ml.linalg.VectorUDT).deserialize, StructField(prediction,DoubleType,true), StructField(delinquency_12,DoubleType,true), StructField(1.0,DoubleType,false), StructField(probability,org.apache.spark.ml.linalg.VectorUDT@3bfc3ba7,true)) cannot run on GPU because GPU does not currently support the operator class org.apache.spark.sql.catalyst.expressions.objects.CreateExternalRow\n", + " @Expression prediction#8939 could run on GPU\n", + " @Expression delinquency_12#9041 could run on GPU\n", + " @Expression 1.0#9042 could run on GPU\n", + " ! newInstance(class org.apache.spark.ml.linalg.VectorUDT).deserialize cannot run on GPU because GPU does not currently support the operator class org.apache.spark.sql.catalyst.expressions.objects.Invoke\n", + " ! newInstance(class org.apache.spark.ml.linalg.VectorUDT) cannot run on GPU because GPU does not currently support the operator class org.apache.spark.sql.catalyst.expressions.objects.NewInstance\n", + " !Expression probability#8972 cannot run on GPU because expression AttributeReference probability#8972 produces an unsupported type org.apache.spark.ml.linalg.VectorUDT@3bfc3ba7\n", + " !Expression obj#9047 cannot run on GPU because expression AttributeReference obj#9047 produces an unsupported type ObjectType(interface org.apache.spark.sql.Row)\n", + " !Exec cannot run on GPU because unsupported data types in output: org.apache.spark.ml.linalg.VectorUDT@3bfc3ba7 [probability#8972]; not all expressions can be replaced\n", + " @Expression pythonUDF0#9338.prediction AS prediction#8939 could run on GPU\n", + " @Expression pythonUDF0#9338.prediction could run on GPU\n", + " @Expression pythonUDF0#9338 could run on GPU\n", + " @Expression cast(delinquency_12#27 as double) AS delinquency_12#9041 could run on GPU\n", + " @Expression cast(delinquency_12#27 as double) could run on GPU\n", + " @Expression delinquency_12#27 could run on GPU\n", + " @Expression 1.0 AS 1.0#9042 could run on GPU\n", + " @Expression 1.0 could run on GPU\n", + " !Expression UDF(pythonUDF0#9338.probability) AS probability#8972 cannot run on GPU because input expression ScalaUDF UDF(pythonUDF0#9338.probability) (org.apache.spark.ml.linalg.VectorUDT@3bfc3ba7 is not supported); expression Alias UDF(pythonUDF0#9338.probability) AS probability#8972 produces an unsupported type org.apache.spark.ml.linalg.VectorUDT@3bfc3ba7\n", + " !Expression UDF(pythonUDF0#9338.probability) cannot run on GPU because neither UDF implemented by class org.apache.spark.ml.functions$$$Lambda$3606/1625633331 provides a GPU implementation, nor the conf `spark.rapids.sql.rowBasedUDF.enabled` is enabled; expression ScalaUDF UDF(pythonUDF0#9338.probability) produces an unsupported type org.apache.spark.ml.linalg.VectorUDT@3bfc3ba7\n", + " @Expression pythonUDF0#9338.probability could run on GPU\n", + " @Expression pythonUDF0#9338 could run on GPU\n", + "\n", + "If features_cols param set, then features_col param is ignored.\n", + "2022-11-25 09:35:45,231 WARN rapids.GpuOverrides: \n", + "! cannot run on GPU because not all expressions can be replaced; GPU does not currently support the operator class org.apache.spark.sql.execution.DeserializeToObjectExec\n", + " ! createexternalrow(prediction#11491, delinquency_12#11593, 1.0#11594, newInstance(class org.apache.spark.ml.linalg.VectorUDT).deserialize, StructField(prediction,DoubleType,true), StructField(delinquency_12,DoubleType,true), StructField(1.0,DoubleType,false), StructField(probability,org.apache.spark.ml.linalg.VectorUDT@3bfc3ba7,true)) cannot run on GPU because GPU does not currently support the operator class org.apache.spark.sql.catalyst.expressions.objects.CreateExternalRow\n", + " @Expression prediction#11491 could run on GPU\n", + " @Expression delinquency_12#11593 could run on GPU\n", + " @Expression 1.0#11594 could run on GPU\n", + " ! newInstance(class org.apache.spark.ml.linalg.VectorUDT).deserialize cannot run on GPU because GPU does not currently support the operator class org.apache.spark.sql.catalyst.expressions.objects.Invoke\n", + " ! newInstance(class org.apache.spark.ml.linalg.VectorUDT) cannot run on GPU because GPU does not currently support the operator class org.apache.spark.sql.catalyst.expressions.objects.NewInstance\n", + " !Expression probability#11524 cannot run on GPU because expression AttributeReference probability#11524 produces an unsupported type org.apache.spark.ml.linalg.VectorUDT@3bfc3ba7\n", + " !Expression obj#11599 cannot run on GPU because expression AttributeReference obj#11599 produces an unsupported type ObjectType(interface org.apache.spark.sql.Row)\n", + " !Exec cannot run on GPU because not all expressions can be replaced; unsupported data types in output: org.apache.spark.ml.linalg.VectorUDT@3bfc3ba7 [probability#11524]\n", + " @Expression pythonUDF0#11890.prediction AS prediction#11491 could run on GPU\n", + " @Expression pythonUDF0#11890.prediction could run on GPU\n", + " @Expression pythonUDF0#11890 could run on GPU\n", + " @Expression cast(delinquency_12#27 as double) AS delinquency_12#11593 could run on GPU\n", + " @Expression cast(delinquency_12#27 as double) could run on GPU\n", + " @Expression delinquency_12#27 could run on GPU\n", + " @Expression 1.0 AS 1.0#11594 could run on GPU\n", + " @Expression 1.0 could run on GPU\n", + " !Expression UDF(pythonUDF0#11890.probability) AS probability#11524 cannot run on GPU because expression Alias UDF(pythonUDF0#11890.probability) AS probability#11524 produces an unsupported type org.apache.spark.ml.linalg.VectorUDT@3bfc3ba7; input expression ScalaUDF UDF(pythonUDF0#11890.probability) (org.apache.spark.ml.linalg.VectorUDT@3bfc3ba7 is not supported)\n", + " !Expression UDF(pythonUDF0#11890.probability) cannot run on GPU because neither UDF implemented by class org.apache.spark.ml.functions$$$Lambda$3606/1625633331 provides a GPU implementation, nor the conf `spark.rapids.sql.rowBasedUDF.enabled` is enabled; expression ScalaUDF UDF(pythonUDF0#11890.probability) produces an unsupported type org.apache.spark.ml.linalg.VectorUDT@3bfc3ba7\n", + " @Expression pythonUDF0#11890.probability could run on GPU\n", + " @Expression pythonUDF0#11890 could run on GPU\n", + "\n", + "If features_cols param set, then features_col param is ignored.\n", + "2022-11-25 09:35:49,003 WARN rapids.GpuOverrides: \n", + "! cannot run on GPU because not all expressions can be replaced; GPU does not currently support the operator class org.apache.spark.sql.execution.DeserializeToObjectExec\n", + " ! createexternalrow(prediction#13753, delinquency_12#13855, 1.0#13856, newInstance(class org.apache.spark.ml.linalg.VectorUDT).deserialize, StructField(prediction,DoubleType,true), StructField(delinquency_12,DoubleType,true), StructField(1.0,DoubleType,false), StructField(probability,org.apache.spark.ml.linalg.VectorUDT@3bfc3ba7,true)) cannot run on GPU because GPU does not currently support the operator class org.apache.spark.sql.catalyst.expressions.objects.CreateExternalRow\n", + " @Expression prediction#13753 could run on GPU\n", + " @Expression delinquency_12#13855 could run on GPU\n", + " @Expression 1.0#13856 could run on GPU\n", + " ! newInstance(class org.apache.spark.ml.linalg.VectorUDT).deserialize cannot run on GPU because GPU does not currently support the operator class org.apache.spark.sql.catalyst.expressions.objects.Invoke\n", + " ! newInstance(class org.apache.spark.ml.linalg.VectorUDT) cannot run on GPU because GPU does not currently support the operator class org.apache.spark.sql.catalyst.expressions.objects.NewInstance\n", + " !Expression probability#13786 cannot run on GPU because expression AttributeReference probability#13786 produces an unsupported type org.apache.spark.ml.linalg.VectorUDT@3bfc3ba7\n", + " !Expression obj#13861 cannot run on GPU because expression AttributeReference obj#13861 produces an unsupported type ObjectType(interface org.apache.spark.sql.Row)\n", + " !Exec cannot run on GPU because unsupported data types in output: org.apache.spark.ml.linalg.VectorUDT@3bfc3ba7 [probability#13786]; not all expressions can be replaced\n", + " @Expression pythonUDF0#14152.prediction AS prediction#13753 could run on GPU\n", + " @Expression pythonUDF0#14152.prediction could run on GPU\n", + " @Expression pythonUDF0#14152 could run on GPU\n", + " @Expression cast(delinquency_12#27 as double) AS delinquency_12#13855 could run on GPU\n", + " @Expression cast(delinquency_12#27 as double) could run on GPU\n", + " @Expression delinquency_12#27 could run on GPU\n", + " @Expression 1.0 AS 1.0#13856 could run on GPU\n", + " @Expression 1.0 could run on GPU\n", + " !Expression UDF(pythonUDF0#14152.probability) AS probability#13786 cannot run on GPU because expression Alias UDF(pythonUDF0#14152.probability) AS probability#13786 produces an unsupported type org.apache.spark.ml.linalg.VectorUDT@3bfc3ba7; input expression ScalaUDF UDF(pythonUDF0#14152.probability) (org.apache.spark.ml.linalg.VectorUDT@3bfc3ba7 is not supported)\n", + " !Expression UDF(pythonUDF0#14152.probability) cannot run on GPU because expression ScalaUDF UDF(pythonUDF0#14152.probability) produces an unsupported type org.apache.spark.ml.linalg.VectorUDT@3bfc3ba7; neither UDF implemented by class org.apache.spark.ml.functions$$$Lambda$3606/1625633331 provides a GPU implementation, nor the conf `spark.rapids.sql.rowBasedUDF.enabled` is enabled\n", + " @Expression pythonUDF0#14152.probability could run on GPU\n", + " @Expression pythonUDF0#14152 could run on GPU\n", + "\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "If features_cols param set, then features_col param is ignored.\n", + "2022-11-25 09:35:52,578 WARN rapids.GpuOverrides: \n", + "! cannot run on GPU because not all expressions can be replaced; GPU does not currently support the operator class org.apache.spark.sql.execution.DeserializeToObjectExec\n", + " ! createexternalrow(prediction#16015, delinquency_12#16117, 1.0#16118, newInstance(class org.apache.spark.ml.linalg.VectorUDT).deserialize, StructField(prediction,DoubleType,true), StructField(delinquency_12,DoubleType,true), StructField(1.0,DoubleType,false), StructField(probability,org.apache.spark.ml.linalg.VectorUDT@3bfc3ba7,true)) cannot run on GPU because GPU does not currently support the operator class org.apache.spark.sql.catalyst.expressions.objects.CreateExternalRow\n", + " @Expression prediction#16015 could run on GPU\n", + " @Expression delinquency_12#16117 could run on GPU\n", + " @Expression 1.0#16118 could run on GPU\n", + " ! newInstance(class org.apache.spark.ml.linalg.VectorUDT).deserialize cannot run on GPU because GPU does not currently support the operator class org.apache.spark.sql.catalyst.expressions.objects.Invoke\n", + " ! newInstance(class org.apache.spark.ml.linalg.VectorUDT) cannot run on GPU because GPU does not currently support the operator class org.apache.spark.sql.catalyst.expressions.objects.NewInstance\n", + " !Expression probability#16048 cannot run on GPU because expression AttributeReference probability#16048 produces an unsupported type org.apache.spark.ml.linalg.VectorUDT@3bfc3ba7\n", + " !Expression obj#16123 cannot run on GPU because expression AttributeReference obj#16123 produces an unsupported type ObjectType(interface org.apache.spark.sql.Row)\n", + " !Exec cannot run on GPU because unsupported data types in output: org.apache.spark.ml.linalg.VectorUDT@3bfc3ba7 [probability#16048]; not all expressions can be replaced\n", + " @Expression pythonUDF0#16414.prediction AS prediction#16015 could run on GPU\n", + " @Expression pythonUDF0#16414.prediction could run on GPU\n", + " @Expression pythonUDF0#16414 could run on GPU\n", + " @Expression cast(delinquency_12#27 as double) AS delinquency_12#16117 could run on GPU\n", + " @Expression cast(delinquency_12#27 as double) could run on GPU\n", + " @Expression delinquency_12#27 could run on GPU\n", + " @Expression 1.0 AS 1.0#16118 could run on GPU\n", + " @Expression 1.0 could run on GPU\n", + " !Expression UDF(pythonUDF0#16414.probability) AS probability#16048 cannot run on GPU because expression Alias UDF(pythonUDF0#16414.probability) AS probability#16048 produces an unsupported type org.apache.spark.ml.linalg.VectorUDT@3bfc3ba7; input expression ScalaUDF UDF(pythonUDF0#16414.probability) (org.apache.spark.ml.linalg.VectorUDT@3bfc3ba7 is not supported)\n", + " !Expression UDF(pythonUDF0#16414.probability) cannot run on GPU because expression ScalaUDF UDF(pythonUDF0#16414.probability) produces an unsupported type org.apache.spark.ml.linalg.VectorUDT@3bfc3ba7; neither UDF implemented by class org.apache.spark.ml.functions$$$Lambda$3606/1625633331 provides a GPU implementation, nor the conf `spark.rapids.sql.rowBasedUDF.enabled` is enabled\n", + " @Expression pythonUDF0#16414.probability could run on GPU\n", + " @Expression pythonUDF0#16414 could run on GPU\n", + "\n", + "If features_cols param set, then features_col param is ignored.\n", + "2022-11-25 09:35:56,267 WARN rapids.GpuOverrides: \n", + "! cannot run on GPU because not all expressions can be replaced; GPU does not currently support the operator class org.apache.spark.sql.execution.DeserializeToObjectExec\n", + " ! createexternalrow(prediction#18277, delinquency_12#18379, 1.0#18380, newInstance(class org.apache.spark.ml.linalg.VectorUDT).deserialize, StructField(prediction,DoubleType,true), StructField(delinquency_12,DoubleType,true), StructField(1.0,DoubleType,false), StructField(probability,org.apache.spark.ml.linalg.VectorUDT@3bfc3ba7,true)) cannot run on GPU because GPU does not currently support the operator class org.apache.spark.sql.catalyst.expressions.objects.CreateExternalRow\n", + " @Expression prediction#18277 could run on GPU\n", + " @Expression delinquency_12#18379 could run on GPU\n", + " @Expression 1.0#18380 could run on GPU\n", + " ! newInstance(class org.apache.spark.ml.linalg.VectorUDT).deserialize cannot run on GPU because GPU does not currently support the operator class org.apache.spark.sql.catalyst.expressions.objects.Invoke\n", + " ! newInstance(class org.apache.spark.ml.linalg.VectorUDT) cannot run on GPU because GPU does not currently support the operator class org.apache.spark.sql.catalyst.expressions.objects.NewInstance\n", + " !Expression probability#18310 cannot run on GPU because expression AttributeReference probability#18310 produces an unsupported type org.apache.spark.ml.linalg.VectorUDT@3bfc3ba7\n", + " !Expression obj#18385 cannot run on GPU because expression AttributeReference obj#18385 produces an unsupported type ObjectType(interface org.apache.spark.sql.Row)\n", + " !Exec cannot run on GPU because unsupported data types in output: org.apache.spark.ml.linalg.VectorUDT@3bfc3ba7 [probability#18310]; not all expressions can be replaced\n", + " @Expression pythonUDF0#18676.prediction AS prediction#18277 could run on GPU\n", + " @Expression pythonUDF0#18676.prediction could run on GPU\n", + " @Expression pythonUDF0#18676 could run on GPU\n", + " @Expression cast(delinquency_12#27 as double) AS delinquency_12#18379 could run on GPU\n", + " @Expression cast(delinquency_12#27 as double) could run on GPU\n", + " @Expression delinquency_12#27 could run on GPU\n", + " @Expression 1.0 AS 1.0#18380 could run on GPU\n", + " @Expression 1.0 could run on GPU\n", + " !Expression UDF(pythonUDF0#18676.probability) AS probability#18310 cannot run on GPU because expression Alias UDF(pythonUDF0#18676.probability) AS probability#18310 produces an unsupported type org.apache.spark.ml.linalg.VectorUDT@3bfc3ba7; input expression ScalaUDF UDF(pythonUDF0#18676.probability) (org.apache.spark.ml.linalg.VectorUDT@3bfc3ba7 is not supported)\n", + " !Expression UDF(pythonUDF0#18676.probability) cannot run on GPU because neither UDF implemented by class org.apache.spark.ml.functions$$$Lambda$3606/1625633331 provides a GPU implementation, nor the conf `spark.rapids.sql.rowBasedUDF.enabled` is enabled; expression ScalaUDF UDF(pythonUDF0#18676.probability) produces an unsupported type org.apache.spark.ml.linalg.VectorUDT@3bfc3ba7\n", + " @Expression pythonUDF0#18676.probability could run on GPU\n", + " @Expression pythonUDF0#18676 could run on GPU\n", + "\n", + "If features_cols param set, then features_col param is ignored.\n", + "[Stage 69:> (0 + 1) / 1]\r" + ] + }, { "name": "stdout", "output_type": "stream", "text": [ - "Cross-Validation takes 88.53 seconds\n" + "Cross-Validation takes 59.46 seconds\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "\r", + " \r" ] } ], @@ -207,22 +495,126 @@ }, { "cell_type": "code", - "execution_count": 7, + "execution_count": 6, "metadata": {}, "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "2022-11-25 09:35:59,886 WARN rapids.GpuOverrides: \n", + "!Exec cannot run on GPU because unsupported data types in output: org.apache.spark.ml.linalg.VectorUDT@3bfc3ba7 [rawPrediction#18908, probability#18974]; not all expressions can be replaced\n", + " @Expression orig_channel#56 could run on GPU\n", + " @Expression first_home_buyer#57 could run on GPU\n", + " @Expression loan_purpose#58 could run on GPU\n", + " @Expression property_type#59 could run on GPU\n", + " @Expression occupancy_status#60 could run on GPU\n", + " @Expression property_state#61 could run on GPU\n", + " @Expression product_type#62 could run on GPU\n", + " @Expression relocation_mortgage_indicator#63 could run on GPU\n", + " @Expression seller_name#64 could run on GPU\n", + " @Expression mod_flag#65 could run on GPU\n", + " @Expression orig_interest_rate#66 could run on GPU\n", + " @Expression orig_upb#67 could run on GPU\n", + " @Expression orig_loan_term#68 could run on GPU\n", + " @Expression orig_ltv#69 could run on GPU\n", + " @Expression orig_cltv#70 could run on GPU\n", + " @Expression num_borrowers#71 could run on GPU\n", + " @Expression dti#72 could run on GPU\n", + " @Expression borrower_credit_score#73 could run on GPU\n", + " @Expression num_units#74 could run on GPU\n", + " @Expression zip#75 could run on GPU\n", + " @Expression mortgage_insurance_percent#76 could run on GPU\n", + " @Expression current_loan_delinquency_status#77 could run on GPU\n", + " @Expression current_actual_upb#78 could run on GPU\n", + " @Expression interest_rate#79 could run on GPU\n", + " @Expression loan_age#80 could run on GPU\n", + " @Expression msa#81 could run on GPU\n", + " @Expression non_interest_bearing_upb#82 could run on GPU\n", + " @Expression delinquency_12#83 could run on GPU\n", + " !Expression UDF(pythonUDF0#19041.rawPrediction) AS rawPrediction#18908 cannot run on GPU because input expression ScalaUDF UDF(pythonUDF0#19041.rawPrediction) (org.apache.spark.ml.linalg.VectorUDT@3bfc3ba7 is not supported); expression Alias UDF(pythonUDF0#19041.rawPrediction) AS rawPrediction#18908 produces an unsupported type org.apache.spark.ml.linalg.VectorUDT@3bfc3ba7\n", + " !Expression UDF(pythonUDF0#19041.rawPrediction) cannot run on GPU because neither UDF implemented by class org.apache.spark.ml.functions$$$Lambda$3606/1625633331 provides a GPU implementation, nor the conf `spark.rapids.sql.rowBasedUDF.enabled` is enabled; expression ScalaUDF UDF(pythonUDF0#19041.rawPrediction) produces an unsupported type org.apache.spark.ml.linalg.VectorUDT@3bfc3ba7\n", + " @Expression pythonUDF0#19041.rawPrediction could run on GPU\n", + " @Expression pythonUDF0#19041 could run on GPU\n", + " @Expression pythonUDF0#19041.prediction AS prediction#18942 could run on GPU\n", + " @Expression pythonUDF0#19041.prediction could run on GPU\n", + " @Expression pythonUDF0#19041 could run on GPU\n", + " !Expression UDF(pythonUDF0#19041.probability) AS probability#18974 cannot run on GPU because expression Alias UDF(pythonUDF0#19041.probability) AS probability#18974 produces an unsupported type org.apache.spark.ml.linalg.VectorUDT@3bfc3ba7; input expression ScalaUDF UDF(pythonUDF0#19041.probability) (org.apache.spark.ml.linalg.VectorUDT@3bfc3ba7 is not supported)\n", + " !Expression UDF(pythonUDF0#19041.probability) cannot run on GPU because neither UDF implemented by class org.apache.spark.ml.functions$$$Lambda$3606/1625633331 provides a GPU implementation, nor the conf `spark.rapids.sql.rowBasedUDF.enabled` is enabled; expression ScalaUDF UDF(pythonUDF0#19041.probability) produces an unsupported type org.apache.spark.ml.linalg.VectorUDT@3bfc3ba7\n", + " @Expression pythonUDF0#19041.probability could run on GPU\n", + " @Expression pythonUDF0#19041 could run on GPU\n", + "\n", + "2022-11-25 09:35:59,893 WARN rapids.GpuOverrides: \n", + "!Exec cannot run on GPU because unsupported data types in output: org.apache.spark.ml.linalg.VectorUDT@3bfc3ba7 [rawPrediction, probability]; unsupported data types in output: org.apache.spark.ml.linalg.VectorUDT@3bfc3ba7 [rawPrediction#18908, probability#18974]; not all expressions can be replaced\n", + " @Expression orig_channel#56 could run on GPU\n", + " @Expression first_home_buyer#57 could run on GPU\n", + " @Expression loan_purpose#58 could run on GPU\n", + " @Expression property_type#59 could run on GPU\n", + " @Expression occupancy_status#60 could run on GPU\n", + " @Expression property_state#61 could run on GPU\n", + " @Expression product_type#62 could run on GPU\n", + " @Expression relocation_mortgage_indicator#63 could run on GPU\n", + " @Expression seller_name#64 could run on GPU\n", + " @Expression mod_flag#65 could run on GPU\n", + " @Expression orig_interest_rate#66 could run on GPU\n", + " @Expression orig_upb#67 could run on GPU\n", + " @Expression orig_loan_term#68 could run on GPU\n", + " @Expression orig_ltv#69 could run on GPU\n", + " @Expression orig_cltv#70 could run on GPU\n", + " @Expression num_borrowers#71 could run on GPU\n", + " @Expression dti#72 could run on GPU\n", + " @Expression borrower_credit_score#73 could run on GPU\n", + " @Expression num_units#74 could run on GPU\n", + " @Expression zip#75 could run on GPU\n", + " @Expression mortgage_insurance_percent#76 could run on GPU\n", + " @Expression current_loan_delinquency_status#77 could run on GPU\n", + " @Expression current_actual_upb#78 could run on GPU\n", + " @Expression interest_rate#79 could run on GPU\n", + " @Expression loan_age#80 could run on GPU\n", + " @Expression msa#81 could run on GPU\n", + " @Expression non_interest_bearing_upb#82 could run on GPU\n", + " @Expression delinquency_12#83 could run on GPU\n", + " !Expression rawPrediction#18908 cannot run on GPU because expression AttributeReference rawPrediction#18908 produces an unsupported type org.apache.spark.ml.linalg.VectorUDT@3bfc3ba7\n", + " @Expression prediction#18942 could run on GPU\n", + " !Expression probability#18974 cannot run on GPU because expression AttributeReference probability#18974 produces an unsupported type org.apache.spark.ml.linalg.VectorUDT@3bfc3ba7\n", + "\n", + "2022-11-25 09:36:00,975 WARN rapids.GpuOverrides: \n", + "!Exec cannot run on GPU because the Exec CollectLimitExec has been disabled, and is disabled by default because Collect Limit replacement can be slower on the GPU, if huge number of rows in a batch it could help by limiting the number of rows transferred from GPU to CPU. Set spark.rapids.sql.exec.CollectLimitExec to true if you wish to enable it\n", + " @Partitioning could run on GPU\n", + " !Exec cannot run on GPU because unsupported data types in input: org.apache.spark.ml.linalg.VectorUDT@3bfc3ba7 [probability#18974, rawPrediction#18908]; not all expressions can be replaced\n", + " @Expression cast(delinquency_12#83 as string) AS delinquency_12#19670 could run on GPU\n", + " @Expression cast(delinquency_12#83 as string) could run on GPU\n", + " @Expression delinquency_12#83 could run on GPU\n", + " @Expression cast(rawPrediction#18908 as string) AS rawPrediction#19671 could run on GPU\n", + " !Expression cast(rawPrediction#18908 as string) cannot run on GPU because Cast from org.apache.spark.ml.linalg.VectorUDT@3bfc3ba7 to StringType is not supported\n", + " !Expression rawPrediction#18908 cannot run on GPU because expression AttributeReference rawPrediction#18908 produces an unsupported type org.apache.spark.ml.linalg.VectorUDT@3bfc3ba7\n", + " @Expression cast(probability#18974 as string) AS probability#19672 could run on GPU\n", + " !Expression cast(probability#18974 as string) cannot run on GPU because Cast from org.apache.spark.ml.linalg.VectorUDT@3bfc3ba7 to StringType is not supported\n", + " !Expression probability#18974 cannot run on GPU because expression AttributeReference probability#18974 produces an unsupported type org.apache.spark.ml.linalg.VectorUDT@3bfc3ba7\n", + " @Expression cast(prediction#18942 as string) AS prediction#19673 could run on GPU\n", + " @Expression cast(prediction#18942 as string) could run on GPU\n", + " @Expression prediction#18942 could run on GPU\n", + " !Exec cannot run on GPU because unsupported data types in output: org.apache.spark.ml.linalg.VectorUDT@3bfc3ba7 [probability#18974, rawPrediction#18908]; unsupported data types in output: org.apache.spark.ml.linalg.VectorUDT@3bfc3ba7 [rawPrediction, probability]; not all expressions can be replaced\n", + " @Expression delinquency_12#83 could run on GPU\n", + " @Expression prediction#18942 could run on GPU\n", + " !Expression probability#18974 cannot run on GPU because expression AttributeReference probability#18974 produces an unsupported type org.apache.spark.ml.linalg.VectorUDT@3bfc3ba7\n", + " !Expression rawPrediction#18908 cannot run on GPU because expression AttributeReference rawPrediction#18908 produces an unsupported type org.apache.spark.ml.linalg.VectorUDT@3bfc3ba7\n", + "\n" + ] + }, { "name": "stdout", "output_type": "stream", "text": [ - "Transforming takes 3.13 seconds\n", + "Transforming takes 1.15 seconds\n", "+--------------+--------------------+--------------------+----------+\n", "|delinquency_12| rawPrediction| probability|prediction|\n", "+--------------+--------------------+--------------------+----------+\n", - "| 0|[2.57163572311401...|[0.92901364713907...| 0.0|\n", - "| 0|[2.63977861404418...|[0.93337820470333...| 0.0|\n", - "| 0|[2.50156974792480...|[0.92425179481506...| 0.0|\n", - "| 0|[2.63977861404418...|[0.93337820470333...| 0.0|\n", - "| 0|[2.09173870086669...|[0.89009761810302...| 0.0|\n", + "| 0|[10.2152490615844...|[0.99996340274810...| 0.0|\n", + "| 0|[8.85215473175048...|[0.99985694885253...| 0.0|\n", + "| 0|[8.85215473175048...|[0.99985694885253...| 0.0|\n", + "| 0|[8.85215473175048...|[0.99985694885253...| 0.0|\n", + "| 0|[10.2152490615844...|[0.99996340274810...| 0.0|\n", "+--------------+--------------------+--------------------+----------+\n", "only showing top 5 rows\n", "\n" @@ -247,15 +639,53 @@ }, { "cell_type": "code", - "execution_count": 8, + "execution_count": 7, "metadata": {}, "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "2022-11-25 09:36:01,155 WARN rapids.GpuOverrides: \n", + "! cannot run on GPU because not all expressions can be replaced; GPU does not currently support the operator class org.apache.spark.sql.execution.DeserializeToObjectExec\n", + " ! createexternalrow(prediction#18942, delinquency_12#20148, 1.0#20149, newInstance(class org.apache.spark.ml.linalg.VectorUDT).deserialize, StructField(prediction,DoubleType,true), StructField(delinquency_12,DoubleType,true), StructField(1.0,DoubleType,false), StructField(probability,org.apache.spark.ml.linalg.VectorUDT@3bfc3ba7,true)) cannot run on GPU because GPU does not currently support the operator class org.apache.spark.sql.catalyst.expressions.objects.CreateExternalRow\n", + " @Expression prediction#18942 could run on GPU\n", + " @Expression delinquency_12#20148 could run on GPU\n", + " @Expression 1.0#20149 could run on GPU\n", + " ! newInstance(class org.apache.spark.ml.linalg.VectorUDT).deserialize cannot run on GPU because GPU does not currently support the operator class org.apache.spark.sql.catalyst.expressions.objects.Invoke\n", + " ! newInstance(class org.apache.spark.ml.linalg.VectorUDT) cannot run on GPU because GPU does not currently support the operator class org.apache.spark.sql.catalyst.expressions.objects.NewInstance\n", + " !Expression probability#18974 cannot run on GPU because expression AttributeReference probability#18974 produces an unsupported type org.apache.spark.ml.linalg.VectorUDT@3bfc3ba7\n", + " !Expression obj#20154 cannot run on GPU because expression AttributeReference obj#20154 produces an unsupported type ObjectType(interface org.apache.spark.sql.Row)\n", + " !Exec cannot run on GPU because unsupported data types in input: org.apache.spark.ml.linalg.VectorUDT@3bfc3ba7 [probability#18974]; not all expressions can be replaced; unsupported data types in output: org.apache.spark.ml.linalg.VectorUDT@3bfc3ba7 [probability#18974]\n", + " @Expression prediction#18942 could run on GPU\n", + " @Expression cast(delinquency_12#83 as double) AS delinquency_12#20148 could run on GPU\n", + " @Expression cast(delinquency_12#83 as double) could run on GPU\n", + " @Expression delinquency_12#83 could run on GPU\n", + " @Expression 1.0 AS 1.0#20149 could run on GPU\n", + " @Expression 1.0 could run on GPU\n", + " !Expression probability#18974 cannot run on GPU because expression AttributeReference probability#18974 produces an unsupported type org.apache.spark.ml.linalg.VectorUDT@3bfc3ba7\n", + " !Exec cannot run on GPU because unsupported data types in output: org.apache.spark.ml.linalg.VectorUDT@3bfc3ba7 [rawPrediction, probability]; not all expressions can be replaced; unsupported data types in output: org.apache.spark.ml.linalg.VectorUDT@3bfc3ba7 [probability#18974]\n", + " @Expression delinquency_12#83 could run on GPU\n", + " @Expression prediction#18942 could run on GPU\n", + " !Expression probability#18974 cannot run on GPU because expression AttributeReference probability#18974 produces an unsupported type org.apache.spark.ml.linalg.VectorUDT@3bfc3ba7\n", + "\n", + "[Stage 72:> (0 + 1) / 1]\r" + ] + }, { "name": "stdout", "output_type": "stream", "text": [ - "Evaluation takes 0.29 seconds\n", - "Accuracy is 0.9868033296704449\n" + "Evaluation takes 1.41 seconds\n", + "Accuracy is 1.0\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "\r", + " \r" ] } ], @@ -268,7 +698,7 @@ }, { "cell_type": "code", - "execution_count": 9, + "execution_count": 8, "metadata": {}, "outputs": [], "source": [ @@ -285,7 +715,7 @@ ], "metadata": { "kernelspec": { - "display_name": "Python 3", + "display_name": "Python 3 (ipykernel)", "language": "python", "name": "python3" }, @@ -299,7 +729,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.8.2" + "version": "3.8.10" } }, "nbformat": 4, From baf227b40da5c1bd5ba2cd2db3705d56f42586ff Mon Sep 17 00:00:00 2001 From: liyuan Date: Wed, 30 Nov 2022 15:03:24 +0800 Subject: [PATCH 07/14] update agaricus notebook Signed-off-by: liyuan --- .../notebooks/python/agaricus-gpu.ipynb | 517 +++++++++++++++++- 1 file changed, 487 insertions(+), 30 deletions(-) diff --git a/examples/XGBoost-Examples/agaricus/notebooks/python/agaricus-gpu.ipynb b/examples/XGBoost-Examples/agaricus/notebooks/python/agaricus-gpu.ipynb index 9d1b1e311..cfa9ffc89 100644 --- a/examples/XGBoost-Examples/agaricus/notebooks/python/agaricus-gpu.ipynb +++ b/examples/XGBoost-Examples/agaricus/notebooks/python/agaricus-gpu.ipynb @@ -34,12 +34,15 @@ "metadata": {}, "outputs": [], "source": [ - "from ml.dmlc.xgboost4j.scala.spark import XGBoostClassificationModel, XGBoostClassifier\n", + "from xgboost.spark import SparkXGBClassifier, SparkXGBClassifierModel\n", "from pyspark.ml.evaluation import MulticlassClassificationEvaluator\n", "from pyspark.sql import SparkSession\n", "from pyspark.sql.types import FloatType, StructField, StructType\n", "from time import time\n", - "import os" + "from pyspark.conf import SparkConf\n", + "import os\n", + "os.environ['PYSPARK_PYTHON'] = \"./environment/bin/python\"\n", + "os.environ['PYSPARK_DRIVER_PYTHON'] = \"./environment/bin/python\"" ] }, { @@ -64,9 +67,70 @@ "cell_type": "code", "execution_count": 2, "metadata": {}, - "outputs": [], + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "2022-11-30 06:57:40,306 WARN util.NativeCodeLoader: Unable to load native-hadoop library for your platform... using builtin-java classes where applicable\n", + "Setting default log level to \"WARN\".\n", + "To adjust logging level use sc.setLogLevel(newLevel). For SparkR, use setLogLevel(newLevel).\n", + "2022-11-30 06:57:40,550 WARN resource.ResourceUtils: The configuration of cores (exec = 2 task = 1, runnable tasks = 2) will result in wasted resources due to resource gpu limiting the number of runnable tasks per executor to: 1. Please adjust your configuration.\n", + "2022-11-30 06:57:54,195 WARN rapids.RapidsPluginUtils: RAPIDS Accelerator 22.10.0 using cudf 22.10.0.\n", + "2022-11-30 06:57:54,210 WARN rapids.RapidsPluginUtils: spark.rapids.sql.multiThreadedRead.numThreads is set to 20.\n", + "2022-11-30 06:57:54,214 WARN rapids.RapidsPluginUtils: RAPIDS Accelerator is enabled, to disable GPU support set `spark.rapids.sql.enabled` to false.\n", + "2022-11-30 06:57:54,214 WARN rapids.RapidsPluginUtils: spark.rapids.sql.explain is set to `NOT_ON_GPU`. Set it to 'NONE' to suppress the diagnostics logging about the query placement on the GPU.\n", + "2022-11-30 06:57:54,685 WARN yarn.Client: Neither spark.yarn.jars nor spark.yarn.archive is set, falling back to uploading libraries under SPARK_HOME.\n" + ] + } + ], "source": [ - "spark = SparkSession.builder.getOrCreate()\n", + "SPARK_MASTER_URL = os.getenv(\"SPARK_MASTER_URL\", \"yarn\")\n", + "# SPARK_MASTER_URL = os.getenv(\"SPARK_MASTER_URL\", \"spark://10.19.183.210:7077\")\n", + "\n", + "# RAPIDS_JAR = os.getenv(\"RAPIDS_JAR\", \"/usr/lib/spark/jars/rapids-4-spark_2.12-22.08.0.jar\")\n", + "# RAPIDS_JAR = os.getenv(\"RAPIDS_JAR\", \"/home/yuanli/work/jars/v22.10.0/rapids-4-spark_2.12-22.10.0-20220924.131241-34.jar\")\n", + "RAPIDS_JAR = os.getenv(\"RAPIDS_JAR\", \"/home/hdoop/rapids-4-spark_2.12-22.10.0.jar\")\n", + "\n", + "\n", + "# You need to update with your real hardware resource \n", + "driverMem = os.getenv(\"DRIVER_MEM\", \"2g\")\n", + "executorMem = os.getenv(\"EXECUTOR_MEM\", \"2g\")\n", + "pinnedPoolSize = os.getenv(\"PINNED_POOL_SIZE\", \"2g\")\n", + "concurrentGpuTasks = os.getenv(\"CONCURRENT_GPU_TASKS\", \"2\")\n", + "executorCores = int(os.getenv(\"EXECUTOR_CORES\", \"2\"))\n", + "# Common spark settings\n", + "conf = SparkConf()\n", + "conf.setMaster(SPARK_MASTER_URL)\n", + "conf.setAppName(\"Microbenchmark on GPU\")\n", + "conf.set(\"spark.executor.instances\",\"1\")\n", + "conf.set(\"spark.driver.memory\", driverMem)\n", + "## The tasks will run on GPU memory, so there is no need to set a high host memory\n", + "conf.set(\"spark.executor.memory\", executorMem)\n", + "## The tasks will run on GPU cores, so there is no need to use many cpu cores\n", + "conf.set(\"spark.executor.cores\", executorCores)\n", + "\n", + "\n", + "# Plugin settings\n", + "conf.set(\"spark.executor.resource.gpu.amount\", \"1\")\n", + "conf.set(\"spark.rapids.sql.concurrentGpuTasks\", concurrentGpuTasks)\n", + "conf.set(\"spark.rapids.memory.pinnedPool.size\", pinnedPoolSize)\n", + "conf.set(\"spark.rapids.memory.gpu.allocFraction\",\"0.7\")\n", + "conf.set(\"spark.locality.wait\",\"0\")\n", + "##############note: only support value=1 https://github.com/dmlc/xgboost/blame/master/python-package/xgboost/spark/core.py#L370-L374\n", + "conf.set(\"spark.task.resource.gpu.amount\", 1) \n", + "conf.set(\"spark.rapids.sql.enabled\", \"true\") \n", + "conf.set(\"spark.plugins\", \"com.nvidia.spark.SQLPlugin\")\n", + "conf.set(\"spark.sql.cache.serializer\",\"com.nvidia.spark.ParquetCachedBatchSerializer\")\n", + "conf.set(\"spark.driver.extraClassPath\", RAPIDS_JAR)\n", + "conf.set(\"spark.executor.extraClassPath\", RAPIDS_JAR)\n", + "# conf.set(\"spark.yarn.dist.archives\", \"pyspark_venv_20221124.tar.gz#environment\")\n", + "conf.set(\"spark.archives\", \"pyspark_venv_20221125.tar.gz#environment\")\n", + "# spark.executor.resource.gpu.discoveryScript=/home/hdoop/spark-3.2.2-bin-hadoop3.2/examples/src/main/scripts/getGpusResources.sh\n", + "conf.set(\"spark.executor.resource.gpu.discoveryScript\",\"/home/hdoop/spark-3.2.2-bin-hadoop3.2/examples/src/main/scripts/getGpusResources.sh\")\n", + "# Create spark session\n", + "spark = SparkSession.builder.config(conf=conf).getOrCreate()\n", + "\n", "reader = spark.read" ] }, @@ -88,9 +152,19 @@ "schema = StructType([ StructField(x, FloatType()) for x in [label] + features ])\n", "\n", "# You need to update them to your real paths!\n", - "dataRoot = os.getenv(\"DATA_ROOT\", \"/data\")\n", - "train_data = reader.schema(schema).option('header', True).csv(dataRoot + '/agaricus/csv/train')\n", - "trans_data = reader.schema(schema).option('header', True).csv(dataRoot + '/agaricus/csv/test')" + "# You need to update them to your real paths!\n", + "dataRoot = os.getenv(\"DATA_ROOT\", \"file:///home/hdoop/work/review/pr252/datasets\")\n", + "train_path = dataRoot + \"/agaricus/csv/train/agaricus.csv\"\n", + "eval_path = dataRoot + \"/agaricus/csv/test/agaricus.csv\"\n", + "\n", + "data_format = 'csv'\n", + "has_header = 'true'\n", + "if data_format == 'csv':\n", + " train_data = reader.schema(schema).option('header',has_header).csv(train_path)\n", + " trans_data = reader.schema(schema).option('header',has_header).csv(eval_path)\n", + "else :\n", + " train_data = reader.load(train_path)\n", + " trans_data = reader.load(eval_path)" ] }, { @@ -127,14 +201,15 @@ "outputs": [], "source": [ "params = { \n", - " 'eta': 0.1,\n", - " 'missing': 0.0,\n", - " 'treeMethod': 'gpu_hist',\n", - " 'maxDepth': 2,\n", - " 'numWorkers': 1,\n", - " 'numRound' : 100,\n", + " \"tree_method\": \"gpu_hist\",\n", + " \"grow_policy\": \"depthwise\",\n", + " \"num_workers\": 1,\n", + " \"use_gpu\": \"true\",\n", "}\n", - "classifier = XGBoostClassifier(**params).setLabelCol(label).setFeaturesCols(features)" + "params['features_col'] = features\n", + "params['label_col'] = label\n", + " \n", + "classifier = SparkXGBClassifier(**params)" ] }, { @@ -163,11 +238,30 @@ "execution_count": 5, "metadata": {}, "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "If features_cols param set, then features_col param is ignored.\n", + "2022-11-30 07:00:45,526 WARN util.package: Truncated the string representation of a plan since it was too large. This behavior can be adjusted by setting 'spark.sql.debug.maxToStringFields'.\n", + "[Stage 5:> (0 + 1) / 1]\r" + ] + }, { "name": "stdout", "output_type": "stream", "text": [ - "Training takes 27.95 seconds\n" + "Training takes 13.92 seconds\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "\r", + " \r", + "/data/home/yuanli/work/reviews/pr252/pyspark_venv_20221125/lib/python3.8/site-packages/xgboost/sklearn.py:808: UserWarning: Loading a native XGBoost model with Scikit-Learn interface.\n", + " warnings.warn(\"Loading a native XGBoost model with Scikit-Learn interface.\")\n" ] } ], @@ -192,10 +286,26 @@ "cell_type": "code", "execution_count": 6, "metadata": {}, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "If features_cols param set, then features_col param is ignored.\n" + ] + } + ], + "source": [ + "model.write().overwrite().save('hdfs:///user/hdoop/test/agaricus/new-model-path')\n" + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "metadata": {}, "outputs": [], "source": [ - "model.write().overwrite().save(dataRoot + '/new-model-path')\n", - "loaded_model = XGBoostClassificationModel().load(dataRoot + '/new-model-path')" + "loaded_model = SparkXGBClassifierModel().load('hdfs:///user/hdoop/test/agaricus/new-model-path')" ] }, { @@ -207,22 +317,330 @@ }, { "cell_type": "code", - "execution_count": 7, + "execution_count": 8, "metadata": {}, "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "2022-11-30 07:01:07,030 WARN rapids.GpuOverrides: \n", + "!Exec cannot run on GPU because not all expressions can be replaced; unsupported data types in output: org.apache.spark.ml.linalg.VectorUDT@3bfc3ba7 [rawPrediction#798, probability#1062]\n", + " @Expression label#254 could run on GPU\n", + " @Expression feature_0#255 could run on GPU\n", + " @Expression feature_1#256 could run on GPU\n", + " @Expression feature_2#257 could run on GPU\n", + " @Expression feature_3#258 could run on GPU\n", + " @Expression feature_4#259 could run on GPU\n", + " @Expression feature_5#260 could run on GPU\n", + " @Expression feature_6#261 could run on GPU\n", + " @Expression feature_7#262 could run on GPU\n", + " @Expression feature_8#263 could run on GPU\n", + " @Expression feature_9#264 could run on GPU\n", + " @Expression feature_10#265 could run on GPU\n", + " @Expression feature_11#266 could run on GPU\n", + " @Expression feature_12#267 could run on GPU\n", + " @Expression feature_13#268 could run on GPU\n", + " @Expression feature_14#269 could run on GPU\n", + " @Expression feature_15#270 could run on GPU\n", + " @Expression feature_16#271 could run on GPU\n", + " @Expression feature_17#272 could run on GPU\n", + " @Expression feature_18#273 could run on GPU\n", + " @Expression feature_19#274 could run on GPU\n", + " @Expression feature_20#275 could run on GPU\n", + " @Expression feature_21#276 could run on GPU\n", + " @Expression feature_22#277 could run on GPU\n", + " @Expression feature_23#278 could run on GPU\n", + " @Expression feature_24#279 could run on GPU\n", + " @Expression feature_25#280 could run on GPU\n", + " @Expression feature_26#281 could run on GPU\n", + " @Expression feature_27#282 could run on GPU\n", + " @Expression feature_28#283 could run on GPU\n", + " @Expression feature_29#284 could run on GPU\n", + " @Expression feature_30#285 could run on GPU\n", + " @Expression feature_31#286 could run on GPU\n", + " @Expression feature_32#287 could run on GPU\n", + " @Expression feature_33#288 could run on GPU\n", + " @Expression feature_34#289 could run on GPU\n", + " @Expression feature_35#290 could run on GPU\n", + " @Expression feature_36#291 could run on GPU\n", + " @Expression feature_37#292 could run on GPU\n", + " @Expression feature_38#293 could run on GPU\n", + " @Expression feature_39#294 could run on GPU\n", + " @Expression feature_40#295 could run on GPU\n", + " @Expression feature_41#296 could run on GPU\n", + " @Expression feature_42#297 could run on GPU\n", + " @Expression feature_43#298 could run on GPU\n", + " @Expression feature_44#299 could run on GPU\n", + " @Expression feature_45#300 could run on GPU\n", + " @Expression feature_46#301 could run on GPU\n", + " @Expression feature_47#302 could run on GPU\n", + " @Expression feature_48#303 could run on GPU\n", + " @Expression feature_49#304 could run on GPU\n", + " @Expression feature_50#305 could run on GPU\n", + " @Expression feature_51#306 could run on GPU\n", + " @Expression feature_52#307 could run on GPU\n", + " @Expression feature_53#308 could run on GPU\n", + " @Expression feature_54#309 could run on GPU\n", + " @Expression feature_55#310 could run on GPU\n", + " @Expression feature_56#311 could run on GPU\n", + " @Expression feature_57#312 could run on GPU\n", + " @Expression feature_58#313 could run on GPU\n", + " @Expression feature_59#314 could run on GPU\n", + " @Expression feature_60#315 could run on GPU\n", + " @Expression feature_61#316 could run on GPU\n", + " @Expression feature_62#317 could run on GPU\n", + " @Expression feature_63#318 could run on GPU\n", + " @Expression feature_64#319 could run on GPU\n", + " @Expression feature_65#320 could run on GPU\n", + " @Expression feature_66#321 could run on GPU\n", + " @Expression feature_67#322 could run on GPU\n", + " @Expression feature_68#323 could run on GPU\n", + " @Expression feature_69#324 could run on GPU\n", + " @Expression feature_70#325 could run on GPU\n", + " @Expression feature_71#326 could run on GPU\n", + " @Expression feature_72#327 could run on GPU\n", + " @Expression feature_73#328 could run on GPU\n", + " @Expression feature_74#329 could run on GPU\n", + " @Expression feature_75#330 could run on GPU\n", + " @Expression feature_76#331 could run on GPU\n", + " @Expression feature_77#332 could run on GPU\n", + " @Expression feature_78#333 could run on GPU\n", + " @Expression feature_79#334 could run on GPU\n", + " @Expression feature_80#335 could run on GPU\n", + " @Expression feature_81#336 could run on GPU\n", + " @Expression feature_82#337 could run on GPU\n", + " @Expression feature_83#338 could run on GPU\n", + " @Expression feature_84#339 could run on GPU\n", + " @Expression feature_85#340 could run on GPU\n", + " @Expression feature_86#341 could run on GPU\n", + " @Expression feature_87#342 could run on GPU\n", + " @Expression feature_88#343 could run on GPU\n", + " @Expression feature_89#344 could run on GPU\n", + " @Expression feature_90#345 could run on GPU\n", + " @Expression feature_91#346 could run on GPU\n", + " @Expression feature_92#347 could run on GPU\n", + " @Expression feature_93#348 could run on GPU\n", + " @Expression feature_94#349 could run on GPU\n", + " @Expression feature_95#350 could run on GPU\n", + " @Expression feature_96#351 could run on GPU\n", + " @Expression feature_97#352 could run on GPU\n", + " @Expression feature_98#353 could run on GPU\n", + " @Expression feature_99#354 could run on GPU\n", + " @Expression feature_100#355 could run on GPU\n", + " @Expression feature_101#356 could run on GPU\n", + " @Expression feature_102#357 could run on GPU\n", + " @Expression feature_103#358 could run on GPU\n", + " @Expression feature_104#359 could run on GPU\n", + " @Expression feature_105#360 could run on GPU\n", + " @Expression feature_106#361 could run on GPU\n", + " @Expression feature_107#362 could run on GPU\n", + " @Expression feature_108#363 could run on GPU\n", + " @Expression feature_109#364 could run on GPU\n", + " @Expression feature_110#365 could run on GPU\n", + " @Expression feature_111#366 could run on GPU\n", + " @Expression feature_112#367 could run on GPU\n", + " @Expression feature_113#368 could run on GPU\n", + " @Expression feature_114#369 could run on GPU\n", + " @Expression feature_115#370 could run on GPU\n", + " @Expression feature_116#371 could run on GPU\n", + " @Expression feature_117#372 could run on GPU\n", + " @Expression feature_118#373 could run on GPU\n", + " @Expression feature_119#374 could run on GPU\n", + " @Expression feature_120#375 could run on GPU\n", + " @Expression feature_121#376 could run on GPU\n", + " @Expression feature_122#377 could run on GPU\n", + " @Expression feature_123#378 could run on GPU\n", + " @Expression feature_124#379 could run on GPU\n", + " @Expression feature_125#380 could run on GPU\n", + " !Expression UDF(pythonUDF0#1327.rawPrediction) AS rawPrediction#798 cannot run on GPU because expression Alias UDF(pythonUDF0#1327.rawPrediction) AS rawPrediction#798 produces an unsupported type org.apache.spark.ml.linalg.VectorUDT@3bfc3ba7; input expression ScalaUDF UDF(pythonUDF0#1327.rawPrediction) (org.apache.spark.ml.linalg.VectorUDT@3bfc3ba7 is not supported)\n", + " !Expression UDF(pythonUDF0#1327.rawPrediction) cannot run on GPU because neither UDF implemented by class org.apache.spark.ml.functions$$$Lambda$3659/488666387 provides a GPU implementation, nor the conf `spark.rapids.sql.rowBasedUDF.enabled` is enabled; expression ScalaUDF UDF(pythonUDF0#1327.rawPrediction) produces an unsupported type org.apache.spark.ml.linalg.VectorUDT@3bfc3ba7\n", + " @Expression pythonUDF0#1327.rawPrediction could run on GPU\n", + " @Expression pythonUDF0#1327 could run on GPU\n", + " @Expression pythonUDF0#1327.prediction AS prediction#931 could run on GPU\n", + " @Expression pythonUDF0#1327.prediction could run on GPU\n", + " @Expression pythonUDF0#1327 could run on GPU\n", + " !Expression UDF(pythonUDF0#1327.probability) AS probability#1062 cannot run on GPU because expression Alias UDF(pythonUDF0#1327.probability) AS probability#1062 produces an unsupported type org.apache.spark.ml.linalg.VectorUDT@3bfc3ba7; input expression ScalaUDF UDF(pythonUDF0#1327.probability) (org.apache.spark.ml.linalg.VectorUDT@3bfc3ba7 is not supported)\n", + " !Expression UDF(pythonUDF0#1327.probability) cannot run on GPU because neither UDF implemented by class org.apache.spark.ml.functions$$$Lambda$3659/488666387 provides a GPU implementation, nor the conf `spark.rapids.sql.rowBasedUDF.enabled` is enabled; expression ScalaUDF UDF(pythonUDF0#1327.probability) produces an unsupported type org.apache.spark.ml.linalg.VectorUDT@3bfc3ba7\n", + " @Expression pythonUDF0#1327.probability could run on GPU\n", + " @Expression pythonUDF0#1327 could run on GPU\n", + "\n", + "2022-11-30 07:01:07,071 WARN rapids.GpuOverrides: \n", + "!Exec cannot run on GPU because unsupported data types in output: org.apache.spark.ml.linalg.VectorUDT@3bfc3ba7 [rawPrediction, probability]; not all expressions can be replaced; unsupported data types in output: org.apache.spark.ml.linalg.VectorUDT@3bfc3ba7 [rawPrediction#798, probability#1062]\n", + " @Expression label#254 could run on GPU\n", + " @Expression feature_0#255 could run on GPU\n", + " @Expression feature_1#256 could run on GPU\n", + " @Expression feature_2#257 could run on GPU\n", + " @Expression feature_3#258 could run on GPU\n", + " @Expression feature_4#259 could run on GPU\n", + " @Expression feature_5#260 could run on GPU\n", + " @Expression feature_6#261 could run on GPU\n", + " @Expression feature_7#262 could run on GPU\n", + " @Expression feature_8#263 could run on GPU\n", + " @Expression feature_9#264 could run on GPU\n", + " @Expression feature_10#265 could run on GPU\n", + " @Expression feature_11#266 could run on GPU\n", + " @Expression feature_12#267 could run on GPU\n", + " @Expression feature_13#268 could run on GPU\n", + " @Expression feature_14#269 could run on GPU\n", + " @Expression feature_15#270 could run on GPU\n", + " @Expression feature_16#271 could run on GPU\n", + " @Expression feature_17#272 could run on GPU\n", + " @Expression feature_18#273 could run on GPU\n", + " @Expression feature_19#274 could run on GPU\n", + " @Expression feature_20#275 could run on GPU\n", + " @Expression feature_21#276 could run on GPU\n", + " @Expression feature_22#277 could run on GPU\n", + " @Expression feature_23#278 could run on GPU\n", + " @Expression feature_24#279 could run on GPU\n", + " @Expression feature_25#280 could run on GPU\n", + " @Expression feature_26#281 could run on GPU\n", + " @Expression feature_27#282 could run on GPU\n", + " @Expression feature_28#283 could run on GPU\n", + " @Expression feature_29#284 could run on GPU\n", + " @Expression feature_30#285 could run on GPU\n", + " @Expression feature_31#286 could run on GPU\n", + " @Expression feature_32#287 could run on GPU\n", + " @Expression feature_33#288 could run on GPU\n", + " @Expression feature_34#289 could run on GPU\n", + " @Expression feature_35#290 could run on GPU\n", + " @Expression feature_36#291 could run on GPU\n", + " @Expression feature_37#292 could run on GPU\n", + " @Expression feature_38#293 could run on GPU\n", + " @Expression feature_39#294 could run on GPU\n", + " @Expression feature_40#295 could run on GPU\n", + " @Expression feature_41#296 could run on GPU\n", + " @Expression feature_42#297 could run on GPU\n", + " @Expression feature_43#298 could run on GPU\n", + " @Expression feature_44#299 could run on GPU\n", + " @Expression feature_45#300 could run on GPU\n", + " @Expression feature_46#301 could run on GPU\n", + " @Expression feature_47#302 could run on GPU\n", + " @Expression feature_48#303 could run on GPU\n", + " @Expression feature_49#304 could run on GPU\n", + " @Expression feature_50#305 could run on GPU\n", + " @Expression feature_51#306 could run on GPU\n", + " @Expression feature_52#307 could run on GPU\n", + " @Expression feature_53#308 could run on GPU\n", + " @Expression feature_54#309 could run on GPU\n", + " @Expression feature_55#310 could run on GPU\n", + " @Expression feature_56#311 could run on GPU\n", + " @Expression feature_57#312 could run on GPU\n", + " @Expression feature_58#313 could run on GPU\n", + " @Expression feature_59#314 could run on GPU\n", + " @Expression feature_60#315 could run on GPU\n", + " @Expression feature_61#316 could run on GPU\n", + " @Expression feature_62#317 could run on GPU\n", + " @Expression feature_63#318 could run on GPU\n", + " @Expression feature_64#319 could run on GPU\n", + " @Expression feature_65#320 could run on GPU\n", + " @Expression feature_66#321 could run on GPU\n", + " @Expression feature_67#322 could run on GPU\n", + " @Expression feature_68#323 could run on GPU\n", + " @Expression feature_69#324 could run on GPU\n", + " @Expression feature_70#325 could run on GPU\n", + " @Expression feature_71#326 could run on GPU\n", + " @Expression feature_72#327 could run on GPU\n", + " @Expression feature_73#328 could run on GPU\n", + " @Expression feature_74#329 could run on GPU\n", + " @Expression feature_75#330 could run on GPU\n", + " @Expression feature_76#331 could run on GPU\n", + " @Expression feature_77#332 could run on GPU\n", + " @Expression feature_78#333 could run on GPU\n", + " @Expression feature_79#334 could run on GPU\n", + " @Expression feature_80#335 could run on GPU\n", + " @Expression feature_81#336 could run on GPU\n", + " @Expression feature_82#337 could run on GPU\n", + " @Expression feature_83#338 could run on GPU\n", + " @Expression feature_84#339 could run on GPU\n", + " @Expression feature_85#340 could run on GPU\n", + " @Expression feature_86#341 could run on GPU\n", + " @Expression feature_87#342 could run on GPU\n", + " @Expression feature_88#343 could run on GPU\n", + " @Expression feature_89#344 could run on GPU\n", + " @Expression feature_90#345 could run on GPU\n", + " @Expression feature_91#346 could run on GPU\n", + " @Expression feature_92#347 could run on GPU\n", + " @Expression feature_93#348 could run on GPU\n", + " @Expression feature_94#349 could run on GPU\n", + " @Expression feature_95#350 could run on GPU\n", + " @Expression feature_96#351 could run on GPU\n", + " @Expression feature_97#352 could run on GPU\n", + " @Expression feature_98#353 could run on GPU\n", + " @Expression feature_99#354 could run on GPU\n", + " @Expression feature_100#355 could run on GPU\n", + " @Expression feature_101#356 could run on GPU\n", + " @Expression feature_102#357 could run on GPU\n", + " @Expression feature_103#358 could run on GPU\n", + " @Expression feature_104#359 could run on GPU\n", + " @Expression feature_105#360 could run on GPU\n", + " @Expression feature_106#361 could run on GPU\n", + " @Expression feature_107#362 could run on GPU\n", + " @Expression feature_108#363 could run on GPU\n", + " @Expression feature_109#364 could run on GPU\n", + " @Expression feature_110#365 could run on GPU\n", + " @Expression feature_111#366 could run on GPU\n", + " @Expression feature_112#367 could run on GPU\n", + " @Expression feature_113#368 could run on GPU\n", + " @Expression feature_114#369 could run on GPU\n", + " @Expression feature_115#370 could run on GPU\n", + " @Expression feature_116#371 could run on GPU\n", + " @Expression feature_117#372 could run on GPU\n", + " @Expression feature_118#373 could run on GPU\n", + " @Expression feature_119#374 could run on GPU\n", + " @Expression feature_120#375 could run on GPU\n", + " @Expression feature_121#376 could run on GPU\n", + " @Expression feature_122#377 could run on GPU\n", + " @Expression feature_123#378 could run on GPU\n", + " @Expression feature_124#379 could run on GPU\n", + " @Expression feature_125#380 could run on GPU\n", + " !Expression rawPrediction#798 cannot run on GPU because expression AttributeReference rawPrediction#798 produces an unsupported type org.apache.spark.ml.linalg.VectorUDT@3bfc3ba7\n", + " @Expression prediction#931 could run on GPU\n", + " !Expression probability#1062 cannot run on GPU because expression AttributeReference probability#1062 produces an unsupported type org.apache.spark.ml.linalg.VectorUDT@3bfc3ba7\n", + "\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "2022-11-30 07:01:09,857 WARN rapids.GpuOverrides: \n", + "!Exec cannot run on GPU because the Exec CollectLimitExec has been disabled, and is disabled by default because Collect Limit replacement can be slower on the GPU, if huge number of rows in a batch it could help by limiting the number of rows transferred from GPU to CPU. Set spark.rapids.sql.exec.CollectLimitExec to true if you wish to enable it\n", + " @Partitioning could run on GPU\n", + " !Exec cannot run on GPU because unsupported data types in input: org.apache.spark.ml.linalg.VectorUDT@3bfc3ba7 [probability#1062, rawPrediction#798]; not all expressions can be replaced\n", + " @Expression cast(label#254 as string) AS label#3936 could run on GPU\n", + " @Expression cast(label#254 as string) could run on GPU\n", + " @Expression label#254 could run on GPU\n", + " @Expression cast(rawPrediction#798 as string) AS rawPrediction#3937 could run on GPU\n", + " !Expression cast(rawPrediction#798 as string) cannot run on GPU because Cast from org.apache.spark.ml.linalg.VectorUDT@3bfc3ba7 to StringType is not supported\n", + " !Expression rawPrediction#798 cannot run on GPU because expression AttributeReference rawPrediction#798 produces an unsupported type org.apache.spark.ml.linalg.VectorUDT@3bfc3ba7\n", + " @Expression cast(probability#1062 as string) AS probability#3938 could run on GPU\n", + " !Expression cast(probability#1062 as string) cannot run on GPU because Cast from org.apache.spark.ml.linalg.VectorUDT@3bfc3ba7 to StringType is not supported\n", + " !Expression probability#1062 cannot run on GPU because expression AttributeReference probability#1062 produces an unsupported type org.apache.spark.ml.linalg.VectorUDT@3bfc3ba7\n", + " @Expression cast(prediction#931 as string) AS prediction#3939 could run on GPU\n", + " @Expression cast(prediction#931 as string) could run on GPU\n", + " @Expression prediction#931 could run on GPU\n", + " !Exec cannot run on GPU because unsupported data types in output: org.apache.spark.ml.linalg.VectorUDT@3bfc3ba7 [rawPrediction, probability]; unsupported data types in output: org.apache.spark.ml.linalg.VectorUDT@3bfc3ba7 [probability#1062, rawPrediction#798]; not all expressions can be replaced\n", + " @Expression label#254 could run on GPU\n", + " @Expression prediction#931 could run on GPU\n", + " !Expression probability#1062 cannot run on GPU because expression AttributeReference probability#1062 produces an unsupported type org.apache.spark.ml.linalg.VectorUDT@3bfc3ba7\n", + " !Expression rawPrediction#798 cannot run on GPU because expression AttributeReference rawPrediction#798 produces an unsupported type org.apache.spark.ml.linalg.VectorUDT@3bfc3ba7\n", + "\n" + ] + }, { "name": "stdout", "output_type": "stream", "text": [ - "Transformation takes 2.63 seconds\n", + "Transformation takes 3.26 seconds\n", "+-----+--------------------+--------------------+----------+\n", "|label| rawPrediction| probability|prediction|\n", "+-----+--------------------+--------------------+----------+\n", - "| 1.0|[-0.9667757749557...|[0.03322422504425...| 1.0|\n", - "| 0.0|[-0.0080436170101...|[0.99195638298988...| 0.0|\n", - "| 0.0|[-0.0080436170101...|[0.99195638298988...| 0.0|\n", - "| 0.0|[-0.1416745483875...|[0.85832545161247...| 0.0|\n", - "| 0.0|[-0.0747678577899...|[0.92523214221000...| 0.0|\n", + "| 1.0|[-9.6646747589111...|[6.35385513305664...| 1.0|\n", + "| 0.0|[-8.3923015594482...|[2.26557254791259...| 1.0|\n", + "| 0.0|[-8.0568389892578...|[3.16858291625976...| 1.0|\n", + "| 0.0|[1.91234850883483...|[0.87128275632858...| 0.0|\n", + "| 0.0|[-8.5582475662231...|[1.91867351531982...| 1.0|\n", "+-----+--------------------+--------------------+----------+\n", "only showing top 5 rows\n", "\n" @@ -247,15 +665,54 @@ }, { "cell_type": "code", - "execution_count": 8, + "execution_count": 9, "metadata": {}, "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "2022-11-30 07:01:10,292 WARN rapids.GpuOverrides: \n", + "! cannot run on GPU because not all expressions can be replaced; GPU does not currently support the operator class org.apache.spark.sql.execution.DeserializeToObjectExec\n", + " ! createexternalrow(prediction#931, label#5899, 1.0#5900, newInstance(class org.apache.spark.ml.linalg.VectorUDT).deserialize, StructField(prediction,DoubleType,true), StructField(label,DoubleType,true), StructField(1.0,DoubleType,false), StructField(probability,org.apache.spark.ml.linalg.VectorUDT@3bfc3ba7,true)) cannot run on GPU because GPU does not currently support the operator class org.apache.spark.sql.catalyst.expressions.objects.CreateExternalRow\n", + " @Expression prediction#931 could run on GPU\n", + " @Expression label#5899 could run on GPU\n", + " @Expression 1.0#5900 could run on GPU\n", + " ! newInstance(class org.apache.spark.ml.linalg.VectorUDT).deserialize cannot run on GPU because GPU does not currently support the operator class org.apache.spark.sql.catalyst.expressions.objects.Invoke\n", + " ! newInstance(class org.apache.spark.ml.linalg.VectorUDT) cannot run on GPU because GPU does not currently support the operator class org.apache.spark.sql.catalyst.expressions.objects.NewInstance\n", + " !Expression probability#1062 cannot run on GPU because expression AttributeReference probability#1062 produces an unsupported type org.apache.spark.ml.linalg.VectorUDT@3bfc3ba7\n", + " !Expression obj#5905 cannot run on GPU because expression AttributeReference obj#5905 produces an unsupported type ObjectType(interface org.apache.spark.sql.Row)\n", + " !Exec cannot run on GPU because not all expressions can be replaced; unsupported data types in output: org.apache.spark.ml.linalg.VectorUDT@3bfc3ba7 [probability#1062]; unsupported data types in input: org.apache.spark.ml.linalg.VectorUDT@3bfc3ba7 [probability#1062]\n", + " @Expression prediction#931 could run on GPU\n", + " @Expression cast(label#254 as double) AS label#5899 could run on GPU\n", + " @Expression cast(label#254 as double) could run on GPU\n", + " @Expression label#254 could run on GPU\n", + " @Expression 1.0 AS 1.0#5900 could run on GPU\n", + " @Expression 1.0 could run on GPU\n", + " !Expression probability#1062 cannot run on GPU because expression AttributeReference probability#1062 produces an unsupported type org.apache.spark.ml.linalg.VectorUDT@3bfc3ba7\n", + " !Exec cannot run on GPU because unsupported data types in output: org.apache.spark.ml.linalg.VectorUDT@3bfc3ba7 [rawPrediction, probability]; not all expressions can be replaced; unsupported data types in output: org.apache.spark.ml.linalg.VectorUDT@3bfc3ba7 [probability#1062]\n", + " @Expression label#254 could run on GPU\n", + " @Expression prediction#931 could run on GPU\n", + " !Expression probability#1062 cannot run on GPU because expression AttributeReference probability#1062 produces an unsupported type org.apache.spark.ml.linalg.VectorUDT@3bfc3ba7\n", + "\n" + ] + }, { "name": "stdout", "output_type": "stream", "text": [ - "Evaluation takes 0.29 seconds\n", - "Accuracy is 0.9987577063864658\n" + "Evaluation takes 1.0 seconds\n", + "Accuracy is 0.9069677632722861\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "\r", + "[Stage 12:> (0 + 1) / 1]\r", + "\r", + " \r" ] } ], @@ -275,7 +732,7 @@ }, { "cell_type": "code", - "execution_count": 9, + "execution_count": 10, "metadata": {}, "outputs": [], "source": [ @@ -292,7 +749,7 @@ ], "metadata": { "kernelspec": { - "display_name": "Python 3", + "display_name": "Python 3 (ipykernel)", "language": "python", "name": "python3" }, @@ -306,7 +763,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.8.2" + "version": "3.8.10" } }, "nbformat": 4, From c6bc5c292c0992755358a0dc58c11c3b636a8cf9 Mon Sep 17 00:00:00 2001 From: liyuan Date: Wed, 30 Nov 2022 16:05:48 +0800 Subject: [PATCH 08/14] update taxi Regressor and crossvalidator notebooks Signed-off-by: liyuan --- .../taxi/notebooks/python/cv-taxi-gpu.ipynb | 277 +++++++++++++++--- .../taxi/notebooks/python/taxi-gpu.ipynb | 232 ++++++++++++--- 2 files changed, 424 insertions(+), 85 deletions(-) diff --git a/examples/XGBoost-Examples/taxi/notebooks/python/cv-taxi-gpu.ipynb b/examples/XGBoost-Examples/taxi/notebooks/python/cv-taxi-gpu.ipynb index f7530c133..9a017dab9 100644 --- a/examples/XGBoost-Examples/taxi/notebooks/python/cv-taxi-gpu.ipynb +++ b/examples/XGBoost-Examples/taxi/notebooks/python/cv-taxi-gpu.ipynb @@ -14,10 +14,7 @@ " 1. NumPy\n", " 2. cudf jar\n", " 2. xgboost4j jar\n", - " 3. xgboost4j-spark jar\n", - " \n", - "Note: For PySpark based XGBoost, please refer to the [Spark-RAPIDS-examples 22.04 branch](https://github.com/NVIDIA/spark-rapids-examples/tree/branch-22.04) that\n", - "uses [NVIDIA’s Spark XGBoost version](https://repo1.maven.org/maven2/com/nvidia/xgboost4j-spark_3.0/1.4.2-0.3.0/)." + " 3. xgboost4j-spark jar" ] }, { @@ -33,14 +30,16 @@ "metadata": {}, "outputs": [], "source": [ - "from ml.dmlc.xgboost4j.scala.spark import XGBoostRegressionModel, XGBoostRegressor\n", - "from ml.dmlc.xgboost4j.scala.spark.rapids import CrossValidator\n", + "from xgboost.spark import SparkXGBRegressor, SparkXGBRegressorModel\n", + "from pyspark.ml.tuning import ParamGridBuilder, CrossValidator\n", "from pyspark.ml.evaluation import RegressionEvaluator\n", - "from pyspark.ml.tuning import ParamGridBuilder\n", "from pyspark.sql import SparkSession\n", "from pyspark.sql.types import FloatType, IntegerType, StructField, StructType\n", "from time import time\n", - "import os" + "from pyspark.conf import SparkConf\n", + "import os\n", + "os.environ['PYSPARK_PYTHON'] = \"./environment/bin/python\"\n", + "os.environ['PYSPARK_DRIVER_PYTHON'] = \"./environment/bin/python\"" ] }, { @@ -61,9 +60,71 @@ "cell_type": "code", "execution_count": 2, "metadata": {}, - "outputs": [], + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "2022-11-30 08:02:09,748 WARN util.NativeCodeLoader: Unable to load native-hadoop library for your platform... using builtin-java classes where applicable\n", + "Setting default log level to \"WARN\".\n", + "To adjust logging level use sc.setLogLevel(newLevel). For SparkR, use setLogLevel(newLevel).\n", + "2022-11-30 08:02:10,103 WARN resource.ResourceUtils: The configuration of cores (exec = 2 task = 1, runnable tasks = 2) will result in wasted resources due to resource gpu limiting the number of runnable tasks per executor to: 1. Please adjust your configuration.\n", + "2022-11-30 08:02:23,737 WARN rapids.RapidsPluginUtils: RAPIDS Accelerator 22.10.0 using cudf 22.10.0.\n", + "2022-11-30 08:02:23,752 WARN rapids.RapidsPluginUtils: spark.rapids.sql.multiThreadedRead.numThreads is set to 20.\n", + "2022-11-30 08:02:23,756 WARN rapids.RapidsPluginUtils: RAPIDS Accelerator is enabled, to disable GPU support set `spark.rapids.sql.enabled` to false.\n", + "2022-11-30 08:02:23,757 WARN rapids.RapidsPluginUtils: spark.rapids.sql.explain is set to `NOT_ON_GPU`. Set it to 'NONE' to suppress the diagnostics logging about the query placement on the GPU.\n", + "2022-11-30 08:02:24,226 WARN yarn.Client: Neither spark.yarn.jars nor spark.yarn.archive is set, falling back to uploading libraries under SPARK_HOME.\n" + ] + } + ], "source": [ - "spark = SparkSession.builder.appName(\"taxi-cv-gpu-python\").getOrCreate()" + "SPARK_MASTER_URL = os.getenv(\"SPARK_MASTER_URL\", \"yarn\")\n", + "# SPARK_MASTER_URL = os.getenv(\"SPARK_MASTER_URL\", \"spark://10.19.183.210:7077\")\n", + "\n", + "# RAPIDS_JAR = os.getenv(\"RAPIDS_JAR\", \"/usr/lib/spark/jars/rapids-4-spark_2.12-22.08.0.jar\")\n", + "# RAPIDS_JAR = os.getenv(\"RAPIDS_JAR\", \"/home/yuanli/work/jars/v22.10.0/rapids-4-spark_2.12-22.10.0-20220924.131241-34.jar\")\n", + "RAPIDS_JAR = os.getenv(\"RAPIDS_JAR\", \"/home/hdoop/rapids-4-spark_2.12-22.10.0.jar\")\n", + "\n", + "\n", + "# You need to update with your real hardware resource \n", + "driverMem = os.getenv(\"DRIVER_MEM\", \"2g\")\n", + "executorMem = os.getenv(\"EXECUTOR_MEM\", \"2g\")\n", + "pinnedPoolSize = os.getenv(\"PINNED_POOL_SIZE\", \"2g\")\n", + "concurrentGpuTasks = os.getenv(\"CONCURRENT_GPU_TASKS\", \"2\")\n", + "executorCores = int(os.getenv(\"EXECUTOR_CORES\", \"2\"))\n", + "# Common spark settings\n", + "conf = SparkConf()\n", + "conf.setMaster(SPARK_MASTER_URL)\n", + "conf.setAppName(\"Microbenchmark on GPU\")\n", + "conf.set(\"spark.executor.instances\",\"1\")\n", + "conf.set(\"spark.driver.memory\", driverMem)\n", + "## The tasks will run on GPU memory, so there is no need to set a high host memory\n", + "conf.set(\"spark.executor.memory\", executorMem)\n", + "## The tasks will run on GPU cores, so there is no need to use many cpu cores\n", + "conf.set(\"spark.executor.cores\", executorCores)\n", + "\n", + "\n", + "# Plugin settings\n", + "conf.set(\"spark.executor.resource.gpu.amount\", \"1\")\n", + "conf.set(\"spark.rapids.sql.concurrentGpuTasks\", concurrentGpuTasks)\n", + "conf.set(\"spark.rapids.memory.pinnedPool.size\", pinnedPoolSize)\n", + "conf.set(\"spark.rapids.memory.gpu.allocFraction\",\"0.7\")\n", + "conf.set(\"spark.locality.wait\",\"0\")\n", + "##############note: only support value=1 https://github.com/dmlc/xgboost/blame/master/python-package/xgboost/spark/core.py#L370-L374\n", + "conf.set(\"spark.task.resource.gpu.amount\", 1) \n", + "conf.set(\"spark.rapids.sql.enabled\", \"true\") \n", + "conf.set(\"spark.plugins\", \"com.nvidia.spark.SQLPlugin\")\n", + "conf.set(\"spark.sql.cache.serializer\",\"com.nvidia.spark.ParquetCachedBatchSerializer\")\n", + "conf.set(\"spark.driver.extraClassPath\", RAPIDS_JAR)\n", + "conf.set(\"spark.executor.extraClassPath\", RAPIDS_JAR)\n", + "# conf.set(\"spark.yarn.dist.archives\", \"pyspark_venv_20221124.tar.gz#environment\")\n", + "conf.set(\"spark.archives\", \"pyspark_venv_20221125.tar.gz#environment\")\n", + "# spark.executor.resource.gpu.discoveryScript=/home/hdoop/spark-3.2.2-bin-hadoop3.2/examples/src/main/scripts/getGpusResources.sh\n", + "conf.set(\"spark.executor.resource.gpu.discoveryScript\",\"/home/hdoop/spark-3.2.2-bin-hadoop3.2/examples/src/main/scripts/getGpusResources.sh\")\n", + "# Create spark session\n", + "spark = SparkSession.builder.config(conf=conf).getOrCreate()\n", + "\n", + "reader = spark.read" ] }, { @@ -102,9 +163,18 @@ "features = [ x.name for x in schema if x.name != label ]\n", "\n", "# You need to update them to your real paths!\n", - "dataRoot = os.getenv(\"DATA_ROOT\", \"/data\")\n", - "train_data = spark.read.parquet(dataRoot + '/taxi/parquet/train')\n", - "trans_data = spark.read.parquet(dataRoot + '/taxi/parquet/eval')" + "dataRoot = os.getenv(\"DATA_ROOT\", \"file:///home/yuanli/work/reviews/pr252/datasets\")\n", + "train_path = dataRoot + \"/taxi/csv/train/taxi-small.csv\"\n", + "eval_path = dataRoot + \"/taxi/csv/test/taxi-small.csv\"\n", + "\n", + "data_format = 'csv'\n", + "has_header = 'true'\n", + "if data_format == 'csv':\n", + " train_data = reader.schema(schema).option('header',has_header).csv(train_path)\n", + " trans_data = reader.schema(schema).option('header',has_header).csv(eval_path)\n", + "else :\n", + " train_data = reader.load(train_path)\n", + " trans_data = reader.load(eval_path)" ] }, { @@ -121,29 +191,29 @@ "outputs": [], "source": [ "# First build a regressor of GPU version using *setFeaturesCols* to set feature columns\n", - "params = {\n", - " 'eta': 0.05,\n", - " 'maxDepth': 8,\n", - " 'subsample': 0.8,\n", - " 'gamma': 1.0,\n", - " 'numRound': 100,\n", - " 'numWorkers': 1,\n", - " 'treeMethod': 'gpu_hist',\n", + "params = { \n", + " \"tree_method\": \"gpu_hist\",\n", + " \"grow_policy\": \"depthwise\",\n", + " \"num_workers\": 1,\n", + " \"use_gpu\": \"true\",\n", "}\n", - "regressor = XGBoostRegressor(**params).setLabelCol(label).setFeaturesCols(features)\n", + "params['features_col'] = features\n", + "params['label_col'] = label\n", + "\n", + "regressor = SparkXGBRegressor(**params)\n", "# Then build the evaluator and the hyperparameters\n", "evaluator = (RegressionEvaluator()\n", " .setLabelCol(label))\n", "param_grid = (ParamGridBuilder()\n", - " .addGrid(regressor.maxDepth, [3, 6])\n", - " .addGrid(regressor.numRound, [100, 200])\n", + " .addGrid(regressor.max_depth, [3, 6])\n", + " .addGrid(regressor.n_estimators, [100, 200])\n", " .build())\n", "# Finally the corss validator\n", "cross_validator = (CrossValidator()\n", " .setEstimator(regressor)\n", " .setEvaluator(evaluator)\n", " .setEstimatorParamMaps(param_grid)\n", - " .setNumFolds(3))" + " .setNumFolds(2))" ] }, { @@ -158,11 +228,108 @@ "execution_count": 5, "metadata": {}, "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "If features_cols param set, then features_col param is ignored.\n", + "/data/home/yuanli/work/reviews/pr252/pyspark_venv_20221125/lib/python3.8/site-packages/xgboost/sklearn.py:808: UserWarning: Loading a native XGBoost model with Scikit-Learn interface.\n", + " warnings.warn(\"Loading a native XGBoost model with Scikit-Learn interface.\")\n", + "2022-11-30 08:03:14,308 WARN rapids.GpuOverrides: \n", + "! cannot run on GPU because not all expressions can be replaced; GPU does not currently support the operator class org.apache.spark.sql.execution.DeserializeToObjectExec\n", + " ! createexternalrow(prediction#889, fare_amount#890, 1.0#891, StructField(prediction,DoubleType,true), StructField(fare_amount,DoubleType,true), StructField(1.0,DoubleType,false)) cannot run on GPU because GPU does not currently support the operator class org.apache.spark.sql.catalyst.expressions.objects.CreateExternalRow\n", + " @Expression prediction#889 could run on GPU\n", + " @Expression fare_amount#890 could run on GPU\n", + " @Expression 1.0#891 could run on GPU\n", + " !Expression obj#895 cannot run on GPU because expression AttributeReference obj#895 produces an unsupported type ObjectType(interface org.apache.spark.sql.Row)\n", + "\n", + "2022-11-30 08:03:14,317 WARN util.package: Truncated the string representation of a plan since it was too large. This behavior can be adjusted by setting 'spark.sql.debug.maxToStringFields'.\n", + "If features_cols param set, then features_col param is ignored.\n", + "2022-11-30 08:03:20,073 WARN rapids.GpuOverrides: \n", + "! cannot run on GPU because not all expressions can be replaced; GPU does not currently support the operator class org.apache.spark.sql.execution.DeserializeToObjectExec\n", + " ! createexternalrow(prediction#1789, fare_amount#1790, 1.0#1791, StructField(prediction,DoubleType,true), StructField(fare_amount,DoubleType,true), StructField(1.0,DoubleType,false)) cannot run on GPU because GPU does not currently support the operator class org.apache.spark.sql.catalyst.expressions.objects.CreateExternalRow\n", + " @Expression prediction#1789 could run on GPU\n", + " @Expression fare_amount#1790 could run on GPU\n", + " @Expression 1.0#1791 could run on GPU\n", + " !Expression obj#1795 cannot run on GPU because expression AttributeReference obj#1795 produces an unsupported type ObjectType(interface org.apache.spark.sql.Row)\n", + "\n", + "If features_cols param set, then features_col param is ignored.\n", + "2022-11-30 08:03:23,687 WARN rapids.GpuOverrides: \n", + "! cannot run on GPU because not all expressions can be replaced; GPU does not currently support the operator class org.apache.spark.sql.execution.DeserializeToObjectExec\n", + " ! createexternalrow(prediction#2689, fare_amount#2690, 1.0#2691, StructField(prediction,DoubleType,true), StructField(fare_amount,DoubleType,true), StructField(1.0,DoubleType,false)) cannot run on GPU because GPU does not currently support the operator class org.apache.spark.sql.catalyst.expressions.objects.CreateExternalRow\n", + " @Expression prediction#2689 could run on GPU\n", + " @Expression fare_amount#2690 could run on GPU\n", + " @Expression 1.0#2691 could run on GPU\n", + " !Expression obj#2695 cannot run on GPU because expression AttributeReference obj#2695 produces an unsupported type ObjectType(interface org.apache.spark.sql.Row)\n", + "\n", + "If features_cols param set, then features_col param is ignored.\n", + "2022-11-30 08:03:27,457 WARN rapids.GpuOverrides: \n", + "! cannot run on GPU because not all expressions can be replaced; GPU does not currently support the operator class org.apache.spark.sql.execution.DeserializeToObjectExec\n", + " ! createexternalrow(prediction#3589, fare_amount#3590, 1.0#3591, StructField(prediction,DoubleType,true), StructField(fare_amount,DoubleType,true), StructField(1.0,DoubleType,false)) cannot run on GPU because GPU does not currently support the operator class org.apache.spark.sql.catalyst.expressions.objects.CreateExternalRow\n", + " @Expression prediction#3589 could run on GPU\n", + " @Expression fare_amount#3590 could run on GPU\n", + " @Expression 1.0#3591 could run on GPU\n", + " !Expression obj#3595 cannot run on GPU because expression AttributeReference obj#3595 produces an unsupported type ObjectType(interface org.apache.spark.sql.Row)\n", + "\n", + "If features_cols param set, then features_col param is ignored.\n", + "2022-11-30 08:03:30,964 WARN rapids.GpuOverrides: \n", + "! cannot run on GPU because not all expressions can be replaced; GPU does not currently support the operator class org.apache.spark.sql.execution.DeserializeToObjectExec\n", + " ! createexternalrow(prediction#4659, fare_amount#4660, 1.0#4661, StructField(prediction,DoubleType,true), StructField(fare_amount,DoubleType,true), StructField(1.0,DoubleType,false)) cannot run on GPU because GPU does not currently support the operator class org.apache.spark.sql.catalyst.expressions.objects.CreateExternalRow\n", + " @Expression prediction#4659 could run on GPU\n", + " @Expression fare_amount#4660 could run on GPU\n", + " @Expression 1.0#4661 could run on GPU\n", + " !Expression obj#4665 cannot run on GPU because expression AttributeReference obj#4665 produces an unsupported type ObjectType(interface org.apache.spark.sql.Row)\n", + "\n", + "If features_cols param set, then features_col param is ignored.\n", + "2022-11-30 08:03:34,524 WARN rapids.GpuOverrides: \n", + "! cannot run on GPU because not all expressions can be replaced; GPU does not currently support the operator class org.apache.spark.sql.execution.DeserializeToObjectExec\n", + " ! createexternalrow(prediction#5559, fare_amount#5560, 1.0#5561, StructField(prediction,DoubleType,true), StructField(fare_amount,DoubleType,true), StructField(1.0,DoubleType,false)) cannot run on GPU because GPU does not currently support the operator class org.apache.spark.sql.catalyst.expressions.objects.CreateExternalRow\n", + " @Expression prediction#5559 could run on GPU\n", + " @Expression fare_amount#5560 could run on GPU\n", + " @Expression 1.0#5561 could run on GPU\n", + " !Expression obj#5565 cannot run on GPU because expression AttributeReference obj#5565 produces an unsupported type ObjectType(interface org.apache.spark.sql.Row)\n", + "\n", + "If features_cols param set, then features_col param is ignored.\n", + "2022-11-30 08:03:38,067 WARN rapids.GpuOverrides: \n", + "! cannot run on GPU because not all expressions can be replaced; GPU does not currently support the operator class org.apache.spark.sql.execution.DeserializeToObjectExec\n", + " ! createexternalrow(prediction#6459, fare_amount#6460, 1.0#6461, StructField(prediction,DoubleType,true), StructField(fare_amount,DoubleType,true), StructField(1.0,DoubleType,false)) cannot run on GPU because GPU does not currently support the operator class org.apache.spark.sql.catalyst.expressions.objects.CreateExternalRow\n", + " @Expression prediction#6459 could run on GPU\n", + " @Expression fare_amount#6460 could run on GPU\n", + " @Expression 1.0#6461 could run on GPU\n", + " !Expression obj#6465 cannot run on GPU because expression AttributeReference obj#6465 produces an unsupported type ObjectType(interface org.apache.spark.sql.Row)\n", + "\n", + "If features_cols param set, then features_col param is ignored.\n", + "2022-11-30 08:03:41,793 WARN rapids.GpuOverrides: \n", + "! cannot run on GPU because not all expressions can be replaced; GPU does not currently support the operator class org.apache.spark.sql.execution.DeserializeToObjectExec\n", + " ! createexternalrow(prediction#7359, fare_amount#7360, 1.0#7361, StructField(prediction,DoubleType,true), StructField(fare_amount,DoubleType,true), StructField(1.0,DoubleType,false)) cannot run on GPU because GPU does not currently support the operator class org.apache.spark.sql.catalyst.expressions.objects.CreateExternalRow\n", + " @Expression prediction#7359 could run on GPU\n", + " @Expression fare_amount#7360 could run on GPU\n", + " @Expression 1.0#7361 could run on GPU\n", + " !Expression obj#7365 cannot run on GPU because expression AttributeReference obj#7365 produces an unsupported type ObjectType(interface org.apache.spark.sql.Row)\n", + "\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "If features_cols param set, then features_col param is ignored.\n", + "[Stage 34:> (0 + 1) / 1]\r" + ] + }, { "name": "stdout", "output_type": "stream", "text": [ - "Cross-Validation takes 73.77 seconds\n" + "Cross-Validation takes 55.19 seconds\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "\r", + " \r" ] } ], @@ -192,16 +359,32 @@ "name": "stdout", "output_type": "stream", "text": [ - "Transforming takes 1.33 seconds\n", - "+-----------+-----------------+\n", - "|fare_amount| prediction|\n", - "+-----------+-----------------+\n", - "| 2.5|34.38509750366211|\n", - "| 45.0|37.97528839111328|\n", - "| 2.5|28.55727195739746|\n", - "| 45.0|40.39316177368164|\n", - "| 45.0|36.12188720703125|\n", - "+-----------+-----------------+\n", + "Transforming takes 0.23 seconds\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "2022-11-30 08:03:45,503 WARN rapids.GpuOverrides: \n", + "!Exec cannot run on GPU because the Exec CollectLimitExec has been disabled, and is disabled by default because Collect Limit replacement can be slower on the GPU, if huge number of rows in a batch it could help by limiting the number of rows transferred from GPU to CPU. Set spark.rapids.sql.exec.CollectLimitExec to true if you wish to enable it\n", + " @Partitioning could run on GPU\n", + "\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "+-----------+-----------+\n", + "|fare_amount| prediction|\n", + "+-----------+-----------+\n", + "| 5.0| 5.01032114|\n", + "| 34.0| 31.134758|\n", + "| 10.0|9.288980484|\n", + "| 16.5|15.33446312|\n", + "| 7.0|8.197098732|\n", + "+-----------+-----------+\n", "only showing top 5 rows\n", "\n" ] @@ -232,8 +415,22 @@ "name": "stdout", "output_type": "stream", "text": [ - "Evaluation takes 0.26 seconds\n", - "RMSE is 3.5167114187894883\n" + "Evaluation takes 0.05 seconds\n", + "RMSE is 2.055690464034438\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "2022-11-30 08:03:45,728 WARN rapids.GpuOverrides: \n", + "! cannot run on GPU because not all expressions can be replaced; GPU does not currently support the operator class org.apache.spark.sql.execution.DeserializeToObjectExec\n", + " ! createexternalrow(prediction#7645, fare_amount#8271, 1.0#8272, StructField(prediction,DoubleType,true), StructField(fare_amount,DoubleType,true), StructField(1.0,DoubleType,false)) cannot run on GPU because GPU does not currently support the operator class org.apache.spark.sql.catalyst.expressions.objects.CreateExternalRow\n", + " @Expression prediction#7645 could run on GPU\n", + " @Expression fare_amount#8271 could run on GPU\n", + " @Expression 1.0#8272 could run on GPU\n", + " !Expression obj#8276 cannot run on GPU because expression AttributeReference obj#8276 produces an unsupported type ObjectType(interface org.apache.spark.sql.Row)\n", + "\n" ] } ], @@ -263,7 +460,7 @@ ], "metadata": { "kernelspec": { - "display_name": "Python 3", + "display_name": "Python 3 (ipykernel)", "language": "python", "name": "python3" }, @@ -277,7 +474,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.8.2" + "version": "3.8.10" } }, "nbformat": 4, diff --git a/examples/XGBoost-Examples/taxi/notebooks/python/taxi-gpu.ipynb b/examples/XGBoost-Examples/taxi/notebooks/python/taxi-gpu.ipynb index 3fdfa540a..c8bf4d323 100644 --- a/examples/XGBoost-Examples/taxi/notebooks/python/taxi-gpu.ipynb +++ b/examples/XGBoost-Examples/taxi/notebooks/python/taxi-gpu.ipynb @@ -4,7 +4,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "# Introduction to XGBoost Spark3.0 with GPU\n", + "# Introduction to XGBoost Spark3.1 with GPU\n", "\n", "Taxi is an example of xgboost regressor. This notebook will show you how to load data, train the xgboost model and use this model to predict \"fare_amount\" of your taxi trip.\n", "\n", @@ -15,10 +15,7 @@ " 4. xgboost4j-spark jar\n", " 5. rapids-4-spark.jar \n", "\n", - "This notebook also illustrates the ease of porting a sample CPU based Spark xgboost4j code into GPU. There is only one change required for running Spark XGBoost on GPU. That is replacing the API `setFeaturesCol(feature)` on CPU with the new API `setFeaturesCols(features)`. This also eliminates the need for vectorization (assembling multiple feature columns in to one column) since we can read multiple columns.\n", - "\n", - "Note: For PySpark based XGBoost, please refer to the [Spark-RAPIDS-examples 22.04 branch](https://github.com/NVIDIA/spark-rapids-examples/tree/branch-22.04) that\n", - "uses [NVIDIA’s Spark XGBoost version](https://repo1.maven.org/maven2/com/nvidia/xgboost4j-spark_3.0/1.4.2-0.3.0/)." + "This notebook also illustrates the ease of porting a sample CPU based Spark xgboost4j code into GPU. There is only one change required for running Spark XGBoost on GPU. That is replacing the API `setFeaturesCol(feature)` on CPU with the new API `setFeaturesCols(features)`. This also eliminates the need for vectorization (assembling multiple feature columns in to one column) since we can read multiple columns." ] }, { @@ -34,12 +31,15 @@ "metadata": {}, "outputs": [], "source": [ - "from ml.dmlc.xgboost4j.scala.spark import XGBoostRegressionModel, XGBoostRegressor\n", + "from xgboost.spark import SparkXGBRegressor, SparkXGBRegressorModel\n", "from pyspark.ml.evaluation import RegressionEvaluator\n", "from pyspark.sql import SparkSession\n", "from pyspark.sql.types import FloatType, IntegerType, StructField, StructType\n", "from time import time\n", - "import os" + "from pyspark.conf import SparkConf\n", + "import os\n", + "os.environ['PYSPARK_PYTHON'] = \"./environment/bin/python\"\n", + "os.environ['PYSPARK_DRIVER_PYTHON'] = \"./environment/bin/python\"" ] }, { @@ -62,11 +62,72 @@ }, { "cell_type": "code", - "execution_count": 3, + "execution_count": 2, "metadata": {}, - "outputs": [], + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "2022-11-30 07:51:19,104 WARN util.NativeCodeLoader: Unable to load native-hadoop library for your platform... using builtin-java classes where applicable\n", + "Setting default log level to \"WARN\".\n", + "To adjust logging level use sc.setLogLevel(newLevel). For SparkR, use setLogLevel(newLevel).\n", + "2022-11-30 07:51:19,480 WARN resource.ResourceUtils: The configuration of cores (exec = 2 task = 1, runnable tasks = 2) will result in wasted resources due to resource gpu limiting the number of runnable tasks per executor to: 1. Please adjust your configuration.\n", + "2022-11-30 07:51:33,277 WARN rapids.RapidsPluginUtils: RAPIDS Accelerator 22.10.0 using cudf 22.10.0.\n", + "2022-11-30 07:51:33,292 WARN rapids.RapidsPluginUtils: spark.rapids.sql.multiThreadedRead.numThreads is set to 20.\n", + "2022-11-30 07:51:33,295 WARN rapids.RapidsPluginUtils: RAPIDS Accelerator is enabled, to disable GPU support set `spark.rapids.sql.enabled` to false.\n", + "2022-11-30 07:51:33,295 WARN rapids.RapidsPluginUtils: spark.rapids.sql.explain is set to `NOT_ON_GPU`. Set it to 'NONE' to suppress the diagnostics logging about the query placement on the GPU.\n", + "2022-11-30 07:51:33,798 WARN yarn.Client: Neither spark.yarn.jars nor spark.yarn.archive is set, falling back to uploading libraries under SPARK_HOME.\n" + ] + } + ], "source": [ - "spark = SparkSession.builder.getOrCreate()\n", + "SPARK_MASTER_URL = os.getenv(\"SPARK_MASTER_URL\", \"yarn\")\n", + "# SPARK_MASTER_URL = os.getenv(\"SPARK_MASTER_URL\", \"spark://10.19.183.210:7077\")\n", + "\n", + "# RAPIDS_JAR = os.getenv(\"RAPIDS_JAR\", \"/usr/lib/spark/jars/rapids-4-spark_2.12-22.08.0.jar\")\n", + "# RAPIDS_JAR = os.getenv(\"RAPIDS_JAR\", \"/home/yuanli/work/jars/v22.10.0/rapids-4-spark_2.12-22.10.0-20220924.131241-34.jar\")\n", + "RAPIDS_JAR = os.getenv(\"RAPIDS_JAR\", \"/home/hdoop/rapids-4-spark_2.12-22.10.0.jar\")\n", + "\n", + "\n", + "# You need to update with your real hardware resource \n", + "driverMem = os.getenv(\"DRIVER_MEM\", \"2g\")\n", + "executorMem = os.getenv(\"EXECUTOR_MEM\", \"2g\")\n", + "pinnedPoolSize = os.getenv(\"PINNED_POOL_SIZE\", \"2g\")\n", + "concurrentGpuTasks = os.getenv(\"CONCURRENT_GPU_TASKS\", \"2\")\n", + "executorCores = int(os.getenv(\"EXECUTOR_CORES\", \"2\"))\n", + "# Common spark settings\n", + "conf = SparkConf()\n", + "conf.setMaster(SPARK_MASTER_URL)\n", + "conf.setAppName(\"Microbenchmark on GPU\")\n", + "conf.set(\"spark.executor.instances\",\"1\")\n", + "conf.set(\"spark.driver.memory\", driverMem)\n", + "## The tasks will run on GPU memory, so there is no need to set a high host memory\n", + "conf.set(\"spark.executor.memory\", executorMem)\n", + "## The tasks will run on GPU cores, so there is no need to use many cpu cores\n", + "conf.set(\"spark.executor.cores\", executorCores)\n", + "\n", + "\n", + "# Plugin settings\n", + "conf.set(\"spark.executor.resource.gpu.amount\", \"1\")\n", + "conf.set(\"spark.rapids.sql.concurrentGpuTasks\", concurrentGpuTasks)\n", + "conf.set(\"spark.rapids.memory.pinnedPool.size\", pinnedPoolSize)\n", + "conf.set(\"spark.rapids.memory.gpu.allocFraction\",\"0.7\")\n", + "conf.set(\"spark.locality.wait\",\"0\")\n", + "##############note: only support value=1 https://github.com/dmlc/xgboost/blame/master/python-package/xgboost/spark/core.py#L370-L374\n", + "conf.set(\"spark.task.resource.gpu.amount\", 1) \n", + "conf.set(\"spark.rapids.sql.enabled\", \"true\") \n", + "conf.set(\"spark.plugins\", \"com.nvidia.spark.SQLPlugin\")\n", + "conf.set(\"spark.sql.cache.serializer\",\"com.nvidia.spark.ParquetCachedBatchSerializer\")\n", + "conf.set(\"spark.driver.extraClassPath\", RAPIDS_JAR)\n", + "conf.set(\"spark.executor.extraClassPath\", RAPIDS_JAR)\n", + "# conf.set(\"spark.yarn.dist.archives\", \"pyspark_venv_20221124.tar.gz#environment\")\n", + "conf.set(\"spark.archives\", \"pyspark_venv_20221125.tar.gz#environment\")\n", + "# spark.executor.resource.gpu.discoveryScript=/home/hdoop/spark-3.2.2-bin-hadoop3.2/examples/src/main/scripts/getGpusResources.sh\n", + "conf.set(\"spark.executor.resource.gpu.discoveryScript\",\"/home/hdoop/spark-3.2.2-bin-hadoop3.2/examples/src/main/scripts/getGpusResources.sh\")\n", + "# Create spark session\n", + "spark = SparkSession.builder.config(conf=conf).getOrCreate()\n", + "\n", "reader = spark.read" ] }, @@ -79,7 +140,7 @@ }, { "cell_type": "code", - "execution_count": 5, + "execution_count": 3, "metadata": {}, "outputs": [], "source": [ @@ -105,9 +166,18 @@ "features = [ x.name for x in schema if x.name != label ]\n", "\n", "# You need to update them to your real paths!\n", - "dataRoot = os.getenv(\"DATA_ROOT\", \"/data\")\n", - "train_data = reader.schema(schema).option('header', True).csv(dataRoot + '/taxi/csv/train')\n", - "trans_data = reader.schema(schema).option('header', True).csv(dataRoot + '/taxi/csv/test')" + "dataRoot = os.getenv(\"DATA_ROOT\", \"file:///home/yuanli/work/reviews/pr252/datasets\")\n", + "train_path = dataRoot + \"/taxi/csv/train/taxi-small.csv\"\n", + "eval_path = dataRoot + \"/taxi/csv/test/taxi-small.csv\"\n", + "\n", + "data_format = 'csv'\n", + "has_header = 'true'\n", + "if data_format == 'csv':\n", + " train_data = reader.schema(schema).option('header',has_header).csv(train_path)\n", + " trans_data = reader.schema(schema).option('header',has_header).csv(eval_path)\n", + "else :\n", + " train_data = reader.load(train_path)\n", + " trans_data = reader.load(eval_path)" ] }, { @@ -139,20 +209,21 @@ }, { "cell_type": "code", - "execution_count": 6, + "execution_count": 4, "metadata": {}, "outputs": [], "source": [ "params = { \n", - " 'eta': 0.05,\n", - " 'treeMethod': 'gpu_hist',\n", - " 'maxDepth': 8,\n", - " 'subsample': 0.8,\n", - " 'gamma': 1.0,\n", - " 'numRound': 100,\n", - " 'numWorkers': 1,\n", + " \"tree_method\": \"gpu_hist\",\n", + " \"grow_policy\": \"depthwise\",\n", + " \"num_workers\": 1,\n", + " \"use_gpu\": \"true\",\n", "}\n", - "regressor = XGBoostRegressor(**params).setLabelCol(label).setFeaturesCols(features)" + "params['features_col'] = features\n", + "params['label_col'] = label\n", + " \n", + "regressor = SparkXGBRegressor(**params)\n", + "# regressor = XGBoostRegressor(**params).setLabelCol(label).setFeaturesCols(features)" ] }, { @@ -178,16 +249,34 @@ }, { "cell_type": "code", - "execution_count": 7, + "execution_count": 5, "metadata": { "scrolled": true }, "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "If features_cols param set, then features_col param is ignored.\n", + "[Stage 2:> (0 + 1) / 1]\r" + ] + }, { "name": "stdout", "output_type": "stream", "text": [ - "Training takes 17.73 seconds\n" + "Training takes 24.08 seconds\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "\r", + " \r", + "/data/home/yuanli/work/reviews/pr252/pyspark_venv_20221125/lib/python3.8/site-packages/xgboost/sklearn.py:808: UserWarning: Loading a native XGBoost model with Scikit-Learn interface.\n", + " warnings.warn(\"Loading a native XGBoost model with Scikit-Learn interface.\")\n" ] } ], @@ -210,12 +299,28 @@ }, { "cell_type": "code", - "execution_count": 9, + "execution_count": 6, + "metadata": {}, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "If features_cols param set, then features_col param is ignored.\n" + ] + } + ], + "source": [ + "model.write().overwrite().save('hdfs:///user/hdoop/test/taxi/new-model-path')" + ] + }, + { + "cell_type": "code", + "execution_count": 7, "metadata": {}, "outputs": [], "source": [ - "model.write().overwrite().save(dataRoot + '/new-model-path')\n", - "loaded_model = XGBoostRegressionModel().load(dataRoot + '/new-model-path')" + "loaded_model = SparkXGBRegressorModel().load('hdfs:///user/hdoop/test/taxi/new-model-path')" ] }, { @@ -227,25 +332,48 @@ }, { "cell_type": "code", - "execution_count": 10, + "execution_count": 8, "metadata": { "scrolled": false }, "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "2022-11-30 07:52:27,357 WARN util.package: Truncated the string representation of a plan since it was too large. This behavior can be adjusted by setting 'spark.sql.debug.maxToStringFields'.\n" + ] + }, { "name": "stdout", "output_type": "stream", "text": [ - "Transformation takes 2.55 seconds\n", - "+------------+---------------+-------------+-----------+------------------+\n", - "| vendor_id|passenger_count|trip_distance|fare_amount| prediction|\n", - "+------------+---------------+-------------+-----------+------------------+\n", - "|1.55973043E9| 1.0| 1.1| 6.2| 5.670516490936279|\n", - "|1.55973043E9| 4.0| 2.7| 9.4|10.054250717163086|\n", - "|1.55973043E9| 1.0| 1.5| 6.1| 7.01417350769043|\n", - "|1.55973043E9| 1.0| 4.1| 12.6|14.309316635131836|\n", - "|1.55973043E9| 1.0| 4.6| 13.4|13.990922927856445|\n", - "+------------+---------------+-------------+-----------+------------------+\n", + "Transformation takes 0.93 seconds\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "2022-11-30 07:52:28,189 WARN rapids.GpuOverrides: \n", + "!Exec cannot run on GPU because the Exec CollectLimitExec has been disabled, and is disabled by default because Collect Limit replacement can be slower on the GPU, if huge number of rows in a batch it could help by limiting the number of rows transferred from GPU to CPU. Set spark.rapids.sql.exec.CollectLimitExec to true if you wish to enable it\n", + " @Partitioning could run on GPU\n", + "\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "+--------------+---------------+-------------+-----------+-----------+\n", + "| vendor_id|passenger_count|trip_distance|fare_amount| prediction|\n", + "+--------------+---------------+-------------+-----------+-----------+\n", + "|1.559730432E09| 2.0| 0.699999988| 5.0|5.046935558|\n", + "|1.559730432E09| 3.0| 10.69999981| 34.0|31.72706413|\n", + "|1.559730432E09| 1.0| 2.299999952| 10.0|9.294451714|\n", + "|1.559730432E09| 1.0| 4.400000095| 16.5|15.05233097|\n", + "|1.559730432E09| 1.0| 1.5| 7.0|8.995832443|\n", + "+--------------+---------------+-------------+-----------+-----------+\n", "only showing top 5 rows\n", "\n" ] @@ -276,7 +404,7 @@ }, { "cell_type": "code", - "execution_count": 11, + "execution_count": 9, "metadata": { "scrolled": true }, @@ -285,8 +413,22 @@ "name": "stdout", "output_type": "stream", "text": [ - "Evaluation takes 0.45 seconds\n", - "RMSE is 3.3195416959403032\n" + "Evaluation takes 0.22 seconds\n", + "RMSE is 1.9141528471228921\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "2022-11-30 07:52:28,580 WARN rapids.GpuOverrides: \n", + "! cannot run on GPU because not all expressions can be replaced; GPU does not currently support the operator class org.apache.spark.sql.execution.DeserializeToObjectExec\n", + " ! createexternalrow(prediction#87, fare_amount#728, 1.0#729, StructField(prediction,DoubleType,true), StructField(fare_amount,DoubleType,true), StructField(1.0,DoubleType,false)) cannot run on GPU because GPU does not currently support the operator class org.apache.spark.sql.catalyst.expressions.objects.CreateExternalRow\n", + " @Expression prediction#87 could run on GPU\n", + " @Expression fare_amount#728 could run on GPU\n", + " @Expression 1.0#729 could run on GPU\n", + " !Expression obj#733 cannot run on GPU because expression AttributeReference obj#733 produces an unsupported type ObjectType(interface org.apache.spark.sql.Row)\n", + "\n" ] } ], @@ -306,7 +448,7 @@ }, { "cell_type": "code", - "execution_count": 12, + "execution_count": 10, "metadata": {}, "outputs": [], "source": [ @@ -323,7 +465,7 @@ ], "metadata": { "kernelspec": { - "display_name": "Python 3", + "display_name": "Python 3 (ipykernel)", "language": "python", "name": "python3" }, @@ -337,7 +479,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.8.2" + "version": "3.8.10" } }, "nbformat": 4, From 5e4861a1c5ce3e697453a047034a9caad08ec883 Mon Sep 17 00:00:00 2001 From: liyuan Date: Wed, 30 Nov 2022 17:00:12 +0800 Subject: [PATCH 09/14] remove some test paths Signed-off-by: liyuan --- .../notebooks/python/agaricus-gpu.ipynb | 55 +++++++------------ .../notebooks/python/cv-mortgage-gpu.ipynb | 37 +++++-------- .../notebooks/python/mortgage-gpu.ipynb | 13 ++--- .../taxi/notebooks/python/cv-taxi-gpu.ipynb | 41 +++++--------- .../taxi/notebooks/python/taxi-gpu.ipynb | 55 ++++++++----------- 5 files changed, 76 insertions(+), 125 deletions(-) diff --git a/examples/XGBoost-Examples/agaricus/notebooks/python/agaricus-gpu.ipynb b/examples/XGBoost-Examples/agaricus/notebooks/python/agaricus-gpu.ipynb index cfa9ffc89..ef86626af 100644 --- a/examples/XGBoost-Examples/agaricus/notebooks/python/agaricus-gpu.ipynb +++ b/examples/XGBoost-Examples/agaricus/notebooks/python/agaricus-gpu.ipynb @@ -9,16 +9,12 @@ "Agaricus is an example of xgboost classifier for multiple classification. This notebook will show you how to load data, train the xgboost model.\n", "\n", "A few libraries required for this notebook:\n", - " 1. NumPy\n", - " 2. cudf jar\n", - " 3. xgboost4j jar\n", - " 4. xgboost4j-spark jar\n", - " 5. rapids-4-spark.jar\n", + " 1. cudf-cu11\n", + " 2. xgboost\n", + " 3. scikit-learn\n", + " 4. numpy\n", " \n", - "This notebook also illustrates the ease of porting a sample CPU based Spark xgboost4j code into GPU. There is only one change required for running Spark XGBoost on GPU. That is replacing the API `setFeaturesCol(feature)` on CPU with the new API `setFeaturesCols(features)`. This also eliminates the need for vectorization (assembling multiple feature columns in to one column) since we can read multiple columns.\n", - "\n", - "Note: For PySpark based XGBoost, please refer to the [Spark-RAPIDS-examples 22.04 branch](https://github.com/NVIDIA/spark-rapids-examples/tree/branch-22.04) that\n", - "uses [NVIDIA’s Spark XGBoost version](https://repo1.maven.org/maven2/com/nvidia/xgboost4j-spark_3.0/1.4.2-0.3.0/)." + "This notebook also illustrates the ease of porting a sample CPU based Spark xgboost4j code into GPU. There is no change required for running Spark XGBoost on GPU because both CPU and GPU call the same API. For CPU run, we need to vectorize the trained dataset before fitting data to classifier." ] }, { @@ -41,8 +37,9 @@ "from time import time\n", "from pyspark.conf import SparkConf\n", "import os\n", - "os.environ['PYSPARK_PYTHON'] = \"./environment/bin/python\"\n", - "os.environ['PYSPARK_DRIVER_PYTHON'] = \"./environment/bin/python\"" + "# if you pass/unpack the archive file and enable the environment\n", + "# os.environ['PYSPARK_PYTHON'] = \"./environment/bin/python\"\n", + "# os.environ['PYSPARK_DRIVER_PYTHON'] = \"./environment/bin/python\"" ] }, { @@ -85,13 +82,9 @@ } ], "source": [ - "SPARK_MASTER_URL = os.getenv(\"SPARK_MASTER_URL\", \"yarn\")\n", - "# SPARK_MASTER_URL = os.getenv(\"SPARK_MASTER_URL\", \"spark://10.19.183.210:7077\")\n", - "\n", - "# RAPIDS_JAR = os.getenv(\"RAPIDS_JAR\", \"/usr/lib/spark/jars/rapids-4-spark_2.12-22.08.0.jar\")\n", - "# RAPIDS_JAR = os.getenv(\"RAPIDS_JAR\", \"/home/yuanli/work/jars/v22.10.0/rapids-4-spark_2.12-22.10.0-20220924.131241-34.jar\")\n", - "RAPIDS_JAR = os.getenv(\"RAPIDS_JAR\", \"/home/hdoop/rapids-4-spark_2.12-22.10.0.jar\")\n", + "SPARK_MASTER_URL = os.getenv(\"SPARK_MASTER_URL\", \"/your-url\")\n", "\n", + "RAPIDS_JAR = os.getenv(\"RAPIDS_JAR\", \"/your-jar-path\")\n", "\n", "# You need to update with your real hardware resource \n", "driverMem = os.getenv(\"DRIVER_MEM\", \"2g\")\n", @@ -124,10 +117,10 @@ "conf.set(\"spark.sql.cache.serializer\",\"com.nvidia.spark.ParquetCachedBatchSerializer\")\n", "conf.set(\"spark.driver.extraClassPath\", RAPIDS_JAR)\n", "conf.set(\"spark.executor.extraClassPath\", RAPIDS_JAR)\n", - "# conf.set(\"spark.yarn.dist.archives\", \"pyspark_venv_20221124.tar.gz#environment\")\n", - "conf.set(\"spark.archives\", \"pyspark_venv_20221125.tar.gz#environment\")\n", - "# spark.executor.resource.gpu.discoveryScript=/home/hdoop/spark-3.2.2-bin-hadoop3.2/examples/src/main/scripts/getGpusResources.sh\n", - "conf.set(\"spark.executor.resource.gpu.discoveryScript\",\"/home/hdoop/spark-3.2.2-bin-hadoop3.2/examples/src/main/scripts/getGpusResources.sh\")\n", + "\n", + "# if you pass/unpack the archive file and enable the environment\n", + "# conf.set(\"spark.yarn.dist.archives\", \"your_pyspark_venv.tar.gz#environment\")\n", + "conf.set(\"spark.executor.resource.gpu.discoveryScript\",\"/your-path/getGpusResources.sh\")\n", "# Create spark session\n", "spark = SparkSession.builder.config(conf=conf).getOrCreate()\n", "\n", @@ -152,10 +145,9 @@ "schema = StructType([ StructField(x, FloatType()) for x in [label] + features ])\n", "\n", "# You need to update them to your real paths!\n", - "# You need to update them to your real paths!\n", - "dataRoot = os.getenv(\"DATA_ROOT\", \"file:///home/hdoop/work/review/pr252/datasets\")\n", - "train_path = dataRoot + \"/agaricus/csv/train/agaricus.csv\"\n", - "eval_path = dataRoot + \"/agaricus/csv/test/agaricus.csv\"\n", + "dataRoot = os.getenv(\"DATA_ROOT\", \"/your-path\")\n", + "train_path = dataRoot + \"/your-path\"\n", + "eval_path = dataRoot + \"/your-path\"\n", "\n", "data_format = 'csv'\n", "has_header = 'true'\n", @@ -216,11 +208,6 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "The CPU version classifier provides the API `setFeaturesCol` which only accepts a single column name, so vectorization for multiple feature columns is required.\n", - "```Python\n", - "classifier = XGBoostClassifier(**params).setLabelCol(label).setFeaturesCol('features')\n", - "```\n", - "\n", "The parameter `num_workers` should be set to the number of GPUs in Spark cluster for GPU version, while for CPU version it is usually equal to the number of the CPU cores.\n", "\n", "Concerning the tree method, GPU version only supports `gpu_hist` currently, while `hist` is designed and used here for CPU training." @@ -296,7 +283,7 @@ } ], "source": [ - "model.write().overwrite().save('hdfs:///user/hdoop/test/agaricus/new-model-path')\n" + "model.write().overwrite().save(dataRoot + '/your-path')" ] }, { @@ -305,7 +292,7 @@ "metadata": {}, "outputs": [], "source": [ - "loaded_model = SparkXGBClassifierModel().load('hdfs:///user/hdoop/test/agaricus/new-model-path')" + "loaded_model = SparkXGBClassifierModel().load(dataRoot + '/mortgage/model')" ] }, { @@ -749,7 +736,7 @@ ], "metadata": { "kernelspec": { - "display_name": "Python 3 (ipykernel)", + "display_name": "Python 3", "language": "python", "name": "python3" }, @@ -763,7 +750,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.8.10" + "version": "3.8.2" } }, "nbformat": 4, diff --git a/examples/XGBoost-Examples/mortgage/notebooks/python/cv-mortgage-gpu.ipynb b/examples/XGBoost-Examples/mortgage/notebooks/python/cv-mortgage-gpu.ipynb index a759cf53a..f9bd7b4d3 100644 --- a/examples/XGBoost-Examples/mortgage/notebooks/python/cv-mortgage-gpu.ipynb +++ b/examples/XGBoost-Examples/mortgage/notebooks/python/cv-mortgage-gpu.ipynb @@ -38,17 +38,9 @@ "from pyspark.conf import SparkConf\n", "from time import time\n", "import os\n", - "os.environ['PYSPARK_PYTHON'] = \"./environment/bin/python\"\n", - "os.environ['PYSPARK_DRIVER_PYTHON'] = \"./environment/bin/python\"\n", - "# export PYSPARK_DRIVER_PYTHON=/home/yuali_nvidia_com/review/pr232/my-env-2/bin/python\n", - "# os.environ['PYSPARK_PYTHON'] = \"/home/yuanli/work/reviews/pr252/python-vir-env/bin/python\"" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "As shown above, here `CrossValidator` is imported from package `ml.dmlc.xgboost4j.scala.spark.rapids`, not the spark's `tuning.CrossValidator`." + "# if you pass/unpack the archive file and enable the environment\n", + "# os.environ['PYSPARK_PYTHON'] = \"./environment/bin/python\"\n", + "# os.environ['PYSPARK_DRIVER_PYTHON'] = \"./environment/bin/python\"" ] }, { @@ -79,11 +71,9 @@ } ], "source": [ - "# SPARK_MASTER_URL = os.getenv(\"SPARK_MASTER_URL\", \"yarn\")\n", - "SPARK_MASTER_URL = os.getenv(\"SPARK_MASTER_URL\", \"spark://10.19.183.210:7077\")\n", + "SPARK_MASTER_URL = os.getenv(\"SPARK_MASTER_URL\", \"/your-url\")\n", "\n", - "# RAPIDS_JAR = os.getenv(\"RAPIDS_JAR\", \"/usr/lib/spark/jars/rapids-4-spark_2.12-22.08.0.jar\")\n", - "RAPIDS_JAR = os.getenv(\"RAPIDS_JAR\", \"/home/yuanli/work/jars/v22.10.0/rapids-4-spark_2.12-22.10.0-20220924.131241-34.jar\")\n", + "RAPIDS_JAR = os.getenv(\"RAPIDS_JAR\", \"/your-jar-path\")\n", "\n", "# You need to update with your real hardware resource \n", "driverMem = os.getenv(\"DRIVER_MEM\", \"2g\")\n", @@ -101,7 +91,6 @@ "## The tasks will run on GPU cores, so there is no need to use many cpu cores\n", "conf.set(\"spark.executor.cores\", executorCores)\n", "\n", - "\n", "# Plugin settings\n", "conf.set(\"spark.executor.resource.gpu.amount\", \"1\")\n", "conf.set(\"spark.rapids.sql.concurrentGpuTasks\", concurrentGpuTasks)\n", @@ -115,9 +104,9 @@ "conf.set(\"spark.sql.cache.serializer\",\"com.nvidia.spark.ParquetCachedBatchSerializer\")\n", "conf.set(\"spark.driver.extraClassPath\", RAPIDS_JAR)\n", "conf.set(\"spark.executor.extraClassPath\", RAPIDS_JAR)\n", - "# conf.set(\"spark.yarn.dist.archives\", \"pyspark_venv_20221124.tar.gz#environment\")\n", - "conf.set(\"spark.archives\", \"pyspark_venv_20221125.tar.gz#environment\")\n", - "\n", + "# if you pass/unpack the archive file and enable the environment\n", + "# conf.set(\"spark.yarn.dist.archives\", \"your_pyspark_venv.tar.gz#environment\")\n", + "conf.set(\"spark.executor.resource.gpu.discoveryScript\",\"/your-path/getGpusResources.sh\")\n", "# Create spark session\n", "spark = SparkSession.builder.config(conf=conf).getOrCreate()\n", "\n", @@ -171,9 +160,9 @@ "features = [ x.name for x in schema if x.name != label ]\n", "\n", "# You need to update them to your real paths!\n", - "dataRoot = os.getenv(\"DATA_ROOT\", \"file:///home/yuanli/work/reviews/pr252/datasets\")\n", - "train_path = dataRoot + \"/mortgage/csv/train/mortgage-small.csv\"\n", - "eval_path = dataRoot + \"/mortgage/csv/test/test.csv\"\n", + "dataRoot = os.getenv(\"DATA_ROOT\", \"/your-path\")\n", + "train_path = dataRoot + \"/your-path\"\n", + "eval_path = dataRoot + \"/your-path\"\n", "\n", "data_format = 'csv'\n", "has_header = 'true'\n", @@ -715,7 +704,7 @@ ], "metadata": { "kernelspec": { - "display_name": "Python 3 (ipykernel)", + "display_name": "Python 3", "language": "python", "name": "python3" }, @@ -729,7 +718,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.8.10" + "version": "3.8.2" } }, "nbformat": 4, diff --git a/examples/XGBoost-Examples/mortgage/notebooks/python/mortgage-gpu.ipynb b/examples/XGBoost-Examples/mortgage/notebooks/python/mortgage-gpu.ipynb index 7bd27e73e..8f41f76a0 100644 --- a/examples/XGBoost-Examples/mortgage/notebooks/python/mortgage-gpu.ipynb +++ b/examples/XGBoost-Examples/mortgage/notebooks/python/mortgage-gpu.ipynb @@ -229,10 +229,9 @@ "outputs": [], "source": [ "params = { \n", - " \"treeMethod\": \"gpu_hist\",\n", - " \"growPolicy\": \"depthwise\",\n", - " \"numRound\": 100,\n", - " \"numWorkers\": 2,\n", + " \"tree_method\": \"gpu_hist\",\n", + " \"grow_policy\": \"depthwise\",\n", + " \"num_workers\": 1,\n", " \"use_gpu\": \"true\",\n", "}\n", "params['features_col'] = features\n", @@ -245,7 +244,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "The parameter `numWorkers` should be set to the number of GPUs in Spark cluster for GPU version, while for CPU version it is usually equal to the number of the CPU cores.\n", + "The parameter `num_workers` should be set to the number of GPUs in Spark cluster for GPU version, while for CPU version it is usually equal to the number of the CPU cores.\n", "\n", "Concerning the tree method, GPU version only supports `gpu_hist` currently, while `hist` is designed and used here for CPU training." ] @@ -590,9 +589,9 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.8.13" + "version": "3.8.2" } }, "nbformat": 4, "nbformat_minor": 2 -} \ No newline at end of file +} diff --git a/examples/XGBoost-Examples/taxi/notebooks/python/cv-taxi-gpu.ipynb b/examples/XGBoost-Examples/taxi/notebooks/python/cv-taxi-gpu.ipynb index 9a017dab9..d8ed894cd 100644 --- a/examples/XGBoost-Examples/taxi/notebooks/python/cv-taxi-gpu.ipynb +++ b/examples/XGBoost-Examples/taxi/notebooks/python/cv-taxi-gpu.ipynb @@ -11,10 +11,10 @@ "Here takes the application 'Taxi' as an example.\n", "\n", "A few libraries are required for this notebook:\n", - " 1. NumPy\n", - " 2. cudf jar\n", - " 2. xgboost4j jar\n", - " 3. xgboost4j-spark jar" + " 1. cudf-cu11\n", + " 2. xgboost\n", + " 3. scikit-learn\n", + " 4. numpy" ] }, { @@ -42,13 +42,6 @@ "os.environ['PYSPARK_DRIVER_PYTHON'] = \"./environment/bin/python\"" ] }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "As shown above, here `CrossValidator` is imported from package `ml.dmlc.xgboost4j.scala.spark.rapids`, not the spark's `tuning.CrossValidator`." - ] - }, { "cell_type": "markdown", "metadata": {}, @@ -78,13 +71,9 @@ } ], "source": [ - "SPARK_MASTER_URL = os.getenv(\"SPARK_MASTER_URL\", \"yarn\")\n", - "# SPARK_MASTER_URL = os.getenv(\"SPARK_MASTER_URL\", \"spark://10.19.183.210:7077\")\n", - "\n", - "# RAPIDS_JAR = os.getenv(\"RAPIDS_JAR\", \"/usr/lib/spark/jars/rapids-4-spark_2.12-22.08.0.jar\")\n", - "# RAPIDS_JAR = os.getenv(\"RAPIDS_JAR\", \"/home/yuanli/work/jars/v22.10.0/rapids-4-spark_2.12-22.10.0-20220924.131241-34.jar\")\n", - "RAPIDS_JAR = os.getenv(\"RAPIDS_JAR\", \"/home/hdoop/rapids-4-spark_2.12-22.10.0.jar\")\n", + "SPARK_MASTER_URL = os.getenv(\"SPARK_MASTER_URL\", \"/your-url\")\n", "\n", + "RAPIDS_JAR = os.getenv(\"RAPIDS_JAR\", \"/your-jar-path\")\n", "\n", "# You need to update with your real hardware resource \n", "driverMem = os.getenv(\"DRIVER_MEM\", \"2g\")\n", @@ -103,7 +92,6 @@ "## The tasks will run on GPU cores, so there is no need to use many cpu cores\n", "conf.set(\"spark.executor.cores\", executorCores)\n", "\n", - "\n", "# Plugin settings\n", "conf.set(\"spark.executor.resource.gpu.amount\", \"1\")\n", "conf.set(\"spark.rapids.sql.concurrentGpuTasks\", concurrentGpuTasks)\n", @@ -117,10 +105,9 @@ "conf.set(\"spark.sql.cache.serializer\",\"com.nvidia.spark.ParquetCachedBatchSerializer\")\n", "conf.set(\"spark.driver.extraClassPath\", RAPIDS_JAR)\n", "conf.set(\"spark.executor.extraClassPath\", RAPIDS_JAR)\n", - "# conf.set(\"spark.yarn.dist.archives\", \"pyspark_venv_20221124.tar.gz#environment\")\n", - "conf.set(\"spark.archives\", \"pyspark_venv_20221125.tar.gz#environment\")\n", - "# spark.executor.resource.gpu.discoveryScript=/home/hdoop/spark-3.2.2-bin-hadoop3.2/examples/src/main/scripts/getGpusResources.sh\n", - "conf.set(\"spark.executor.resource.gpu.discoveryScript\",\"/home/hdoop/spark-3.2.2-bin-hadoop3.2/examples/src/main/scripts/getGpusResources.sh\")\n", + "# if you pass/unpack the archive file and enable the environment\n", + "# conf.set(\"spark.yarn.dist.archives\", \"your_pyspark_venv.tar.gz#environment\")\n", + "conf.set(\"spark.executor.resource.gpu.discoveryScript\",\"/your-path/getGpusResources.sh\")\n", "# Create spark session\n", "spark = SparkSession.builder.config(conf=conf).getOrCreate()\n", "\n", @@ -163,9 +150,9 @@ "features = [ x.name for x in schema if x.name != label ]\n", "\n", "# You need to update them to your real paths!\n", - "dataRoot = os.getenv(\"DATA_ROOT\", \"file:///home/yuanli/work/reviews/pr252/datasets\")\n", - "train_path = dataRoot + \"/taxi/csv/train/taxi-small.csv\"\n", - "eval_path = dataRoot + \"/taxi/csv/test/taxi-small.csv\"\n", + "dataRoot = os.getenv(\"DATA_ROOT\", \"/your-path\")\n", + "train_path = dataRoot + \"/your-path\"\n", + "eval_path = dataRoot + \"/your-path\"\n", "\n", "data_format = 'csv'\n", "has_header = 'true'\n", @@ -460,7 +447,7 @@ ], "metadata": { "kernelspec": { - "display_name": "Python 3 (ipykernel)", + "display_name": "Python 3", "language": "python", "name": "python3" }, @@ -474,7 +461,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.8.10" + "version": "3.8.2" } }, "nbformat": 4, diff --git a/examples/XGBoost-Examples/taxi/notebooks/python/taxi-gpu.ipynb b/examples/XGBoost-Examples/taxi/notebooks/python/taxi-gpu.ipynb index c8bf4d323..e263b75d4 100644 --- a/examples/XGBoost-Examples/taxi/notebooks/python/taxi-gpu.ipynb +++ b/examples/XGBoost-Examples/taxi/notebooks/python/taxi-gpu.ipynb @@ -9,13 +9,12 @@ "Taxi is an example of xgboost regressor. This notebook will show you how to load data, train the xgboost model and use this model to predict \"fare_amount\" of your taxi trip.\n", "\n", "A few libraries required for this notebook:\n", - " 1. NumPy\n", - " 2. cudf jar\n", - " 3. xgboost4j jar\n", - " 4. xgboost4j-spark jar\n", - " 5. rapids-4-spark.jar \n", + " 1. cudf-cu11\n", + " 2. xgboost\n", + " 3. scikit-learn\n", + " 4. numpy\n", "\n", - "This notebook also illustrates the ease of porting a sample CPU based Spark xgboost4j code into GPU. There is only one change required for running Spark XGBoost on GPU. That is replacing the API `setFeaturesCol(feature)` on CPU with the new API `setFeaturesCols(features)`. This also eliminates the need for vectorization (assembling multiple feature columns in to one column) since we can read multiple columns." + "This notebook also illustrates the ease of porting a sample CPU based Spark xgboost4j code into GPU. There is no change required for running Spark XGBoost on GPU because both CPU and GPU call the same API. For CPU run, we need to vectorize the trained dataset before fitting data to regressor." ] }, { @@ -38,8 +37,9 @@ "from time import time\n", "from pyspark.conf import SparkConf\n", "import os\n", - "os.environ['PYSPARK_PYTHON'] = \"./environment/bin/python\"\n", - "os.environ['PYSPARK_DRIVER_PYTHON'] = \"./environment/bin/python\"" + "# if you pass/unpack the archive file and enable the environment\n", + "# os.environ['PYSPARK_PYTHON'] = \"./environment/bin/python\"\n", + "# os.environ['PYSPARK_DRIVER_PYTHON'] = \"./environment/bin/python\"" ] }, { @@ -82,13 +82,9 @@ } ], "source": [ - "SPARK_MASTER_URL = os.getenv(\"SPARK_MASTER_URL\", \"yarn\")\n", - "# SPARK_MASTER_URL = os.getenv(\"SPARK_MASTER_URL\", \"spark://10.19.183.210:7077\")\n", - "\n", - "# RAPIDS_JAR = os.getenv(\"RAPIDS_JAR\", \"/usr/lib/spark/jars/rapids-4-spark_2.12-22.08.0.jar\")\n", - "# RAPIDS_JAR = os.getenv(\"RAPIDS_JAR\", \"/home/yuanli/work/jars/v22.10.0/rapids-4-spark_2.12-22.10.0-20220924.131241-34.jar\")\n", - "RAPIDS_JAR = os.getenv(\"RAPIDS_JAR\", \"/home/hdoop/rapids-4-spark_2.12-22.10.0.jar\")\n", + "SPARK_MASTER_URL = os.getenv(\"SPARK_MASTER_URL\", \"/your-url\")\n", "\n", + "RAPIDS_JAR = os.getenv(\"RAPIDS_JAR\", \"/your-jar-path\")\n", "\n", "# You need to update with your real hardware resource \n", "driverMem = os.getenv(\"DRIVER_MEM\", \"2g\")\n", @@ -107,7 +103,6 @@ "## The tasks will run on GPU cores, so there is no need to use many cpu cores\n", "conf.set(\"spark.executor.cores\", executorCores)\n", "\n", - "\n", "# Plugin settings\n", "conf.set(\"spark.executor.resource.gpu.amount\", \"1\")\n", "conf.set(\"spark.rapids.sql.concurrentGpuTasks\", concurrentGpuTasks)\n", @@ -121,10 +116,10 @@ "conf.set(\"spark.sql.cache.serializer\",\"com.nvidia.spark.ParquetCachedBatchSerializer\")\n", "conf.set(\"spark.driver.extraClassPath\", RAPIDS_JAR)\n", "conf.set(\"spark.executor.extraClassPath\", RAPIDS_JAR)\n", - "# conf.set(\"spark.yarn.dist.archives\", \"pyspark_venv_20221124.tar.gz#environment\")\n", - "conf.set(\"spark.archives\", \"pyspark_venv_20221125.tar.gz#environment\")\n", - "# spark.executor.resource.gpu.discoveryScript=/home/hdoop/spark-3.2.2-bin-hadoop3.2/examples/src/main/scripts/getGpusResources.sh\n", - "conf.set(\"spark.executor.resource.gpu.discoveryScript\",\"/home/hdoop/spark-3.2.2-bin-hadoop3.2/examples/src/main/scripts/getGpusResources.sh\")\n", + "\n", + "# if you pass/unpack the archive file and enable the environment\n", + "# conf.set(\"spark.yarn.dist.archives\", \"your_pyspark_venv.tar.gz#environment\")\n", + "conf.set(\"spark.executor.resource.gpu.discoveryScript\",\"/your-path/getGpusResources.sh\")\n", "# Create spark session\n", "spark = SparkSession.builder.config(conf=conf).getOrCreate()\n", "\n", @@ -166,9 +161,9 @@ "features = [ x.name for x in schema if x.name != label ]\n", "\n", "# You need to update them to your real paths!\n", - "dataRoot = os.getenv(\"DATA_ROOT\", \"file:///home/yuanli/work/reviews/pr252/datasets\")\n", - "train_path = dataRoot + \"/taxi/csv/train/taxi-small.csv\"\n", - "eval_path = dataRoot + \"/taxi/csv/test/taxi-small.csv\"\n", + "dataRoot = os.getenv(\"DATA_ROOT\", \"/your-path\")\n", + "train_path = dataRoot + \"/your-path\"\n", + "eval_path = dataRoot + \"/your-path\"\n", "\n", "data_format = 'csv'\n", "has_header = 'true'\n", @@ -222,19 +217,13 @@ "params['features_col'] = features\n", "params['label_col'] = label\n", " \n", - "regressor = SparkXGBRegressor(**params)\n", - "# regressor = XGBoostRegressor(**params).setLabelCol(label).setFeaturesCols(features)" + "regressor = SparkXGBRegressor(**params)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ - "The CPU version regressor provides the API `setFeaturesCol` which only accepts a single column name, so vectorization for multiple feature columns is required.\n", - "```Python\n", - "regressor = XGBoostRegressor(**params).setLabelCol(label).setFeaturesCol('features')\n", - "```\n", - "\n", "The parameter `num_workers` should be set to the number of GPUs in Spark cluster for GPU version, while for CPU version it is usually equal to the number of the CPU cores.\n", "\n", "Concerning the tree method, GPU version only supports `gpu_hist` currently, while `hist` is designed and used here for CPU training.\n" @@ -311,7 +300,7 @@ } ], "source": [ - "model.write().overwrite().save('hdfs:///user/hdoop/test/taxi/new-model-path')" + "model.write().overwrite().save(dataRoot + '/your-path')" ] }, { @@ -320,7 +309,7 @@ "metadata": {}, "outputs": [], "source": [ - "loaded_model = SparkXGBRegressorModel().load('hdfs:///user/hdoop/test/taxi/new-model-path')" + "loaded_model = SparkXGBRegressorModel().load(dataRoot + '/mortgage/model)" ] }, { @@ -465,7 +454,7 @@ ], "metadata": { "kernelspec": { - "display_name": "Python 3 (ipykernel)", + "display_name": "Python 3", "language": "python", "name": "python3" }, @@ -479,7 +468,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.8.10" + "version": "3.8.2" } }, "nbformat": 4, From 95b7b79e3f167b78ec9deebc945547e9831f47da Mon Sep 17 00:00:00 2001 From: liyuan Date: Fri, 9 Dec 2022 15:30:06 +0800 Subject: [PATCH 10/14] update the performance Signed-off-by: liyuan --- .../on-prem-cluster/standalone-python.md | 2 +- .../on-prem-cluster/yarn-python.md | 4 ++-- docs/img/guides/mortgage-perf.png | Bin 210760 -> 51481 bytes examples/XGBoost-Examples/README.md | 13 ++++++------- 4 files changed, 9 insertions(+), 10 deletions(-) diff --git a/docs/get-started/xgboost-examples/on-prem-cluster/standalone-python.md b/docs/get-started/xgboost-examples/on-prem-cluster/standalone-python.md index b10f16d19..2ae3ec997 100644 --- a/docs/get-started/xgboost-examples/on-prem-cluster/standalone-python.md +++ b/docs/get-started/xgboost-examples/on-prem-cluster/standalone-python.md @@ -52,7 +52,7 @@ And here are the steps to enable the GPU resources discovery for Spark 3.1+. 3. Install the XGBoost, cudf-cu11, numpy libraries on all nodes before running XGBoost application. ``` bash -pip install xgboost==1.7.0 +pip install xgboost pip install cudf-cu11 --extra-index-url=https://pypi.ngc.nvidia.com pip install numpy ``` diff --git a/docs/get-started/xgboost-examples/on-prem-cluster/yarn-python.md b/docs/get-started/xgboost-examples/on-prem-cluster/yarn-python.md index 5cf23ffc1..c7faf6ae5 100644 --- a/docs/get-started/xgboost-examples/on-prem-cluster/yarn-python.md +++ b/docs/get-started/xgboost-examples/on-prem-cluster/yarn-python.md @@ -36,7 +36,7 @@ please refer to [here](https://hadoop.apache.org/docs/r3.1.0/hadoop-yarn/hadoop- Please make sure to install the XGBoost, cudf-cu11, numpy libraries on all nodes before running XGBoost application. ``` bash -pip install xgboost==1.7.0 +pip install xgboost pip install cudf-cu11 --extra-index-url=https://pypi.ngc.nvidia.com pip install numpy ``` @@ -47,7 +47,7 @@ by leveraging the --archives option or spark.archives configuration. # create an isolated python environment and install libraries python -m venv pyspark_venv source pyspark_venv/bin/activate -pip install xgboost==1.7.0 +pip install xgboost pip install cudf-cu11 --extra-index-url=https://pypi.ngc.nvidia.com pip install numpy venv-pack -o pyspark_venv.tar.gz diff --git a/docs/img/guides/mortgage-perf.png b/docs/img/guides/mortgage-perf.png index 23715ce9a5149dfd3c786e93f2e27be7ae921316..8c0227eb4e8de0cf64e4a7589eb8336583d4a060 100644 GIT binary patch literal 51481 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 literal 210760 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
MQ1~NU|fRM%|!{U)!NxJ&~ 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̴jAioxa;#;#;m=5N@rG(KP$cQlcO6%nQbEWcV-E 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 diff --git a/examples/XGBoost-Examples/README.md b/examples/XGBoost-Examples/README.md index fc8d1ddc6..5d38f816f 100644 --- a/examples/XGBoost-Examples/README.md +++ b/examples/XGBoost-Examples/README.md @@ -5,8 +5,8 @@ The Scala based XGBoost examples here use [DMLC’s version](https://repo1.maven The pyspark based XGBoost examples requires [installing RAPIDS via pip](https://rapids.ai/pip.html#install). Most data scientists spend a lot of time not only on Training models but also processing the large amounts of data needed to train these models. -As you can see below, Pyspark+XGBoost training on GPUs can be up to 7.7X and data processing using -RAPIDS Accelerator can also be accelerated with an end-to-end speed-up of 7.2X on GPU compared to CPU. +As you can see below, Pyspark+XGBoost training on GPUs can be up to 13X and data processing using +RAPIDS Accelerator can also be accelerated with an end-to-end speed-up of 11X on GPU compared to CPU. In the public cloud, better performance can lead to significantly lower costs as demonstrated in this [blog](https://developer.nvidia.com/blog/gpu-accelerated-spark-xgboost/). ![mortgage-speedup](/docs/img/guides/mortgage-perf.png) @@ -93,6 +93,9 @@ Please follow below steps to run the example notebooks in different notebook env - [Jupyter Notebook for Python](/docs/get-started/xgboost-examples/notebook/python-notebook.md) Note: +Update the default value of `spark.sql.execution.arrow.maxRecordsPerBatch` to a larger number(such as 200000) will +significantly improve performance by accelerating data transfer between JVM and Python process. + For the CrossValidator job, we need to set `spark.task.resource.gpu.amount=1` to allow only 1 training task running on 1 GPU(executor), otherwise the customized CrossValidator may schedule more than 1 xgboost training tasks into one executor simultaneously and trigger [issue-131](https://github.com/NVIDIA/spark-rapids-examples/issues/131). From cc2472887bc35164f1e704061f40f259f293e20c Mon Sep 17 00:00:00 2001 From: Tim Liu Date: Wed, 14 Dec 2022 18:12:57 +0800 Subject: [PATCH 13/14] Update dataset path for XGBoost PySPark notebooks --- .../agaricus/notebooks/python/agaricus-gpu.ipynb | 11 +++++------ .../notebooks/python/MortgageETL+XGBoost.ipynb | 8 +++++--- .../mortgage/notebooks/python/cv-mortgage-gpu.ipynb | 9 ++++----- .../mortgage/notebooks/python/mortgage-gpu.ipynb | 12 ++++++------ .../taxi/notebooks/python/cv-taxi-gpu.ipynb | 11 +++++------ .../taxi/notebooks/python/taxi-gpu.ipynb | 11 +++++------ 6 files changed, 30 insertions(+), 32 deletions(-) diff --git a/examples/XGBoost-Examples/agaricus/notebooks/python/agaricus-gpu.ipynb b/examples/XGBoost-Examples/agaricus/notebooks/python/agaricus-gpu.ipynb index 3bae77e02..ad529fb37 100644 --- a/examples/XGBoost-Examples/agaricus/notebooks/python/agaricus-gpu.ipynb +++ b/examples/XGBoost-Examples/agaricus/notebooks/python/agaricus-gpu.ipynb @@ -121,7 +121,6 @@ "\n", "# if you pass/unpack the archive file and enable the environment\n", "# conf.set(\"spark.yarn.dist.archives\", \"your_pyspark_venv.tar.gz#environment\")\n", - "conf.set(\"spark.executor.resource.gpu.discoveryScript\",\"/your-path/getGpusResources.sh\")\n", "# Create spark session\n", "spark = SparkSession.builder.config(conf=conf).getOrCreate()\n", "\n", @@ -146,9 +145,9 @@ "schema = StructType([ StructField(x, FloatType()) for x in [label] + features ])\n", "\n", "# You need to update them to your real paths!\n", - "dataRoot = os.getenv(\"DATA_ROOT\", \"/your-path\")\n", - "train_path = dataRoot + \"/your-path\"\n", - "eval_path = dataRoot + \"/your-path\"\n", + "dataRoot = os.getenv(\"DATA_ROOT\", \"/data\")\n", + "train_path = dataRoot + \"/agaricus/csv/train\"\n", + "eval_path = dataRoot + \"/agaricus/csv/eval\"\n", "\n", "data_format = 'csv'\n", "has_header = 'true'\n", @@ -294,7 +293,7 @@ } ], "source": [ - "model.write().overwrite().save(dataRoot + '/your-path')" + "model.write().overwrite().save(dataRoot + '/model/agaricus')" ] }, { @@ -303,7 +302,7 @@ "metadata": {}, "outputs": [], "source": [ - "loaded_model = SparkXGBClassifierModel().load(dataRoot + '/mortgage/model')" + "loaded_model = SparkXGBClassifierModel().load(dataRoot + '/model/agaricus')" ] }, { diff --git a/examples/XGBoost-Examples/mortgage/notebooks/python/MortgageETL+XGBoost.ipynb b/examples/XGBoost-Examples/mortgage/notebooks/python/MortgageETL+XGBoost.ipynb index 6ec1a1d3e..40c71669d 100644 --- a/examples/XGBoost-Examples/mortgage/notebooks/python/MortgageETL+XGBoost.ipynb +++ b/examples/XGBoost-Examples/mortgage/notebooks/python/MortgageETL+XGBoost.ipynb @@ -28,6 +28,7 @@ "import time\n", "import os\n", "from pyspark import broadcast\n", + "from pyspark.conf import SparkConf\n", "from pyspark.sql import SparkSession\n", "from pyspark.sql.functions import *\n", "from pyspark.sql.types import *\n", @@ -53,7 +54,8 @@ "source": [ "# The input path of dataset\n", "dataRoot = os.getenv(\"DATA_ROOT\", \"/data\")\n", - "orig_raw_path = dataRoot + \"/mortgage/input/\"orig_raw_path_csv2parquet = dataRoot + \"/mortgage/output/csv2parquet/\"" + "orig_raw_path = dataRoot + \"/mortgage/input/\"\n", + "orig_raw_path_csv2parquet = dataRoot + \"/mortgage/output/csv2parquet/\"" ] }, { @@ -926,11 +928,11 @@ "metadata": {}, "outputs": [], "source": [ - "# This sample uses 2 workers(GPUs) to run XGBoost training \n", + "# This sample uses 1 worker(GPU) to run XGBoost training, you can change according to your GPU resources\n", "params = { \n", " \"tree_method\": \"gpu_hist\",\n", " \"grow_policy\": \"depthwise\",\n", - " \"num_workers\": 2,\n", + " \"num_workers\": 1,\n", " \"use_gpu\": \"true\",\n", "}\n", "params['features_col'] = features\n", diff --git a/examples/XGBoost-Examples/mortgage/notebooks/python/cv-mortgage-gpu.ipynb b/examples/XGBoost-Examples/mortgage/notebooks/python/cv-mortgage-gpu.ipynb index f9bd7b4d3..ac4e24dbe 100644 --- a/examples/XGBoost-Examples/mortgage/notebooks/python/cv-mortgage-gpu.ipynb +++ b/examples/XGBoost-Examples/mortgage/notebooks/python/cv-mortgage-gpu.ipynb @@ -106,7 +106,6 @@ "conf.set(\"spark.executor.extraClassPath\", RAPIDS_JAR)\n", "# if you pass/unpack the archive file and enable the environment\n", "# conf.set(\"spark.yarn.dist.archives\", \"your_pyspark_venv.tar.gz#environment\")\n", - "conf.set(\"spark.executor.resource.gpu.discoveryScript\",\"/your-path/getGpusResources.sh\")\n", "# Create spark session\n", "spark = SparkSession.builder.config(conf=conf).getOrCreate()\n", "\n", @@ -160,11 +159,11 @@ "features = [ x.name for x in schema if x.name != label ]\n", "\n", "# You need to update them to your real paths!\n", - "dataRoot = os.getenv(\"DATA_ROOT\", \"/your-path\")\n", - "train_path = dataRoot + \"/your-path\"\n", - "eval_path = dataRoot + \"/your-path\"\n", + "dataRoot = os.getenv(\"DATA_ROOT\", \"/data\")\n", + "train_path = dataRoot + \"/mortgage/output/train\"\n", + "eval_path = dataRoot + \"/mortgage/output/eval\"\n", "\n", - "data_format = 'csv'\n", + "data_format = 'parquet'\n", "has_header = 'true'\n", "if data_format == 'csv':\n", " train_data = reader.schema(schema).option('header',has_header).csv(train_path)\n", diff --git a/examples/XGBoost-Examples/mortgage/notebooks/python/mortgage-gpu.ipynb b/examples/XGBoost-Examples/mortgage/notebooks/python/mortgage-gpu.ipynb index cb21c087f..a91911b9b 100644 --- a/examples/XGBoost-Examples/mortgage/notebooks/python/mortgage-gpu.ipynb +++ b/examples/XGBoost-Examples/mortgage/notebooks/python/mortgage-gpu.ipynb @@ -182,11 +182,11 @@ "features = [ x.name for x in schema if x.name != label ]\n", "\n", "# You need to update them to your real paths!\n", - "dataRoot = os.getenv(\"DATA_ROOT\", \"/your-path\")\n", - "train_path = dataRoot + \"/your-path\"\n", - "eval_path = dataRoot + \"/your-path\"\n", + "dataRoot = os.getenv(\"DATA_ROOT\", \"/data\")\n", + "train_path = dataRoot + \"/mortgage/output/train\"\n", + "eval_path = dataRoot + \"/mortgage/output/eval\"\n", "\n", - "data_format = 'csv'\n", + "data_format = 'parquet'\n", "has_header = 'true'\n", "if data_format == 'csv':\n", " train_data = reader.schema(schema).option('header',has_header).csv(train_path)\n", @@ -341,7 +341,7 @@ } ], "source": [ - "model.write().overwrite().save(dataRoot + '/your-path')" + "model.write().overwrite().save(dataRoot + '/model/mortgage')" ] }, { @@ -350,7 +350,7 @@ "metadata": {}, "outputs": [], "source": [ - "loaded_model = SparkXGBClassifierModel().load(dataRoot + '/mortgage/model')" + "loaded_model = SparkXGBClassifierModel().load(dataRoot + '/model/mortgage')" ] }, { diff --git a/examples/XGBoost-Examples/taxi/notebooks/python/cv-taxi-gpu.ipynb b/examples/XGBoost-Examples/taxi/notebooks/python/cv-taxi-gpu.ipynb index d8ed894cd..3eb2d41dc 100644 --- a/examples/XGBoost-Examples/taxi/notebooks/python/cv-taxi-gpu.ipynb +++ b/examples/XGBoost-Examples/taxi/notebooks/python/cv-taxi-gpu.ipynb @@ -38,8 +38,8 @@ "from time import time\n", "from pyspark.conf import SparkConf\n", "import os\n", - "os.environ['PYSPARK_PYTHON'] = \"./environment/bin/python\"\n", - "os.environ['PYSPARK_DRIVER_PYTHON'] = \"./environment/bin/python\"" + "# os.environ['PYSPARK_PYTHON'] = \"./environment/bin/python\"\n", + "# os.environ['PYSPARK_DRIVER_PYTHON'] = \"./environment/bin/python\"" ] }, { @@ -107,7 +107,6 @@ "conf.set(\"spark.executor.extraClassPath\", RAPIDS_JAR)\n", "# if you pass/unpack the archive file and enable the environment\n", "# conf.set(\"spark.yarn.dist.archives\", \"your_pyspark_venv.tar.gz#environment\")\n", - "conf.set(\"spark.executor.resource.gpu.discoveryScript\",\"/your-path/getGpusResources.sh\")\n", "# Create spark session\n", "spark = SparkSession.builder.config(conf=conf).getOrCreate()\n", "\n", @@ -150,9 +149,9 @@ "features = [ x.name for x in schema if x.name != label ]\n", "\n", "# You need to update them to your real paths!\n", - "dataRoot = os.getenv(\"DATA_ROOT\", \"/your-path\")\n", - "train_path = dataRoot + \"/your-path\"\n", - "eval_path = dataRoot + \"/your-path\"\n", + "dataRoot = os.getenv(\"DATA_ROOT\", \"/data\")\n", + "train_path = dataRoot + \"/taxi/csv/train\"\n", + "eval_path = dataRoot + \"/taxi/csv/test\"\n", "\n", "data_format = 'csv'\n", "has_header = 'true'\n", diff --git a/examples/XGBoost-Examples/taxi/notebooks/python/taxi-gpu.ipynb b/examples/XGBoost-Examples/taxi/notebooks/python/taxi-gpu.ipynb index 3007d6b50..da2c41c3f 100644 --- a/examples/XGBoost-Examples/taxi/notebooks/python/taxi-gpu.ipynb +++ b/examples/XGBoost-Examples/taxi/notebooks/python/taxi-gpu.ipynb @@ -120,7 +120,6 @@ "\n", "# if you pass/unpack the archive file and enable the environment\n", "# conf.set(\"spark.yarn.dist.archives\", \"your_pyspark_venv.tar.gz#environment\")\n", - "conf.set(\"spark.executor.resource.gpu.discoveryScript\",\"/your-path/getGpusResources.sh\")\n", "# Create spark session\n", "spark = SparkSession.builder.config(conf=conf).getOrCreate()\n", "\n", @@ -162,9 +161,9 @@ "features = [ x.name for x in schema if x.name != label ]\n", "\n", "# You need to update them to your real paths!\n", - "dataRoot = os.getenv(\"DATA_ROOT\", \"/your-path\")\n", - "train_path = dataRoot + \"/your-path\"\n", - "eval_path = dataRoot + \"/your-path\"\n", + "dataRoot = os.getenv(\"DATA_ROOT\", \"/data\")\n", + "train_path = dataRoot + \"/taxi/csv/train\"\n", + "eval_path = dataRoot + \"/taxi/csv/test\"\n", "\n", "data_format = 'csv'\n", "has_header = 'true'\n", @@ -311,7 +310,7 @@ } ], "source": [ - "model.write().overwrite().save(dataRoot + '/your-path')" + "model.write().overwrite().save(dataRoot + '/model/taxi')" ] }, { @@ -320,7 +319,7 @@ "metadata": {}, "outputs": [], "source": [ - "loaded_model = SparkXGBRegressorModel().load(dataRoot + '/mortgage/model)" + "loaded_model = SparkXGBRegressorModel().load(dataRoot + '/model/taxi')" ] }, { From 01bf4046e9d73537ee24a629c3750d56e554a86d Mon Sep 17 00:00:00 2001 From: liyuan Date: Mon, 19 Dec 2022 12:04:26 +0800 Subject: [PATCH 14/14] update lib infos we need to install by pip Signed-off-by: liyuan --- .../xgboost-examples/on-prem-cluster/standalone-python.md | 1 + .../get-started/xgboost-examples/on-prem-cluster/yarn-python.md | 2 ++ 2 files changed, 3 insertions(+) diff --git a/docs/get-started/xgboost-examples/on-prem-cluster/standalone-python.md b/docs/get-started/xgboost-examples/on-prem-cluster/standalone-python.md index 2ae3ec997..b41824fe2 100644 --- a/docs/get-started/xgboost-examples/on-prem-cluster/standalone-python.md +++ b/docs/get-started/xgboost-examples/on-prem-cluster/standalone-python.md @@ -55,6 +55,7 @@ And here are the steps to enable the GPU resources discovery for Spark 3.1+. pip install xgboost pip install cudf-cu11 --extra-index-url=https://pypi.ngc.nvidia.com pip install numpy +pip install scikit-learn ``` Get Application Files, Jar and Dataset diff --git a/docs/get-started/xgboost-examples/on-prem-cluster/yarn-python.md b/docs/get-started/xgboost-examples/on-prem-cluster/yarn-python.md index c7faf6ae5..f2bff0fdd 100644 --- a/docs/get-started/xgboost-examples/on-prem-cluster/yarn-python.md +++ b/docs/get-started/xgboost-examples/on-prem-cluster/yarn-python.md @@ -39,6 +39,7 @@ Please make sure to install the XGBoost, cudf-cu11, numpy libraries on all nodes pip install xgboost pip install cudf-cu11 --extra-index-url=https://pypi.ngc.nvidia.com pip install numpy +pip install scikit-learn ``` You can also create an isolated python environment by using (Virtualenv)[https://virtualenv.pypa.io/en/latest/], and then directly pass/unpack the archive file and enable the environment on executors @@ -50,6 +51,7 @@ source pyspark_venv/bin/activate pip install xgboost pip install cudf-cu11 --extra-index-url=https://pypi.ngc.nvidia.com pip install numpy +pip install scikit-learn venv-pack -o pyspark_venv.tar.gz # enable archive python environment on executors

4TiC*dmM>J{f@XM+o`oog+uoR=vM=AU^Gb*jX7`I`sNu$b&b22Ec4#D+Jv4( z=bu-Gp&JEDz$fBAtN!qpg=DYHb}6quD2z z9_Y)`y+#XfyQZgfuCHm=s|zSPYepXg)Hl2aqosc@-nuE=>=h*d2HvFI3-^$w&8Q<- z@Plazmj-(Kwbns;VnWI5SG5)eqVpZk)5@n7DqUBxYo9?r^?$dqpD&7dc!|~adnf8* zZ4`YQ`-whLg@ozcxp5oRCo4vUEY!L#T4of|QnT(*#7lnTUn6k*S77`vj}UNO?f>{4 z)GB(lheJhp)bYq+nAA3#Uds#)ctpdT%nKR*{e8h$(Di3fjtRW*X8ehky(Q!3a0$3< zM9zAB-)n_)lYw=)dZl+r*{z)E>jpD`XY7Y1#lU~kAquG(x>wRH?RL`cjDZ|efVZlF z4yxh*Ct1=>yO%U1(*JbuRk5ylD8V&m4gS#vukTYDa`cy<@tX-ViL;@*Z{5J}MI>g~drwL`5NYx$1E>rdzd~X+)InC^VJ_f<5qi8YXvKUn=Vj5>O{KG1xDA zdFp+O3!AYhM|R~0u#nU)nwIw`BT9dP08`B@vmH);DyagCC_>7}6WYDV z%h~Q^r(@yU_n+C?uL~ zS@!ty+`Vd%l5l}ZcF_&4R~1?nS+?0qsMfM+J01tPi%Exkrs4W%kA!NwYPYd-hA98W zElKDixJZ+Sm|JJf8nk3z&K^c37N31_)8jhl{=xmsLRiGRdFc3pA1@*V+a3?gWuGVs z*>NTODl$3{pD4y(e?~#Kh>)U}DC#19o}J_wi{=!lGyf*4pYHetu41j5*LKz_mJN2) ziV&A%`o=0xNk4j*6!oxNZ)^02(ZzN6f1RO*-RXOK+HoCsi(*5-!hr-!Tn+GzpGEUG zt@{O3r@PbDTF*H>*79Rr_Et7eS!yv4hx}E~JEO%v6bq7?k+5z|>YNQ+kM;f-*1S}F z3VvNBBDhK}Kezw=MilzDXNI7PKO-e7xtrbT7AtmLZWKU+M!WB;Zlhxq;|&^1^0Wet zy6@AdLC+V+v>0&|<6XnN8aM&U{O>LRhx>&jWQVTn$e2G2WiN#=-)&7_3{tat4eguN zHY*u;{odyHpEd2->en50RQQv&AX9)urn!zCl>ezw|9DF5FDMMZWtQQLM^KiJY>UQk zzq>+hVW8A=+GcXDJ;pKohhV62P|>%&T#(b; z!d+4Yz_<4#Yy){80UV-d|MnLE&x8!?5$AnN%gM2J;uMJ!CW!#^dQc8GBX2) z!2Z0BJ3LDR>cA5q{E>~g!KdJ6S~;+ebU|L`Wy>pB%n8b<9(6V@b~fT-6}x%zOej_66E>OiU(DRTv6=(~=7= zmNrj>-=-y?*O3-ogs{qW$l4N{2$@dpBIpC+zQpy;Ev697o$8HSFY&V$(k97SDdRtp zu}ucy0p=h$@ejU4h7xi*wV2I*%2MPM^s)Ebc@8cCen?@g_gmtxDN20+xg55nWG#H} zE}rtS5<>2O@gun^rE0XhzOB`tG?YE9!5A#X``~Q1!>gU-SJt;M{$&sOXs_e1?_HK}37hxp{Y_yQzME0Ov z9uFz5n69sa;-cI}0z>%|@Bak2S@jEAFU@BF>~BF8KIgK|O+8+5h%;12TjD%5z{!7o z!*IddXcAspJr)XtXIh^H-gXZ!S6;kvj{NcEWpKfO8}+9K=$Oz;76bnRjar-G_?`0L z!;UJKyalNF`NoH;>jsSgl`@>C6+v{lLQI#t5q#mP&)XJydIQDq#xmI_C2!cnUR%SQ zvGT!|cY>Ea`7f@danh#`Gu_RvN@g;WZXhnet)m$PUB&hAy+#LOd`bp=Mn7y)`T=Wj zjb_w&n-j3au3O_uLvWkL;7MZEr+n@5U|C6{*3SBD7O=WW8sk~bEQ53My-Sb$qttE#2-8>QhOP9j&gU;A9ARE4bI|6!5>|`XHy`@=!eH}qSjr8qI;qcrC<5H0RakB&%EFl#SfvE8=4z-GCt+T()ZPV~{6p-GS8dX%R9QHX9Al(%=CBGU_+89M4&jE#1 z>YZ$t*JvxxM5jd6+#ao|H%e3o8f;AV)J=St*>E6}+dZg#(a~>d>GdT)9byFcNrM8z zC7a$$T-*~ASii=ytP**;o(Wk;J0uKfm)>gLQVW(CAoENob7g37S>9qn-rVGXc>nYL zbPZNMS_6TCm(8xYEt%gC5~X7L?wN>@o_wg?l>W#B8l>{CsIb$mw@GsNv0ziE+N1M` z@=36+LaN7*3lIG>J%Qv8=jzUatl+;pX`nLb*Gx8Xjr6z1Wq=obbamRAoF~0_wC(*C zBXw`C!|-7@Z1=cqQ(ySYo$LCR40hcLCY4LUG8(6x%p&^d9SAZ3=_&}0y4rEK5`{`( zjXRXe{$;9(3*)8L;zyqbjw0~5GSvWQaJm{9c7%;lrKsYH9l#6*Qt{}-p2NS>ZL{BFr!{jMDNveaM`6Q(19hO3P! z%{UKQh-EA8$L} z=dFpWWCAf!kPemaT{Z!Zh|ZOBNi1(pXy<9GarQ@Z_jw>NW<(gMTn+9M&f8!h$Pb&v z%HK5=%*8pV%QVwR+f;@$XfSQ)}_AB zCHD8sSfyz@JyAE30m`>2I68mA9@u2=+l6@l`@?wkcy*D_+a@}nK2Y(po0fwV(2~|n z3P5}Lup(kYw&=OF$euTDH@k&kNe2{1rK*k(5HL40yZMmUj zT(83k#n)!ISOp`?w30|_)8E@=!IAWRzn$5`E|2tlCy^d2oO5%Kg4op~sj z2Ahu-CIIf9*qruh-;XFQf{CI_p|$pvq!#0Sv{ztWDpeK-x{_$y-s{kW=m;`^vdC?C zf3^H<*KYhwkUt#zMIL4jgI=9NSK-tTl)2$EO%$)nTTf=QbSX2nDajbG03`IjWIBGW)F_)rZy z23hrk`aXRpwaKLlPs=0GYu`D* z6B!PO#zo zttY?}A3Q+aU zxIe>3=|@Eb+|<*CuV+5EL*z?rT8?hwdq4J&i)$a5IXgK9P%q2eKAW@G{D+n995#+9 zsfh3Y!a$vaJ?LDj8J%m^ecOCx@$r{BmXb8bc?0at_Z1VnlO@j;zoR|W?iG)n+ft|8 z)~db6WpoSNiyOzu#BQ6bcG&_jAxKo$VTjD+2O@f}VOsNnH|j4iKKB!n^?h`bNVw*N zLzkw}e9LPddnw&q7-ANuPT=`W#pBJDFW$N7;bX%>Xq$@i=*FJdD{V=~>bzYr)B(`>g}!!9{t!#99R~b(wB4OjEKP zJ_7S>FZheujuc6Ot+m8s(ztHAya`(IdBo7>@_EElToV2{1RO9zMYXAf9Ey%{oj>Oj zv&37Xz=oVW+Xop)B2RYNhcf;GX&#lE5ZQ~PjLpO;7Yew9@eq4|p52U4D-5ud1X&ZeFR z9G&%IYvgerQ4Inl=1yc(jOL@Nj`7u?!4tP!7HH}w28GH{RE-wrJ@uJmUZauHWWQG2mzd;KMT@PDdo zsvhZCMxNY_WiP{2wn4wPoH5zu5c420+I?Sy`}t1&<$=5C<(>AsAygBZ@U}(L?82aF zr5?sPtv)rworx@?`LDV8e7y;SL4kSjg0ArmZLEh6V;y(y=b8`CaTB5|iHzrl-TlL# z^1^~Ek(xhvcml0T|;RJrd&kh z*27Vo>R~wLC(89`%x6B-R?k>CuWTaARkKYmL%@B*gvwg<#3Q|*@Z5V{O*X4dWml05 z1;!M0j8iz$WJ4C5`3oECKAAP+v4@~T7A4$WcR0u8H@Cw=NslJP4fzIRUMNI7GRt>; zPHHwoWpjK|)ekcSeIlp|#f|)iIIC`l3MEJ=BBGw13G{PxHx@ZlEh|cI1F8}^W!N*& zoFfIkFEt#oxv9UkqD{?9HVV9%Ee26VYl(e)Z4yp;^|d(v6UD^uL+E+du#8R;`U*|4 zcRihQ4S+4;8Iu%o8zGd(QvOc>lk%)33@e5m)QdHY0j%O3c4OrY{^a`g`D6|#TBGcs zMa!|1LL$som|28ql7RdubW=K=8^RYry`*jMs;J=Ery@}Mnv|BdQY1l6Y`Lq!R{33) zh($6G?h6(rcVFpj2(C#Q2 znjuQ^xzrexQQh2^4Y$vfXczt2Jol!-^gCMr=BkWvOP#kk$N7)JbHraYMCND*18RP0 zf;M-8lkY07Y?rIJ(`AJb*a-iVd=`BHZ2Ug?k1WH(w5C32v*uAf??b;ttk}d_z!tYK z0{;^&NQv?o@5Sw+qM9B~W4a=0jC!b-QOdu`;HHkQ1Vd5~DZAaB+RL=RAWJS>pySQ# zN<74BzaaNSg}lo>)UqdBF^^E>;`wIY;=9lRZZxk#NJr`r`?I0GiXO{kG*NH$4Jxp1 zh(!|ZZesd4e+5D>;#iQS%Bf_ zJAkCko1@h^h#H{#*h5%&%WK5-;-dx7_LsAYMS&fYS=Ti)17ey>yS6-uRUqt=%ofyn zZRmEvOt8l_6vq^Yh=!<-k`~UWiLG|L>@K_cFc9(_>ni$6OY6yt=v%xXnySD5(tcNk zeM)#6)4TufhNn?eoa%Z}g+Ph9^PpL7z1bY>4(Yu8-TvpRHT>6F8r!mPn8$PiXQ0*k z=db@ZHK+sCKGe`Gw0-ldCRob5o)}c(dQ#$SupmYiDh2B{W?PiIlvmZ_uqZU9rKt+p zN|EvrLwT>}@H>yGqtnnbOlp5PuVritq0rQhJf6i@+B6m)jq-HH+K4#-55wh&ErD{jQO_Y5!u1 z>ydH>5*I_DHqA9~OH}!a&F7i1<|efI&mS$~n|mKzql^BMQ7}Xuoo`A9W7K&QI+7NhH2hjLWgD!5^$464 zg~ah+yowi_RU+TVFSH<2vlGA3;>NF!H}S;FP6nC7E%X0+=Q4^&Cv2b zI={>9vQq(-kNZd+Jtx&$->M!){ESF>NAm6_+doF_G|j;Ry65U~0(QESf$V7R(o7B( z8k(R^-OK0bntQjwkjeXt`)MZLd+F|jo#1-YE%{oopWdzdXlOuD0-!%}#+o9KerFV* zW5p)T&aC`f+DoAbyspH}D;oMz6VN=?e$W5=apKE?D^^B8NX|D%eXF=mEuuuhTru3K zdG(Z_$9Hg5!HZ;6otW~v0@)?hsiW19pn~vWq_iG(L%BKfIiQ>2ZI8msfwa7_^a%0b z_oya`KRJB3p!?9{nb{bWyx{ZrDI_X>k6+o8j^1p=>N0b%5dkxBEn$CwqW$)S9`Jsjormq~JB32%oPP{jn z^+m@Q8;JKf21nFoj7wdpBod`q6soG_(-3L4<8CA#tLQ#+cDuH=J=VV7mY_Oel#c4ExxnOq$RS`DwFM zU!x+afOdXih$PuJUXG8zKT8bNKnKMcB2>qmBGFF&3|H_3y>lpqgK`{%pU{K@SG>;x zn}e>vB7@e>+k1F8)kxY2#C-hGSPW8cM+>^X%`0&R04X@7iF$&36vfA6YOF*T3dhk}`H}@1gHXmWN=AN{-*mx9TPpjd&)S zgnPJpDuFrP-MXr#yUnm*20G1Q&?5zjUco1qE!IuI4}3knrz1W#yvuhDFA~y7Alge- zOXcfsjB~BG;{W+lmi%*IR(>jDx2=wLpG-}u@GL$DX)w`3%DRz$*JioUZ(k{sN<(5R zQ_(MZ&Y(zxnbHMDL!CFA)$0upb z87&DUM^qwk%%~l!S{4J+ieGTH&@WA&b5vchQDmQ|-Ifav%LA~V;(&I4B*;mV(S+hr z^+HbJlk4~F_txnFV;PTZ{P`0zCPeEyI{d~>1Fw3utqVaXv=CR}H4g!dhpqRh#3YlI zExTE6x-2@G6;VgnEh<_5E@bAj5%`S>K`*VXnAwXhZsFw`(eku?$?(@dYQnP--01Tq zyQfU}94$6d8MyrHzGs4rn!woKacy)11AFlUz4NYkPC}R%QdAwDTWIZei_w#pUoNw+ zeq`rG_;7#>T=tzjnyx3_;?A`7@IvCpWg3LGS$cgDVZ1uWtzHhaq0fWHAXPj6u0>k&zX zSGojsq3^+st2nlm;d&x2$(&KmI4?nlgF|n=aQU}9UfB&eHm+(ndL}Wt@BMNAkCIUl zKMrO{EuBbvbL1SXn0n3zm!m7#8_PO;O|`=r92}*hog2CbNCc!;YL%xuk*QRyM7eYC zZpr1|LmwXPo3K87EtRI`I>0nq`0TX(Q~V2j+W{Mx=yo&Mz3y~LvLMoxBG3JYrKZxi z!@6#_0&|qW!Hf4@2%-%^(Z!fX{KBg06m?mn`x{a&%Y-NQ6Ccql>)jEjQd2{i4rqls zc?j^SIIdeN(o+<_l&Ge;`+w_NWDp;;g1)%uvgu^`JWdMz=%$@g-<~0VndNwDF8&J~ zVa^;GrnQe8xP0i}I!MXXyd+mxD^234I|mbsHQ1ZVV28LpTc6rP+6Z)@#(OMM&h>AQ zR1DYsElbCp0xrlPw#DW+>B2Tf$+~q?166_UQD2` zHRA5`w<;!&N&;ccaE);a{ILt!W%%I|R2P&Ue9K z7HP~ENy$%sUcBhzx7sE{Vi$iO>xu1nEb;S;Xnaty`CB{#2dP)gEQW$g zv&2$A6E_)*6tN0e=ozLae6#NfYYJ?JwM5~{VHwd{=NgUpDwNT4v zz|x=sYbeQ*7^;DQ*x{D1XTxF(6YzNW&mRab2T^?xVhKJ`c*w5-vz|@K6ai~ zD}!b^E6W@n6VyW~z%IbbTHaI-N`imU7+ORyp0K}A!?=lE!I@_@mQ@z@@SQ4*CHd>O z^}Swq9*g8JVXaxcr4%nL30XsE+Lo5gED>HV*7`v~|=E+HtGX}oWwxzh_ss6~Bu*1oS z^?flaNzJ+C_AZsAy8eankq3Is@8sr#bZhLaO+WBL2X24(;a;jHLR=U_l^1uEuoDo^ zXFf2*EjKqn!d&y9{hpmhr*pf%-Y)7f``Pv&v7*7`+wWV#t{?p2#3)(B7Xf_QND1I4 zTItb0osK9Bq1vM$CLD=}kokSXw6WOS?Cxx( z80Dpe4)VasTJd-~W;mA|O!+{$C1CMV=3ONW!O{bERKf|Nim>z&&<7>vwvWT1C1oXk zxedC9mE^dp#iV|;X=))mIzg9$T84t?h2lBIZ-0Nx&tcm@l;hD+uFS)0U|Bd@`ZSAS z;eluFASzBKR@#*ICZ(b(_vQ2%rD{os`kq|25MPqCJ4*ed{oOXuBw8Ck^{ugBFZtiGWz`cvX+H~H_1ENFNMvv z*+gljT{cSX_r`1c!#tYNBZ-RwGRK#Nw`2ANsOIzMeS_{d20M8dyfz_7yN(oT)SR+U z6a7Deay$&RUj|L&-a>?!10}g@QrE~wv1ip?z6>a5>XOGPCSmB_{6(lPCJ(k7SIm?R zSAFW+;31Ny{bazt@1oW3eTHb&gf1M&DrddxpnVkc`5QYkfQnZpJMCt=66l15%s=T? zf50#(XFx||!mcJvEcfl=pQD;(DupewgiSqqVlkKYNku3_qOifJ&O5I(3(>#dj&aKA zk_M(rkDMJSzGn(u)Nlgwbh87r?dGt9suE37XV;+50>Yf8*Y7J_cdbbaf$N_?uAPrK z#CGjnx7hurd1RLqaBb!!Tp_&fxt=9XQS-S-6S>-2Re`g+^sK96!%my6Tmpu~Iz+*A}b5 z$9Pi4Zoxi9!I>9x<+hRHH^Ib#8@iiNMYUuoZ4^wJZ)YZW{)CsoM67JuX{|1!J)pK7 zvWebG*y(n8B5a3Tgh?={T~5Wxf2toh+{HX2et z6hl8uU(URLB$T*+MG!WVh8c?$L-dki9Hgjzbhjfy!(&^%zTSkfuqg%0n1e5ZBseX? znH5sQ-fg`8CT!slvy7M8nDVrOAaOeQM2GE(0u(o-!;tC4`+5PJdvT_?T-4T?HHait z&T)2=Uuqrv1?WGP>$2kN1P#1(&30^T5qqj|w-9YCsHTzfN zTA?#jJUkpctmsFjA(OB8m{ovX#ND{qI~(44kst8$zHd8SF8?5$%*}EMP%^PhGuLDL z6bbska^&NMntyn>R_X8U8^Ri|`f3_L9`*g(+xM~m-p=q0!rjLubUI@x^YDciusFHZ zh{WiJ0%b5O9Ga=EHC(>8iT~owxOP`WRI$Q6vH5l5A2U5LzBjpH1-~f<8U;sR-dIaA)Q8$6y1Kq-!IHG`;boNCRMKSoVof`923rNn z4o#+B&#OMYs_VH`3aJXp=ON23lK4%RJ6P}Y*CCOe$ObQpY*nu{G9Xaax2R9CeK*!_ zKM7fwVC9AyzVIQ^d6nu8MP&s~#qc{`Qk~QP)sQxn!O4A`|9Tw=WGUqD=WcHe9@^ccP{i z3{01$}5VMGWAFc@T5-Q1KnKp^Lb) z%N^V~b&rF|`p@ggFix3Zz7jiqFA1KCxC!Hm;WNZt%cttM=qFGmHOPxMlOJ{ zF>W;h?~?#kDk6tXP*+sIEUMV|e8(ANO!KAi!w>e5lg6&13bkg7)37^0m#Ppry;vRQ z&N(ov1EhXiW4zkxr0!t4CA+vpp7K`QC#4=Cr37=v05RYgsg9saD1aq8|9+78&o@?g z`^uK|WtTAg2uWvw^^X)fAO6T2`N(5Jmj4dw^JF+*0*?ui6rl9lpZc}{8~GDsM_(`K zjq^o9Y=+IxV%NfIV4^l!kMu-Rd^z8I165M3$g$#e9GQ=8xf3LJrm?s}p){-!59At! z$UO+-VDwR#fU?hdoG#K1(9cX-<{T=`uK)4F|d#wj8WhiZUq zM=1xr%8+H+e$^_q9=BEIzl67OD2KOwG&fHsmv!e|gAnVm!a^v;2wd=wgj1JA4>$jW z$`Zar_@mE{;7fhDSasP-sO?xk?!MmG^x9SsypK*DDrl<@deNVGu7##0#D3UHTWY=uPJa&?n!&2byFIl79N_R8a<8-L%S7k{g4 z(q^CPd2Z(zniR7Q({BkRfyU7m2@7SUc9G zj;Q=qtUR578}s$U&4XF}4fw?r(%xPJnmV<#y3}iv_(i`Rn>^>;xj>@o$~R zci;5;XU38HjiQw`nkUMjjAr|))+JBG&bmZ_TL7TVSqp?PefjFu$H1ySTmhZ+A!Q+s zuS>A!(4dDm8Eru#XB$TlC>l5?ThcsBZ1bFP1xdwt*zixgqR8Ope0;r*Y!0&j^rvu%%d?#u*{4Ql zoD#fFpK;%Hp^evInb*1xz4HFc_epF?p61pjS&(p<*C~v;<1!YokHaZ-b=a5dy-1;B z-YCcBUN3j#VXy~Z^e2>(h~o%+UP)Jbn~2!7IGg~PJrw=mr=T1ospA z7R~T0x}e>+|6j72Iip>5iCAy*{uhBbDp8M_}u`};8{P$AH0>go&xwaEI z?pFUEc5{;uM3~~yjdJ@(FuABw=jAM9NSErl953nqjO+S68F$-s&#~8iu|J7qn;ByV zKI)GY+h6c^p|HpG5S^{LRN;e4>=n@hx5V!&n!fr??@=WmH$bHF`Y>BXF2Ihh??MXN zH)vxoO_mbvvmU|0YtKfC3}+JQ=bRSzA7Y@AC>HQ83eRhw*>TA|!=cT2JL@Cf7nFF+ z_BrkH9dzCve8#V5+6zhXpo-KbV}%|d=cvuc^!m=Ow4Z{W?_m@YTeVZQNd}L4(-T@I zdHO(BuF?5cyUJz>uGti9u6~f2^)!GE>K^jO`zqk^Oa1`LGI#A7<{hTf(b3PfoebbN zxkK7rcN0xbi$Qfv?unq$`PW~#mI+HAHCc?k>rx2Q<^7A&LqEMMk~c~>Nj1jeFY_Db zIMnzT#Pc(qQCy>QL(7!rUPt$Dvt{un)b4gK*_5GJJv&dwZGp?Mid->=uu1WODR)uX zAX8;|CR{)fm^HUx%BtGFz_F>s@9OelDv(F>6?3peERYC}ANBRyEO&Q6 zQv1to+d22cmX{DRj%|qB#vG6)K=&;V5Xhh~IKr1GXJEln`g}1ztdVKsKPIvPIQ#_} zZR)&HeXeb8pbAqI1DWQu9_(HYs|RV)_+RsVf7n)8+33`L*Rx?aZy5N#GlquEDAVFy z_vnz}3TZdCwXOa|pzzU=)mq?P+7~rZW{{IB;!ZGH*|fs(bbMt@^;L)}j?&8uL%n)W zIsL8b+N9!Y;N6-|nH9-==s*Kuo{Fe$9+!DvZzg<=rjgZvWeFZ{yKasNi~=NrrHCHV&loICz93x?sNZM__#N?5brp8#Ccum+*W$cVxqs@-f1fShDxd zFuro*7$lS$#c(+?Oz_kFn`&Gv@YvxMO`MUI%8;NxRnTWP6K!w@2}&Pn@W zpN>K(H4dy0HsJTvP*Zjh;45}=J!9$L-dxfr!s{Lxa4Ya>gu*(f%r?Q8^Vi-;&dZVe z4g!R&%|TcVvmz0##6zo1JB`z3n?XHRYF!sooKt=M_y{B#6U7hdrX4er?VZm%JfqSg zf6|0etCgPXlJARb*JtAW>BR<3kShzx;1_ZUO^RFtdK>{QcYhs@V6@K#&qq*L_B)>) z@hSMSQ(fir(?--$sRdU^-1|Z5J8IFB`WaXAvE>^RnNvewG;6u9dr(0OlyM>vL@e3v zo-n*~(fv-Mo(Ixn#s-t%wiwv5jC*B*bM^iOy;BJw@etgW z4-%^3>8TpznG%1BsP&rDvmSY~V0%--EtJvVB4tZPYV6d0LEGgY+4)(_L_FUdMUsef zY(UrNFQvpJru*Jl8t7>r&PqL5V-E%zRJGiyH_9?Fn>>62gr({TqS2sFys|J9fV124 zhlVpLA7tjYWh3^77yL)_CuJb-=F)qBHG*s-r5^Lgn$5WQmh~e;$I-jC5e36HV@8}! z|Gdf%_k3+wztq8uF(%qJSOxS&uR&ET0?H*0fEm3fiWqYI>d*ML$xt#o03cUk>`S2D zH-I*ZM+tJ#V;u+J$CP0ZIDtq-`6YW)U27%qZguAiIW2gQfbDQ?&*f>Dy)>5r`gp@r z4{ytGt2y;;Q&kj@=1fYL1;5i|JZ8QFlxK~o>oE|%_1C}B#d=otDB`$i`ih?PffJPf zOty2^^Zr~|O%sMfJ~C6z05_%Uu95+z65v}(G4PfG+#Mupe4f!?v&U6 z$`N_kwdOQOU-K?Sw7I->btiox67keP%T+qHeXYtJPXmrJ5+U~d^55ZxMYY+~=4cO` z|Gw(??d|pkvtvS+gw_0T9pry4@c-^;!BjKCO#JpfEwiu^7PvdaNSUiF7Wd5EjfkRB zI{P0P@KYZ^16N$}+u7!S%N$101XT06o-|0umEqL$N>bX0LtRWI)c-mT#8V_7=6coX ztc@RpU7F2Md2U6DmZ$5up0k$j_dmfaL*znJ!NOIgu6NgMl)aJoGXX9qhNwI}b7rgu zg)cflPfygSlGza}Q3QDCZ0NBe*HY#4!*)HkWq^g!xkpr$$8Ye&J^#rNRR=6ooh@^4 z{(7ZLD{?3bV{c}w@-6FtLAIvkJ+tmn0?>!@zQo{az^C{Y;c{H+YC4Uj9qo!UKrM|n z@LHl7y$ZoRbvB{&*WxLH9NOM*V1y4O?duqZlz99(`ujyq)mLk-M-G>=8QK{_{9ym! z>ER*hQib+t8GIYo^!=8-^tmVmn8BSA?`;-y>>agCr>>Tx^*Jr#x&5UjJ{F(kY)q1DkD!SX|M=L(0fA+=95a3sK@rz)Ed1#>e!d5Q>!IRWh&onr9x4Pu z4)rda6~n@w-`=Ay@^a?2eDt))*O-iJ8atRN6?UPvtaNCH3Gya6uM_{&e~^tLuzx1= zak@RWro87WsM*W&|2usGg~Jk9^L!ZQ=`t47A5sCAp-t#(P~mEm^rz{kREoK}>Ks>Y zo2~4%XDhXdfd76$hMc({Ede8VM|T~>YM&o|xtz4Y8;sFm2wkEbmFqT9f`M~KagEJ| z86+*eAIB`Iq-H|$>F?o{=EE5(tq%xQC--;2-E2^Mv~cG|LZQ87bzZ9XC9-Gmmf}<8 zWR3SfSL=?d3chY>_?r8KL;_*peu4g5E(SYeR7^aF^}3utAd&FKiwpID_K;P&KgcYM z72^m4Y>o74%4k$)@xOlQl7#NCFRRJV8@!7MVOP$-u1)!o!K*{t^^qA2FD+e3bl6|G z4+ZzgjiB7C94EJm54Gxr7kUcjh)n(;&tkRgn?C~4sJSVvjz8YQ;(#!eT2pfM9FZR( zt3Yi-X?x`KG0@8%NC?9NZ)oRpzPp3z6UI~KN72DGYXBmQ0mR(**&&xa??TPWwE_<= zH~IU|*|r_m){zxQm=3DYgt0*}Y292jno4kb!~!4dF$j=mYoqWfm+lXBpg4XXnWi~m zE^_97_cfN_jGq$hp4Y%Io-}JTKu8shxKDM-V8|4H&d!(FK{x*YLEBkBwe>~qzIbs8 z6nA&GV!>UCyF)4PE$#(Uym)bUFHqcCAV_hiI7NfILm(tKeeb+8_aC^!FK{MdpE+mC z+Iv0g^MFzwgxv9TO6|UkKF@1bikugESS1(kjb6bKYo9($4+r5wv(aC6RcDvwZ}MWhf$5O+K0&tdx1IA0SENyWR4*&-KLUe#~Ly!`@k`D%8ps`0ujDJjw3% z3n5}|@wqGGakt4nmroH^5yg>{<}L5aP1sdnaWdgX1jlc^>6pM<4o@&O{q z*{yP;s#}`@Kt{C>V{TC}a2Kh`e_g;_-=T}*L-$X;><{w&7HdSaJ!iIL1yI}HXI0-` zSeHq>Dl|9$Vs!zhUhBAHK_j>t6N065k(mu$@l+Yp1|AlB4&aK8*hB{#qkp!Xkjy6S z-&EgY<*rUviP0bP8hQPxl)Z4s(emq>T1Ap8bamv@ix97VPiA#zS?y|H`|gr?;-VsL zHG|SfF5xYX6nFJe-)%wXhm4(Bnu>i|e5||sRPl7{>MYB+K6ysnS{B#z1knvtP!#>c#Ttf@6GMHwjBlfH zg+#nA<~SGJNbCkI@Lw(qZ$-(y7)!(vzxUU`BYMGlb z=KmbC+~Hw&8}#*;yWK=m2o%_{;a8caUoDmUpBL${$Xbu0pXVjVv|9+6Y$d2!bcOzh zVb~m@;BmaUHtty=Ttxz@(76j&RN5V*Z>i_r=LI$H7b%N;0ehU{{kzR=v9hb?LP(zZ z=d;!(Z2R{v2^f3%63PAz+$f^!-g*!oyuV#rVR80$9m4M=SnlwMb}DypuL3aLupmd; zz?@qG;9%60f~911sN<-&HS5T)D<`yRr+2Wm;ccRC-ggcI*y@7Xq5g(gaa zYn$B%4_Pi(0z|McSEeLSoy{Vo!JkMF_65;2GXWF)!y~X|=0)jOfsEuKSo4GYD%j29 z-?ii+yPBew-$NK8!`MM}+%pz0Ers9OzF_$LdL?i)lt@Z>^ZnkdYgf?ZC zfCcy32*RROkgJP@!kp9UW{#SQi%RGBd)!Z6UQoc}jJ)>}wIA;J%|@{Oso2_^=DS6+ z(cuR00fLX0%qachw7y-+&Tom>uQTi|03pBSI2F|6ngu5HIx`pG(l7z+dO-_=>U4E4 zb99(Npso_+cd{5NEK1=6ru?8W(7)FtmiV%{UI>eU3Gmwp+tGLX z(V(Z>+ib1I@nSTG?OVxGXfN%5Z=erD>7c3dWtup>Yaa>ekfOadV2Irri@G?KChL(_r{;R=7w z!s~7wxAh32$Od3IbJmR4_#I=CWXYa1Y&rE&D>%)PU)*NL-(tjOz0)9j&8YA zFlfP0{#R79r6nh~8f`5lJnI7{$tOO=bR;oU*WO;db#!=~6%;EDHJa@VQIxnFL8SHV z0sKX6a;&+ysQ=R8t66Kn<=;QO=@>xI&k~@wg^~d&Jzwf#IE77UfwS#tN2ABHU9VtF zCS4yfrxN_5v}VkHi8(!FX8xT^V-2Y6N+>FG0AA(-X=t1w1}efyz|+qKsSVz$tSX}q zHJHBRyQD$-)c&x z$*5V1Q}4^ICG^1rY(uZc?trKDhr^73YdU;7bKncEw*=Jszv_bk7LEEFTDsxssLS!H z_(DEQ?X&4K+rDwOLPwVON+xYQ`X$n7K+A#U@iZUJm5fI_45d4W_8f*}QClRokLJ+Y zG@8^gCQXJoHuQR)NLyB<;I~bx_Dn-{`mz}&Y`YO_CnyvAyb}LBD3?K-S zbMx1H!KuyNx;#Djc&{0M^yKl*{3K=_ZS|gX9G;)QZfqR^`wbE6GT5~YT9lPsq7bFw zJtevw8!H}&s)9a`^A}%UdjZN}mGOcvl0jC8l2QDR@MftX2;#BFYJ^SM!@;B{A#2mn zYItGv#$F|jWLm1DvSgB%{Lr=+HcwPMxr8AgeT$p)r<7#?(^9NSl}W@P)*?bsvh*qO zi(~>yl6HZBiU0c#EAX`K|FY6^1tcQ_ROdlyM)v?k%wL3Q@YB6DK{mo!O!3nlIoj!2 z(z`^YPXe}&ucbaSR34T>%OCUhOKRdrVPfp zKORw0f9`lcr5)R0U4y6XDETERB0u& z&l2DUcrFA}`RwTip${nH@F45Bbr!>%>g_82mj!UJ+#i{QcX@o7%y@T0OQH-V-D!^Q z^xAi}Sjj9^O6Y%#ijT|#LTb9W{~OHwU;&>$am+m0{<8`=7JKJ6EtcINi#_;#cSy% zcdRLGPnQ-<+;Le8Ii@@h+(x$Iw4@8*#KIpBe)m}Ve5Jcy{W9GXTnu~25N$668C-p! zJ+|VxKGfv)H<`CE6K=r~R8I6=fzLb6lb>Q=Tep7QVb}e@p8pUtv~#5k0d+!+G+|#c zR!ag+pE053!GnX18&B}oUAU+mG^hffaP25-Ze^TgnMA@t3GI|VoG zpQ5d>Fj8BzVQvF$t0GWj(Ox!B!8@4-(p`8|NXganIL~lvATTWk%xXJZW^fPK3J*Ts zbontfNeO^8X7oMPHs6bPSh^u#pg>c3B4PjB@dNDqGiUyvd8(evUxp(_*l&S_kG$G1 z!vj)l;+HkdA~XhF=%SLVzg8Z*u7`Pw(ce?fSR2e|-8sER2hlsXdg#J1Jue z+jJcF?->g-S3@Q-eldzuv{hv}zc+phc8O96*GVx2}4x)ihij&@j1GNI)4e}2m$%8xQ1 z>4%Pa!{M1`@aCpkOA+2gxKTRnLK{~4Vx7eTv!cJFg}|7v0U7r6O#gLNYP#ZH;&@g3 zMURyUHb%ZlZQvs#P^}ocxydQ-^32c)*(&r`2w>XEJ$_p9j(+}&u&>4 zKHudHJGehmO=Wc{`0E)A4}Tc<13g#-iP#!Zc}hsC+k5!!s7=!5LBo$La3Zcarugj^ z=jY^Mmg2BeiIcJU7$5bHtO(rt`k)ofShxs4hPM!^;WBD7hmI7k2f;3WD0 zMH9qGRvOStTH@BE0w>v&&4^jz(V-B1;D-mi-J6zfr5nRs?>F&|ZgPFuj&L>OLhCc^ z*s51tY46}5?9nX*HbV8R%DUFm!l?sx-*_H7Ic{}jN19R>0DfON zBAD=*vSRgNg`Acl5L$QG2#Q#)-J6f@y)4oWlFy=!2zKhZn`V_%_qwauE@kV>>G%>6 zoDFaZWV|XYxSC=5sVb9_w#2Zl8eW0bkwT~8n8R#SV%K$1sk+j+pnxk39wKLgsLRcB zjbZ3M(mrzHSQB0avPL($W9ZGh*=Q(aK2a12La zhIQ`O{j9bbA}B*h`ox=JB;~`RHGi%+*VOHOUM6oGpZZ07dAA88<=DLO$#n?KReu;C z1dQ?OXuK#i$iuL;80kLb%#3xBLED3FlfdV`TOj8n01t~h6auD&SAppuU!o1KzgbOf z`bS|7D@%Feg@oXFPlzTZPXq70p2*{_H0NA`<3YvnT&CCyC!u0EW|*9gbj}P1n;g75 z4|1WN4v;XP``mXnFRy8tU(|%n-4%4dRPIE!G#FcfcgCrz7pl3zMw^8O>jReW3Xgv+ z1@DyWl3rJ$xN8=R%d}7{wCkCtw#Q7^s#92&Ba~a2TahoQoiF!mKFOicmD}UayI-{_ zE+>OfjB-DyJ?7HS7S%$L~6)j~1p< zKXvlk>3}PfNGd;fOTwJz!;csjX?&?&0`ug6j#^M3`rsGyJ*elHBmFofaG)shYdc^J z9~ut7<$O>x=onWVIwRiL{iLf$vZkTugqf*yOgdpI2QvzIdAO~0+%p0}%Y)$0tRo0{ zLU|!`23Q+=>h+GB%CGaLxS;c!!pt+jOeu%xp*DfvuSr`2MJl);VYK#7ZDTuhxWMbij zbg6eC*sRCN%fzi4*Z$CX!2T8f(1bYd7Ox{Tpr%jvuj$nzSbK!pZ=GF`_Op3G&Rv?? z;Bup#{n#%1bp>}@?}C@h&e$~4`@vc&PDSi#p1 zl3^x$aHVKz$ePqZY#_D$pv5sq=9BD}hL3tFuz_l~rHzUu?Gc1!DPVc?T7IHm$mw#E zg9rHcsF(DG=9Ftj3cokJ9km7Q+)qN);&91C<6_GQuGkv~{#{)ScM%ULr``jhZT`77 zmDqs5Ow-_jh+g5y3krdfK4KtxaLo_smADZt&|g?&n06xrf#f9ZI*V2_&=V<)g^;@Q zO_JYeUn<_j#Z8y~HGDfhnvf)7UutW)cb-zt(+`(X6v7^30WU|X|x zdh8Nqr+)UHY{RqrcB80e;Y)?71|lS9E)+r}o!=K*b_!HzrJVH^qL64_(#lr(SFpID zvhCtOGI0|1jas&PIX3k8zFj#)M8aR1T5GXvq#Z~43pOAH) zp-%d8_pl2DNVOPk%){ zaI=1FbGgz?9z7}UzQ%i@g_2&AUSps>ExZwa(IwbNjgfhw$vXXMK)mB5LjbL`7V|Vv zW{Uso8TR29$tH1j7tJc?#SGj{3FvF&DEsnEG># zaJ{y;-oLbcr}yXj%^vINSHmq@sB&?2#*2a0W3|;tVK}lG{|@7AQb|cTSAYUNKj&@z zK(dEZ24~4zFn-oh7TZuE88FpVSZZgQ3|Pfx3*`^_dS!$`^5V2&;5b*z595eq!{LX2 zg(%a=r0maVa|bDYHBa$&-o9n({zP!~ zWS=?om^M^#c4hyyW!Kf~xPxVU?Ab~PP8xl4<(@@FnNTemYj(If0~+GL*RN3NB6>0k zbyu;4n(z-7Za7M&;ea$me@U}z`2Dmf;|xDtCPh*6V>NhcQ@OIuSDZTc{xwp96MOy1 zN1vZPl>IXBYKj2`@lktSbTn8f2%nf9PLMJKjI8jlo|0?s_;bckBfxg6eONdH;D_tx zzvqaOv+DA9Ob(S;=Mi8JmxD*ZFkgtClzrr?$*_X2cJdX`|20vD6Nqp}KlQg>u%1^t z-xalbyN|s@V%z+|=lMy#K1S%RrURQdm-2w8!kAUvZsPS@R{7F?rb|&v0fqR``FwwN zU|_Zh&m(UfIUgnjg~FO_kO?JqSG{f*578J#t@YpcR|@~0fvRwo$mDsMI---nstWjF z`!-7N(50)0aL3=Mf~pLTDCV;3v9Mq4@*KXBeL2=Lj)EGb9H=;mV8h}dyu$dXN&yUl zN^`u<%%a&CS~mtZ^%XFuyW+kGktHP;Wh+K?K{maXA138b%TES%6}M$-q!9jiCxWzG zWaTtBGBnt3PMFnJ8SmpXKPCkGMV`FaylMvl9sAyYC`^6QRf<{+#KfZG{|~2(3>dF$ z3oVW(zD8yZ=7))~{Cm6dCh z$uc_n0+uvY9V?7zdt_o_PNS-lD9j`J5#5P_H$KXMdRZe#Ad{*L1(963-HRun1Cv0 zSC11hRFgau_p$xu;f9_m5R_{|F#dvaJcx&%AFgVLX~M8?#g70xe8_S5!r#jfqn@(N zRA|Z%9|5a}>c)fKGCBnH@*;4cnFjXIPu!Hw9E|LEdkI3A^kmD98FsqvG+7A_XJ z3c7OoYFc?=-&Ch6xlmlOd2PFiN}z~illl}&Qg$mcZ*qBm#0+Nl#B!@mjW3{6Y_nax zBM(3RVjo{R6`}cmX9&F`TqAOR7?VZvtI)ULdckN}BCs2E(!Ztn%?)qzVprb#BdtGV z#~2E(nH-C(HJGw5T9MwD&q%)C!-OZkQkbvKby+j#!q@=eRj(z4$o+6tgo^mwO2$;T ztqE#-0X9f7Y14Dj*?mCkZ@)$8fgH}U%7=xu3Ucs{5N1LS&L8T8O7Fxlb)$G@`>Wjfs9lhEHH8Ahu?R(5o0& zOl}A5dqoa*n*i9t9B#^P;~|a{An;46Dtpy`LLj?z*xXrI+NnSM>jQoh#>909d@d5h zZZL&jz1`rqbE!c;YEjGzQ9v-AHJxS&qH3Ej^qM-bAdb1cvYdULq(mFti-Ts5w1|u; z;@u@LhOGn17b0loLkT*w=|CHWZ>Vq;pMQ)? zhHZ!z0Y-WwX$$=~?r7h}kO4ovYTOMe|FmfA=v1 z;)flMYsQ0|8rb$p2QQ25qLBoln_d}7Jz`d2eaeznY3{VyE2son1O%(bC30~bg1A+1O~vE%PNl0z%}-l)*-VZdS> z^L*mXID8fSFRgM=*_80~|F?Cf$ZErKO3#n+AaunEz;}LOe&q>}?Y}n41TB1i{@1%G zN*XZ?72GfUIa4ON6Hj<^ktq(J!p2t}n)rUHL1=_;NbB@*&NQsvaQ;;K!1n0eVel;!=wD>=YSj4@4%(?`#~F)Yv4w(P3zGM;d7%ba>EFo|iAF z@Ab!3|Nfvi_dmpealXQY>18Gk;bQ6grI{l|WJG|TR^J6mTBx_)ew zL*I*np}m&zN-H52etswrN#zi*_anrZ>ydY#mLGnsES5r|^Y6bpW%bKD9&RFkBdrIT z>2Xl*{!Q(@rBxxzdw!)3_U7Ee3&fLYAnISVo?{6&!0Y%{mDEAufe;s?!KU6JIHaDh z6h;b<-yVOR0kF`KfBW~=m^u&b;uEe!oo1yQVj#-Gi$5(BAj*-dJ9+;Gug!Oce>V^d zIT$Yhwrzcl_6%Yd_@4ITC)KWL1OBc*dB5~hkE)7%__FltCOJ`t&w(idwMi`ypR_T) zu?uWVYBt=VUJ&n>F!&R}_&1R5js4XTbyf!}VtGZx_)og^{4g0&d$hS>DwcmCP+((Z zv&OrvTLxSEc)*wxKWylc5`2Lr3|p-v2~G@2x4rq;-Yi{BK-4)G1>57b@ul0W^sw?Zy<6JKY-JqEC^Vu88vah@_uO*!ZP^Zh2h zRJQ;5cDg0(vKq})6VC>mi<9)G*aN+ZSBx+@%z%09nMH`oNpkEgt#%@LjC~A4<~O2_ zSiV9b&K~VeKDj-UC?7X1)3}Zz;l9Z}*(2pxD8T*W4v~DtZpOd4B}`QgPOK(!>lP2F z;50}=Jct{7qjXmH3B_;Jwcz*XDS4#gVub=Lm7YivqlqyR;%f({rZ>3i~AAB}U~Ov*nR|<14K!=qP$n zXmOH*vl+V)K$^9=yPEGlD|iz;SMiCVBYUBqh-qOURFCs(v#cn@0Udu<`d&U%&alzC zqr%>XGoQbPVI!g&6q^~N7Bxvjo0qkig|HhpV>UmjRi~y|1YrI7L5yzpa*4ptOy#O2 z(=<_hzFq7t_AHIC= z-{PMpn3>MR+oA@(Cc4gikNJW^Ct#FTtJ|4hX~_5TOyDaXbbs49mvd|(JYxQ|^WDSX zc@!_NVvOhQz4BV;w zYkR^lo({Nj)8VL#j!b1{S)_9|TPM;)=Z$Pl{i9j1H-Sv~e@CG}4&W#Bu9hknQU zhPwTsti|w{JQaLzjQ+G&A=D>A)smnp`e~_6Mmyzii5?A2s!(JQ%U~(!%IzH5>A7HF zG=8^)P_?f6{*ruJ1~>U%$&pJ1;${mtr2O}Af3_R^e9B1a)}+c~H(nI%*pIfE~7jk1_?K5MNG)rZHXYAjb>CdeZG+e0U zn=K=+xWsX2Bo!93g-j~6))h7$dLG7eTz-Tel5iPweY-%|#r1nmi=S|1O9nJC%kwb9 z)EnvU?n--jJ{iwH_Tg)#_$*mGph1$z8|#MPFmvB$*$qbsj;J0|Z9wI{S<;u1*v0s? z3d1?+5UgZ9AVt$kt@xb$;5dPaub5cr<!xc-sRHnR}$|UfbhxN-S~W-P6-PP{~MaQRv)}q)3hB$`H?%rwsHGj;ymr03TV=7 zBcA$AIJXP&XkEcHWBn#{|G&<|lDNy1&q)>30`_bqY=OHlgc+Q~d54AXs?)H!Qw=jm zlXzL{ZI6ot=LYIIq?Wb*Pu0K&CpZvB-Y-w?TIIX`8gnI*1- z7ZJB}Nyu5}!N@z%QHC;YfWGv@%Jk@n4x@vUQRQDmXS(L|{mo_G@j8yJ3a9NtXxz%r zsQoXZ7j~9@DZ}d@R2OBI{>UU_BuKe;}x=f*A-@sB-;|&*b!mQ?{qD!TxtDd{qXXu z^+siHhAJ}^0z}|HWi+HL-gQ(OQ{O8;51Mv~Pyw<{|6}J()u+Xv3#@5}$^21cF+(x$;|6r_Qw? zzgeZ3!NYY9pJZmCZ-Y0w0z8kHGe@!kFV*Mn{tvDf8Gg31@}hXw+Y!8-E4Q<7%x`I| z>RtmPpMMeDW3AP9-s?!4Ibw^q=v4Tku2y7KUK3sZJhUcv3XWeSkkhOC^U=l7(gvOB zj~nExW6oHL$@D}Dg79b%5)+c!G9~WWi-a-4^Xr_0XjuCjy?iv=`9Ex1UhsYWp7s({ zRqNfI{;8yiG9Xi@_N!Fe#^s;v0Xzu}guPDze@uFW zr1Bz#+IJaA75B}3-Ax{kUw~K6V|{3%A)c%lgy|OWg~2dZdA9iUZ{`e~E(8|>`tE2e zZzwVboV?ZE(#}Ric!E@NFiYB(@JNiNqPIURl81!A8va-$4w4wE+VT=^<2HQpc&J4> zO=;%qY$)Yhw8-y{8f40f7{?BFwKccgBrDue;cvrAPTyQBlW924;JxT&CL74YJ*j35 ze~sxE%culq8{BVY_0wIe=+*`~4PKo1uPFxh?Dc)nrOr-!y{(d(M>nG@)C$O82KucF zYw`^3^bRCRGQh8SX*0Bgp+o{UXRUg3QMK<7(9>UMxpzxvrAhBhL++ak$8Bg~4gYoD zWrXG5R;kw%Ts1&G zwQngkW@e+`>1I6Ua`^9CDS+KUHOSAyBvK6o5zYjk7rF0vYRYj{NlKP0=@iUX95qU> zr&*W~5^;D12rfT0m>AJIl#o7v56^;PKiM@DmVOaXN}ym)Wzp;>#|7_YI~JrPbkdQh zjnC)C{=JR@Rn=gG>;0=!%M}%o6?;9yX^roX^VNC?4v$DDgao<{#Sa*7b88f#>uD{Y zT;0k2k09eGVZe-CHk%fg&dvV7z+@Zpn=z)ZhE2rfuH4KvHDrNUWN9DH%1(rNMO85Hc?hm`gd5k-`Js{B#&$Chfi;av^tAHHJF zl3kX3is{~QnGVNXmG9Tz=>8}3rBT*Y#H3Rak2s=(y~6upGx6prx_9}v*wv_7Ezkf@ zpJc|cC-2CtW*qas-$x=rzpot9|0ZjFo+)$c2pc3LYrVW|R7G*2VVn~%F?WMKzg+NU z{;Jeox_}_EZtt`C8qFo$pGa2R;4i!MTr`(Bq4e_T#UJOV#~l^bhCYZvgZQbW0*Nh6 z+Xp+5lSUZv0UvyL{_wME#>p(|X^y?hCc~PTNTJ|fw-n82l^h1vV~<^t2R607)Cy2x z@#hvT$gUe(p|%O&**FJXv0<>?VYd{r*W6DRywsXUdx;hFvhrb2`xj9KT}C$?_QKwC zd}f(8H2cJj0Ynr~MK=pC_Q@$YIwpCyfQfav3-Jefc%j4AeNGcujcNd|eWJOAb+kaT zGYn3;z8OlOB{Z@i1D-ttgiY5HOdFl}>Z#$4EgwNw7XPvf z0k07o6tEpimQ80Od{^WT=;vi`0OgB#k1WL>|1C@1npr%#vXn{%gUSV6lMt2imLr|n z{g0EPV;DH0AVI^+LN&!GM#y1%jKc`+Z|2)1js&&JAF)qH%t&_3pUezZbZz7C=9!Kh z(ho1G6XOV;kSldGhWT3cd#b*ws+V^DQhpiF03nLKlo1xL?2s)C02}4jDLOaJQM^G7 z>C*!g1;hyY9broyO$QTt z^WdP~azp2QJwcWjU7i`RP~B&tXovQ~fO3t%%p|#M)7Q==sUc^gw|Vz(u+-2@lMT)4 zc=E~)hS5(Qr0|d?_xtDKTmeqW8@ck&|B7{iP%v%N(}<2SSI+mst_CzMy|zMZz{Scz zaMSbo=aEC<#omOsQNJ>$*Eza^%j)mFQYRVm&}Ji>X_dA=#2apeY)8_eO*84FV%@Ug z`r^M{4uOdZ1e1L7l*4{ds^XQ(Su0cvK6|1~zc&3jDc(yYRar`ABd>|GLG9%K`Y>-Nq2p$>^BJq|M@i95=>y`&INP?=zgo%mF#arEs4!@ zxCAX|gU>=={dQ^@c4E1m=}qkyHkNvwc#Q(Id!7Dfj|fa6kdU(lC_<)RVD}v9b%f!st1>57K#gL`sKaJGIz}*V~14T^R`@rQ%;0!!=D*1_WKu3+<=9Bpcl}G@y z@A9F|Wz#SSa&s^qhBkd7o1V&|-M^4svA0B0Y2^g#-CQN5eg;P~tF_nd~mN(k7=LNFv*%?Aw(s&Kv3J~=6 zJMAqubJQMFw8wgjwJLm}WqbA&7`7~$LXHU&JL4aw2(B`hn#WU-jz7m)i+2HHj--*e}R=LvWFM~R0uH^2&} zs9r<5!H?=Sg4IIkn)=ZRCp;qO(5$;V$(U8q@`|4L?_mGEiy7JX8cp`{q12(9S$pz0 z*s7bp!80kZ3DdN+gc*ybxw7GKYxZ8QA}a~*kFKXA&jBkK14@H+5yI=oVtrk}VT^di zD@n@XRE&$J(fP2Q*%;?(Wjcf-(<+4gv53;7bqmXYOVSzx$Bomb2EXrZh1rg{{(W;B z?L#!hNnfGgk1zU+qcz@J({Dv$*4cEzLbL9Udh36ZxM91sw5p78llC3m7wRS z+wh9DbIv%6T_}?Im9>+*r;JpBYmB0~R^)5u1jNvDAOsUjhr_YnU14e=j+<%IajLKn z5hMtGTf?_6<3mj^3SWSM87Ro!-eK1>R~WpiKk52N4c!xZaF)#qhP=2K(BL)O*+}30 z$+Yx}o*8zNcq{)pPw(vWWU;DWVL#FZ+bozm@sCr$FY#iXMH*&iIR3b6q2hDie#h-+ z7;4n|yxr@(j+SI##= z$Bg<`9YA1&c%tjFLSk@Pq0tOFz2!nHZ*~Uzq@niI;ouZt)pV`l*}90!v`b}wIy+h; zD|fGxc*)o@nwo_*-&?@99;Y?1NGreBy^`85?UVcBknw36T`;zEzVXi%y$=&v^x6|a z=0CHE+U#-q9EECdX?cEid65R3h`1$p->>QcS{v@0k_{a;jAaAOK3|HE!+lQbNEg+3 z+>LQ#k}~2`uu{JSHJ&Y9XGZ~Z8uwhwyMp!;Z&p=#j+y0%%>r9AJy2h% z7+9rg#osd}%P>B-Iq86TE_VucTJ)4tiNTj1LdHmD)!D+C|vPoStW!m$U*VATW6QT5vg8lX}lRm?gT%6sz~$*W}zldpBR zLDl6)aq#nkkallyq}N#tk;Ct=Z|HQ@x_W&_E2SaqCSC~(Z=z((CZk4+T<%7HWfET|pU@lMDX#OA1R?&)FL( zw-!AgV&nCU*y?&D8I$k6ESd{$?}Ue}y~^ENnB8w9UdKktWe%hkW;fe(eD;FSEg3Q% zZ57KqoGv$BGff3%dBAbvWX0lWm-$~|qkRT*B{aqYm6b7m$aPa26~XTZ03Y3r^1g^=$x=P#AtG0eE&E z9tvngq(*4yiO1~wfN9NTzjJCy>*4A>SP;hOZr`U$Q~w#)T?H1OD#R~5@tP!(RKA3$ zgdEjVT#}NCjM{o*BO}ym=JvHZh|H<>(5uv{NM)iz#EAkST4)oByBzHGSKH!RgxbJg z%&Io;DU>s}_lwl(hh6$t}-9Uf*SEqjP1YoVf zFt#EC*(^IuqCb>=KkWu9%od^P7bHh41417pnn zUhaOf^#9kg;eJ{AO*R~T9B<8y*A2L~)^Hw~!JkJ~I#pNOJ_nY?=#Ne!bM^j;i0ck! zcogWm0-!(yjzLHV-&dM%vgt8t@NNlSy=)$Gj$NTz@gHc&#fHYkH!VqetmBmj+Tsi@ zw2zTj7IvJc$YuxI<2YU+9al>UjSM7fw0CAikg4dA zd{4{Q|1|Tth2y{JcVnU>RR$Ap|0k*6DaKS?R4z+H^W>Pm0BRfQy^5CXvzZv;TTiN& zR^U@1B_tehcZ?8!aaf$Y9MoCB6%bV0$1_rkGH;rt!$)xM&#rbl@$fRb&>Z>A16Le6 zc)V1ni zMJ9e@fq_H4Elz*zX9>>(ztH23>m`jK{B-FbUT&mc{a`QwXV~S2jsjSz+vIkl6E{ z%W0v}Vn{#*B1g8#IRnUUx8!_L4`A~b9n*e|3d8#CQVpMz?CsR?Y311AK=mnct<=fI z|Dl<~UWuPgkW6urU6yEY<~CaMMz+~Qj#n;vT_2f?SL4%oZ+J{KUikdL6JG_V#E3-MxxT%5WU{Z}cJH-`6^tD#RqUR)XT6=D z3zA$bc_{$-CtOndH=@FBqZsY_9P;Og_V5TOQq&BfCJp9bceeE5R%+wncGy;uB2cQrNi~?gETW85 z{_~1vIML>tKEa&CfY};t?BQks>8zElvhCobP5SWYF;K`Ye6%!4iet&bFCY3i3>bQw zwKRsX+VH5_Vhh-*X5DQwb4{gmh30CIiCV&*L2yb8;>6}L=N}^5_f~gaXb3pUTE{Fp z<=BDrL%_T9wc&BzkUQ)EDh#SbazUl(h^&N9&?HG{!=mHvVe&P7&?K+Aaro#SmtZoSKkF=xJ%3g>gyN?8{fOzn2_iSj=><&b?9ldoo~ zh}s>{D89C|2`qM+U8w|wj!zSRLzOXhy3)Ldh}Pyf`IoHRq*j0+6#F@G7nhe&j6l9B z5tjN7dn`_7dY^L+02nm>MgO=PKdU@;VpyGN6Hox|!>FY6=Uq2iofuax_1$e$2*RtW zWgs08E%dOfI!4kl zCD(7)t=4tvxw^AkIV<%Uk zEPK`?i26V*=&Z&nQ=PY4Aa48`FHe=<6(K|-9> z)QBN!^O!C|mRzrkbEEAIE$HT zbRD@*w)1|k?1rjJwM^7ai7D-_+$z>X=orR~m@ZWq&CAnq6mb8E)a78;OkLkd)bKSA z3q7|O=pOOYn;4GaAdQQ(i#z}=uhXeXTW_1xa-#U59A8)+qx-ds5S1NSRZx-5g4n{! z0z zkr0{;VyCOuFY4R(Q;hD1P+7aS^#8-wTSi6My>X*-hqOp{w{#34B_+}&AfR-24UN(v z(u{P2(nt)Qk`hwV4bnZ#{SMFnJ!hQ{XU*cvteIiYp8MW=U%$F$5xy%A*_qLKuvrUh zYP82+L;weZ?fCQyf$nh|Hy9#-JYge;W#hVmtjbZ0KSn(s42$3C*TZ_X_z-tLl}&fp zUEN_#+xpiyfihf&RDOMkbWXavX%EmDaFV9n#itcw@Zo)P%sEbt8jaA0D#yBERza`d z<%UW0TK2Wwn%J|4tsQmO0lbP{v-@5(&9>XTkl1&fhqii-;9=CMU>(UyVn7)%z(ND~ z*x=DA+Zj5;dQNB+epRAx-z0?gvT1c-3+m}1h1+`S@1b(QG!L4HXQf_jc#2~rutT#_ ztm(z#pyGEZ|8y&9~OnoG?69TSZwr}VOs{)4J!rpgUtOuH&i9d^d9{yu!3OVk! zC+Ee5#OZ2I8{9zR<7zf%l5x`MysS6wi$a0LkBBCo;liIf;{GZGU{rmMjE;xOs-&pi zRirJy(24lHs`YS%q{0}m z?n#LA-mB&U!aw-;pWn<0F1n!p5VC1I{#z3bmVh^}dbg=V16~|lpw;O1CuDlfCHr(d ztgIz7FDc#`XP_SZ_cN)SW#T350nFYkA8_6%VG9gv#Il~UVc|r|P;)jrgpwIy7nWcI zotl5PMtM_B{EIQiwPpi0pJ(9NrHG?}{mFxr=~*RIllh%6F41#RooAmdUZbcp#ued2 zkJf33`%1NQ4>YxvNEHNzr*@$sl-yq$-?p<0Fo0{^*qQlRWb?uL`j3*|QTgUuY%E-( zgI;%gXRQ|?Q!wsXQ7=DN=9VDxqb4b?$N0JaFUqGYiK>P4}izOt= zPvLCE0;Zz|7KWW<)iy>PYdn`GZMu@y?uzf;-q{km@ONv*%+5a_d&`}TCdUgo*3^F2 z`92x9xRBX*|JXe5@nkko?~X9@-B~nO#7FC283GDyUr6DXI079PB*;XWgpkmBdDv+hlDK)eQd(cNDVYWUpV!7g>G zvX&Rr(_Pf=Wz8VtRPeA7%l9>!u4kN*`x63J(XX1|3%=vJn-dsZ+sPglXRB+y<`5Kt zpKDH#HDdJ*z$9-$TdQc3TayukHg$0Va%Sk4bb}E^srp6NRwX(d5)QIcc!_G>31`eD z-BW)_kwyt%BVUmEKa)s&s(4SdV>4OKtXMUuco(CoG{ArlBSBE|9M7Jx$ZuSu`L;GQ zP-=oXnt9%(D$pC}pA_>{+r=3Yb22drm}l1J%;e z%BXxWnqJo7wI3%H=N7k|T>xdBULcH(a7Fl-_YRK$v*YIPgDdSo+qM;OCg6vN0^TNs z0@5`N9cU0bX%;G%hJ43|ugxJ^7F`A--aEae!ai2{Yte!^Qs;FhBs_m!*p;RMNl-#)hR!}{oQ*g;}vn75`SIs{UCNDCH^ z_-12I&)!4{5C!K*e@k(i!U}`ViMcAbTLCzyI5wr+?n9~WzMBrD|4 zXh!;e0e*PE@(6NYo6ns60zS}nFlQ4aUK-j(9(EpPKfFiPs zhaoaK$1CqbV2Ua!DWa7195Cp=n;;Ivxp)c%ip2!_8q3;7ZnR*XRgH7Tb!ZUE4t#@O zv~F7;w-EE2bTJO(I@TXIb?iWJcleS#TyGDB=S@=$aRsyg#3g8mtmw|=wGiY;PYT4* zZ(dn^e9Psn_j0R*3aFWB+ccg*Kxc%zo>GhyX0Al!l6hZUzz>Gvd*8y{vd2`Ub-jD~ zKA%4#k~GZW2kGbie8H+Bi&(gXL%#<<^0cghF9JdY+rRePZ<%p$h#_tpu-+HIzAOQ5 zK6Sq;Bc@Ya;U9k?tmEqXP15PTERUi3kvg)6V3#UVxdrD6R&&MROF4_8sVO~=fGqaa zZ{0$tqU^AAE~~aDhb}wrgBFK2EB0gk!GU>apys=J4c2Nqh37uru6=Lk)>?`P5=35# z(3T6e#)m(*`Wbn5h7~ah#V+0!fHxB+BQrHMpi~uB@aE$Nb)jQq`~0D#E;rzj^2)lZ zxe-lI<>uiL766d&WChk0c_;Wb>Zu92hgjDhhu*5yan>P|x6hcfIJ~vK&#DkU}^pmmdv2vU1-+ z>i<+?6+ z$H((iU|N?Y&yyL>H01}C)bgbo-UTk8uJqdJJ5Ww}#qRCl%x1DR^IRK3EUbce`mNboYK?6X8m5`Yy^Uc>eNO#V+V- zslhd$U(d_mvQLJrj8F7bIIX$^HN}|VTl_h8Q9ki46?u%(DMU3xD}wY()+N2n)&v_8 zLO(_IENc=PLjR<%)(cvkJoriCtr0!|vx>|Gd#xc&K7v{xf4K$l_^ylL5J{I%)4S+O z>#ft|I)vJ!M6-F^yw3MW4$!vB0LSqI9&S<-VbH`ORkpmMeevzCPxeyN6R^!W6PL8Z z+O~I5Pdq@U2So>Kdd|QE&p@KN+TxOg^)qtC5wa%Gy9?z^QI}4~hV>{x?_bYHLHh?8 z0I_uH>+ryZ+tjQ9TPrxp1>I)uTeuYr^Mxw7+?L~234mA4ELZ#cHvO7I{!?R$ZtEN5 zAiY0_nSHtBV3zaoxy!}@4!Myy$_+jv4z907!0d$B7#~Z%0oNu$JVqq3{X0aNjG)UI zLUrG8%fs=|^tg~-U15f*g8!*Ay#AIE8s_$GRCP};QSxP$ijZtQ9>Q$Jc1ak?j8K7_ ze-Ax)D|HFFWPX&$RF4rg!qPCFv7N28zbf80cYg6aLE(jR-1CGLG?-?Lc;gV`QHa># zuiuEUNSEYz(FK+3We-9wfi%D;kl5|WZE*OfA-mYdC#}(2HwRUUnzmx+3B9H&_q@xx z=^}ANx0$W4CeF!0pwr+dANI?zN07xD(u_?JUjJ2Q%eTJif=4YW0iECw1-2)C6hI&Y z-zdAQ;$#ow0)^N5(`r@a=r*;U%s6jC5ZC?G09}Q$@ODLIG|RE=J$0xdb*QA>YhnRe zeEHw@iqjCR>Wvf(k@Hu(KRCh{E83zJ@1i2C{x9nKQdUGBVAi9&7agDrNc()2?jQPo z-9N19vHa(!JIwCky|U=w$WZ~c{DHTb-ijGu&rQy;RdaYi&dRAYLbcgI?KLx1cYoku z8*2n)YDv{J8~%bw8pwE_cGn?#h*?hMlbp@{d4Uqt0LU!oxjkOZbFm_t7Ny5gNorpF z(*jOI^k`Y{ND@Nuvt{W%a>T62@ zA;Q^a9-1sj`XlB}3w%FllXy*~3P0}&hi-9=mUfOk#>kF@U|89)9FpyZQX{=!i>U6- z%9r-NY1)}qHjNh>G3Y`8V*H4AL(0Pd-5Pd;AN+F z7p^g|f>raY=3GS4fdT(VbJy&CqB>7IwsG@YEx%pK)l90XR_o8E{`)q6ez?}O2eln< z{f5B53^X=1ZVsVm<1{xkZM!wr!l8RTxZ6)i-u1Er--7p&sL5Y6HUW)#_~VE{XO$%L zT(+Ph{07%Nsd0WFH1$c|UP#Xwh4FC+vOY-x^ut7V0Hc+vt_#3hME>w3o_>Oj2;SH{?@QGh8YBQR0yj44<}3M*C8Nk&ubP&&{gI$G^a2sxJEL>;ZFDn1@?BH#MfP#(v!b^P5ywov1QrPb z04t8LN{*Kmoa(|nJ@>W${Z~+N?3tF0YVmL+R+m^*Z93epdED;nx$b-sd561mK-Iq$ z3k=(5P|?w`(9}w=EFb%-!K~cC?=Kgbq^&emwBmnqce8gSAIDb(2u^*Rq%);xF^T>X|cs>~|KCaN*!`PhJ?} z`iK#bDZkK+DcF|BVD&%ke%LOgdn|*I;9_G2pUU2i7(h9D-EIrBBV);j8|Tf~2scD< zvsQC&B=0t7!Cz>x91K3DOU0V-*z*3|V{APi;o7c;JXQrFCQ3o27~t*PB1UwyoF7{H zd+oga(4ne!Q046lBU(KighuZ`IybCMq8}j#c_^ZO~UwS=Q{F*9O+cD|CO($2F=CfE6#?z8kgbujTqS$|Ih2G>Q|Tu)p{S@3k6?-BAPXh;Qv;(TQ(C@-K<<~STs@q z{XqFMR?~pHABjQg6NZywL(+t0fx+wYccYEqWV?%!VGJtAkjTj9VWmGr+ULL%wyM>V z`JTac_2F-aO}$1bO2+HfFBgfcc{e8FXAvi(h-fy()##4Z;D^!4e1+J{m`|vLq(r8LOG|i^r=OkfCpx7hA=S@Rc)P*xSYh zq{;>%JX^21M69NAG({o{*O>1SudP%I0+n-GFyIM@t#(+wn;79mWZ-0Z!xp18EsP+l z%`N4Dfm@PIzAgHACILXj-f}w!Jm%+|K<&4cd_E6-$JciBGZwZrqhq~si`{V#e&(F> z=O4||@JxBODpzd|Qh;l?w{k$6)ZOLpI;43Q&9;wON8fv|&$nv>$uivF$#}M{xEomx zaAv9viC@RftJ;g0o`%*b!gOGS^n&vV_#T$NS&m0f+T321xvv#;{PUf&Fay{T;M@VM zV|@YDte+{#FF$|2bD5T<{8p8$e|zJ?EyX-nNU~`9fM^c&j!9MbwAtR6Pozf$wNJa2KX}*RD)|WBO^0EaRwmHfr5}e1il( zMH+hQ*LqMvEYAL&7H`42R<*)bnm&*oOF;fy4;2W;mdxzxkI5+vVYgk zp5fcMIHaa(-XqJPQ|4RVA5h+7KD%N8z2d#B1zZnR%Jl6v5M*u8St4VxyOMaI@D-ur z;<*B)vFDfCpPCFl%PSu!bZ?uvEOg^;S3}O3GKZo0uY>j~TVG|K+3#7Ho=>mKTlyIX z9uSpQ>`6xir3uC$bR_3Gr*w*pTUuB6UU+HG5GdwAY7a>Gx zeW{g<`Z9N3)#~gMLXWWqWiHiVwEBB)$B1Bu5vMIa>;KGuR&Z_2?>IicEeZtmGJc-= zcI=w3#5?<)hGKfLg{?{aTF&MDo8j>G*V3tYe+2fXjTESR&kDXUJ6pUfAce?y7xWvk zri9KJe^cA!G@Td^)~7{i?n$Ru4{MwAs-kF!uG?gT;Ejlu^4x*TYz>+3d<1WWWDR(IMvO3tA@@?aS0_b6*fJWRAyxyL?2(qXzN&~&STwiGu8=-zaCxro*DFokeZm4 zQtjRj1spPorkQHsHmyvQoI9*-{4a{;DU;$q)1f(?LyAaoLeb|lO!^{Z1?2tXtF;$q znkm%9+s=Ok;O*^a(Wx%N!v)!Vfq@;P>#mChXw(Vf`^y?ssTS~!gx_>kLbkt)0>=*I zWL|6c7r*BYS@^ysGjj7?mz7KR>ja`4D!=bL^MqAP(zKH_Yh6}E9q|W`1x7_h$Kbx=hS!m{$9-Q~AXTz`p5#;rtz$Qsl|Ryu z8M~qikx})6{!0eSCE-~J_M-`w>eE)E&uA$W7b9I)`KAHkN#|_L`D# zMl32%uAezbFaG=uJ-u|~K{8^+6pA^gc^{_TT}p3&*a5J!`w|IsPw6O&H%JB}+pXV5 zmDZ=BN5ELDb^D$|BD9s(deQq)Ia{9$>DZ6i8NDH&&Z1p)-4VeSxGHf_k(I9BvlZz7 zU05<*VWJz4zlD`p*a@_X4Gb>tqK|zo)XLG8HIE(7cWiO_AOv{F{+wpJGi1ExXWVwF zOQ|g@q(>Z5i$~}Cqz$hiGus{JS;tbG2?kuQ|JoqL}*E;|{OiT9d<+(Vlog zgb1#VW|IzVp>pz~g!*y+^~_Ts(b)Z;p3%~euiElB{}+4lB=~;X#3rad!WvWEJw>{Z zv%zULsS%_Eqipye(kH&Cr(Rg$h|N@ARCDHk{5SP^K(K@jotbNd%>tXkFcd2IribA+ z(N;`ra?I&39wN@-Sq%E*H?y!ltVGS1MUP+@{f! z-u-gdSdW{}5dDM!)=t+Fx4&+|s#2Sdx(QOWCE~U}pN{2SSmO!}Y6!%I1^mQ zA8gX-7!)G;xcSOPm&|-~5vGwaPui^~e;_41zS`7tl}EsSftts+D&GeN6UGDL85? z$RAuI5k7ma-!CuwZgr5~;)@Hw-==>ZnlwXi5$nHg!%2j;zy}*JA^W>>25jh+)(GFo z?Q&H8@H2I_eW=I>WAg2ANu9J{7Qxptb_iQ}{;Q>DoC-Mu#|Yac-&W%Ev-@az(w_x0 z&1hwp(eN=ml1;))rh(NA@N+uS7t9k6fwUW>X*3s!Prl#q^Jf=?VQ*{`-89n(sjRXG+*rCmJf6-Tj9vy5a$U{A2qPgeI^A|PMthu5=93QJ7 zP_Z|8^j1R2SyHavEcU;wp5rv1e2e?y@@>LIlAmU=H(l2A)tpY6s9}5H|KAs1J}n^T zLv+vf43uXs)#Nfrm{G0*Eb0#RwLg_2%bh~P)`#?HlKI_7vH#ye)wU}DPq=0z3^_E| z>y-wSG(udC@eTAT{)a5m_r)^=8vQ)Mbe0I4sX6D{LQTJ@B5Q5*^++4xqq&Li_eOj0 zp|YxT2(qsAgzssR_cQSyW2p*W5%8h}gNf7_?-q zv%>MWW)`shzw`$#$u1?_f2oY;B7w8CRmZ?6jxkeHr|h!Od&tz^-~PIxw;@jaF#Tck z{9`7g$fbFt2TCR7zb?A2FDUzX=drf~B_<`5_IzA;Ueoe%?#1Y00(xr|aEJnv|18(tPxcZN)xWNg@5MZn5i5%$0jcS*WT3 z=%dZ`c+szhohaqi5p9%W)RMTSB$+&V|LW1*(MJSw&NXl95w8vrF(c=B$Gka^kb3<0 zM=nBnbdp5Gq@+ux`1mi!yA<{~03AiJuEmYTvsuF;?~&iz?GhuB(|kq{C)3x;%F!ZO zx!|Sh=8@ubb6%l;ZCZ%NSZq3?*_;7KozYc4241K@klu3)LEENyo^(;-CqBEw;e;~m zy~=p$)y<2>2t(XQqkxURxKjNJw8ovNkLcazOY4NX4~_r8e2Zss=LS4?i17bsPqv2o zn0NsFX33Z4*t~cLJO!Ym?si`Y8MKMOs?Qb=UjAJRxdt)R!p&}izdV!d>|c_ z`qdTpHwLT5mEMm5CjccP2Dr`dH>+h6DP-U5#Mhv0V*SPmI2?0vj;0G1lSSV%HO$z( z&9-HIlLx%tFwX^*CCUy~4}j0^RyV+B&?6|!{0@i#lL1`t3-^*8;Ns#wU_%>M;!?6x z0LgvthmBz3S4~o*v48URl2ZuLD(bK{YUZ!avTMUH%_%A(ywCT6lN3nnR?77>1+*my zfwcb~mpJ4&&e??`U3}ZWPEHJLc`pfWzLh2+b$zl9GPGs$|4vf!k209n9poHz z4QknBP*;df&ZOU0KEf~xc60trLGxw&3X__NvgBhyF%7Y&cWEj5&-V?r3Pnc9!)Db0 z_~Ej2ssA?Mh@-S&^`T?F0a5xA`v^L^uz{{gmp{9@KE$uW#=PNv6b-=nCB#{o#!Gjp z<&1T;HRQMW!%_VYLpS|4gjNSVC0HFTq~=}y;)zSw9enEW-F)Y1Bws^)-u=w=c{;S6 z#{DE9BJZqau(7#)o9B4m{4B;B?LHUflgr&9)EUyg*W--{w{Muw|Ce_-x8Ff> z16@U3ETp?C^B!h_*wGCZ^dV3YTm0_8LGX`@+VR!S-gi9&ul7$_t|Fz(hdp6ugPawXP)I`dcn`8X5J=eDf`?#A>Mn4wk zBw!V^-eUIWacmW)vD9Sa5Fqj|;?GCOm4E(L3>nwrsaV%56w7W-=1pOdo|zKas9WldL^iOd^d)x zbD^g5{=j=Lh`?d>A@QWir}L1;S9c@+co{53!B^H^wbHaL!t?JmkPmuvcpQa4e>jsU zer*WI4`2bQTEX1p3?-)pBWevHu3QJf>xeu{_;6wncLFLLmKOKhl>(zV5n1}Kx*bBbyY7euV=m+}A!6WcdIN8uBkOpu8&|X+J+>OB;`~~0xph+;Gu006T zyAnNu#h7eJZXj6|T~aC^ZIo8u3>y`PorJM9HisaC-UK}|oSZG*s4`t)z}b5ierMa; z`S5T4x_9;a-BwNaMi1s+Ak-Vd1~&_xiJ_n9uk9leUqzRqsGM!*1Mh{7ZTJHGOcL6N zO3n&~#(bN5VFHqU=eF)*(%u|(5Pck^zm>K$s>A~kbd!T=;* zU{s-VirkNzOPkSe=Q+*!$5&=ZJZ0)uty~n4Kk0+ijc-IE!wx_LF|IiJtT@1ixv$1_ zXdL@PYGUCM2cQE_=RW-)q6;g(HMt=CBd^Z3#bU`Q3{>2G9D@pnPd6%=fyJE1JK@ug z^;%pz*Z1JeTBPI5fdF*ZA0*RaKdD(@Ils0d-EinnQZ0pL8+HGo=*645WZ&KW0W^FQ zd#V1OmLBJx1eOMmZTzYqcYHYB?f>i&cyZ_?6zue#g`Ao|`e@R7T9t5c^O@Qbrp#&R zbunLXdB+wDpVQ$PNv2j{56Kd1JG=Wslao_z$J`+i!MacnGzZPemhxS3YbUIVSLU2;G)XX1lZ&J4JVjCajRcPg#GR z?a4~vpQZ372w-@0d?2DwIiiz*Eq_VxIJ(XHEmLCNvlue z-{gz=M)kMUe0^Kb9P4GY`CMAm&mi~O;HmaeK9SvtPrjZp2zcGQcjeS{cy8jK z#!!j-CMLf$Rx`Muj4paehtj56 zl##p${2NX1)?cP2{=nRUAQF65dqkKJN>Bhxe8UbnZBmAF$fozcixaX49%}R21ip&|? zt*Fc2O|;_F@+p!QYo-b2EI`1 zDP96Itr)vk_kch?3<~BlQ^}d>+k_zMK+;+8x=Rx&;7g=^t*q4p3W$mWdD1NRrJaMk z3wp|6F8y>S>iw%(;7Q@Abalc5som>kd$`_(R!eLanD5^q;k(XS!$$d*ALeTP1a@x84XjOA_hZLk;RjrhhxFqqf{=Aa$?<525m$h@%P^?i3hOJ2!W z&hj~!ti-h6kQiCCXmn7>PZ%p3Q zXLR-i@VYtTZZAAxN8InC1(n8XnXj$tS|w^TE;JrWA*Vnf^B0qX$mx2asdJwSM-nP5FG|m4a_}w{!+Nv z5=5N>8x+vVCJh${<;N|ptY=8aNHF!?v{ktG!=jD3Lo}^7yYa`-+h-ZpLEEd)k}X8H zOMFTZ^7#9Y<3Cex`MT?+VU$|sgSS^_KE<6rZmvvOROF(v%Vj461;*|6J>tRomqp`0 zUwuBH<0pl0$e+1bTZxct5a^tV!_WjZ?bwNo+>%&8gTCU=>xR z(%~t8<)|GnEE@?Is5j!Y{;jJW@Qma5eR}D%^b!CLJOM2_m_IBcPD~vdC(gIw!0ye` zMc$1Rw?x(AIt&p_q82b}vN|37C>l(|mludh8`M=ujEp*QY319u@vsWWNy2ZV8&~G5 z`d0|JmXdEI!xWFhZzJOn@k`>T4o$O!$g7vP>BmFJ1QEg8qPXliJ{|J z^AVzuLOjfM=Fh>~0MWDa(Yb!t$JV3`$m&^FERR{pfL<9lmE^tHr?&@ur9y+}+*{2% z`g8BvW=5?lOk9$F)|+*L`5zSM?pzV=CRbwyDZCxna$OmNHQooc?e)Z7ay`TOB-WVb zJJ|b}AV!?1Nj*s*b8CToJMPn2xpH&Lw8%tvr_xUN-mh&d1tG}zd;Zm%>z}XhxJO>N zdG{ZKTM%%^*M-Xln*DoOBH9R%*pWN#9+W}j^UBeOS0HjRa@`Ngj|CEg)i=$ssk1%C z@B9Munj4`(gOW@8A9JQOrPhm@yq4y!J3WAMv%vNK<3E_7mdAPEzMi&E#`J;|fZr+q zGE#?CUJ&}|Y!Y(%a>12djnU39nL5ihU2?(kAX6~3Etd8>qTB>&V2%KMw}-XP|Ac|U z!`~v1N4h-R-Lx`Z>j#{0v{Xj(nzw}Me+*fk;{)Sl+WDKr$NNo4HT*{nc&|y~|Ftg! zRDe6@*A0U23{G`2PUd$_>-{xMI{bzIZg)YfPMh!(RjJ*FI+p05@WiF^(ws$^o5+b~ zgO2kwMCYT zjSlloB$^UG%mS{2kEhl6^g4Wi$F?OV+F)YZp^JFVqX&cv%`IS1@-MRChsE+l>0+mW zTw;nqSXfi=$<^@{_@3=}Un{^kSn4uVbB6inwjETGKVVY5iO0RT=-PohvX6ggS73>J|!3ond z`t8Y5@|j9NG6A}?^SnK6v}EyTquSy>F64vf=OH4BK}DQ!U6@hCJh&flCG@ZcMkT)O zTkiF7^ofuQe6`J{H=Fxl@u~k)jcDLx8I~OBMw0!4JjEM7iX))O#HE{tAYg+x!s_fI zjVmx+0l-(`8*p50>Y(wQ3^h(#yQ2>HC1C9P?WiD@*LnV(kC{pEX8dtd0Nr%nWf5B= zBmhy3cbj^yVLX!Ea*Tm)dqK9*Yns@+w5D!%qK)6(ereIfrW@pi4+Qu9wh?#Fk7cuJiJX=`>}lXG^TYcSE(rys2T!D^CB0J-FtHG5Y` zADwO=Z(-KhKOA+F(KtGyEcueUABow9OP$WEL`dPf>86Ai$A_{15*(_J)GkD9@sKzH zukTt1qyYJ+M+SaRU`4r=?TCC@e9KMW&04uw#a^+Ii-2IjI6qtOTx{CMT|U6|ZMmqn z%NIHKnupaU8?`n#VzClgP79%Hs;|@oF{2Qh-Yb`mo~n@qY|QiMR~d7dzlI_(jd*{{ zEyA-FG_Z4OqJGt?Ly$>$8(mcd2@d3!PTPJ-_9Fh?q2y`@0=BHOe^_+@ylWq?T}BOl zj!8YDS#J)+`_}eGU9X%35_-25(I6DGPOFbMPL+2(qkm2Xl*|;J-)2-47Lqv|@ZjoN zJq_-RO{$OV-w}I=3^^{^KdGx`*Jx($_{Sg>TpE*+7nZ0Rv2@hYlp!%FKf-iDowP{3GL{%JS=dJjwoOw0UdlV7QL=3@e1!B%&*Uq zii1OZ%MUJ3s*I5;lb0`OJMMgZP3B!Cl)^5)wTlY3Vn*fR2aQ{br4dXf6ePbIW-#A1 zzeb>1yedSZ8cYe9#{;u^F6Nel5=@^{6grP;pB_}RIfKANpp{y{g|cY#iJ9bY{XH2Y zZ-FKdFaLM&kb9b}-$jZVesVnFX9Z_=!?1q5PH9N?6{BFZy3qdK1j{U7x(@YvP!Cws z;&uT6EyBm&AMYJjl?t;_h2xrWqXX|&&!O93OEx>=`h-jkwT-Dd_Jz+q{~I4@^(gUh z7R3T7f~_|`pRtJ)pLh^?M{kGB!A{ct+d^59RTH{VQ)JnE<~Wp3g82go z1^oAT@_`+u@pl6<^uYu*IYrGU1YBcPgOMTgrbzy1=G_7`jCYEGx3B0Z(H4zh8*oyi zk2*qcS+iZ(_zafVmjGw>2T}o*F3W#K9JB03zn;5O_()AQq@UKHLlWLOD?=#YeCFPR z?RtiUjr5Z?wTD(nqDbWh^-?A5C@oMV<3g1q-z8!GT6yROe0sT zV>i^uJpXo3Hu?R#&+$8;H@b98skV{ zd^Ds+?%V+3eQwc(wXWRurmH#+if(#Ow6mi-c-C`=Z0Z@vW|;nFBJHmIvX5ovUys;Z z_B;CvB06QKLS!i@c&W*qtBf8=KDYKmth(DAN}Js*ZIv+vUga{d@WjQ=O2ZjLF<%$< z7Yzp6da#W-mNjxQPN8SE;q#x+ zxpx^7h*|DmlrJ{K{7F`&ZVMi%0D3?L+Gi6Ode;W4^&ygw-D>%3bay~a9pgn+iNedF2GTb|nDpntn6IwD&1-yd;?D>E zL)Eh&Dsm14Ce?=^dPW~bWpb0QLTXoHrSp(|%-`lpxr#EtOd)xXtSpMi`g=^~XPGC0 zEPWt!+(Is4++6EOSIdgS1{?nmi5e-h&f{F$DqNLjR}dAPFA1NCBSGEBiYaP6_OB=f zhmDSqGk^DkHj*;Z9y6)7H19xR-+&+W{m-(`L7}1TDtG2@<&U~}gRpJZt<#w8e$gL| z0vO~MlJGqP_V=cZ{2_N#z!|_lymPuKwf;tWB}z$betj>cN+EA8cc}4!H)z;L#7bC(8jeRprub7- zHXrAY)S`{mK681c)Toll)#^GIEEa47zQkXD#Y&iz4sZYtbPV?VB}u#@SutQV7RQo} zllOVxHBEF_y^|{)Mi?qxl*Dosd?&BRseJ|b^J@C3Eo9eO zn1jGLbZuuCjj%I*fH)wZpP$TEIjP}olII4Gu^g-Y(6i)p+wWRmU*Ti1Wfgz8;xk3J zSm*l}hyBX*Jr^7qE7XGNyczUabHV(M?z|9o@+XMh?5uR7cG-Fi^zR5ZDkNr{N||js5q#v??UeonUx+s1Pj>EE40Bwa*CU%%T{_OEp2*p&TFP)~xW_sr z0y4r(uIeI|WGrcKCH{@~;_cCh<{wM~fBpCIhT1mS3)~6I6#!D01u48AbS`W1;`I(@ z8|MSA;|PEzJ^~PbiUGZ{JS8Cm|CXD9_15DZ2~`=oM(>#C6sqQOwebrM(Dl<((g@^T z4W6^dI>Rn993xT4H!|uqnzu!C`E=hmhVk6}h(7?FyUme2-q^$K{${y_Kj_llqKP}e zSvHS-tqV5zJ`0{QyXDsxE^ST)PpG~o-@K|Nr){w<))+)%rx!BTmJ0dGWfs&ZY~jUo z=oK>S9QE8s*#2whxXBeEH4d<)G|4bTgb^b@5(}0MHT?5CRutp)URl)<;`nTx4@*4a zsN!&nTR`0YF-V+1_A-_jO3pbni=KD-RzY*m5|`EW3{^v zGo~dQljU%1ylyPn4U0eW2?{-8N-{R~a#sj6nC=rj@0Z6kAoSyNNo-=KeIjZOfa}Bv zE}E-!Pte1diJkhg;#R?QfSsSPC}OE60V<`K*Sb3WtzOALa6CCm-JIZC*p*vfB##=$ zndkt!rKM^6HZHpn`6$UGc^OK&{VbFr+X41jC^$9()jr8>ZBh(%=4|y&N+Mm*&c1BG zG{l)8V=?A>+4N)(Uq>7NQsIiumxuzURW&$Ns-6{Ads=%3y_45Gs<;+qsll)mLMmcP z%Al-?NLf#)l7hGr%zd}8eqIhimmpxBjtzZ%1u-Pv>{5xwYaL>?hy=RILdDF;_w2%c zcU%$_qvkY>e{2#XV|a6~ zP~rw5NNCVp4O99U`T9Ld^z&_4>T@_rT9Li*(Xoz4Z8Kw?<#`NdF#Z6JZLdp&D;RHj z0YoOKq31jcjni&f@q>kK=+ajx^n(g<_*KN-zlCdEm*jR~|BcjbkoyS(pW4XAmR*`o ze-3sIN%oRgj*fH!dkafVAtST&Zc}liqr9ItYtIF+)Hzr!#IARgyxI$nEtrGY%U@rC zP<{>ffcsK6%>P&}KwvnNlUwz$M8D*RbEtJxi}soF8}+`U7^rnWd(8}N6C@05v>WpI zqB(CW!=@>sANFnH^xvtUI!0NVO4zC>|I1v1KzdKJQ0w!%_nZIa$mZG4g1RAAu-3J3 zk&7PV;V!DTafB>Vb1wPPqgvh{XD!w8X;f|%+nB3}ap-T|D z#&6rqD9B3pFN9PgXK?8HWP3Dh$0X=wQDs7>eJ!Lw zoXP^kP!L%GL3TnF#F#)*>z3~`#0+2pw0+7Z{pMY7&eFZ*IDh4V-zbT;Mc|^T*l8nk zIJGE1Vo^=G-&p50Da_?bZVysetC*l`xY;3_cxEITeW$>hwUg18?I=H>L)3Y2Y9y`x zc+npaY4|g{`t}|3osUVr8*eTM-Cx~4FN%TgAKAk#%?Y&xxuxg}pV8MPA$pq1q5Exl zmG!o#KbW%9{F6_kS5s#6c}aCzHQppN~ zuKM3Q&RJnUl*3O5U>*(jaE*jyFR2YeAUuoIzVZ&!qU=ujJF+#Aa*NsleQq#;VA`aM zDieBnjyxSj>Z9K}gTD2pV*>xDGzZFcW-;PoYTJXk<{w@XZ#_?S^pq1+aqd;VJszx< zCE^)7jC`K8#bSQ#hd?~7LbxBOxS472oFd??uRX10&?9)7&q4A9FmOuYhIv1oE5m+L zFpBc$w*+)`hC3i*>JZ3Q@^4c4u6~Tti+4d-o6^V|gh5AQGW+9LLu(nw?#B^+wP;jZ zCr01RuJWz8<=zZwq}5FvfO*e$Rn%u;Ixm?}M}h9W>3=9>w9K#X7|+4ja=G9Xq`@|R zxZ9wDpsLewHzBbP{TdltOKeDpE(Z4em#~!AHcSFPC>+d!$jf!6s`&RGhC4;+R>>GY}w|fv3r+9Ww%a1%xSD2=&*# z>HbVZCjpDii3zQwS^S=)=ruMSlF~HZ)sj|7neaYLK(8Rmk-6wIO{8eA*esx2>sR~~ zOjG5BeW+4+PZ1H}u6c?%C!p)xya73-?_3-*aF%d4m$eblV zgS~{0B($Fhht`)oZ@1W^{M;?{={BGFpa_?kWD3?-%dOHoRA4`^~LbGtlt5`$c*ThGRejEH_Mn zc>4X2J7d=ei9*8Yg?AqJ23E1;%8}P~)(wB3PEGh<*x&;5ax!0$c*bzk@;Z=wqYxL7|*<#eu zbI`!YKk2~!2aGp6P=H}cc>7pEecaHPRfZ{3p- z7%l(&xvvn9E;qW_US5w(6k!za=ApQcF|)w(ri*7s3+lIy{%2nv z{|`}T84$%EwrjeP?(R@h8f57f=}@FQBqbDFy1PT9Q$#={m8Dy{Lpnr|h6R?LGyLE4 zp7VV_Y|YH`+;RP|Nrqr*Mu-T*$PMtO{cIr^mvC@uJMnq-E>kCJGI5?i1@Rdhf`IHg ztp2$Y+6?0yTk1O;zHUk8c@{c`@0clf*2T>)@3{;DW|+y5e-5Sf!(V`w-3u%0DYiZKNrz~x46B?ZjHT-EFlv5~y3RO5?z{rD2pBa>jdm((6O zkqKM5t!fxolAOJ3hP+7X&vJ^`6$zG>xVkqMtP0E*7AMqXaU2u1@MfJO_hD`N5(3ge zEh%)h(3Ec>#Us!0v$Rqj%(|}@9NpK@s#+EuTIno@`2fSFg~=v{;u+qr(em%EhY=V4I$6zV~)Q zU1rKuk0KK#N0)y`^OhLpow|{_B|%Oy{<(-psCb5AxXL?eazg-BYg1T(tDfh-T_Z{!>Y=U(%J4I@X}G9nJJ+# zsI_KoM-G?5F0sU&f0kh9N$}hLO-zR@b63l}9_3GW4g5Q^z-k<1pwu0$pa%otf)rv_ zl=Av~6XjW#GA%RhrKl~&VZws;Q-$DZb0ll2N?9L-?HkGwkzZS%95zJidAgh_V;KEd zq|sN}cM_G)DA@c@DuW~JvtyitGO%wBU}4`4=;+vP?jJ^hG3#RNFW(N zeHu4_k4^LD+h&qN!bv6E{wKh zX-6f_J32{*x%u)o4;!Pf=q_}cogD3-5=P)T@Zb|Rt@UBhPI@D$uE{tk@IZg3QJkIZ%khdK693gqv3w z{3Alaa`9eo4%hYlY&Q(v+^9`sRf~Ix#F5(_D~JA1uIafjf=KVz1oh5ekxc2SJgqIVr+BstuuInz@YQBgYH1F zG;k>N|Ca?Y9L=-?pept;-NnYjHWhwB>0fz$jX)14>Y&#Pp~lQbP6jalg9kTbaAWn+ zCyA9|1@9`kTI1KUVU8-S5*;P;{B%Q6$K)H2U@ov)1OIoS&>M*NbETTUM9cKQNT5qk z<)hmerVVdpvyY8?B6E366a zI{mjezG#o^L}T&+=@H-eZ+R-Y_}@D!<``yos(7X{s8d~I>1bhYUo!nUSYt+|P{h+h ztSxrNR)Sxkv%0MZ^Hh-@oDTmmCbkZ@1ym1;566j7;?5vqq%Y%LF{Htyk)l?&5yr1z zoYKs?1>PMfCY4ncoQ=EX?zErjA`;u%0S#&n&CWP=;}2x8;8f2VAoVoC$0TQFN}nUv z!+ceHDfB!DY4gjeNs-1}W+)sMq^bZ3*@&!$%G+#9aQcxz=aVqm;={xU(eA9!==$uS zp`p?}VL_dS=MXehnF}T-+Gp~cobh$%K=5cAFD-kebhY7us1C~ zGpI(sCno*@W;c?WP>m)&Oc{C1kb`(5$c8==8-qm^K2O9Nd!CvF9CIofqz_>vhI*jX zfumzVA34;g8GSQmTrx030uDq_-T>%fThYeK; zJ|R+xi;AThib@9;4w^riZ>h{^nYImw^-o9>WvILuPTn;sgwAcKZfFB6mY)*d_uhrP z{MX$!ths(_Oo3+zA(K!TIP`406+lp>0k72%^CgtRZnUjW@&^_U8QRkEO&Ir|7<1S% z6S|Wi6@^{Ou7mS*rV{LbIr308*sFhrcBNHW(zakz7CxzuQ|hWP&(hVK!|euSSrph*7 zoXDA2RvfY>K&FMzC%sohSiUk6)4KkkKjl#GXUfU7ji0ag56%){-tiM{v38sgH!W1$ zWK-WmLP6Ajg{xkRmAaiY4XG$;=NEfEyQ#x zcP;SnzmA-*hJ?>vkND_bZ7E13m++Z^AztN@31$0|FoWli9%u$_PQ@Umv~s z^+_l{`I;e1`F;lmnmkVO-Y+6+EMwwyUrYf5oxHcNyQmsxcJJuz&+M^{3(M0}X5-j@ ziT|G55j#Of9YD2D_bUC_x)(MD2PJ*^c>!ajK$Rf1^DmeSlEF7+yHj^)xfQwo_gz~F z?))b0lW6AD#|0ZnZ7%^04D+EPj@ZJ5w}0wS#1~c4H+AmOzdbTq=Q>Q`M<^$&|HDv` zv6TnMD0f$-x{5b?JJ5%>{HJ!xmt-zPvCpDEMOVwJVbk5xGE{K%UE}~hK`6zyXJ5qX zh`(kWDk-4hW6h-UQ}XVIvT;dHlY44c`+Anjia)o|9b}uAkib40;aIEy>J4sZA%)B) z-VrdY*pvPOEXT~_b?!b;%R@&+gr$rn!9Q-L>E!JFPU}^WX~1>aAY$*8M;D2Ct%|G7 zcJmTGE{^oPSqhWMLr_~pMF~Fgv?}do7l^mXQzuoE<)t+!b*lD1=GC$E&1B5@3<$jp zcfue|i-0&4e}OyHMzgB&P>7WT*U-m$TwL>G>B4{_KuR*LCaH-yC>>;O19o==d3 zGt|0~C-F3fS5)CVcgs8XNh|sAzv>H?)FKnaPg)+sy+a0U*n;nBch`m_6!lImB3%V-lNCF5 zA-l2kRH;GE5_0S-{qZkHPc8TzNb^R^mQl@l8rrFXu?PjL3ED#14Y)P8-;OrvB)e^7 zhb6O$%IFPpwpZSYD=knV!;9g@SE`KZ4_XnUrOkw;ToqhV1T6}5Ei{9vB^Ns<8)8Oq zQN*}g0@nivRiw#P7*o^`9j2@H`wFKXc+k0AzD$Tm?Ph%e)V#5@EPPC z1(#+PUW`tZU+N~aa(sqv=)$>*IC1n4bRTughmmqAXOJD})44&xZYe#iScwVSI{8w% zRNn7c2fF6SX2h{Jj^62jZ(l(1#zrZ%B;rSzF_EQ=m4akF-3R_@N_(3y#@dO6+~14A z7}G&v_mc!S{5X7Sbwp-b(@$Cr0Y54vN_MBWOdPP8i|W~M2>Ie87wS`Vn#(_^&T(N- z$&l_(KP6q1b@-B(0!lVPVju3iv5_QxnJmW{xn>am#8zhU--)**(Yu#}+VnbnJbg+Q zCAxWz#;HEY`Bk0b>K?#|?J=xx0j;Xzt^& zKgX|QUr@JQ=ps6MG~&-E<1b1}zInl|==#In+iz04>7`$`(wg5>fhzh-K-?0C)qLvxltCe#O^c>##oLaWVmB_~i+9gmK=`p?9zE2(cPgAF+JI;m9Uk;2N z7Wnc?@9OS4<5$E8GtEiu52BYcsX+YSi(e zDu`L&U`#4e=#4U4ui-kG&P^WdW{1tfMrWi;xXfZwJc>tytH|4X_1=~6f>Xt~PbXu# zXWL`fsi)#zjX&bD;tIV7w|}{ZPuulv)cKU za`!Cj%aQx%cdkz@1W`J=OK zerWT=AY^eDP7+ZwV0)k!L07CnrMx_Odx#F+3p>>Wxy*5yBY2tXIt~3*S>9$iEIK}j zgX&S+`l;M4GdvHDCzk}Pwo)4%G5E5gVIUpAB*X{}&^?XvUw8k(HwcfDrf>vg#!m|s zI|q0hBMQ{sS=v`CUdRyw4{D7|`L{yIC&2!>5)6^b>}A527UeVH4N*Xm*jx}m2p zIF-YK-O}$-qw3M?OC~xHMD_LK?99lk7ZZ-g$gD!GDOH1NIGI)Rru#1l7Su|!)#h~m z!I~1N*?ylqZH<=Kis-Xt9E=AI9k&ZORkm8-Pjyz778~1@ z^eipBr6R?G^KTtD;XJEj*!W5i!sJE)MOEpu_+MkHgA*&kw#mqo_IAvg$!orFm*E^T zBY@<IF#{6Pr)*mleN`J)Y`sm|Dtv6#ibOV^1Cp31KZ91+oanilbi59ARR6YxiJp32E>at>dq87%svx6 zq^e~)K=|efDWJ*3BG8rbT*5RFCLt$wvZ)v;B(>Yz!L51REuQn40kCV>-#l6xC^la_YR=^e2XPis_NMdm0HSIEmc`EQGi(%T{{LpA>V$y1cv~1v+Kf7X!wCI;QrJSWCrZrDZPV22L{vJIk=e1t(C7uaSS#V%**cq_ zmbPneiMYe{X&pD1JbXS4%7?s6rvie}>OD%?SlLK3?r{^>V{yXr;pE&LFGn*08eQy8 z4lz3@yQ*cF;tf-92(SZ1MbF2oH(^I+*%wCfWq0-g>Hm(Y$hIN(k8mhSDd~3%Ji}wZ z>sXlHWqk-y3F7qu-K>>>boEJm%4vVOp2Y*`*y$d%<7ou~W=c;m8c!V?FQH|QCRk1t zbHA+c7c8x~QTb&6Fa4Rb-)NICKhgFT9dvUrXuRz;x8_s%W}uI7%msGprq1p&u}q&$+2kdO*yesL4!s=0G@oh1gxW-rQug<~ z>IhD?>p=W!T3~q>^5(L@|J{MM(k>dbnY1~J*w&SvmhBNLQo2BOPmlBYES)!MTY5sq zLNd_qWMm*oaU)J|#M~K2#EOvJY}-rFJ(H zP*p*A8Xia3kBUT(t=`oG9W1X02TKTau*@~Tp)F0sF&BQNO#UTXmF!gQ^%=Q`1}&7J zh(6Fku2rHDkS1oQ18F~CiwYds-bFoBrW< zi(eTUw11e0t$H)^N(X8l8YyS%kH%mv{9mYKLdCaUjXtGRg&)~{ya^EM`bMM8Ru&fN zv;7Gdc_SGwJG*Veu;PF7S(+=kqV$#v?i~-I3Y@SvH{qu7SByO^3LmiIFR=L+y5KVC zjMP0RnpXcv>sh|b)L3#6q{jLt6kI8qYu5!q+SP5?bEU z7|e$G_O|Z-7+BvDm1ReF+>#U ztLv?+LB8Q2lJ@LPOgdZnC*25qzoDTB3s9rPKe$^orafAL`q~TORQ%f6nPi*Ak-}HH zt|L6W;f#+rl8y{On;SL|f4TnvphwN;MlnfdLs6rd?g-i*|tl!_+mB44o z_D?)=ZSJ$MLT*GFJvbafKnH7rK{;B_9JGT3&@ZyNX)Fgx`t#Nk6Gtn8XT3hd+1PoJ z?2^35(ZmOPEB|Eh?<3Z}|8H+q3rx?9WtK~`Wp67)B>jG09}08m@|}%Jtj9>{Db`qY zxP)ZEy(P+3sM5a;6m0cASDYL`x6wh0>ypSm>m+6i&ei!d7>L&kHO95+{B9368hMZ* z`07!GxI~~$N1yxk3e28u=L{OvP1g}s_bd3Or+f_$w4$26o)I zihpej{E&Q|!?m0HQ@b9Yp`O5M?Fb1Yy>#VBuTS@n_2&9 z+KpnQ1>;7m!g);*bS(ojI7|+^00JGKs0)Qb#Z_*qRX!76JhN1Yu(NcPu=08BN7C9i zUvcd(-CHmYf<>)7-y~BY*($qfBeXrL;Nm9cth2ueLjUi|lIYii1622{yNrOhKOs6S zZ36@cW!v^aNTg6!9JVmmA%Y{?E&gj>JRKb?y?oO1x>O|Fw7eZ%|I7DBGrW)2Ei!lO z#ZB+WQIS9XvQJVr(C2DVA6QkUH(&W@J0mINE)`z`@sb>oA%dxwXx~O{<3vss!8bhj zI^u*6iK&IkeR7bE#~dO-d87eI_EkcsDd)(wo!>Y5m(E7m$Sk9yA(XrebE6^xWVEirI|{3^$QXomhf>mCzH;rfu{?PWM9-eyH%8&MU!;*qe zIu&CKpHXjnh&8^Oo#>H2s-o@+Q^kBD(xYYY_p{8PF~Fe2LQhQCqDd?@@$e!;cJA(? z6QU<5YM>(c6_J#$bYmeg=mF|Hcrp=)Tb^5ikyNkNX_-)!z~^gE6v#(Xxk+5U6lt(XDgJ z#l`n1|F?@Uwom#_C}~<1sC7 zWgNlo9@{P<=k^WYE*5IaqT&mz>9L{B8hqH&3lvK>O4|)X2dK#tUcqyz+s`0a%EV5p zHFeJyFfh0I$k9grWi@D9E`O#3b$f6+XfxIx@= zS?n&=det3yJJprgg+Xd($Vp*b!fNE$=;9Kim;At%JW>)*&D ziXy^gP4>!zfya{a;Dck7)*m-?HD1R6evBJ}yISNiC1M1~abdN74PDrEOoUH=!c~|# z$}XohqMMjSJPjsxMvGgwLf7W)26fHQP3nUP1Z2hRK?=iPaHHiTQhY zpAi@jY{Aj&W0LP$O%g{Iipyk6lfln#durm{y*K{Ch1J_+GNXH5au=f96gEaC^DcOO zNpdyB@j2b$ERf*5NeHsw|{s-ZAIVcM7%&mw!qDQM@GIv z!+3~Zn+uTOtQP@l)BCuj;#T4L0JiO%;Uu#>g{FZq?<7uNAEaxDK{v$>%j`S`>fc&A z-h*$-c*aO9GV$a^nS^ev$DEITKtr{F=;4J0o*Esa;b7_K_EpzhJ7b#(A5WB-b)LyNwDPi`JNd_* zFr}J4{)xR3p87__MMbkdSyc1oJ^m-9vJ(MturCws6xr5sWPO+irA!PEMXwh)TPobP zE&41JtUks6z>x16= z%eF5-$sGRdaj#Z-+x?~<&sBs}`nTHLugE=8U=t>(p84E$owhlB4v}ZVPK#2$Yq1%n zgB!&)?3g8Sx(|zmg?FpWQZeq|-BD)0H7^S8BX#IhlQDI|Xk4WhxOKe9WPS>0D0VlR zv>lZbA}5h1`qNf9Zop;mgyq&ww1B!Wa&U&-=0{>5`j1jn9@ytD3dOLFAv6ZkYYDx~ z`@f$rALNSplm2W=oyJ)N1XXuX@JZYZ(kZN1IUn{s!ZJLcAoRp09bNFIAw)qG(9=PY zK(ROFG6+>GM60i_Tsw{IWgcI`kmY78h?g`cA^2+D#<{-vV2$pgGK>V~Nw6O89e^KaC&0oBZ!ZNY7J;5|_=@vB6viKTvcBhWhME>TG zYY4bx#X?m3=t%l0qvXfxy>)M3XHfNsE*%hCaDH4D$Bvz-@f(E5Sjyk&C5Lj#qrLUM$FW_uI^D)9Ft+x0NhVwH56Rvql}&v`qGERCK1PV@go`6Z z+J2c-7?Kn*u znP=Qy+#Y~S$%K1GB5?O^2J_n&ZY8CO=y8>Zo@YbHMnIsTwLNiFdlJ{Y}(t4&ixs4M;eeK>j5Mv8*i zqB0o9?(R6@B7azh&k7$r?K2d*Ff4S9KBi(42?NBX8Cvh)5LRO5b2Dv}I{B_0Hr-zk z46Mc83TDItCaDJ51WE?>A`@{hlx>&;^ipw*wJi6)`E=o9{&Fx#zD4Rj=Toah{a3kO z7IRQQZFBp^BjGx~cg;o7aS**{qc>AlQC(d@{!cEH6bprNr3Nlt9IYi9Gi2k1`-k}4 z(OUq>OQ!A`<**NR$9Ut2`{QN=;?GaYY{E=rE5*)dQakI!slww_wB(A-{vD&tAyVv1 zQYbl(={`cai6ogz5!UGq;S3{WT}?Kq64gmMdnlp# zDI~{2njVjl5fX9r4Q}l5{d|YAg-bRZvwGs4(8;;xGC2_ylzc`(WobqRB=ROzH`NBF6&9+Duv0A zUsVF9T)PFcu)y_?o8$7=3v0jOE;S-ZwEzhl#IxAy0fuI)K{mE3-y$KLQWvMif&oj1 zE3QsFpbbgCocYK4l|tM5sd{bkxmvLWM*ZvL`;A|a{g2Qd`OlMPp4!l3y}<5?vZPIH zMkDKwN%o~&4EY&7M9YGVD^JM=9Mg(x#%E6sVBk|}lGiKjXZRP;O(5&k1tV+RJfs)I zuR7DfLIqwtr|xFGcll;gWvXmM4yd20|AKTzFzhj1@H7@UVc44^mOiD5=RYG}*CjwK z{`1%88#c(2nl6dM9(heqsJH#tp@mX;CVhmY)D@SjJt*Ft>lfkypBp(J7B zR}#m|1h=&@ob|j6>aUi5qSdn4>wX zldZ8x?zGiL8WN4f2k2{%cICfmo^5Evhm+Z1X_YN-WKPi;KE&|K(XR^Qr|qDvbezu-uZNHa{8$dO+VAO_;ro_Dq?6Kp8+ zQZe~w$|&d8w6ZWrkXyX*2nqGtzMJGQjWVp*dW0=nJ|IrOMkP5@?R%hv`7*l_xkmu~ zZ8ZhM`55sXt8gTJJ=vv_k_>p;ZEpki#i6H6+UvCokYe0WG}Bzb#{e}1v$k6r?|kL-8q95gifj0wtT{3hkAhK|UUcY|n|!~;N|oH*UO*x?1DdQ+5g$Tn3jL`* zpN4^rbEF^`DTxR7hVlg)}1>^h6#9hoF zrr0x}+&mcFtl!`w*u$|~o4YU(53P3yJ;Mb_LXDfNhV3YJ-x;6NU67swAj0zYDsvGH zpjAuC{9NU1;m<$uqwbH5x6d4L$V3XoumTH-KhN7548HyhhJ@mv!aTGXt|f;=67dYt z3=vm5(CCC9PSn$8XsAm284SZNRkm2KuK=h00sJEb$A2}<5C{9zHJKY|#jzIlk&8ya&i7x(q3#I{_ERcUBP5`gRH^t!bQoX0xcnllnEG${D(~kz) zth^s`gaft1K{$Sf;|ua4(J&e!b=a-aFGYnM*}r{{ou2Tcyi0D!5&0Fx~56 zlLEK6#R{A*K4Kv3>k@t*l*V=l*{y4)2x8L-u z(UsF%2wTRk;qCDiB`xwsC-GL2oND8G%6Z*bcwfqYs@dGfykw<%tp3=S#COKX`RUWO z+qJ|f(yy%tQEoki;!R(co0@0azc}9=!=TF`_xe1ZYYarD`P^+7uDQ>@h82Bz0PMVK zc4(jf`HzF%*BAM!+0|(cKwd8=h_6OB87o3xFZ-Sp^`ff-@xM4Kvh6wVNv1vW3uMZ$k+cDeg%>1MBBO%{dW}yJp{opnuDZ-e*Hc^+}SgN0A6> zfUYk46nPCTd<_yckEGXb-YmaAetQ(nmgrcK|Lz^gWn^;F!Yq|@Y5x7rRYzG}YTyBt?& zM}9snphF7W9~pO?WpH8>ICVE1PEhk6PN1~%J+2{$GObDFX~=2WZ(_YPDb{OO+x|iq zG&osb{MM}H?y%CQ}IEsq`u&?Uunp zK816ntj=qFxB1sz%<$urw=VAtLe<;mlqeWykmOJA5Uw??ST+B|U$8zOp~F&?#$CAxzERcB-K z(=S($57&Onu-9ifSKr2O7q2t{>{EL&gnCd4%4)i2WyKG ziXM8)%_Y2J7ZE#_WT0I-cl&8lX!*V-)VCVwjRLc74B;vID{CZ(Kl;9FZtBukb#^cP z!ThcLdr^RkRSw-O!2s0%gano1J)1UPTtit$I&<2PXv`bO_mvU%@d+b#7l;N?rgnTh zrgSTobk0YGHggHixbOuJhh~?lVzh(JZ%1DD=K;O=0&Oip=X7hX4j(<=-MPbVKOYr_ zJ?eGW8E+(OoTw`fx^%H{D}ZlDn0UZ_m;Wxc=|fQ7h!yyTu0e$i3hVc-86L z%|uXrC;G78bEIhj*OT7pjY2J{x@v0v`8^0caK)uU<|_SaGYdib8?(Oo0=mid$b|_4 zgkH6dLpy@tJxp(aoj)(cE7=Al*G{lqmqx$z4Zx%TT9CX6R@pyYXkjq6i(sTiP(w$N zw7@3ttOtp+~lBQE4N<~F~a0lMGNJwh&j+Ur8n4@QGOG?R`c}BGlR*< z3kB5Jr`dl!N^J4&$Jejfsy1oW3;;h|D4NsgGspH#1YJqZmqR8&l<-*SAJoys3-R7Q zdKT@W9A^L5z@P&jrPK?$py1xHdW7c!>{(lTf7B+5P!AjOVxw5_t;uh;Xow>gp>cwk zNmlhrU+_~WRJ-BlhrT;V_ny}n*z_K9(tkF%zCSJSqNHSaG^MV^!d+|j9W6La|=Z)8L6r z$0pNK1*E3&isWGuLj!16hLL0##iv_z(D7gXlSy%mK?#h3Y(31=p{UdEsuVN(9JG); zzUMZ3n`oGA28Grh8P8(Ar^<_JEWEgc`mGm~>hBsu^lD`CQGvK|CGTMtX{tD0BK64-rc8Mx91*ACg55X2jwGy6^ znSuM+h7a@i0xers)Dnv&Xj*!!=#?MwIdn*?2uNvn2xPep0>tR>@fAWa5hKFv12nVC zn0E!axz2yD&DRp84p8Adqxa`pZ;=*=sjQ_n;C}7TqcF019FP4M^h>or|Giwj>7-Kq zmuQi@UqQ16JN|Ijw0feS6Bx7Yi(uaqHMR(&GJMl>$9U!R*yuK&pf>#30e$oUzrSA} z(T9_uPSLP}-5-ns)hp!mAzq_`G{mW~dYVy$<{>iJ9i#8jACPV)|* zOp4brzaF$iCw=!KDYn3NdEG5FS-5QVxn|(CtKzHVQ~H1jxG~Ti2MNZjjQ@L-2$AQU zD>>bh(4{}q(&$%d#f8!j$B7Z)846y3NSFDV+4l@$Zso%8jWHtreiOC4p*Ydq? z6G^!yX*sMPV0?FI&2}8y`6W?&YyL6yTU-#cd)3QW)mZ?M{*HaSBSy&8;dbX+HgNCf z&`&DXO{mJTM}oXv;53B*9~imK_CW$2wgVVT`w=$*Py%s)9ncWkE{gm!C9;RTI_{4Q zG3NIVGmAqh+B3E0XYN$5VCABz?rC`9K<2f5JEiAMVN_&tPU4XM6&VvtP~gvA^AT9( zLCjJwbYZ_ZhW@=1w+qfI2HPK zaO>T%TyP9jI25rAhJ{lwzd)bFjojPl=5SM}=CS!+!+I~|K%HHj{7y@iE^Oh;uK^?^ zDNDTLUlLGxzbd^}My1kmVQjv{c$>V1(JB0dQOgRo^Yc-^Z6MN&o>@3%wV`a}oL~7d zdM3k(11|4G$oVAEo2j8?I#oE=ftl&lxceErFISUl z4zwc6EkGZjS8x?d)zE}0u%3obg+HQw8H#gI6@OQa#0N>kU@8FY@>4+nwZhxIZb*OO zi*U(pGYtgvL&u*8K9}Rdw>tdw0`C^n6~>>f02L>HDWE4&&|r%MxQ_H@G~4o5lhgTbliOdTSk5sh**~8Jv>WG@8#%N2qXcP&%rB1Ot3D;>)aoYz zO94na@!#RsV$YjbJ-N`wp~pY3jPfvY-HyJ`OL41mq`USqP_6h6DE^i|EjcMrIk5uh z#8wK&dv9x=MvSYTpL3=9%orzfqA}faz2KP~e_bRz9q=l_+&7`w;;;9pbN`q9c+;uo z|D?5t&Lj`;>NM&!g|65x=`!(S`s(Xbzvi7Us~+edy4%0l3Apjt$g~+Y+F#!)A+*#S z8?apZQj(tOtQF)sRdOR=mCJlyPm-3kBmoZ(oEinGrq6x}>6qQ4GxcB?BwOBUZ@@78 z`rf$Bn?t?teqT2=ep!BI-Oc1?^dEr9@3hwfY1zg2{_ywJsvjgg$Ih3>gWo&g9`@w5 z7Hm;|ERH{Fc_L@^hmzMD#g#DKViJC)!M(*h$u}1&s%}L=mqWr>T$EOStK0p7K&SH? zs*h_Qu4ljYzcBi=#&}h?wG1M}jhDzioxuACxP%S_)tDw+3%a`H!5>q_*nI@v z`eS1lXW!tHk7V+>-5q^%f7NO&X)b&dG|R&I^O2tMhH^$=)piIrd|u?rq?zl&xbf9Q zzv#SqTtw7QDWq9_+isL`Rm9KhM9f%FXg)E8yEq4TnT5{scf9DnR&@3#N*sVlm>?wi z2q>e}r!m+ikT0oia_@D7D6;#ZDuZQ*FCbCMrh!T7h6kHTh>dOa+ogzleS>?ttnLEa z{R>vV2lr$LdZ_pi{K@$Xk87>i#fTqwl|Bwc*&=WLlXP?bdvqIfm^5glv-96g5k-o= znyO-35~;h_dT)~RZ)JqvvoY1|VyFY_9`-Ekl*JispMP^4+f%X@jw%{B-AW*kGkWEM zRJOf39Xa!JfyMUq8vXj0Rm6GFGO59egJ0JD+k3mEIQU;C3g|E1@ITLnX zwgg8zkL=qRph{LHWULnB>r}hf&-#n)4YOGPUFgSy>nwg4E=plaU-}uyc=19!5S5a_ z{Ic5kdz?T=Oa6!cKSy>jM8j33Dx_`gPx2lNT!TyqOvd$H*ILh{djeR;&tVte3i|N5 zzq%wryVEXGhu(s;^y=BqqLgdMx#s1fD8^j5jfEvH*;CJ-;b-!YOSyePtwvvXN>sA| z^mGJ-Y4SU%GJ0aLuV@8B??z!lvyAXgY||QA?ce-JN57$Us3F>32%QPPQkma1!#;(+<4nvJ0}ZTjWbKn~Gq`l?vF_9!BDzBNX62 z|5-hx^dpkwO55_kY>u0OJ#=u?7(YI%eJ+bP#QiJbYOwLNBI#@w6Q@7$gDA_rtV&V3 zT}^3(&q3Qx70*SNBh=zFgt;NC$ z6@Eb|*AQV}akINO!^B$6ZeLlv(o-Q~v5Zh|2?!dNXu-@P_O|@*EPT{`j>@2tV1+KgR?W#wC72?o4>zv^PK%-?ZRd=<_G zslVU-3fRBj_ay3b;AEDK9|u^7o;CfXgZZ9r5Phh8b{g}-6+HQ)MLP**dm57jRWJla zosy-0Engy%6lD;lX-o4Rx3gEx$MEH=^(YyW=JvYodHy@+_Wk0xo(HZql&M%t- z7ErzsUPyU@=sI2AqM{MQ|N4lYOubG<#mfFX``sWFV83CCcnq2;&;2tz?K|KF6p!8e zer!Zf* zzM}S4kEy;;KHw5k0VjJeJN*+6R^H@#!;2uXeG}A~ybJGb3X{N~r;4YbD!Da6GEF3$ z>~~5CSscRpp(2rS!9c4eU*<57SkqPj5hQui><%>h-6yH?p-mM1tK>^pXOx1Ik41WY zjWufH{wo+Q$EZ?4W;OC8vbI<1O2sTvmRO}zb>SE|5xoF$M;N*Oo)@HWiJ`p zdP0cZjps_l$=5lLi@LtZ5Z#fo2+l}^7p_aho{HxE1=H6$*1ea_e@^L zSJA4^irs##J$DhweZol1(7bV>=xkkZ}VT~boY&?()B0z*kD1A+q#Gye;}zx#RC z;-w21#&yj;&%O8Y`Qg0IQ&m`6^as#b-+o)^y=wOb62aTWrlpj+{U}k1KF~r{zb=PS zkTztRNghs2wQ8GPQArQQS9WYAoJ2Y!5<ge}{}Bn9UopAT+P@u)rY>NH}9t7ilu}w6)<@m6f|0za}(WIj(A`KCd6H ztOc`rbHQ+fO&Q52=hc|@Dfoj6SI_RB{z295@EsCG;Q)U&Rn`K&tX~*`ftR{}6m01Q2p&W> zwqGDlL>=^oTxoux_$;rT0_Wm_o8LpziYTdrz8!ddwo%v`KG+N!jvoBDbw&e59-Mk6 zU0|ckHgA@%x>vq@dQX_7bM~G%NMUyc68!GT$?V{|GYjbM&w^)F=4O<^B8Y9b)SZGeUIl7gfnB&5VcVkGmx?Bgw3m#^);HB+B8|M z{htLO;=n(+!M3kn-yh$y!-GHHi>6)j*f6OnMVAX0%61Pjdv52o+vBL9vafNAJaXY0&TZ#{V#zl_;c4T`?iA~?LHqXU9$ zzf{YRrtFakFJhd}_Y)U1gWNo`Y3`aVdOpdL{kHMnnj;x%aG1O-9i@{C9BbWT;PPDk zykx~aUGHoc0etQ z{I?0g%?~~Lkf(%}aMoZ8>u}*fwltb2e<>W`^HVtpIScjQ=j}hqI zxMdNuLl7en(%nq(+eLS)zz3NJqsW&mYpQGN{v=@8+ty$PdHKzG=8KBZNADiD;L7h_ z7Xqf{i4Vi~it;T0qlw(= z0)NCP&-jx;398bubd(Mg$Px6x-cUv1nrWCaG6P>!%ld$k5*YO-yuF>R==ju80M_W) zlj!{|g1cN+9f{7#vtJs4REn*s&=$Nrbdvg^8%@s0K}ljfpvq$$r9lJ5N$Rc(vv&Bn z`h>I12&FjraRVRGVWn_T{H1FBLfd2^@yYyKl|ltr~LAW+} z8O!@{=At(V|raQkEOXs2@H(eP;P3K=Mv>1jx4;REW2ld~`mh zT`I=Now2WdlQck&>Z`=`d;+JKikt>}rGH+f`(MV;S>-v+>LDmz86#kQbpl0?x20sr zi_GT3vSUQ~Ey0hA2L3QA*Dq&a<5D1#c4`*3H*jR`YT2$y=-@N%k&a9ON-_)e&wE}o z)Fwem*Ah1#i9mI{wQb0(V^7uk-Y?pzU)G^e{Kx?YIBd8$L|3UaLX`5E;tmvcfW}{W z4bl@fI!5euI0L<|LzERQYVDe7CAIzXxdDNHx#egkax|3XEqAdz1DC};k6-dtfSFmB zGQfnMh}+?TY@~PSx)g`$mM6ds02k4T z;jd`m{Dk=`;%ii=@EBtRYr6OZD(~fb7V2ShC16xJ1kZq_VokkqI()1ql`)Z&oHP$q z%BC0`cGa?DWi2PYc19kx}ej z4f40!pZ$TUQ6Brg*PJ4>()4Rod&z4<$%ze{0Uc>A_zQiy@SpU%k5=-T}D3s#x#kryq06*G<;AzupU2le1bIDx+VRRP7Zj-g= zeLkqbW9-Y~S0Q*2yoxo<fxV-Va=~uiy(zp~j%*SxLR!UX;Kw$uE#`@A}g|KP%Xsbuh;Z zrgh!o%0JFitHBjJq(^~4H%z(oMcLU2qDapjaLYx~AJT^{$iIeU575KfT!^~rQF+{I z*n|o-Y_O_6X&ecL*Hlf~yElK;zNAME<(KC+?~5z{NO}7v#n1Uv;Tv%`c}+{Ayi2F| zyic+($wD;qBpj>c?5zYmP7}-S%fZSCKI#a)FY>XgO*7(Mr;*GmWk@tNn!!XURlP!p^_6=AQatYZr`inWq4xG%ObmEZhg=KhWIqq| z2uHpDjS8IaXhUx6@ad=;G%ANG)x{C8e!0*?I@C_7vi`At(LOd!E=!G+xUDv2rvm~+ zZF!thC~w3RB)VE>-BWoHnC1&m+n`p;+c;DVs-SVeS8q9#9mWN-Kb4`fAP38FAOrG3 zBx&0UVkOpH(TvZ8CKbu;TxfMQx>u`TS>EXLmkEGd+$k4cQ#iY{r+`sNsYV!}o=_zSIhwZG>Uy=edJlu{j4V{Uuqmkh;-3;a`^ z2U~F($wIeXf}^-g1M|?WjsyG8pi?dkuqdP+A-ejN4F5hd0W+kjaNbK4xx#suGmmrX zQ4{Jzaa7_j(pijM^}M73hs3D^^OU+FKaED~r;5+4Mg2kxXT|(4!in!R^TA{S=ls4k z-)s>vCTEh$YWOK!h`75Hau^5(*`xnSL#s#*exL?z!rN}giEic>YC)1JNw`%-WW-z? zE?fSf-vUPVnhBkcC+)`DTR`A7ege4r*xED$RW2cx#}_(tg4lyvhdYZC)h+RliVx48 zMaIwMtZ^cLFw}O5tqycmmT{GzsfMu~3zY)PkFYHNt&cIR?MqKwEip`Da&j&IE~EUj z&zkzE3;Q|}E-Cwq0vDL&o8=!lyvG(F=lk^7y*zT@6-IR=@5&wjyJKfvzebmlj(%-< zNi^%~%jVrM5NVDFI+22*6n=i>+f(S!pY~2&B2*}YXUtuP5+j6b_;% zn)#BoZf=d!p8?xWDxC2}80~@S`n|__YOTFz%!7&d?H*voSaq0T@klOS)*(W40Oc z<}fURR(4zQId4UkdclxsxY>hOaXbSoam7!OAjA{qt5K~z={02K78Jx=Ir#gOGDP3K zc=na8j;pG-`In|Wxdz3t&V>cGa{1hf{Ce}`FH;xF;jc5-1C-|95Qu9%=u(exxcK}w zk$Ue;nzalU^|)4a0=8(0H)KkfFj*96nkdR^Xn?h;W&OQOU=muXJ3~PTpy)XOF?n28(pE z7k7A-F{afYilcHF#3BqDt#8R48*@KW(0Fnhm6M`080lL#P}vOSD!)MZVaSznY9$w2 zuLTrOtI!F_92RkjRPm&%9Gw1CoRb)jKK(c%y_=V!WGS?IeyXCZ_Q+ODL2HBrX{&(E z?G+p3h>;>RO!sC0WNolT%J+tW&(>!MNv)Qvqg4u>FQX_+9t<;FeEo`rwm%mX?pP5XO;-=M-8b8+MKc1ElZD29gYzmLzbNYQ8a5=>9fO zsqOc^AIBS6k)kUa!zbVzO#%fjNC3RV%+i&84&KBv0OALZ;w4V_J75t}=y?;`y=$|E-$~z1C$!wJI>_;U^A9 zZ=Yz25jY~;5$<#78>E&{uq{pGgeGwdsvVa_B*D8k#lVZdss zlg@PZQS?19oF_ES%dCh!%>Pg&(m@2w~gR0RVZ)yyoOMu(QwPskMNkGB45%N$Sb!k z^TxEAHGMj2a&QtIxJ!jhePb;$%?e@kK=7-J{jTX<&*wZQhn-i;Th z>J`3xs}z+u;&iBpEuj!;o^8lG=aHN$99;YJrsVnQ9Ayr@RJaB$bw1~7Vc%QyZ;;n* zXzLkP3ujF{D#Fz8=qZ8~gFB=u14*_s)9{DN{#?dhmqkkIJMEo~)52XVzT@`BloQgO zl7I)9qP-#_+OEaJT~xZFvs*&h1E5v9t}QiHKGPJuchn|2js@xIFPvLxZ~1hwbWfVP z^gJk~%E_E!4Vpp4O8nN~;UsbAuW9@02oe^V_7zaR#rxGTx(&qdpVz?wcyNszjI7lC zkf+sQ1QXS*)a!K)C>i(J)mQ?9$xXjsqDSRFU6U+=p$hAs9{tbAL|D%>!`S4DvHC!EAZ#GdhjQE)Vlx2s+0qfm|f3Ybq>`qD<3I~ zqPm=Q&ngDGy}1vLlIgj}h88k(MSZ0480F-HFTB`^cIdA&YjE2Mk=yq=`VbNd-lAL9 z4jXa^pj3r|_hfg#-yGY1GxMkB2y2xMF+p2YLhYD2Hm>{-dmQHzcLGG+PP;2B=I_SZ zq+@WFRbv^!<(1TMa-QwfF{eTC8!9OvKc!z9nF^(?11t9XB_ivlmxTxiAc@r zyCk;fUy|d&n=stQCy~{ua8PUR&=8Y|bl+9c@eIN}4dp8?%6sFMM?bT7&J!_bG9Br- zcY+vJsWVQpm*QWqZFT5rgC&0Y+fqToLF}sUhuJX&=gSX+{A}4zrDobL@;q#f=eeRm zQK0hRm{szmzLfXUU$RqpTF;CTWv$-YB@5ZIX^V*0ZtNj*XRBiTBb+p4>MFL2sI&tA)9 znaKp4tqom_6@x+A%C6pzm2&^jj`08S`!57pjos8m#x1J=(i!TODAg9vfzKHc`4J>Fp(8FpGec_V zEBHG?K3b( z_FP8paQy$+^Xq!7C->~RWkN~YCuZ*55*67uBb%Ja{Fs7zkg}MlFp@-N#rI{kFz`#_ zj-kY{x{#dc^E=t70BA{0dGGEPO$;vSSuDjh7B>CPQ3?og5g`j?ee>HmpFYgdF zt#=-ApFuf?K9el>M);Jcz_3|LHVBY?-IWt}oJf2UXkB>FUP*e@2I?_8@YlLG&rAQA z=Z{9C0rR{e#BlBUQ}H(~K5vc)uY!GXkeKqHuAM|R}%rJl2CW@sTyK3cg&CK1MfaK(|) z1Y*;0qEe+*+FA6jLNuNyq8i*b0`GNrTI%_ayL-KpXA!$~r;Yr&fvrt4&scUSCO%|z zZg3&yq6QSUyPi^yN%xmr9~-hME~b?^dhG2E&kx;ohY$Uqc-}nla&3rdXa0an4u=nR zVAuh2d76&RZDNAiA}G-Eqw`~V!ML^5sb8+pNr|))-J$5+QhhZtgWpDPrb0OrmQYWI zk9?+NOqn$Ry0DQRMONmabHn}v&pCznEHexXu@sjpl&Mk9lcKCRy4M4u$Wb`|0ldiZ z4cgw~UyyB2=I6JuaOHm_Uvp`v`{N*XOE69guc$mWDZzA<1Rx`Mw$GY3b zDr@j;{fgI*_~7m>NqE}XdQ|^;=bXaBLL3=f@%R7c(>SD{kUq_~H<#c6ZBPqcu93is zWs^NV=0%3nmBp8%q!mS$XG?}T@$T_qAjeiHVGDmGIN|w;5Hdm`b313(F(nM&|r4{LNV`94d?$!I1>&R{{ zmwx$ix|JNgvGj)+2cP2oDm;ywIvP$MF%V+E;-aI&A9sl6eO_}U! z*u8eXpQy!qOtOWh7OnN3igbbx(9UP#nq8k^w7t4w%e~jmyO>|j7c}04joFBZ1x~?< zjH+@Ywl=4OMU~+Z;ARjVp1C0+$wCF;4o%wOpAj3$%=v0e-14=1XtNgr{G64C1+kKO z$0X}ClB9@f8k#`30dwi2-i%OX@CS?}R4W^}EsPiW4?E|?I){&9-(%-?Z8gaHJ(~Yv z=ih5D#gOkuH>(4PrLZUa-<|5)5!@D1K!0<_fJSO(b)lch`1x64Q5>vTiYV+Pk!E9z zf&s{#6ZnZQH2dCz5CuGl`g;$;-L&&f+S6nDt5I!x6yQO8e?f9&SW9P_EY8f01%@dP z;i0U-EhGl4$SA2HlxTf6;r=lH^K5t;yeA6aAfPzTocA2Wo4bV&ab27bFdDQa-sCa# zQHzc2fGD zm|rtrAH9llo!?U=8dgj;QGJLNVzQt`PpibaJMok#f6H}`yd-UnM41i};%NTj=VOU} z5O60V5L{-V4(u`}VqiT7s)@l_c;=gKW9hYwC@sVxEoOB5Btb!=25?B-#zFf`I8z!a zfpt?x)+V$vRmI3%Qu@{Na=N0sB%kWz^!n$mqxn3dleb;t7sksKPj`xd!49qqQg}Y+ zR?+2X*n`6{;E=oXnyu>Hr@hR47pITvSOE>RZ`=fo#u}Uk0qC6Mltia{=@|`(Q!8D; zqDq;VM#EV`K$iVTX9@3-Ce_DTBElt?U+2a7Fs^9DPG(b&tYYutZEMG=$}!ytb~p_+ z8awcchEc1}hfo6wncp-Kdevl)Vj!QA#uLIu_7XWN!e#Uv1fv`3ziq#N1a_6_O_;sQ zY|LW7A`Jcz!hoB3h>zWfIs?<_2tdw;eaNk+3F zrnJ$nv!^dn`2YoBnf#);O}##+Ld{^=wFNnGla??1yagE&n!aXxH#aj(#q7-=TQgK0 zR);x^k?YvTns%3vPyFpz*Q`^dPGM*(G;HE)$Eyn9ZNWos7k%XbYB9DV;KWNy4i1=u z&K|Z>zm-?5NUVwAgT1W&>Z7vEWM%?B`~*CGp02nun1>r)c2hNwn8I-kEj7nw8ZM0? zq*o5$bd04&A!Y9o%HqZ_ik4ELoT7Q4 z*@}WPxkHzmzsmARBJ$LQ9x(`c?*w82tW`)xBvt}M?_@n20#$&VG|zf|AQbx zujcz>00@H0h>OfneE?l7_>6{ZioIZ*kj&mn8$iwpXgC)nxQuJ5gTsibRxJ@TigYkG zB$F^Z;6Sh=V+l=AQlI{qFyP`bA-vSEtqmQnRS!Ztcd$0ei)js=pRT9Npye_&$H;aj zP<|x1lxkDj|Ko}|1~?D`Sl4=q1uz{vBn-Tt8=ZaopKC57rW9QXxaN~igx&QZLc9{r zk9d!Wx5|0*TaeV0hz~`P<{@Jq4S34+?Bc=153pK&>~Viqt=33j^`J+!bPtWAENmgI zU6hZ>J7m3!r+L3_6?cv&*4NqNR##$7+$05!NUF&XCu2~c{F*1$-qV-?o3hwEeVI}pTlM#)hz`J-Pg-0l(e?VL(m`$$ z?gcQfTdC#{LsUJ~S znRgUt6j-xej?$O^aaOHh|9#`mcctC{ycD6lT+^E&ihO_(CJ6+=|5G3qK7|=-;APr? z2e|%I%_S+whV908P*vlkR8%tIhNOaMoJbBNV>!I6>K=iZ+I!;7)@Ou&V!g~V+1YBP z>F^%{af$Ok1mZ+D6gSHF`#%H%A1I+*wkHv=?WT8nLYL*^1mLL>okHHJ!gQ9?u0FWS zVAenyQmIe$$=~>y2-8Oc-MkuG*DomumU_k1N^GvAieTX=g>%Sl4CdRod7v?0z_e-Y;jPgB!39#CmhO0*&6cgPGZYHuzD$9=?M`)fVsGpGlp8>8!!bH-P zxoY?IVYo7s^Yir(R0f@Sb;oF_iUht#HwOuM+V*yXx_>r`P7xHzM z%L<=Ld;Dku5(oBwROR~~2J#?01LdZSVfopVY z1jjfARIUNlfyoG`(cO(f|N z_w7zn6WHBV6r*{deNA~@jgulzW$io{1SQH*{?R~X%Kuxvd;$O<3gq~g+1s$v!$1qo(F}V|8Sd!fP*mgseQKpPP z#9{vDKlnER{=>{a|3Q@L-hT)${>nW7`$xSk8wO?oAeNI)H}@&Kz7R$^9SD z+soq;2)eg;pHDwkHczXyEMGh*+2iBQ@k$DJW(Ie$kNyEItAlnh3BuY15aN0f9mvND zfkC+THHr0*2Uur9D&3!C%u%)8fa^teCV)jfZ;UUxeafDfc;H4pqaBF z#9lrlv*o()*XTN{3?rlQ&{(+xJ-nvq1!^18vkREZ-XWM+#1gkR6%(lJ@Md!Lnjx&3 zC%?=8g1r2oO*Gd~5s0h)Z-?!1Y&QUZ;D0+<{BEY@+~uW=+7}+cpS)Ar1MyT*=bh-k z&@z6LY5(bk+zx~LmgiIW+wjr1Y#|3c$G_j?vph#+u`oQK+tr`G88uJYQS=ogqKS_9 zmaB&=jhx(bv0kX~ebQH_?E4pEwisPyNuk3di@+}7Gtfq&0@_H05!5w18H#?=%52UF3007Q z8IU4Zu|+2+W-&5iPDt>8U5~xYFiGABK5F4VCf(bSVasB*4)0Obl@jcW=sJdH%g;u* zMvQwI%y-^1!T$arl{p{sknwDr(S4DsuPb+aPnpN&#X$IC#|-nbHS;vava)NYWRV># zB4HLzUxBC0#yq)yl^|-XOD)7Y^l9?pY}@NEzEwFUd*zXD0v{$X(x;mk-?Yi`nwGna z&^+pg;I}IzpSgRg6vW+yvfj7H9y;67+C3D&RAzLLS!JFVFj+FiJmpS8C7@(+6v)9Y zFU`5=9|^|l4a}GY{6!lv;9Ml^**g$*wUUtdxlNq#`)TeoD{Q1Zc=k8+mjCq3!ZC&f`-6RE}wRS^tFaxk=8R3iC zPI5nD3DtZ6HV}zThFMnuZKJ0@9oc$3mrK#jwvtFxic>K3%Z&b@2lAN3+_Mj4C|f;q$$nAcOh4pr$V(_ z(5BbUnkEhi;;_5JGHPf@v@M1JsiBEE&nIzt?kgG$g|@i}O0j4u9Yxb+*S4On{nsN| zIXAX{BKSnewbSW@m!ONr>h4SIKowDmIb9ro(F}slN>HF|+-CiT?iKT$v*LcY*pLyom*^y`WRdLXOZ7*3TuCrEOI?o`_is3_c`ai@x51ADZOh)dCJv9uGN7!GKE`528D>-8#er?CpS;;A%7r*N>zu+#DA?^4#aE_Gor~G?< zxO|Ck(|C1ij}g#F+b+_K#XS0pVdGf!FT zUU^#|oD>qO5{UK!;=^bH|9pC~8UKXjDZ~a@N)~XFmUdB_lI~{{_pSam8Ju(9wF&S>D$rLTp2-h_A)fT7(@P z<(dsemBlin)Awy#EetLWq~+q{N37MYGHKvQ%Ik@sj3;TAxG)nBr+?l<<)=V<9+Rh7 zc3r6a^jvu|jz@%zRRM^lk#MMr#foBbY5bag)|cc;Khu3TzqyHqdPz@;RAP0D` z1_h(xAV*OcI5I@mp7IExDS4((uW=+%PXc-^HIq?){Nz8Teq_!tP$r;qF8LCBC3Jz4 zaATNlitK%xrN^c0ZhQj8q!)aHXxN#Np5500_;T|HCt=QHb4O+^s89awcszELV)-p-k7WT$NmQ>RcviVA3xD`z@nehIj~gI__u$*+uQ*I= z%Aao#BMTaStSv-{?;5hN6q7wYoZ_Xh;J>}91lu)pojUe0ym`#{n%Pi(D=yUmyyx!E zH|lrQx*4jD--;Vt#23Nu)%5Mnap2Y|w@7rA80{4Ash_aNuZa2SFD?9h_WG^P<4{^t z$gcJYcXrW|Jjc#IyBvVFB8m2hjL*1q<*1=;>`N$KViU$YkRs_C zSD8GbQ7NuNC_!R2n7wCJ+)jRrZ`bV{$_u|V54<{<`nTfZg$^zhUy>mn6M;*)^tD~; zTh*U`{iZQK&d*tIF#nVYg@yD6$TyFcD<0HLugSlWV0OcKNS(&E+XUUSy#Is5{P?JMKz4d3}r`pSNs0dMifjYbzxu`{WPNh6Vm5s zfB!>4<3<{yyl%)%g;d9u#O*XG9{cPZxRAq@u_9SMW`=Fy>5Q(5{)4I2BWRE=pzZEg8n1qMW>|}r*mgCc_P|#Hhj3y+R5J`k# zg%6xU%0mkhEO6iBN-G8%lA{(pG|jJWjBJcn^`0PCj5&~Fi8twRrKD&7*)#=#JR_SMG)ebr{F!@xu=ZjujWvZLY+%mwhikT4)%mw}YVhkR}3YP@@ z$yKJ#S?}z`(q{rmz^ANT$SaBp%m>l~{stR*6JCU?^+`iaEGh7XT{XlS1Gr5Z?TOXI zEkKq};T+tWyvI8Z#8`Y)S(7H9rK2J|nLtn_7ub4FmIsS}m|qY3>8MxsNNmTQ0<1kc zee}WWH{xxfzXR`n&}(8Sn1O0r4D*2qMm14}ex?~SvgbJ+<}dLcQ6v`vlO~r~nSztN zosm(-2>4&?|C2AJVXNHHQm`Z88IR6np*Jpm2fs4=gilAJsLIsT-;nj#CBYqcug2Hn z)i@uO`-`-5qdX7mZMEvobUsEK5*gT(s8N>?1d?N3s(0+T}N3It^Uim6xKhY94!a#)Pbi04fwSdj+fh0kO@kNdac;oDLsPX*?)bjcj)S4 z(d^FT9DrBe4tVA6A<4W?I`-<_SuJsGQo5Uc1rPwtU6Y@CY9 z>6s(~-J!Y-i}7$!2?p(Uk@SLZMC!xh81h?8daX1#)7wb<1*Mu67=%zF5a7yTkQmez zM`={SNoX|aoJ4H;2IrDg0>@jv(Qm8xnXDPUT|LLEim{fK`s15<1;xK*#!IA=OkG=z z-XE+-xX6k4LVI=KWh4fj5{yvP^N~I7ZfR`-PuslwQWkHPBHxnKb%vLI$(LF8`^1&Z zueR%4;2j=GT~u;{`8UTTE>9^j)9Y75>NVo(CEfTPZA?QPd(3pdZAf#NFT7&-8h@{q zhXGo-V+uBk%Fr%Bv8t02DUi9MrX?26{IAPy<{3n%dd0{mMyUtHN8-+`{}ee18Nd{Uq#az&WA`$vZ&X*sRkqweAxuL zTjC;A@)({1GC60PjtggTufAy7nm`Z6g5+CUfQEk*#{`-07jAl09C_Pv)x%-JR!Nx%+gH%`AOBY3bmZEq(2m#P45` z4eLmP%w6sihg|6yklqThrh#VtaXrx3hbnss@b;*J zKg1jiuS&3@n+n~MX~{-VZ<{Cc9csUPudv&ko%7`l;zO;0mg1SaJqVD>fu};z11v#a znR!5GGpYH8AJ^oK1=M|W6ZkpDiQ2pl*&ER&(!zZ3!Mb((aavm__znI2} zZIl!+Z+%|qLv(9X)e0sohq~3_`tUBr3ysl}Qik1!@ZPuD)}naGP)dwYFx`u<*caBB z?3zHw=KCO_sg`HBI0e%f<-1m-V;?;?<{+Ff#ED96H)Kc9P4mku&xd(8HQ0jL%?-u9 zh`kgd;b%ik3{)q_KLy>*-(ST3VBUX&-NCLq+PIb?AtGGLIlW^C40j~GV@FOBGk%=8 z`CkUF)Y$hNdBrjQ+6z+_n5qQ7Ep<8+j2{ilh8H^oAG!#h+T0FG9D0>}ux1&nFC)h2 zt3TuVKKtYqGdq3~RT^*E_gIk6n?4ViD;P#nL*@iIkX1pd=wU$ndfdt( zNJGq`KL2E5kQ3=0kN#}LE>e4i1Ido`zyy?X`#D7hjJr9!^{nH41LAaDz5ULB1O4y1 z(*(x$uCF|N4ySOgx;A#-@gM6K!gTnN`DyR)g0v~lW^Qa0fDn|F%l{I1zjE=pO8x{BiZ?o=Abl*Tzx+_=CR6;~mim-&eNvdRgIq>{k+=Z8oq z3BPx`({PGsEas#Fof^6TQr_J5#=w?aksLuth(->)A}IKT9SYuNo^<6zaxdZ~4OxC0 z-BnT8@fuB?S190qOamC@r)P5aM){`7&tQ#}Nun@pz$j0^oct4ku>yue;;I0n{7dff zTHbY)K$M$N%{P(g3&1ExCd++JfiWZsK$FII%>4`Nz|#>}g+gj|#-<$0U-ip*jwMXM zc6ayryC&d1`3aX6Y+|6S*$WP;P(pyK>V)uF}3uLI}xgo zUW@B{gQ%vn{$uw&XQy9K@Pk<9`55Ev)sOfDV`kixnF~Tbc>}%@M9A$;xekylAJ>6C z4eyS8FJ`!FS^Nha(GKU=s;&xlQm4@_R{E6!+wy^jTSKogVq$C4@OU}4Lx92k`}Eyu zAbq!0mJxy#-C*f* z3=!ToMA?P>hG&>NzV3rs@kg%e57DL)R)-#Ks1O)O1~9I(yuJB^ZcEknnK}%?{qJmt zg5L-3e!YuwP27(L738oyTS#=QwQI+=ST4ej(4{cOBEj|0r_we76A}au&L|4X+jhQ) zV11EF55mO>TkCGc{9|xp$Po5DM9IVgx{DHQ*<3RxppW_XNJiJ5>Wzo)hOO%IQY)sR z0Xop<0WLt=i{V^BTD#$@gK+?oP4804%Ly#1TTTbh7R-cN-ji(V~aL8FHKFK?F% zm4ss9wBrkVqkyHaVeFa#x9nFoCI@3->-=>`^gF;`|C$>p`pfjj?n@q_<)~0v`J_#P zRDA*lfv%vsGeJ#Q+25P&Dmhg1p5SfC1Iwr5@tf~eRe-$RMA6=25wHBTouSQB=Rv%S zVx_b`&+L8$&l4TpGh2TT!Oj*W8)=^sDy3?Ug8k6|9v4bztiG;RIgB&2y1}rPB6bkq z$teJyoZ7sK9Cfyr+Dq(i`)Rmqm|xFb}i4|6*~g+ppjr z=j9rR(*WzS;iftr7ze$d0hqB`$1zs8bu?3`<-nS325nQIFvF7B5P31t(3V{oYQZ)- zmY_g^7mo&w0_frp>m%kCh@-iB_s<`8lWo;v`HCDT+ik1~bGDV;G3(BS1z--UU@MQG zf_XaLHX_F07@yAUknppW&(&E0^R|(Y{aG%Zj5k2q?v?rLpikQx+s}ct z-JF8J5qm`e5-W=gjx$6Zex%bTUHPm?U_NlEhho0oyc+_)UsSBrV#}%!YZ&}trQQ{~ z7xODXToHZ#oO%z$-ufbtq!ZunyJJUvp%a^P(&HV%LKP0++6>sB`7dnueg%frAwp3Y0Q z;sz7gP||?QIRRCDW+$e~&bSI+@siLnvzg!Xb|hl6 z`A8yNOm5rsB=;Qx8;qehnR?cQr?*=jLVC-m6oXpxsFCMDW=SfyrP+AcVAc;Y&2zx2 z{F(VZ^kE?*Mc++Bf8Iy!{sy9U89zUS2|OSDFKV~_U5JpQ{PgD1)`tp(P214akuUla z0YP8d3t=6JkjjpIth7?LV-(IamcfsVy0=wCvD96`c?A93PfW1(M!9icpW6{ewjlq> z1bES*@lb+S`$R_wJq$JANc7x*3#dEnw};VVAuV{_x}RT0 zW|tn2<6*JL=a7J+={6K}e-M4vQ*iy{gSk1YpSOA7(Z=NKf$5}9r~E#p{Cb3|djq!@ z#j@j01)h#2VT~_KRi5s8YlN^wSl;h5)k9j5f;|pi%tluW8{o6!fXXtS6)1ImHS_$F zqP?Wb^&kx_AZWLuwpi*uXt!fcb%}Kx-sci#1ji5D4Ts>hj28?j7?!vG#q74le1C?oU3N{6&=E&^-ma&8&O&4Z zF}tEb%x=XHzkB?#)H-`|kWqWJ+JYf$O{=&M`bd`79w83I>|&F*_7^>#BSYr!mEyIe z-7hXx-!Cpb!$KoVmzC;zlR&-nLj9|D^4wEoQZn7>nS04dETEE4Rj*o-abEe&-!gSQ zfvv;^!Lm0cYW&*Hb}=N;$J{cztY$yko4otP_ptm&di8Y_vgEud-5^fOm#2=CUu;s$ zjIZeb+icqDBI~@Pw`9mTjsn0iT1erddWv+j6ELt(@JFJm_e9_Wtu@SU|( zfz-M^H{Wv}ZeT*m3hnjq)X*lCvTd!FX5|#euEy8J{YR*807)(=4v^&7ZjSh$4YI&z z=Ir;IPGjBsJq$$b z0=IXYiQ=O1Es2?-ti+EWx{w}b);l$X`lgQp^VN^SnPUKvyb%z|X@Cz3~v{P`dst17OLZr8;mH`5#Db4}jz+4qtDU zO+=j@U)B*CaUt;%>cM@)=Xe`yJxB`Ryj~~H>=`(0^?w#X44V({li!!6k8wfR+X6V5 z8q4{0Q@Au-&T}CGXQQ}my5mLri+ON{?8C18HeNE-2xWT#(@FyloLrBC3m5B3P4il5`X z3Hg%VFoX=j--<@@Fsa8<$_`PV0rfnPwfk6IlgpkQ{4C>&hacD`0xHuG!lG_uu};a| z39InM{>s(j=bV#JG^XLcqSHi@rBZFzn%17~cON&FmROW~TSxA*c2zU(IMV(taKtD0 zEpK+AfM(l*w%w?vUE?Q@T<%G`hPcG1^0%Q^G)tTSO)g%^|2P=8ADMU-HjeIz&vje$ zAtYn5uY|b|gQo_o+oca9QQPR_w)$AF(aRR6!S7R7K2_&%Cgjhk(IV7!QIZfGAw-+? zDxjvZu$ZnwX=i8UeUSNGbKPix-w&(g2P}`ze*Y@lAxrXy`_Ep}#1B64hevpnB1iJv z7=I%tA@nP+-cCs!oV*=T0v)^^vCERhIZaAHxpr(yATgS@W#WDIbL5^vBT_U2?5L8M)B&9|V>5z^A6Od-)7-RQy`~5w?bDr}Y&e`FQZD;p& zuKT(_@&3Ht#4cjONfki$yxaHf3*D0xw4N&J=+2SAmamrU>Twc++tHpN8Ep_{O<9i z=d@#!cih!&>@DhV+frt}Zz?mIel)WGn;XD$RzSpqHsCy!gjE<1fP$Vc+hLyhUcmQz zplry%ZWhd1wwrKjY;=m1`%hm&1aJ&VbSFf+b15no(RYAI(FhC+^t>7~=pH(zux z4nY9|wpdg7RdA=QQi#&t&tcA(lpLxSO1PU0;ZFigY4M=0KKV{%vsaGqqy^>&%33Bb z`0Po~Ap%gw9F6Or2A@#u@DT#EsXv0NI{?SQJun8_&=WW?1I;sTgD$RlF}G8bOKgMw z1Bjat3)9-ZR-rl>tHO|9ej+}E9(?-c2}K$1-+A%g)P-Bhtt>b?UQH-FMB>WLP9Mm= zEZ)U7l>@(0YZTC|G%v8Ib{9S zX2Yxa2F!Y(CSuS*X{|9jhUuG(p!z4P{UqND9;(p5LqWtV)jr=8)7y_`c({#_nX#L1 zBed%h)viwEu_MfB??yb#H@|godL1rvpVQYY#MoimFlMSmn&*gd6Ax2e1sC(4Bxla{ z3lQ&9_EP7>t9M+m==*GksjE4450UVgzU`SuY($4@#*KwGU(zJC=S~^}<&FfMl$9B^ zElwXNGiqIraJ;q((Z+94c@bOTmkfZ;yaCMz8OU(G7{&yPrlx7brT!^t(J7#vF@ywJ z)vTCz{LP))AY}6iHZ4K%3u+5_UeVOUjKFnyQW)Ib$L*krJJ>_yzV~!~gCn7hkT}7YK|K?7YUaJ&ILO3&75yRcsI5W+qAvE4&~`DS2X9 zVAu@Iq?J3n*%EC6oY(>323Tj6&I5+o8AE#4^G`3r;G8>ZtFQ_r0Y!QY{Rj*|$=wMs zlvI>VPE7&s9d7QR3)xe)9rOK0KPK-R@+*Vcq(4R@W!=mfz03qmkOJTKUbY45Ln>7> zkiT-gt|{4Q&Fg0~^aWk~$}`3+&|M!*k>!vio?uzq?h|go-~u2O%KpNecMp0>57c5w zV4V%t?fK-tMP>y`IDALa1EsS_oyPLPT>ljxtPb@lK+f4G1!HDqu?Sv7^&_8^^Oe-A0i7WfK#>${se+3nzc0|5HeDUCZ zpAs_WSqu`Dh$#x)EJB%>*(itpp%iBu_V1BR_8wL=C?CoTbFnJqpb*c-wFVCtdnN_zq5-8~;wB>FT24JB^DLy}s9R^sn~A6z~KIzvFc z;5w`VczTW)fUg0(DD*y1-3b?4KYB)AasHk3d&E0usF)97l-~W${)8vxx_J1X=V^hK z3|LZXSM_|;@WT17r`%0{O3pP}tklA3Pql(g$vuEP>jf^mF}f5-Pflh0v0REXFu!&8Ri<6{GWYUA`6 z<}(_FDQi6_%lC66K#}J`)8E^AD0}ebXuPOuonqd_wgaYw)-BlMg`-2xY5rkPb?d4H zUcKM!1?Cx9(c z$K{wu82@25iFaFuq}^nr)Z&jW|D(n6uxLwauCR8to9Ht>#wO{ylxWmcP3wmfI7wAg zFJ|t1$PUgsJ+qdo1RKMHoydy;sQ%q`E-S_yFRsPw<`qBJAeNRn*WG{X?~OH5D=)Wc zLZ&Si76Qr1m9-66HWxaVuCo>-!k_P-iX32>xG31E9oi^q_R*{QHm^S3n-DuePLqAV zdD}Ua<}+ZBV`K1uC>ocY!KLko@d>H0f5k(HfPxc`In4ycjwuHWNt)~jSF^4KXB&#G zh9Bj;&pujaA8!|Vae|;Yq1wMx@nhX>vv*BoMYognhp-R;he}~>-H*cj91hs^pYG&Q zARZYIKUbuhtrS)Q%6lQ`1|ojz_`#q!{OnE-7&551HDa0ZED0#(lPXL$@+`Zj5IA{p zrGqi)G-Qb!b3GW^xy%=X;)9&UnxsCcY+I*=uhU|B#dj0^TDELHL>FRu4Cdu3x-tz8 zmYi2cF%Wqle>Rce&FY7D`_#?m`uUOhGW&pOU9naUnEzdnn~kehNt}aoPOWH1r`QBtmZ4L*%X9Hp z7u%hxi1CB(o%XPJ9KjDza3$hI%EffUpSQX_m#1u?yUmznY-$2TDLLmg$CCLn1+RD` z?s;(Y%6`M1wb%Jwcy_o9sFcvdF#;^B{edoIJPN5Hd6q+6Lqwf*ZaE zVhyC94HII3Dqy$=pWrOLc;sz^lGd->uDSY#^|RMRKsuT8Rb{qz8J9$zV^SNp+uz>+ z3IzE}EE^aCCx@fD=%ro(k!irK2dzT-e`Rz#@}E~3e=unaTkP{}0KUMs8Y|NS2vYlp z?{G;v5uXy;x;F#ax#D`fF6tLUvp4f_kw~e$!};~(e;~B$RPI4rRw#pJoInr!>6{Va7y##TO;AnUQ*R~$4CDfz%CKr94#fv3Negy z-E4NC9{)j<(X*&qL{@?pVFMRL^`4=AJ~2BK96_Ra-5~nZiphzFg;2REw8VMSFu#1` zo-CJOTf1J2%>6Z?@$eWEwim8l-zxXo3Kki9pz+6=J>tP}3!WuL@TMYl_9l8av^tv(V9d5;l? zb+9*}LU?!Y_~9%!YY!jbTaR#iKxPuPPu~@Acm@P8c^ER(b1~`33sb(+r&O4$Yc73U zM}^-Q$P1P45RwnoAb;eettV-{E(<@D#n1~vl=Ai;!0v%(b?d8~n7x3f$LNc!O7DM7W~wyk*V$Md2$$5iQQIR9G5)z6RIpWlcdvEdFKl-(Q8ZU?uoW)OF2ZJCdz?>h|f z(Q%6FUHBFm7phBJG8riLvka%&HP8FAXTi0nA<2o*PnU>mCZL=aY$`a{?7iEXC<*?$ z)5TzB`y$Zz=PC|%_PYxa!~-{g{!nzoQJ{O}40PXeEA`|HK-dbj@3H-P+*{LEhBFBM zrSrhQ=b}&e?~7aw8!?#G0Fy7lC!(w3iPdRW+>^3IB$xne`YnW@8g?GmAt+B!%*#V9y7@k;5lBZ@ z+&1N2^#A*`YSZv|GmczDGev;*9oHMvcCPaFHi%6EaL*09u4vjuhCnERqJ zV-8?`sHJ8r{@s@AZBgj)6VwyrT1gZ+MeBg4LY~UfuygC$ROn@-5|$MM(g)k9y1Ow0 zI7cimby(lG;4!&#WaegUW_CP{ct zqSsGTx>dNe{IEjK>u<0B5;;VUCov@m_gKeo#@pfxznatvG6HTZlOJFCF+{2}V0AIJ zPyftFOKMNydpN8w&QAh&)-fCRVWN0KP3`pYP5xB7e;NG0u2r9!J}mChKQ;aJmA#Ke z5N^ii&F|`pQwlAQ{*2RVV)ZL!ZYrosB}<77<0^S~NNlrhYfOxu>^=Psr3w|f^twjE zkn&cdv)#m?lWZTZO(WIiGSGC~@4TMtEjAgto~XE=XCm6&Jo}1ZV>y&H`wjYo_~E@} z*R2PtSzU-Hl0=Wip^lKHp=TV#wHw+A{Y2=(h4}nwbBsy4$xl!}k#|k%3M2kk49B(0 z+Z!K#EVXr*(%sh)&Aj=8PJcm^wpUUAz1b_liP89?Nn9|Np{u!=*jdZlzh~NTPzag$ z+VLgRIvkeeKhkpy^H`>wee-m>1&rTO>q^_+N1m};(1T^HcJTZ&wJw{(BKZ=Oc-|i_ zC6X@xHgcX=fopDDke>&IIEGmIGcS*PO&7!9Ymz)*IIe*W+z;QSC9)m41m7=&PJUwW zU-^Qi6k3h5unzc@YcBTSr8F@1S(1VafzlZae`^A~s-N7GVMkAw@1&TMu?pOIns%A^ z^_yJX+Bn_qiJfIL9QFL9|4zF@Cy?#G43Q{+oIZ<4yyzyf{qXs=Wv}k#eIW;&c9!4_-+T?xF*NJcq_wOqJ((O$I|s7`<8o+ z;)5R6hT!GK_pK7J;mbJbgnzy~80!6t%Sa$vc1g--zBA@|Nz1zXqLf?L6I#OaUa29a z7uJd5DZy7lsnSs};wo&VkmaH|`#fl2%QhxOe>YkD;;r}t!!?v}^2+%Q9`PJBp-0xD zWWQ(;^7Ii8?BtKYi$}vffx$@o5|MODX{WrKxbyB6X$UzS=4qf;fso2Q0|ny*@i~XF zo^a!tX@D+AFF4U~1#z9DI~#|VEFk|*9DO&u^=F4wB-}ma@QpQSfuWNuCH+kwZ598` z_`R=9C4>J#4;6RKLM^4q)A7wK2Z`c2DXegH9c%hwTXCb$8u@%h#(b~rZA_)i^lje> zf8L$q29;>)^tVa*d|1Deq~DOSHEDVbI@2;L>*5@ubKGPL?Ua`5f;nWu+31FRs{~w>()JzTCqR~& z9Rux3N>u@fl|Ndga)0mf`ksW(384B-A zh9BZnh+iL%D$Y&%Ow#Ho`1jA&=9*qMmTbM5eOEd%lJ&!aH{tBFPN7X|r9)@I=3HFu z)OeTEf)W#aDwXCL$?chM<`I?w;jy5I$0aLX^)+>Ad22Xu`#g3jlHH^o;`m0Q<0aV> zf{{@`$A9n12IKjXWoHkO50yRoiCzk~;yzjIMgBT&BAq>mDv8;putPeYek-suv}0XR zXQd9a#MFGMJkVBAsnAK`Ki@QEmFXeJrbRiZ9PTC6w;sD|?cf9F;)ANLdxS~}}>*Q%P6+cde@VfX2>_bl&5u-eqcPUUTd>^ZvjRj6M z37G37P<&bK{cdBF)yi;wg3im=KPxnpPTrGBD?I_j-Oy{DmUpaPA}-G8Cnp)A9sD+8 zE;gKR8GceJeiPwE9L7C7SzIw7$heKmQFgI-7Yo^yOQkY9-|;t9w(nPhxEP#yy}WP= zjQ<+>K!St6^Jho@J{7R<4x2@%eQhKt(T@weuq29e!Ud&Q6}rPp_lxo!-9pp zSnR#q)Gs|&B;@peVX=5WhBGTDfC;#~sfNZ7hKzvGEqnFT+35^FVa!O;v1LZC^+FU=404@Waa5nfh zK&*l{GFD7CcpBQ?Cq}k*A-{KLo2i^Kie7yFdMpPuy`NMnv}EwyYmkDw^z1Wd`H2;q zwoz?N@;vLhB8FT%tdWJF{9?Omt)S6<-2#whb8Zg17XLOir7z;}x}%%c*4kY!xgW$K zJUPWD2p=~C4!@-^9Fr^mjNk=~9 z6s~npE;Xpd8bC2MSW)zWDCQGm$lnHnQ0AeRhX{#{|MCOO8Tycb{i`d^y%)T$h?2(9 z4oX#ddXR>;uk<4huDL4YBn#YVWUmC85P%Kl86*6I%2&@-%}Nf<{h(4pc&`JfXFzrG zoc!F{{S@K@mT88&H6_Hl(plWOrI-^LY(Nxt{Xj$oxpv9SXzh@H$-lYaAi}`w& zlGVC-1TpUP@SAYVkR^Ah~RHD^H$q;RKZs#{EaHr0-N6Tc1;6Kow z7b_7rcMLhJ28%CT;JBOW){E+NoCXL=$`W-g%Z6)34U$^3?E0&5+wWXna=Dp??3Elh zc=JxZt{M*w5y0ZWV3svh_%Pa&Dpcoi-g`LL>eV|=~wHn z{uaKnvxf?y(Yzl{jH189OmG@x-fQ^?@DNeFjoGrhxp`!Sxu6A`q2nOzyuZs=<@Q`t zS60PA0y*0>+kPy7?kvKgap;gM@X*5)cTVUj-fG|3<~ZWo?3Jb8lHs_g?|e&EM46j& zEBaAR7grP9KJDGeCo}z|JGYx=8|Bq10ORCv(SoL9>E|#gIBPbPvB|?Bcxoz7IxpCw z;NyO?7io06g7$AB^u*=lzkDHT=T z`F7YXT7X6aR4r+)8H$ZF7-!R7Df_LG@#=sZiDay7o}1EXnQ5YPM|lRbnfV@5Tas# z-Y$5MvTBxz809~S?lS)U;^8%su=sAvwE5;pbN&P!ZRYCv_0+vv6+T&=3s*{FjI8t= zdSVu+;YcE3XRdxO)Abeqimp^iu*Y<|T1M?y?T~Gy3!&r6$)? zJf2HfWEHDm$fK9sD^eZ)F$W(9%A-Ktfv|^QYOk5&U6gek6PzR4Nu)yv%j!?V0nYL_ z7;K5Va*?Qn$lnSg`8-Rpv~t;5T>$r?FcWC#t?k)#c zHx_zdJ*Fy)gp7wQ64XaQ&cUYsEv1)6a%V`8%Vr|Vq$T>S)&vwsy@20;60_X?b4j7< zB*t^U-8!_Lm$9NsUS-(wP3Pp<9hQ3mefMH!1@lQ(&p6imb59%H+E3=ckJPIyC7Kde zw37=j)4asBFt8&$T)E-;saSzO(iT}1??3*(3awbg=PR@tZ(H-L8TyDYz0c+Wbvr7# zm87X4Hh>zwT=SIDg|1@BfOnuIJr|Bs<{K`Qb>8-RRXD?3iZ@-c%ed;;TC$f=p5*2e z{e#GQL&5PHZ`s@5MLL4Q7Q36~gLoW(`Kk{{#o#l24MVQ%5(X2aKaY=nx z=xur|??X_f^~THM00%b`B$~YwJbz{z&A)q#C{E=wLa2n(Rlm?bV_2X`V`-y|#`s5y zBsq3|Fr>bUX1NvK686kU?XlN6f?Ifh=}H-=DDl34>VQzlOP)9jy}ZO8wKUAC-{L0M9x|w;0A}KJ?n0K|rHp zGTnfo1as~ah97WHs5KS#z_KMt&nY0`08+f$`T=jS`DLnhGlqj{JIy}0eY_ZyQHq~T zO_Gd*z3@|Zkhg|;`Vps#RIPS|w*Q7(z^~99ejdGHq@*&APrx^BXnHRaHVT;oZ?@Nm zFQEUgMvE+{TjW2DmV7et6}kG0YPItFC5rB185na%4f(m!^F*W`Vec2=iNKb@VXFDx zUVP!3e49=Q&%fWE1W|k?CII}`dP+ub*ej`|17C(he;|KipZ4q@cw7@6ui(9D&E(f6 zky&ix;?1|*C&Iz@-0AOc1Tbgice>!0GUwLfI{*572Y-S&4+?H+I8HeJ;#hD#f#}^D z#;Nk+WG8n0&glWL?uLFI3Icdmi1A=&Q2+_dWJI(LLS?UiR~cibuZ{iM2BelnF-?f9 z%c#5ZEa`Hj9{Nc;j#(AXN?)oauE;4(o1|3MPyXwWu=c8R7WK5Oe_B)RX8ul``o5yu z@+Q$;D;$2cLxq<>&UM~JOg7H>Fw~QH8eHiQQ3{Ikg6P-h<^TG? zjjxpc++bv91XK5(9l!azi&$1T_>%0GA3TW*|JVE^+9721L6e9HIgUEp-ysmV?R})o z(X`q3yXNxkt=AZ~xrH3A2h_JZOhFZY;h1+HdeG6l-WQIi@g}_VyXDH%e zvp`0;`Q#9FyEM1vEQCSx{28?@FK#=Xd^6#e>r}9&$#W(7_Q8}yq%tAMO#n-KFZn@o zFl+LQ3#g(RY{ACh_?pL3qQNy8URq-K{rfJvBFW*cH?XjVdvaPC%Gy&lQB=r@_B#c=nsm%mCoesQCsP{p~j`Jfbg2YGM@a|#ClZs0%@SoJ4hAW+-$*{Nj2 zSqXw?5AVLm;gIV)`L8=6W4j;Dn%FOn4CYc9pq3PNG=T)R^ltrC+g--FY?)b9vcz3# zjGu5GWYguGHOaEkCn_y6Q`eN`2fJp4!H?y}R*m3%Rt}b5d7(>XY>! zH>_k-asel3LN>M(>=9P{JjwDr&-F`0oNXXDDnkd$YMVk>RlKls$cuk54*`Yp1zS6l zsP!!iSQ_l$!tVmqA;-WISh|R@4+tqa2g3SSSa{}=q1#d?_4!xM`L0(XgPz0h8O$=s zQu)t`E3VY*y{aY!#}jXVFnS*#HGeYj>4iPH)0BX%%kitQ+nRgFb zj5y87R2uH*3zETl*smS9@!b4l)GBZab!pnYOU#TV(Fp&c3K9YL-3PCC)R4u^1f*Za z^}%&02kj?HY1M2_aWj7q)FTyvxgS2pJRoX#;poY zv*yisPmF*Y7y7&ft;iFTV%&VD=g#2{6xOFutL$%spp`$=s07=iJyd4MOnQ$yam_uM zu^G7NceG+di!*Zj!nA^zEW5TW?;PaJL*do+JU4PboHR`XN8LrUEH4;wD1`myklJ*NeqhcFk42276s8 zgdLSj;wRDFM9N^^JO9`Uy|~0nb6w~ljW#nJz00!o_$adxj<4O*eG1s64-sDolFP9& zR#ptVhcOTomIBdp;ba17)YeXpAB^hOiQ^N+jz4bHiV&Q&9{mu@H9yBJ*66{Qqt$jE z-#VsWwiXrt>YY_nlKfV<)HFlE1RB#5gg(pz9iiYagMX#B`VjV@`{bA#U}+GyfWBDp zoS1-c!mz8EDGni9)jd-oJL5g$ttVUi;S5Qqgh6zo;$HI;@n@Wvb4%49$Ni=B*Nz1< zsfor>iRkK9-W%_By9w0rn^(a4tP5>_=_V121aBS~$fViB;$Ri&^LYtI@AlK^_IRF3 zw|&b=9PS^so86rS3=w6ta6-ZRq>A78gz_^iy{neTrFm5kiyl48Jh)IOv?lx4}hNZ;Mj3{<2IoYfMR&wT)60%;BRL+HY3dyc1IP`9%`0w}wbfB{@i zjEZrFJN$eOW#hLX-%50XL5Jkmt(y}yFx%cklUqND%(9n=vy>@kRzs+}tqRX!xf@5J zjYJ+Xj4V?I6>#27nUoG8M z5`D|1ej6KZqpl&(?IW_9zF>S^FS4&Ri$gt z%!C)>o9uZ9GQtBWQ4Crn_Z-s}JV$&biTX^zP?bvAc#D6;j{LfZPieUOJpW5{F(#cM zQ+drjrM`JX6w@spiuDJmRU}m2AO)Zs{XH*uyk~G*phY!Us|4sVzR1%?&&4xFj+CF< zlI}__PQkXZwgD~nyKZ%rEzk-m1|0WhOy)gtsAmI-wObyg(rlgUaf!${XdD#93}={- zefYL$k`cL4^wjkBx!t~r5H<^1eP%F?+xM++}w3Qi%hKJ-3jGgandITxp0Lm_snPXlXr|OHuc%86<{H-NCCFI!<_ZaCeYY#(=180 z1)Bt(0HOOhB7FY>la>rwkx<2|Iz9A+iX zSSu7pUki%Wl#?zyHwQAPZ=r~SQGx66#+R>0x+wZ$`obm?h7ysK1QtpOMY&h4N~2;; z9U0Mi%#jg|dDfZd!HLJn^%2+Nx&gNpgB8Xzvm6?r4>hLaF=F_&Y8!D5Q^K~D6=0_( zM$?89a(#Fy6uzy=xXd*T+Zbrx=RP(a%s{cBPqrOWs)s|{aGmuRS3?)iM*O!~mE3~I zWkcw*c)<2=(24)-c&i&>M-v(tyzUnw(7LtE^{cFCcd@eE_OOK;{fS<@Z*FIzsB)Fq zKum<`W-cKMd~ts8GsHA(+dx(pR6Ij%-#xv21qd>@a96I*_f3EQdRlcU&>)-ET5P<+ zUofox3k{|2arX7z7nx+xmVkGPj9NcUUm|t>lb7ik+jvR*dVg1NWmXEqeCLM!2+g&G zuA{}3;b_Og-O`lJMD9()Tn8GvA%uOwtI_7!%IrIP77yuL1+_$sA%W$)a{qQ@O5Kg~ z=^9avnb0bz5^YRjWxAORcO;z`MMAoHPBhn}4bCKAaT=Of@y&puSyev=2Ti0gwkjp$ z5sd3-Bu43F&g)qxp9h$}lu#e*pq*Nb`$f4XC}Rp5=}F~`^0GuY5%_5;U}iSVZ)<&W z(UZpxgm{r4vM0lB9EZLtIA``cwX-C3oOlt}`CcvOH_cH;*9X1M-3-nN7gr-+D@rXy zOzQBR)X$5MRY)6(bOEvY)Pn$_2ZB}zT|TZ)v~oi!>`J&ns#*_kvgPClTusej`6y5^ zj=Iy9Tc`dCZ`i4Pwp+Am?2{*3j&BKUcFMrk#{f1shST8|$A9GD4X3o zllK(qB1WOqs^OeY|L7?WZ2)E!*@}5qq1XSbe!S#4CDoZbVBe~RM6|Okz(ELnX|?l@#y zbTcK-#b*@L6Ar~?S|X?RlR$wcs}eD$&hsN_tlNo9*ADt*J#As{rY;>R?H3s=Ex!z@3l0I;iMjIx#g#X0py|QHwO9Jw zhHSzhUvjJL$4l;eN?4OZn;pg7<`>o>$I=)L|I+1}@!^pt43MU^ENmR7Tk65tIsz)z zute}AQnDt`x&8FDP7%0Op?1LyW_ef5uB9RygAcuenok6sLq1 z7Y72Mgh|-q!1RpMz4fud-JI9BUjGeUxIF>yPU!JJST$fr;|I}_Vl78TAvr6%O}iXZ zHm6u@;}r5WVMUx!0G5^2rc>qeu$h@H&GyPnu~RbV-Q9wQd2hfxzs>X|EzwnK8F5+c z#KBM7fde21IhXZ3aAr6Yyp9vTQ|3QD9Qw0otG6PFWL~et+IR7Dn`Nr|fOo)Plc+0~ ziIv;!k$puroHv_r0X_VihUlj#(z8hNbMzo?4h2_HQu`xsrDVGGQeV!2%G>tma0Ahd z(a3i8F$v+5Z5%dvLN4RQQ9hu`^Caowtnm8U&t8?JcA2N*k+gfADzP^r zei+Sa8Acp*v)bGf3*9vP$sRtSCyQ1JJ>ZARi*;9;5-{*1WD?k9_=q`@(%*B-P@&{x zf}HJVU_jxhD<-R~k_UW1^SK6}J`0xqmbt*-z9V-rmbq0LcHO}v2i!DwzqG@e8Gxsc zYL-owVlPHjKo<>OC0e?icwuhKlY>8bJqR4S=i10-^uM`}>UoOY+Opx7U}h&8*P!;j z)7{F0oz{vJB-Ac!gQQmL!}G((|D*};}(7($=TIU=c&d<{*A!i-eSykou?jq{$QI1?B5}h z1cFDId(7a+X7IkRdO@O$caD2kcd1JrkNXj~m4E_O@`xUTa$izG4@p zd(8e9?8xtKyw_op0?YRgDq~!2?TG^0Qp|*QCdI1qb0k>(5~s+b!NSM)d~Orh{~SZ} zI2VsFU;9(;8q=&gKP;EwPMykB_?GF)8@S+6LVA`WNt7ytBI8VSrB0+HYK%X1KI9U> zAZQ56jQ2mVk-z%V%ltY+=rHYA*5e9I7x@wmUml0TpSX_?^s@kC;WJxn8xz-(n$`14 z9vKX?6IYPG-eVjbz*g41)zejGK(V)d^Dx*mPcJ;%)Ygzvwy!t!x$imG%5daQ0jZS> zhm|+1rpu;qx;J{>Rb?pJalaR)b{NFN7CR(&D6(Bp?RD5ti7DfT4R6*C=b2%w>Ms73 z!DPVnwF=tAHr=7L0;lMXO9X2`Z{)x<_EZHAb7g2VxVsv{+O!Pv@2!h7G|Kj9NAPJk z7ge=6e{BlL?HtTg4eMw{LB2jka%ecYstrtSw@S8NUARrW|2n2^vls6-cM4U%&bv-5 z6to}ryRikaS|I&_Y^-&Ud9tiQ`jw{Rvv$F|B0Gb|h{z0`t8rcnqWGrmAN@W2nYNO) z=Z#ZIcWeW?aoMMYBpG(M24Y|ck{lU%Fi{zL+^}L&$-x*n5`d|~CCBnzr+#j6w&2{@$4RT`GX@wFKwOKpl zD&OmWMA`7;enZVzI{HPPnJza$o5do|5H%R-KxlDD^h2I6U>-oRke)d-@x*gx-9}~z z%*Q?FTlFiLE5}OPg}y~zopMt7u8P9p3gX!w+x34tKJrQlUv5q@8hp^ zIQ2!ej29vP;|QOoe-@@0v@bBJ-kRuuhdI6QEx=<9|Hd65?+vwu_hBAxvE7){eOW7b zV5~?mSkA$@qj4`VYL?7uT~04!@m!DBJu#mrD+?aw6$xLCdXe==?(7|AqB2n0ZGE$* z5{}_K$-Wc%0@!|@J&&w_R@WS@QSH^y?l9rK|9*GBUsyeT^je z3nFu;Wkz|n@i3+~v#C!R5|?Wjy@%jqt6k7z_l7x`-wcO`z>@&-KrZ=$HLK|Up^Tg~ zGe^0veNR}L)GQ((UPXG@Ztni$TdsQ{Yjb<@B|nmjsZBO!n3b;VVBwo>7c~R{i0KQ z2q3orJm~Z3>x8Vv@RtOlpGU`52%pX9ek=Q4d>~40gyR?4i(M+bR^wAaURp~Muz8ly zJNm#;sPZfo0^>_Nh%3gtAu0B_8`evLbqIm5cy*Gl4M8xyG`h;+!F^t25R=EI0s4dZ z(%#R>M@SW=Ps<#Y&BWdxR#%lS*e=DU( z+gDQ?zg1jpXuAGnC4y13T9YT>w`sYp9bZtO3!#CwZv2n7OhFS$=IHpQ`z;dpNi;=} zeb`Iq)r2ST#RtZ;4}QNj)Gy>@c+zJ;=+stvtd@mm_M}oW0?(iPkrGvtj`ssuB0G%c zBz1JR?~eh}(n6_^4L?zgaGV(z)j-W|J#R1k_oheugx_x-PbTGbO&Z^j>ikD4 z_mENTilhQdvCi~ci*%OmvfeA&7tS}?dj*RP$=)OdcbwhZg2@Un43dwKN|(>%OBRTz zmb_k9H&fd0yL|jCMT?8{YjOwVtfi&p_0)>uPF=U(bScXnm(J+p$(TJ!@0(kl_8Q`? zz(5h%RQcRf@xW0b8Q;F4p(4G5mS+zh7gB!-(K34U(fGmK+CQ{P+cP~v+(SD^3ET-j z5_1GS=+M(#PX2lMFhvTq#v^9-$LGKu8LgCnH>oxA<}`o4^SqpgAKHI}fNFwrq2mvf zj`<$8T=$>9(UdT!-GVy&%~4duHc;}QCccvY3J4;fjQTwK^}dIZu93=9b|qru#}~iK z^WW3IwFVm9n0Q~Qyqi5%Fn-_It90E=^YgW*E;$rmq)qU!f@ObW9Iy5V?+eh#FFU&G z!dI3%sZ8CK*MvRCs9ZSqx(l5IKlz!Rq!;KpcO~1V#p6@RnJ(-HIO;cMT5kEJ($wea z^NmRCBy;8ror}&k5+KUh^2{UKR zZ+LhZ+|yA0ONE?}lw@&cTd7){|Bd9vFFMOC(~?4_o~E8cx`e1?OoU^Y&z(vr_jq`< zk=8YPe&k!DOn#y(3No%qqDSz&f92{sp+cTZ22>^{(toeSBI4!a-h8?(GM;&72tPZu z!|4!0zUOOh|Dq?cihbN+x}w^z)}q>e<{LPDEXNFQ+HEZ3sWr4=Ev_@!Nxzv|@8H~* z{%x>-YPZqT;hFdvZ-_ zJWcf#7dPVI88r!|%LZKI*BjLPS%k)V=Hn{OH+`X*;SH3{_)oF%v7M0YRHK#T$>|S< zX_@KS{SE{D@>*X&e_2z_7qC?e z9uaP_b!>o#32GJV;bE3c3`4R7FFh6 z3@hIg+<9B+u=HEOy}DpAiA`_yk_GT2^z!Sd2f3?D7$sx8*{?`3Q|!CF26yuFN(lq- zMDFWKJ;^-Lq!A6{376;I&ID$NKWO{Gp-qIiT*F$Ga|WV_WtQr${r2~LrKcx3SCq+pyeLs!go7|3m{`{Gz5naynWpkk`hiXQb zMxCRmei@_X9ybl%+iNKN3Esz46WwR z0UA8XEsZ7AbL~H`zeJnMF2jL~?CMboRY`w803CB|Gki08>oQ7$YOH^T`(-%dJ(ck7 zt7w@wS3VMM=&*Kcy^2u3Cj{HS(kinIOJZ4`q7hcVE9YTv5P%EPC9-rKYT%xAo{-6CNE|06w)tkC(MjPY`MQXEvCd<`_IllA;DKR7z?U6Ha zNRQGgG8s~{6$4)DqPz_}>hddYpFhvUjw5*=IE3D~`G75~Cwt*=sI;{gMC)AT)yF5v z`0d)(J#8mzT77S|J*F#Oi!!UY_K?N7$~Ut}_<_svuX~PE!cgI+M-EZd^(Nn*v>M)+ zkAq5+#k2`tjr{j;F(%`oX?V0~1Y{C5d(w&ZrVzo$L(qe&djiXE4*{tF;=}@jIak9l z{lY}l6*D`Z*e{nJi`}$Th>(1VHS=WfooP$e7@^EMe424^KWd=R6Lj{}l;&rs^8#L%Dm zSqJ2wyAX}jBWdL$z;EQg1GENlguG~uZFU}lMt)khT9r^P`?E$EH}I}oCUo8%c>o=# zr{hP9clWU!FVhul%a4rdCj1<2Gn4l*jhf)k304mtAoC2Qsif836@7PKW%GxEH_O-H zHcmEL=gZ)ebKExij0qcMG*UKl$5TDENPYSn&~|Y;SBuM8>r7F4m1*<( zCphFZD03ZF_jj{{RoSBUx5g?80v`a=BPGQ@BO1p8ykCsF$=@091P>W@;A@lYYDt)c zi@sb4L7!?9s6PY0i~na8JSsNeR%_P>WhN*zG(Y8B&nlI>aL1!bzafhsM|_0ipNG|W z@`bXj^Re2c37Ck^Veh%nspo%ReE4_i`4wN;19}#$q;@TB*Th3IN%Qi*@T=`gqp^4M z&{}705&G(mv=V;oT2js=IJ0ktHs7w^o7!u?{*l}YND$2kPY97=4y*sjFDFbItEra$ zRapOQ1IVKSGV!eTGq=yTDo9)dN$n?3_OM1nYG$Bu-)m`6WBrKx1%=h^?ZZNP9~CB& zHsTY|erF}I=7+J21#?FzF~b9ltVO zLqfWH(jg5>cQ>O4+n#T}@B1D58+IJqp8LM8^ZK3VRny(t*5;r%OJE(cZ0{s{ws(A7 zfx7ONeC)+QH`?UFmlx^HBi|?+P`cRtfRNON`+00cF7Qfm*g4i_Bj--p_*s9_^)A|4 zOQ>c8`>LUtdjpN0=!C|6raO(OC4Tb!DqGQDkE^%op zR=d5Qo5)y;%zZl&4|y#fHP$yc1!&sauTk($6auavc=o(#xpDR(d7`+P7Vjhjk?UG9 zv`ADI4RdFkw#%Ng$p_0oFIb(78b`Er2+>S-HuIwIij-U%7XMe1TB|5\?H&!0Dk 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 hUX#)<*Ek3pz%P Date: Fri, 9 Dec 2022 17:27:42 +0800 Subject: [PATCH 11/14] update notebooks for e2e demo Signed-off-by: liyuan --- .../notebooks/python/agaricus-gpu.ipynb | 13 ++++- .../python/MortgageETL+XGBoost.ipynb | 58 +++++++++++++++---- .../notebooks/python/mortgage-gpu.ipynb | 14 ++++- .../taxi/notebooks/python/taxi-gpu.ipynb | 13 ++++- 4 files changed, 85 insertions(+), 13 deletions(-) diff --git a/examples/XGBoost-Examples/agaricus/notebooks/python/agaricus-gpu.ipynb b/examples/XGBoost-Examples/agaricus/notebooks/python/agaricus-gpu.ipynb index ef86626af..3bae77e02 100644 --- a/examples/XGBoost-Examples/agaricus/notebooks/python/agaricus-gpu.ipynb +++ b/examples/XGBoost-Examples/agaricus/notebooks/python/agaricus-gpu.ipynb @@ -108,6 +108,7 @@ "conf.set(\"spark.executor.resource.gpu.amount\", \"1\")\n", "conf.set(\"spark.rapids.sql.concurrentGpuTasks\", concurrentGpuTasks)\n", "conf.set(\"spark.rapids.memory.pinnedPool.size\", pinnedPoolSize)\n", + "# since pyspark and xgboost share the same GPU, we need to allocate some memory to xgboost to avoid GPU OOM while training \n", "conf.set(\"spark.rapids.memory.gpu.allocFraction\",\"0.7\")\n", "conf.set(\"spark.locality.wait\",\"0\")\n", "##############note: only support value=1 https://github.com/dmlc/xgboost/blame/master/python-package/xgboost/spark/core.py#L370-L374\n", @@ -210,7 +211,17 @@ "source": [ "The parameter `num_workers` should be set to the number of GPUs in Spark cluster for GPU version, while for CPU version it is usually equal to the number of the CPU cores.\n", "\n", - "Concerning the tree method, GPU version only supports `gpu_hist` currently, while `hist` is designed and used here for CPU training." + "Concerning the tree method, GPU version only supports `gpu_hist` currently, while `hist` is designed and used here for CPU training.\n", + "\n", + "An example of CPU classifier:\n", + "```\n", + "classifier = SparkXGBClassifier(\n", + " feature_col=features,\n", + " label_col=label, \n", + " num_workers=1024,\n", + " use_gpu=False,\n", + ")\n", + "```" ] }, { diff --git a/examples/XGBoost-Examples/mortgage/notebooks/python/MortgageETL+XGBoost.ipynb b/examples/XGBoost-Examples/mortgage/notebooks/python/MortgageETL+XGBoost.ipynb index d46adb3a3..6ec1a1d3e 100644 --- a/examples/XGBoost-Examples/mortgage/notebooks/python/MortgageETL+XGBoost.ipynb +++ b/examples/XGBoost-Examples/mortgage/notebooks/python/MortgageETL+XGBoost.ipynb @@ -31,7 +31,9 @@ "from pyspark.sql import SparkSession\n", "from pyspark.sql.functions import *\n", "from pyspark.sql.types import *\n", - "from pyspark.sql.window import Window" + "from pyspark.sql.window import Window\n", + "# if you pass/unpack the archive file and enable the environment\n", + "# os.environ['PYSPARK_PYTHON'] = \"./environment/bin/python\"" ] }, { @@ -60,10 +62,47 @@ "metadata": {}, "outputs": [], "source": [ - "spark = (SparkSession\n", - " .builder\n", - " .appName(\"MortgageETL+XGBoost\")\n", - " .getOrCreate())" + "SPARK_MASTER_URL = os.getenv(\"SPARK_MASTER_URL\", \"/your-url\")\n", + "RAPIDS_JAR = os.getenv(\"RAPIDS_JAR\", \"/your-jar-path\")\n", + "\n", + "# You need to update with your real hardware resource \n", + "driverMem = os.getenv(\"DRIVER_MEM\", \"10g\")\n", + "executorMem = os.getenv(\"EXECUTOR_MEM\", \"10g\")\n", + "pinnedPoolSize = os.getenv(\"PINNED_POOL_SIZE\", \"2g\")\n", + "concurrentGpuTasks = os.getenv(\"CONCURRENT_GPU_TASKS\", \"2\")\n", + "executorCores = int(os.getenv(\"EXECUTOR_CORES\", \"4\"))\n", + "\n", + "# Common spark settings\n", + "conf = SparkConf()\n", + "conf.setMaster(SPARK_MASTER_URL)\n", + "conf.setAppName(\"Microbenchmark on GPU\")\n", + "conf.set(\"spark.driver.memory\", driverMem)\n", + "## The tasks will run on GPU memory, so there is no need to set a high host memory\n", + "conf.set(\"spark.executor.memory\", executorMem)\n", + "## The tasks will run on GPU cores, so there is no need to use many cpu cores\n", + "conf.set(\"spark.executor.cores\", executorCores)\n", + "\n", + "# Plugin settings\n", + "conf.set(\"spark.executor.resource.gpu.amount\", \"1\")\n", + "conf.set(\"spark.rapids.sql.concurrentGpuTasks\", concurrentGpuTasks)\n", + "conf.set(\"spark.rapids.memory.pinnedPool.size\", pinnedPoolSize)\n", + "##############note: only support value=1 see https://github.com/dmlc/xgboost/blame/master/python-package/xgboost/spark/core.py#L370-L374\n", + "conf.set(\"spark.task.resource.gpu.amount\", 1) \n", + "# since pyspark and xgboost share the same GPU, we need to allocate some memory to xgboost to avoid GPU OOM while training \n", + "conf.set(\"spark.rapids.memory.gpu.allocFraction\",\"0.6\")\n", + "conf.set(\"spark.rapids.sql.enabled\", \"true\") \n", + "conf.set(\"spark.plugins\", \"com.nvidia.spark.SQLPlugin\")\n", + "conf.set(\"spark.sql.cache.serializer\",\"com.nvidia.spark.ParquetCachedBatchSerializer\")\n", + "conf.set(\"spark.driver.extraClassPath\", RAPIDS_JAR)\n", + "conf.set(\"spark.executor.extraClassPath\", RAPIDS_JAR)\n", + "conf.set(\"spark.jars\", RAPIDS_JAR)\n", + "\n", + "# if you pass/unpack the archive file and enable the environment\n", + "# conf.set(\"spark.yarn.dist.archives\", \"your_pyspark_venv.tar.gz#environment\")\n", + "\n", + "# Create spark session\n", + "spark = SparkSession.builder.config(conf=conf).getOrCreate()\n", + "reader = spark.read" ] }, { @@ -889,10 +928,9 @@ "source": [ "# This sample uses 2 workers(GPUs) to run XGBoost training \n", "params = { \n", - " \"treeMethod\": \"gpu_hist\",\n", - " \"growPolicy\": \"depthwise\",\n", - " \"numRound\": 100,\n", - " \"numWorkers\": 2,\n", + " \"tree_method\": \"gpu_hist\",\n", + " \"grow_policy\": \"depthwise\",\n", + " \"num_workers\": 2,\n", " \"use_gpu\": \"true\",\n", "}\n", "params['features_col'] = features\n", @@ -1022,7 +1060,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.8.13" + "version": "3.8.2" }, "name": "gpu-mortgage", "notebookId": 4440374682851873 diff --git a/examples/XGBoost-Examples/mortgage/notebooks/python/mortgage-gpu.ipynb b/examples/XGBoost-Examples/mortgage/notebooks/python/mortgage-gpu.ipynb index 8f41f76a0..cb21c087f 100644 --- a/examples/XGBoost-Examples/mortgage/notebooks/python/mortgage-gpu.ipynb +++ b/examples/XGBoost-Examples/mortgage/notebooks/python/mortgage-gpu.ipynb @@ -118,6 +118,8 @@ "conf.set(\"spark.rapids.memory.pinnedPool.size\", pinnedPoolSize)\n", "##############note: only support value=1 see https://github.com/dmlc/xgboost/blame/master/python-package/xgboost/spark/core.py#L370-L374\n", "conf.set(\"spark.task.resource.gpu.amount\", 1) \n", + "# since pyspark and xgboost share the same GPU, we need to allocate some memory to xgboost to avoid GPU OOM while training \n", + "conf.set(\"spark.rapids.memory.gpu.allocFraction\",\"0.6\")\n", "conf.set(\"spark.rapids.sql.enabled\", \"true\") \n", "conf.set(\"spark.plugins\", \"com.nvidia.spark.SQLPlugin\")\n", "conf.set(\"spark.sql.cache.serializer\",\"com.nvidia.spark.ParquetCachedBatchSerializer\")\n", @@ -246,7 +248,17 @@ "source": [ "The parameter `num_workers` should be set to the number of GPUs in Spark cluster for GPU version, while for CPU version it is usually equal to the number of the CPU cores.\n", "\n", - "Concerning the tree method, GPU version only supports `gpu_hist` currently, while `hist` is designed and used here for CPU training." + "Concerning the tree method, GPU version only supports `gpu_hist` currently, while `hist` is designed and used here for CPU training.\n", + "\n", + "An example of CPU classifier:\n", + "```\n", + "classifier = SparkXGBClassifier(\n", + " feature_col=features,\n", + " label_col=label, \n", + " num_workers=1024,\n", + " use_gpu=False,\n", + ")\n", + "```" ] }, { diff --git a/examples/XGBoost-Examples/taxi/notebooks/python/taxi-gpu.ipynb b/examples/XGBoost-Examples/taxi/notebooks/python/taxi-gpu.ipynb index e263b75d4..3007d6b50 100644 --- a/examples/XGBoost-Examples/taxi/notebooks/python/taxi-gpu.ipynb +++ b/examples/XGBoost-Examples/taxi/notebooks/python/taxi-gpu.ipynb @@ -107,6 +107,7 @@ "conf.set(\"spark.executor.resource.gpu.amount\", \"1\")\n", "conf.set(\"spark.rapids.sql.concurrentGpuTasks\", concurrentGpuTasks)\n", "conf.set(\"spark.rapids.memory.pinnedPool.size\", pinnedPoolSize)\n", + "# since pyspark and xgboost share the same GPU, we need to allocate some memory to xgboost to avoid GPU OOM while training \n", "conf.set(\"spark.rapids.memory.gpu.allocFraction\",\"0.7\")\n", "conf.set(\"spark.locality.wait\",\"0\")\n", "##############note: only support value=1 https://github.com/dmlc/xgboost/blame/master/python-package/xgboost/spark/core.py#L370-L374\n", @@ -226,7 +227,17 @@ "source": [ "The parameter `num_workers` should be set to the number of GPUs in Spark cluster for GPU version, while for CPU version it is usually equal to the number of the CPU cores.\n", "\n", - "Concerning the tree method, GPU version only supports `gpu_hist` currently, while `hist` is designed and used here for CPU training.\n" + "Concerning the tree method, GPU version only supports `gpu_hist` currently, while `hist` is designed and used here for CPU training.\n", + "\n", + "An example of CPU classifier:\n", + "```\n", + "classifier = SparkXGBClassifier(\n", + " feature_col=features,\n", + " label_col=label, \n", + " num_workers=1024,\n", + " use_gpu=False,\n", + ")\n", + "```" ] }, { From 47fcbff1f86f284992b6d5003a00881c1059e626 Mon Sep 17 00:00:00 2001 From: liyuan Date: Wed, 14 Dec 2022 16:29:38 +0800 Subject: [PATCH 12/14] update the pyspark xgboost trainning perf and add a note for maxRecordsPerBatch default value Signed-off-by: liyuan --- docs/img/guides/mortgage-perf.png | Bin 51481 -> 226870 bytes examples/XGBoost-Examples/README.md | 7 +++++-- 2 files changed, 5 insertions(+), 2 deletions(-) diff --git a/docs/img/guides/mortgage-perf.png b/docs/img/guides/mortgage-perf.png index 8c0227eb4e8de0cf64e4a7589eb8336583d4a060..11c94865a1af9761b58cecb42292400d2eec02cb 100644 GIT binary patch literal 226870 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