SelectCudaDevice

Introduction

The SelectCudaDevice widget in Supervisely is a user interface element that enables users to select CUDA devices available on their agent. It automatically detects and lists the devices, displaying each with its corresponding RAM usage. Additionally, a refresh button allows users to update the list and view real-time device and memory usage. The widget also includes an event handler that activates when a user selects a device from the dropdown menu.

Function signature

SelectCudaDevice(
    get_list_on_init = True,
    sort_by_free_ram = False,
    include_cpu_option = False,
    widget_id = None,
)
default

Parameters

Parameters
Type
Description

get_list_on_init

Optional[bool]

Whether to retrieve and display the list of CUDA devices upon initialization. Default is True.

sort_by_free_ram

Optional[bool]

Whether to sort the CUDA devices by their available free RAM. Default is False.

include_cpu_option

Optional[bool]

Whether to include CPU as an option in the device list. Default is False.

widget_id

str

An optional ID for the widget.

get_list_on_init

Determine if you want to get the device list on widget initialization. If True, the widget retrieves information about device on initialization. Default is True.

type: Optional[bool]

default value: True

Initialize the empty widget, and then manually refresh it to find the devices:

widget = SelectCudaDevice(get_list_on_init=False)

# some code here

widget.refresh()

sort_by_free_ram

If True, the device list will automatically be sorted by its free RAM value. Default is False.

type: Optional[bool]

default value: False

Initialize the widget sorting it by free RAM:

widget = SelectCudaDevice(sort_by_free_ram=True)

include_cpu_option

If True, selector will include CPU as a device option. Default is False.

type: Optional[bool]

default value: False

Initialize the widget with CPU as a device option:

widget = SelectCudaDevice(include_cpu_option=True)

widget_id

An optional ID for the widget.

type: str

default value: None

Initialize the widget with an ID:

widget = SelectCudaDevice(widget_id="select_cuda_device")

Methods and attributes

Methods and Attributes
Description

get_device()

Get currently selected device.

set_device(value: str)

Set the device to be displayed in the widget (overrides current).

refresh()

Get up-to-date information about available devices and set them as options in the selector.

Mini app example

You can find this example in our GitHub repository:

selection/023_select_cuda_device/src/main.py

Import libraries

import os

import supervisely as sly
from dotenv import load_dotenv
from supervisely.app.widgets import Card, SelectCudaDevice, Container, Text

Init API client

First, we load environment variables with credentials and init API for communicating with Supervisely Instance:

load_dotenv("local.env")
load_dotenv(os.path.expanduser("~/supervisely.env"))
api = sly.Api()

Initialize the SelectCudaDevice widget

Let's initialize the SelectCudaDevice widget with no devices:

cuda_device = SelectCudaDevice(
    get_list_on_init=False,
    include_cpu_option=True,
)

Then, we can manually refresh the widget, retrieving the devices information when we need to.

cuda_device.refresh()

Create an event handler for the SelectCudaDevice widget

Now, let's create a event handler for the SelectCudaDevice widget, when the value of the widget is changed.

value_changed_info = Text(status="info")
value_changed_info.hide()


@cuda_device.value_changed
def new_device_selected(device: str):
    text = "Value changed: {}".format(device)
    value_changed_info.text = text
    value_changed_info.show()

Create app layout

Prepare a layout for the app using Card widget with the content parameter and place widget that we've just created in the Container widget.

card = Card(
    title="Select Cuda Device",
    content=Container(widgets=[value_changed_info, cuda_device]),
)

layout = Container(widgets=[card])

Create an app using the layout

Create an app object with the layout parameter.

app = sly.Application(layout=layout)

Last updated