sequence-base 0.4.32__tar.gz → 0.4.34__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- {sequence_base-0.4.32 → sequence_base-0.4.34}/PKG-INFO +1 -1
- {sequence_base-0.4.32 → sequence_base-0.4.34}/pyproject.toml +1 -1
- {sequence_base-0.4.32 → sequence_base-0.4.34}/sequence_base/by_name.py +54 -6
- sequence_base-0.4.34/sequence_base/constants/cards.py +38 -0
- {sequence_base-0.4.32 → sequence_base-0.4.34}/sequence_base/constants/version.py +2 -1
- {sequence_base-0.4.32 → sequence_base-0.4.34}/sequence_base/contract/benchmarks.py +17 -0
- {sequence_base-0.4.32 → sequence_base-0.4.34}/sequence_base/schemas/ActRequest.json +1 -1
- {sequence_base-0.4.32 → sequence_base-0.4.34}/sequence_base/schemas/ActResponse.json +1 -1
- {sequence_base-0.4.32 → sequence_base-0.4.34}/sequence_base/schemas/ActionChunk.json +1 -1
- {sequence_base-0.4.32 → sequence_base-0.4.34}/sequence_base/schemas/ActionContract.json +1 -1
- {sequence_base-0.4.32 → sequence_base-0.4.34}/sequence_base/schemas/ActionStep.json +1 -1
- {sequence_base-0.4.32 → sequence_base-0.4.34}/sequence_base/schemas/Actions.json +1 -1
- {sequence_base-0.4.32 → sequence_base-0.4.34}/sequence_base/schemas/AdapterPair.json +1 -1
- {sequence_base-0.4.32 → sequence_base-0.4.34}/sequence_base/schemas/AddLocal.json +1 -1
- {sequence_base-0.4.32 → sequence_base-0.4.34}/sequence_base/schemas/Autoscaler.json +1 -1
- {sequence_base-0.4.32 → sequence_base-0.4.34}/sequence_base/schemas/BenchmarkConditionSpec.json +1 -1
- {sequence_base-0.4.32 → sequence_base-0.4.34}/sequence_base/schemas/BenchmarkRegisterRequest.json +15 -1
- {sequence_base-0.4.32 → sequence_base-0.4.34}/sequence_base/schemas/BenchmarkSpec.json +15 -2
- {sequence_base-0.4.32 → sequence_base-0.4.34}/sequence_base/schemas/BenchmarkStatusResponse.json +1 -1
- {sequence_base-0.4.32 → sequence_base-0.4.34}/sequence_base/schemas/BootstrapResponse.json +1 -1
- {sequence_base-0.4.32 → sequence_base-0.4.34}/sequence_base/schemas/Camera.json +1 -1
- {sequence_base-0.4.32 → sequence_base-0.4.34}/sequence_base/schemas/CodeBundle.json +1 -1
- {sequence_base-0.4.32 → sequence_base-0.4.34}/sequence_base/schemas/Concurrency.json +1 -1
- {sequence_base-0.4.32 → sequence_base-0.4.34}/sequence_base/schemas/Conditions.json +1 -1
- {sequence_base-0.4.32 → sequence_base-0.4.34}/sequence_base/schemas/ConnectRequest.json +1 -1
- {sequence_base-0.4.32 → sequence_base-0.4.34}/sequence_base/schemas/ConnectResponse.json +1 -1
- {sequence_base-0.4.32 → sequence_base-0.4.34}/sequence_base/schemas/DeploymentAccepted.json +1 -1
- {sequence_base-0.4.32 → sequence_base-0.4.34}/sequence_base/schemas/DeploymentPolicy.json +1 -1
- {sequence_base-0.4.32 → sequence_base-0.4.34}/sequence_base/schemas/DeploymentRequest.json +1 -1
- {sequence_base-0.4.32 → sequence_base-0.4.34}/sequence_base/schemas/DeploymentStatusResponse.json +1 -1
- {sequence_base-0.4.32 → sequence_base-0.4.34}/sequence_base/schemas/ErrorBody.json +1 -1
- {sequence_base-0.4.32 → sequence_base-0.4.34}/sequence_base/schemas/ErrorCodes.json +1 -1
- {sequence_base-0.4.32 → sequence_base-0.4.34}/sequence_base/schemas/Estimate.json +1 -1
- {sequence_base-0.4.32 → sequence_base-0.4.34}/sequence_base/schemas/EvalDryRunResponse.json +1 -1
- {sequence_base-0.4.32 → sequence_base-0.4.34}/sequence_base/schemas/EvalReport.json +1 -1
- {sequence_base-0.4.32 → sequence_base-0.4.34}/sequence_base/schemas/EvalRequest.json +1 -1
- {sequence_base-0.4.32 → sequence_base-0.4.34}/sequence_base/schemas/EvalResponse.json +1 -1
- {sequence_base-0.4.32 → sequence_base-0.4.34}/sequence_base/schemas/ImageFrame.json +1 -1
- {sequence_base-0.4.32 → sequence_base-0.4.34}/sequence_base/schemas/ImageSpec.json +1 -1
- {sequence_base-0.4.32 → sequence_base-0.4.34}/sequence_base/schemas/ImageStepAddLocal.json +1 -1
- {sequence_base-0.4.32 → sequence_base-0.4.34}/sequence_base/schemas/ImageStepApt.json +1 -1
- {sequence_base-0.4.32 → sequence_base-0.4.34}/sequence_base/schemas/ImageStepEnv.json +1 -1
- {sequence_base-0.4.32 → sequence_base-0.4.34}/sequence_base/schemas/ImageStepProject.json +1 -1
- {sequence_base-0.4.32 → sequence_base-0.4.34}/sequence_base/schemas/ImageStepRun.json +1 -1
- {sequence_base-0.4.32 → sequence_base-0.4.34}/sequence_base/schemas/ImageStepTemplateFiles.json +1 -1
- {sequence_base-0.4.32 → sequence_base-0.4.34}/sequence_base/schemas/ImageStepUvPip.json +1 -1
- {sequence_base-0.4.32 → sequence_base-0.4.34}/sequence_base/schemas/InferParam.json +1 -1
- {sequence_base-0.4.32 → sequence_base-0.4.34}/sequence_base/schemas/Lease.json +1 -1
- {sequence_base-0.4.32 → sequence_base-0.4.34}/sequence_base/schemas/MetricAgg.json +1 -1
- {sequence_base-0.4.32 → sequence_base-0.4.34}/sequence_base/schemas/Observation.json +1 -1
- {sequence_base-0.4.32 → sequence_base-0.4.34}/sequence_base/schemas/ObservationContract.json +1 -1
- {sequence_base-0.4.32 → sequence_base-0.4.34}/sequence_base/schemas/Observations.json +1 -1
- {sequence_base-0.4.32 → sequence_base-0.4.34}/sequence_base/schemas/ObserveRequest.json +1 -1
- {sequence_base-0.4.32 → sequence_base-0.4.34}/sequence_base/schemas/ObserveResponse.json +1 -1
- {sequence_base-0.4.32 → sequence_base-0.4.34}/sequence_base/schemas/PolicyRegistration.json +2 -2
- {sequence_base-0.4.32 → sequence_base-0.4.34}/sequence_base/schemas/PolicySpec.json +1 -1
- {sequence_base-0.4.32 → sequence_base-0.4.34}/sequence_base/schemas/Project.json +1 -1
- {sequence_base-0.4.32 → sequence_base-0.4.34}/sequence_base/schemas/Proprioception.json +1 -1
- {sequence_base-0.4.32 → sequence_base-0.4.34}/sequence_base/schemas/RenderSpec.json +1 -1
- {sequence_base-0.4.32 → sequence_base-0.4.34}/sequence_base/schemas/ReplaySpec.json +1 -1
- {sequence_base-0.4.32 → sequence_base-0.4.34}/sequence_base/schemas/Resources.json +1 -1
- {sequence_base-0.4.32 → sequence_base-0.4.34}/sequence_base/schemas/RolloutResult.json +1 -1
- {sequence_base-0.4.32 → sequence_base-0.4.34}/sequence_base/schemas/SecretCreateRequest.json +1 -1
- {sequence_base-0.4.32 → sequence_base-0.4.34}/sequence_base/schemas/SecretInfo.json +1 -1
- {sequence_base-0.4.32 → sequence_base-0.4.34}/sequence_base/schemas/SecretRef.json +1 -1
- {sequence_base-0.4.32 → sequence_base-0.4.34}/sequence_base/schemas/SeqFlags.json +1 -1
- {sequence_base-0.4.32 → sequence_base-0.4.34}/sequence_base/schemas/Step.json +1 -1
- {sequence_base-0.4.32 → sequence_base-0.4.34}/sequence_base/schemas/Stream.json +1 -1
- {sequence_base-0.4.32 → sequence_base-0.4.34}/sequence_base/schemas/TaskAgg.json +1 -1
- {sequence_base-0.4.32 → sequence_base-0.4.34}/sequence_base/schemas/TemplateFiles.json +1 -1
- {sequence_base-0.4.32 → sequence_base-0.4.34}/sequence_base/schemas/Tensors.json +1 -1
- {sequence_base-0.4.32 → sequence_base-0.4.34}/sequence_base/schemas/Timeouts.json +1 -1
- {sequence_base-0.4.32 → sequence_base-0.4.34}/sequence_base/schemas/UploadTarget.json +1 -1
- {sequence_base-0.4.32 → sequence_base-0.4.34}/sequence_base/schemas/Variant.json +1 -1
- {sequence_base-0.4.32 → sequence_base-0.4.34}/sequence_base/schemas/VolumeFile.json +1 -1
- {sequence_base-0.4.32 → sequence_base-0.4.34}/sequence_base/schemas/VolumeInfo.json +1 -1
- {sequence_base-0.4.32 → sequence_base-0.4.34}/sequence_base/schemas/VolumeMount.json +1 -1
- {sequence_base-0.4.32 → sequence_base-0.4.34}/sequence_base/schemas/VolumeRef.json +1 -1
- {sequence_base-0.4.32 → sequence_base-0.4.34}/sequence_base/schemas/VolumeUploadRequest.json +1 -1
- {sequence_base-0.4.32 → sequence_base-0.4.34}/sequence_base/schemas/VolumeUploadResponse.json +1 -1
- {sequence_base-0.4.32 → sequence_base-0.4.34}/sequence_base/schemas/WarmingError.json +1 -1
- sequence_base-0.4.32/sequence_base/constants/cards.py +0 -16
- {sequence_base-0.4.32 → sequence_base-0.4.34}/.gitignore +0 -0
- {sequence_base-0.4.32 → sequence_base-0.4.34}/README.md +0 -0
- {sequence_base-0.4.32 → sequence_base-0.4.34}/sequence_base/__init__.py +0 -0
- {sequence_base-0.4.32 → sequence_base-0.4.34}/sequence_base/auth.py +0 -0
- {sequence_base-0.4.32 → sequence_base-0.4.34}/sequence_base/codec/__init__.py +0 -0
- {sequence_base-0.4.32 → sequence_base-0.4.34}/sequence_base/codec/image.py +0 -0
- {sequence_base-0.4.32 → sequence_base-0.4.34}/sequence_base/codec/marked.py +0 -0
- {sequence_base-0.4.32 → sequence_base-0.4.34}/sequence_base/constants/__init__.py +0 -0
- {sequence_base-0.4.32 → sequence_base-0.4.34}/sequence_base/constants/headers.py +0 -0
- {sequence_base-0.4.32 → sequence_base-0.4.34}/sequence_base/constants/limits.py +0 -0
- {sequence_base-0.4.32 → sequence_base-0.4.34}/sequence_base/construct.py +0 -0
- {sequence_base-0.4.32 → sequence_base-0.4.34}/sequence_base/contract/__init__.py +0 -0
- {sequence_base-0.4.32 → sequence_base-0.4.34}/sequence_base/contract/accounts.py +0 -0
- {sequence_base-0.4.32 → sequence_base-0.4.34}/sequence_base/contract/act.py +0 -0
- {sequence_base-0.4.32 → sequence_base-0.4.34}/sequence_base/contract/adapters.py +0 -0
- {sequence_base-0.4.32 → sequence_base-0.4.34}/sequence_base/contract/connect.py +0 -0
- {sequence_base-0.4.32 → sequence_base-0.4.34}/sequence_base/contract/deployments.py +0 -0
- {sequence_base-0.4.32 → sequence_base-0.4.34}/sequence_base/contract/errors.py +0 -0
- {sequence_base-0.4.32 → sequence_base-0.4.34}/sequence_base/contract/eval.py +0 -0
- {sequence_base-0.4.32 → sequence_base-0.4.34}/sequence_base/contract/flags.py +0 -0
- {sequence_base-0.4.32 → sequence_base-0.4.34}/sequence_base/contract/io.py +0 -0
- {sequence_base-0.4.32 → sequence_base-0.4.34}/sequence_base/contract/obs_schedule.py +0 -0
- {sequence_base-0.4.32 → sequence_base-0.4.34}/sequence_base/contract/observe.py +0 -0
- {sequence_base-0.4.32 → sequence_base-0.4.34}/sequence_base/contract/own_io.py +0 -0
- {sequence_base-0.4.32 → sequence_base-0.4.34}/sequence_base/contract/policy.py +0 -0
- {sequence_base-0.4.32 → sequence_base-0.4.34}/sequence_base/contract/retired.py +0 -0
- {sequence_base-0.4.32 → sequence_base-0.4.34}/sequence_base/contract/templates.py +0 -0
- {sequence_base-0.4.32 → sequence_base-0.4.34}/sequence_base/contract/volumes.py +0 -0
- {sequence_base-0.4.32 → sequence_base-0.4.34}/sequence_base/contract/wire.py +0 -0
- {sequence_base-0.4.32 → sequence_base-0.4.34}/sequence_base/episode.py +0 -0
- {sequence_base-0.4.32 → sequence_base-0.4.34}/sequence_base/errors/__init__.py +0 -0
- {sequence_base-0.4.32 → sequence_base-0.4.34}/sequence_base/errors/transport.py +0 -0
- {sequence_base-0.4.32 → sequence_base-0.4.34}/sequence_base/msgpack_io.py +0 -0
- {sequence_base-0.4.32 → sequence_base-0.4.34}/sequence_base/obs/__init__.py +0 -0
- {sequence_base-0.4.32 → sequence_base-0.4.34}/sequence_base/obs/log.py +0 -0
- {sequence_base-0.4.32 → sequence_base-0.4.34}/sequence_base/obs/rid.py +0 -0
- {sequence_base-0.4.32 → sequence_base-0.4.34}/sequence_base/presets/__init__.py +0 -0
- {sequence_base-0.4.32 → sequence_base-0.4.34}/sequence_base/presets/frames.py +0 -0
- {sequence_base-0.4.32 → sequence_base-0.4.34}/sequence_base/presets/robot_arm.py +0 -0
- {sequence_base-0.4.32 → sequence_base-0.4.34}/sequence_base/schema_export.py +0 -0
- {sequence_base-0.4.32 → sequence_base-0.4.34}/sequence_base/telemetry/__init__.py +0 -0
- {sequence_base-0.4.32 → sequence_base-0.4.34}/sequence_base/telemetry/events.py +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.5
|
|
2
2
|
Name: sequence-base
|
|
3
|
-
Version: 0.4.
|
|
3
|
+
Version: 0.4.34
|
|
4
4
|
Summary: Shared foundation for the Sequences platform — wire contract, correlation, error taxonomy, constants. Used by the robot SDK, gateway, and container harness.
|
|
5
5
|
Project-URL: Changelog, https://generalsequences.com/docs/changelog/
|
|
6
6
|
Requires-Python: >=3.10
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
[project]
|
|
2
2
|
name = "sequence-base"
|
|
3
|
-
version = "0.4.
|
|
3
|
+
version = "0.4.34"
|
|
4
4
|
description = "Shared foundation for the Sequences platform — wire contract, correlation, error taxonomy, constants. Used by the robot SDK, gateway, and container harness."
|
|
5
5
|
requires-python = ">=3.10"
|
|
6
6
|
dependencies = ["pydantic>=2.0"]
|
|
@@ -17,10 +17,15 @@ rule on both sides.
|
|
|
17
17
|
|
|
18
18
|
What the platform hands a method itself is `episode` - an act function, an observe function and the method an
|
|
19
19
|
episode's end calls alike - and an eval's `seed`; `retired(parameters, what)` refuses a method that still takes what it
|
|
20
|
-
handed once (episode_id, embodiment, feedback), and `ends(parameters, what)` an end
|
|
21
|
-
each in words that say what to write instead - the SDK when a class is
|
|
22
|
-
before.
|
|
20
|
+
handed once (episode_id, embodiment, feedback, and a composite's plan and robot), and `ends(parameters, what)` an end
|
|
21
|
+
method that takes anything but the episode, each in words that say what to write instead - the SDK when a class is
|
|
22
|
+
declared, the worker when it loads one declared before.
|
|
23
23
|
|
|
24
|
+
|
|
25
|
+
A composite's planner, @seq.plan, is called on a clock with the episode alone and what it returns is kept in the
|
|
26
|
+
episode's state, which the act function beside it reads: `plan_refused(plan, infer_takes_episode=...)` says why a plan
|
|
27
|
+
method cannot be served as it is written, and `wake_on_refused(value)` why a wake_on is no list of keys - one set of
|
|
28
|
+
words for the SDK and the worker.
|
|
24
29
|
"""
|
|
25
30
|
from __future__ import annotations
|
|
26
31
|
|
|
@@ -29,17 +34,26 @@ from collections.abc import Iterable, Mapping
|
|
|
29
34
|
from dataclasses import dataclass
|
|
30
35
|
from typing import Any
|
|
31
36
|
|
|
32
|
-
__all__ = ["INFER_PLATFORM", "OBSERVE_PLATFORM", "RETIRED", "ByName", "ends", "
|
|
37
|
+
__all__ = ["INFER_PLATFORM", "OBSERVE_PLATFORM", "RETIRED", "WAKE_ON", "ByName", "ends", "plan_refused", "retired",
|
|
38
|
+
"takes_by_name", "wake_on_refused"]
|
|
33
39
|
|
|
34
40
|
|
|
35
41
|
|
|
36
|
-
INFER_PLATFORM = frozenset({"seed", "episode"
|
|
42
|
+
INFER_PLATFORM = frozenset({"seed", "episode"})
|
|
37
43
|
OBSERVE_PLATFORM = frozenset({"step", "episode"})
|
|
38
44
|
|
|
39
45
|
|
|
40
46
|
RETIRED = {"episode_id": "take episode, a seq.Episode, and read episode.id",
|
|
41
47
|
"embodiment": "send what the robot is with its observations, in observe(x)",
|
|
42
|
-
"feedback": "send what the robot was playing with its observations, in observe(x)"
|
|
48
|
+
"feedback": "send what the robot was playing with its observations, in observe(x)",
|
|
49
|
+
|
|
50
|
+
"plan": ('take episode and read the newest plan as episode.state["seq.plans"][-1]["value"], what '
|
|
51
|
+
'@seq.plan returned (before the first, episode.state.get("seq.plans") is None)'),
|
|
52
|
+
"robot": ("take episode: episode.state is the robot's own dict, which @seq.plan is handed too, and "
|
|
53
|
+
"episode.id names it")}
|
|
54
|
+
|
|
55
|
+
WAKE_ON = ('@seq.plan(wake_on=...) is a list of the observation\'s keys whose arrival plans at once, each a string - '
|
|
56
|
+
'wake_on=["say"]: an observation that holds "say" plans its episode then, its clock going on beside')
|
|
43
57
|
|
|
44
58
|
_VARIADIC = (inspect.Parameter.VAR_POSITIONAL, inspect.Parameter.VAR_KEYWORD)
|
|
45
59
|
|
|
@@ -125,3 +139,37 @@ def ends(parameters: Iterable[inspect.Parameter], what: str) -> str | None:
|
|
|
125
139
|
|
|
126
140
|
def _keys(names: list) -> str:
|
|
127
141
|
return ", ".join(repr(n) for n in names)
|
|
142
|
+
|
|
143
|
+
|
|
144
|
+
def plan_refused(plan: Any, *, infer_takes_episode: bool) -> str | None:
|
|
145
|
+
"""Why `plan`, a policy's @seq.plan method, cannot be served as it is written - or None, when it can: it is called on
|
|
146
|
+
a clock with the episode alone, plain or async, returning (never yielding) what is kept in the episode's state for
|
|
147
|
+
the act function beside it, which must take the episode to read it.
|
|
148
|
+
"""
|
|
149
|
+
name = getattr(plan, "__name__", "plan")
|
|
150
|
+
if inspect.isgeneratorfunction(plan) or inspect.isasyncgenfunction(plan):
|
|
151
|
+
return (f"@seq.plan {name} returns its plan rather than yielding it: return the value, which is kept in "
|
|
152
|
+
'episode.state["seq.plans"] (None keeps the plans as they are)')
|
|
153
|
+
try:
|
|
154
|
+
params = inspect.signature(plan).parameters
|
|
155
|
+
except (TypeError, ValueError):
|
|
156
|
+
params = {}
|
|
157
|
+
others = [n for n, p in params.items()
|
|
158
|
+
if n not in ("self", "episode") and p.default is inspect.Parameter.empty and p.kind not in _VARIADIC]
|
|
159
|
+
if "episode" not in params or others:
|
|
160
|
+
return (f"@seq.plan is handed the episode alone: write def {name}(self, episode) - read what it needs from "
|
|
161
|
+
'episode.state, and return the plan, which is kept in episode.state["seq.plans"] (None keeps the plans '
|
|
162
|
+
"as they are)")
|
|
163
|
+
if not infer_takes_episode:
|
|
164
|
+
return ("a policy with @seq.plan reads its plans where its act function runs: take episode in it and read "
|
|
165
|
+
'episode.state["seq.plans"][-1]["value"]')
|
|
166
|
+
return None
|
|
167
|
+
|
|
168
|
+
|
|
169
|
+
def wake_on_refused(value: Any) -> str | None:
|
|
170
|
+
"""Why `value` cannot be a @seq.plan's wake_on - the observation's top-level keys whose arrival plans an episode at
|
|
171
|
+
once - or None, when it can: a list (or tuple) of strings, or None for none.
|
|
172
|
+
"""
|
|
173
|
+
if value is None or (isinstance(value, (list, tuple)) and all(isinstance(k, str) for k in value)):
|
|
174
|
+
return None
|
|
175
|
+
return WAKE_ON
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
"""The cards a benchmark machine may run on, defined once here: the SDK refuses any other before a benchmark registers
|
|
2
|
+
(and `seq validate` offline, so the list is a constant, not a read), the gateway at registration and at an eval, and
|
|
3
|
+
the harness at the machine it starts - one list where each kept its own.
|
|
4
|
+
|
|
5
|
+
|
|
6
|
+
Both cards have RT cores, video encoders, EGL and Vulkan, so a benchmark only picks cheaper or faster; one that names a
|
|
7
|
+
card simulates on it (registration checks). CPU physics is the author's explicit choice, gpu="cpu": CPU machines, one
|
|
8
|
+
environment per core
|
|
9
|
+
.
|
|
10
|
+
|
|
11
|
+
A deployment's or a benchmark's driver is named here too, beside its card: DRIVER.
|
|
12
|
+
"""
|
|
13
|
+
import re
|
|
14
|
+
|
|
15
|
+
BENCHMARK_GPUS = ("L4", "RTX-PRO-6000")
|
|
16
|
+
|
|
17
|
+
DEFAULT_BENCHMARK_GPU = "L4"
|
|
18
|
+
|
|
19
|
+
BENCHMARK_CPU = "cpu"
|
|
20
|
+
|
|
21
|
+
|
|
22
|
+
|
|
23
|
+
|
|
24
|
+
|
|
25
|
+
|
|
26
|
+
DRIVER = r"^[1-9][0-9]{2}$"
|
|
27
|
+
|
|
28
|
+
|
|
29
|
+
def driver_major(version: str | None) -> str | None:
|
|
30
|
+
"""The major version of a driver as nvidia-smi says it ("580.178.04" -> "580"); None for anything that is not one."""
|
|
31
|
+
head = (version or "").strip().split(".", 1)[0]
|
|
32
|
+
return head if re.fullmatch(DRIVER, head) else None
|
|
33
|
+
|
|
34
|
+
|
|
35
|
+
def check_driver(driver: str | None, card: str | None) -> None:
|
|
36
|
+
"""A driver is a GPU's: one named beside gpu="cpu" is refused."""
|
|
37
|
+
if driver is not None and (card or "").strip().lower() == BENCHMARK_CPU:
|
|
38
|
+
raise ValueError('driver= names a GPU driver: a gpu="cpu" machine has none')
|
|
@@ -16,6 +16,7 @@ from typing import Literal
|
|
|
16
16
|
|
|
17
17
|
from pydantic import BaseModel, ConfigDict, Field, model_validator
|
|
18
18
|
|
|
19
|
+
from sequence_base.constants.cards import DRIVER, check_driver
|
|
19
20
|
from sequence_base.constants.limits import MAX_ENVS, METRIC_UNIT_MAX, METRIC_UNITS_MAX, TASK_DESCRIPTION_MAX
|
|
20
21
|
from sequence_base.contract.accounts import SecretRef
|
|
21
22
|
from sequence_base.contract.deployments import CodeBundle, DeploymentState, InferParam
|
|
@@ -126,6 +127,8 @@ class BenchmarkSpec(BaseModel):
|
|
|
126
127
|
|
|
127
128
|
gpu: str | None = None
|
|
128
129
|
|
|
130
|
+
driver: str | None = Field(default=None, pattern=DRIVER)
|
|
131
|
+
|
|
129
132
|
envs: int | None = Field(default=None, ge=1, le=MAX_ENVS)
|
|
130
133
|
assets: list[VolumeRef] = Field(default_factory=list)
|
|
131
134
|
render: RenderSpec | None = None
|
|
@@ -153,6 +156,11 @@ class BenchmarkSpec(BaseModel):
|
|
|
153
156
|
raise ValueError("a batched benchmark binds both OBSERVE and STEP")
|
|
154
157
|
return self
|
|
155
158
|
|
|
159
|
+
@model_validator(mode="after")
|
|
160
|
+
def _driver_of_a_card(self) -> "BenchmarkSpec":
|
|
161
|
+
check_driver(self.driver, self.gpu)
|
|
162
|
+
return self
|
|
163
|
+
|
|
156
164
|
|
|
157
165
|
class BenchmarkConditionSpec(BaseModel):
|
|
158
166
|
"""One episode setting exactly as the author declared it — a sparse list or a cross product, with its own step
|
|
@@ -233,6 +241,10 @@ class BenchmarkRegisterRequest(BaseModel):
|
|
|
233
241
|
|
|
234
242
|
gpu: str | None = Field(default=None, max_length=32)
|
|
235
243
|
|
|
244
|
+
|
|
245
|
+
driver: str | None = Field(default=None, pattern=DRIVER,
|
|
246
|
+
description='The NVIDIA driver its card must have, by major version: "580"')
|
|
247
|
+
|
|
236
248
|
envs: int | None = Field(default=None, ge=1, le=MAX_ENVS)
|
|
237
249
|
|
|
238
250
|
|
|
@@ -253,6 +265,11 @@ class BenchmarkRegisterRequest(BaseModel):
|
|
|
253
265
|
raise ValueError(f"setup parameter {name!r} is not a public Python identifier")
|
|
254
266
|
return self
|
|
255
267
|
|
|
268
|
+
@model_validator(mode="after")
|
|
269
|
+
def _driver_of_a_card(self) -> "BenchmarkRegisterRequest":
|
|
270
|
+
check_driver(self.driver, self.gpu)
|
|
271
|
+
return self
|
|
272
|
+
|
|
256
273
|
@model_validator(mode="after")
|
|
257
274
|
def _metric_units(self) -> "BenchmarkRegisterRequest":
|
|
258
275
|
for metric, unit in self.metric_units.items():
|
{sequence_base-0.4.32 → sequence_base-0.4.34}/sequence_base/schemas/BenchmarkRegisterRequest.json
RENAMED
|
@@ -885,6 +885,20 @@
|
|
|
885
885
|
"default": null,
|
|
886
886
|
"title": "Default Adapter Ref"
|
|
887
887
|
},
|
|
888
|
+
"driver": {
|
|
889
|
+
"anyOf": [
|
|
890
|
+
{
|
|
891
|
+
"pattern": "^[1-9][0-9]{2}$",
|
|
892
|
+
"type": "string"
|
|
893
|
+
},
|
|
894
|
+
{
|
|
895
|
+
"type": "null"
|
|
896
|
+
}
|
|
897
|
+
],
|
|
898
|
+
"default": null,
|
|
899
|
+
"description": "The NVIDIA driver its card must have, by major version: \"580\"",
|
|
900
|
+
"title": "Driver"
|
|
901
|
+
},
|
|
888
902
|
"engine": {
|
|
889
903
|
"anyOf": [
|
|
890
904
|
{
|
|
@@ -1089,5 +1103,5 @@
|
|
|
1089
1103
|
],
|
|
1090
1104
|
"title": "BenchmarkRegisterRequest",
|
|
1091
1105
|
"type": "object",
|
|
1092
|
-
"x-contract-version": "0.5.
|
|
1106
|
+
"x-contract-version": "0.5.30"
|
|
1093
1107
|
}
|
|
@@ -471,7 +471,7 @@
|
|
|
471
471
|
],
|
|
472
472
|
"title": "SeqFlags",
|
|
473
473
|
"type": "integer",
|
|
474
|
-
"x-contract-version": "0.5.
|
|
474
|
+
"x-contract-version": "0.5.30",
|
|
475
475
|
"x-flag-names": {
|
|
476
476
|
"CHECK": 65536,
|
|
477
477
|
"INFER": 16,
|
|
@@ -615,6 +615,19 @@
|
|
|
615
615
|
"default": null,
|
|
616
616
|
"title": "Cpu"
|
|
617
617
|
},
|
|
618
|
+
"driver": {
|
|
619
|
+
"anyOf": [
|
|
620
|
+
{
|
|
621
|
+
"pattern": "^[1-9][0-9]{2}$",
|
|
622
|
+
"type": "string"
|
|
623
|
+
},
|
|
624
|
+
{
|
|
625
|
+
"type": "null"
|
|
626
|
+
}
|
|
627
|
+
],
|
|
628
|
+
"default": null,
|
|
629
|
+
"title": "Driver"
|
|
630
|
+
},
|
|
618
631
|
"engine": {
|
|
619
632
|
"anyOf": [
|
|
620
633
|
{
|
|
@@ -722,5 +735,5 @@
|
|
|
722
735
|
],
|
|
723
736
|
"title": "BenchmarkSpec",
|
|
724
737
|
"type": "object",
|
|
725
|
-
"x-contract-version": "0.5.
|
|
738
|
+
"x-contract-version": "0.5.30"
|
|
726
739
|
}
|
|
@@ -1116,7 +1116,7 @@
|
|
|
1116
1116
|
],
|
|
1117
1117
|
"title": "SeqFlags",
|
|
1118
1118
|
"type": "integer",
|
|
1119
|
-
"x-contract-version": "0.5.
|
|
1119
|
+
"x-contract-version": "0.5.30",
|
|
1120
1120
|
"x-flag-names": {
|
|
1121
1121
|
"CHECK": 65536,
|
|
1122
1122
|
"INFER": 16,
|
|
@@ -1307,5 +1307,5 @@
|
|
|
1307
1307
|
],
|
|
1308
1308
|
"title": "PolicyRegistration",
|
|
1309
1309
|
"type": "object",
|
|
1310
|
-
"x-contract-version": "0.5.
|
|
1310
|
+
"x-contract-version": "0.5.30"
|
|
1311
1311
|
}
|
|
@@ -1,16 +0,0 @@
|
|
|
1
|
-
"""The cards a benchmark machine may run on, defined once here: the SDK refuses any other before a benchmark registers
|
|
2
|
-
(and `seq validate` offline, so the list is a constant, not a read), the gateway at registration and at an eval, and
|
|
3
|
-
the harness at the machine it starts - one list where each kept its own.
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
Both cards have RT cores, video encoders, EGL and Vulkan, so a benchmark only picks cheaper or faster; one that names a
|
|
7
|
-
card simulates on it (registration checks). CPU physics is the author's explicit choice, gpu="cpu": CPU machines, one
|
|
8
|
-
environment per core
|
|
9
|
-
.
|
|
10
|
-
"""
|
|
11
|
-
|
|
12
|
-
BENCHMARK_GPUS = ("L4", "RTX-PRO-6000")
|
|
13
|
-
|
|
14
|
-
DEFAULT_BENCHMARK_GPU = "L4"
|
|
15
|
-
|
|
16
|
-
BENCHMARK_CPU = "cpu"
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|