Skip to content

Commit cb438e5

Browse files
autoscaler fix
Signed-off-by: Jonathan Nitisastro <[email protected]>
1 parent 31cf724 commit cb438e5

File tree

9 files changed

+68
-19
lines changed

9 files changed

+68
-19
lines changed

python/ray/autoscaler/_private/fake_multi_node/node_provider.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -316,7 +316,7 @@ def create_node_with_resources_and_labels(
316316
num_cpus=resources.pop("CPU", 0),
317317
num_gpus=resources.pop("GPU", 0),
318318
object_store_memory=resources.pop("object_store_memory", None),
319-
_gpu_memory=resources.pop("gpu_memory", 0),
319+
_gpu_memory=resources.pop("gpu_memory", 0), # gpu memory = 600,
320320
resources=resources,
321321
labels=labels,
322322
redis_address="{}:6379".format(

python/ray/autoscaler/_private/resource_demand_scheduler.py

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -545,7 +545,12 @@ def add_node(node_type, available_resources=None):
545545
if TAG_RAY_USER_NODE_TYPE in tags:
546546
node_type = tags[TAG_RAY_USER_NODE_TYPE]
547547
ip = self.provider.internal_ip(node_id)
548-
available_resources = unused_resources_by_ip.get(ip)
548+
available_resources = copy.deepcopy(unused_resources_by_ip.get(ip))
549+
available = self.node_types[node_type]["resources"]
550+
if available_resources and "node:gpu_memory_per_gpu" in available:
551+
available_resources["node:gpu_memory_per_gpu"] = available[
552+
"node:gpu_memory_per_gpu"
553+
]
549554
add_node(node_type, available_resources)
550555

551556
for node_type, count in pending_nodes.items():

python/ray/tests/test_autoscaler_fake_multinode.py

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,7 @@ def test_fake_autoscaler_basic_e2e(shutdown_only):
2525
"CPU": 2,
2626
"GPU": 1,
2727
"object_store_memory": 1024 * 1024 * 1024,
28+
"gpu_memory": 1000,
2829
},
2930
"node_config": {},
3031
"min_workers": 0,
@@ -52,6 +53,11 @@ def test_fake_autoscaler_basic_e2e(shutdown_only):
5253
def f():
5354
print("gpu ok")
5455

56+
# Triggers the addition of a GPU memory node.
57+
@ray.remote(_gpu_memory=1000)
58+
def f2():
59+
print("gpu memory ok")
60+
5561
# Triggers the addition of a CPU node.
5662
@ray.remote(num_cpus=3)
5763
def g():

src/ray/common/scheduling/cluster_resource_data.cc

Lines changed: 31 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,27 @@
2020
namespace ray {
2121
using namespace ::ray::scheduling;
2222

23+
NodeResources::NodeResources(const NodeResourceSet &resources) {
24+
NodeResourceSet resources_adjusted = resources;
25+
absl::flat_hash_map<std::string, std::string> node_labels;
26+
if (resources.Has(ResourceID::GPU_Memory())) {
27+
// if gpu_memory is set, default GPU value is 1
28+
if (!resources.Has(ResourceID::GPU())) {
29+
resources_adjusted.Set(ResourceID::GPU(), 1);
30+
}
31+
node_labels["_gpu_memory_per_gpu"] =
32+
std::to_string(resources.Get(ResourceID::GPU_Memory()).Double() /
33+
resources_adjusted.Get(ResourceID::GPU()).Double());
34+
resources_adjusted.Set(ResourceID::GPU_Memory(), 0);
35+
} else {
36+
node_labels["_gpu_memory_per_gpu"] = "0";
37+
}
38+
39+
this->total = resources_adjusted;
40+
this->available = resources_adjusted;
41+
this->labels = node_labels;
42+
}
43+
2344
/// Convert a map of resources to a ResourceRequest data structure.
2445
ResourceRequest ResourceMapToResourceRequest(
2546
const absl::flat_hash_map<std::string, double> &resource_map,
@@ -59,8 +80,12 @@ NodeResources ResourceMapToNodeResources(
5980
auto node_labels_copy = node_labels;
6081

6182
if (resource_map_total.find("gpu_memory") != resource_map_total.end()) {
83+
// if gpu_memory is set, default GPU value is 1
84+
if (resource_map_total.find("GPU") == resource_map_total.end()) {
85+
resource_map_total_copy["GPU"] = 1;
86+
}
6287
node_labels_copy["_gpu_memory_per_gpu"] = std::to_string(
63-
resource_map_total.at("gpu_memory") / resource_map_total.at("GPU"));
88+
resource_map_total.at("gpu_memory") / resource_map_total_copy.at("GPU"));
6489
resource_map_total_copy.erase("gpu_memory");
6590
resource_map_available_copy.erase("gpu_memory");
6691
} else {
@@ -108,6 +133,7 @@ bool NodeResources::IsAvailable(const ResourceRequest &resource_request,
108133
}
109134
const ResourceSet resource_request_adjusted =
110135
this->ConvertRelativeResources(resource_request.GetResourceSet());
136+
111137
if (!this->normal_task_resources.IsEmpty()) {
112138
auto available_resources = this->available;
113139
available_resources -= this->normal_task_resources;
@@ -159,6 +185,8 @@ const ResourceSet NodeResources::ConvertRelativeResources(
159185
num_gpus_request =
160186
(resource.Get(ResourceID::GPU_Memory()).Double() / total_gpu_memory_per_gpu) +
161187
1 / static_cast<double>(2 * kResourceUnitScaling);
188+
} else {
189+
return resource;
162190
}
163191
adjusted_resource.Set(ResourceID::GPU(), num_gpus_request);
164192
adjusted_resource.Set(ResourceID::GPU_Memory(), 0);
@@ -208,6 +236,8 @@ const ResourceSet NodeResourceInstances::ConvertRelativeResources(
208236
num_gpus_request =
209237
(resource.Get(ResourceID::GPU_Memory()).Double() / total_gpu_memory_per_gpu) +
210238
1 / static_cast<double>(2 * kResourceUnitScaling);
239+
} else {
240+
return resource;
211241
}
212242
adjusted_resource.Set(ResourceID::GPU(), num_gpus_request);
213243
adjusted_resource.Set(ResourceID::GPU_Memory(), 0);

src/ray/common/scheduling/cluster_resource_data.h

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -289,8 +289,8 @@ class TaskResourceInstances {
289289
class NodeResources {
290290
public:
291291
NodeResources() {}
292-
NodeResources(const NodeResourceSet &resources)
293-
: total(resources), available(resources) {}
292+
NodeResources(const NodeResourceSet &resources);
293+
294294
NodeResourceSet total;
295295
NodeResourceSet available;
296296
/// Only used by light resource report.

src/ray/raylet/scheduling/cluster_resource_manager.cc

Lines changed: 10 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -88,6 +88,7 @@ bool ClusterResourceManager::UpdateNode(
8888

8989
local_view.total = node_resources.total;
9090
local_view.available = node_resources.available;
91+
// might need label transfer here
9192
local_view.object_pulls_queued = resource_view_sync_message.object_pulls_queued();
9293

9394
// Update the idle duration for the node in terms of resources usage.
@@ -187,10 +188,10 @@ bool ClusterResourceManager::SubtractNodeAvailableResources(
187188
}
188189

189190
NodeResources *resources = it->second.GetMutableLocalView();
190-
const ResourceSet adjusted_resource_request =
191+
const ResourceSet resource_request_adjusted =
191192
resources->ConvertRelativeResources(resource_request.GetResourceSet());
192193

193-
resources->available -= adjusted_resource_request;
194+
resources->available -= resource_request_adjusted;
194195
resources->available.RemoveNegative();
195196

196197
// TODO(swang): We should also subtract object store memory if the task has
@@ -216,10 +217,10 @@ bool ClusterResourceManager::HasSufficientResource(
216217
return false;
217218
}
218219

219-
const ResourceSet adjusted_resource_request =
220+
const ResourceSet resource_request_adjusted =
220221
resources.ConvertRelativeResources(resource_request.GetResourceSet());
221222

222-
return resources.available >= adjusted_resource_request;
223+
return resources.available >= resource_request_adjusted;
223224
}
224225

225226
bool ClusterResourceManager::AddNodeAvailableResources(scheduling::NodeID node_id,
@@ -228,13 +229,15 @@ bool ClusterResourceManager::AddNodeAvailableResources(scheduling::NodeID node_i
228229
if (it == nodes_.end()) {
229230
return false;
230231
}
231-
232232
auto node_resources = it->second.GetMutableLocalView();
233-
for (auto &resource_id : resource_set.ResourceIds()) {
233+
const ResourceSet adjusted_resources =
234+
node_resources->ConvertRelativeResources(resource_set);
235+
236+
for (auto &resource_id : adjusted_resources.ResourceIds()) {
234237
if (node_resources->total.Has(resource_id)) {
235238
auto available = node_resources->available.Get(resource_id);
236239
auto total = node_resources->total.Get(resource_id);
237-
auto new_available = available + resource_set.Get(resource_id);
240+
auto new_available = available + adjusted_resources.Get(resource_id);
238241
if (new_available > total) {
239242
new_available = total;
240243
}

src/ray/raylet/scheduling/local_resource_manager.cc

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -80,17 +80,18 @@ bool LocalResourceManager::AllocateTaskResourceInstances(
8080
const ResourceRequest &resource_request,
8181
std::shared_ptr<TaskResourceInstances> task_allocation) {
8282
RAY_CHECK(task_allocation != nullptr);
83-
const ResourceSet adjusted_resource_request =
83+
const ResourceSet resource_request_adjusted =
8484
local_resources_.ConvertRelativeResources(resource_request.GetResourceSet());
85+
8586
if (resource_request.GetResourceSet().Has(ResourceID::GPU_Memory()) &&
86-
adjusted_resource_request.Get(ResourceID::GPU()) > 1) {
87+
resource_request_adjusted.Get(ResourceID::GPU()) > 1) {
8788
return false;
8889
}
8990
// add adjust_gpu_memory here, added to NodeInstanceResourceSet
90-
auto allocation = local_resources_.available.TryAllocate(adjusted_resource_request);
91+
auto allocation = local_resources_.available.TryAllocate(resource_request_adjusted);
9192
if (allocation) {
9293
*task_allocation = TaskResourceInstances(*allocation);
93-
for (const auto &resource_id : adjusted_resource_request.ResourceIds()) {
94+
for (const auto &resource_id : resource_request_adjusted.ResourceIds()) {
9495
SetResourceNonIdle(resource_id);
9596
}
9697
return true;

src/ray/raylet/scheduling/policy/scorer.cc

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -35,8 +35,11 @@ double LeastResourceScorer::Score(const ResourceRequest &required_resources,
3535
}
3636

3737
double node_score = 0.;
38-
for (auto &resource_id : required_resources.ResourceIds()) {
39-
const auto &request_resource = required_resources.Get(resource_id);
38+
const ResourceSet resource_request_adjusted =
39+
node_resources_ptr->ConvertRelativeResources(required_resources.GetResourceSet());
40+
41+
for (auto &resource_id : resource_request_adjusted.ResourceIds()) {
42+
const auto &request_resource = resource_request_adjusted.Get(resource_id);
4043
const auto &node_available_resource = node_resources_ptr->available.Get(resource_id);
4144
auto score = Calculate(request_resource, node_available_resource);
4245
if (score < 0.) {

src/ray/raylet/scheduling/scheduling_policy.cc

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,8 @@ namespace raylet_scheduling_policy {
2424
namespace {
2525

2626
bool IsGPURequest(const ResourceRequest &resource_request) {
27-
return resource_request.Has(ResourceID::GPU());
27+
return resource_request.Has(ResourceID::GPU()) ||
28+
resource_request.Has(ResourceID::GPU_Memory());
2829
}
2930

3031
bool DoesNodeHaveGPUs(const NodeResources &resources) {

0 commit comments

Comments
 (0)