From f21e6a2cff7b1a4686473e2fe880795f24c6b501 Mon Sep 17 00:00:00 2001 From: Robert Nishihara Date: Fri, 1 Mar 2019 19:54:33 -0800 Subject: [PATCH] Update documentation regarding UI and timeline. (#4189) --- doc/source/index.rst | 1 - doc/source/user-profiling-timeline.gif | Bin 49184 -> 0 bytes doc/source/user-profiling.rst | 115 +++---------------- doc/source/webui.rst | 147 ------------------------- python/ray/node.py | 7 +- python/ray/worker.py | 3 - 6 files changed, 21 insertions(+), 252 deletions(-) delete mode 100644 doc/source/user-profiling-timeline.gif delete mode 100644 doc/source/webui.rst diff --git a/doc/source/index.rst b/doc/source/index.rst index f308cbea4..d29f34f4e 100644 --- a/doc/source/index.rst +++ b/doc/source/index.rst @@ -65,7 +65,6 @@ Ray comes with libraries that accelerate deep learning and reinforcement learnin api.rst actors.rst using-ray-with-gpus.rst - webui.rst signals.rst async_api.rst diff --git a/doc/source/user-profiling-timeline.gif b/doc/source/user-profiling-timeline.gif deleted file mode 100644 index 455f1a9af3d9567cda0f8c5e7b5db1890c263118..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 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 diff --git a/doc/source/webui.rst b/doc/source/webui.rst deleted file mode 100644 index 42b0635fe..000000000 --- a/doc/source/webui.rst +++ /dev/null @@ -1,147 +0,0 @@ -Web UI -====== - -The Ray web UI includes tools for debugging Ray jobs. The following -image shows an example of using the task timeline for performance debugging: - -.. image:: timeline.png - -Dependencies ------------- - -To use the UI, you will need to install the following. - -.. code-block:: bash - - pip install jupyter ipywidgets bokeh - -If you see an error like - -.. code-block:: bash - - Widget Javascript not detected. It may not be installed properly. - -Then you may need to run the following. - -.. code-block:: bash - - jupyter nbextension enable --py --sys-prefix widgetsnbextension - -**Note:** If you are building Ray from source, then you will also need a -``python2`` executable. - -Running the Web UI ------------------- - -Currently, the web UI is launched automatically when ``ray.init`` is called. The -command will print a URL of the form: - -.. code-block:: text - - ============================================================================= - View the web UI at http://localhost:8889/notebooks/ray_ui92131.ipynb?token=89354a314e5a81bf56e023ad18bda3a3d272ee216f342938 - ============================================================================= - -If you are running Ray on your local machine, then you can head directly to that -URL with your browser to see the Jupyter notebook. Otherwise, if you are using -Ray remotely, such as on EC2, you will need to ensure that port is open on that -machine. Typically, when you ssh into the machine, you can also port forward -with the ``-L`` option as such: - -.. code-block:: bash - - ssh -L :localhost: @ - -So for the above URL, you would use the port 8889. The Jupyter notebook attempts -to run on port 8888, but if that fails it tries successive ports until it finds -an open port. - -You can also open the port on the machine as well, which is not recommended for -security as the machine would be open to the Internet. In this case, you would -need to replace localhost by the public IP the remote machine is using. - -Once you have navigated to the URL, start the UI by clicking on the following. - -.. code-block:: text - - Kernel -> Restart and Run all - -Features --------- - -The UI supports a search for additional details on Task IDs and Object IDs, a -task timeline, a distribution of task completion times, and time series for CPU -utilization and cluster usage. - -Task and Object IDs -~~~~~~~~~~~~~~~~~~~ - -These widgets show additional details about an object or task given the ID. If -you have the object in Python, the ID can be found by simply calling ``.hex`` on -an Object ID as below: - -.. code-block:: python - - # This will return a hex string of the ID. - objectid = ray.put(1) - literal_id = objectid.hex() - -and pasting in the returned string with no quotes. Otherwise, they can be found -in the task timeline in the output area below the timeline when you select a -task. - -For Task IDs, they can be found by searching for an object ID the task created, -or via the task timeline in the output area. - -The additional details for tasks here can also be found in the task timeline; -the search just provides an easier method to find a specific task when you have -millions. - -Task Timeline -~~~~~~~~~~~~~ - -There are three components to this widget: the controls for the widget at the -top, the timeline itself, and the details area at the bottom. In the controls, -you first select whether you want to select a subset of tasks via the time they -were completed or by the number of tasks. You can control the percentages either -via a double sided slider, or by setting specific values in the text boxes. If -you choose to select by the number of tasks, then entering a negative number N -in the text field denotes the last N tasks run, while a positive value N denotes -the first N tasks run. If there are ten tasks and you enter -1 into the field, -then the slider will show 90% to 100%, where 1 would show 0% to 10%. Finally, -you can choose if you want edges for task submission (if a task invokes another -task) or object dependencies (if the result from a task is passed to another -task) to be added, and if you want the different phases of a task broken up into -separate tasks in the timeline. - -For the timeline, each node has its own dropdown with a timeline, and each row -in the dropdown is a worker. Moving and zooming are handled by selecting the -appropiate icons on the floating taskbar. The first is selection, the second -panning, the third zooming, and the fourth timing. To shown edges, you can -enable Flow Events in View Options. - -If you have selection enabled in the floating taskbar and select a task, then -the details area at the bottom will fill up with information such as task ID, -function ID, and the duration in seconds of each phase of the task. - -Time Distributions and Time Series -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - -The completion time distribution, CPU utilization, and cluster usage all have -the same task selection controls as the task timeline. - -The task completion time distribution tracks the histogram of completion tasks -for all tasks selected. - -CPU utilization gives you a count of how many CPU cores are being used at a -given time. As typically each core has a worker assigned to it, this is -equivalent to utilization of the workers running in Ray. - -Cluster Usage gives you a heat-map with time on the x-axis, node IP addresses on -the y-axis, and coloring based on how many tasks were running on that node at -that given time. - -Troubleshooting ---------------- - -The Ray timeline visualization may not work in Firefox or Safari. diff --git a/python/ray/node.py b/python/ray/node.py index 9131ee352..5f3d89be6 100644 --- a/python/ray/node.py +++ b/python/ray/node.py @@ -84,7 +84,6 @@ class Node(object): self._plasma_store_socket_name = None self._raylet_socket_name = None self._webui_url = None - self._dashboard_url = None else: self._plasma_store_socket_name = ( ray_params.plasma_store_socket_name) @@ -306,7 +305,7 @@ class Node(object): def start_dashboard(self): """Start the dashboard.""" stdout_file, stderr_file = self.new_log_files("dashboard", True) - self._dashboard_url, process_info = ray.services.start_dashboard( + self._webui_url, process_info = ray.services.start_dashboard( self.redis_address, self._temp_dir, stdout_file=stdout_file, @@ -317,13 +316,15 @@ class Node(object): self.all_processes[ray_constants.PROCESS_TYPE_DASHBOARD] = [ process_info ] + redis_client = self.create_redis_client() + redis_client.hmset("webui", {"url": self._webui_url}) def start_ui(self): """Start the web UI.""" stdout_file, stderr_file = self.new_log_files("webui") notebook_name = self._make_inc_temp( suffix=".ipynb", prefix="ray_ui", directory_name=self._temp_dir) - self._webui_url, process_info = ray.services.start_ui( + _, process_info = ray.services.start_ui( self._redis_address, notebook_name, stdout_file=stdout_file, diff --git a/python/ray/worker.py b/python/ray/worker.py index bb7406555..c8012de33 100644 --- a/python/ray/worker.py +++ b/python/ray/worker.py @@ -1870,9 +1870,6 @@ def connect(info, if hasattr(main, "__file__") else "INTERACTIVE MODE") } worker.redis_client.hmset(b"Drivers:" + worker.worker_id, driver_info) - if (not worker.redis_client.exists("webui") - and info["webui_url"] is not None): - worker.redis_client.hmset("webui", {"url": info["webui_url"]}) elif mode == WORKER_MODE: # Register the worker with Redis. worker_dict = {