runpod 2.0.0rc1__tar.gz → 2.0.1.dev1__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.
- {runpod-2.0.0rc1 → runpod-2.0.1.dev1}/.github/workflows/cd.yml +6 -6
- {runpod-2.0.0rc1 → runpod-2.0.1.dev1}/.github/workflows/ci.yml +10 -7
- {runpod-2.0.0rc1 → runpod-2.0.1.dev1}/.github/workflows/vhs.yml +1 -1
- {runpod-2.0.0rc1 → runpod-2.0.1.dev1}/CHANGELOG.md +25 -0
- {runpod-2.0.0rc1/runpod.egg-info → runpod-2.0.1.dev1}/PKG-INFO +17 -11
- {runpod-2.0.0rc1 → runpod-2.0.1.dev1}/README.md +4 -0
- {runpod-2.0.0rc1 → runpod-2.0.1.dev1}/docs/serverless/volume_cache.md +22 -4
- {runpod-2.0.0rc1 → runpod-2.0.1.dev1}/pytest.ini +1 -0
- {runpod-2.0.0rc1 → runpod-2.0.1.dev1}/requirements.txt +12 -10
- {runpod-2.0.0rc1 → runpod-2.0.1.dev1}/runpod/_health/gpu.py +17 -5
- {runpod-2.0.0rc1 → runpod-2.0.1.dev1}/runpod/_health/system.py +82 -8
- {runpod-2.0.0rc1 → runpod-2.0.1.dev1}/runpod/_version.py +3 -3
- {runpod-2.0.0rc1 → runpod-2.0.1.dev1}/runpod/api/mutations/apps.py +0 -6
- {runpod-2.0.0rc1 → runpod-2.0.1.dev1}/runpod/api/queries/apps.py +0 -8
- {runpod-2.0.0rc1 → runpod-2.0.1.dev1}/runpod/api/rest.py +62 -6
- {runpod-2.0.0rc1 → runpod-2.0.1.dev1}/runpod/apps/api.py +31 -10
- runpod-2.0.1.dev1/runpod/apps/auth.py +185 -0
- runpod-2.0.1.dev1/runpod/apps/build.py +722 -0
- {runpod-2.0.0rc1 → runpod-2.0.1.dev1}/runpod/apps/deploy.py +8 -2
- {runpod-2.0.0rc1 → runpod-2.0.1.dev1}/runpod/apps/dev.py +51 -8
- {runpod-2.0.0rc1 → runpod-2.0.1.dev1}/runpod/apps/gpu.py +160 -11
- {runpod-2.0.0rc1 → runpod-2.0.1.dev1}/runpod/apps/logs.py +46 -16
- {runpod-2.0.0rc1 → runpod-2.0.1.dev1}/runpod/apps/volume.py +27 -1
- {runpod-2.0.0rc1 → runpod-2.0.1.dev1}/runpod/cli/groups/ssh/functions.py +2 -7
- runpod-2.0.1.dev1/runpod/rp_cli/api.py +30 -0
- runpod-2.0.1.dev1/runpod/rp_cli/catalog.py +308 -0
- runpod-2.0.1.dev1/runpod/rp_cli/compute.py +258 -0
- runpod-2.0.1.dev1/runpod/rp_cli/endpoint.py +1215 -0
- runpod-2.0.1.dev1/runpod/rp_cli/endpoint_config.py +292 -0
- runpod-2.0.1.dev1/runpod/rp_cli/logs.py +157 -0
- {runpod-2.0.0rc1 → runpod-2.0.1.dev1}/runpod/rp_cli/main.py +144 -17
- runpod-2.0.1.dev1/runpod/rp_cli/options.py +64 -0
- runpod-2.0.1.dev1/runpod/rp_cli/output.py +115 -0
- runpod-2.0.1.dev1/runpod/rp_cli/pod.py +783 -0
- runpod-2.0.1.dev1/runpod/rp_cli/volume.py +298 -0
- {runpod-2.0.0rc1 → runpod-2.0.1.dev1}/runpod/serverless/modules/rp_scale.py +80 -14
- {runpod-2.0.0rc1 → runpod-2.0.1.dev1}/runpod/serverless/utils/rp_debugger.py +17 -7
- {runpod-2.0.0rc1 → runpod-2.0.1.dev1}/runpod/serverless/utils/rp_volume_cache.py +341 -26
- {runpod-2.0.0rc1 → runpod-2.0.1.dev1/runpod.egg-info}/PKG-INFO +17 -11
- {runpod-2.0.0rc1 → runpod-2.0.1.dev1}/runpod.egg-info/SOURCES.txt +23 -0
- runpod-2.0.1.dev1/runpod.egg-info/requires.txt +24 -0
- {runpod-2.0.0rc1 → runpod-2.0.1.dev1}/runpod.egg-info/scm_file_list.json +23 -0
- runpod-2.0.1.dev1/runpod.egg-info/scm_version.json +8 -0
- {runpod-2.0.0rc1 → runpod-2.0.1.dev1}/tests/test_api/test_rest.py +155 -3
- runpod-2.0.1.dev1/tests/test_apps/conftest.py +15 -0
- runpod-2.0.1.dev1/tests/test_apps/test_agent_auth.py +242 -0
- {runpod-2.0.0rc1 → runpod-2.0.1.dev1}/tests/test_apps/test_api_client.py +180 -2
- {runpod-2.0.0rc1 → runpod-2.0.1.dev1}/tests/test_apps/test_app.py +74 -0
- runpod-2.0.1.dev1/tests/test_apps/test_build.py +646 -0
- runpod-2.0.1.dev1/tests/test_apps/test_gpu_catalog.py +246 -0
- {runpod-2.0.0rc1 → runpod-2.0.1.dev1}/tests/test_apps/test_logs.py +143 -0
- {runpod-2.0.0rc1 → runpod-2.0.1.dev1}/tests/test_apps/test_volume.py +38 -0
- runpod-2.0.1.dev1/tests/test_cli/test_agent_login.py +185 -0
- runpod-2.0.1.dev1/tests/test_cli/test_catalog_command.py +318 -0
- runpod-2.0.1.dev1/tests/test_cli/test_cli_api.py +42 -0
- {runpod-2.0.0rc1 → runpod-2.0.1.dev1}/tests/test_cli/test_cli_groups/test_ssh_functions.py +40 -13
- runpod-2.0.1.dev1/tests/test_cli/test_cli_logs.py +288 -0
- runpod-2.0.1.dev1/tests/test_cli/test_cli_options.py +98 -0
- runpod-2.0.1.dev1/tests/test_cli/test_cli_output.py +120 -0
- runpod-2.0.1.dev1/tests/test_cli/test_compute.py +199 -0
- {runpod-2.0.0rc1 → runpod-2.0.1.dev1}/tests/test_cli/test_deploy_command.py +187 -0
- runpod-2.0.1.dev1/tests/test_cli/test_endpoint_command.py +1356 -0
- runpod-2.0.1.dev1/tests/test_cli/test_pod_command.py +946 -0
- runpod-2.0.1.dev1/tests/test_cli/test_volume_command.py +339 -0
- {runpod-2.0.0rc1 → runpod-2.0.1.dev1}/tests/test_performance/test_cold_start.py +13 -0
- {runpod-2.0.0rc1 → runpod-2.0.1.dev1}/tests/test_serverless/test_modules/test_fitness/test_gpu_checks.py +39 -0
- {runpod-2.0.0rc1 → runpod-2.0.1.dev1}/tests/test_serverless/test_modules/test_fitness/test_system_checks.py +107 -0
- {runpod-2.0.0rc1 → runpod-2.0.1.dev1}/tests/test_serverless/test_rp_scale.py +264 -0
- {runpod-2.0.0rc1 → runpod-2.0.1.dev1}/tests/test_serverless/test_utils/test_debugger.py +36 -8
- {runpod-2.0.0rc1 → runpod-2.0.1.dev1}/tests/test_serverless/test_utils/test_rp_volume_cache.py +587 -4
- {runpod-2.0.0rc1 → runpod-2.0.1.dev1}/tests/test_serverless/test_worker.py +8 -3
- runpod-2.0.0rc1/runpod/apps/auth.py +0 -77
- runpod-2.0.0rc1/runpod/apps/build.py +0 -378
- runpod-2.0.0rc1/runpod.egg-info/requires.txt +0 -22
- runpod-2.0.0rc1/runpod.egg-info/scm_version.json +0 -8
- runpod-2.0.0rc1/tests/test_apps/test_build.py +0 -255
- {runpod-2.0.0rc1 → runpod-2.0.1.dev1}/.dockerignore +0 -0
- {runpod-2.0.0rc1 → runpod-2.0.1.dev1}/.github/ISSUE_TEMPLATE/bug_report.md +0 -0
- {runpod-2.0.0rc1 → runpod-2.0.1.dev1}/.github/ISSUE_TEMPLATE/feature_request.md +0 -0
- {runpod-2.0.0rc1 → runpod-2.0.1.dev1}/.github/dependabot.yml +0 -0
- {runpod-2.0.0rc1 → runpod-2.0.1.dev1}/.github/tape_collection/cli_config.tape +0 -0
- {runpod-2.0.0rc1 → runpod-2.0.1.dev1}/.github/tape_collection/cli_help.tape +0 -0
- {runpod-2.0.0rc1 → runpod-2.0.1.dev1}/.github/tape_collection/cli_ssh.tape +0 -0
- {runpod-2.0.0rc1 → runpod-2.0.1.dev1}/.github/tests.json +0 -0
- {runpod-2.0.0rc1 → runpod-2.0.1.dev1}/.gitignore +0 -0
- {runpod-2.0.0rc1 → runpod-2.0.1.dev1}/ARCHITECTURE.md +0 -0
- {runpod-2.0.0rc1 → runpod-2.0.1.dev1}/CONTRIBUTING.md +0 -0
- {runpod-2.0.0rc1 → runpod-2.0.1.dev1}/LICENSE +0 -0
- {runpod-2.0.0rc1 → runpod-2.0.1.dev1}/MANIFEST.in +0 -0
- {runpod-2.0.0rc1 → runpod-2.0.1.dev1}/Makefile +0 -0
- {runpod-2.0.0rc1 → runpod-2.0.1.dev1}/SECURITY.md +0 -0
- {runpod-2.0.0rc1 → runpod-2.0.1.dev1}/build_tools/compile_gpu_test.sh +0 -0
- {runpod-2.0.0rc1 → runpod-2.0.1.dev1}/build_tools/gpu_test.c +0 -0
- {runpod-2.0.0rc1 → runpod-2.0.1.dev1}/docs/api/handling_errors.md +0 -0
- {runpod-2.0.0rc1 → runpod-2.0.1.dev1}/docs/api/queries.md +0 -0
- {runpod-2.0.0rc1 → runpod-2.0.1.dev1}/docs/cli/demos/config.gif +0 -0
- {runpod-2.0.0rc1 → runpod-2.0.1.dev1}/docs/cli/demos/help.gif +0 -0
- {runpod-2.0.0rc1 → runpod-2.0.1.dev1}/docs/cli/demos/ssh.gif +0 -0
- {runpod-2.0.0rc1 → runpod-2.0.1.dev1}/docs/cli/references/command_line_interface.md +0 -0
- {runpod-2.0.0rc1 → runpod-2.0.1.dev1}/docs/cli/references/projects.md +0 -0
- {runpod-2.0.0rc1 → runpod-2.0.1.dev1}/docs/cli/references/runpod.toml.md +0 -0
- {runpod-2.0.0rc1 → runpod-2.0.1.dev1}/docs/cli/start_here.md +0 -0
- {runpod-2.0.0rc1 → runpod-2.0.1.dev1}/docs/getting_Started.md +0 -0
- {runpod-2.0.0rc1 → runpod-2.0.1.dev1}/docs/images/env_var_location.png +0 -0
- {runpod-2.0.0rc1 → runpod-2.0.1.dev1}/docs/serverless/functions/error_handling.md +0 -0
- {runpod-2.0.0rc1 → runpod-2.0.1.dev1}/docs/serverless/functions/logging.md +0 -0
- {runpod-2.0.0rc1 → runpod-2.0.1.dev1}/docs/serverless/gpu_binary_compilation.md +0 -0
- {runpod-2.0.0rc1 → runpod-2.0.1.dev1}/docs/serverless/local_testing.md +0 -0
- {runpod-2.0.0rc1 → runpod-2.0.1.dev1}/docs/serverless/utils/rp_cleanup.md +0 -0
- {runpod-2.0.0rc1 → runpod-2.0.1.dev1}/docs/serverless/utils/rp_debugger.md +0 -0
- {runpod-2.0.0rc1 → runpod-2.0.1.dev1}/docs/serverless/utils/rp_download.md +0 -0
- {runpod-2.0.0rc1 → runpod-2.0.1.dev1}/docs/serverless/utils/rp_upload.md +0 -0
- {runpod-2.0.0rc1 → runpod-2.0.1.dev1}/docs/serverless/utils/rp_validator.md +0 -0
- {runpod-2.0.0rc1 → runpod-2.0.1.dev1}/docs/serverless/worker.md +0 -0
- {runpod-2.0.0rc1 → runpod-2.0.1.dev1}/docs/serverless/worker_fitness_checks.md +0 -0
- {runpod-2.0.0rc1 → runpod-2.0.1.dev1}/docs/serverless/worker_realtime.md +0 -0
- {runpod-2.0.0rc1 → runpod-2.0.1.dev1}/examples/api/create_container_registry_auth.py +0 -0
- {runpod-2.0.0rc1 → runpod-2.0.1.dev1}/examples/api/create_endpoint.py +0 -0
- {runpod-2.0.0rc1 → runpod-2.0.1.dev1}/examples/api/create_template.py +0 -0
- {runpod-2.0.0rc1 → runpod-2.0.1.dev1}/examples/api/get_endpoints.py +0 -0
- {runpod-2.0.0rc1 → runpod-2.0.1.dev1}/examples/apps/README.md +0 -0
- {runpod-2.0.0rc1 → runpod-2.0.1.dev1}/examples/apps/gpu_inference.py +0 -0
- {runpod-2.0.0rc1 → runpod-2.0.1.dev1}/examples/apps/hello_world.py +0 -0
- {runpod-2.0.0rc1 → runpod-2.0.1.dev1}/examples/apps/streaming.py +0 -0
- {runpod-2.0.0rc1 → runpod-2.0.1.dev1}/examples/apps/train_and_eval.py +0 -0
- {runpod-2.0.0rc1 → runpod-2.0.1.dev1}/examples/apps/web_service.py +0 -0
- {runpod-2.0.0rc1 → runpod-2.0.1.dev1}/examples/endpoints/asyncio_job_request.py +0 -0
- {runpod-2.0.0rc1 → runpod-2.0.1.dev1}/examples/endpoints/health.py +0 -0
- {runpod-2.0.0rc1 → runpod-2.0.1.dev1}/examples/endpoints/run.py +0 -0
- {runpod-2.0.0rc1 → runpod-2.0.1.dev1}/examples/endpoints/run_sync.py +0 -0
- {runpod-2.0.0rc1 → runpod-2.0.1.dev1}/examples/endpoints/streaming.py +0 -0
- {runpod-2.0.0rc1 → runpod-2.0.1.dev1}/examples/rest_wrapper.py +0 -0
- {runpod-2.0.0rc1 → runpod-2.0.1.dev1}/examples/serverless/concurrent_handler.py +0 -0
- {runpod-2.0.0rc1 → runpod-2.0.1.dev1}/examples/serverless/logger.py +0 -0
- {runpod-2.0.0rc1 → runpod-2.0.1.dev1}/examples/serverless/simple_handler.py +0 -0
- {runpod-2.0.0rc1 → runpod-2.0.1.dev1}/examples/serverless/volume_cache_handler.py +0 -0
- {runpod-2.0.0rc1 → runpod-2.0.1.dev1}/pyproject.toml +0 -0
- {runpod-2.0.0rc1 → runpod-2.0.1.dev1}/runpod/__init__.py +0 -0
- {runpod-2.0.0rc1 → runpod-2.0.1.dev1}/runpod/_binary_helpers.py +0 -0
- {runpod-2.0.0rc1 → runpod-2.0.1.dev1}/runpod/_health/__init__.py +0 -0
- {runpod-2.0.0rc1 → runpod-2.0.1.dev1}/runpod/_health/cuda.py +0 -0
- {runpod-2.0.0rc1 → runpod-2.0.1.dev1}/runpod/_health/fitness.py +0 -0
- {runpod-2.0.0rc1 → runpod-2.0.1.dev1}/runpod/_logger.py +0 -0
- {runpod-2.0.0rc1 → runpod-2.0.1.dev1}/runpod/_startup.py +0 -0
- {runpod-2.0.0rc1 → runpod-2.0.1.dev1}/runpod/agent.py +0 -0
- {runpod-2.0.0rc1 → runpod-2.0.1.dev1}/runpod/api/__init__.py +0 -0
- {runpod-2.0.0rc1 → runpod-2.0.1.dev1}/runpod/api/ctl_commands.py +0 -0
- {runpod-2.0.0rc1 → runpod-2.0.1.dev1}/runpod/api/graphql.py +0 -0
- {runpod-2.0.0rc1 → runpod-2.0.1.dev1}/runpod/api/mutations/__init__.py +0 -0
- {runpod-2.0.0rc1 → runpod-2.0.1.dev1}/runpod/api/mutations/container_register_auth.py +0 -0
- {runpod-2.0.0rc1 → runpod-2.0.1.dev1}/runpod/api/queries/__init__.py +0 -0
- {runpod-2.0.0rc1 → runpod-2.0.1.dev1}/runpod/api/queries/user.py +0 -0
- {runpod-2.0.0rc1 → runpod-2.0.1.dev1}/runpod/apps/__init__.py +0 -0
- {runpod-2.0.0rc1 → runpod-2.0.1.dev1}/runpod/apps/app.py +0 -0
- {runpod-2.0.0rc1 → runpod-2.0.1.dev1}/runpod/apps/context.py +0 -0
- {runpod-2.0.0rc1 → runpod-2.0.1.dev1}/runpod/apps/datacenter.py +0 -0
- {runpod-2.0.0rc1 → runpod-2.0.1.dev1}/runpod/apps/discovery.py +0 -0
- {runpod-2.0.0rc1 → runpod-2.0.1.dev1}/runpod/apps/discovery_state.py +0 -0
- {runpod-2.0.0rc1 → runpod-2.0.1.dev1}/runpod/apps/entrypoint.py +0 -0
- {runpod-2.0.0rc1 → runpod-2.0.1.dev1}/runpod/apps/errors.py +0 -0
- {runpod-2.0.0rc1 → runpod-2.0.1.dev1}/runpod/apps/handles.py +0 -0
- {runpod-2.0.0rc1 → runpod-2.0.1.dev1}/runpod/apps/images.py +0 -0
- {runpod-2.0.0rc1 → runpod-2.0.1.dev1}/runpod/apps/init.py +0 -0
- {runpod-2.0.0rc1 → runpod-2.0.1.dev1}/runpod/apps/invoker.py +0 -0
- {runpod-2.0.0rc1 → runpod-2.0.1.dev1}/runpod/apps/job.py +0 -0
- {runpod-2.0.0rc1 → runpod-2.0.1.dev1}/runpod/apps/manage.py +0 -0
- {runpod-2.0.0rc1 → runpod-2.0.1.dev1}/runpod/apps/markers.py +0 -0
- {runpod-2.0.0rc1 → runpod-2.0.1.dev1}/runpod/apps/model.py +0 -0
- {runpod-2.0.0rc1 → runpod-2.0.1.dev1}/runpod/apps/monitor.py +0 -0
- {runpod-2.0.0rc1 → runpod-2.0.1.dev1}/runpod/apps/placement.py +0 -0
- {runpod-2.0.0rc1 → runpod-2.0.1.dev1}/runpod/apps/protocol.py +0 -0
- {runpod-2.0.0rc1 → runpod-2.0.1.dev1}/runpod/apps/registry.py +0 -0
- {runpod-2.0.0rc1 → runpod-2.0.1.dev1}/runpod/apps/schedule.py +0 -0
- {runpod-2.0.0rc1 → runpod-2.0.1.dev1}/runpod/apps/secret.py +0 -0
- {runpod-2.0.0rc1 → runpod-2.0.1.dev1}/runpod/apps/serialization.py +0 -0
- {runpod-2.0.0rc1 → runpod-2.0.1.dev1}/runpod/apps/shim.py +0 -0
- {runpod-2.0.0rc1 → runpod-2.0.1.dev1}/runpod/apps/spec.py +0 -0
- {runpod-2.0.0rc1 → runpod-2.0.1.dev1}/runpod/apps/stubs.py +0 -0
- {runpod-2.0.0rc1 → runpod-2.0.1.dev1}/runpod/apps/targets.py +0 -0
- {runpod-2.0.0rc1 → runpod-2.0.1.dev1}/runpod/apps/tasks.py +0 -0
- {runpod-2.0.0rc1 → runpod-2.0.1.dev1}/runpod/apps/utils/__init__.py +0 -0
- {runpod-2.0.0rc1 → runpod-2.0.1.dev1}/runpod/apps/utils/client.py +0 -0
- {runpod-2.0.0rc1 → runpod-2.0.1.dev1}/runpod/apps/utils/events.py +0 -0
- {runpod-2.0.0rc1 → runpod-2.0.1.dev1}/runpod/apps/utils/lookup.py +0 -0
- {runpod-2.0.0rc1 → runpod-2.0.1.dev1}/runpod/apps/utils/names.py +0 -0
- {runpod-2.0.0rc1 → runpod-2.0.1.dev1}/runpod/apps/utils/network.py +0 -0
- {runpod-2.0.0rc1 → runpod-2.0.1.dev1}/runpod/apps/watch.py +0 -0
- {runpod-2.0.0rc1 → runpod-2.0.1.dev1}/runpod/cli/__init__.py +0 -0
- {runpod-2.0.0rc1 → runpod-2.0.1.dev1}/runpod/cli/entry.py +0 -0
- {runpod-2.0.0rc1 → runpod-2.0.1.dev1}/runpod/cli/groups/__init__.py +0 -0
- {runpod-2.0.0rc1 → runpod-2.0.1.dev1}/runpod/cli/groups/config/__init__.py +0 -0
- {runpod-2.0.0rc1 → runpod-2.0.1.dev1}/runpod/cli/groups/config/functions.py +0 -0
- {runpod-2.0.0rc1 → runpod-2.0.1.dev1}/runpod/cli/groups/pod/__init__.py +0 -0
- {runpod-2.0.0rc1 → runpod-2.0.1.dev1}/runpod/cli/groups/pod/commands.py +0 -0
- {runpod-2.0.0rc1 → runpod-2.0.1.dev1}/runpod/cli/groups/ssh/__init__.py +0 -0
- {runpod-2.0.0rc1 → runpod-2.0.1.dev1}/runpod/cli/groups/ssh/commands.py +0 -0
- {runpod-2.0.0rc1 → runpod-2.0.1.dev1}/runpod/cli/utils/__init__.py +0 -0
- {runpod-2.0.0rc1 → runpod-2.0.1.dev1}/runpod/cli/utils/rp_info.py +0 -0
- {runpod-2.0.0rc1 → runpod-2.0.1.dev1}/runpod/cli/utils/rp_runpodignore.py +0 -0
- {runpod-2.0.0rc1 → runpod-2.0.1.dev1}/runpod/cli/utils/rp_userspace.py +0 -0
- {runpod-2.0.0rc1 → runpod-2.0.1.dev1}/runpod/cli/utils/ssh_cmd.py +0 -0
- {runpod-2.0.0rc1 → runpod-2.0.1.dev1}/runpod/endpoint/__init__.py +0 -0
- {runpod-2.0.0rc1 → runpod-2.0.1.dev1}/runpod/endpoint/asyncio/__init__.py +0 -0
- {runpod-2.0.0rc1 → runpod-2.0.1.dev1}/runpod/endpoint/asyncio/asyncio_runner.py +0 -0
- {runpod-2.0.0rc1 → runpod-2.0.1.dev1}/runpod/endpoint/helpers.py +0 -0
- {runpod-2.0.0rc1 → runpod-2.0.1.dev1}/runpod/endpoint/runner.py +0 -0
- {runpod-2.0.0rc1 → runpod-2.0.1.dev1}/runpod/error.py +0 -0
- {runpod-2.0.0rc1 → runpod-2.0.1.dev1}/runpod/http_client.py +0 -0
- {runpod-2.0.0rc1 → runpod-2.0.1.dev1}/runpod/rp_cli/__init__.py +0 -0
- {runpod-2.0.0rc1 → runpod-2.0.1.dev1}/runpod/rp_cli/console.py +0 -0
- {runpod-2.0.0rc1 → runpod-2.0.1.dev1}/runpod/rp_cli/update.py +0 -0
- {runpod-2.0.0rc1 → runpod-2.0.1.dev1}/runpod/serverless/__init__.py +0 -0
- {runpod-2.0.0rc1 → runpod-2.0.1.dev1}/runpod/serverless/binaries/README.md +0 -0
- {runpod-2.0.0rc1 → runpod-2.0.1.dev1}/runpod/serverless/binaries/__init__.py +0 -0
- {runpod-2.0.0rc1 → runpod-2.0.1.dev1}/runpod/serverless/binaries/gpu_test +0 -0
- {runpod-2.0.0rc1 → runpod-2.0.1.dev1}/runpod/serverless/modules/__init__.py +0 -0
- {runpod-2.0.0rc1 → runpod-2.0.1.dev1}/runpod/serverless/modules/rp_capture.py +0 -0
- {runpod-2.0.0rc1 → runpod-2.0.1.dev1}/runpod/serverless/modules/rp_fastapi.py +0 -0
- {runpod-2.0.0rc1 → runpod-2.0.1.dev1}/runpod/serverless/modules/rp_fitness.py +0 -0
- {runpod-2.0.0rc1 → runpod-2.0.1.dev1}/runpod/serverless/modules/rp_gpu_fitness.py +0 -0
- {runpod-2.0.0rc1 → runpod-2.0.1.dev1}/runpod/serverless/modules/rp_handler.py +0 -0
- {runpod-2.0.0rc1 → runpod-2.0.1.dev1}/runpod/serverless/modules/rp_http.py +0 -0
- {runpod-2.0.0rc1 → runpod-2.0.1.dev1}/runpod/serverless/modules/rp_job.py +0 -0
- {runpod-2.0.0rc1 → runpod-2.0.1.dev1}/runpod/serverless/modules/rp_local.py +0 -0
- {runpod-2.0.0rc1 → runpod-2.0.1.dev1}/runpod/serverless/modules/rp_logger.py +0 -0
- {runpod-2.0.0rc1 → runpod-2.0.1.dev1}/runpod/serverless/modules/rp_ping.py +0 -0
- {runpod-2.0.0rc1 → runpod-2.0.1.dev1}/runpod/serverless/modules/rp_prestart.py +0 -0
- {runpod-2.0.0rc1 → runpod-2.0.1.dev1}/runpod/serverless/modules/rp_progress.py +0 -0
- {runpod-2.0.0rc1 → runpod-2.0.1.dev1}/runpod/serverless/modules/rp_system_fitness.py +0 -0
- {runpod-2.0.0rc1 → runpod-2.0.1.dev1}/runpod/serverless/modules/rp_tips.py +0 -0
- {runpod-2.0.0rc1 → runpod-2.0.1.dev1}/runpod/serverless/modules/worker_state.py +0 -0
- {runpod-2.0.0rc1 → runpod-2.0.1.dev1}/runpod/serverless/utils/__init__.py +0 -0
- {runpod-2.0.0rc1 → runpod-2.0.1.dev1}/runpod/serverless/utils/rp_cleanup.py +0 -0
- {runpod-2.0.0rc1 → runpod-2.0.1.dev1}/runpod/serverless/utils/rp_cuda.py +0 -0
- {runpod-2.0.0rc1 → runpod-2.0.1.dev1}/runpod/serverless/utils/rp_download.py +0 -0
- {runpod-2.0.0rc1 → runpod-2.0.1.dev1}/runpod/serverless/utils/rp_model_cache.py +0 -0
- {runpod-2.0.0rc1 → runpod-2.0.1.dev1}/runpod/serverless/utils/rp_ssrf.py +0 -0
- {runpod-2.0.0rc1 → runpod-2.0.1.dev1}/runpod/serverless/utils/rp_upload.py +0 -0
- {runpod-2.0.0rc1 → runpod-2.0.1.dev1}/runpod/serverless/utils/rp_validator.py +0 -0
- {runpod-2.0.0rc1 → runpod-2.0.1.dev1}/runpod/serverless/worker.py +0 -0
- {runpod-2.0.0rc1 → runpod-2.0.1.dev1}/runpod/user_agent.py +0 -0
- {runpod-2.0.0rc1 → runpod-2.0.1.dev1}/runpod/version.py +0 -0
- {runpod-2.0.0rc1 → runpod-2.0.1.dev1}/runpod.egg-info/dependency_links.txt +0 -0
- {runpod-2.0.0rc1 → runpod-2.0.1.dev1}/runpod.egg-info/entry_points.txt +0 -0
- {runpod-2.0.0rc1 → runpod-2.0.1.dev1}/runpod.egg-info/top_level.txt +0 -0
- {runpod-2.0.0rc1 → runpod-2.0.1.dev1}/scripts/README.md +0 -0
- {runpod-2.0.0rc1 → runpod-2.0.1.dev1}/scripts/benchmark_cold_start.sh +0 -0
- {runpod-2.0.0rc1 → runpod-2.0.1.dev1}/scripts/compare_benchmarks.py +0 -0
- {runpod-2.0.0rc1 → runpod-2.0.1.dev1}/setup.cfg +0 -0
- {runpod-2.0.0rc1 → runpod-2.0.1.dev1}/setup.py +0 -0
- {runpod-2.0.0rc1 → runpod-2.0.1.dev1}/tests/__init__.py +0 -0
- {runpod-2.0.0rc1 → runpod-2.0.1.dev1}/tests/e2e/__init__.py +0 -0
- {runpod-2.0.0rc1 → runpod-2.0.1.dev1}/tests/e2e/apps_live_smoke.py +0 -0
- {runpod-2.0.0rc1 → runpod-2.0.1.dev1}/tests/e2e/conftest.py +0 -0
- {runpod-2.0.0rc1 → runpod-2.0.1.dev1}/tests/e2e/e2e_provisioner.py +0 -0
- {runpod-2.0.0rc1 → runpod-2.0.1.dev1}/tests/e2e/examples/01_hello_world.py +0 -0
- {runpod-2.0.0rc1 → runpod-2.0.1.dev1}/tests/e2e/examples/02_invocation_styles.py +0 -0
- {runpod-2.0.0rc1 → runpod-2.0.1.dev1}/tests/e2e/examples/03_gpu.py +0 -0
- {runpod-2.0.0rc1 → runpod-2.0.1.dev1}/tests/e2e/examples/04_dependencies.py +0 -0
- {runpod-2.0.0rc1 → runpod-2.0.1.dev1}/tests/e2e/examples/05_api_service.py +0 -0
- {runpod-2.0.0rc1 → runpod-2.0.1.dev1}/tests/e2e/examples/06_tasks.py +0 -0
- {runpod-2.0.0rc1 → runpod-2.0.1.dev1}/tests/e2e/examples/07_pipelines.py +0 -0
- {runpod-2.0.0rc1 → runpod-2.0.1.dev1}/tests/e2e/examples/08_volumes.py +0 -0
- {runpod-2.0.0rc1 → runpod-2.0.1.dev1}/tests/e2e/examples/09_secrets.py +0 -0
- {runpod-2.0.0rc1 → runpod-2.0.1.dev1}/tests/e2e/examples/10_cached_models.py +0 -0
- {runpod-2.0.0rc1 → runpod-2.0.1.dev1}/tests/e2e/examples/11_train_eval.py +0 -0
- {runpod-2.0.0rc1 → runpod-2.0.1.dev1}/tests/e2e/examples/12_custom_image.py +0 -0
- {runpod-2.0.0rc1 → runpod-2.0.1.dev1}/tests/e2e/examples/13_streaming.py +0 -0
- {runpod-2.0.0rc1 → runpod-2.0.1.dev1}/tests/e2e/examples/README.md +0 -0
- {runpod-2.0.0rc1 → runpod-2.0.1.dev1}/tests/e2e/examples/run_all.sh +0 -0
- {runpod-2.0.0rc1 → runpod-2.0.1.dev1}/tests/e2e/fixtures/cold_start/handler.py +0 -0
- {runpod-2.0.0rc1 → runpod-2.0.1.dev1}/tests/e2e/fixtures/cold_start/pyproject.toml +0 -0
- {runpod-2.0.0rc1 → runpod-2.0.1.dev1}/tests/e2e/matrix/main.py +0 -0
- {runpod-2.0.0rc1 → runpod-2.0.1.dev1}/tests/e2e/matrix/run.py +0 -0
- {runpod-2.0.0rc1 → runpod-2.0.1.dev1}/tests/e2e/task_pod_smoke.py +0 -0
- {runpod-2.0.0rc1 → runpod-2.0.1.dev1}/tests/e2e/test_cold_start.py +0 -0
- {runpod-2.0.0rc1 → runpod-2.0.1.dev1}/tests/e2e/test_mock_worker.py +0 -0
- {runpod-2.0.0rc1 → runpod-2.0.1.dev1}/tests/e2e/tests.json +0 -0
- {runpod-2.0.0rc1 → runpod-2.0.1.dev1}/tests/fixtures/mock_gpu_test +0 -0
- {runpod-2.0.0rc1 → runpod-2.0.1.dev1}/tests/test_agent.py +0 -0
- {runpod-2.0.0rc1 → runpod-2.0.1.dev1}/tests/test_api/__init__.py +0 -0
- {runpod-2.0.0rc1 → runpod-2.0.1.dev1}/tests/test_api/test_ctl_commands.py +0 -0
- {runpod-2.0.0rc1 → runpod-2.0.1.dev1}/tests/test_apps/__init__.py +0 -0
- {runpod-2.0.0rc1 → runpod-2.0.1.dev1}/tests/test_apps/test_auth.py +0 -0
- {runpod-2.0.0rc1 → runpod-2.0.1.dev1}/tests/test_apps/test_compat_lock.py +0 -0
- {runpod-2.0.0rc1 → runpod-2.0.1.dev1}/tests/test_apps/test_config_params.py +0 -0
- {runpod-2.0.0rc1 → runpod-2.0.1.dev1}/tests/test_apps/test_deploy.py +0 -0
- {runpod-2.0.0rc1 → runpod-2.0.1.dev1}/tests/test_apps/test_dev.py +0 -0
- {runpod-2.0.0rc1 → runpod-2.0.1.dev1}/tests/test_apps/test_discovery.py +0 -0
- {runpod-2.0.0rc1 → runpod-2.0.1.dev1}/tests/test_apps/test_dispatch.py +0 -0
- {runpod-2.0.0rc1 → runpod-2.0.1.dev1}/tests/test_apps/test_images.py +0 -0
- {runpod-2.0.0rc1 → runpod-2.0.1.dev1}/tests/test_apps/test_job.py +0 -0
- {runpod-2.0.0rc1 → runpod-2.0.1.dev1}/tests/test_apps/test_manage.py +0 -0
- {runpod-2.0.0rc1 → runpod-2.0.1.dev1}/tests/test_apps/test_markers.py +0 -0
- {runpod-2.0.0rc1 → runpod-2.0.1.dev1}/tests/test_apps/test_model.py +0 -0
- {runpod-2.0.0rc1 → runpod-2.0.1.dev1}/tests/test_apps/test_monitor.py +0 -0
- {runpod-2.0.0rc1 → runpod-2.0.1.dev1}/tests/test_apps/test_placement.py +0 -0
- {runpod-2.0.0rc1 → runpod-2.0.1.dev1}/tests/test_apps/test_registry.py +0 -0
- {runpod-2.0.0rc1 → runpod-2.0.1.dev1}/tests/test_apps/test_retry.py +0 -0
- {runpod-2.0.0rc1 → runpod-2.0.1.dev1}/tests/test_apps/test_secret.py +0 -0
- {runpod-2.0.0rc1 → runpod-2.0.1.dev1}/tests/test_apps/test_shim.py +0 -0
- {runpod-2.0.0rc1 → runpod-2.0.1.dev1}/tests/test_apps/test_targets.py +0 -0
- {runpod-2.0.0rc1 → runpod-2.0.1.dev1}/tests/test_apps/test_tasks.py +0 -0
- {runpod-2.0.0rc1 → runpod-2.0.1.dev1}/tests/test_apps/test_watch.py +0 -0
- {runpod-2.0.0rc1 → runpod-2.0.1.dev1}/tests/test_cli/__init__.py +0 -0
- {runpod-2.0.0rc1 → runpod-2.0.1.dev1}/tests/test_cli/test_cli_groups/__init__.py +0 -0
- {runpod-2.0.0rc1 → runpod-2.0.1.dev1}/tests/test_cli/test_cli_groups/test_config_functions.py +0 -0
- {runpod-2.0.0rc1 → runpod-2.0.1.dev1}/tests/test_cli/test_cli_groups/test_pod_commands.py +0 -0
- {runpod-2.0.0rc1 → runpod-2.0.1.dev1}/tests/test_cli/test_cli_groups/test_ssh_commands.py +0 -0
- {runpod-2.0.0rc1 → runpod-2.0.1.dev1}/tests/test_cli/test_cli_groups/test_ssh_dispatch.py +0 -0
- {runpod-2.0.0rc1 → runpod-2.0.1.dev1}/tests/test_cli/test_cli_utils/__init__.py +0 -0
- {runpod-2.0.0rc1 → runpod-2.0.1.dev1}/tests/test_cli/test_cli_utils/test_info.py +0 -0
- {runpod-2.0.0rc1 → runpod-2.0.1.dev1}/tests/test_cli/test_cli_utils/test_runpodignore.py +0 -0
- {runpod-2.0.0rc1 → runpod-2.0.1.dev1}/tests/test_cli/test_cli_utils/test_ssh_cmd.py +0 -0
- {runpod-2.0.0rc1 → runpod-2.0.1.dev1}/tests/test_cli/test_cli_utils/test_userspace.py +0 -0
- {runpod-2.0.0rc1 → runpod-2.0.1.dev1}/tests/test_cli/test_console.py +0 -0
- {runpod-2.0.0rc1 → runpod-2.0.1.dev1}/tests/test_cli/test_init_command.py +0 -0
- {runpod-2.0.0rc1 → runpod-2.0.1.dev1}/tests/test_cli/test_management_commands.py +0 -0
- {runpod-2.0.0rc1 → runpod-2.0.1.dev1}/tests/test_cli/test_update_command.py +0 -0
- {runpod-2.0.0rc1 → runpod-2.0.1.dev1}/tests/test_endpoint/__init__.py +0 -0
- {runpod-2.0.0rc1 → runpod-2.0.1.dev1}/tests/test_endpoint/test_asyncio_init.py +0 -0
- {runpod-2.0.0rc1 → runpod-2.0.1.dev1}/tests/test_endpoint/test_asyncio_runner.py +0 -0
- {runpod-2.0.0rc1 → runpod-2.0.1.dev1}/tests/test_endpoint/test_init.py +0 -0
- {runpod-2.0.0rc1 → runpod-2.0.1.dev1}/tests/test_endpoint/test_runner.py +0 -0
- {runpod-2.0.0rc1 → runpod-2.0.1.dev1}/tests/test_error.py +0 -0
- {runpod-2.0.0rc1 → runpod-2.0.1.dev1}/tests/test_init.py +0 -0
- {runpod-2.0.0rc1 → runpod-2.0.1.dev1}/tests/test_performance/__init__.py +0 -0
- {runpod-2.0.0rc1 → runpod-2.0.1.dev1}/tests/test_serverless/__init__.py +0 -0
- {runpod-2.0.0rc1 → runpod-2.0.1.dev1}/tests/test_serverless/local_sim/.env_example +0 -0
- {runpod-2.0.0rc1 → runpod-2.0.1.dev1}/tests/test_serverless/local_sim/Makefile +0 -0
- {runpod-2.0.0rc1 → runpod-2.0.1.dev1}/tests/test_serverless/local_sim/localhost.py +0 -0
- {runpod-2.0.0rc1 → runpod-2.0.1.dev1}/tests/test_serverless/local_sim/worker.py +0 -0
- {runpod-2.0.0rc1 → runpod-2.0.1.dev1}/tests/test_serverless/test_capture.py +0 -0
- {runpod-2.0.0rc1 → runpod-2.0.1.dev1}/tests/test_serverless/test_init.py +0 -0
- {runpod-2.0.0rc1 → runpod-2.0.1.dev1}/tests/test_serverless/test_integration_worker_state.py +0 -0
- {runpod-2.0.0rc1 → runpod-2.0.1.dev1}/tests/test_serverless/test_modules/__init__.py +0 -0
- {runpod-2.0.0rc1 → runpod-2.0.1.dev1}/tests/test_serverless/test_modules/test_fastapi.py +0 -0
- {runpod-2.0.0rc1 → runpod-2.0.1.dev1}/tests/test_serverless/test_modules/test_fitness/__init__.py +0 -0
- {runpod-2.0.0rc1 → runpod-2.0.1.dev1}/tests/test_serverless/test_modules/test_fitness/conftest.py +0 -0
- {runpod-2.0.0rc1 → runpod-2.0.1.dev1}/tests/test_serverless/test_modules/test_fitness/test_force_kill.py +0 -0
- {runpod-2.0.0rc1 → runpod-2.0.1.dev1}/tests/test_serverless/test_modules/test_fitness/test_gpu_integration.py +0 -0
- {runpod-2.0.0rc1 → runpod-2.0.1.dev1}/tests/test_serverless/test_modules/test_fitness/test_registration.py +0 -0
- {runpod-2.0.0rc1 → runpod-2.0.1.dev1}/tests/test_serverless/test_modules/test_fitness/test_safe_startup.py +0 -0
- {runpod-2.0.0rc1 → runpod-2.0.1.dev1}/tests/test_serverless/test_modules/test_fitness/test_startup.py +0 -0
- {runpod-2.0.0rc1 → runpod-2.0.1.dev1}/tests/test_serverless/test_modules/test_handler.py +0 -0
- {runpod-2.0.0rc1 → runpod-2.0.1.dev1}/tests/test_serverless/test_modules/test_http.py +0 -0
- {runpod-2.0.0rc1 → runpod-2.0.1.dev1}/tests/test_serverless/test_modules/test_job.py +0 -0
- {runpod-2.0.0rc1 → runpod-2.0.1.dev1}/tests/test_serverless/test_modules/test_local.py +0 -0
- {runpod-2.0.0rc1 → runpod-2.0.1.dev1}/tests/test_serverless/test_modules/test_logger.py +0 -0
- {runpod-2.0.0rc1 → runpod-2.0.1.dev1}/tests/test_serverless/test_modules/test_ping.py +0 -0
- {runpod-2.0.0rc1 → runpod-2.0.1.dev1}/tests/test_serverless/test_modules/test_progress.py +0 -0
- {runpod-2.0.0rc1 → runpod-2.0.1.dev1}/tests/test_serverless/test_modules/test_scale.py +0 -0
- {runpod-2.0.0rc1 → runpod-2.0.1.dev1}/tests/test_serverless/test_modules/test_state.py +0 -0
- {runpod-2.0.0rc1 → runpod-2.0.1.dev1}/tests/test_serverless/test_modules/test_tips.py +0 -0
- {runpod-2.0.0rc1 → runpod-2.0.1.dev1}/tests/test_serverless/test_prestart.py +0 -0
- {runpod-2.0.0rc1 → runpod-2.0.1.dev1}/tests/test_serverless/test_prestart_lifecycle.py +0 -0
- {runpod-2.0.0rc1 → runpod-2.0.1.dev1}/tests/test_serverless/test_scale_mirror.py +0 -0
- {runpod-2.0.0rc1 → runpod-2.0.1.dev1}/tests/test_serverless/test_utils/__init__.py +0 -0
- {runpod-2.0.0rc1 → runpod-2.0.1.dev1}/tests/test_serverless/test_utils/test_cleanup.py +0 -0
- {runpod-2.0.0rc1 → runpod-2.0.1.dev1}/tests/test_serverless/test_utils/test_cuda.py +0 -0
- {runpod-2.0.0rc1 → runpod-2.0.1.dev1}/tests/test_serverless/test_utils/test_download.py +0 -0
- {runpod-2.0.0rc1 → runpod-2.0.1.dev1}/tests/test_serverless/test_utils/test_model_cache.py +0 -0
- {runpod-2.0.0rc1 → runpod-2.0.1.dev1}/tests/test_serverless/test_utils/test_ssrf.py +0 -0
- {runpod-2.0.0rc1 → runpod-2.0.1.dev1}/tests/test_serverless/test_utils/test_upload.py +0 -0
- {runpod-2.0.0rc1 → runpod-2.0.1.dev1}/tests/test_serverless/test_utils/test_validate.py +0 -0
- {runpod-2.0.0rc1 → runpod-2.0.1.dev1}/tests/test_serverless/test_utils_init.py +0 -0
- {runpod-2.0.0rc1 → runpod-2.0.1.dev1}/tests/test_shared/__init__.py +0 -0
- {runpod-2.0.0rc1 → runpod-2.0.1.dev1}/tests/test_shared/test_auth.py +0 -0
- {runpod-2.0.0rc1 → runpod-2.0.1.dev1}/tests/test_user_agent.py +0 -0
- {runpod-2.0.0rc1 → runpod-2.0.1.dev1}/tests/test_version.py +0 -0
- {runpod-2.0.0rc1 → runpod-2.0.1.dev1}/tests/test_whatever.py +0 -0
- {runpod-2.0.0rc1 → runpod-2.0.1.dev1}/tests/whatever.py +0 -0
|
@@ -28,7 +28,7 @@ jobs:
|
|
|
28
28
|
|
|
29
29
|
test-publish:
|
|
30
30
|
if: github.ref == 'refs/heads/staging'
|
|
31
|
-
runs-on: ubuntu-
|
|
31
|
+
runs-on: runpod-4vCPU-ubuntu-2404 # GitHub-hosted (trusted publishing needs that) with allow-listed static IPs
|
|
32
32
|
environment: test-release
|
|
33
33
|
permissions:
|
|
34
34
|
contents: read
|
|
@@ -58,7 +58,7 @@ jobs:
|
|
|
58
58
|
|
|
59
59
|
release-please:
|
|
60
60
|
if: github.ref == 'refs/heads/main'
|
|
61
|
-
runs-on: ubuntu-
|
|
61
|
+
runs-on: blacksmith-2vcpu-ubuntu-2404
|
|
62
62
|
outputs:
|
|
63
63
|
release_created: ${{ steps.release.outputs.release_created }}
|
|
64
64
|
tag_name: ${{ steps.release.outputs.tag_name }}
|
|
@@ -74,7 +74,7 @@ jobs:
|
|
|
74
74
|
name: PyPI Publish
|
|
75
75
|
needs: release-please
|
|
76
76
|
if: ${{ always() && (needs.release-please.outputs.release_created || (github.event_name == 'workflow_dispatch' && inputs.force_publish == 'true')) }}
|
|
77
|
-
runs-on: ubuntu-
|
|
77
|
+
runs-on: runpod-4vCPU-ubuntu-2404 # GitHub-hosted (trusted publishing needs that) with allow-listed static IPs
|
|
78
78
|
environment:
|
|
79
79
|
name: pypi-production
|
|
80
80
|
url: https://pypi.org/project/runpod/
|
|
@@ -109,7 +109,7 @@ jobs:
|
|
|
109
109
|
linear-sync:
|
|
110
110
|
name: Linear Release Sync
|
|
111
111
|
needs: release-please
|
|
112
|
-
runs-on: ubuntu-
|
|
112
|
+
runs-on: blacksmith-2vcpu-ubuntu-2404
|
|
113
113
|
permissions:
|
|
114
114
|
contents: read
|
|
115
115
|
steps:
|
|
@@ -128,7 +128,7 @@ jobs:
|
|
|
128
128
|
name: Linear Release Complete
|
|
129
129
|
if: ${{ needs.release-please.outputs.release_created }}
|
|
130
130
|
needs: [release-please, linear-sync]
|
|
131
|
-
runs-on: ubuntu-
|
|
131
|
+
runs-on: blacksmith-2vcpu-ubuntu-2404
|
|
132
132
|
permissions:
|
|
133
133
|
contents: read
|
|
134
134
|
steps:
|
|
@@ -148,7 +148,7 @@ jobs:
|
|
|
148
148
|
# name: Notify workers
|
|
149
149
|
# needs: [release-please, pypi-publish]
|
|
150
150
|
# if: ${{ needs.release-please.outputs.release_created || (github.event_name == 'workflow_dispatch' && inputs.force_publish == 'true') }}
|
|
151
|
-
# runs-on: ubuntu-
|
|
151
|
+
# runs-on: blacksmith-2vcpu-ubuntu-2404
|
|
152
152
|
# strategy:
|
|
153
153
|
# matrix:
|
|
154
154
|
# repo:
|
|
@@ -19,7 +19,7 @@ jobs:
|
|
|
19
19
|
|
|
20
20
|
test:
|
|
21
21
|
if: github.event_name != 'schedule'
|
|
22
|
-
runs-on: ubuntu-
|
|
22
|
+
runs-on: blacksmith-2vcpu-ubuntu-2404
|
|
23
23
|
strategy:
|
|
24
24
|
matrix:
|
|
25
25
|
python-version: ["3.10", "3.11", "3.12", "3.13", "3.14"]
|
|
@@ -57,7 +57,7 @@ jobs:
|
|
|
57
57
|
|
|
58
58
|
e2e:
|
|
59
59
|
if: github.event_name != 'schedule' && github.repository == 'runpod/runpod-python'
|
|
60
|
-
runs-on: ubuntu-
|
|
60
|
+
runs-on: blacksmith-2vcpu-ubuntu-2404
|
|
61
61
|
timeout-minutes: 15
|
|
62
62
|
steps:
|
|
63
63
|
- uses: actions/checkout@v7
|
|
@@ -82,12 +82,15 @@ jobs:
|
|
|
82
82
|
source .venv/bin/activate
|
|
83
83
|
pytest tests/e2e/ -v -p no:xdist --timeout=600 --reruns 1 --reruns-delay 5 --log-cli-level=INFO -o "addopts="
|
|
84
84
|
env:
|
|
85
|
+
# the e2e provisioner still drives runpod-flash, whose import-time
|
|
86
|
+
# sunset FutureWarning is an error under pytest.ini filterwarnings
|
|
87
|
+
RUNPOD_FLASH_SILENCE_DEPRECATION: "1"
|
|
85
88
|
RUNPOD_API_KEY: ${{ secrets.RUNPOD_API_KEY }}
|
|
86
89
|
RUNPOD_SDK_GIT_REF: ${{ github.event_name == 'pull_request' && github.event.pull_request.head.sha || github.sha }}
|
|
87
90
|
|
|
88
91
|
codeql:
|
|
89
92
|
if: github.event_name == 'schedule' || github.event_name == 'pull_request'
|
|
90
|
-
runs-on: ubuntu-
|
|
93
|
+
runs-on: blacksmith-2vcpu-ubuntu-2404
|
|
91
94
|
permissions:
|
|
92
95
|
actions: read
|
|
93
96
|
contents: read
|
|
@@ -96,16 +99,16 @@ jobs:
|
|
|
96
99
|
- uses: actions/checkout@v7
|
|
97
100
|
|
|
98
101
|
- name: Initialize CodeQL
|
|
99
|
-
uses: github/codeql-action/init@v4.
|
|
102
|
+
uses: github/codeql-action/init@v4.39.1
|
|
100
103
|
with:
|
|
101
104
|
languages: python
|
|
102
105
|
queries: security-extended,security-and-quality
|
|
103
106
|
|
|
104
107
|
- name: Autobuild
|
|
105
|
-
uses: github/codeql-action/autobuild@v4.
|
|
108
|
+
uses: github/codeql-action/autobuild@v4.39.1
|
|
106
109
|
|
|
107
110
|
- name: Perform CodeQL Analysis
|
|
108
|
-
uses: github/codeql-action/analyze@v4.
|
|
111
|
+
uses: github/codeql-action/analyze@v4.39.1
|
|
109
112
|
with:
|
|
110
113
|
category: "/language:python"
|
|
111
114
|
|
|
@@ -114,7 +117,7 @@ jobs:
|
|
|
114
117
|
# ──────────────────────────────────────────────
|
|
115
118
|
|
|
116
119
|
validation:
|
|
117
|
-
runs-on: ubuntu-
|
|
120
|
+
runs-on: blacksmith-2vcpu-ubuntu-2404
|
|
118
121
|
needs: [test, e2e, codeql]
|
|
119
122
|
if: always()
|
|
120
123
|
steps:
|
|
@@ -14,6 +14,31 @@
|
|
|
14
14
|
* Deployment artifacts apply project ignore rules and mandatory secret-file exclusions while preserving vendored dependency assets.
|
|
15
15
|
* Synchronous calls wait across polling timeouts on Python 3.10 and propagate operation timeouts.
|
|
16
16
|
|
|
17
|
+
## [2.1.0](https://github.com/runpod/runpod-python/compare/v2.0.0...v2.1.0) (2026-10-28)
|
|
18
|
+
|
|
19
|
+
|
|
20
|
+
### Features
|
|
21
|
+
|
|
22
|
+
* add rp catalog for gpu and cpu pricing and stock ([#637](https://github.com/runpod/runpod-python/issues/637)) ([9540b8a](https://github.com/runpod/runpod-python/commit/9540b8afff98b83e33146c4c0c03d6fa07157f62))
|
|
23
|
+
* add rp endpoint command group ([#640](https://github.com/runpod/runpod-python/issues/640)) ([be3f76b](https://github.com/runpod/runpod-python/commit/be3f76b4ade25eb62fcce41ffcd0d50088f8ef31))
|
|
24
|
+
* add rp pod lifecycle commands ([#639](https://github.com/runpod/runpod-python/issues/639)) ([eeffe2a](https://github.com/runpod/runpod-python/commit/eeffe2ae4651eab0fb4250580457d002882cfe7f))
|
|
25
|
+
* add rp volume commands for network and global volumes ([#638](https://github.com/runpod/runpod-python/issues/638)) ([598cb88](https://github.com/runpod/runpod-python/commit/598cb88b2eb00497916a8fa6117064c898d3d884))
|
|
26
|
+
|
|
27
|
+
|
|
28
|
+
### Bug Fixes
|
|
29
|
+
|
|
30
|
+
* **apps:** bind volume mounts from RUNPOD_MOUNTS when the runtime did not ([#626](https://github.com/runpod/runpod-python/issues/626)) ([fc4a6c7](https://github.com/runpod/runpod-python/commit/fc4a6c73c3915625d65df63416db835d0b927b8f))
|
|
31
|
+
* **apps:** keep transitive torch out of GPU artifacts ([#623](https://github.com/runpod/runpod-python/issues/623)) ([25515f0](https://github.com/runpod/runpod-python/commit/25515f02a2e3ea36035c856e564106ccb8760b7f))
|
|
32
|
+
* **apps:** pin requested gpu devices instead of their whole pool ([#624](https://github.com/runpod/runpod-python/issues/624)) ([432c55b](https://github.com/runpod/runpod-python/commit/432c55b8a24b5bccbe37955392f9e1a72bad475e))
|
|
33
|
+
* **cli:** delete dev endpoints when rp flash dev is stopped by a signal ([#625](https://github.com/runpod/runpod-python/issues/625)) ([f866ec3](https://github.com/runpod/runpod-python/commit/f866ec3d2117b697a2534286509674657f37511f))
|
|
34
|
+
* **deps:** pin certifi to >=2026.10.19 for emSign bundle remediation (GHSA-6q48-6c7w-9gw2) ([#659](https://github.com/runpod/runpod-python/issues/659)) ([714a565](https://github.com/runpod/runpod-python/commit/714a565514bae7dd2b6ca355b52e8e76d70d1102))
|
|
35
|
+
|
|
36
|
+
|
|
37
|
+
### Performance Improvements
|
|
38
|
+
|
|
39
|
+
* **serverless:** range-parallel VolumeCache hydrate ([#621](https://github.com/runpod/runpod-python/issues/621)) ([29704a4](https://github.com/runpod/runpod-python/commit/29704a49ab591eaca9a83d7d2eef935d9d787eb2))
|
|
40
|
+
* **serverless:** take a full batch once drained ([#646](https://github.com/runpod/runpod-python/issues/646)) ([397c37d](https://github.com/runpod/runpod-python/commit/397c37d3d2a04aaa2eb3c8a83cdc359e230bcb6e))
|
|
41
|
+
|
|
17
42
|
## [1.12.0](https://github.com/runpod/runpod-python/compare/v1.11.0...v1.12.0) (2026-08-10)
|
|
18
43
|
|
|
19
44
|
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: runpod
|
|
3
|
-
Version: 2.0.
|
|
3
|
+
Version: 2.0.1.dev1
|
|
4
4
|
Summary: 🐍 | Python library for Runpod API and serverless worker SDK.
|
|
5
5
|
Home-page: https://runpod.io
|
|
6
6
|
Author: Runpod
|
|
@@ -28,25 +28,27 @@ Classifier: Topic :: Internet :: WWW/HTTP :: Dynamic Content
|
|
|
28
28
|
Requires-Python: >=3.10
|
|
29
29
|
Description-Content-Type: text/markdown
|
|
30
30
|
License-File: LICENSE
|
|
31
|
-
Requires-Dist: aiohttp[speedups]>=3.14.
|
|
31
|
+
Requires-Dist: aiohttp[speedups]>=3.14.5
|
|
32
32
|
Requires-Dist: aiohttp-retry>=2.9.1
|
|
33
33
|
Requires-Dist: backoff>=2.2.1
|
|
34
|
-
Requires-Dist: boto3>=1.43.
|
|
34
|
+
Requires-Dist: boto3>=1.43.118
|
|
35
|
+
Requires-Dist: certifi>=2026.10.19
|
|
35
36
|
Requires-Dist: click>=8.5.0
|
|
36
|
-
Requires-Dist: cloudpickle>=3.
|
|
37
|
+
Requires-Dist: cloudpickle>=3.1.2
|
|
37
38
|
Requires-Dist: colorama<0.4.7,>=0.4.6
|
|
38
|
-
Requires-Dist: cryptography>=50.0.
|
|
39
|
-
Requires-Dist: fastapi[all]>=0.
|
|
40
|
-
Requires-Dist:
|
|
41
|
-
Requires-Dist:
|
|
39
|
+
Requires-Dist: cryptography>=50.0.2
|
|
40
|
+
Requires-Dist: fastapi[all]>=0.162.0
|
|
41
|
+
Requires-Dist: packaging>=26.3
|
|
42
|
+
Requires-Dist: paramiko>=5.1.0
|
|
43
|
+
Requires-Dist: pathspec>=1.1.1
|
|
42
44
|
Requires-Dist: prettytable>=3.18.0
|
|
43
45
|
Requires-Dist: psutil>=7.2.2
|
|
44
46
|
Requires-Dist: py-cpuinfo>=9.0.0
|
|
45
47
|
Requires-Dist: inquirerpy==0.3.4
|
|
46
48
|
Requires-Dist: requests>=2.34.2
|
|
47
|
-
Requires-Dist: rich>=
|
|
48
|
-
Requires-Dist: tomli>=2.
|
|
49
|
-
Requires-Dist: tomlkit>=0.15.
|
|
49
|
+
Requires-Dist: rich>=15.0.0
|
|
50
|
+
Requires-Dist: tomli>=2.5.0
|
|
51
|
+
Requires-Dist: tomlkit>=0.15.2
|
|
50
52
|
Requires-Dist: tqdm-loggable>=0.4.1
|
|
51
53
|
Requires-Dist: urllib3>=2.8.0
|
|
52
54
|
Requires-Dist: watchdog>=6.0.0
|
|
@@ -70,6 +72,10 @@ Dynamic: requires-python
|
|
|
70
72
|
|
|
71
73
|
</div>
|
|
72
74
|
|
|
75
|
+
<!-- runpod-agent-setup:start -->
|
|
76
|
+
**Using an AI agent?** Point it to https://docs.runpod.io/agent-setup.md to install the Runpod skills and MCP server.
|
|
77
|
+
<!-- runpod-agent-setup:end -->
|
|
78
|
+
|
|
73
79
|
## Installation
|
|
74
80
|
|
|
75
81
|
```bash
|
|
@@ -59,7 +59,9 @@ vc.sync(background=False) # persist new files back to the volume, inli
|
|
|
59
59
|
| `namespace` | `RUNPOD_ENDPOINT_ID` | Isolation key for the on-volume mirror. Must be a single safe path component. |
|
|
60
60
|
| `volume_path` | `/runpod-volume` | Network-volume mount point. |
|
|
61
61
|
| `best_effort` | `True` | Swallow and log errors instead of raising. Set `False` while debugging. |
|
|
62
|
-
| `max_workers` | `min(32, (os.cpu_count() or 4) * 4)` | Thread count for parallel copy of large files (I/O-bound). |
|
|
62
|
+
| `max_workers` | `min(32, (os.cpu_count() or 4) * 4)` | Thread count for parallel copy of large files on sync (I/O-bound). |
|
|
63
|
+
| `hydrate_workers` | `max_workers` if set, else `64` | Concurrent range reads when hydrating large files. |
|
|
64
|
+
| `hydrate_chunk_size` | `8 MiB` | Bytes per hydrate range. Peak hydrate memory is about `hydrate_workers * hydrate_chunk_size` (512 MiB by default). |
|
|
63
65
|
|
|
64
66
|
## How it works
|
|
65
67
|
|
|
@@ -77,9 +79,25 @@ vc.sync(background=False) # persist new files back to the volume, inli
|
|
|
77
79
|
files are skipped. The `small.tar` archive is re-packed as a whole whenever
|
|
78
80
|
any small file has changed, since unpacking and re-diffing many tiny files
|
|
79
81
|
individually is slower than the network volume's per-file overhead.
|
|
80
|
-
- **Parallel copy.**
|
|
81
|
-
`max_workers` (default `min(32, (os.cpu_count() or 4) * 4)`),
|
|
82
|
-
work is I/O-bound.
|
|
82
|
+
- **Parallel copy.** On sync, large files are copied whole across a thread
|
|
83
|
+
pool sized by `max_workers` (default `min(32, (os.cpu_count() or 4) * 4)`),
|
|
84
|
+
since the work is I/O-bound.
|
|
85
|
+
- **Range-parallel hydrate.** On hydrate, every large file is split into
|
|
86
|
+
`hydrate_chunk_size` ranges, and one pool of `hydrate_workers` threads reads
|
|
87
|
+
the ranges of all files at once, each on its own file descriptor.
|
|
88
|
+
Object-store mounts such as Global Store serve one sequential stream at
|
|
89
|
+
roughly 140 MiB/s, and reading several whole files at once doesn't add up,
|
|
90
|
+
but independent range reads scale to the host's network (~1.1 GiB/s
|
|
91
|
+
measured). Transient `ENOMEM`/`EIO`/`EAGAIN` errors, which such mounts
|
|
92
|
+
return under load, are retried with jittered exponential backoff. A file is assembled in a temp
|
|
93
|
+
file and renamed into place only when every range has copied, so a failed
|
|
94
|
+
file leaves any existing local copy untouched and is simply not restored.
|
|
95
|
+
A mirror file whose size differs from the manifest, or whose size or mtime
|
|
96
|
+
changes between ranges because a concurrent `sync()` replaced it, is
|
|
97
|
+
likewise not restored. This is a best-effort check: an object-store mount
|
|
98
|
+
can serve a replacement that lands in the middle of a single range read
|
|
99
|
+
without it being visible. Keep `hydrate_workers * hydrate_chunk_size` near the default: past ~1 GiB in
|
|
100
|
+
flight, Global Store starts failing reads with `ENOMEM`.
|
|
83
101
|
- **Packing/extraction.** Packing the small-file archive uses the `tar`
|
|
84
102
|
binary when available (falling back to the stdlib `tarfile` module
|
|
85
103
|
otherwise). Extraction always goes through `tarfile`, validating every
|
|
@@ -13,6 +13,7 @@ filterwarnings =
|
|
|
13
13
|
python_files = tests.py test_*.py *_test.py
|
|
14
14
|
norecursedirs = venv *.egg-info .git build tests/e2e
|
|
15
15
|
asyncio_mode = auto
|
|
16
|
+
asyncio_default_fixture_loop_scope = function
|
|
16
17
|
markers =
|
|
17
18
|
qb: Queue-based tests (local execution, fast)
|
|
18
19
|
lb: Load-balanced tests (remote provisioning, slow)
|
|
@@ -1,23 +1,25 @@
|
|
|
1
|
-
aiohttp[speedups] >= 3.14.
|
|
1
|
+
aiohttp[speedups] >= 3.14.5
|
|
2
2
|
aiohttp-retry >= 2.9.1
|
|
3
3
|
|
|
4
4
|
backoff >= 2.2.1
|
|
5
|
-
boto3 >= 1.43.
|
|
5
|
+
boto3 >= 1.43.118
|
|
6
|
+
certifi >= 2026.10.19
|
|
6
7
|
click >= 8.5.0
|
|
7
|
-
cloudpickle >= 3.
|
|
8
|
+
cloudpickle >= 3.1.2
|
|
8
9
|
colorama >= 0.4.6, < 0.4.7
|
|
9
|
-
cryptography >= 50.0.
|
|
10
|
-
fastapi[all] >= 0.
|
|
11
|
-
|
|
12
|
-
|
|
10
|
+
cryptography >= 50.0.2
|
|
11
|
+
fastapi[all] >= 0.162.0
|
|
12
|
+
packaging >= 26.3
|
|
13
|
+
paramiko >= 5.1.0
|
|
14
|
+
pathspec >= 1.1.1
|
|
13
15
|
prettytable >= 3.18.0
|
|
14
16
|
psutil >= 7.2.2
|
|
15
17
|
py-cpuinfo >= 9.0.0
|
|
16
18
|
inquirerpy == 0.3.4
|
|
17
19
|
requests >= 2.34.2
|
|
18
|
-
rich >=
|
|
19
|
-
tomli >= 2.
|
|
20
|
-
tomlkit >= 0.15.
|
|
20
|
+
rich >= 15.0.0
|
|
21
|
+
tomli >= 2.5.0
|
|
22
|
+
tomlkit >= 0.15.2
|
|
21
23
|
tqdm-loggable >= 0.4.1
|
|
22
24
|
urllib3 >= 2.8.0
|
|
23
25
|
watchdog >= 6.0.0
|
|
@@ -28,6 +28,13 @@ FALLBACK_TIMEOUT_SECONDS = 10
|
|
|
28
28
|
MAX_ERROR_MESSAGES = 10
|
|
29
29
|
|
|
30
30
|
|
|
31
|
+
class GpuAllocationError(RuntimeError):
|
|
32
|
+
"""gpu_test reached the GPUs and a device failed its allocation test.
|
|
33
|
+
|
|
34
|
+
The nvidia-smi fallback only lists GPUs, so it must not override this.
|
|
35
|
+
"""
|
|
36
|
+
|
|
37
|
+
|
|
31
38
|
def configure() -> None:
|
|
32
39
|
"""Read current fitness settings; setup errors are handled by the runner."""
|
|
33
40
|
global TIMEOUT_SECONDS, MAX_ERROR_MESSAGES
|
|
@@ -161,6 +168,10 @@ async def _run_gpu_test_binary() -> dict[str, Any]:
|
|
|
161
168
|
error_msg = "GPU memory allocation test failed"
|
|
162
169
|
if result["errors"]:
|
|
163
170
|
error_msg += f": {'; '.join(result['errors'][:MAX_ERROR_MESSAGES])}"
|
|
171
|
+
# Without "Found N GPUs" the binary never reached the devices
|
|
172
|
+
# (NVML or loader failure), so nvidia-smi may still decide.
|
|
173
|
+
if result["found_gpus"]:
|
|
174
|
+
raise GpuAllocationError(error_msg)
|
|
164
175
|
raise RuntimeError(error_msg)
|
|
165
176
|
|
|
166
177
|
log.info(
|
|
@@ -176,9 +187,7 @@ async def _run_gpu_test_binary() -> dict[str, Any]:
|
|
|
176
187
|
raise RuntimeError(
|
|
177
188
|
f"GPU test binary timed out after {TIMEOUT_SECONDS}s"
|
|
178
189
|
) from None
|
|
179
|
-
except FileNotFoundError:
|
|
180
|
-
raise
|
|
181
|
-
except PermissionError:
|
|
190
|
+
except (FileNotFoundError, PermissionError, GpuAllocationError):
|
|
182
191
|
raise
|
|
183
192
|
except Exception as exc:
|
|
184
193
|
raise RuntimeError(f"GPU test binary execution failed: {exc}") from exc
|
|
@@ -238,8 +247,9 @@ async def _check_gpu_health() -> None:
|
|
|
238
247
|
|
|
239
248
|
Execution strategy:
|
|
240
249
|
1. Try binary test if available
|
|
241
|
-
2.
|
|
242
|
-
3.
|
|
250
|
+
2. Fail if the binary reports a GPU allocation failure
|
|
251
|
+
3. Otherwise fall back to Python check if binary fails/missing
|
|
252
|
+
4. Raise RuntimeError if all methods fail
|
|
243
253
|
|
|
244
254
|
Raises:
|
|
245
255
|
RuntimeError: If GPU health check fails
|
|
@@ -251,6 +261,8 @@ async def _check_gpu_health() -> None:
|
|
|
251
261
|
try:
|
|
252
262
|
await _run_gpu_test_binary()
|
|
253
263
|
return # Success!
|
|
264
|
+
except GpuAllocationError:
|
|
265
|
+
raise
|
|
254
266
|
except FileNotFoundError as exc:
|
|
255
267
|
log.debug(f"GPU binary not found: {exc}")
|
|
256
268
|
binary_error = exc
|
|
@@ -17,6 +17,7 @@ import asyncio
|
|
|
17
17
|
import os
|
|
18
18
|
import re
|
|
19
19
|
import shutil
|
|
20
|
+
import sys
|
|
20
21
|
import time
|
|
21
22
|
from urllib.parse import urlsplit
|
|
22
23
|
|
|
@@ -39,6 +40,47 @@ GPU_BENCHMARK_TIMEOUT = 2
|
|
|
39
40
|
CUDA_VERSION_PROBE_TIMEOUT = 5
|
|
40
41
|
|
|
41
42
|
|
|
43
|
+
GPU_FRAMEWORKS = ("torch", "cupy")
|
|
44
|
+
|
|
45
|
+
|
|
46
|
+
def _loaded_module(name: str):
|
|
47
|
+
"""
|
|
48
|
+
Return a module the handler has already imported, without importing it.
|
|
49
|
+
|
|
50
|
+
Importing torch costs ~1.5s on a cold worker. The torch and CuPy checks
|
|
51
|
+
reuse whatever the handler loaded; a framework it has not loaded is
|
|
52
|
+
treated as unavailable, and the gpu_test binary still verifies the GPU.
|
|
53
|
+
|
|
54
|
+
Raises:
|
|
55
|
+
ImportError: If the handler has not imported the module.
|
|
56
|
+
"""
|
|
57
|
+
module = sys.modules.get(name)
|
|
58
|
+
if module is None:
|
|
59
|
+
raise ImportError(f"{name} not loaded by the handler")
|
|
60
|
+
return module
|
|
61
|
+
|
|
62
|
+
|
|
63
|
+
def _handler_loaded_gpu_framework() -> bool:
|
|
64
|
+
"""True if the handler has imported torch or CuPy."""
|
|
65
|
+
return any(sys.modules.get(name) is not None for name in GPU_FRAMEWORKS)
|
|
66
|
+
|
|
67
|
+
|
|
68
|
+
def _torch_without_cuda_context(torch) -> bool:
|
|
69
|
+
"""
|
|
70
|
+
True if the handler imported torch but has not created a CUDA context.
|
|
71
|
+
|
|
72
|
+
The torch checks must never be the first to initialize CUDA in the handler
|
|
73
|
+
process. An engine built in this process afterwards (vLLM's in-process
|
|
74
|
+
AsyncLLM/LLM) sees "CUDA is initialized" and spawns its workers instead of
|
|
75
|
+
forking, re-importing the engine and torch in every child (10.6-11.5 s per
|
|
76
|
+
cold start measured with vLLM v0.30.0). This gate runs before
|
|
77
|
+
torch.cuda.is_available(), whose default cudaGetDeviceCount path also
|
|
78
|
+
initializes the driver and poisons later forks. When the handler has
|
|
79
|
+
already created a context the checks cost nothing extra.
|
|
80
|
+
"""
|
|
81
|
+
return not torch.cuda.is_initialized()
|
|
82
|
+
|
|
83
|
+
|
|
42
84
|
def configure() -> None:
|
|
43
85
|
"""Read current fitness settings; setup errors are handled by the runner."""
|
|
44
86
|
global \
|
|
@@ -347,11 +389,19 @@ async def _check_cuda_initialization() -> None:
|
|
|
347
389
|
|
|
348
390
|
Tests actual device initialization, memory access, and device properties.
|
|
349
391
|
This catches issues where CUDA appears available but fails at runtime.
|
|
350
|
-
Skips silently on CPU-only workers
|
|
392
|
+
Skips silently on CPU-only workers and when the handler has not
|
|
393
|
+
imported PyTorch or CuPy.
|
|
351
394
|
|
|
352
395
|
Raises:
|
|
353
396
|
RuntimeError: If CUDA initialization or device access fails
|
|
354
397
|
"""
|
|
398
|
+
if not _handler_loaded_gpu_framework():
|
|
399
|
+
log.debug(
|
|
400
|
+
"Handler has not loaded PyTorch or CuPy, skipping CUDA initialization "
|
|
401
|
+
"check (the gpu_test binary covers device allocation)"
|
|
402
|
+
)
|
|
403
|
+
return
|
|
404
|
+
|
|
355
405
|
# Skip on CPU-only workers
|
|
356
406
|
if not gpu_available():
|
|
357
407
|
log.debug("No GPU detected, skipping CUDA initialization check")
|
|
@@ -359,7 +409,15 @@ async def _check_cuda_initialization() -> None:
|
|
|
359
409
|
|
|
360
410
|
# Try PyTorch first (most common)
|
|
361
411
|
try:
|
|
362
|
-
|
|
412
|
+
torch = _loaded_module("torch")
|
|
413
|
+
|
|
414
|
+
if _torch_without_cuda_context(torch):
|
|
415
|
+
log.debug(
|
|
416
|
+
"Handler has not created a CUDA context, skipping CUDA initialization "
|
|
417
|
+
"check so the engine can still fork (the gpu_test binary, where it "
|
|
418
|
+
"runs, covers device allocation)"
|
|
419
|
+
)
|
|
420
|
+
return
|
|
363
421
|
|
|
364
422
|
if not torch.cuda.is_available():
|
|
365
423
|
log.debug("CUDA not available in PyTorch, skipping initialization check")
|
|
@@ -403,7 +461,7 @@ async def _check_cuda_initialization() -> None:
|
|
|
403
461
|
|
|
404
462
|
# Fallback: try CuPy
|
|
405
463
|
try:
|
|
406
|
-
|
|
464
|
+
cp = _loaded_module("cupy")
|
|
407
465
|
|
|
408
466
|
# Reset CuPy state
|
|
409
467
|
cp.cuda.Device().synchronize()
|
|
@@ -441,11 +499,18 @@ async def _check_gpu_compute_benchmark() -> None:
|
|
|
441
499
|
Quick GPU compute benchmark using matrix multiplication.
|
|
442
500
|
|
|
443
501
|
Tests basic tensor operations to ensure GPU is functional and responsive.
|
|
444
|
-
Skips silently on CPU-only workers
|
|
502
|
+
Skips silently on CPU-only workers and when the handler has not
|
|
503
|
+
imported PyTorch or CuPy.
|
|
445
504
|
|
|
446
505
|
Raises:
|
|
447
506
|
RuntimeError: If GPU compute fails or is too slow
|
|
448
507
|
"""
|
|
508
|
+
if not _handler_loaded_gpu_framework():
|
|
509
|
+
log.debug(
|
|
510
|
+
"Handler has not loaded PyTorch or CuPy, skipping GPU compute benchmark"
|
|
511
|
+
)
|
|
512
|
+
return
|
|
513
|
+
|
|
449
514
|
# Skip on CPU-only workers
|
|
450
515
|
if not gpu_available():
|
|
451
516
|
log.debug("No GPU detected, skipping GPU compute benchmark")
|
|
@@ -453,7 +518,14 @@ async def _check_gpu_compute_benchmark() -> None:
|
|
|
453
518
|
|
|
454
519
|
# Try PyTorch first
|
|
455
520
|
try:
|
|
456
|
-
|
|
521
|
+
torch = _loaded_module("torch")
|
|
522
|
+
|
|
523
|
+
if _torch_without_cuda_context(torch):
|
|
524
|
+
log.debug(
|
|
525
|
+
"Handler has not created a CUDA context, skipping GPU compute "
|
|
526
|
+
"benchmark so the engine can still fork"
|
|
527
|
+
)
|
|
528
|
+
return
|
|
457
529
|
|
|
458
530
|
if not torch.cuda.is_available():
|
|
459
531
|
log.debug("CUDA not available in PyTorch, skipping benchmark")
|
|
@@ -492,7 +564,7 @@ async def _check_gpu_compute_benchmark() -> None:
|
|
|
492
564
|
|
|
493
565
|
# Fallback: try CuPy
|
|
494
566
|
try:
|
|
495
|
-
|
|
567
|
+
cp = _loaded_module("cupy")
|
|
496
568
|
|
|
497
569
|
size = 1024
|
|
498
570
|
start_time = time.perf_counter()
|
|
@@ -536,9 +608,11 @@ def auto_register_system_checks() -> None:
|
|
|
536
608
|
Registers memory, disk, and network checks for all workers.
|
|
537
609
|
Registers CUDA version, initialization, and GPU benchmark checks only if GPU is detected.
|
|
538
610
|
|
|
539
|
-
The two checks that
|
|
611
|
+
The two checks that use torch and allocate on the device are marked
|
|
540
612
|
@defer_to_worker_start so the import-time pass cannot create a CUDA context
|
|
541
|
-
before the handler module runs.
|
|
613
|
+
before the handler module runs. They only use a framework the handler has
|
|
614
|
+
already imported, and only run when the handler has already created a CUDA
|
|
615
|
+
context, so they never add a torch import or a CUDA context to cold start.
|
|
542
616
|
"""
|
|
543
617
|
configure()
|
|
544
618
|
log.debug("Registering system resource fitness checks")
|
|
@@ -18,7 +18,7 @@ version_tuple: tuple[int | str, ...]
|
|
|
18
18
|
commit_id: str | None
|
|
19
19
|
__commit_id__: str | None
|
|
20
20
|
|
|
21
|
-
__version__ = version = '2.0.
|
|
22
|
-
__version_tuple__ = version_tuple = (2, 0,
|
|
21
|
+
__version__ = version = '2.0.1.dev1'
|
|
22
|
+
__version_tuple__ = version_tuple = (2, 0, 1, 'dev1')
|
|
23
23
|
|
|
24
|
-
__commit_id__ = commit_id = '
|
|
24
|
+
__commit_id__ = commit_id = 'ga4ba07898'
|
|
@@ -1,11 +1,5 @@
|
|
|
1
1
|
"""GraphQL mutations for capabilities absent from the resource REST API."""
|
|
2
2
|
|
|
3
|
-
MUTATION_CREATE_GLOBAL_VOLUME = """
|
|
4
|
-
mutation createGlobalVolume($input: GlobalStoreBucketCreateInput!) {
|
|
5
|
-
globalStoreBucketCreate(input: $input) { id name }
|
|
6
|
-
}
|
|
7
|
-
"""
|
|
8
|
-
|
|
9
3
|
# endpoint saves retain flash bindings, cached models, and schedules atomically.
|
|
10
4
|
MUTATION_SAVE_ENDPOINT = """
|
|
11
5
|
mutation saveEndpoint($input: EndpointInput!) {
|
|
@@ -1,13 +1,5 @@
|
|
|
1
1
|
"""GraphQL queries for capabilities absent from the resource REST API."""
|
|
2
2
|
|
|
3
|
-
QUERY_GLOBAL_VOLUMES = """
|
|
4
|
-
query myGlobalVolumes {
|
|
5
|
-
myself {
|
|
6
|
-
globalStoreBuckets { id name }
|
|
7
|
-
}
|
|
8
|
-
}
|
|
9
|
-
"""
|
|
10
|
-
|
|
11
3
|
# rest stock filters require a power-of-two count of at least two.
|
|
12
4
|
QUERY_CPU_STOCK = """
|
|
13
5
|
query CpuStock($cpuFlavorInput: CpuFlavorInput, $specificsInput: SpecificsInput) {
|