Skip to content

Commit ac41ff7

Browse files
authored
Introduce defaults for workflow resources (#228)
* Introduce defaults for workflow resources * Support t2.small aws instances with 1 cpu
1 parent 0820033 commit ac41ff7

File tree

3 files changed

+72
-90
lines changed

3 files changed

+72
-90
lines changed

cli/dstack/backend/aws/runners.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -34,7 +34,7 @@ def _get_instance_types(ec2_client: BaseClient) -> List[InstanceType]:
3434
Filters=[
3535
{
3636
"Name": "instance-type",
37-
"Values": ["c5.*", "m5.*", "p2.*", "p3.*", "p4d.*", "p4de.*"],
37+
"Values": ["t2.small", "c5.*", "m5.*", "p2.*", "p3.*", "p4d.*", "p4de.*"],
3838
},
3939
],
4040
**kwargs,

cli/dstack/backend/gcp/compute.py

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -162,7 +162,6 @@ def _get_nongpu_instance_type(
162162
zone=zone,
163163
machine_families=machine_families,
164164
)
165-
instance_types = [it for it in instance_types if it.instance_name not in ["e2-highcpu-2"]]
166165
return choose_instance_type(instance_types, requirements)
167166

168167

cli/dstack/providers/__init__.py

Lines changed: 71 additions & 88 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,9 @@
2222
from dstack.core.repo import RepoAddress, RepoData
2323
from dstack.utils.common import _quoted
2424

25+
DEFAULT_CPU = 2
26+
DEFAULT_MEM = "8GB"
27+
2528

2629
def _str_to_mib(s: str) -> int:
2730
ns = s.replace(" ", "").lower()
@@ -187,43 +190,34 @@ def _parse_base_args(self, args: Namespace, unknown_args):
187190
env = self.provider_data.get("env") or []
188191
env.extend(args.env)
189192
self.provider_data["env"] = env
190-
if (
191-
args.cpu
192-
or args.memory
193-
or args.gpu
194-
or args.gpu_name
195-
or args.gpu_memory
196-
or args.shm_size
197-
or args.interruptible
198-
or args.local
199-
):
200-
resources = self.provider_data.get("resources") or {}
201-
self.provider_data["resources"] = resources
202-
if args.cpu:
203-
resources["cpu"] = args.cpu
204-
if args.memory:
205-
resources["memory"] = args.memory
206-
if args.gpu or args.gpu_name or args.gpu_memory:
207-
gpu = (
208-
self.provider_data["resources"].get("gpu") or {}
209-
if self.provider_data.get("resources")
210-
else {}
211-
)
212-
if type(gpu) is int:
213-
gpu = {"count": gpu}
214-
resources["gpu"] = gpu
215-
if args.gpu:
216-
gpu["count"] = args.gpu
217-
if args.gpu_memory:
218-
gpu["memory"] = args.gpu_memory
219-
if args.gpu_name:
220-
gpu["name"] = args.gpu_name
221-
if args.shm_size:
222-
resources["shm_size"] = args.shm_size
223-
if args.interruptible:
224-
resources["interruptible"] = True
225-
if args.local:
226-
resources["local"] = True
193+
194+
resources = self.provider_data.get("resources") or {}
195+
self.provider_data["resources"] = resources
196+
if args.cpu:
197+
resources["cpu"] = args.cpu
198+
if args.memory:
199+
resources["memory"] = args.memory
200+
if args.gpu or args.gpu_name or args.gpu_memory:
201+
gpu = (
202+
self.provider_data["resources"].get("gpu") or {}
203+
if self.provider_data.get("resources")
204+
else {}
205+
)
206+
if type(gpu) is int:
207+
gpu = {"count": gpu}
208+
resources["gpu"] = gpu
209+
if args.gpu:
210+
gpu["count"] = args.gpu
211+
if args.gpu_memory:
212+
gpu["memory"] = args.gpu_memory
213+
if args.gpu_name:
214+
gpu["name"] = args.gpu_name
215+
if args.shm_size:
216+
resources["shm_size"] = args.shm_size
217+
if args.interruptible:
218+
resources["interruptible"] = True
219+
if args.local:
220+
resources["local"] = True
227221
if unknown_args:
228222
self.provider_data["run_args"] = unknown_args
229223

@@ -393,58 +387,47 @@ def _get_list_data(self, name: str) -> Optional[List[str]]:
393387
else:
394388
return v
395389

396-
def _resources(self) -> Optional[Requirements]:
397-
if self.provider_data.get("resources"):
398-
resources = Requirements()
399-
if self.provider_data["resources"].get("cpu"):
400-
if not str(self.provider_data["resources"]["cpu"]).isnumeric():
401-
sys.exit("resources.cpu should be an integer")
402-
cpu = int(self.provider_data["resources"]["cpu"])
403-
if cpu > 0:
404-
resources.cpus = cpu
405-
if self.provider_data["resources"].get("memory"):
406-
resources.memory_mib = _str_to_mib(self.provider_data["resources"]["memory"])
407-
gpu = self.provider_data["resources"].get("gpu")
408-
if gpu:
409-
if str(gpu).isnumeric():
410-
gpu = int(self.provider_data["resources"]["gpu"])
411-
if gpu > 0:
412-
resources.gpus = GpusRequirements(count=gpu)
413-
else:
414-
gpu_count = 0
415-
gpu_name = None
416-
if str(gpu.get("count")).isnumeric():
417-
gpu_count = int(gpu.get("count"))
418-
if gpu.get("name"):
419-
gpu_name = gpu.get("name")
420-
if not gpu_count:
421-
gpu_count = 1
422-
if gpu_count:
423-
resources.gpus = GpusRequirements(count=gpu_count, name=gpu_name)
424-
for resource_name in self.provider_data["resources"]:
425-
if resource_name.endswith("/gpu") and len(resource_name) > 4:
426-
if not str(self.provider_data["resources"][resource_name]).isnumeric():
427-
sys.exit(f"resources.'{resource_name}' should be an integer")
428-
gpu = int(self.provider_data["resources"][resource_name])
429-
if gpu > 0:
430-
resources.gpus = GpusRequirements(count=gpu, name=resource_name[:-4])
431-
if self.provider_data["resources"].get("shm_size"):
432-
resources.shm_size_mib = _str_to_mib(self.provider_data["resources"]["shm_size"])
433-
if self.provider_data["resources"].get("interruptible"):
434-
resources.interruptible = self.provider_data["resources"]["interruptible"]
435-
if self.provider_data["resources"].get("local"):
436-
resources.local = self.provider_data["resources"]["local"]
437-
if (
438-
resources.cpus
439-
or resources.memory_mib
440-
or resources.gpus
441-
or resources.shm_size_mib
442-
or resources.interruptible
443-
or resources.local
444-
):
445-
return resources
390+
def _resources(self) -> Requirements:
391+
resources = Requirements()
392+
cpu = self.provider_data["resources"].get("cpu", DEFAULT_CPU)
393+
if not str(cpu).isnumeric():
394+
sys.exit("resources.cpu should be an integer")
395+
cpu = int(cpu)
396+
if cpu > 0:
397+
resources.cpus = cpu
398+
memory = self.provider_data["resources"].get("memory", DEFAULT_MEM)
399+
resources.memory_mib = _str_to_mib(memory)
400+
gpu = self.provider_data["resources"].get("gpu")
401+
if gpu:
402+
if str(gpu).isnumeric():
403+
gpu = int(self.provider_data["resources"]["gpu"])
404+
if gpu > 0:
405+
resources.gpus = GpusRequirements(count=gpu)
446406
else:
447-
return None
407+
gpu_count = 0
408+
gpu_name = None
409+
if str(gpu.get("count")).isnumeric():
410+
gpu_count = int(gpu.get("count"))
411+
if gpu.get("name"):
412+
gpu_name = gpu.get("name")
413+
if not gpu_count:
414+
gpu_count = 1
415+
if gpu_count:
416+
resources.gpus = GpusRequirements(count=gpu_count, name=gpu_name)
417+
for resource_name in self.provider_data["resources"]:
418+
if resource_name.endswith("/gpu") and len(resource_name) > 4:
419+
if not str(self.provider_data["resources"][resource_name]).isnumeric():
420+
sys.exit(f"resources.'{resource_name}' should be an integer")
421+
gpu = int(self.provider_data["resources"][resource_name])
422+
if gpu > 0:
423+
resources.gpus = GpusRequirements(count=gpu, name=resource_name[:-4])
424+
if self.provider_data["resources"].get("shm_size"):
425+
resources.shm_size_mib = _str_to_mib(self.provider_data["resources"]["shm_size"])
426+
if self.provider_data["resources"].get("interruptible"):
427+
resources.interruptible = self.provider_data["resources"]["interruptible"]
428+
if self.provider_data["resources"].get("local"):
429+
resources.local = self.provider_data["resources"]["local"]
430+
return resources
448431

449432
@staticmethod
450433
def _extend_commands_with_env(commands, env):

0 commit comments

Comments
 (0)