1. EC2 Spot Instances for Cost-Effective AI Experimentation


    When working with AI experimentation, managing compute costs is crucial, especially when training models that require significant processing power. One cost-effective solution on AWS is to utilize EC2 Spot Instances. Spot Instances allow you to take advantage of unused EC2 capacity at a discount compared to On-Demand prices. Spot Instances can be interrupted by AWS with two minutes of notification if AWS needs the capacity back, which makes them suitable for fault-tolerant applications like batch processing, background processing, or non-critical services.

    In Pulumi, you can manage EC2 Spot Instances using the aws.ec2.SpotInstanceRequest resource. This resource allows you to request Spot Instances by specifying instance properties such as the AMI, instance type, spot price, and others.

    Below is an example Pulumi program that sets up an EC2 Spot Instance Request. It includes comments explaining each part of the code. After the Pulumi program, I'll provide a brief explanation about what each Pulumi resource does.

    import pulumi import pulumi_aws as aws # Specify the ID of the Amazon Machine Image (AMI) you wish to use for your EC2 Spot Instance. # The AMI ID varies by region, so ensure that you are using the correct AMI ID for the region you're deploying to. ami_id = "ami-0c55b159cbfafe1f0" # Optionally, you can define your Spot price (the maximum price you are willing to pay per instance hour). # If not specified, AWS will use the current Spot price. If your bid is lower than the Spot price, you won't receive an instance. # Be aware that setting this value too low could mean that your instance may never start if the spot price never falls to your bid. spot_price = "0.03" # Specify the instance type for your EC2 Spot Instance. This determines the CPU, memory, storage, and networking capacity of the instance. # Choose an instance type that fits the requirements of your AI workload. instance_type = "t3.medium" # Optionally, you can define a key name if you've already set up an EC2 Key Pair for secure SSH access to your instance. key_name = "my-ec2-keypair" # Create a Security Group to allow SSH access to the instance. sec_group = aws.ec2.SecurityGroup('sec-group', description='Allow SSH access', ingress=[ {'protocol': 'tcp', 'from_port': 22, 'to_port': 22, 'cidr_blocks': ['']} ]) # Create the Spot Instance Request. AWS will try to fulfill this request whenever the cost is below your spot price. spot_instance_request = aws.ec2.SpotInstanceRequest('spot-instance-request', spot_price=spot_price, instance_type=instance_type, ami=ami_id, key_name=key_name, security_groups=[sec_group.name], valid_until=pulumi.Output.concat( # This creates a timestamp 1 hour into the future; requests are cancelled after this time if not fulfilled. pulumi.Output.from_input(spot_price).apply( lambda spot_price: (datetime.datetime.now() + datetime.timedelta(hours=1)).strftime('%Y-%m-%dT%H:%M:%SZ') ) )) # Export the public DNS name of the Spot Instance pulumi.export('public_dns', spot_instance_request.public_dns)

    Explanation of the Pulumi resources:

    • ami_id: This is the Amazon Machine Image ID that your EC2 instance will be based on. Choosing the right AMI is crucial, as it defines the OS and software that will be pre-installed on your instance.

    • spot_price: This is the maximum price you are willing to pay per instance hour. Your Spot Instance will only run when the market price is below this value.

    • instance_type: This defines the hardware specifications of your EC2 instance. Choose the type that best matches the compute, memory, and storage needs of your AI workload.

    • key_name: This refers to the name of an EC2 key pair you've created. The key pair is necessary if you want to connect to your instance securely using SSH.

    • SecurityGroup: This resource sets up a security group that defines firewall rules for your instances. In the provided example, it allows inbound SSH (port 22) traffic from any IP address.

    • SpotInstanceRequest: This is the main resource for requesting spot instances. It specifies the configuration for the instances you're requesting, including the AMI, instance type, security groups, and the bid price.

    • public_dns: This output exports the public DNS of your spot instance, which you can use to access the instance.

    With Pulumi, you can define your infrastructure as code, enabling you to provision, update, and manage your AWS resources with ease. This setup can be further enhanced by automating your AI workloads to start and stop based on the availability of Spot Instances, hence maintaining cost-effectiveness while conducting AI experimentation on AWS.