ray/doc/source/ray-core/tasks/resources.rst
Eric Liang c8f207f746
[docs] Core docs refactor (#23216)
This PR makes a number of major overhauls to the Ray core docs:

Add a key-concepts section for {Tasks, Actors, Objects, Placement Groups, Env Deps}.
Re-org the user guide to align with key concepts.
Rewrite the walkthrough to link to mini-walkthroughs in the key concept sections.
Minor tweaks and additional transition material.
2022-03-17 11:26:17 -07:00

108 lines
3.2 KiB
ReStructuredText

.. _resource-requirements:
Specifying Required Resources
=============================
Oftentimes, you may want to specify a task's resource requirements (for example
one task may require a GPU). Ray will automatically
detect the available GPUs and CPUs on the machine. However, you can override
this default behavior by passing in specific resources.
.. tabbed:: Python
.. code-block:: python
ray.init(num_cpus=8, num_gpus=4, resources={'Custom': 2})
.. tabbed:: Java
Set Java system property: ``-Dray.resources=CPU:8,GPU:4,Custom:2``.
.. tabbed:: C++
.. code-block:: c++
RayConfig config;
config.num_cpus = 8;
config.num_gpus = 4;
config.resources = {{"Custom", 2}};
ray::Init(config);
Ray also allows specifying a task's resources requirements (e.g., CPU, GPU, and custom resources).
The task will only run on a machine if there are enough resources
available to execute the task.
.. tabbed:: Python
.. code-block:: python
# Specify required resources.
@ray.remote(num_cpus=4, num_gpus=2)
def my_function():
return 1
.. tabbed:: Java
.. code-block:: java
// Specify required resources.
Ray.task(MyRayApp::myFunction).setResource("CPU", 1.0).setResource("GPU", 4.0).remote();
.. tabbed:: C++
.. code-block:: c++
// Specify required resources.
ray::Task(MyFunction).SetResource("CPU", 1.0).SetResource("GPU", 4.0).Remote();
.. note::
* If you do not specify any resources, the default is 1 CPU resource and
no other resources.
* If specifying CPUs, Ray does not enforce isolation (i.e., your task is
expected to honor its request).
* If specifying GPUs, Ray does provide isolation in forms of visible devices
(setting the environment variable ``CUDA_VISIBLE_DEVICES``), but it is the
task's responsibility to actually use the GPUs (e.g., through a deep
learning framework like TensorFlow or PyTorch).
The resource requirements of a task have implications for the Ray's scheduling
concurrency. In particular, the sum of the resource requirements of all of the
concurrently executing tasks on a given node cannot exceed the node's total
resources.
Below are more examples of resource specifications:
.. tabbed:: Python
.. code-block:: python
# Ray also supports fractional resource requirements.
@ray.remote(num_gpus=0.5)
def h():
return 1
# Ray support custom resources too.
@ray.remote(resources={'Custom': 1})
def f():
return 1
.. tabbed:: Java
.. code-block:: java
// Ray aslo supports fractional and custom resources.
Ray.task(MyRayApp::myFunction).setResource("GPU", 0.5).setResource("Custom", 1.0).remote();
.. tabbed:: C++
.. code-block:: c++
// Ray aslo supports fractional and custom resources.
ray::Task(MyFunction).SetResource("GPU", 0.5).SetResource("Custom", 1.0).Remote();
.. tip::
Besides compute resources, you can also specify an environment for a task to run in,
which can include Python packages, local files, environment variables, and more---see :ref:`Runtime Environments <runtime-environments>` for details.