Files
TheRock/rocm-systems/emulation/mirage/docs/cli.md
T
derek.holloway 7502bf64a4
CodeQL / Analyze (actions) (push) Canceled after 0s
CodeQL / Analyze (python) (push) Canceled after 0s
pre-commit / pre-commit (push) Canceled after 0s
Multi-Arch CI / setup (push) Canceled after 0s
Publish build_manylinux_x86_64 images / publish_build_manylinux_x86_64 (push) Canceled after 0s
Setup (Multi-Arch) / setup (push) Canceled after 0s
Multi-Arch CI / Linux::${{ fromJSON(needs.setup.outputs.linux_build_config || '{}').build_variant_label || 'skip' }} (push) Canceled after 0s
Publish TheRock Docker image / build-and-push-image (push) Canceled after 0s
Publish no_rocm_image_ubi10 image / publish_no_rocm_image_ubi10 (push) Canceled after 0s
Multi-Arch CI / Windows::${{ fromJSON(needs.setup.outputs.windows_build_config || '{}').build_variant_label || 'skip' }} (push) Canceled after 0s
Publish TheRock Docker image / build-and-push-image (push) Canceled after 0s
Multi-Arch CI / Manifest Diff (push) Canceled after 0s
TheRock Manifest Diff Report / Generate Manifest Diff Report (push) Canceled after 0s
Multi-Arch CI / CI Summary (push) Canceled after 0s
Publish no_rocm_image_ubuntu24_04 images / publish_no_rocm_image_ubuntu24_04 (push) Canceled after 0s
Publish no_rocm_image_ubuntu24_04_ocl_rt images / publish_no_rocm_image_ubuntu24_04_ocl_rt (push) Canceled after 0s
Publish TheRock Docker image / build-and-push-image (push) Canceled after 0s
Publish TheRock Docker image / build-and-push-image (push) Canceled after 0s
Publish no_rocm_image_ubuntu24_04 images / publish_no_rocm_image_ubuntu24_04_rocgdb (push) Canceled after 0s
Publish no_rocm_image_ubuntu24_04_rocgdb images / publish_no_rocm_image_ubuntu24_04_rocgdb (push) Canceled after 0s
Publish no_rocm_image_ubuntu24_04 images / publish_no_rocm_image_ubuntu24_04_ocl_rt (push) Canceled after 0s
Publish TheRock Docker image / build-and-push-image (push) Canceled after 0s
Unit Tests / Unit Tests :: ubuntu-24.04 (push) Canceled after 0s
Unit Tests / Unit Tests :: windows-2022 (push) Canceled after 0s
Publish no_rocm_image_ubuntu24_04 images / publish_no_rocm_image_ubuntu24_04_media (push) Canceled after 0s
Unit Tests / Unit Tests Summary (push) Canceled after 0s
Publish no_rocm_image_ubuntu24_04 images / publish_no_rocm_image_ubuntu24_04_openmpi (push) Canceled after 0s
Flatten subprojects into a single base monorepo
2026-09-02 16:34:47 -07:00

313 lines
13 KiB
Markdown

