API Stability Promise
Applies to: mlsysim v0.1.x
This document defines which parts of the mlsysim API are stable, which are experimental, and what guarantees you can rely on when building on top of the framework.
Versioning Policy
mlsysim follows Semantic Versioning with one important caveat: we are pre-1.0. Under semver, this means:
| Version bump | What it means |
|---|---|
0.1.x -> 0.1.y (patch) |
Bug fixes only. No API changes. Safe to upgrade. |
0.1.x -> 0.2.0 (minor) |
Breaking changes allowed. Read the changelog before upgrading. |
1.0.0 |
Full stability guarantee begins. Breaking changes require a major bump. |
In practice: if you pin to mlsysim ~= 0.1.0 (any 0.1.x), your code will not break. If you upgrade to 0.2.0, expect to update imports and possibly adjust call signatures.
Stable API (will not break in v0.1.x)
These interfaces are locked for the entire 0.1.x series. Bug fixes may change return values (e.g., correcting a formula), but signatures and field names will not change.
Core Engine
from mlsysim import Engine
result = Engine.solve(
model=..., # ModelSpec or registry name
hardware=..., # HardwareSpec or registry name
batch_size=32, # int
precision="fp16", # str: "fp32", "fp16", "bf16", "int8", "int4"
efficiency=0.45, # float: 0.0-1.0
)All five parameters to Engine.solve() are stable. Their names, types, and positions will not change.
Hardware Registry
from mlsysim import Hardware
gpu = Hardware.Cloud.H100 # All current entries are stable
gpu = Hardware.Cloud.A100
gpu = Hardware.Edge.JetsonOrinNX
# ... every entry shipping in 0.1.xNew entries may be added in patch releases, but existing entries will not be removed or renamed.
Model Registry
from mlsysim import Models
model = Models.Language.Llama3_70B # All current entries are stable
model = Models.Language.GPT2
# ... every entry shipping in 0.1.xSame guarantee as Hardware: additions are allowed, removals are not.
Registry paths
Use nested canonical paths in Python:
mlsysim.Hardware.Cloud.H100
mlsysim.Models.Language.Llama3_8B
mlsysim.Models.Vision.ResNet50Flat aliases at the registry root (for example bare H100 or ResNet50 leaf names) were removed in the registry migration. The CLI still resolves short names (mlsysim eval Llama3_8B H100) for convenience.
Solvers not listed in mlsysim.__init__ (for example CompressionModel, MoERoutingModel) import from mlsysim.solvers. Workload types import from mlsysim.models.types.
Scenario Registry
from mlsysim import ReferenceStats, ScenariosScenarios.* is the executable scenario registry: each entry composes an existing Models.* workload, a Hardware.* or Systems.* target, and scenario-local constraints such as latency or power budget. ReferenceStats.* holds non-executable sourced anchors, such as mobile power envelopes, Waymo data-rate ranges, and TinyML case-study measurements.
There are no compatibility aliases between these namespaces. Use Scenarios.SmartDoorbell for an executable case and ReferenceStats.MobilePower for sourced non-executable anchors.
PerformanceProfile Fields
The following fields on the result object returned by Engine.solve() are stable:
| Field | Type | Description |
|---|---|---|
latency |
pint.Quantity |
Wall-clock time for one forward pass |
throughput |
pint.Quantity |
Tokens/sec or samples/sec |
bottleneck |
str |
"Compute" or "Memory" |
mfu |
float |
Model FLOPs Utilization (0.0-1.0) |
feasible |
bool |
Whether the workload fits in memory |
energy |
pint.Quantity |
Energy consumption per forward pass |
Unit Registry
from mlsysim import uregThe Pint unit registry instance is stable. All quantities returned by the engine use this registry.
Experimental API (may change in v0.2.0)
These interfaces work today but are not yet finalized. Use them freely for exploration, but do not build production tooling against them without pinning to an exact version.
Individual Solver Classes
from mlsysim.solvers import ForwardModel, DistributedModel, ServingModelThe solver class hierarchy, their constructors, and their method signatures may change. The Engine.solve() facade insulates you from these changes – prefer it over direct solver instantiation.
Solver classes are exported from mlsysim.solvers, not the package root. Use from mlsysim.solvers import ServingModel so solver-specific dependencies stay explicit and the root namespace remains reserved for registries, units, and formatting helpers.
Training Mode Parameter
Engine.solve(..., is_training=True) # experimentalThe is_training flag will likely be replaced by separate Engine.train() and Engine.infer() methods in v0.2.0, or by a more expressive workload specification.
Pipeline Composition API
The API for composing multiple solver stages into a pipeline (e.g., prefill + decode, or TP + PP) is experimental. The abstraction is correct but the interface is still being refined.
Design Space Exploration (DSE) API
The search/sweep API for exploring hardware-model combinations is experimental. Parameter names and result formats may change.
CLI Commands and Flags
All mlsysim CLI command names, subcommands, and flags are experimental. Shell scripts that call the CLI should pin to an exact version.
Solver-Specific Result Fields
Fields on specialized result types (DistributedResult, ServingResult, etc.) beyond the six stable PerformanceProfile fields listed above are experimental. They may be renamed, reorganized, or moved to nested objects.
Deprecated (will be removed in v0.2.0)
These interfaces still work in v0.1.x but emit deprecation warnings and will be removed in the next minor release.
No public import path is deprecated in 0.1.2. Deprecations will be listed here and in the changelog before the next minor release.
How to Protect Your Code
- Pin your dependency:
mlsysim ~= 0.1.0(allows 0.1.x patches, blocks 0.2.0). - Use
Engine.solve()as your primary interface. It is the most stable entry point. - Use
mlsysim.solversonly when you need solver-specific features. The engine facade covers most use cases. - Run with warnings enabled (
python3 -W default) to catch deprecation notices early. - Read the changelog before any minor version upgrade.