Using ARM on Coiled#
Coiled supports ARM (Graviton) instance types on AWS.
We found that for some workloads, ARM is significantly faster and cheaper. We don’t yet know how to predict whether a specific workload will be better on ARM, but we encourage you to try for yourself!
Spinning up an ARM cluster on AWS is almost no different from spinning up a non-ARM cluster. You can use Package Synchronization, coiled.create_software_environment()
, or your own pre-built Docker image. (Note that if using your own Docker image, it does need to be built for Linux/arm64
platform.)
Starting a cluster using package sync#
The easiest method to working with ARM is to create a Cluster
instance as you would normally with Package Synchronization. The only difference is that you specify an ARM instance type for your workers and scheduler.
cluster = coiled.Cluster(
# ARM instance types for scheduler and workers
arm=True,
n_workers=10,
)
That will mirror your local Python environment on the cluster, even if your machine is not a Linux ARM machine.
Note
Package sync and create_software_environment
support for ARM was added in Coiled version 0.6.0.
If you’re using Python 3.8, note that you’ll need python<=3.8.16 because 3.8.16 doesn’t have a build of cpython on conda-forge (which is how we install Python on cluster). Python 3.9 and higher work fine.
Using a custom Docker image#
You can use GitHub Actions to build your own multi-arch (x86 and ARM) Docker image (see this example yaml file).
Locally, you can build multi-arch images like this:
docker buildx build --platform linux/arm64,linux/amd64 \
-t <your-image-name>:latest --push .
You can then upload your local image to wherever you usually store Docker images (e.g. Docker Hub or Amazon ECR) and create a Coiled Python environment using this image (see Docker images for instructions).
Instance types#
When creating a cluster, specifying arm=True
will default to requesting m7g.xlarge (first choice) and t4g.xlarge (second choice) instance types. You can also request specific instance types, however, multi-architecture clusters are not currently supported.
cluster = coiled.Cluster(
# ARM instance types for scheduler and workers
scheduler_vm_types=["t4g.large"],
worker_vm_types=["c7g.xlarge"],
n_workers=10,
)
For common Intel instance types you might be using already, there’s a roughly equivalent ARM instance type you could try instead.
Intel |
ARM |
Description |
---|---|---|
t3 |
t4g |
burstable (best for interactive/non-compute-intensive work) |
m6i |
m7g |
non-burstable balanced compute/memory (sensible default for common workloads) |
c6i |
c7g |
compute-optimized (higher ratio of vCPUs to memory) |
r6i |
r7g |
memory-optimized (higher ratio of memory to vCPUs) |
The *7g
families have Graviton 3 and are slightly more expensive than corresponding *6g
family with older generation ARM processor,
though Graviton 3 is significantly better and is still cheaper (typically by 15%) than corresponding Intel instance type.