Using Chapel on Amazon Web Services¶
This page contains Amazon Web Services (AWS) Elastic Cloud Compute (EC2) virtual machine setup details specific to Chapel. For more general instance configuration information, refer to the AWS documentation on launching a linux virtual machine.
Before getting started, you will need an AWS account, which can be created here: https://aws.amazon.com/
Launching an EC2 instance configured for Chapel¶
From the EC2 console, do the following:
- Begin launching an instance by clicking the Launch Instance button.
- Choose an Amazon Machine Image (AMI) in the Choose AMI step.
- AMI must use a base OS that supports the Chapel Prerequisites, i.e. includes a unix-like environment.
- For multilocale support, create or select a security group configured to permit incoming TCP/UDP traffic in the Configure Security Group step.
- Review and launch the instance.
- Create or select a private key.
- If creating the key, you will need to download the
.pem
identity file. This will be used in the next step to access the instance.
- If creating the key, you will need to download the
- Access the launched instance via ssh using the private key chosen before.
- Summarizing the AWS documentation linked above, you can ssh into the
instance using the
.pem
identity file downloaded in the previous step with the following command:ssh -i /path/to/key.pem username@hostname
- Summarizing the AWS documentation linked above, you can ssh into the
instance using the
Building Chapel on an EC2 instance¶
Once connected to the instance via ssh, do the following:
- Install the dependencies as shown on the Installation page.
- Download a Chapel release from the Download page.
- Build the Chapel release as shown on the Building Chapel page.
- Build with
CHPL_COMM=gasnet
if you plan to run multilocale programs
- Build with
Running multilocale Chapel programs¶
For more in-depth information about GASNet or multilocale execution with Chapel, refer to the GASNet documentation and Multilocale Chapel Execution page, respectively.
On a single instance¶
1. Compile the program
Compile the program with CHPL_COMM=gasnet
.
2. Set up GASNet environment variables
Set the following GASNet environment variable:
# Job spawn mechanism, where 'L' means localhost spawn
GASNET_SPAWNFN='L'
3. Run the program
Run the program as you would any other multilocale program:
./hello -nl 2
Over multiple instances¶
To run a program across multiple EC2 instances, do the following:
1. Enable password-less ssh between machines
This can be done by using the existing identity file (the .pem
) , or by
using another authentication method, such as RSA ssh keys.
If using the identity file, copy the identity file onto each instance
into the same path, such as ~/.ssh/foo.pem
. By default, using this file
requires passing the identity flag and the file path to ssh:
ssh -i ~/.ssh/foo.pem ec2-11-222-33-444.us-west-2.compute.amazonaws.com
This can be made the default behavior by adding this rule to a new or existing
~/.ssh/config
:
Hostname *compute.amazonaws.com
IdentityFile ~/.ssh/foo.pem
Copy this config file into ~/.ssh/config
on every EC2 instance as well.
You should now be able to ssh freely between the EC2 instances.
Tip
The option StrictHostKeyChecking no
can be appended to the new
.ssh/config
rule to override the trusted host prompt when first
connecting to each machine. This can be convenient when deploying a large
number of instances, but is only recommended if you understand the security
implications of the change.
2. Compile and distribute the binary
Compile the program with CHPL_COMM=gasnet
set, and copy the compiled
binary onto all of the EC2 instances, under the same path. For example:
export CHPL_COMM=gasnet
cd ~/chapel-projects
chpl hello.chpl -o hello
scp hello ec2-11-222-33-444.us-west-2.compute.amazonaws.com:chapel-projects/hello
scp hello ec2-11-222-33-445.us-west-2.compute.amazonaws.com:chapel-projects/hello
3. Set up GASNet environment variables
There are several configuration options available for GASNet, which can be found in the GASNet documentation. The essential configurations, with examples, are as follows:
# Space-delimited list of server names
GASNET_SSH_SERVERS='ec2-11-222-33-444.us-west-2.compute.amazonaws.com ec2-11-222-33-445.us-west-2.compute.amazonaws.com'
# Job spawn mechanism, where 'S' means ssh/rsh-based spawn
GASNET_SPAWNFN='S'
Some other common optional configurations are:
# Defaults to current working directory
GASNET_REMOTE_PATH='~/chapel-projects/'
# Defaults to gethostname() of the launching node
CHPL_RT_MASTERIP='ec2-11-222-33-444.us-west-2.compute.amazonaws.com'
# Defaults to empty, can be used instead of copying config files onto each machine
SSH_OPTIONS='-i ~/.ssh/foo.pem'
See CHPL_RT_MASTERIP for details on that environment variable.
4. Run the program
Run the program as you would any other multilocale program:
./hello -nl 2
Note
GASNet is not configured to oversubscribe locales by default. That is, the
number of locales (-nl
) provided cannot exceed the number of servers in
GASNET_SSH_SERVERS
. If you wish to oversubscribe nodes, you can include
servers in GASNET_SSH_SERVERS
multiple times, to reach the desired number
of locales.
Frequently Asked Questions¶
How do I resolve the following error:
virtual memory exhausted: Cannot allocate memory
This is a common error on systems with limited memory resources, such as the free tier of EC2 instances. If you do not wish to launch an instance with more memory resources, you can create a swap file or swap partition.
This can be done on Linux distributions with the following steps:
# Log in as root
sudo -s
# Create a 512MB swap file (1024 * 512MB = 524288 block size)
dd if=/dev/zero of=/swapfile1 bs=1024 count=524288
# Secure swap file
chown root:root /swapfile1
chmod 0600 /swapfile1
# Set up linux swap file
mkswap /swapfile1
# Enable swap file
swapon /swapfile1
Then edit /etc/fstab
to include:
/swapfile1 none swap sw 0 0
Enable the new swapfile without rebooting:
swapoff -a
swapon -a
Confirm the swapfile is working:
free -m
How can I run the testing suite in parallel over EC2 instances?
This is a planned addition to the paratest (parallel test) functionality, but is not yet officially supported.