Skip to content

Commit e8071ef

Browse files
Use latest AMI for cluster (#180)
1 parent 15ba7e6 commit e8071ef

File tree

3 files changed

+30
-3
lines changed

3 files changed

+30
-3
lines changed

src/autogluon/cloud/cluster/ray_aws_cluster_config_generator.py

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
import os
22
from typing import Any, Dict, List, Optional, Union
33

4+
from ..utils.aws_utils import get_latest_amazon_linux_ami
45
from ..utils.utils import get_utc_timestamp_now
56
from .cluster_config_generator import DEFAULT_CONFIG_LOCATION
67
from .constants import (
@@ -36,6 +37,7 @@ def __init__(
3637
config: Optional[Union[str, Dict[str, Any]]] = None,
3738
cluster_name: Optional[str] = None,
3839
region: str = "us-east-1",
40+
use_latest_ami: bool = True,
3941
**kwargs,
4042
) -> None:
4143
"""
@@ -57,6 +59,13 @@ def __init__(
5759
self._update_cluster_name(cluster_name)
5860
self._update_region(region)
5961

62+
if use_latest_ami:
63+
try:
64+
latest_ami = get_latest_amazon_linux_ami()
65+
self._update_ami(latest_ami)
66+
except Exception as e:
67+
print(f"Warning: Could not fetch latest Amazon Linux AMI : {e}")
68+
6069
def _update_config(
6170
self,
6271
instance_type: Optional[str] = None,

src/autogluon/cloud/utils/aws_utils.py

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,21 @@
55
from botocore.config import Config
66

77

8+
def get_latest_amazon_linux_ami(region="us-east-1", version="al2023"):
9+
ec2_client = boto3.client("ec2", region_name=region)
10+
filters = [
11+
{"Name": "owner-alias", "Values": ["amazon"]},
12+
{"Name": "name", "Values": [f"{version}-ami-*"]}, # Amazon Linux 2 or AL2023
13+
{"Name": "state", "Values": ["available"]},
14+
]
15+
response = ec2_client.describe_images(Filters=filters, Owners=["amazon"])
16+
if not response["Images"]:
17+
raise ValueError("No Amazon Linux AMI found!")
18+
19+
latest_ami = sorted(response["Images"], key=lambda x: x["CreationDate"], reverse=True)[0]
20+
return latest_ami["ImageId"]
21+
22+
823
def setup_sagemaker_session(
924
config: Optional[Config] = None,
1025
connect_timeout: int = 60,

tests/unittests/cluster/test_cluster_config_generator.py

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@
2424
SSH_PRIVATE_KEY,
2525
VOLUME_SIZE,
2626
)
27+
from autogluon.cloud.utils.aws_utils import get_latest_amazon_linux_ami
2728

2829

2930
def _create_config_file(config):
@@ -47,10 +48,12 @@ def test_generate_config(config_generator, config):
4748

4849
@pytest.mark.parametrize("config", [None, {"foo": "bar"}, "dummy.yaml"])
4950
def test_update_ray_aws_cluster_config(config):
51+
latest_ami = get_latest_amazon_linux_ami()
52+
5053
with tempfile.TemporaryDirectory() as temp_dir:
5154
os.chdir(temp_dir)
5255
_create_config_file(config)
53-
config_generator = RayAWSClusterConfigGenerator(config)
56+
config_generator = RayAWSClusterConfigGenerator(config, use_latest_ami=False)
5457
# Test update
5558
dummy_config = {"cluster_name": "foo"}
5659
config_generator.update_config(dummy_config)
@@ -60,7 +63,7 @@ def test_update_ray_aws_cluster_config(config):
6063
instance_type="foo",
6164
instance_count=2,
6265
volumes_size=2,
63-
ami="dummy_ami",
66+
ami=latest_ami,
6467
custom_image_uri="bar",
6568
ssh_key_path="dummy.pem",
6669
initialization_commands=["abc"],
@@ -72,7 +75,7 @@ def test_update_ray_aws_cluster_config(config):
7275
assert node_config[BLOCK_DEVICE_MAPPINGS][0][EBS][VOLUME_SIZE] == 2
7376
assert config_generator.config[DOCKER][IMAGE] == "bar"
7477
assert config_generator.config[AUTH][SSH_PRIVATE_KEY] == os.path.abspath("dummy.pem")
75-
assert node_config[IMAGE_ID] == "dummy_ami"
78+
assert node_config[IMAGE_ID] == latest_ami
7679
assert node_config[KEY_NAME] == "dummy"
7780
assert config_generator.config[INITIALIZATION_COMMANDS] == ["abc"]
7881
config = config_generator.config

0 commit comments

Comments
 (0)