Released July 27, 2023. Link to PyPI.

Features

beam run

We are introducing a new primitive called beam run.

beam run is used to run one-off functions remotely, without having to deploy an API.

For example, let’s say you wanted to run some code on Beam, but you don’t want to run it in a dev session. And you don’t want to deploy it as an API. You just want to run it once, remotely, on the cloud.

You can accomplish this by adding a decorator to your function. Here’s what that will look like:

from beam import App, Runtime, Image, Output, Volume

app = App(
    name="vocalize",
    runtime=Runtime(
        cpu=1,
        gpu="A10G",
        image=Image(python_version="python3.8", python_packages=["torch"], commands=["apt-get install ffmpeg"]),
    ),
    volumes=[Volume(name="my_models", path="models")],
)

@app.run(outputs=[Output(path="audio_file.wav")])
def transcribe():
    return

You can run this code remotely on Beam by running:

beam run my_file.py:transcribe

Now, transcribe() will be executed on Beam remotely. Logs will be streamed to your terminal, and you can also view logs, outputs, and task status in the dashboard. beam run also support the use of Outputs and Volumes.

Interface Changes

Triggers

Triggers are now decorators on functions. This supports the new syntax for beam run, and it also makes it easy to switch between Runs, REST APIs, and Task Queues very easily.

Old interface

import beam

app = beam.App(...)
app.Trigger.RestAPI(...)

New interface

from beam import App, Runtime

your_app = App(name="your_app", runtime=Runtime())

@your_app.rest_api()
def handler():
    return

Volumes

Volumes are mounted directly to apps. This allows you to reuse app definitions across your different projects.

Old interface

import beam

app = beam.App(...)
app.Mount.SharedVolume(...)

New interface

from beam import App, Volume

App(
    name="my-app",
    volumes=[
        Volume(name="files", path="./files"),
        Volume(name="images", path="./images"),
    ],
)

Outputs

Outputs are now added directly to triggers. We’re doing this for composability and ease-of-use. It is easier to add an output directly to a trigger, instead of having a separate method outside the trigger.

Old interface

import beam

app = beam.App(...)
app.Output.File(...)

New interface

from beam import App, Runtime, Output

your_app = App(name="your_app", runtime=Runtime())
@your_app.task_queue(outputs=[Output(path='./test.txt')])

Other Changes

  • We’ve removed beam.Types from deployment triggers.
  • Outputs will automatically infer the file type. You no longer need to specify whether the output is a file or a dir.
  • You can use the /task API to query the status of any job running on Beam. Previously, one could only query the status of async jobs.
  • Webhook has been renamed to task_queue.

We’ve noticed that loaders are not currently supported in beam run. This will be fixed in a future SDK update.