Modal
Executing individual steps in Modal.
Modal is a platform for running cloud infrastructure. It offers specialized compute instances to run your code and has a fast execution time, especially around building Docker images and provisioning hardware. ZenML's Modal step operator allows you to submit individual steps to be run on Modal compute instances.
When to use it
You should use the Modal step operator if:
You need fast execution time for steps that require computing resources (CPU, GPU, memory).
You want to easily specify the exact hardware requirements (e.g., GPU type, CPU count, memory) for each step.
You have access to Modal.
How to deploy it
To use the Modal step operator:
Sign up for a Modal account if you haven't already.
Install the Modal CLI by running
pip install modal(orzenml integration install modal) and authenticate by runningmodal setupin your terminal.
How to use it
To use the Modal step operator, we need:
The ZenML
modalintegration installed. If you haven't done so, runzenml integration install modalDocker installed and running.
A cloud artifact store as part of your stack. This is needed so that both your orchestration environment and Modal can read and write step artifacts. Any cloud artifact store supported by ZenML will work with Modal.
A cloud container registry as part of your stack. Any cloud container registry supported by ZenML will work with Modal.
An Image Builder in your stack. ZenML uses it to build the Docker image that runs on Modal.
The Modal step operator can use Modal authentication settings from the stack component configuration. If token_id and token_secret are configured on the step operator, ZenML creates an explicit Modal SDK client from those credentials and passes that client to Modal SDK calls. If these fields are not configured, ZenML passes no explicit client and Modal uses its normal authentication behavior, such as existing environment variables or ~/.modal.toml.
ZenML step runtime environment variables, including values needed by the step to connect back to the ZenML server, are passed to the Modal sandbox when the step starts. They are not added to the Modal image definition. Modal authentication settings used to submit the sandbox, the Modal environment used for app lookup, and container registry credentials used to pull the image are handled separately.
We can then register the step operator:
Once you added the step operator to your active stack, you can use it to execute individual steps of your pipeline by specifying it in the @step decorator as follows:
Modal requires images imported from a registry to be built for linux/amd64. If you build locally on Apple Silicon, Docker may produce an arm64 image by default, which Modal will reject during image import. Configure your Docker settings to build for linux/amd64, and prevent build reuse once while replacing any previously built arm64 image:
If Docker still fails locally with a platform error while building a multi-stage image, make sure the local image builder uses the Docker CLI/BuildKit path instead of the Docker Python SDK path:
You can remove prevent_build_reuse=True again after ZenML has built and pushed a fresh linux/amd64 image.
Additional configuration
You can specify the hardware requirements for each step using the ResourceSettings class as described in our documentation on resource settings:
Important:
If you request GPUs with
ResourceSettings.gpu_count > 0, you must also specify a GPU type viaModalStepOperatorSettings.gpu; otherwise the run will fail with a validation error.If a GPU type is set but
gpu_count == 0, ZenML treats the step as CPU-only and logs a warning that the GPU type is ignored.If
gpu_countis omitted and a GPU type is set, Modal uses one GPU of that type.cpu_countis passed through fromResourceSettingsto Modal.memorymust be a string such as"32GB","32768MB", or"32GiB". ZenML converts it to decimal megabytes (MB) and rounds fractional MB values up before passing it to Modal.If the active container registry exposes credentials, ZenML passes them to Modal for image pulls. If no registry credentials are configured, Modal attempts to pull the image anonymously.
This will run my_modal_step on a Modal instance with 1 A100 GPU, 2 CPUs, and 32GB of CPU memory.
Check out the Modal docs for the full list of supported GPU types and the SDK docs for more details on the available settings.
The settings allow you to specify the Modal environment, region, and cloud provider. modal_environment selects the Modal environment used for the app lookup; ZenML passes it as environment_name to modal.App.lookup(...). The sandbox then belongs to that app, while ZenML step runtime environment variables are still passed separately to the sandbox runtime with env=.... Region and cloud provider settings are only available for Modal Enterprise and Team plan customers. Certain combinations of settings are not available. It is suggested to err on the side of looser settings rather than more restrictive ones to avoid pipeline execution failures. In the case of failures, however, Modal provides detailed error messages that can help identify what is incompatible. See more in the Modal docs on region selection for more details.
Last updated
Was this helpful?