From ebf4070d88fa65957f1540c06708acef591d5e97 Mon Sep 17 00:00:00 2001 From: Crystal Date: Thu, 12 Jul 2018 16:57:39 -0700 Subject: [PATCH] Documentation- Basic Profiling for Ray Users (#2326) * Ray documentation - created new section 'Profiling for Ray Users', opposed to current Profiling section for Ray developers. Completed three sections 'A Basic Profiling Example', 'Timing Performance Using Python's Timestamps', and 'Profiling Using An External Profiler (Line_Profiler).' Left to-do two sections on CProfile and Ray Timeline Visualization.' * Ray documentation - Fixed rst codeblock linebreaks in 'User Profiling' * Ray documentation - For User Profiling, added section on cProfile * Ray documentation - For User Profiling, completed Ray Timeline Visualization section, including graphical images * Ray documentation - made User Profiling timeline image larger, minor wording edits * Ray documentation - minor wording edits to User Profiling * Ray documentation - User Profiling- fixed broken link * Minor wording changes requested by Philipp Moritz addressed. Still need to address (1) compressing the image files, (2) correcting ex 3 to not be remote, and (3) using cProfile on an actor * Ray documentation - For user-profiling.rst, revised example 3 to show a semi-parallelized example. Compressed timeline example image to be under 50 KB, removed view timeline GUI image. Updated timeline example image to reflect revised example 3. cProfile actor example left * Ray documentation - in user-profiling.rst, added a new example including actors in the cProfile section * Ray documentation - For user-profiling.rst, added section header for the Ray actor cProfile example * Update user-profiling.rst * Update user-profiling.rst * 4 space indentation * Update user-profiling.rst * Update user-profiling.rst * Update user-profiling.rst * corrections --- doc/source/index.rst | 1 + doc/source/profiling.rst | 4 +- doc/source/user-profiling-timeline.gif | Bin 0 -> 49184 bytes doc/source/user-profiling.rst | 649 +++++++++++++++++++++++++ 4 files changed, 652 insertions(+), 2 deletions(-) create mode 100644 doc/source/user-profiling-timeline.gif create mode 100644 doc/source/user-profiling.rst diff --git a/doc/source/index.rst b/doc/source/index.rst index 14865b002..5f0e0c215 100644 --- a/doc/source/index.rst +++ b/doc/source/index.rst @@ -132,6 +132,7 @@ Ray comes with libraries that accelerate deep learning and reinforcement learnin :caption: Help troubleshooting.rst + user-profiling.rst development.rst profiling.rst contact.rst diff --git a/doc/source/profiling.rst b/doc/source/profiling.rst index 6f76c7eb1..59d12d635 100644 --- a/doc/source/profiling.rst +++ b/doc/source/profiling.rst @@ -1,5 +1,5 @@ -Profiling Ray -============= +Profiling for Ray Developers +============================ This document details, for Ray developers, how to use ``pprof`` to profile Ray binaries. diff --git a/doc/source/user-profiling-timeline.gif b/doc/source/user-profiling-timeline.gif new file mode 100644 index 0000000000000000000000000000000000000000..455f1a9af3d9567cda0f8c5e7b5db1890c263118 GIT binary patch literal 49184 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 z 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 cL){ZAWVmnn;hg`EjqSty Restart and +Run All** in the jupyter menu. + +The Ray timeline can be viewed in the fourth cell of the UI notebook by +using the task filter options, then clicking on the **View task timeline** +button. + +For example, here are the results of executing ``ex1()``, ``ex2()``, and +``ex3()`` visualized in the Ray timeline. Each red block is a call to one +of our user-defined remote functions, namely ``func()``, which sleeps for +0.5 seconds: + +.. image:: user-profiling-timeline.gif + +(highlighted color boxes for ``ex1()``, ``ex2()``, and ``ex3()`` added for +the sake of this example) + +Note how ``ex1()`` executes all five calls to ``func()`` in serial, +while ``ex2()`` and ``ex3()`` are able to parallelize their remote +function calls. + +Because we have 4 CPUs available on our machine, we can only able to +execute up to 4 remote functions in parallel. So, the fifth call to the +remote function in ``ex2()`` must wait until the first batch of ``func()`` +calls is finished. + +In ``ex3()``, because of the serial dependency on ``other_func()``, we +aren't even able to use all 4 of our cores to parallelize calls to ``func()``. +The time gaps between the ``func()`` blocks are a result of staggering the +calls to ``func()`` in between waiting 0.3 seconds for ``other_func()``. + +Also, notice that due to the aforementioned limitation of the Ray timeline, +``other_func()``, as a driver function and not a Ray task, is never +visualized on the Ray timeline. + +**For more on Ray's Web UI,** such as how to access the UI on a remote +node over ssh, or for troubleshooting installation, please see our +`Web UI documentation section`_. + +.. _`Web UI documentation section`: http://ray.readthedocs.io/en/latest/webui.html