# mirage CLI reference
`mirage` is organized into a small set of verbs, each managing one kind of
resource. Every command supports `--help`, and most support `--json` for
machine-readable output.
```text
mirage <command> [options]
mirage <command> --help # per-command help
```
## Global options
| Flag | Description |
| ------------- | ---------------------------------------------------------------- |
| `--json` | Emit JSON output where applicable. |
| `-v`, `-vv` | Increase logging verbosity (`-v` = info, `-vv` = debug). |
| `--help` | Print help (top level or per command). |
| `--version` | Print the mirage version. |
Global flags may appear before or after the subcommand, e.g.
`mirage --json profile list`.
## Command summary
| Command | Purpose |
| ------------------ | -------------------------------------------------------------- |
| `mirage emulators` | List emulator backends and their install / support status. |
| `mirage profile` | Manage profiles (reusable emulator presets). |
| `mirage topology` | Manage topologies (rack/node/GPU layouts). |
| `mirage agent` | Manage agents (hardware GPU definitions). |
| `mirage session` | Manage sessions. |
| `mirage exec` | Manage execs inside a session. |
| `mirage run` | Create a session, run a command, attach, and clean up. |
| `mirage attach` | Re-attach to a running (or finished) exec's streams. |
| `mirage logs` | Show or follow an exec's stdout. |
| `mirage state` | Manage mirage's on-disk state (builtins, purge). |
| `mirage paths` | Print where mirage stores its state. |
| `mirage about` | Show version, copyright, and third-party licenses. |
| `mirage webui` | Run or install the optional web dashboard (feature-gated). |
| `mirage host` | Run a per-session host (used internally; rarely invoked). |
## `mirage emulators`
List the emulator backends compiled into this build, whether each one's
runtime is installed, and whether this machine's hardware supports it.
```text
mirage emulators [-l|--long]
```
* The default emulator for new profiles is marked with `*`.
* `-l` shows a detailed block per backend, including the support reason.
* `--json` emits the full backend descriptors.
```sh
$ mirage emulators
NAME INSTALLED SUPPORTED DESCRIPTION
noop* yes yes no-op emulator: runs commands directly with no GPU emulation
rocjitsu no yes ROCm just-in-time GPU emulator (cycle-accurate or functional)
...
* = default emulator for new profiles
```
## `mirage profile`
Profiles are reusable emulator presets stored in
`$XDG_CONFIG_HOME/mirage/profile/<name>.json`.
```text
mirage profile list [-l|--long]
mirage profile show <name>
mirage profile create [<name>] [--emulator NAME] [--agent NAME]
[--num-nodes N] [--gpus-per-node N]
[--description TEXT]
[--image IMAGE] [--mount SPEC]... [--container-provider PROV]
[--no-input]
mirage profile import <file> # use '-' for stdin
mirage profile delete <name> [-f|--force]
```
* `--emulator` defaults to the first installed backend (rocjitsu if present,
otherwise noop). `--agent` defaults to `MI350X`.
* `--image` containerises the profile (every node runs inside a container
built from that image). `--mount HOST[:CONTAINER[:ro|rw]]` and `--container-provider`
(`podman`, `docker`, or a path) require `--image`.
* On a terminal, `profile create` interactively prompts for any field not
passed as a flag. Pass `--no-input` (or pipe/redirect stdin) to use defaults
and stay non-interactive.
* Profiles are validated against their emulator at creation time, so an
unusable setup is reported immediately.
## `mirage topology`
Topologies describe a rack/node/GPU layout and reference an agent. Builtin
topologies are written on first run.
```text
mirage topology list
mirage topology show <name>
mirage topology create <name> [--agent NAME] [--num-nodes N] [--gpus-per-node N]
mirage topology import <name> <file> # use '-' for stdin
mirage topology delete <name> [-f|--force]
```
## `mirage agent`
Agents are hardware GPU definitions (e.g. `MI300X`, `MI350X`, `MI450X`).
Builtin agents are written on first run.
```text
mirage agent list
mirage agent show <name>
mirage agent import <name> <file> # use '-' for stdin
mirage agent delete <name> [-f|--force]
```
## `mirage session`
Sessions are the long-lived contexts in which execs run. Each session is
served by one host process.
```text
mirage session list
mirage session show <id>
mirage session wait <id> [--timeout SECONDS] # default 30
mirage session start [--profile NAME] [--id ID] [--workdir DIR]
[--no-host] [--ready-timeout SECONDS]
[--image IMAGE] [--mount SPEC]... [--container-provider PROV]
[--exec-mode functional|clocked] [--option KEY=VALUE]...
[--config PATH] [--daemon] [--no-input]
mirage session stop <id> [-f|--force]
mirage session dir <id> # print the on-disk directory
```
* `session start` creates the session, spawns the per-session host
(`mirage host --session <id>`) in its own process group, then waits up to
`--ready-timeout` seconds for the host to publish `healthy=true`. It prints
the session id (or the full state with `--json`).
* On a terminal it prompts for the profile (and id, workdir, ready-timeout)
when not passed; `--no-input` requires `--profile` and uses defaults.
* `--no-host` creates the session without spawning a host (for tests, or when
you start the host yourself, e.g. inside a container).
* `-o`/`--option KEY=VALUE` overrides emulator options; `--exec-mode` selects
functional (default) or clocked emulation; `--config PATH` uses an explicit
emulator config file; `--daemon` runs the emulator out-of-process.
* `session stop` signals the host (`SIGTERM`, escalating to `SIGKILL`) and
removes the session directory.
## `mirage exec`
```text
mirage exec list <session>
mirage exec show <session> <exec>
mirage exec start <session> [--keep] [--detach] [--env KEY=VALUE]... -- <cmd> [args...]
mirage exec signal <session> <exec> [SIG] # default: TERM
mirage exec remove <session> <exec>
```
`exec start` is the workhorse:
* By default it attaches to the new exec, forwards stdin/stdout/stderr, exits
with the exec's exit code, and then removes the on-disk exec directory.
* `--detach` submits the exec and prints its id without attaching.
* `--keep` preserves the exec directory after it exits so you can re-read its
logs with `mirage logs` or `mirage exec show`. Without `--keep`, a finished
exec is reaped by the host — so attaching to a detached, non-`--keep` exec
is racy; combine `--detach` with `--keep` if you intend to attach later.
* `--env KEY=VALUE` injects extra environment variables (repeatable).
* Everything after `--` is passed verbatim to the command.
* `exec signal` accepts a signal name (`TERM`, `KILL`, `INT`, `HUP`, `QUIT`,
`USR1`, `USR2`, with or without the `SIG` prefix) or a number.
## `mirage attach <session> <exec>`
Re-attach to an exec that is still running (or to a finished, `--keep`-ed exec,
in which case buffered output is replayed and the saved exit code is returned).
Useful after a `--detach`.
## `mirage logs <session> <exec> [-f|--follow]`
Print the exec's stdout (concatenated across nodes). With `-f`, follow the
stream as it is appended (using the same attach machinery).
## `mirage run [--profile NAME] -- <cmd> [args...]`
Convenience verb that combines `session start`, `exec start`, and (for
transient sessions) `session stop` into one call:
```sh
mirage run --profile cdna4 -- pytest -x my_tests/
```
```text
mirage run [--profile NAME] [--emulator NAME]
[--session ID] [--keep-session] [--workdir DIR]
[--env KEY=VALUE]...
[--image IMAGE] [--mount SPEC]... [--container-provider PROV]
[--exec-mode functional|clocked] [--option KEY=VALUE]...
[--config PATH] [--daemon]
-- <cmd> [args...]
```
* `--profile` defaults to the `mi450x` builtin. `--emulator` overrides the
profile's backend.
* `--session ID` reuses an existing session instead of creating a transient
one; `--keep-session` keeps a transient session running after the exec
finishes.
* The container, emulator, and option overrides mirror `session start`.
## `mirage state`
```text
mirage state builtins # (re)write builtin agents/topologies/profiles
mirage state purge [-f|--force] [--all]
```
* mirage writes any *missing* builtins on every run. `state builtins`
additionally **overwrites** existing builtins (useful after upgrading).
* `state purge` stops every running session and removes the runtime and state
directories. The config directory (profiles, topologies, agents)
is left alone unless `--all` is given.
## `mirage paths`
Print the resolved mirage directories. Useful in scripts and for verifying
that environment overrides took effect.
```sh
$ mirage paths
config: /home/me/.config/mirage
runtime: /run/user/1000/mirage
state: /home/me/.local/state/mirage
profiles: /home/me/.config/mirage/profile
sessions: /run/user/1000/mirage/session
```
## `mirage about`
Print the mirage version, copyright, and the third-party crates (with
licenses) the binary is built from.
## `mirage webui` (optional, feature-gated)
Run or install the cross-session HTTP/WebSocket dashboard. Available when
mirage is built with `--features daemon` (API only) or `--features webui`
(API + bundled SPA). `daemon` is accepted as an alias of `webui`.
```text
mirage webui [serve] [--addr ADDR] # default 127.0.0.1:5174
mirage webui install [--addr ADDR] # register a systemd user service
```
The bind address can also be set with `MIRAGE_WEBUI_ADDR`.
## Drop-in `rocjitsu` mode
For compatibility with the upstream `rocjitsu` CLI, a bare invocation with a
`--` application separator and no recognised subcommand is routed to
`mirage run`:
```sh
mirage --config cfg.json -- ./app # == mirage run --config cfg.json -- ./app
mirage --attach --config cfg.json -- ./app # --attach maps to --daemon
```
Invocations that name a subcommand, or that have no `--` separator (so
`--help`/`--version` keep working), are left untouched.
## Environment variables
| Variable | Purpose |
| ---------------------------- | ---------------------------------------------------------------- |
| `MIRAGE_LOG` | Tracing-subscriber filter, e.g. `debug` or `mirage_host=debug`. |
| `MIRAGE_BIN` | Path to the `mirage` binary used to spawn per-session hosts. Defaults to the current executable, falling back to `mirage` on `$PATH`. |
| `MIRAGE_CONTAINER_PROVIDER` | Default container provider when none is given (`podman`/`docker`/path). |
| `MIRAGE_CONFIG` | Override the config dir (else `$XDG_CONFIG_HOME/mirage`). |
| `MIRAGE_RUNTIME` | Override the runtime/session dir (else `$XDG_RUNTIME_DIR/mirage`). |
| `MIRAGE_STATE` | Override the state dir (else `$XDG_STATE_HOME/mirage`). |
| `MIRAGE_WEBUI_ADDR` | Default bind address for `mirage webui`. |
| `XDG_CONFIG_HOME` / `XDG_RUNTIME_DIR` / `XDG_STATE_HOME` | Standard XDG base directories used when the `MIRAGE_*` overrides are unset. |
rocjitsu discovery additionally honours `ROCM_HOME` and the ROCm SDK
install root reported by `rocm-sdk path --root` (see
[`building.md`](building.md)).
## Exit codes
| Code | Meaning |
| ---- | ------------------------------------------------------------------- |
| 0 | Success. |
| 1 | A mirage-level error (bad arguments, resource not found, …). |
| 2 | Argument parse error (clap), or `session wait` timed out/unhealthy. |
| N | For `run`, `exec start`, and `attach`: the exit code of the exec. |
## JSON output
`--json` makes list/show commands emit a parseable JSON document:
```sh
$ mirage --json profile list
[
"cdna4"
]
$ mirage --json session list
[
{
"def": { "id": "s-20260616-191636-f6c1", "profile": "cdna4", ... },
"health": { "healthy": true, "state": "ready", "terminal": false }
}
]
```