truss 0.11.13rc1__tar.gz → 0.11.13rc3__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.
Potentially problematic release.
This version of truss might be problematic. Click here for more details.
- {truss-0.11.13rc1 → truss-0.11.13rc3}/PKG-INFO +2 -2
- {truss-0.11.13rc1 → truss-0.11.13rc3}/pyproject.toml +2 -2
- {truss-0.11.13rc1 → truss-0.11.13rc3}/truss/templates/server/requirements.txt +1 -1
- {truss-0.11.13rc1 → truss-0.11.13rc3}/truss/templates/server.Dockerfile.jinja +7 -7
- truss-0.11.13rc3/truss/templates/shared/lazy_data_resolver.py +351 -0
- {truss-0.11.13rc1 → truss-0.11.13rc3}/truss/tests/conftest.py +0 -9
- {truss-0.11.13rc1 → truss-0.11.13rc3}/truss/tests/test_truss_handle.py +0 -42
- truss-0.11.13rc1/truss/templates/shared/lazy_data_resolver.py +0 -153
- truss-0.11.13rc1/truss/tests/test_data/test_editable_external_pkg/config.yaml +0 -5
- truss-0.11.13rc1/truss/tests/test_data/test_editable_external_pkg/model/model.py +0 -6
- truss-0.11.13rc1/truss/tests/test_data/test_editable_external_pkg_parent/local_pkg/pyproject.toml +0 -10
- truss-0.11.13rc1/truss/tests/test_data/test_editable_external_pkg_parent/local_pkg/src/local_pkg/__init__.py +0 -1
- {truss-0.11.13rc1 → truss-0.11.13rc3}/.github/ISSUE_TEMPLATE/bug_report.md +0 -0
- {truss-0.11.13rc1 → truss-0.11.13rc3}/.github/ISSUE_TEMPLATE/feature_request.md +0 -0
- {truss-0.11.13rc1 → truss-0.11.13rc3}/.github/pull_request_template.md +0 -0
- {truss-0.11.13rc1 → truss-0.11.13rc3}/.gitignore +0 -0
- {truss-0.11.13rc1 → truss-0.11.13rc3}/CODE_OF_CONDUCT.md +0 -0
- {truss-0.11.13rc1 → truss-0.11.13rc3}/CONTRIBUTING.md +0 -0
- {truss-0.11.13rc1 → truss-0.11.13rc3}/LICENSE +0 -0
- {truss-0.11.13rc1 → truss-0.11.13rc3}/README.md +0 -0
- {truss-0.11.13rc1 → truss-0.11.13rc3}/baseten-performance-client/README.md +0 -0
- {truss-0.11.13rc1 → truss-0.11.13rc3}/baseten-performance-client/node_bindings/README.md +0 -0
- {truss-0.11.13rc1 → truss-0.11.13rc3}/baseten-performance-client/node_bindings/npm/android-arm-eabi/README.md +0 -0
- {truss-0.11.13rc1 → truss-0.11.13rc3}/baseten-performance-client/node_bindings/npm/android-arm64/README.md +0 -0
- {truss-0.11.13rc1 → truss-0.11.13rc3}/baseten-performance-client/node_bindings/npm/darwin-arm64/README.md +0 -0
- {truss-0.11.13rc1 → truss-0.11.13rc3}/baseten-performance-client/node_bindings/npm/darwin-universal/README.md +0 -0
- {truss-0.11.13rc1 → truss-0.11.13rc3}/baseten-performance-client/node_bindings/npm/darwin-x64/README.md +0 -0
- {truss-0.11.13rc1 → truss-0.11.13rc3}/baseten-performance-client/node_bindings/npm/freebsd-x64/README.md +0 -0
- {truss-0.11.13rc1 → truss-0.11.13rc3}/baseten-performance-client/node_bindings/npm/linux-arm-gnueabihf/README.md +0 -0
- {truss-0.11.13rc1 → truss-0.11.13rc3}/baseten-performance-client/node_bindings/npm/linux-arm-musleabihf/README.md +0 -0
- {truss-0.11.13rc1 → truss-0.11.13rc3}/baseten-performance-client/node_bindings/npm/linux-arm64-gnu/README.md +0 -0
- {truss-0.11.13rc1 → truss-0.11.13rc3}/baseten-performance-client/node_bindings/npm/linux-arm64-musl/README.md +0 -0
- {truss-0.11.13rc1 → truss-0.11.13rc3}/baseten-performance-client/node_bindings/npm/linux-riscv64-gnu/README.md +0 -0
- {truss-0.11.13rc1 → truss-0.11.13rc3}/baseten-performance-client/node_bindings/npm/linux-x64-gnu/README.md +0 -0
- {truss-0.11.13rc1 → truss-0.11.13rc3}/baseten-performance-client/node_bindings/npm/linux-x64-musl/README.md +0 -0
- {truss-0.11.13rc1 → truss-0.11.13rc3}/baseten-performance-client/node_bindings/npm/win32-arm64-msvc/README.md +0 -0
- {truss-0.11.13rc1 → truss-0.11.13rc3}/baseten-performance-client/node_bindings/npm/win32-ia32-msvc/README.md +0 -0
- {truss-0.11.13rc1 → truss-0.11.13rc3}/baseten-performance-client/node_bindings/npm/win32-x64-msvc/README.md +0 -0
- {truss-0.11.13rc1 → truss-0.11.13rc3}/baseten-performance-client/python_bindings/README.md +0 -0
- {truss-0.11.13rc1 → truss-0.11.13rc3}/baseten-performance-client/scripts/README_nodejs.md +0 -0
- {truss-0.11.13rc1 → truss-0.11.13rc3}/context_builder.Dockerfile +0 -0
- {truss-0.11.13rc1 → truss-0.11.13rc3}/docs/README.md +0 -0
- {truss-0.11.13rc1 → truss-0.11.13rc3}/docs/chains/doc_gen/README.md +0 -0
- {truss-0.11.13rc1 → truss-0.11.13rc3}/docs/contribute/base-images.md +0 -0
- {truss-0.11.13rc1 → truss-0.11.13rc3}/docs/contribute/release.md +0 -0
- {truss-0.11.13rc1 → truss-0.11.13rc3}/truss/__init__.py +0 -0
- {truss-0.11.13rc1 → truss-0.11.13rc3}/truss/api/__init__.py +0 -0
- {truss-0.11.13rc1 → truss-0.11.13rc3}/truss/api/definitions.py +0 -0
- {truss-0.11.13rc1 → truss-0.11.13rc3}/truss/base/__init__.py +0 -0
- {truss-0.11.13rc1 → truss-0.11.13rc3}/truss/base/constants.py +0 -0
- {truss-0.11.13rc1 → truss-0.11.13rc3}/truss/base/custom_types.py +0 -0
- {truss-0.11.13rc1 → truss-0.11.13rc3}/truss/base/errors.py +0 -0
- {truss-0.11.13rc1 → truss-0.11.13rc3}/truss/base/trt_llm_config.py +0 -0
- {truss-0.11.13rc1 → truss-0.11.13rc3}/truss/base/truss_config.py +0 -0
- {truss-0.11.13rc1 → truss-0.11.13rc3}/truss/base/truss_spec.py +0 -0
- {truss-0.11.13rc1 → truss-0.11.13rc3}/truss/cli/chains_commands.py +0 -0
- {truss-0.11.13rc1 → truss-0.11.13rc3}/truss/cli/cli.py +0 -0
- {truss-0.11.13rc1 → truss-0.11.13rc3}/truss/cli/logs/base_watcher.py +0 -0
- {truss-0.11.13rc1 → truss-0.11.13rc3}/truss/cli/logs/model_log_watcher.py +0 -0
- {truss-0.11.13rc1 → truss-0.11.13rc3}/truss/cli/logs/training_log_watcher.py +0 -0
- {truss-0.11.13rc1 → truss-0.11.13rc3}/truss/cli/logs/utils.py +0 -0
- {truss-0.11.13rc1 → truss-0.11.13rc3}/truss/cli/remote_cli.py +0 -0
- {truss-0.11.13rc1 → truss-0.11.13rc3}/truss/cli/train/common.py +0 -0
- {truss-0.11.13rc1 → truss-0.11.13rc3}/truss/cli/train/core.py +0 -0
- {truss-0.11.13rc1 → truss-0.11.13rc3}/truss/cli/train/deploy_checkpoints/__init__.py +0 -0
- {truss-0.11.13rc1 → truss-0.11.13rc3}/truss/cli/train/deploy_checkpoints/deploy_checkpoints.py +0 -0
- {truss-0.11.13rc1 → truss-0.11.13rc3}/truss/cli/train/deploy_checkpoints/deploy_checkpoints_helpers.py +0 -0
- {truss-0.11.13rc1 → truss-0.11.13rc3}/truss/cli/train/deploy_checkpoints/deploy_full_checkpoints.py +0 -0
- {truss-0.11.13rc1 → truss-0.11.13rc3}/truss/cli/train/deploy_checkpoints/deploy_lora_checkpoints.py +0 -0
- {truss-0.11.13rc1 → truss-0.11.13rc3}/truss/cli/train/deploy_checkpoints/deploy_whisper_checkpoints.py +0 -0
- {truss-0.11.13rc1 → truss-0.11.13rc3}/truss/cli/train/deploy_from_checkpoint_config.yml +0 -0
- {truss-0.11.13rc1 → truss-0.11.13rc3}/truss/cli/train/deploy_from_checkpoint_config_whisper.yml +0 -0
- {truss-0.11.13rc1 → truss-0.11.13rc3}/truss/cli/train/metrics_watcher.py +0 -0
- {truss-0.11.13rc1 → truss-0.11.13rc3}/truss/cli/train/poller.py +0 -0
- {truss-0.11.13rc1 → truss-0.11.13rc3}/truss/cli/train/types.py +0 -0
- {truss-0.11.13rc1 → truss-0.11.13rc3}/truss/cli/train_commands.py +0 -0
- {truss-0.11.13rc1 → truss-0.11.13rc3}/truss/cli/utils/common.py +0 -0
- {truss-0.11.13rc1 → truss-0.11.13rc3}/truss/cli/utils/output.py +0 -0
- {truss-0.11.13rc1 → truss-0.11.13rc3}/truss/cli/utils/self_upgrade.py +0 -0
- {truss-0.11.13rc1 → truss-0.11.13rc3}/truss/contexts/docker_build_setup.py +0 -0
- {truss-0.11.13rc1 → truss-0.11.13rc3}/truss/contexts/image_builder/cache_warmer.py +0 -0
- {truss-0.11.13rc1 → truss-0.11.13rc3}/truss/contexts/image_builder/image_builder.py +0 -0
- {truss-0.11.13rc1 → truss-0.11.13rc3}/truss/contexts/image_builder/serving_image_builder.py +0 -0
- {truss-0.11.13rc1 → truss-0.11.13rc3}/truss/contexts/image_builder/util.py +0 -0
- {truss-0.11.13rc1 → truss-0.11.13rc3}/truss/contexts/local_loader/docker_build_emulator.py +0 -0
- {truss-0.11.13rc1 → truss-0.11.13rc3}/truss/contexts/local_loader/dockerfile_parser.py +0 -0
- {truss-0.11.13rc1 → truss-0.11.13rc3}/truss/contexts/local_loader/load_model_local.py +0 -0
- {truss-0.11.13rc1 → truss-0.11.13rc3}/truss/contexts/local_loader/truss_module_loader.py +0 -0
- {truss-0.11.13rc1 → truss-0.11.13rc3}/truss/contexts/local_loader/utils.py +0 -0
- {truss-0.11.13rc1 → truss-0.11.13rc3}/truss/contexts/truss_context.py +0 -0
- {truss-0.11.13rc1 → truss-0.11.13rc3}/truss/local/local_config.py +0 -0
- {truss-0.11.13rc1 → truss-0.11.13rc3}/truss/local/local_config_handler.py +0 -0
- {truss-0.11.13rc1 → truss-0.11.13rc3}/truss/patch/__init__.py +0 -0
- {truss-0.11.13rc1 → truss-0.11.13rc3}/truss/patch/hash.py +0 -0
- {truss-0.11.13rc1 → truss-0.11.13rc3}/truss/patch/signature.py +0 -0
- {truss-0.11.13rc1 → truss-0.11.13rc3}/truss/patch/truss_dir_patch_applier.py +0 -0
- {truss-0.11.13rc1 → truss-0.11.13rc3}/truss/remote/baseten/__init__.py +0 -0
- {truss-0.11.13rc1 → truss-0.11.13rc3}/truss/remote/baseten/api.py +0 -0
- {truss-0.11.13rc1 → truss-0.11.13rc3}/truss/remote/baseten/auth.py +0 -0
- {truss-0.11.13rc1 → truss-0.11.13rc3}/truss/remote/baseten/core.py +0 -0
- {truss-0.11.13rc1 → truss-0.11.13rc3}/truss/remote/baseten/custom_types.py +0 -0
- {truss-0.11.13rc1 → truss-0.11.13rc3}/truss/remote/baseten/error.py +0 -0
- {truss-0.11.13rc1 → truss-0.11.13rc3}/truss/remote/baseten/remote.py +0 -0
- {truss-0.11.13rc1 → truss-0.11.13rc3}/truss/remote/baseten/rest_client.py +0 -0
- {truss-0.11.13rc1 → truss-0.11.13rc3}/truss/remote/baseten/service.py +0 -0
- {truss-0.11.13rc1 → truss-0.11.13rc3}/truss/remote/baseten/utils/status.py +0 -0
- {truss-0.11.13rc1 → truss-0.11.13rc3}/truss/remote/baseten/utils/tar.py +0 -0
- {truss-0.11.13rc1 → truss-0.11.13rc3}/truss/remote/baseten/utils/time.py +0 -0
- {truss-0.11.13rc1 → truss-0.11.13rc3}/truss/remote/baseten/utils/transfer.py +0 -0
- {truss-0.11.13rc1 → truss-0.11.13rc3}/truss/remote/remote_factory.py +0 -0
- {truss-0.11.13rc1 → truss-0.11.13rc3}/truss/remote/truss_remote.py +0 -0
- {truss-0.11.13rc1 → truss-0.11.13rc3}/truss/templates/README.md.jinja +0 -0
- {truss-0.11.13rc1 → truss-0.11.13rc3}/truss/templates/__init__.py +0 -0
- {truss-0.11.13rc1 → truss-0.11.13rc3}/truss/templates/base.Dockerfile.jinja +0 -0
- {truss-0.11.13rc1 → truss-0.11.13rc3}/truss/templates/cache.Dockerfile.jinja +0 -0
- {truss-0.11.13rc1 → truss-0.11.13rc3}/truss/templates/cache_requirements.txt +0 -0
- {truss-0.11.13rc1 → truss-0.11.13rc3}/truss/templates/control/control/application.py +0 -0
- {truss-0.11.13rc1 → truss-0.11.13rc3}/truss/templates/control/control/endpoints.py +0 -0
- {truss-0.11.13rc1 → truss-0.11.13rc3}/truss/templates/control/control/helpers/context_managers.py +0 -0
- {truss-0.11.13rc1 → truss-0.11.13rc3}/truss/templates/control/control/helpers/custom_types.py +0 -0
- {truss-0.11.13rc1 → truss-0.11.13rc3}/truss/templates/control/control/helpers/errors.py +0 -0
- {truss-0.11.13rc1 → truss-0.11.13rc3}/truss/templates/control/control/helpers/inference_server_controller.py +0 -0
- {truss-0.11.13rc1 → truss-0.11.13rc3}/truss/templates/control/control/helpers/inference_server_process_controller.py +0 -0
- {truss-0.11.13rc1 → truss-0.11.13rc3}/truss/templates/control/control/helpers/inference_server_starter.py +0 -0
- {truss-0.11.13rc1 → truss-0.11.13rc3}/truss/templates/control/control/helpers/truss_patch/__init__.py +0 -0
- {truss-0.11.13rc1 → truss-0.11.13rc3}/truss/templates/control/control/helpers/truss_patch/model_code_patch_applier.py +0 -0
- {truss-0.11.13rc1 → truss-0.11.13rc3}/truss/templates/control/control/helpers/truss_patch/model_container_patch_applier.py +0 -0
- {truss-0.11.13rc1 → truss-0.11.13rc3}/truss/templates/control/control/helpers/truss_patch/requirement_name_identifier.py +0 -0
- {truss-0.11.13rc1 → truss-0.11.13rc3}/truss/templates/control/control/helpers/truss_patch/system_packages.py +0 -0
- {truss-0.11.13rc1 → truss-0.11.13rc3}/truss/templates/control/control/server.py +0 -0
- {truss-0.11.13rc1 → truss-0.11.13rc3}/truss/templates/control/requirements.txt +0 -0
- {truss-0.11.13rc1 → truss-0.11.13rc3}/truss/templates/copy_cache_files.Dockerfile.jinja +0 -0
- {truss-0.11.13rc1 → truss-0.11.13rc3}/truss/templates/custom/examples.yaml +0 -0
- {truss-0.11.13rc1 → truss-0.11.13rc3}/truss/templates/custom/model/__init__.py +0 -0
- {truss-0.11.13rc1 → truss-0.11.13rc3}/truss/templates/custom/model/model.py +0 -0
- {truss-0.11.13rc1 → truss-0.11.13rc3}/truss/templates/custom_python_dx/my_model.py +0 -0
- {truss-0.11.13rc1 → truss-0.11.13rc3}/truss/templates/docker_server/proxy.conf.jinja +0 -0
- {truss-0.11.13rc1 → truss-0.11.13rc3}/truss/templates/docker_server/supervisord.conf.jinja +0 -0
- {truss-0.11.13rc1 → truss-0.11.13rc3}/truss/templates/docker_server_requirements.txt +0 -0
- {truss-0.11.13rc1 → truss-0.11.13rc3}/truss/templates/server/__init__.py +0 -0
- {truss-0.11.13rc1 → truss-0.11.13rc3}/truss/templates/server/common/__init__.py +0 -0
- {truss-0.11.13rc1 → truss-0.11.13rc3}/truss/templates/server/common/errors.py +0 -0
- {truss-0.11.13rc1 → truss-0.11.13rc3}/truss/templates/server/common/patches/whisper/patch.py +0 -0
- {truss-0.11.13rc1 → truss-0.11.13rc3}/truss/templates/server/common/patches.py +0 -0
- {truss-0.11.13rc1 → truss-0.11.13rc3}/truss/templates/server/common/retry.py +0 -0
- {truss-0.11.13rc1 → truss-0.11.13rc3}/truss/templates/server/common/schema.py +0 -0
- {truss-0.11.13rc1 → truss-0.11.13rc3}/truss/templates/server/common/tracing.py +0 -0
- {truss-0.11.13rc1 → truss-0.11.13rc3}/truss/templates/server/main.py +0 -0
- {truss-0.11.13rc1 → truss-0.11.13rc3}/truss/templates/server/model_wrapper.py +0 -0
- {truss-0.11.13rc1 → truss-0.11.13rc3}/truss/templates/server/truss_server.py +0 -0
- {truss-0.11.13rc1 → truss-0.11.13rc3}/truss/templates/shared/__init__.py +0 -0
- {truss-0.11.13rc1 → truss-0.11.13rc3}/truss/templates/shared/dynamic_config_resolver.py +0 -0
- {truss-0.11.13rc1 → truss-0.11.13rc3}/truss/templates/shared/log_config.py +0 -0
- {truss-0.11.13rc1 → truss-0.11.13rc3}/truss/templates/shared/secrets_resolver.py +0 -0
- {truss-0.11.13rc1 → truss-0.11.13rc3}/truss/templates/shared/serialization.py +0 -0
- {truss-0.11.13rc1 → truss-0.11.13rc3}/truss/templates/shared/util.py +0 -0
- {truss-0.11.13rc1 → truss-0.11.13rc3}/truss/templates/train/config.py +0 -0
- {truss-0.11.13rc1 → truss-0.11.13rc3}/truss/templates/train/run.sh +0 -0
- {truss-0.11.13rc1 → truss-0.11.13rc3}/truss/templates/trtllm-audio/model/model.py +0 -0
- {truss-0.11.13rc1 → truss-0.11.13rc3}/truss/templates/trtllm-audio/packages/sigint_patch.py +0 -0
- {truss-0.11.13rc1 → truss-0.11.13rc3}/truss/templates/trtllm-audio/packages/whisper_trt/__init__.py +0 -0
- {truss-0.11.13rc1 → truss-0.11.13rc3}/truss/templates/trtllm-audio/packages/whisper_trt/assets.py +0 -0
- {truss-0.11.13rc1 → truss-0.11.13rc3}/truss/templates/trtllm-audio/packages/whisper_trt/batching.py +0 -0
- {truss-0.11.13rc1 → truss-0.11.13rc3}/truss/templates/trtllm-audio/packages/whisper_trt/custom_types.py +0 -0
- {truss-0.11.13rc1 → truss-0.11.13rc3}/truss/templates/trtllm-audio/packages/whisper_trt/modeling.py +0 -0
- {truss-0.11.13rc1 → truss-0.11.13rc3}/truss/templates/trtllm-audio/packages/whisper_trt/tokenizer.py +0 -0
- {truss-0.11.13rc1 → truss-0.11.13rc3}/truss/templates/trtllm-audio/packages/whisper_trt/utils.py +0 -0
- {truss-0.11.13rc1 → truss-0.11.13rc3}/truss/templates/trtllm-briton/README.md +0 -0
- {truss-0.11.13rc1 → truss-0.11.13rc3}/truss/templates/trtllm-briton/src/extension.py +0 -0
- {truss-0.11.13rc1 → truss-0.11.13rc3}/truss/tests/__init__.py +0 -0
- {truss-0.11.13rc1 → truss-0.11.13rc3}/truss/tests/cli/test_cli.py +0 -0
- {truss-0.11.13rc1 → truss-0.11.13rc3}/truss/tests/cli/train/resources/test_deploy_from_checkpoint_config.yml +0 -0
- {truss-0.11.13rc1 → truss-0.11.13rc3}/truss/tests/cli/train/test_cache_view.py +0 -0
- {truss-0.11.13rc1 → truss-0.11.13rc3}/truss/tests/cli/train/test_deploy_checkpoints.py +0 -0
- {truss-0.11.13rc1 → truss-0.11.13rc3}/truss/tests/cli/train/test_train_cli_core.py +0 -0
- {truss-0.11.13rc1 → truss-0.11.13rc3}/truss/tests/cli/train/test_train_init.py +0 -0
- {truss-0.11.13rc1 → truss-0.11.13rc3}/truss/tests/contexts/image_builder/test_serving_image_builder.py +0 -0
- {truss-0.11.13rc1 → truss-0.11.13rc3}/truss/tests/contexts/local_loader/test_load_local.py +0 -0
- {truss-0.11.13rc1 → truss-0.11.13rc3}/truss/tests/contexts/local_loader/test_truss_module_finder.py +0 -0
- {truss-0.11.13rc1 → truss-0.11.13rc3}/truss/tests/helpers.py +0 -0
- {truss-0.11.13rc1 → truss-0.11.13rc3}/truss/tests/local/test_local_config_handler.py +0 -0
- {truss-0.11.13rc1 → truss-0.11.13rc3}/truss/tests/patch/test_calc_patch.py +0 -0
- {truss-0.11.13rc1 → truss-0.11.13rc3}/truss/tests/patch/test_dir_signature.py +0 -0
- {truss-0.11.13rc1 → truss-0.11.13rc3}/truss/tests/patch/test_hash.py +0 -0
- {truss-0.11.13rc1 → truss-0.11.13rc3}/truss/tests/patch/test_signature.py +0 -0
- {truss-0.11.13rc1 → truss-0.11.13rc3}/truss/tests/patch/test_truss_dir_patch_applier.py +0 -0
- {truss-0.11.13rc1 → truss-0.11.13rc3}/truss/tests/patch/test_types.py +0 -0
- {truss-0.11.13rc1 → truss-0.11.13rc3}/truss/tests/remote/baseten/conftest.py +0 -0
- {truss-0.11.13rc1 → truss-0.11.13rc3}/truss/tests/remote/baseten/test_api.py +0 -0
- {truss-0.11.13rc1 → truss-0.11.13rc3}/truss/tests/remote/baseten/test_auth.py +0 -0
- {truss-0.11.13rc1 → truss-0.11.13rc3}/truss/tests/remote/baseten/test_core.py +0 -0
- {truss-0.11.13rc1 → truss-0.11.13rc3}/truss/tests/remote/baseten/test_remote.py +0 -0
- {truss-0.11.13rc1 → truss-0.11.13rc3}/truss/tests/remote/baseten/test_service.py +0 -0
- {truss-0.11.13rc1 → truss-0.11.13rc3}/truss/tests/remote/test_remote_factory.py +0 -0
- {truss-0.11.13rc1 → truss-0.11.13rc3}/truss/tests/remote/test_truss_remote.py +0 -0
- {truss-0.11.13rc1 → truss-0.11.13rc3}/truss/tests/templates/control/control/conftest.py +0 -0
- {truss-0.11.13rc1 → truss-0.11.13rc3}/truss/tests/templates/control/control/helpers/test_context_managers.py +0 -0
- {truss-0.11.13rc1 → truss-0.11.13rc3}/truss/tests/templates/control/control/helpers/test_model_container_patch_applier.py +0 -0
- {truss-0.11.13rc1 → truss-0.11.13rc3}/truss/tests/templates/control/control/helpers/test_requirement_name_identifier.py +0 -0
- {truss-0.11.13rc1 → truss-0.11.13rc3}/truss/tests/templates/control/control/test_endpoints.py +0 -0
- {truss-0.11.13rc1 → truss-0.11.13rc3}/truss/tests/templates/control/control/test_server.py +0 -0
- {truss-0.11.13rc1 → truss-0.11.13rc3}/truss/tests/templates/control/control/test_server_integration.py +0 -0
- {truss-0.11.13rc1 → truss-0.11.13rc3}/truss/tests/templates/core/server/test_dynamic_config_resolver.py +0 -0
- {truss-0.11.13rc1 → truss-0.11.13rc3}/truss/tests/templates/core/server/test_lazy_data_resolver_v2.py +0 -0
- {truss-0.11.13rc1 → truss-0.11.13rc3}/truss/tests/templates/core/server/test_secrets_resolver.py +0 -0
- {truss-0.11.13rc1 → truss-0.11.13rc3}/truss/tests/templates/server/common/test_retry.py +0 -0
- {truss-0.11.13rc1 → truss-0.11.13rc3}/truss/tests/templates/server/test_model_wrapper.py +0 -0
- {truss-0.11.13rc1 → truss-0.11.13rc3}/truss/tests/templates/server/test_schema.py +0 -0
- {truss-0.11.13rc1 → truss-0.11.13rc3}/truss/tests/templates/server/test_truss_server.py +0 -0
- {truss-0.11.13rc1 → truss-0.11.13rc3}/truss/tests/test_build.py +0 -0
- {truss-0.11.13rc1 → truss-0.11.13rc3}/truss/tests/test_config.py +0 -0
- {truss-0.11.13rc1 → truss-0.11.13rc3}/truss/tests/test_context_builder_image.py +0 -0
- {truss-0.11.13rc1 → truss-0.11.13rc3}/truss/tests/test_control_truss_patching.py +0 -0
- {truss-0.11.13rc1 → truss-0.11.13rc3}/truss/tests/test_custom_server.py +0 -0
- {truss-0.11.13rc1 → truss-0.11.13rc3}/truss/tests/test_data/__init__.py +0 -0
- {truss-0.11.13rc1 → truss-0.11.13rc3}/truss/tests/test_data/annotated_types_truss/__init__.py +0 -0
- {truss-0.11.13rc1 → truss-0.11.13rc3}/truss/tests/test_data/annotated_types_truss/config.yaml +0 -0
- {truss-0.11.13rc1 → truss-0.11.13rc3}/truss/tests/test_data/annotated_types_truss/model/__init__.py +0 -0
- {truss-0.11.13rc1 → truss-0.11.13rc3}/truss/tests/test_data/annotated_types_truss/model/model.py +0 -0
- {truss-0.11.13rc1 → truss-0.11.13rc3}/truss/tests/test_data/auto-mpg.data +0 -0
- {truss-0.11.13rc1 → truss-0.11.13rc3}/truss/tests/test_data/context_builder_image_test/Dockerfile +0 -0
- {truss-0.11.13rc1 → truss-0.11.13rc3}/truss/tests/test_data/context_builder_image_test/__init__.py +0 -0
- {truss-0.11.13rc1 → truss-0.11.13rc3}/truss/tests/test_data/context_builder_image_test/test.py +0 -0
- {truss-0.11.13rc1 → truss-0.11.13rc3}/truss/tests/test_data/gcs_fix/__init__.py +0 -0
- {truss-0.11.13rc1 → truss-0.11.13rc3}/truss/tests/test_data/gcs_fix/config.yaml +0 -0
- {truss-0.11.13rc1 → truss-0.11.13rc3}/truss/tests/test_data/gcs_fix/model/__init__.py +0 -0
- {truss-0.11.13rc1 → truss-0.11.13rc3}/truss/tests/test_data/gcs_fix/model/model.py +0 -0
- {truss-0.11.13rc1 → truss-0.11.13rc3}/truss/tests/test_data/happy.ipynb +0 -0
- {truss-0.11.13rc1 → truss-0.11.13rc3}/truss/tests/test_data/model_load_failure_test/__init__.py +0 -0
- {truss-0.11.13rc1 → truss-0.11.13rc3}/truss/tests/test_data/model_load_failure_test/config.yaml +0 -0
- {truss-0.11.13rc1 → truss-0.11.13rc3}/truss/tests/test_data/model_load_failure_test/model/__init__.py +0 -0
- {truss-0.11.13rc1 → truss-0.11.13rc3}/truss/tests/test_data/model_load_failure_test/model/model.py +0 -0
- {truss-0.11.13rc1 → truss-0.11.13rc3}/truss/tests/test_data/patch_ping_test_server/__init__.py +0 -0
- {truss-0.11.13rc1 → truss-0.11.13rc3}/truss/tests/test_data/patch_ping_test_server/app.py +0 -0
- {truss-0.11.13rc1 → truss-0.11.13rc3}/truss/tests/test_data/pima-indians-diabetes.csv +0 -0
- {truss-0.11.13rc1 → truss-0.11.13rc3}/truss/tests/test_data/readme_int_example.md +0 -0
- {truss-0.11.13rc1 → truss-0.11.13rc3}/truss/tests/test_data/readme_no_example.md +0 -0
- {truss-0.11.13rc1 → truss-0.11.13rc3}/truss/tests/test_data/readme_str_example.md +0 -0
- {truss-0.11.13rc1 → truss-0.11.13rc3}/truss/tests/test_data/server.Dockerfile +0 -0
- {truss-0.11.13rc1 → truss-0.11.13rc3}/truss/tests/test_data/server_conformance_test_truss/__init__.py +0 -0
- {truss-0.11.13rc1 → truss-0.11.13rc3}/truss/tests/test_data/server_conformance_test_truss/config.yaml +0 -0
- {truss-0.11.13rc1 → truss-0.11.13rc3}/truss/tests/test_data/server_conformance_test_truss/model/__init__.py +0 -0
- {truss-0.11.13rc1 → truss-0.11.13rc3}/truss/tests/test_data/server_conformance_test_truss/model/model.py +0 -0
- {truss-0.11.13rc1 → truss-0.11.13rc3}/truss/tests/test_data/test_async_truss/__init__.py +0 -0
- {truss-0.11.13rc1 → truss-0.11.13rc3}/truss/tests/test_data/test_async_truss/config.yaml +0 -0
- {truss-0.11.13rc1 → truss-0.11.13rc3}/truss/tests/test_data/test_async_truss/model/__init__.py +0 -0
- {truss-0.11.13rc1 → truss-0.11.13rc3}/truss/tests/test_data/test_async_truss/model/model.py +0 -0
- {truss-0.11.13rc1 → truss-0.11.13rc3}/truss/tests/test_data/test_basic_truss/__init__.py +0 -0
- {truss-0.11.13rc1 → truss-0.11.13rc3}/truss/tests/test_data/test_basic_truss/config.yaml +0 -0
- {truss-0.11.13rc1 → truss-0.11.13rc3}/truss/tests/test_data/test_basic_truss/model/__init__.py +0 -0
- {truss-0.11.13rc1 → truss-0.11.13rc3}/truss/tests/test_data/test_basic_truss/model/model.py +0 -0
- {truss-0.11.13rc1 → truss-0.11.13rc3}/truss/tests/test_data/test_build_commands/__init__.py +0 -0
- {truss-0.11.13rc1 → truss-0.11.13rc3}/truss/tests/test_data/test_build_commands/config.yaml +0 -0
- {truss-0.11.13rc1 → truss-0.11.13rc3}/truss/tests/test_data/test_build_commands/model/__init__.py +0 -0
- {truss-0.11.13rc1 → truss-0.11.13rc3}/truss/tests/test_data/test_build_commands/model/model.py +0 -0
- {truss-0.11.13rc1 → truss-0.11.13rc3}/truss/tests/test_data/test_build_commands_failure/__init__.py +0 -0
- {truss-0.11.13rc1 → truss-0.11.13rc3}/truss/tests/test_data/test_build_commands_failure/config.yaml +0 -0
- {truss-0.11.13rc1 → truss-0.11.13rc3}/truss/tests/test_data/test_build_commands_failure/model/__init__.py +0 -0
- {truss-0.11.13rc1 → truss-0.11.13rc3}/truss/tests/test_data/test_build_commands_failure/model/model.py +0 -0
- {truss-0.11.13rc1 → truss-0.11.13rc3}/truss/tests/test_data/test_concurrency_truss/__init__.py +0 -0
- {truss-0.11.13rc1 → truss-0.11.13rc3}/truss/tests/test_data/test_concurrency_truss/config.yaml +0 -0
- {truss-0.11.13rc1 → truss-0.11.13rc3}/truss/tests/test_data/test_concurrency_truss/model/__init__.py +0 -0
- {truss-0.11.13rc1 → truss-0.11.13rc3}/truss/tests/test_data/test_concurrency_truss/model/model.py +0 -0
- {truss-0.11.13rc1 → truss-0.11.13rc3}/truss/tests/test_data/test_custom_server_truss/__init__.py +0 -0
- {truss-0.11.13rc1 → truss-0.11.13rc3}/truss/tests/test_data/test_custom_server_truss/config.yaml +0 -0
- {truss-0.11.13rc1 → truss-0.11.13rc3}/truss/tests/test_data/test_custom_server_truss/test_docker_image/Dockerfile +0 -0
- {truss-0.11.13rc1 → truss-0.11.13rc3}/truss/tests/test_data/test_custom_server_truss/test_docker_image/README.md +0 -0
- {truss-0.11.13rc1 → truss-0.11.13rc3}/truss/tests/test_data/test_custom_server_truss/test_docker_image/VERSION +0 -0
- {truss-0.11.13rc1 → truss-0.11.13rc3}/truss/tests/test_data/test_custom_server_truss/test_docker_image/__init__.py +0 -0
- {truss-0.11.13rc1 → truss-0.11.13rc3}/truss/tests/test_data/test_custom_server_truss/test_docker_image/app.py +0 -0
- {truss-0.11.13rc1 → truss-0.11.13rc3}/truss/tests/test_data/test_custom_server_truss/test_docker_image/build_upload_new_image.sh +0 -0
- {truss-0.11.13rc1 → truss-0.11.13rc3}/truss/tests/test_data/test_env_vars/config.yaml +0 -0
- {truss-0.11.13rc1 → truss-0.11.13rc3}/truss/tests/test_data/test_go_custom_server_truss/config.yaml +0 -0
- {truss-0.11.13rc1 → truss-0.11.13rc3}/truss/tests/test_data/test_go_custom_server_truss/docker/Dockerfile +0 -0
- {truss-0.11.13rc1 → truss-0.11.13rc3}/truss/tests/test_data/test_go_custom_server_truss/docker/README.md +0 -0
- {truss-0.11.13rc1 → truss-0.11.13rc3}/truss/tests/test_data/test_go_custom_server_truss/docker/VERSION +0 -0
- {truss-0.11.13rc1 → truss-0.11.13rc3}/truss/tests/test_data/test_go_custom_server_truss/docker/build_upload_new_image.sh +0 -0
- {truss-0.11.13rc1 → truss-0.11.13rc3}/truss/tests/test_data/test_go_custom_server_truss/docker/main.go +0 -0
- {truss-0.11.13rc1 → truss-0.11.13rc3}/truss/tests/test_data/test_openai/__init__.py +0 -0
- {truss-0.11.13rc1 → truss-0.11.13rc3}/truss/tests/test_data/test_openai/config.yaml +0 -0
- {truss-0.11.13rc1 → truss-0.11.13rc3}/truss/tests/test_data/test_openai/model/__init__.py +0 -0
- {truss-0.11.13rc1 → truss-0.11.13rc3}/truss/tests/test_data/test_openai/model/model.py +0 -0
- {truss-0.11.13rc1 → truss-0.11.13rc3}/truss/tests/test_data/test_pyantic_v1/__init__.py +0 -0
- {truss-0.11.13rc1 → truss-0.11.13rc3}/truss/tests/test_data/test_pyantic_v1/config.yaml +0 -0
- {truss-0.11.13rc1 → truss-0.11.13rc3}/truss/tests/test_data/test_pyantic_v1/model/__init__.py +0 -0
- {truss-0.11.13rc1 → truss-0.11.13rc3}/truss/tests/test_data/test_pyantic_v1/model/model.py +0 -0
- {truss-0.11.13rc1 → truss-0.11.13rc3}/truss/tests/test_data/test_pyantic_v1/requirements.txt +0 -0
- {truss-0.11.13rc1 → truss-0.11.13rc3}/truss/tests/test_data/test_pyantic_v2/__init__.py +0 -0
- {truss-0.11.13rc1 → truss-0.11.13rc3}/truss/tests/test_data/test_pyantic_v2/config.yaml +0 -0
- {truss-0.11.13rc1 → truss-0.11.13rc3}/truss/tests/test_data/test_pyantic_v2/model/__init__.py +0 -0
- {truss-0.11.13rc1 → truss-0.11.13rc3}/truss/tests/test_data/test_pyantic_v2/model/model.py +0 -0
- {truss-0.11.13rc1 → truss-0.11.13rc3}/truss/tests/test_data/test_pyantic_v2/requirements.txt +0 -0
- {truss-0.11.13rc1 → truss-0.11.13rc3}/truss/tests/test_data/test_requirements_file_truss/__init__.py +0 -0
- {truss-0.11.13rc1 → truss-0.11.13rc3}/truss/tests/test_data/test_requirements_file_truss/config.yaml +0 -0
- {truss-0.11.13rc1 → truss-0.11.13rc3}/truss/tests/test_data/test_requirements_file_truss/model/__init__.py +0 -0
- {truss-0.11.13rc1 → truss-0.11.13rc3}/truss/tests/test_data/test_requirements_file_truss/model/model.py +0 -0
- {truss-0.11.13rc1 → truss-0.11.13rc3}/truss/tests/test_data/test_requirements_file_truss/requirements.txt +0 -0
- {truss-0.11.13rc1 → truss-0.11.13rc3}/truss/tests/test_data/test_streaming_async_generator_truss/__init__.py +0 -0
- {truss-0.11.13rc1 → truss-0.11.13rc3}/truss/tests/test_data/test_streaming_async_generator_truss/config.yaml +0 -0
- {truss-0.11.13rc1 → truss-0.11.13rc3}/truss/tests/test_data/test_streaming_async_generator_truss/model/__init__.py +0 -0
- {truss-0.11.13rc1 → truss-0.11.13rc3}/truss/tests/test_data/test_streaming_async_generator_truss/model/model.py +0 -0
- {truss-0.11.13rc1 → truss-0.11.13rc3}/truss/tests/test_data/test_streaming_read_timeout/__init__.py +0 -0
- {truss-0.11.13rc1 → truss-0.11.13rc3}/truss/tests/test_data/test_streaming_read_timeout/config.yaml +0 -0
- {truss-0.11.13rc1 → truss-0.11.13rc3}/truss/tests/test_data/test_streaming_read_timeout/model/__init__.py +0 -0
- {truss-0.11.13rc1 → truss-0.11.13rc3}/truss/tests/test_data/test_streaming_read_timeout/model/model.py +0 -0
- {truss-0.11.13rc1 → truss-0.11.13rc3}/truss/tests/test_data/test_streaming_truss/__init__.py +0 -0
- {truss-0.11.13rc1 → truss-0.11.13rc3}/truss/tests/test_data/test_streaming_truss/config.yaml +0 -0
- {truss-0.11.13rc1 → truss-0.11.13rc3}/truss/tests/test_data/test_streaming_truss/model/__init__.py +0 -0
- {truss-0.11.13rc1 → truss-0.11.13rc3}/truss/tests/test_data/test_streaming_truss/model/model.py +0 -0
- {truss-0.11.13rc1 → truss-0.11.13rc3}/truss/tests/test_data/test_streaming_truss_with_error/__init__.py +0 -0
- {truss-0.11.13rc1 → truss-0.11.13rc3}/truss/tests/test_data/test_streaming_truss_with_error/config.yaml +0 -0
- {truss-0.11.13rc1 → truss-0.11.13rc3}/truss/tests/test_data/test_streaming_truss_with_error/model/__init__.py +0 -0
- {truss-0.11.13rc1 → truss-0.11.13rc3}/truss/tests/test_data/test_streaming_truss_with_error/model/model.py +0 -0
- {truss-0.11.13rc1 → truss-0.11.13rc3}/truss/tests/test_data/test_streaming_truss_with_error/packages/__init__.py +0 -0
- {truss-0.11.13rc1 → truss-0.11.13rc3}/truss/tests/test_data/test_streaming_truss_with_error/packages/helpers_1.py +0 -0
- {truss-0.11.13rc1 → truss-0.11.13rc3}/truss/tests/test_data/test_streaming_truss_with_error/packages/helpers_2.py +0 -0
- {truss-0.11.13rc1 → truss-0.11.13rc3}/truss/tests/test_data/test_streaming_truss_with_tracing/__init__.py +0 -0
- {truss-0.11.13rc1 → truss-0.11.13rc3}/truss/tests/test_data/test_streaming_truss_with_tracing/config.yaml +0 -0
- {truss-0.11.13rc1 → truss-0.11.13rc3}/truss/tests/test_data/test_streaming_truss_with_tracing/model/__init__.py +0 -0
- {truss-0.11.13rc1 → truss-0.11.13rc3}/truss/tests/test_data/test_streaming_truss_with_tracing/model/model.py +0 -0
- {truss-0.11.13rc1 → truss-0.11.13rc3}/truss/tests/test_data/test_trt_llm_truss/__init__.py +0 -0
- {truss-0.11.13rc1 → truss-0.11.13rc3}/truss/tests/test_data/test_trt_llm_truss/config.yaml +0 -0
- {truss-0.11.13rc1 → truss-0.11.13rc3}/truss/tests/test_data/test_trt_llm_truss/model/__init__.py +0 -0
- {truss-0.11.13rc1 → truss-0.11.13rc3}/truss/tests/test_data/test_trt_llm_truss/model/model.py +0 -0
- {truss-0.11.13rc1 → truss-0.11.13rc3}/truss/tests/test_data/test_truss/__init__.py +0 -0
- {truss-0.11.13rc1 → truss-0.11.13rc3}/truss/tests/test_data/test_truss/config.yaml +0 -0
- {truss-0.11.13rc1 → truss-0.11.13rc3}/truss/tests/test_data/test_truss/examples.yaml +0 -0
- {truss-0.11.13rc1 → truss-0.11.13rc3}/truss/tests/test_data/test_truss/model/__init__.py +0 -0
- {truss-0.11.13rc1 → truss-0.11.13rc3}/truss/tests/test_data/test_truss/model/dummy +0 -0
- {truss-0.11.13rc1 → truss-0.11.13rc3}/truss/tests/test_data/test_truss/model/model.py +0 -0
- {truss-0.11.13rc1 → truss-0.11.13rc3}/truss/tests/test_data/test_truss/packages/__init__.py +0 -0
- {truss-0.11.13rc1 → truss-0.11.13rc3}/truss/tests/test_data/test_truss/packages/test_package/__init__.py +0 -0
- {truss-0.11.13rc1 → truss-0.11.13rc3}/truss/tests/test_data/test_truss/packages/test_package/test.py +0 -0
- {truss-0.11.13rc1 → truss-0.11.13rc3}/truss/tests/test_data/test_truss_server_model_cache_v1/__init__.py +0 -0
- {truss-0.11.13rc1 → truss-0.11.13rc3}/truss/tests/test_data/test_truss_server_model_cache_v1/config.yaml +0 -0
- {truss-0.11.13rc1 → truss-0.11.13rc3}/truss/tests/test_data/test_truss_server_model_cache_v1/model/__init__.py +0 -0
- {truss-0.11.13rc1 → truss-0.11.13rc3}/truss/tests/test_data/test_truss_server_model_cache_v1/model/model.py +0 -0
- {truss-0.11.13rc1 → truss-0.11.13rc3}/truss/tests/test_data/test_truss_server_model_cache_v2/__init__.py +0 -0
- {truss-0.11.13rc1 → truss-0.11.13rc3}/truss/tests/test_data/test_truss_server_model_cache_v2/config.yaml +0 -0
- {truss-0.11.13rc1 → truss-0.11.13rc3}/truss/tests/test_data/test_truss_server_model_cache_v2/model/__init__.py +0 -0
- {truss-0.11.13rc1 → truss-0.11.13rc3}/truss/tests/test_data/test_truss_server_model_cache_v2/model/model.py +0 -0
- {truss-0.11.13rc1 → truss-0.11.13rc3}/truss/tests/test_data/test_truss_with_error/__init__.py +0 -0
- {truss-0.11.13rc1 → truss-0.11.13rc3}/truss/tests/test_data/test_truss_with_error/config.yaml +0 -0
- {truss-0.11.13rc1 → truss-0.11.13rc3}/truss/tests/test_data/test_truss_with_error/model/__init__.py +0 -0
- {truss-0.11.13rc1 → truss-0.11.13rc3}/truss/tests/test_data/test_truss_with_error/model/model.py +0 -0
- {truss-0.11.13rc1 → truss-0.11.13rc3}/truss/tests/test_data/test_truss_with_error/packages/__init__.py +0 -0
- {truss-0.11.13rc1 → truss-0.11.13rc3}/truss/tests/test_data/test_truss_with_error/packages/helpers_1.py +0 -0
- {truss-0.11.13rc1 → truss-0.11.13rc3}/truss/tests/test_data/test_truss_with_error/packages/helpers_2.py +0 -0
- {truss-0.11.13rc1 → truss-0.11.13rc3}/truss/tests/test_docker.py +0 -0
- {truss-0.11.13rc1 → truss-0.11.13rc3}/truss/tests/test_model_inference.py +0 -0
- {truss-0.11.13rc1 → truss-0.11.13rc3}/truss/tests/test_model_schema.py +0 -0
- {truss-0.11.13rc1 → truss-0.11.13rc3}/truss/tests/test_testing_utilities_for_other_tests.py +0 -0
- {truss-0.11.13rc1 → truss-0.11.13rc3}/truss/tests/test_truss_gatherer.py +0 -0
- {truss-0.11.13rc1 → truss-0.11.13rc3}/truss/tests/test_util.py +0 -0
- {truss-0.11.13rc1 → truss-0.11.13rc3}/truss/tests/trt_llm/test_trt_llm_config.py +0 -0
- {truss-0.11.13rc1 → truss-0.11.13rc3}/truss/tests/trt_llm/test_validation.py +0 -0
- {truss-0.11.13rc1 → truss-0.11.13rc3}/truss/tests/util/test_config_checks.py +0 -0
- {truss-0.11.13rc1 → truss-0.11.13rc3}/truss/tests/util/test_env_vars.py +0 -0
- {truss-0.11.13rc1 → truss-0.11.13rc3}/truss/tests/util/test_path.py +0 -0
- {truss-0.11.13rc1 → truss-0.11.13rc3}/truss/trt_llm/config_checks.py +0 -0
- {truss-0.11.13rc1 → truss-0.11.13rc3}/truss/trt_llm/validation.py +0 -0
- {truss-0.11.13rc1 → truss-0.11.13rc3}/truss/truss_handle/__init__.py +0 -0
- {truss-0.11.13rc1 → truss-0.11.13rc3}/truss/truss_handle/build.py +0 -0
- {truss-0.11.13rc1 → truss-0.11.13rc3}/truss/truss_handle/decorators.py +0 -0
- {truss-0.11.13rc1 → truss-0.11.13rc3}/truss/truss_handle/patch/__init__.py +0 -0
- {truss-0.11.13rc1 → truss-0.11.13rc3}/truss/truss_handle/patch/calc_patch.py +0 -0
- {truss-0.11.13rc1 → truss-0.11.13rc3}/truss/truss_handle/patch/constants.py +0 -0
- {truss-0.11.13rc1 → truss-0.11.13rc3}/truss/truss_handle/patch/custom_types.py +0 -0
- {truss-0.11.13rc1 → truss-0.11.13rc3}/truss/truss_handle/patch/dir_signature.py +0 -0
- {truss-0.11.13rc1 → truss-0.11.13rc3}/truss/truss_handle/patch/hash.py +0 -0
- {truss-0.11.13rc1 → truss-0.11.13rc3}/truss/truss_handle/patch/local_truss_patch_applier.py +0 -0
- {truss-0.11.13rc1 → truss-0.11.13rc3}/truss/truss_handle/patch/signature.py +0 -0
- {truss-0.11.13rc1 → truss-0.11.13rc3}/truss/truss_handle/patch/truss_dir_patch_applier.py +0 -0
- {truss-0.11.13rc1 → truss-0.11.13rc3}/truss/truss_handle/readme_generator.py +0 -0
- {truss-0.11.13rc1 → truss-0.11.13rc3}/truss/truss_handle/truss_gatherer.py +0 -0
- {truss-0.11.13rc1 → truss-0.11.13rc3}/truss/truss_handle/truss_handle.py +0 -0
- {truss-0.11.13rc1 → truss-0.11.13rc3}/truss/util/.truss_ignore +0 -0
- {truss-0.11.13rc1 → truss-0.11.13rc3}/truss/util/__init__.py +0 -0
- {truss-0.11.13rc1 → truss-0.11.13rc3}/truss/util/docker.py +0 -0
- {truss-0.11.13rc1 → truss-0.11.13rc3}/truss/util/download.py +0 -0
- {truss-0.11.13rc1 → truss-0.11.13rc3}/truss/util/env_vars.py +0 -0
- {truss-0.11.13rc1 → truss-0.11.13rc3}/truss/util/gpu.py +0 -0
- {truss-0.11.13rc1 → truss-0.11.13rc3}/truss/util/jinja.py +0 -0
- {truss-0.11.13rc1 → truss-0.11.13rc3}/truss/util/log_utils.py +0 -0
- {truss-0.11.13rc1 → truss-0.11.13rc3}/truss/util/notebook.py +0 -0
- {truss-0.11.13rc1 → truss-0.11.13rc3}/truss/util/path.py +0 -0
- {truss-0.11.13rc1 → truss-0.11.13rc3}/truss/util/requirements.py +0 -0
- {truss-0.11.13rc1 → truss-0.11.13rc3}/truss/util/user_config.py +0 -0
- {truss-0.11.13rc1 → truss-0.11.13rc3}/truss-chains/examples/README.md +0 -0
- {truss-0.11.13rc1 → truss-0.11.13rc3}/truss-chains/examples/audio-transcription/README.md +0 -0
- {truss-0.11.13rc1 → truss-0.11.13rc3}/truss-chains/examples/rag/README.md +0 -0
- {truss-0.11.13rc1 → truss-0.11.13rc3}/truss-chains/tests/itest_chain/requirements.txt +0 -0
- {truss-0.11.13rc1 → truss-0.11.13rc3}/truss-chains/truss_chains/__init__.py +0 -0
- {truss-0.11.13rc1 → truss-0.11.13rc3}/truss-chains/truss_chains/deployment/__init__.py +0 -0
- {truss-0.11.13rc1 → truss-0.11.13rc3}/truss-chains/truss_chains/deployment/code_gen.py +0 -0
- {truss-0.11.13rc1 → truss-0.11.13rc3}/truss-chains/truss_chains/deployment/deployment_client.py +0 -0
- {truss-0.11.13rc1 → truss-0.11.13rc3}/truss-chains/truss_chains/framework.py +0 -0
- {truss-0.11.13rc1 → truss-0.11.13rc3}/truss-chains/truss_chains/private_types.py +0 -0
- {truss-0.11.13rc1 → truss-0.11.13rc3}/truss-chains/truss_chains/public_api.py +0 -0
- {truss-0.11.13rc1 → truss-0.11.13rc3}/truss-chains/truss_chains/public_types.py +0 -0
- {truss-0.11.13rc1 → truss-0.11.13rc3}/truss-chains/truss_chains/py.typed +0 -0
- {truss-0.11.13rc1 → truss-0.11.13rc3}/truss-chains/truss_chains/pydantic_numpy.py +0 -0
- {truss-0.11.13rc1 → truss-0.11.13rc3}/truss-chains/truss_chains/reference_code/reference_chainlet.py +0 -0
- {truss-0.11.13rc1 → truss-0.11.13rc3}/truss-chains/truss_chains/reference_code/reference_model.py +0 -0
- {truss-0.11.13rc1 → truss-0.11.13rc3}/truss-chains/truss_chains/remote_chainlet/__init__.py +0 -0
- {truss-0.11.13rc1 → truss-0.11.13rc3}/truss-chains/truss_chains/remote_chainlet/model_skeleton.py +0 -0
- {truss-0.11.13rc1 → truss-0.11.13rc3}/truss-chains/truss_chains/remote_chainlet/stub.py +0 -0
- {truss-0.11.13rc1 → truss-0.11.13rc3}/truss-chains/truss_chains/remote_chainlet/utils.py +0 -0
- {truss-0.11.13rc1 → truss-0.11.13rc3}/truss-chains/truss_chains/streaming.py +0 -0
- {truss-0.11.13rc1 → truss-0.11.13rc3}/truss-chains/truss_chains/utils.py +0 -0
- {truss-0.11.13rc1 → truss-0.11.13rc3}/truss-train/truss_train/__init__.py +0 -0
- {truss-0.11.13rc1 → truss-0.11.13rc3}/truss-train/truss_train/definitions.py +0 -0
- {truss-0.11.13rc1 → truss-0.11.13rc3}/truss-train/truss_train/deployment.py +0 -0
- {truss-0.11.13rc1 → truss-0.11.13rc3}/truss-train/truss_train/loader.py +0 -0
- {truss-0.11.13rc1 → truss-0.11.13rc3}/truss-train/truss_train/public_api.py +0 -0
- {truss-0.11.13rc1 → truss-0.11.13rc3}/truss-train/truss_train/restore_from_checkpoint.py +0 -0
- {truss-0.11.13rc1 → truss-0.11.13rc3}/truss-transfer/README.md +0 -0
- {truss-0.11.13rc1 → truss-0.11.13rc3}/truss-transfer/tests/README.md +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: truss
|
|
3
|
-
Version: 0.11.
|
|
3
|
+
Version: 0.11.13rc3
|
|
4
4
|
Summary: A seamless bridge from model development to model delivery
|
|
5
5
|
Project-URL: Repository, https://github.com/basetenlabs/truss
|
|
6
6
|
Project-URL: Homepage, https://truss.baseten.co
|
|
@@ -37,7 +37,7 @@ Requires-Dist: rich<14,>=13.4.2
|
|
|
37
37
|
Requires-Dist: ruff>=0.4.8
|
|
38
38
|
Requires-Dist: tenacity>=8.0.1
|
|
39
39
|
Requires-Dist: tomlkit>=0.13.2
|
|
40
|
-
Requires-Dist: truss-transfer<0.0.
|
|
40
|
+
Requires-Dist: truss-transfer<0.0.40,>=0.0.36
|
|
41
41
|
Requires-Dist: watchfiles<0.20,>=0.19.0
|
|
42
42
|
Description-Content-Type: text/markdown
|
|
43
43
|
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
[project]
|
|
2
2
|
name = "truss"
|
|
3
|
-
version = "0.11.
|
|
3
|
+
version = "0.11.13rc3"
|
|
4
4
|
description = "A seamless bridge from model development to model delivery"
|
|
5
5
|
authors = [
|
|
6
6
|
{ name = "Pankaj Gupta", email = "no-reply@baseten.co" },
|
|
@@ -43,7 +43,7 @@ dependencies = [
|
|
|
43
43
|
"ruff>=0.4.8",
|
|
44
44
|
"tenacity>=8.0.1",
|
|
45
45
|
"watchfiles>=0.19.0,<0.20",
|
|
46
|
-
"truss-transfer>=0.0.
|
|
46
|
+
"truss-transfer>=0.0.36,<0.0.40",
|
|
47
47
|
]
|
|
48
48
|
|
|
49
49
|
[project.urls]
|
|
@@ -56,6 +56,12 @@ RUN mkdir -p {{ dst.parent }}; curl -L "{{ url }}" -o {{ dst }}
|
|
|
56
56
|
{% endfor %} {#- endfor external_data_files #}
|
|
57
57
|
{%- endif %} {#- endif external_data_files #}
|
|
58
58
|
|
|
59
|
+
{%- if build_commands %}
|
|
60
|
+
{% for command in build_commands %}
|
|
61
|
+
RUN {% for secret,path in config.build.secret_to_path_mapping.items() %} --mount=type=secret,id={{ secret }},target={{ path }}{%- endfor %} {{ command }}
|
|
62
|
+
{% endfor %} {#- endfor build_commands #}
|
|
63
|
+
{%- endif %} {#- endif build_commands #}
|
|
64
|
+
|
|
59
65
|
{# Copy data before code for better caching #}
|
|
60
66
|
{%- if data_dir_exists %}
|
|
61
67
|
COPY --chown={{ default_owner }} ./{{ config.data_dir }} ${APP_HOME}/data
|
|
@@ -63,7 +69,7 @@ COPY --chown={{ default_owner }} ./{{ config.data_dir }} ${APP_HOME}/data
|
|
|
63
69
|
|
|
64
70
|
{%- if model_cache_v2 %}
|
|
65
71
|
{# v0.0.9, keep synced with server_requirements.txt #}
|
|
66
|
-
RUN curl -sSL --fail --retry 5 --retry-delay 2 -o /usr/local/bin/truss-transfer-cli https://github.com/basetenlabs/truss/releases/download/v0.11.
|
|
72
|
+
RUN curl -sSL --fail --retry 5 --retry-delay 2 -o /usr/local/bin/truss-transfer-cli https://github.com/basetenlabs/truss/releases/download/v0.11.12rc4/truss-transfer-cli-v0.11.12rc4-linux-x86_64-unknown-linux-musl
|
|
67
73
|
RUN chmod +x /usr/local/bin/truss-transfer-cli
|
|
68
74
|
RUN mkdir /static-bptr
|
|
69
75
|
RUN echo "hash {{model_cache_hash}}"
|
|
@@ -95,12 +101,6 @@ COPY --chown={{ default_owner }} ./{{ config.model_module_dir }} ${APP_HOME}/mod
|
|
|
95
101
|
{% endblock %} {#- endblock app_copy #}
|
|
96
102
|
|
|
97
103
|
{% block run %}
|
|
98
|
-
{%- if build_commands %}
|
|
99
|
-
{% for command in build_commands %}
|
|
100
|
-
RUN {% for secret,path in config.build.secret_to_path_mapping.items() %} --mount=type=secret,id={{ secret }},target={{ path }}{%- endfor %} {{ command }}
|
|
101
|
-
{% endfor %} {#- endfor build_commands #}
|
|
102
|
-
{%- endif %} {#- endif build_commands #}
|
|
103
|
-
|
|
104
104
|
{# Macro to change ownership of directories and switch to regular user #}
|
|
105
105
|
{%- macro chown_and_switch_to_regular_user_if_enabled(additional_chown_dirs=[]) -%}
|
|
106
106
|
{%- if non_root_user %}
|
|
@@ -0,0 +1,351 @@
|
|
|
1
|
+
import atexit
|
|
2
|
+
import json
|
|
3
|
+
import logging
|
|
4
|
+
import os
|
|
5
|
+
import time
|
|
6
|
+
from dataclasses import dataclass
|
|
7
|
+
from functools import lru_cache
|
|
8
|
+
from pathlib import Path
|
|
9
|
+
from threading import Lock, Thread
|
|
10
|
+
from typing import Optional, Union
|
|
11
|
+
|
|
12
|
+
try:
|
|
13
|
+
from prometheus_client import Counter, Gauge, Histogram
|
|
14
|
+
|
|
15
|
+
PROMETHEUS_AVAILABLE = True
|
|
16
|
+
except ImportError:
|
|
17
|
+
PROMETHEUS_AVAILABLE = False
|
|
18
|
+
METRICS_REGISTERED = False
|
|
19
|
+
|
|
20
|
+
|
|
21
|
+
@dataclass(frozen=True)
|
|
22
|
+
class FileDownloadMetric:
|
|
23
|
+
file_name: str
|
|
24
|
+
file_size_bytes: int
|
|
25
|
+
download_time_secs: float
|
|
26
|
+
download_speed_mb_s: float
|
|
27
|
+
|
|
28
|
+
|
|
29
|
+
@dataclass(frozen=True)
|
|
30
|
+
class TrussTransferStats:
|
|
31
|
+
total_manifest_size_bytes: int
|
|
32
|
+
total_download_time_secs: float
|
|
33
|
+
total_aggregated_mb_s: Optional[float]
|
|
34
|
+
file_downloads: list[FileDownloadMetric]
|
|
35
|
+
b10fs_read_speed_mbps: Optional[float]
|
|
36
|
+
b10fs_decision_to_use: bool
|
|
37
|
+
b10fs_enabled: bool
|
|
38
|
+
b10fs_hot_starts_files: int
|
|
39
|
+
b10fs_hot_starts_bytes: int
|
|
40
|
+
b10fs_cold_starts_files: int
|
|
41
|
+
b10fs_cold_starts_bytes: int
|
|
42
|
+
success: bool
|
|
43
|
+
timestamp: int
|
|
44
|
+
|
|
45
|
+
@classmethod
|
|
46
|
+
def from_json_file(cls, path: Path) -> Optional["TrussTransferStats"]:
|
|
47
|
+
if not path.exists():
|
|
48
|
+
return None
|
|
49
|
+
try:
|
|
50
|
+
with open(path) as f:
|
|
51
|
+
data = json.load(f)
|
|
52
|
+
file_downloads = [
|
|
53
|
+
FileDownloadMetric(**fd) for fd in data.get("file_downloads", [])
|
|
54
|
+
]
|
|
55
|
+
return cls(
|
|
56
|
+
total_manifest_size_bytes=data["total_manifest_size_bytes"],
|
|
57
|
+
total_download_time_secs=data["total_download_time_secs"],
|
|
58
|
+
total_aggregated_mb_s=data.get("total_aggregated_mb_s"),
|
|
59
|
+
file_downloads=file_downloads,
|
|
60
|
+
b10fs_read_speed_mbps=data.get("b10fs_read_speed_mbps"),
|
|
61
|
+
b10fs_decision_to_use=data["b10fs_decision_to_use"],
|
|
62
|
+
b10fs_enabled=data["b10fs_enabled"],
|
|
63
|
+
b10fs_hot_starts_files=data["b10fs_hot_starts_files"],
|
|
64
|
+
b10fs_hot_starts_bytes=data["b10fs_hot_starts_bytes"],
|
|
65
|
+
b10fs_cold_starts_files=data["b10fs_cold_starts_files"],
|
|
66
|
+
b10fs_cold_starts_bytes=data["b10fs_cold_starts_bytes"],
|
|
67
|
+
success=data["success"],
|
|
68
|
+
timestamp=data["timestamp"],
|
|
69
|
+
)
|
|
70
|
+
except Exception:
|
|
71
|
+
return None
|
|
72
|
+
|
|
73
|
+
def publish_to_prometheus(self):
|
|
74
|
+
"""Publish transfer stats to Prometheus metrics. Only runs once."""
|
|
75
|
+
if not PROMETHEUS_AVAILABLE:
|
|
76
|
+
return
|
|
77
|
+
global METRICS_REGISTERED
|
|
78
|
+
if not METRICS_REGISTERED:
|
|
79
|
+
# Ensure metrics are only registered once
|
|
80
|
+
METRICS_REGISTERED = True
|
|
81
|
+
|
|
82
|
+
# Define metrics with model_cache label
|
|
83
|
+
manifest_size_gauge = Gauge(
|
|
84
|
+
"model_cache_manifest_size_bytes", "Total manifest size in bytes"
|
|
85
|
+
)
|
|
86
|
+
download_time_histogram = Histogram(
|
|
87
|
+
"model_cache_download_time_seconds",
|
|
88
|
+
"Total download time in seconds",
|
|
89
|
+
buckets=[
|
|
90
|
+
2**i
|
|
91
|
+
for i in range(-3, 11) # = [0.125, .. 2048] seconds
|
|
92
|
+
],
|
|
93
|
+
)
|
|
94
|
+
download_speed_gauge = Gauge(
|
|
95
|
+
"model_cache_download_speed_mbps", "Aggregated download speed in MB/s"
|
|
96
|
+
)
|
|
97
|
+
|
|
98
|
+
# File download metrics (aggregated)
|
|
99
|
+
files_downloaded_counter = Counter(
|
|
100
|
+
"model_cache_files_downloaded_total", "Total number of files downloaded"
|
|
101
|
+
)
|
|
102
|
+
total_file_size_counter = Counter(
|
|
103
|
+
"model_cache_file_size_bytes_total",
|
|
104
|
+
"Total size of downloaded files in bytes",
|
|
105
|
+
)
|
|
106
|
+
file_download_time_histogram = Histogram(
|
|
107
|
+
"model_cache_file_download_time_seconds",
|
|
108
|
+
"File download time distribution",
|
|
109
|
+
buckets=[
|
|
110
|
+
2**i
|
|
111
|
+
for i in range(-3, 11) # = [0.125, .. 2048] seconds
|
|
112
|
+
],
|
|
113
|
+
)
|
|
114
|
+
file_download_speed_histogram = Histogram(
|
|
115
|
+
"model_cache_file_download_speed_mbps",
|
|
116
|
+
"File download speed distribution",
|
|
117
|
+
buckets=[
|
|
118
|
+
2**i
|
|
119
|
+
for i in range(-1, 12) # = [0.5, .. 4096] MB/s
|
|
120
|
+
],
|
|
121
|
+
)
|
|
122
|
+
|
|
123
|
+
# B10FS specific metrics
|
|
124
|
+
b10fs_enabled_gauge = Gauge(
|
|
125
|
+
"model_cache_b10fs_enabled", "Whether B10FS is enabled"
|
|
126
|
+
)
|
|
127
|
+
b10fs_decision_gauge = Gauge(
|
|
128
|
+
"model_cache_b10fs_decision_to_use", "Whether B10FS was chosen for use"
|
|
129
|
+
)
|
|
130
|
+
b10fs_read_speed_gauge = Gauge(
|
|
131
|
+
"model_cache_b10fs_read_speed_mbps", "B10FS read speed in Mbps"
|
|
132
|
+
)
|
|
133
|
+
b10fs_hot_files_gauge = Gauge(
|
|
134
|
+
"model_cache_b10fs_hot_starts_files", "Number of hot start files"
|
|
135
|
+
)
|
|
136
|
+
b10fs_hot_bytes_gauge = Gauge(
|
|
137
|
+
"model_cache_b10fs_hot_starts_bytes", "Number of hot start bytes"
|
|
138
|
+
)
|
|
139
|
+
b10fs_cold_files_gauge = Gauge(
|
|
140
|
+
"model_cache_b10fs_cold_starts_files", "Number of cold start files"
|
|
141
|
+
)
|
|
142
|
+
b10fs_cold_bytes_gauge = Gauge(
|
|
143
|
+
"model_cache_b10fs_cold_starts_bytes", "Number of cold start bytes"
|
|
144
|
+
)
|
|
145
|
+
|
|
146
|
+
# Transfer success metric
|
|
147
|
+
transfer_success_counter = Counter(
|
|
148
|
+
"model_cache_transfer_success_total",
|
|
149
|
+
"Total successful transfers",
|
|
150
|
+
["success"],
|
|
151
|
+
)
|
|
152
|
+
|
|
153
|
+
# Set main transfer metrics
|
|
154
|
+
manifest_size_gauge.set(self.total_manifest_size_bytes)
|
|
155
|
+
download_time_histogram.observe(self.total_download_time_secs)
|
|
156
|
+
|
|
157
|
+
if self.total_aggregated_mb_s is not None:
|
|
158
|
+
download_speed_gauge.set(self.total_aggregated_mb_s)
|
|
159
|
+
|
|
160
|
+
# Aggregate file download metrics
|
|
161
|
+
total_files = len(self.file_downloads)
|
|
162
|
+
total_file_bytes = sum(fd.file_size_bytes for fd in self.file_downloads)
|
|
163
|
+
|
|
164
|
+
files_downloaded_counter.inc(total_files)
|
|
165
|
+
total_file_size_counter.inc(total_file_bytes)
|
|
166
|
+
|
|
167
|
+
# Record individual file metrics for distribution
|
|
168
|
+
for fd in self.file_downloads:
|
|
169
|
+
if fd.file_size_bytes > 1 * 1024 * 1024: # Only log files larger than 1MB
|
|
170
|
+
file_download_time_histogram.observe(fd.download_time_secs)
|
|
171
|
+
file_download_speed_histogram.observe(fd.download_speed_mb_s)
|
|
172
|
+
|
|
173
|
+
# B10FS metrics
|
|
174
|
+
b10fs_enabled_gauge.set(1 if self.b10fs_enabled else 0)
|
|
175
|
+
b10fs_decision_gauge.set(1 if self.b10fs_decision_to_use else 0)
|
|
176
|
+
|
|
177
|
+
if self.b10fs_read_speed_mbps is not None:
|
|
178
|
+
b10fs_read_speed_gauge.set(self.b10fs_read_speed_mbps)
|
|
179
|
+
|
|
180
|
+
b10fs_hot_files_gauge.set(self.b10fs_hot_starts_files)
|
|
181
|
+
b10fs_hot_bytes_gauge.set(self.b10fs_hot_starts_bytes)
|
|
182
|
+
b10fs_cold_files_gauge.set(self.b10fs_cold_starts_files)
|
|
183
|
+
b10fs_cold_bytes_gauge.set(self.b10fs_cold_starts_bytes)
|
|
184
|
+
|
|
185
|
+
# Success metric
|
|
186
|
+
transfer_success_counter.labels(success=str(self.success)).inc()
|
|
187
|
+
|
|
188
|
+
|
|
189
|
+
LAZY_DATA_RESOLVER_PATH = [
|
|
190
|
+
# synced with pub static LAZY_DATA_RESOLVER_PATHS: &[&str]
|
|
191
|
+
Path("/bptr/bptr-manifest"),
|
|
192
|
+
Path("/bptr/bptr-manifest.json"),
|
|
193
|
+
Path("/static-bptr/static-bptr-manifest.json"),
|
|
194
|
+
]
|
|
195
|
+
|
|
196
|
+
MISSING_COLLECTION_MESSAGE = """model_cache: Data was not collected. Missing lazy_data_resolver.block_until_download_complete().
|
|
197
|
+
This is a potential bug by the user implementation of model.py when using model_cache.
|
|
198
|
+
We need you to call the block_until_download_complete() method during __init__ or load() method of your model.
|
|
199
|
+
Please implement the following pattern when using model_cache.
|
|
200
|
+
```
|
|
201
|
+
import torch
|
|
202
|
+
|
|
203
|
+
class Model:
|
|
204
|
+
def __init__(self, *args, **kwargs):
|
|
205
|
+
self._lazy_data_resolver = kwargs["lazy_data_resolver"]
|
|
206
|
+
|
|
207
|
+
def load():
|
|
208
|
+
# work that does not require the download may be done here
|
|
209
|
+
random_vector = torch.randn(1000)
|
|
210
|
+
# important to collect the download before using any incomplete data
|
|
211
|
+
self._lazy_data_resolver.block_until_download_complete()
|
|
212
|
+
# after the call, you may use the /app/model_cache directory
|
|
213
|
+
torch.load(
|
|
214
|
+
"/app/model_cache/your_model.pt"
|
|
215
|
+
) * random_vector
|
|
216
|
+
```
|
|
217
|
+
"""
|
|
218
|
+
|
|
219
|
+
|
|
220
|
+
class LazyDataResolverV2:
|
|
221
|
+
"""Lazy data resolver pre-fetches data in a separate thread.
|
|
222
|
+
It uses a lock to ensure that the data is only fetched once
|
|
223
|
+
and that the thread is not blocked by other threads.
|
|
224
|
+
"""
|
|
225
|
+
|
|
226
|
+
def __init__(self, data_dir: Path, logger: Optional[logging.Logger] = None):
|
|
227
|
+
self._data_dir = data_dir
|
|
228
|
+
self._lock = Lock()
|
|
229
|
+
self._start_time = time.time()
|
|
230
|
+
self.logger = logger or logging.getLogger(__name__)
|
|
231
|
+
self._is_collected_by_user = not self.bptr_exists()
|
|
232
|
+
thread = Thread(target=self._prefetch_in_thread, daemon=True)
|
|
233
|
+
thread.start()
|
|
234
|
+
|
|
235
|
+
def print_error_message_on_exit_if_not_collected():
|
|
236
|
+
try:
|
|
237
|
+
if not self._is_collected_by_user and thread.is_alive():
|
|
238
|
+
# if thread is still alive, and the user has not called collect,
|
|
239
|
+
# the download in flight could have been the core issue
|
|
240
|
+
self.logger.warning(
|
|
241
|
+
"An error was detected while the data was still being downloaded. "
|
|
242
|
+
+ MISSING_COLLECTION_MESSAGE
|
|
243
|
+
)
|
|
244
|
+
except Exception as e:
|
|
245
|
+
print("Error while printing error message on exit:", e)
|
|
246
|
+
|
|
247
|
+
atexit.register(print_error_message_on_exit_if_not_collected)
|
|
248
|
+
|
|
249
|
+
@staticmethod
|
|
250
|
+
def bptr_exists():
|
|
251
|
+
"""Check if the bptr manifest file exists."""
|
|
252
|
+
return any(path.exists() for path in LAZY_DATA_RESOLVER_PATH)
|
|
253
|
+
|
|
254
|
+
def _prefetch_in_thread(self):
|
|
255
|
+
"""Invokes the download ahead of time, before user doubles down on the download"""
|
|
256
|
+
result = self.block_until_download_complete(
|
|
257
|
+
log_stats=False, issue_collect=False
|
|
258
|
+
)
|
|
259
|
+
if not result:
|
|
260
|
+
# no data to resolve, no need to collect
|
|
261
|
+
self._is_collected_by_user = True
|
|
262
|
+
return None
|
|
263
|
+
# verify the user has called collect.
|
|
264
|
+
if not self._is_collected_by_user and time.time() - self._start_time > 20:
|
|
265
|
+
# issue a warning if the user has not collected after 20 seconds.
|
|
266
|
+
# skip for small downloads that are less than 20 seconds
|
|
267
|
+
# as the user might have a lot of work before is able to call collect.
|
|
268
|
+
self.logger.warning(MISSING_COLLECTION_MESSAGE)
|
|
269
|
+
time.sleep(0.5)
|
|
270
|
+
|
|
271
|
+
@lru_cache(maxsize=None)
|
|
272
|
+
def _fetch(self) -> Union[str, Exception]:
|
|
273
|
+
"""cached and locked method to fetch the data."""
|
|
274
|
+
if not self.bptr_exists():
|
|
275
|
+
return "" # no data to resolve
|
|
276
|
+
import truss_transfer
|
|
277
|
+
|
|
278
|
+
try:
|
|
279
|
+
return truss_transfer.lazy_data_resolve(str(self._data_dir))
|
|
280
|
+
except Exception as e:
|
|
281
|
+
self.logger.error(f"Error occurred while fetching data: {e}")
|
|
282
|
+
return e
|
|
283
|
+
|
|
284
|
+
def raise_if_not_collected(self):
|
|
285
|
+
"""We require the user to call `block_until_download_complete` before using the data.
|
|
286
|
+
If the user has not called the method during load, we raise an error.
|
|
287
|
+
"""
|
|
288
|
+
if not self._is_collected_by_user:
|
|
289
|
+
raise RuntimeError(MISSING_COLLECTION_MESSAGE)
|
|
290
|
+
|
|
291
|
+
def block_until_download_complete(
|
|
292
|
+
self, log_stats: bool = True, issue_collect: bool = True
|
|
293
|
+
) -> str:
|
|
294
|
+
"""Once called, blocks until the data has been downloaded.
|
|
295
|
+
|
|
296
|
+
example usage:
|
|
297
|
+
```
|
|
298
|
+
import torch
|
|
299
|
+
|
|
300
|
+
class Model:
|
|
301
|
+
def __init__(self, *args, **kwargs):
|
|
302
|
+
self._lazy_data_resolver = kwargs["lazy_data_resolver"]
|
|
303
|
+
|
|
304
|
+
def load():
|
|
305
|
+
random_vector = torch.randn(1000)
|
|
306
|
+
# important to collect the download before using any incomplete data
|
|
307
|
+
self._lazy_data_resolver.block_until_download_complete()
|
|
308
|
+
```
|
|
309
|
+
|
|
310
|
+
"""
|
|
311
|
+
start_lock = time.time()
|
|
312
|
+
publish_stats = (
|
|
313
|
+
log_stats and not self._is_collected_by_user
|
|
314
|
+
) # only publish results once per resolver
|
|
315
|
+
self._is_collected_by_user = issue_collect or self._is_collected_by_user
|
|
316
|
+
with self._lock:
|
|
317
|
+
result = self._fetch()
|
|
318
|
+
if isinstance(result, Exception):
|
|
319
|
+
raise RuntimeError(
|
|
320
|
+
f"Error occurred while fetching data: {result}"
|
|
321
|
+
) from result
|
|
322
|
+
if log_stats and result:
|
|
323
|
+
# TODO: instument the stats, which are written to /tmp/truss_transfer_stats.json
|
|
324
|
+
# also add fetch time, and blocking time
|
|
325
|
+
# TrussTransferStats
|
|
326
|
+
fetch_t = time.time() - self._start_time
|
|
327
|
+
start_lock_t = time.time() - start_lock
|
|
328
|
+
stats = TrussTransferStats.from_json_file(
|
|
329
|
+
Path("/tmp/truss_transfer_stats.json")
|
|
330
|
+
)
|
|
331
|
+
if stats and publish_stats:
|
|
332
|
+
self.logger.info(f"model_cache: {stats}")
|
|
333
|
+
# Publish stats to Prometheus
|
|
334
|
+
if (
|
|
335
|
+
os.getenv("TRUSS_MODEL_CACHE_PROMETHEUS", "0") == "1"
|
|
336
|
+
): # Hide behind feature flag for core-product to enabled.
|
|
337
|
+
stats.publish_to_prometheus()
|
|
338
|
+
self.logger.info(
|
|
339
|
+
f"model_cache: Fetch took {fetch_t:.2f} seconds, of which {start_lock_t:.2f} seconds were spent blocking."
|
|
340
|
+
)
|
|
341
|
+
return result
|
|
342
|
+
|
|
343
|
+
|
|
344
|
+
if __name__ == "__main__":
|
|
345
|
+
# Example usage
|
|
346
|
+
print("invoking download")
|
|
347
|
+
resolver = LazyDataResolverV2(Path("/example/path"))
|
|
348
|
+
# similate crash
|
|
349
|
+
time.sleep(0.01)
|
|
350
|
+
resolver.block_until_download_complete()
|
|
351
|
+
raise Exception("Simulated crash")
|
|
@@ -700,15 +700,6 @@ def helpers():
|
|
|
700
700
|
return Helpers()
|
|
701
701
|
|
|
702
702
|
|
|
703
|
-
@pytest.fixture
|
|
704
|
-
def test_editable_external_pkg(test_data_path, tmp_path):
|
|
705
|
-
truss_dir = test_data_path / "test_editable_external_pkg"
|
|
706
|
-
parent_dir = test_data_path / "test_editable_external_pkg_parent"
|
|
707
|
-
shutil.copytree(truss_dir, tmp_path / "test_editable_external_pkg")
|
|
708
|
-
shutil.copytree(parent_dir, tmp_path / "test_editable_external_pkg_parent")
|
|
709
|
-
return tmp_path / "test_editable_external_pkg"
|
|
710
|
-
|
|
711
|
-
|
|
712
703
|
def _build_truss_fs(truss_dir: Path, tmp_path: Path) -> Path:
|
|
713
704
|
truss_fs = tmp_path / "truss_fs"
|
|
714
705
|
truss_fs.mkdir()
|
|
@@ -12,9 +12,6 @@ from truss.base.constants import SUPPORTED_PYTHON_VERSIONS
|
|
|
12
12
|
from truss.base.custom_types import Example
|
|
13
13
|
from truss.base.errors import ContainerIsDownError, ContainerNotFoundError
|
|
14
14
|
from truss.base.truss_config import map_local_to_supported_python_version
|
|
15
|
-
from truss.contexts.image_builder.serving_image_builder import (
|
|
16
|
-
ServingImageBuilderContext,
|
|
17
|
-
)
|
|
18
15
|
from truss.contexts.image_builder.util import TRUSS_BASE_IMAGE_VERSION_TAG
|
|
19
16
|
from truss.local.local_config_handler import LocalConfigHandler
|
|
20
17
|
from truss.templates.control.control.helpers.custom_types import (
|
|
@@ -483,27 +480,6 @@ def test_build_commands(test_data_path):
|
|
|
483
480
|
assert r1 == {"predictions": [1, 2]}
|
|
484
481
|
|
|
485
482
|
|
|
486
|
-
def test_build_commands_in_run_block_order(test_data_path, tmp_path):
|
|
487
|
-
truss_dir = test_data_path / "test_editable_external_pkg"
|
|
488
|
-
build_dir = tmp_path / "build_dir"
|
|
489
|
-
image_builder = ServingImageBuilderContext.run(truss_dir)
|
|
490
|
-
image_builder.prepare_image_build_dir(build_dir)
|
|
491
|
-
dockerfile = (build_dir / "Dockerfile").read_text()
|
|
492
|
-
|
|
493
|
-
cmd_idx = dockerfile.find("uv pip install --system -e /packages/local_pkg")
|
|
494
|
-
if cmd_idx == -1:
|
|
495
|
-
cmd_idx = dockerfile.find("uv pip install -e /packages/local_pkg")
|
|
496
|
-
if cmd_idx == -1:
|
|
497
|
-
cmd_idx = dockerfile.find("pip install -e /packages/local_pkg")
|
|
498
|
-
assert cmd_idx != -1
|
|
499
|
-
|
|
500
|
-
entry_idx = dockerfile.find("ENTRYPOINT ")
|
|
501
|
-
user_idx = dockerfile.find("\nUSER ")
|
|
502
|
-
if user_idx != -1:
|
|
503
|
-
assert cmd_idx < user_idx
|
|
504
|
-
assert cmd_idx < entry_idx
|
|
505
|
-
|
|
506
|
-
|
|
507
483
|
@pytest.mark.integration
|
|
508
484
|
def test_build_commands_failure(test_data_path):
|
|
509
485
|
truss_dir = test_data_path / "test_build_commands_failure"
|
|
@@ -872,21 +848,3 @@ def test_config_verbose(custom_model_truss_dir_with_pre_and_post):
|
|
|
872
848
|
th.live_reload()
|
|
873
849
|
new_config["live_reload"] = True
|
|
874
850
|
assert new_config == th.spec.config.to_dict(verbose=False)
|
|
875
|
-
|
|
876
|
-
|
|
877
|
-
@pytest.mark.integration
|
|
878
|
-
def test_editable_external_package_install_and_predict(test_editable_external_pkg):
|
|
879
|
-
th = TrussHandle(test_editable_external_pkg)
|
|
880
|
-
# Ensure standard inference server flow for this test
|
|
881
|
-
th.live_reload(False)
|
|
882
|
-
tag = "test-editable-ext-pkg:0.0.1"
|
|
883
|
-
with ensure_kill_all():
|
|
884
|
-
container = th.docker_run(tag=tag, local_port=None)
|
|
885
|
-
try:
|
|
886
|
-
verify_python_requirement_installed_on_container(container, "local-pkg")
|
|
887
|
-
finally:
|
|
888
|
-
Docker.client().kill(container)
|
|
889
|
-
|
|
890
|
-
with ensure_kill_all():
|
|
891
|
-
result = th.docker_predict([1], tag=tag, local_port=None)
|
|
892
|
-
assert result == {"predictions": [42]}
|
|
@@ -1,153 +0,0 @@
|
|
|
1
|
-
import atexit
|
|
2
|
-
import logging
|
|
3
|
-
import time
|
|
4
|
-
from functools import lru_cache
|
|
5
|
-
from pathlib import Path
|
|
6
|
-
from threading import Lock, Thread
|
|
7
|
-
from typing import Optional, Union
|
|
8
|
-
|
|
9
|
-
LAZY_DATA_RESOLVER_PATH = [
|
|
10
|
-
# synced with pub static LAZY_DATA_RESOLVER_PATHS: &[&str]
|
|
11
|
-
Path("/bptr/bptr-manifest"),
|
|
12
|
-
Path("/bptr/bptr-manifest.json"),
|
|
13
|
-
Path("/static-bptr/static-bptr-manifest.json"),
|
|
14
|
-
]
|
|
15
|
-
|
|
16
|
-
MISSING_COLLECTION_MESSAGE = """model_cache: Data was not collected. Missing lazy_data_resolver.block_until_download_complete().
|
|
17
|
-
This is a potential bug by the user implementation of model.py when using model_cache.
|
|
18
|
-
We need you to call the block_until_download_complete() method during __init__ or load() method of your model.
|
|
19
|
-
Please implement the following pattern when using model_cache.
|
|
20
|
-
```
|
|
21
|
-
import torch
|
|
22
|
-
|
|
23
|
-
class Model:
|
|
24
|
-
def __init__(self, *args, **kwargs):
|
|
25
|
-
self._lazy_data_resolver = kwargs["lazy_data_resolver"]
|
|
26
|
-
|
|
27
|
-
def load():
|
|
28
|
-
# work that does not require the download may be done here
|
|
29
|
-
random_vector = torch.randn(1000)
|
|
30
|
-
# important to collect the download before using any incomplete data
|
|
31
|
-
self._lazy_data_resolver.block_until_download_complete()
|
|
32
|
-
# after the call, you may use the /app/model_cache directory
|
|
33
|
-
torch.load(
|
|
34
|
-
"/app/model_cache/your_model.pt"
|
|
35
|
-
) * random_vector
|
|
36
|
-
```
|
|
37
|
-
"""
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
class LazyDataResolverV2:
|
|
41
|
-
"""Lazy data resolver pre-fetches data in a separate thread.
|
|
42
|
-
It uses a lock to ensure that the data is only fetched once
|
|
43
|
-
and that the thread is not blocked by other threads.
|
|
44
|
-
"""
|
|
45
|
-
|
|
46
|
-
def __init__(self, data_dir: Path, logger: Optional[logging.Logger] = None):
|
|
47
|
-
self._data_dir = data_dir
|
|
48
|
-
self._lock = Lock()
|
|
49
|
-
self._start_time = time.time()
|
|
50
|
-
self.logger = logger or logging.getLogger(__name__)
|
|
51
|
-
self._is_collected_by_user = not self.bptr_exists()
|
|
52
|
-
thread = Thread(target=self._prefetch_in_thread, daemon=True)
|
|
53
|
-
thread.start()
|
|
54
|
-
|
|
55
|
-
def print_error_message_on_exit_if_not_collected():
|
|
56
|
-
try:
|
|
57
|
-
if not self._is_collected_by_user and thread.is_alive():
|
|
58
|
-
# if thread is still alive, and the user has not called collect,
|
|
59
|
-
# the download in flight could have been the core issue
|
|
60
|
-
self.logger.warning(
|
|
61
|
-
"An error was detected while the data was still being downloaded. "
|
|
62
|
-
+ MISSING_COLLECTION_MESSAGE
|
|
63
|
-
)
|
|
64
|
-
except Exception as e:
|
|
65
|
-
print("Error while printing error message on exit:", e)
|
|
66
|
-
|
|
67
|
-
atexit.register(print_error_message_on_exit_if_not_collected)
|
|
68
|
-
|
|
69
|
-
@staticmethod
|
|
70
|
-
def bptr_exists():
|
|
71
|
-
"""Check if the bptr manifest file exists."""
|
|
72
|
-
return any(path.exists() for path in LAZY_DATA_RESOLVER_PATH)
|
|
73
|
-
|
|
74
|
-
def _prefetch_in_thread(self):
|
|
75
|
-
"""Invokes the download ahead of time, before user doubles down on the download"""
|
|
76
|
-
result = self.block_until_download_complete(
|
|
77
|
-
log_stats=False, issue_collect=False
|
|
78
|
-
)
|
|
79
|
-
if not result:
|
|
80
|
-
# no data to resolve, no need to collect
|
|
81
|
-
self._is_collected_by_user = True
|
|
82
|
-
return None
|
|
83
|
-
# verify the user has called collect.
|
|
84
|
-
if not self._is_collected_by_user and time.time() - self._start_time > 20:
|
|
85
|
-
# issue a warning if the user has not collected after 20 seconds.
|
|
86
|
-
# skip for small downloads that are less than 20 seconds
|
|
87
|
-
# as the user might have a lot of work before is able to call collect.
|
|
88
|
-
self.logger.warning(MISSING_COLLECTION_MESSAGE)
|
|
89
|
-
time.sleep(0.5)
|
|
90
|
-
|
|
91
|
-
@lru_cache(maxsize=None)
|
|
92
|
-
def _fetch(self) -> Union[str, Exception]:
|
|
93
|
-
"""cached and locked method to fetch the data."""
|
|
94
|
-
if not self.bptr_exists():
|
|
95
|
-
return "" # no data to resolve
|
|
96
|
-
import truss_transfer
|
|
97
|
-
|
|
98
|
-
try:
|
|
99
|
-
return truss_transfer.lazy_data_resolve(str(self._data_dir))
|
|
100
|
-
except Exception as e:
|
|
101
|
-
self.logger.error(f"Error occurred while fetching data: {e}")
|
|
102
|
-
return e
|
|
103
|
-
|
|
104
|
-
def raise_if_not_collected(self):
|
|
105
|
-
"""We require the user to call `block_until_download_complete` before using the data.
|
|
106
|
-
If the user has not called the method during load, we raise an error.
|
|
107
|
-
"""
|
|
108
|
-
if not self._is_collected_by_user:
|
|
109
|
-
raise RuntimeError(MISSING_COLLECTION_MESSAGE)
|
|
110
|
-
|
|
111
|
-
def block_until_download_complete(
|
|
112
|
-
self, log_stats: bool = True, issue_collect: bool = True
|
|
113
|
-
) -> str:
|
|
114
|
-
"""Once called, blocks until the data has been downloaded.
|
|
115
|
-
|
|
116
|
-
example usage:
|
|
117
|
-
```
|
|
118
|
-
import torch
|
|
119
|
-
|
|
120
|
-
class Model:
|
|
121
|
-
def __init__(self, *args, **kwargs):
|
|
122
|
-
self._lazy_data_resolver = kwargs["lazy_data_resolver"]
|
|
123
|
-
|
|
124
|
-
def load():
|
|
125
|
-
random_vector = torch.randn(1000)
|
|
126
|
-
# important to collect the download before using any incomplete data
|
|
127
|
-
self._lazy_data_resolver.block_until_download_complete()
|
|
128
|
-
```
|
|
129
|
-
|
|
130
|
-
"""
|
|
131
|
-
start_lock = time.time()
|
|
132
|
-
self._is_collected_by_user = issue_collect or self._is_collected_by_user
|
|
133
|
-
with self._lock:
|
|
134
|
-
result = self._fetch()
|
|
135
|
-
if isinstance(result, Exception):
|
|
136
|
-
raise RuntimeError(
|
|
137
|
-
f"Error occurred while fetching data: {result}"
|
|
138
|
-
) from result
|
|
139
|
-
if log_stats and result:
|
|
140
|
-
self.logger.info(
|
|
141
|
-
f"model_cache: Fetch took {time.time() - self._start_time:.2f} seconds, of which {time.time() - start_lock:.2f} seconds were spent blocking."
|
|
142
|
-
)
|
|
143
|
-
return result
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
if __name__ == "__main__":
|
|
147
|
-
# Example usage
|
|
148
|
-
print("invoking download")
|
|
149
|
-
resolver = LazyDataResolverV2(Path("/example/path"))
|
|
150
|
-
# similate crash
|
|
151
|
-
time.sleep(0.01)
|
|
152
|
-
resolver.block_until_download_complete()
|
|
153
|
-
raise Exception("Simulated crash")
|