CamberEngine
Engine
is the main class to run scientific jobs on the Camber platform.
It has a preconfigured and optimized compute power that Camber users can instantiate at will.
As the preceding diagram shows, users primarily operate on individual notebook file systems.
Engines are compute nodes that run specific computational job
.
Each engine is designed to run specific codes or frameworks. They each have dependencies and are optimized differently depending on the target workload. Since the engine is mounted on the user file system, any outputs from the jobs also write to this file system.
You can run Camber compute a few lines of code:
from camber.athena import AthenaEngine
# instantiate the desired engine
engine = AthenaEngine(
engine_size="XSMALL",
with_gpu=False,
mount_dir=".", # default mount on current working directory
)
# create the job/workload
job = engine.create_job(command="env | sort")
# check the output of the job
job.read_logs(tail_lines=50)
# clean up the job
job.clear()
# reconfigure the engine and run a different job
job = engine.use_size("LARGE").create_job(command="sleep 10")
Description
CamberEngine
is the foundation of all engines offered by Camber.
Each engine subclasses comes from the CamberEngine
class, which carries several universal methods for workflows.
Attributes
engine_type
(str
): the type of the engineengine_size
(str
): the size of the enginenum_engines
(int
): the number of engines to use (for MPI)with_gpu
(bool
): whether GPU is attached to the enginemount_dir
(str
): the primary mount location of the engine on the notebook file systemenv_vars
(str
): environment variables attached to the engineversion
(str
): the version of the engine, applicable to select engineshistory
(CamberJobCollection
): all jobs created by the engine object so far
Methods
use_size()
use_size(self, engine_size: str, with_gpu: bool = False)
Configure the engine to be a specific size and, if needed, attach GPU capabilities.
Parameters
engine_size
(str
): Specifies the size of the engine. Valid options areXMICRO
,MICRO
,XXSMALL
,XSMALL
,SMALL
,MEDIUM
, andLARGE
for CPU workloads, andXSMALL
,MEDIUM
,LARGE
,XLARGE
, andXXLARGE
for GPU workloads.with_gpu
(bool
): Indicates whether to attach GPU capabilities to the engine. Default isFalse
.
Returns
self
: Returns the newly configured engine using the new size.
use_count()
use_count(self, num_engines: int = 1)
Configure a given number of engines to use for the calculation (MPI).
Parameters
num_engines
(int
): Specifies the number of engines. This is used primarily for MPI calculations. For optimal multi-engine performance, it is highly recommended that you use an engine size ofLARGE
or greater when using more than one engine .
Returns
self
: Returns the class commanding the specified number of engines
use_mount()
use_mount(self, mount_dir: str)
Set the directory on the local file system that the engine should mount to for running jobs.
Parameters
mount_dir
(str
): The directory path on the local file system to be used as the mount point. If you must set a custom mount directory, it is highly recommended to use the relative path in your current working directory. Otherwise, provide the full absolute path.
Returns
self
: Returns the engine instance with the updated mount directory.
use_env_vars()
use_env_vars(self, env_vars: Dict[str, str])
Set environment variables that can be accessed as the job executes. All subsequent jobs that run on this engine also can use these environment variables.
Parameters
env_vars
(Dict[str, str]
): A dictionary of environment variable names and their corresponding values to be set.
Returns
self
: Returns the engine instance with the updated environment variables.
use_version()
use_version(self, version: str)
Specify the version of the engine to use for job execution.
Parameters
version
(str
): The version of the engine to be used.
Returns
self
: Returns the engine instance configured to use the specified version.
create_job()
create_job(self, command: str, extra_env_vars: Optional[Dict[str, str]] = None, extra_file_dirs: Optional[Dict[str, str]] = None, engine_version: Optiona[str] = None, tags: Union[str, List[str]] = None)
Creates a job on the Camber compute platform that runs a provided command.
Parameters
command
(str
): The shell command to be executed by the job.extra_env_vars
(Optional[Dict[str, str]]
): Additional environment variables to add to the engine environment.extra_file_dirs
(Optional[Dict[str, str]]
): Additional directories to be mounted for this job. Keys are the paths on the local file system, and values are the paths within the job environment. Defaults toNone
.engine_version
(Optional[str]
): Uses a specific version of engine. Defaults toNone
.tags
(Union[str, List[str]]
): Tags to be associated with this job. Can be a single string or a list of strings. Defaults toNone
.
Returns
CamberJob
: An instance of theCamberJob
class representing the created job.
get_job()
get_job(self, job_id: str)
Retrieve details of an existing job using its job ID.
Parameters
job_id
(str
): The unique identifier of the job to retrieve.
Returns
CamberJob
: An instance of theCamberJob
class representing the retrieved job.
list_jobs()
list_jobs(self, tags: Optional[Union[str, List[str]]] = None)
List all jobs created by this engine, optionally filtered by tags.
Parameters
tags
(Optional[Union[str, List[str]]]
): Tags to filter the jobs. Can be a single string or a list of strings. Defaults toNone
.
Returns
List[CamberJob]
: A list ofCamberJob
instances that use the same engine type and fit the tag filters, if any.
clear_job()
clear_job(self, job_id: str)
Clear the specified job by its job ID, effectively cleaning up any resources associated with it.
Parameters
job_id
(str
): The unique identifier of the job to be cleared.
Returns
None
: This method does not return any value.
clear_history()
clear_history(self)
Clear the job history for the engine, removing all records of previously created jobs.
Parameters
- None
Returns
This method returns no value.
create_scatter_job()
create_scatter_job(self, params_grid: Dict[str, List[str]])
Creates a set of scatter jobs with the specified dictionary parameter grid.
The keys of the dictionary should be the parameter names to create_job
, and the values should be lists of values to scatter over.
The Cartesian product of all values from all parameters is used to create individual jobs.
For example:
params_grid = {
"engine_size": ["XSMALL", "SMALL"],
"engine_type": ["ATHENA", "MESA"],
"command": ["echo test"],
}
jobs = CamberJob.general_scatter(params_grid)
# the above is equivalent to creating the following 4 jobs
job1 = CamberJob.create(
engine_size="XSMALL",
engine_type="ATHENA",
command="echo test"
)
job2 = CamberJob.create(
engine_size="XSMALL",
engine_type="MESA",
command="echo test"
)
job3 = CamberJob.create(
engine_size="SMALL",
engine_type="ATHENA",
command="echo test"
)
job4 = CamberJob.create(
engine_size="SMALL",
engine_type="MESA",
command="echo test"
)
Parameters
params_grid
(Dict[str, List[str]]
): A dictionary where keys are the parameter names and values are lists of possible values for those parameters.
Returns
List[CamberJob]
: A list ofCamberJob
instances representing the scatter jobs created.
Science Engines
As mentioned, the CamberEngine
class is the basis for all science engines on the Camber platform. Below are specific engines implemented on and managed by the Camber platform.