[Placement Group] Allow scheduling a task on any bundle (-1, default) (#9885)

* wip

* wip

* fix tests

* wip

* wip

* wip

* wip

* wip

* add test

* update

* update

* remov debug

* comments
This commit is contained in:
Eric Liang
2020-08-06 00:05:21 -07:00
committed by GitHub
parent 45597e3158
commit 7d4f204aa8
11 changed files with 296 additions and 101 deletions
+18 -19
View File
@@ -398,24 +398,22 @@ class ActorClass:
return ActorOptionWrapper()
def _remote(
self,
args=None,
kwargs=None,
num_cpus=None,
num_gpus=None,
memory=None,
object_store_memory=None,
resources=None,
is_direct_call=None,
max_concurrency=None,
max_restarts=None,
max_task_retries=None,
name=None,
detached=False,
placement_group_id=None,
# TODO(ekl) set default to -1 once we support -1 as "any index"
placement_group_bundle_index=0):
def _remote(self,
args=None,
kwargs=None,
num_cpus=None,
num_gpus=None,
memory=None,
object_store_memory=None,
resources=None,
is_direct_call=None,
max_concurrency=None,
max_restarts=None,
max_task_retries=None,
name=None,
detached=False,
placement_group_id=None,
placement_group_bundle_index=-1):
"""Create an actor.
This method allows more flexibility than the remote method because
@@ -443,7 +441,8 @@ class ActorClass:
placement_group_id: the placement group this actor belongs to,
or None if it doesn't belong to any group.
placement_group_bundle_index: the index of the bundle
if the actor belongs to a placement group.
if the actor belongs to a placement group, which may be -1 to
specify any available bundle.
Returns:
A handle to the newly created actor.
+13 -15
View File
@@ -139,21 +139,19 @@ class RemoteFunction:
return FuncWrapper()
def _remote(
self,
args=None,
kwargs=None,
num_return_vals=None,
is_direct_call=None,
num_cpus=None,
num_gpus=None,
memory=None,
object_store_memory=None,
resources=None,
max_retries=None,
placement_group_id=None,
# TODO(ekl) set default to -1 once we support -1 as "any index"
placement_group_bundle_index=0):
def _remote(self,
args=None,
kwargs=None,
num_return_vals=None,
is_direct_call=None,
num_cpus=None,
num_gpus=None,
memory=None,
object_store_memory=None,
resources=None,
max_retries=None,
placement_group_id=None,
placement_group_bundle_index=-1):
"""Submit the remote function for execution."""
worker = ray.worker.global_worker
worker.check_connected()
+11
View File
@@ -135,6 +135,17 @@ def test_placement_group_task_resource_ids(ray_start_cluster):
resources = ray.get(o1)
assert len(resources) == 1, resources
assert "CPU_group_" in list(resources.keys())[0], resources
assert "CPU_group_0_" not in list(resources.keys())[0], resources
# Now retry with a bundle index constraint.
o1 = f.options(
placement_group_id=g1, placement_group_bundle_index=0).remote()
resources = ray.get(o1)
assert len(resources) == 2, resources
keys = list(resources.keys())
assert "CPU_group_" in keys[0], resources
assert "CPU_group_" in keys[1], resources
assert "CPU_group_0_" in keys[0] or "CPU_group_0_" in keys[1], resources
def test_placement_group_hang(ray_start_cluster):
+3 -2
View File
@@ -1774,7 +1774,7 @@ def make_decorator(num_return_vals=None,
max_task_retries=None,
worker=None,
placement_group_id=None,
placement_group_bundle_index=0):
placement_group_bundle_index=-1):
def decorator(function_or_class):
if (inspect.isfunction(function_or_class)
or is_cython(function_or_class)):
@@ -1864,7 +1864,8 @@ def remote(*args, **kwargs):
* **placement_group_id**: the placement group this task belongs to,
or None if it doesn't belong to any group.
* **placement_group_bundle_index**: the index of the bundle
if the task belongs to a placement group.
if the task belongs to a placement group, which may be -1 to indicate
any available bundle.
This can be done as follows: