openrunner-sdk 2.40.0__tar.gz → 2.40.1__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.
- {openrunner_sdk-2.40.0 → openrunner_sdk-2.40.1}/PKG-INFO +1 -1
- {openrunner_sdk-2.40.0 → openrunner_sdk-2.40.1}/openrunner/__init__.py +1 -1
- {openrunner_sdk-2.40.0 → openrunner_sdk-2.40.1}/openrunner/cli.py +20 -2
- {openrunner_sdk-2.40.0 → openrunner_sdk-2.40.1}/openrunner/gpu/api_integration.py +35 -0
- {openrunner_sdk-2.40.0 → openrunner_sdk-2.40.1}/openrunner/gpu/runner.py +51 -0
- {openrunner_sdk-2.40.0 → openrunner_sdk-2.40.1}/openrunner/install_commands.py +7 -0
- {openrunner_sdk-2.40.0 → openrunner_sdk-2.40.1}/pyproject.toml +1 -1
- openrunner_sdk-2.40.1/tests/test_gpu/test_ovh_training.py +47 -0
- {openrunner_sdk-2.40.0 → openrunner_sdk-2.40.1}/.gitignore +0 -0
- {openrunner_sdk-2.40.0 → openrunner_sdk-2.40.1}/=6.0 +0 -0
- {openrunner_sdk-2.40.0 → openrunner_sdk-2.40.1}/=8.1 +0 -0
- {openrunner_sdk-2.40.0 → openrunner_sdk-2.40.1}/README.md +0 -0
- {openrunner_sdk-2.40.0 → openrunner_sdk-2.40.1}/openrunner/CLAUDE.md +0 -0
- {openrunner_sdk-2.40.0 → openrunner_sdk-2.40.1}/openrunner/_safepath.py +0 -0
- {openrunner_sdk-2.40.0 → openrunner_sdk-2.40.1}/openrunner/_secret_rules.py +0 -0
- {openrunner_sdk-2.40.0 → openrunner_sdk-2.40.1}/openrunner/api_client.py +0 -0
- {openrunner_sdk-2.40.0 → openrunner_sdk-2.40.1}/openrunner/artifact.py +0 -0
- {openrunner_sdk-2.40.0 → openrunner_sdk-2.40.1}/openrunner/autoresearch.py +0 -0
- {openrunner_sdk-2.40.0 → openrunner_sdk-2.40.1}/openrunner/buffer.py +0 -0
- {openrunner_sdk-2.40.0 → openrunner_sdk-2.40.1}/openrunner/cache.py +0 -0
- {openrunner_sdk-2.40.0 → openrunner_sdk-2.40.1}/openrunner/config.py +0 -0
- {openrunner_sdk-2.40.0 → openrunner_sdk-2.40.1}/openrunner/cost.py +0 -0
- {openrunner_sdk-2.40.0 → openrunner_sdk-2.40.1}/openrunner/dataset.py +0 -0
- {openrunner_sdk-2.40.0 → openrunner_sdk-2.40.1}/openrunner/datasets.py +0 -0
- {openrunner_sdk-2.40.0 → openrunner_sdk-2.40.1}/openrunner/environment.py +0 -0
- {openrunner_sdk-2.40.0 → openrunner_sdk-2.40.1}/openrunner/evaluation.py +0 -0
- {openrunner_sdk-2.40.0 → openrunner_sdk-2.40.1}/openrunner/feedback.py +0 -0
- {openrunner_sdk-2.40.0 → openrunner_sdk-2.40.1}/openrunner/git_info.py +0 -0
- {openrunner_sdk-2.40.0 → openrunner_sdk-2.40.1}/openrunner/gpu/__init__.py +0 -0
- {openrunner_sdk-2.40.0 → openrunner_sdk-2.40.1}/openrunner/gpu/cost_guard.py +0 -0
- {openrunner_sdk-2.40.0 → openrunner_sdk-2.40.1}/openrunner/gpu/gpu_types.py +0 -0
- {openrunner_sdk-2.40.0 → openrunner_sdk-2.40.1}/openrunner/gpu/price_compare.py +0 -0
- {openrunner_sdk-2.40.0 → openrunner_sdk-2.40.1}/openrunner/gpu/provider_base.py +0 -0
- {openrunner_sdk-2.40.0 → openrunner_sdk-2.40.1}/openrunner/gpu/providers/__init__.py +0 -0
- {openrunner_sdk-2.40.0 → openrunner_sdk-2.40.1}/openrunner/gpu/providers/forge_provider.py +0 -0
- {openrunner_sdk-2.40.0 → openrunner_sdk-2.40.1}/openrunner/gpu/providers/lambda_cloud.py +0 -0
- {openrunner_sdk-2.40.0 → openrunner_sdk-2.40.1}/openrunner/gpu/providers/modal_provider.py +0 -0
- {openrunner_sdk-2.40.0 → openrunner_sdk-2.40.1}/openrunner/gpu/providers/ovhcloud.py +0 -0
- {openrunner_sdk-2.40.0 → openrunner_sdk-2.40.1}/openrunner/gpu/providers/runpod.py +0 -0
- {openrunner_sdk-2.40.0 → openrunner_sdk-2.40.1}/openrunner/gpu/providers/vastai.py +0 -0
- {openrunner_sdk-2.40.0 → openrunner_sdk-2.40.1}/openrunner/gpu/workspace_sync.py +0 -0
- {openrunner_sdk-2.40.0 → openrunner_sdk-2.40.1}/openrunner/guardrails.py +0 -0
- {openrunner_sdk-2.40.0 → openrunner_sdk-2.40.1}/openrunner/handover.py +0 -0
- {openrunner_sdk-2.40.0 → openrunner_sdk-2.40.1}/openrunner/hooks/patent-lab-post-commit +0 -0
- {openrunner_sdk-2.40.0 → openrunner_sdk-2.40.1}/openrunner/integration/__init__.py +0 -0
- {openrunner_sdk-2.40.0 → openrunner_sdk-2.40.1}/openrunner/integration/accelerate.py +0 -0
- {openrunner_sdk-2.40.0 → openrunner_sdk-2.40.1}/openrunner/integration/anthropic_tracer.py +0 -0
- {openrunner_sdk-2.40.0 → openrunner_sdk-2.40.1}/openrunner/integration/catboost.py +0 -0
- {openrunner_sdk-2.40.0 → openrunner_sdk-2.40.1}/openrunner/integration/diffusers.py +0 -0
- {openrunner_sdk-2.40.0 → openrunner_sdk-2.40.1}/openrunner/integration/fastai.py +0 -0
- {openrunner_sdk-2.40.0 → openrunner_sdk-2.40.1}/openrunner/integration/forced_alignment.py +0 -0
- {openrunner_sdk-2.40.0 → openrunner_sdk-2.40.1}/openrunner/integration/gladia.py +0 -0
- {openrunner_sdk-2.40.0 → openrunner_sdk-2.40.1}/openrunner/integration/gymnasium.py +0 -0
- {openrunner_sdk-2.40.0 → openrunner_sdk-2.40.1}/openrunner/integration/huggingface.py +0 -0
- {openrunner_sdk-2.40.0 → openrunner_sdk-2.40.1}/openrunner/integration/hydra.py +0 -0
- {openrunner_sdk-2.40.0 → openrunner_sdk-2.40.1}/openrunner/integration/ignite.py +0 -0
- {openrunner_sdk-2.40.0 → openrunner_sdk-2.40.1}/openrunner/integration/jax.py +0 -0
- {openrunner_sdk-2.40.0 → openrunner_sdk-2.40.1}/openrunner/integration/keras.py +0 -0
- {openrunner_sdk-2.40.0 → openrunner_sdk-2.40.1}/openrunner/integration/langchain.py +0 -0
- {openrunner_sdk-2.40.0 → openrunner_sdk-2.40.1}/openrunner/integration/lightgbm.py +0 -0
- {openrunner_sdk-2.40.0 → openrunner_sdk-2.40.1}/openrunner/integration/lightning.py +0 -0
- {openrunner_sdk-2.40.0 → openrunner_sdk-2.40.1}/openrunner/integration/llamaindex.py +0 -0
- {openrunner_sdk-2.40.0 → openrunner_sdk-2.40.1}/openrunner/integration/openai_finetune.py +0 -0
- {openrunner_sdk-2.40.0 → openrunner_sdk-2.40.1}/openrunner/integration/openai_tracer.py +0 -0
- {openrunner_sdk-2.40.0 → openrunner_sdk-2.40.1}/openrunner/integration/optuna.py +0 -0
- {openrunner_sdk-2.40.0 → openrunner_sdk-2.40.1}/openrunner/integration/pytorch.py +0 -0
- {openrunner_sdk-2.40.0 → openrunner_sdk-2.40.1}/openrunner/integration/sb3.py +0 -0
- {openrunner_sdk-2.40.0 → openrunner_sdk-2.40.1}/openrunner/integration/sklearn.py +0 -0
- {openrunner_sdk-2.40.0 → openrunner_sdk-2.40.1}/openrunner/integration/skypilot.py +0 -0
- {openrunner_sdk-2.40.0 → openrunner_sdk-2.40.1}/openrunner/integration/tensorflow.py +0 -0
- {openrunner_sdk-2.40.0 → openrunner_sdk-2.40.1}/openrunner/integration/trl.py +0 -0
- {openrunner_sdk-2.40.0 → openrunner_sdk-2.40.1}/openrunner/integration/tts.py +0 -0
- {openrunner_sdk-2.40.0 → openrunner_sdk-2.40.1}/openrunner/integration/ultralytics.py +0 -0
- {openrunner_sdk-2.40.0 → openrunner_sdk-2.40.1}/openrunner/integration/voice_agent.py +0 -0
- {openrunner_sdk-2.40.0 → openrunner_sdk-2.40.1}/openrunner/integration/whisper.py +0 -0
- {openrunner_sdk-2.40.0 → openrunner_sdk-2.40.1}/openrunner/integration/xgboost.py +0 -0
- {openrunner_sdk-2.40.0 → openrunner_sdk-2.40.1}/openrunner/launch.py +0 -0
- {openrunner_sdk-2.40.0 → openrunner_sdk-2.40.1}/openrunner/machine.py +0 -0
- {openrunner_sdk-2.40.0 → openrunner_sdk-2.40.1}/openrunner/mcp_server.py +0 -0
- {openrunner_sdk-2.40.0 → openrunner_sdk-2.40.1}/openrunner/media.py +0 -0
- {openrunner_sdk-2.40.0 → openrunner_sdk-2.40.1}/openrunner/migrate.py +0 -0
- {openrunner_sdk-2.40.0 → openrunner_sdk-2.40.1}/openrunner/model.py +0 -0
- {openrunner_sdk-2.40.0 → openrunner_sdk-2.40.1}/openrunner/model_card.py +0 -0
- {openrunner_sdk-2.40.0 → openrunner_sdk-2.40.1}/openrunner/offline.py +0 -0
- {openrunner_sdk-2.40.0 → openrunner_sdk-2.40.1}/openrunner/patent_scan.py +0 -0
- {openrunner_sdk-2.40.0 → openrunner_sdk-2.40.1}/openrunner/pii.py +0 -0
- {openrunner_sdk-2.40.0 → openrunner_sdk-2.40.1}/openrunner/plot.py +0 -0
- {openrunner_sdk-2.40.0 → openrunner_sdk-2.40.1}/openrunner/projects.py +0 -0
- {openrunner_sdk-2.40.0 → openrunner_sdk-2.40.1}/openrunner/prompt.py +0 -0
- {openrunner_sdk-2.40.0 → openrunner_sdk-2.40.1}/openrunner/query_api.py +0 -0
- {openrunner_sdk-2.40.0 → openrunner_sdk-2.40.1}/openrunner/redact.py +0 -0
- {openrunner_sdk-2.40.0 → openrunner_sdk-2.40.1}/openrunner/reload.py +0 -0
- {openrunner_sdk-2.40.0 → openrunner_sdk-2.40.1}/openrunner/research.py +0 -0
- {openrunner_sdk-2.40.0 → openrunner_sdk-2.40.1}/openrunner/research_policy.py +0 -0
- {openrunner_sdk-2.40.0 → openrunner_sdk-2.40.1}/openrunner/run.py +0 -0
- {openrunner_sdk-2.40.0 → openrunner_sdk-2.40.1}/openrunner/scorers.py +0 -0
- {openrunner_sdk-2.40.0 → openrunner_sdk-2.40.1}/openrunner/sender.py +0 -0
- {openrunner_sdk-2.40.0 → openrunner_sdk-2.40.1}/openrunner/session.py +0 -0
- {openrunner_sdk-2.40.0 → openrunner_sdk-2.40.1}/openrunner/settings.py +0 -0
- {openrunner_sdk-2.40.0 → openrunner_sdk-2.40.1}/openrunner/summary.py +0 -0
- {openrunner_sdk-2.40.0 → openrunner_sdk-2.40.1}/openrunner/sweep.py +0 -0
- {openrunner_sdk-2.40.0 → openrunner_sdk-2.40.1}/openrunner/sync.py +0 -0
- {openrunner_sdk-2.40.0 → openrunner_sdk-2.40.1}/openrunner/system_metrics.py +0 -0
- {openrunner_sdk-2.40.0 → openrunner_sdk-2.40.1}/openrunner/tensorboard.py +0 -0
- {openrunner_sdk-2.40.0 → openrunner_sdk-2.40.1}/openrunner/tools/__init__.py +0 -0
- {openrunner_sdk-2.40.0 → openrunner_sdk-2.40.1}/openrunner/tools/patent_report.py +0 -0
- {openrunner_sdk-2.40.0 → openrunner_sdk-2.40.1}/openrunner/trace.py +0 -0
- {openrunner_sdk-2.40.0 → openrunner_sdk-2.40.1}/openrunner/transcript_formatter.py +0 -0
- {openrunner_sdk-2.40.0 → openrunner_sdk-2.40.1}/openrunner/wal.py +0 -0
- {openrunner_sdk-2.40.0 → openrunner_sdk-2.40.1}/openrunner/wandb_compat/__init__.py +0 -0
- {openrunner_sdk-2.40.0 → openrunner_sdk-2.40.1}/openrunner/wandb_compat/_shim.py +0 -0
- {openrunner_sdk-2.40.0 → openrunner_sdk-2.40.1}/openrunner/wer.py +0 -0
- {openrunner_sdk-2.40.0 → openrunner_sdk-2.40.1}/scripts/gen_betterleaks_rules.py +0 -0
- {openrunner_sdk-2.40.0 → openrunner_sdk-2.40.1}/tests/__init__.py +0 -0
- {openrunner_sdk-2.40.0 → openrunner_sdk-2.40.1}/tests/conftest.py +0 -0
- {openrunner_sdk-2.40.0 → openrunner_sdk-2.40.1}/tests/fixtures/wandb-export-mini/run-aaa/config.json +0 -0
- {openrunner_sdk-2.40.0 → openrunner_sdk-2.40.1}/tests/fixtures/wandb-export-mini/run-aaa/metadata.json +0 -0
- {openrunner_sdk-2.40.0 → openrunner_sdk-2.40.1}/tests/fixtures/wandb-export-mini/run-aaa/metrics.jsonl +0 -0
- {openrunner_sdk-2.40.0 → openrunner_sdk-2.40.1}/tests/fixtures/wandb-export-mini/run-aaa/summary.json +0 -0
- {openrunner_sdk-2.40.0 → openrunner_sdk-2.40.1}/tests/fixtures/wandb-export-mini/run-bbb/artifacts/model-checkpoint/manifest.json +0 -0
- {openrunner_sdk-2.40.0 → openrunner_sdk-2.40.1}/tests/fixtures/wandb-export-mini/run-bbb/artifacts/model-checkpoint/weights.bin +0 -0
- {openrunner_sdk-2.40.0 → openrunner_sdk-2.40.1}/tests/fixtures/wandb-export-mini/run-bbb/artifacts/sample-image/manifest.json +0 -0
- {openrunner_sdk-2.40.0 → openrunner_sdk-2.40.1}/tests/fixtures/wandb-export-mini/run-bbb/artifacts/sample-image/preview.png +0 -0
- {openrunner_sdk-2.40.0 → openrunner_sdk-2.40.1}/tests/fixtures/wandb-export-mini/run-bbb/config.json +0 -0
- {openrunner_sdk-2.40.0 → openrunner_sdk-2.40.1}/tests/fixtures/wandb-export-mini/run-bbb/metadata.json +0 -0
- {openrunner_sdk-2.40.0 → openrunner_sdk-2.40.1}/tests/fixtures/wandb-export-mini/run-bbb/metrics.jsonl +0 -0
- {openrunner_sdk-2.40.0 → openrunner_sdk-2.40.1}/tests/fixtures/wandb-export-mini/run-bbb/summary.json +0 -0
- {openrunner_sdk-2.40.0 → openrunner_sdk-2.40.1}/tests/integration/__init__.py +0 -0
- {openrunner_sdk-2.40.0 → openrunner_sdk-2.40.1}/tests/integration/conftest.py +0 -0
- {openrunner_sdk-2.40.0 → openrunner_sdk-2.40.1}/tests/integration/test_artifact_round_trip.py +0 -0
- {openrunner_sdk-2.40.0 → openrunner_sdk-2.40.1}/tests/test_alert.py +0 -0
- {openrunner_sdk-2.40.0 → openrunner_sdk-2.40.1}/tests/test_aliases.py +0 -0
- {openrunner_sdk-2.40.0 → openrunner_sdk-2.40.1}/tests/test_api_client.py +0 -0
- {openrunner_sdk-2.40.0 → openrunner_sdk-2.40.1}/tests/test_api_client_methods.py +0 -0
- {openrunner_sdk-2.40.0 → openrunner_sdk-2.40.1}/tests/test_api_client_transport.py +0 -0
- {openrunner_sdk-2.40.0 → openrunner_sdk-2.40.1}/tests/test_artifact.py +0 -0
- {openrunner_sdk-2.40.0 → openrunner_sdk-2.40.1}/tests/test_buffer.py +0 -0
- {openrunner_sdk-2.40.0 → openrunner_sdk-2.40.1}/tests/test_cache.py +0 -0
- {openrunner_sdk-2.40.0 → openrunner_sdk-2.40.1}/tests/test_class_scorers.py +0 -0
- {openrunner_sdk-2.40.0 → openrunner_sdk-2.40.1}/tests/test_cli.py +0 -0
- {openrunner_sdk-2.40.0 → openrunner_sdk-2.40.1}/tests/test_cli_artifact_sweep.py +0 -0
- {openrunner_sdk-2.40.0 → openrunner_sdk-2.40.1}/tests/test_cli_datasets.py +0 -0
- {openrunner_sdk-2.40.0 → openrunner_sdk-2.40.1}/tests/test_cli_gpu_registry_deploy.py +0 -0
- {openrunner_sdk-2.40.0 → openrunner_sdk-2.40.1}/tests/test_cli_infra.py +0 -0
- {openrunner_sdk-2.40.0 → openrunner_sdk-2.40.1}/tests/test_cli_remainder.py +0 -0
- {openrunner_sdk-2.40.0 → openrunner_sdk-2.40.1}/tests/test_cli_topup.py +0 -0
- {openrunner_sdk-2.40.0 → openrunner_sdk-2.40.1}/tests/test_config.py +0 -0
- {openrunner_sdk-2.40.0 → openrunner_sdk-2.40.1}/tests/test_datasets_module.py +0 -0
- {openrunner_sdk-2.40.0 → openrunner_sdk-2.40.1}/tests/test_evaluation.py +0 -0
- {openrunner_sdk-2.40.0 → openrunner_sdk-2.40.1}/tests/test_finish.py +0 -0
- {openrunner_sdk-2.40.0 → openrunner_sdk-2.40.1}/tests/test_git_info.py +0 -0
- {openrunner_sdk-2.40.0 → openrunner_sdk-2.40.1}/tests/test_gpu/__init__.py +0 -0
- {openrunner_sdk-2.40.0 → openrunner_sdk-2.40.1}/tests/test_gpu/conftest.py +0 -0
- {openrunner_sdk-2.40.0 → openrunner_sdk-2.40.1}/tests/test_gpu/test_cost_guard.py +0 -0
- {openrunner_sdk-2.40.0 → openrunner_sdk-2.40.1}/tests/test_gpu/test_engine_serverside.py +0 -0
- {openrunner_sdk-2.40.0 → openrunner_sdk-2.40.1}/tests/test_gpu/test_forge.py +0 -0
- {openrunner_sdk-2.40.0 → openrunner_sdk-2.40.1}/tests/test_gpu/test_governed_jobs.py +0 -0
- {openrunner_sdk-2.40.0 → openrunner_sdk-2.40.1}/tests/test_gpu/test_gpu_cluster.py +0 -0
- {openrunner_sdk-2.40.0 → openrunner_sdk-2.40.1}/tests/test_gpu/test_gpu_types.py +0 -0
- {openrunner_sdk-2.40.0 → openrunner_sdk-2.40.1}/tests/test_gpu/test_lambda.py +0 -0
- {openrunner_sdk-2.40.0 → openrunner_sdk-2.40.1}/tests/test_gpu/test_modal.py +0 -0
- {openrunner_sdk-2.40.0 → openrunner_sdk-2.40.1}/tests/test_gpu/test_ovhcloud.py +0 -0
- {openrunner_sdk-2.40.0 → openrunner_sdk-2.40.1}/tests/test_gpu/test_price_compare.py +0 -0
- {openrunner_sdk-2.40.0 → openrunner_sdk-2.40.1}/tests/test_gpu/test_provider_base.py +0 -0
- {openrunner_sdk-2.40.0 → openrunner_sdk-2.40.1}/tests/test_gpu/test_runner.py +0 -0
- {openrunner_sdk-2.40.0 → openrunner_sdk-2.40.1}/tests/test_gpu/test_runpod.py +0 -0
- {openrunner_sdk-2.40.0 → openrunner_sdk-2.40.1}/tests/test_gpu/test_sdk_gpu_api.py +0 -0
- {openrunner_sdk-2.40.0 → openrunner_sdk-2.40.1}/tests/test_gpu/test_vastai.py +0 -0
- {openrunner_sdk-2.40.0 → openrunner_sdk-2.40.1}/tests/test_gpu/test_workspace_sync.py +0 -0
- {openrunner_sdk-2.40.0 → openrunner_sdk-2.40.1}/tests/test_gpu_modal_creds.py +0 -0
- {openrunner_sdk-2.40.0 → openrunner_sdk-2.40.1}/tests/test_init.py +0 -0
- {openrunner_sdk-2.40.0 → openrunner_sdk-2.40.1}/tests/test_init_facade.py +0 -0
- {openrunner_sdk-2.40.0 → openrunner_sdk-2.40.1}/tests/test_install_commands.py +0 -0
- {openrunner_sdk-2.40.0 → openrunner_sdk-2.40.1}/tests/test_integration_fastai.py +0 -0
- {openrunner_sdk-2.40.0 → openrunner_sdk-2.40.1}/tests/test_integration_huggingface.py +0 -0
- {openrunner_sdk-2.40.0 → openrunner_sdk-2.40.1}/tests/test_integration_keras.py +0 -0
- {openrunner_sdk-2.40.0 → openrunner_sdk-2.40.1}/tests/test_integration_langchain.py +0 -0
- {openrunner_sdk-2.40.0 → openrunner_sdk-2.40.1}/tests/test_integration_lightning.py +0 -0
- {openrunner_sdk-2.40.0 → openrunner_sdk-2.40.1}/tests/test_integration_pytorch.py +0 -0
- {openrunner_sdk-2.40.0 → openrunner_sdk-2.40.1}/tests/test_integration_setA.py +0 -0
- {openrunner_sdk-2.40.0 → openrunner_sdk-2.40.1}/tests/test_integration_setB.py +0 -0
- {openrunner_sdk-2.40.0 → openrunner_sdk-2.40.1}/tests/test_integration_setC.py +0 -0
- {openrunner_sdk-2.40.0 → openrunner_sdk-2.40.1}/tests/test_integration_sklearn.py +0 -0
- {openrunner_sdk-2.40.0 → openrunner_sdk-2.40.1}/tests/test_integration_xgboost.py +0 -0
- {openrunner_sdk-2.40.0 → openrunner_sdk-2.40.1}/tests/test_launch.py +0 -0
- {openrunner_sdk-2.40.0 → openrunner_sdk-2.40.1}/tests/test_log.py +0 -0
- {openrunner_sdk-2.40.0 → openrunner_sdk-2.40.1}/tests/test_log_code.py +0 -0
- {openrunner_sdk-2.40.0 → openrunner_sdk-2.40.1}/tests/test_machine_migrate.py +0 -0
- {openrunner_sdk-2.40.0 → openrunner_sdk-2.40.1}/tests/test_mcp_decisions.py +0 -0
- {openrunner_sdk-2.40.0 → openrunner_sdk-2.40.1}/tests/test_mcp_monitor.py +0 -0
- {openrunner_sdk-2.40.0 → openrunner_sdk-2.40.1}/tests/test_mcp_predictions.py +0 -0
- {openrunner_sdk-2.40.0 → openrunner_sdk-2.40.1}/tests/test_mcp_server.py +0 -0
- {openrunner_sdk-2.40.0 → openrunner_sdk-2.40.1}/tests/test_media.py +0 -0
- {openrunner_sdk-2.40.0 → openrunner_sdk-2.40.1}/tests/test_media_extra.py +0 -0
- {openrunner_sdk-2.40.0 → openrunner_sdk-2.40.1}/tests/test_migrate.py +0 -0
- {openrunner_sdk-2.40.0 → openrunner_sdk-2.40.1}/tests/test_offline.py +0 -0
- {openrunner_sdk-2.40.0 → openrunner_sdk-2.40.1}/tests/test_offline_sync.py +0 -0
- {openrunner_sdk-2.40.0 → openrunner_sdk-2.40.1}/tests/test_patent_scan.py +0 -0
- {openrunner_sdk-2.40.0 → openrunner_sdk-2.40.1}/tests/test_pii.py +0 -0
- {openrunner_sdk-2.40.0 → openrunner_sdk-2.40.1}/tests/test_plot.py +0 -0
- {openrunner_sdk-2.40.0 → openrunner_sdk-2.40.1}/tests/test_plot_media_extra2.py +0 -0
- {openrunner_sdk-2.40.0 → openrunner_sdk-2.40.1}/tests/test_prompt_module.py +0 -0
- {openrunner_sdk-2.40.0 → openrunner_sdk-2.40.1}/tests/test_pure_modules.py +0 -0
- {openrunner_sdk-2.40.0 → openrunner_sdk-2.40.1}/tests/test_query_api.py +0 -0
- {openrunner_sdk-2.40.0 → openrunner_sdk-2.40.1}/tests/test_redact.py +0 -0
- {openrunner_sdk-2.40.0 → openrunner_sdk-2.40.1}/tests/test_reload_module.py +0 -0
- {openrunner_sdk-2.40.0 → openrunner_sdk-2.40.1}/tests/test_research_module.py +0 -0
- {openrunner_sdk-2.40.0 → openrunner_sdk-2.40.1}/tests/test_resume.py +0 -0
- {openrunner_sdk-2.40.0 → openrunner_sdk-2.40.1}/tests/test_run_module.py +0 -0
- {openrunner_sdk-2.40.0 → openrunner_sdk-2.40.1}/tests/test_sdk_cluster_j1.py +0 -0
- {openrunner_sdk-2.40.0 → openrunner_sdk-2.40.1}/tests/test_sdk_cluster_j2.py +0 -0
- {openrunner_sdk-2.40.0 → openrunner_sdk-2.40.1}/tests/test_sdk_cluster_j3.py +0 -0
- {openrunner_sdk-2.40.0 → openrunner_sdk-2.40.1}/tests/test_sdk_cluster_j4.py +0 -0
- {openrunner_sdk-2.40.0 → openrunner_sdk-2.40.1}/tests/test_sdk_core_edges.py +0 -0
- {openrunner_sdk-2.40.0 → openrunner_sdk-2.40.1}/tests/test_sdk_features.py +0 -0
- {openrunner_sdk-2.40.0 → openrunner_sdk-2.40.1}/tests/test_sender.py +0 -0
- {openrunner_sdk-2.40.0 → openrunner_sdk-2.40.1}/tests/test_session_module.py +0 -0
- {openrunner_sdk-2.40.0 → openrunner_sdk-2.40.1}/tests/test_session_sync.py +0 -0
- {openrunner_sdk-2.40.0 → openrunner_sdk-2.40.1}/tests/test_summary.py +0 -0
- {openrunner_sdk-2.40.0 → openrunner_sdk-2.40.1}/tests/test_sweep.py +0 -0
- {openrunner_sdk-2.40.0 → openrunner_sdk-2.40.1}/tests/test_system_metrics.py +0 -0
- {openrunner_sdk-2.40.0 → openrunner_sdk-2.40.1}/tests/test_topup_hi.py +0 -0
- {openrunner_sdk-2.40.0 → openrunner_sdk-2.40.1}/tests/test_trace.py +0 -0
- {openrunner_sdk-2.40.0 → openrunner_sdk-2.40.1}/tests/test_wandb_compat.py +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: openrunner-sdk
|
|
3
|
-
Version: 2.40.
|
|
3
|
+
Version: 2.40.1
|
|
4
4
|
Summary: OpenRunner SDK - W&B-compatible ML experiment tracking client
|
|
5
5
|
Project-URL: Homepage, https://github.com/jqueguiner/openrunner
|
|
6
6
|
Project-URL: Repository, https://github.com/jqueguiner/openrunner
|
|
@@ -181,7 +181,7 @@ launch.from_run = _launch_from_run # type: ignore[attr-defined]
|
|
|
181
181
|
# openrunner.trace.patch_openai() syntax
|
|
182
182
|
trace.patch_openai = _patch_openai # type: ignore[attr-defined]
|
|
183
183
|
|
|
184
|
-
__version__ = "2.40.
|
|
184
|
+
__version__ = "2.40.1"
|
|
185
185
|
|
|
186
186
|
logger = logging.getLogger("openrunner")
|
|
187
187
|
|
|
@@ -4244,8 +4244,8 @@ def gpu_run(command, provider, gpu, gpu_count, image, disk_gb, env, ssh_keys, pr
|
|
|
4244
4244
|
"""
|
|
4245
4245
|
from openrunner.gpu.runner import run_governed_sync, run_on_gpu_sync
|
|
4246
4246
|
|
|
4247
|
-
if provider not in ("forge", "modal") and not gpu:
|
|
4248
|
-
click.echo("Error: --gpu is required (except for forge/modal).", err=True)
|
|
4247
|
+
if provider not in ("forge", "modal", "ovhai") and not gpu:
|
|
4248
|
+
click.echo("Error: --gpu is required (except for forge/modal/ovhai).", err=True)
|
|
4249
4249
|
raise SystemExit(1)
|
|
4250
4250
|
|
|
4251
4251
|
settings = _load_settings()
|
|
@@ -4294,6 +4294,24 @@ def gpu_run(command, provider, gpu, gpu_count, image, disk_gb, env, ssh_keys, pr
|
|
|
4294
4294
|
# injected server-side (the token never touches this machine). COMMAND is the
|
|
4295
4295
|
# App script. A caller who explicitly supplies the token via -e (FORGE_TOKEN /
|
|
4296
4296
|
# MODAL_TOKEN_SECRET) opts into running the engine client locally instead.
|
|
4297
|
+
# OVH AI Training — governed managed batch job, submitted server-side with the
|
|
4298
|
+
# org's OVH credential (keys never leave the API). COMMAND runs in --image on
|
|
4299
|
+
# --gpu-count GPUs; data comes from OpenRunner (no OVH object-storage volumes).
|
|
4300
|
+
if provider == "ovhai":
|
|
4301
|
+
if image == "pytorch/pytorch:2.4.0-cuda12.4-cudnn9-runtime":
|
|
4302
|
+
click.echo("Error: --image is required for ovhai (the training image).", err=True)
|
|
4303
|
+
raise SystemExit(1)
|
|
4304
|
+
from openrunner.gpu.runner import run_ovh_training_sync
|
|
4305
|
+
try:
|
|
4306
|
+
result = run_ovh_training_sync(
|
|
4307
|
+
command=command, image=image, gpu=gpu_count, project=project,
|
|
4308
|
+
emit=lambda m: click.echo(m),
|
|
4309
|
+
)
|
|
4310
|
+
except Exception as exc: # noqa: BLE001
|
|
4311
|
+
click.echo(f"gpu run failed: {exc}", err=True)
|
|
4312
|
+
raise SystemExit(1)
|
|
4313
|
+
raise SystemExit(result["exit_code"])
|
|
4314
|
+
|
|
4297
4315
|
if provider in ("forge", "modal"):
|
|
4298
4316
|
_DEFAULT_IMAGE = "pytorch/pytorch:2.4.0-cuda12.4-cudnn9-runtime"
|
|
4299
4317
|
local_tok = env_dict.get("FORGE_TOKEN") if provider == "forge" else env_dict.get("MODAL_TOKEN_SECRET")
|
|
@@ -408,6 +408,41 @@ class GpuAPIClient:
|
|
|
408
408
|
logger.warning("get_job failed: %s", e)
|
|
409
409
|
return None
|
|
410
410
|
|
|
411
|
+
def ovh_training_run(
|
|
412
|
+
self, *, image: str, command: str, gpu: int = 1,
|
|
413
|
+
name: str | None = None, project_id: str | None = None,
|
|
414
|
+
) -> dict[str, Any] | None:
|
|
415
|
+
"""POST /api/v1/gpu/ai-training/run -- submit an OVH AI Training job
|
|
416
|
+
server-side (the OVH credential never leaves the API). Returns
|
|
417
|
+
{job_id,status} or None."""
|
|
418
|
+
org = self.org_id()
|
|
419
|
+
body: dict[str, Any] = {"image": image, "command": command, "gpu": gpu}
|
|
420
|
+
if name:
|
|
421
|
+
body["name"] = name
|
|
422
|
+
if project_id:
|
|
423
|
+
body["project_id"] = project_id
|
|
424
|
+
try:
|
|
425
|
+
r = self._client.post("/gpu/ai-training/run", params={"org_id": org}, json=body)
|
|
426
|
+
r.raise_for_status()
|
|
427
|
+
return r.json()
|
|
428
|
+
except Exception as e:
|
|
429
|
+
detail = getattr(getattr(e, "response", None), "text", "") or str(e)
|
|
430
|
+
logger.warning("ovh_training_run failed: %s", detail)
|
|
431
|
+
return None
|
|
432
|
+
|
|
433
|
+
def ovh_training_status(self, job_id: str) -> dict[str, Any] | None:
|
|
434
|
+
"""GET /api/v1/gpu/ai-training/{id} -- poll status + logs."""
|
|
435
|
+
try:
|
|
436
|
+
r = self._client.get(
|
|
437
|
+
f"/gpu/ai-training/{job_id}", params={"org_id": self.org_id()}
|
|
438
|
+
)
|
|
439
|
+
if r.status_code >= 400:
|
|
440
|
+
return None
|
|
441
|
+
return r.json()
|
|
442
|
+
except Exception as e:
|
|
443
|
+
logger.warning("ovh_training_status failed: %s", e)
|
|
444
|
+
return None
|
|
445
|
+
|
|
411
446
|
# ------------------------------------------------------------------
|
|
412
447
|
# Lifecycle
|
|
413
448
|
# ------------------------------------------------------------------
|
|
@@ -526,6 +526,57 @@ def run_engine_job_sync(
|
|
|
526
526
|
"`openrunner runner start` on a box in this org (needs Docker).")
|
|
527
527
|
|
|
528
528
|
|
|
529
|
+
def run_ovh_training_sync(
|
|
530
|
+
*,
|
|
531
|
+
command: str,
|
|
532
|
+
image: str,
|
|
533
|
+
gpu: int = 1,
|
|
534
|
+
project: str | None = None,
|
|
535
|
+
name: str | None = None,
|
|
536
|
+
emit: Callable[[str], None] | None = None,
|
|
537
|
+
poll_interval: float = 5.0,
|
|
538
|
+
) -> dict[str, Any]:
|
|
539
|
+
"""Governed OVH AI Training run — SERVER-SIDE. Submits a job (the OVH keys
|
|
540
|
+
stay in the API vault, never on this machine), then polls status + logs until
|
|
541
|
+
it finishes. COMMAND runs in IMAGE on `gpu` GPUs. Data comes from OpenRunner
|
|
542
|
+
(datasets/artifacts) — no OVH object-storage volumes. Returns
|
|
543
|
+
``{"job_id","exit_code"}``."""
|
|
544
|
+
from openrunner.gpu import _get_api_client
|
|
545
|
+
|
|
546
|
+
say = emit or (lambda m: print(m, flush=True))
|
|
547
|
+
client = _get_api_client()
|
|
548
|
+
if client is None:
|
|
549
|
+
raise RuntimeError("Not logged in. Run 'openrunner login' first.")
|
|
550
|
+
|
|
551
|
+
say(f"[openrunner] submitting OVH AI Training job (image={image}, gpu={gpu}) "
|
|
552
|
+
"— OVH keys stay server-side ...")
|
|
553
|
+
res = client.ovh_training_run(image=image, command=command, gpu=gpu,
|
|
554
|
+
name=name, project_id=project)
|
|
555
|
+
if not res or not res.get("job_id"):
|
|
556
|
+
raise RuntimeError(
|
|
557
|
+
"failed to submit OVH AI Training job — need an org 'ovhcloud' "
|
|
558
|
+
"credential (openrunner gpu credentials add --provider ovhcloud ...)."
|
|
559
|
+
)
|
|
560
|
+
jid = res["job_id"]
|
|
561
|
+
say(f"[openrunner] OVH job {jid} ({res.get('status')}) — streaming ...")
|
|
562
|
+
|
|
563
|
+
seen = 0
|
|
564
|
+
while True:
|
|
565
|
+
time.sleep(poll_interval)
|
|
566
|
+
st = client.ovh_training_status(jid) or {}
|
|
567
|
+
logs = st.get("logs") or ""
|
|
568
|
+
if len(logs) > seen:
|
|
569
|
+
say(logs[seen:].rstrip("\n"))
|
|
570
|
+
seen = len(logs)
|
|
571
|
+
status = st.get("status")
|
|
572
|
+
if status in ("terminated", "error"):
|
|
573
|
+
code = st.get("exit_code")
|
|
574
|
+
if code is None:
|
|
575
|
+
code = 0 if status == "terminated" else 1
|
|
576
|
+
say(f"[openrunner] OVH AI Training job {status} (exit={code}).")
|
|
577
|
+
return {"job_id": jid, "exit_code": int(code)}
|
|
578
|
+
|
|
579
|
+
|
|
529
580
|
def run_engine_serverside_sync(
|
|
530
581
|
*,
|
|
531
582
|
provider: str,
|
|
@@ -3599,6 +3599,13 @@ mentions a "distant GPU":
|
|
|
3599
3599
|
SCRIPT (GPU is declared in `@app.function(gpu=...)`, so no `--gpu`), the Run
|
|
3600
3600
|
auto-terminates when the function returns. Don't hunt for an SSH host/runner.
|
|
3601
3601
|
For native Forge use, the `forge-deploy` skill covers install/auth/write/run.
|
|
3602
|
+
- OVHcloud **AI Training** (managed GPU batch jobs): governed, submitted
|
|
3603
|
+
SERVER-SIDE with the org's OVH credential (the `ovhcloud` app/secret/consumer
|
|
3604
|
+
keys, never on the client). Run:
|
|
3605
|
+
`openrunner gpu run --provider ovhai --image <img> --gpu-count N "<train cmd>"`
|
|
3606
|
+
-- COMMAND runs in the image on N GPUs; poll streams logs; it auto-stops when
|
|
3607
|
+
the command exits. **Do NOT use OVH object-storage `--volume` mounts** -- data
|
|
3608
|
+
comes from OpenRunner (datasets/artifacts). Needs an `ovhcloud` credential.
|
|
3602
3609
|
- Provider keys are stored encrypted with `openrunner gpu credentials add`
|
|
3603
3610
|
(e.g. `--provider forge --api-key fg_..`); list/kill pods with
|
|
3604
3611
|
`openrunner gpu ls` / `openrunner gpu terminate`. Governed compute -- the key
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
"""SDK OVH AI Training governed run (server-side; OVH keys never on client)."""
|
|
2
|
+
|
|
3
|
+
from __future__ import annotations
|
|
4
|
+
|
|
5
|
+
from unittest.mock import patch
|
|
6
|
+
|
|
7
|
+
from openrunner.gpu import runner as R
|
|
8
|
+
|
|
9
|
+
|
|
10
|
+
class _Fake:
|
|
11
|
+
def __init__(self, statuses):
|
|
12
|
+
self.run_args = None
|
|
13
|
+
self._st = list(statuses)
|
|
14
|
+
|
|
15
|
+
def ovh_training_run(self, **kwargs):
|
|
16
|
+
self.run_args = kwargs
|
|
17
|
+
return {"job_id": "ai-1", "status": "queued"}
|
|
18
|
+
|
|
19
|
+
def ovh_training_status(self, job_id):
|
|
20
|
+
return self._st.pop(0) if self._st else {"status": "terminated", "exit_code": 0}
|
|
21
|
+
|
|
22
|
+
|
|
23
|
+
def test_ovh_training_submits_and_streams():
|
|
24
|
+
fake = _Fake([
|
|
25
|
+
{"status": "running", "logs": "epoch 1\n"},
|
|
26
|
+
{"status": "running", "logs": "epoch 1\nepoch 2\n"},
|
|
27
|
+
{"status": "terminated", "exit_code": 0, "logs": "epoch 1\nepoch 2\ndone\n"},
|
|
28
|
+
])
|
|
29
|
+
lines: list[str] = []
|
|
30
|
+
with patch("openrunner.gpu._get_api_client", return_value=fake):
|
|
31
|
+
res = R.run_ovh_training_sync(
|
|
32
|
+
command="python train.py", image="ovhcom/ai-training-pytorch",
|
|
33
|
+
gpu=2, emit=lines.append, poll_interval=0,
|
|
34
|
+
)
|
|
35
|
+
assert res == {"job_id": "ai-1", "exit_code": 0}
|
|
36
|
+
assert fake.run_args["image"] == "ovhcom/ai-training-pytorch"
|
|
37
|
+
assert fake.run_args["gpu"] == 2
|
|
38
|
+
assert fake.run_args["command"] == "python train.py"
|
|
39
|
+
assert any("done" in ln for ln in lines)
|
|
40
|
+
|
|
41
|
+
|
|
42
|
+
def test_ovh_training_nonzero_exit():
|
|
43
|
+
fake = _Fake([{"status": "error", "exit_code": 7, "logs": "boom\n"}])
|
|
44
|
+
with patch("openrunner.gpu._get_api_client", return_value=fake):
|
|
45
|
+
res = R.run_ovh_training_sync(command="x", image="i", emit=lambda _l: None,
|
|
46
|
+
poll_interval=0)
|
|
47
|
+
assert res["exit_code"] == 7
|
|
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
|
|
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
|
|
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
|
{openrunner_sdk-2.40.0 → openrunner_sdk-2.40.1}/tests/fixtures/wandb-export-mini/run-aaa/config.json
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{openrunner_sdk-2.40.0 → openrunner_sdk-2.40.1}/tests/fixtures/wandb-export-mini/run-bbb/config.json
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{openrunner_sdk-2.40.0 → openrunner_sdk-2.40.1}/tests/integration/test_artifact_round_trip.py
RENAMED
|
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
|
|
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
|
|
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
|