Skip to content

[QST] Question about tuning #2962

Description

@tregodev

Hey!

I've been reading your guide about tuning Spark-RAPIDS.

I am currently getting errors running a job due to poor tuning, I assume. The error is

java.lang.OutOfMemoryError: Could not allocate native memory: std::bad_alloc: RMM failure at:/home/jenkins/agent/workspace/jenkins-cudf-release-9-cuda11.0/cpp/build/_deps/rmm-src/include/rmm/mr/device/detail/arena.hpp:382: Maximum pool size exceeded

I am running with one node that has a Tesla P100 16GB, 117GB of RAM, and 14 CPUs.

These are the parameters I have used, with an explanation how I came to choose it:

       --driver-memory 8G \ // Reasonable amount as to not bottleneck.
       --num-executors 1 \  // Only one GPU means that only one executor.
       --conf spark.rapids.sql.concurrentGpuTasks=2 \ // Up to 5 concurrent tasks, a there are 5 cores used.
       --conf spark.executor.memory=100G \ // Might aswell use most of the memory to speed up the run.
       --conf spark.executor.cores=5 \ // >5 CPUs per executors may slow up the run, so 5 is enough.
       --conf spark.task.cpus=1 \ // One core runs one task.
       --conf spark.executor.resource.gpu.amount=1 \ // This should not be changed.
       --conf spark.task.resource.gpu.amount=0.2 \ // Up to to 5 concurrent tasks per executor
       --conf spark.rapids.memory.pinnedPool.size=4G \ // Some amount of pinned memory
       --conf spark.locality.wait=0s \ // Default
       --conf spark.sql.files.maxPartitionBytes=512m \  //Default

I am still kinda confused what configurations should I try to make the system not run out of memory or even better, get the best possible run time. Can anyone clarify how I should be tuning in this situation? I especially am having issues with seeing how spark.task.resource.gpu.amount, spark.rapids.sql.concurrentGpuTasks, spark.executor.cores and spark.task.cpus should be tuned together. I cant tell the difference between spark.task.resource.gpu.amount and spark.rapids.sql.concurrentGpuTasks, as they both seem to control the amount of concurrent tasks run on a GPU?

For context, my input is about 650GB of strings and output is about 300GB two column tables.

Thanks!

Metadata

Metadata

Assignees

No one assigned

    Labels

    questionFurther information is requested

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions