Table of contents
Description
The American Science Cloud Infrastructure Services Resource Orchestration Toolkit (AmSC-ISRO-Toolkit [AmSCROT]) provides infrastructure orchestration for AmSC use.
Installation
pip install amscrot-py
Operation Instructions
Credentials
AmSCROT reads provider credentials from ~/.amscrot/credentials.yml. Each section key corresponds to a service type or profile name:
esnet-iri:
api_key: <token>
api_endpoint: https://iri.es.net/api/v1
nersc-iri:
api_key: <token>
api_endpoint: https://api.iri.nersc.gov/api/v1
amsc-iro:
api_key: <token>
api_endpoint: https://...
An example credentials file is provided in credentials-template.yml.
Core Concepts
| Class | Role |
|---|---|
Client |
Top-level entry point; owns sessions and service clients |
ServiceClient |
Provider-specific driver (Kube/Kueue, ESnet IRI, NERSC IRI, AMSC-IRO) |
Session |
Named unit of work; groups jobs and persists state to disk |
Job |
A single compute task bound to a ServiceClient |
JobSpec |
Declares executable, arguments, resources, and provider attributes |
DiscoveryResult |
Typed result from service_client.discover() |
Basic Usage
1. Set up a Client and ServiceClient
from amscrot.client.client import Client
from amscrot.serviceclient import ServiceClient
from amscrot.util.constants import Constants
client = Client()
# Choose a provider: KUBE, AMSC_IRI, AMSC_IRO
svc = ServiceClient.create(
type=Constants.ServiceType.AMSC_IRI,
name="nersc-compute",
profile="nersc-iri" # matches credentials.yml section
)
client.add_service_client(svc)
2. Discover Available Resources
result = svc.discover() # returns DiscoveryResult
# Iterate typed resources
for item in result.by_type("compute"):
print(item.data["id"], item.data["name"])
# Normalized Facility objects (provider-agnostic)
for facility in result.facilities:
print(facility.name, [c.cores for c in (facility.compute or [])])
3. Define a Job
from amscrot.client.job import Job, JobSpec, JobType, JobServiceType
spec = JobSpec(
executable="python",
arguments=["-c", "print('hello')"],
resources={
"node_count": 1,
"process_count": 1,
"processes_per_node": 1,
"cpu_cores_per_process": 1,
"exclusive_node_use": False,
"memory": 268435456
},
attributes={
"container": {"image": "python:3.12-slim"}, # provider image
"resource_id": "<compute-resource-id>" # from discovery
}
)
job = Job(
name="my-job",
type=JobType.COMPUTE,
service_type=JobServiceType.BATCH,
service_client=svc,
job_spec=spec
)
4. Create a Session and Submit
session = client.create_session("my-session")
session.add_job(job)
# Validate (raises PlanError on failure)
session.plan(verbose=True)
# Submit all jobs
session.apply()
5. Wait for Completion
from amscrot.client.job import JobState
results = session.wait(
timeout=300,
interval=5,
verbose=True,
)
for job_name, status in results.items():
print(f"{job_name}: {status.state} message={status.message}")
session.wait() polls until all jobs reach a terminal state (COMPLETED, FAILED, or CANCELED). Pass jobs=[job1, job2] to wait on a subset.
6. Clean Up
session.destroy() # cancels running jobs and removes session state
Sessions are persisted to ~/.amscrot/sessions/<session-name>/ so they survive process restarts. An existing session is restored automatically on client.create_session(name).
7. Fetch Output Files (IRI providers)
After a job completes, stdout/stderr can be downloaded from the remote filesystem:
# Include stdout/stderr paths in the job spec attributes
spec = JobSpec(
executable="python",
arguments=["-c", "print('done')"],
attributes={
"resource_id": "<compute-resource-id>",
"directory": "/path/to/workdir", # remote working directory
"stdout_path": "/path/to/workdir/out.log",
"stderr_path": "/path/to/workdir/err.log",
}
)
# After session.wait() returns COMPLETED:
fetched = session.fetch_output_files(jobs=[job])
# fetched == {"my-job": {"stdout": "/local/.amscrot/sessions/my-session/files/my-job/stdout.log",
# "stderr": "/local/.amscrot/sessions/my-session/files/my-job/stderr.log"}}
Files are written to ~/.amscrot/sessions/<session-name>/files/<job-name>/ by default. Pass output_path= to override.
8. Direct Filesystem Access (IRI providers)
ESnet IRI and NERSC IRI service clients expose an IriFilesystem interface for direct file operations independent of job submission:
fs = svc.filesystem # IriFilesystem instance (None if client unavailable)
# Upload a local file to remote storage
fs.upload(storage_resource_id, local_path="/tmp/input.txt", remote_path="/scratch/input.txt")
# Download a remote file
fs.download(storage_resource_id, remote_path="/scratch/out.log", local_path="/tmp/out.log")
# List a remote directory
entries = fs.list(storage_resource_id, remote_path="/scratch/")
# Compute checksum of a remote file
checksum = fs.checksum(storage_resource_id, remote_path="/scratch/data.tar")
# Create a tar archive of a remote directory
fs.compress(storage_resource_id, remote_path="/scratch/results/", archive_path="/scratch/results.tar.gz")
storage_resource_id is the UUID of a storage resource from svc.discover(). For most IRI deployments, the home storage resource is auto-resolved when calling session.fetch_output_files().
Kubernetes / Kueue Jobs
spec = JobSpec(
executable="sleep",
arguments=["30"],
resources={"requests": {"cpu": "1", "memory": "1Gi"}},
attributes={
"container": {"image": "busybox"},
"namespace": "default",
"labels": {"kueue.x-k8s.io/queue-name": "compute-queue"},
"completions": 1,
"restartPolicy": "Never"
}
)
See scripts/kube/setup-kueue.sh to install Kueue and create the required ResourceFlavor, ClusterQueue, LocalQueue, and PriorityClass resources on your cluster.
Jupyter Notebook Examples
Interactive notebooks are provided under examples/notebooks/client/.
| Notebook | Description |
|---|---|
| amsc_hello_world | Start here. Walks through installation, credential setup, creating a Client/Session, submitting a job, monitoring with session.wait(), and cleanup with session.destroy(). |
| amsc_gpt2_training_job | Submits a GPT-2 training job to a remote IRI compute resource, polls for completion, and fetches log output. |
| amsc_iri_multisite | Demonstrates multi-site job submission across ESnet IRI East and West endpoints using a single session. |
| amsc_iro_net_xfer | Uses the AMSC-IRO backend to orchestrate networked data-transfer jobs with L2 network metadata. |
Apache Airflow Support
The airflow/ subdirectory provides custom Airflow operators for submitting and monitoring IRI compute jobs as part of larger data pipelines.
Operators
IriJobSubmitOperator— Plans, submits, and waits for an IRI job. Acceptsservice_type,profile,executable,resources, andattributes. Pushesjob_idto XCom on completion.IriFetchOutputOperator— Downloads stdout/stderr from a completed job to a local directory.
Quick Start
cd airflow/
bash setup_airflow.sh --start # installs deps, initialises DB, launches standalone Airflow
Open http://localhost:8080, configure credentials in ~/.amscrot/credentials.yml, then trigger the demo DAG (esnet_iri_example or gpt2_training_job) from the UI or via the REST API:
curl -X POST http://localhost:8080/api/v2/dags/esnet_iri_example/dagRuns \
-H "Content-Type: application/json" \
-u "admin:<password>" -d '{}'
See airflow/README.md for the full operator reference and configuration options.
Metadata
Release files for amscrot-py 1.0.0.post17
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | Provenance | Actions |
|---|---|---|---|---|
| amscrot_py-1.0.0.post17.tar.gz | 206.2 kB | Without provenance | Details for amscrot_py-1.0.0.post17.tar.gz |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Actions Reset |
|---|---|---|---|---|
| amscrot_py-1.0.0.post17-py3-none-any.whl | Python 3 | none | any | Details for amscrot_py-1.0.0.post17-py3-none-any.whl |
Total release size: 472.5 kB
Release files / amscrot_py-1.0.0.post17.tar.gz
| Download URL | amscrot_py-1.0.0.post17.tar.gz |
|---|---|
| Size | 206.2 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
dffda6e55f9de4d6200d650a8d2fb659be27f8efa1f4ae9d7c387c0234d55ae3
|
|
BLAKE2b-256 checksum How to use checksums |
69451882bb44899682d42c3718d20ea7214c784318dd8830452e161cb5df9d93
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/6.2.0 CPython/3.12.12
|
Release files / amscrot_py-1.0.0.post17-py3-none-any.whl
| Download URL | amscrot_py-1.0.0.post17-py3-none-any.whl |
|---|---|
| Size | 266.2 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
8d5a1b51066f3cafb9b7dc9383360dcde650b2c611f966e1521791e308d1f54e
|
|
BLAKE2b-256 checksum How to use checksums |
df6e2c1ab7256f3051e59be7a2b5d9ee352d5600e9e02c71136c72933a17fa35
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/6.2.0 CPython/3.12.12
|
Security for amscrot-py 1.0.0.post17
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
No provenance found
None of the files in this release were uploaded with provenance metadata.
A note on package security
PyPI is a repository for distributing packages, not a service for auditing them. While third-party security researchers and our staff do their best to detect and remove malicious packages, PyPI cannot guarantee the quality, security or suitability of any given package.
To learn more about protecting yourself from malicious actors, visit our package security documentation.