truss 0.11.8rc12__tar.gz → 0.11.9__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.8rc12 → truss-0.11.9}/PKG-INFO +1 -1
- {truss-0.11.8rc12 → truss-0.11.9}/pyproject.toml +1 -1
- {truss-0.11.8rc12 → truss-0.11.9}/truss/cli/logs/base_watcher.py +31 -12
- {truss-0.11.8rc12 → truss-0.11.9}/truss/cli/logs/model_log_watcher.py +24 -1
- {truss-0.11.8rc12 → truss-0.11.9}/truss/cli/train/core.py +13 -11
- truss-0.11.9/truss/cli/train/deploy_checkpoints/__init__.py +3 -0
- {truss-0.11.8rc12 → truss-0.11.9}/truss/cli/train/deploy_checkpoints/deploy_checkpoints.py +211 -106
- truss-0.11.9/truss/cli/train/deploy_checkpoints/deploy_checkpoints_helpers.py +1 -0
- truss-0.11.9/truss/cli/train/deploy_checkpoints/deploy_full_checkpoints.py +35 -0
- truss-0.11.9/truss/cli/train/deploy_checkpoints/deploy_lora_checkpoints.py +34 -0
- truss-0.11.9/truss/cli/train/deploy_checkpoints/deploy_whisper_checkpoints.py +10 -0
- {truss-0.11.8rc12 → truss-0.11.9}/truss/cli/train/types.py +1 -11
- {truss-0.11.8rc12 → truss-0.11.9}/truss/cli/train_commands.py +5 -15
- {truss-0.11.8rc12 → truss-0.11.9}/truss/remote/baseten/api.py +87 -0
- {truss-0.11.8rc12 → truss-0.11.9}/truss/templates/control/control/application.py +48 -26
- {truss-0.11.8rc12 → truss-0.11.9}/truss/templates/control/control/endpoints.py +1 -5
- {truss-0.11.8rc12 → truss-0.11.9}/truss/templates/control/control/helpers/truss_patch/model_container_patch_applier.py +33 -18
- truss-0.11.9/truss/tests/cli/train/test_deploy_checkpoints.py +277 -0
- truss-0.11.9/truss/tests/templates/control/control/conftest.py +20 -0
- {truss-0.11.8rc12 → truss-0.11.9}/truss/tests/templates/control/control/test_endpoints.py +4 -0
- {truss-0.11.8rc12 → truss-0.11.9}/truss/tests/templates/control/control/test_server.py +8 -24
- {truss-0.11.8rc12 → truss-0.11.9}/truss/tests/templates/control/control/test_server_integration.py +4 -2
- truss-0.11.9/truss/util/__init__.py +0 -0
- {truss-0.11.8rc12 → truss-0.11.9}/truss-train/truss_train/definitions.py +0 -1
- truss-0.11.8rc12/truss/cli/train/deploy_checkpoints/__init__.py +0 -3
- truss-0.11.8rc12/truss/cli/train/deploy_checkpoints/deploy_checkpoints_helpers.py +0 -52
- truss-0.11.8rc12/truss/cli/train/deploy_checkpoints/deploy_full_checkpoints.py +0 -94
- truss-0.11.8rc12/truss/cli/train/deploy_checkpoints/deploy_lora_checkpoints.py +0 -117
- truss-0.11.8rc12/truss/cli/train/deploy_checkpoints/deploy_whisper_checkpoints.py +0 -63
- truss-0.11.8rc12/truss/tests/cli/train/test_deploy_checkpoints.py +0 -1120
- {truss-0.11.8rc12 → truss-0.11.9}/.github/ISSUE_TEMPLATE/bug_report.md +0 -0
- {truss-0.11.8rc12 → truss-0.11.9}/.github/ISSUE_TEMPLATE/feature_request.md +0 -0
- {truss-0.11.8rc12 → truss-0.11.9}/.github/pull_request_template.md +0 -0
- {truss-0.11.8rc12 → truss-0.11.9}/.gitignore +0 -0
- {truss-0.11.8rc12 → truss-0.11.9}/CODE_OF_CONDUCT.md +0 -0
- {truss-0.11.8rc12 → truss-0.11.9}/CONTRIBUTING.md +0 -0
- {truss-0.11.8rc12 → truss-0.11.9}/LICENSE +0 -0
- {truss-0.11.8rc12 → truss-0.11.9}/README.md +0 -0
- {truss-0.11.8rc12 → truss-0.11.9}/baseten-performance-client/README.md +0 -0
- {truss-0.11.8rc12 → truss-0.11.9}/baseten-performance-client/node_bindings/README.md +0 -0
- {truss-0.11.8rc12 → truss-0.11.9}/baseten-performance-client/node_bindings/npm/android-arm-eabi/README.md +0 -0
- {truss-0.11.8rc12 → truss-0.11.9}/baseten-performance-client/node_bindings/npm/android-arm64/README.md +0 -0
- {truss-0.11.8rc12 → truss-0.11.9}/baseten-performance-client/node_bindings/npm/darwin-arm64/README.md +0 -0
- {truss-0.11.8rc12 → truss-0.11.9}/baseten-performance-client/node_bindings/npm/darwin-universal/README.md +0 -0
- {truss-0.11.8rc12 → truss-0.11.9}/baseten-performance-client/node_bindings/npm/darwin-x64/README.md +0 -0
- {truss-0.11.8rc12 → truss-0.11.9}/baseten-performance-client/node_bindings/npm/freebsd-x64/README.md +0 -0
- {truss-0.11.8rc12 → truss-0.11.9}/baseten-performance-client/node_bindings/npm/linux-arm-gnueabihf/README.md +0 -0
- {truss-0.11.8rc12 → truss-0.11.9}/baseten-performance-client/node_bindings/npm/linux-arm-musleabihf/README.md +0 -0
- {truss-0.11.8rc12 → truss-0.11.9}/baseten-performance-client/node_bindings/npm/linux-arm64-gnu/README.md +0 -0
- {truss-0.11.8rc12 → truss-0.11.9}/baseten-performance-client/node_bindings/npm/linux-arm64-musl/README.md +0 -0
- {truss-0.11.8rc12 → truss-0.11.9}/baseten-performance-client/node_bindings/npm/linux-riscv64-gnu/README.md +0 -0
- {truss-0.11.8rc12 → truss-0.11.9}/baseten-performance-client/node_bindings/npm/linux-x64-gnu/README.md +0 -0
- {truss-0.11.8rc12 → truss-0.11.9}/baseten-performance-client/node_bindings/npm/linux-x64-musl/README.md +0 -0
- {truss-0.11.8rc12 → truss-0.11.9}/baseten-performance-client/node_bindings/npm/win32-arm64-msvc/README.md +0 -0
- {truss-0.11.8rc12 → truss-0.11.9}/baseten-performance-client/node_bindings/npm/win32-ia32-msvc/README.md +0 -0
- {truss-0.11.8rc12 → truss-0.11.9}/baseten-performance-client/node_bindings/npm/win32-x64-msvc/README.md +0 -0
- {truss-0.11.8rc12 → truss-0.11.9}/baseten-performance-client/python_bindings/README.md +0 -0
- {truss-0.11.8rc12 → truss-0.11.9}/baseten-performance-client/scripts/README_nodejs.md +0 -0
- {truss-0.11.8rc12 → truss-0.11.9}/context_builder.Dockerfile +0 -0
- {truss-0.11.8rc12 → truss-0.11.9}/docs/README.md +0 -0
- {truss-0.11.8rc12 → truss-0.11.9}/docs/chains/doc_gen/README.md +0 -0
- {truss-0.11.8rc12 → truss-0.11.9}/docs/contribute/base-images.md +0 -0
- {truss-0.11.8rc12 → truss-0.11.9}/docs/contribute/release.md +0 -0
- {truss-0.11.8rc12 → truss-0.11.9}/truss/__init__.py +0 -0
- {truss-0.11.8rc12 → truss-0.11.9}/truss/api/__init__.py +0 -0
- {truss-0.11.8rc12 → truss-0.11.9}/truss/api/definitions.py +0 -0
- {truss-0.11.8rc12 → truss-0.11.9}/truss/base/__init__.py +0 -0
- {truss-0.11.8rc12 → truss-0.11.9}/truss/base/constants.py +0 -0
- {truss-0.11.8rc12 → truss-0.11.9}/truss/base/custom_types.py +0 -0
- {truss-0.11.8rc12 → truss-0.11.9}/truss/base/errors.py +0 -0
- {truss-0.11.8rc12 → truss-0.11.9}/truss/base/trt_llm_config.py +0 -0
- {truss-0.11.8rc12 → truss-0.11.9}/truss/base/truss_config.py +0 -0
- {truss-0.11.8rc12 → truss-0.11.9}/truss/base/truss_spec.py +0 -0
- {truss-0.11.8rc12 → truss-0.11.9}/truss/cli/chains_commands.py +0 -0
- {truss-0.11.8rc12 → truss-0.11.9}/truss/cli/cli.py +0 -0
- {truss-0.11.8rc12 → truss-0.11.9}/truss/cli/logs/training_log_watcher.py +0 -0
- {truss-0.11.8rc12 → truss-0.11.9}/truss/cli/logs/utils.py +0 -0
- {truss-0.11.8rc12 → truss-0.11.9}/truss/cli/remote_cli.py +0 -0
- {truss-0.11.8rc12 → truss-0.11.9}/truss/cli/train/common.py +0 -0
- {truss-0.11.8rc12 → truss-0.11.9}/truss/cli/train/deploy_from_checkpoint_config.yml +0 -0
- {truss-0.11.8rc12 → truss-0.11.9}/truss/cli/train/deploy_from_checkpoint_config_whisper.yml +0 -0
- {truss-0.11.8rc12 → truss-0.11.9}/truss/cli/train/metrics_watcher.py +0 -0
- {truss-0.11.8rc12 → truss-0.11.9}/truss/cli/train/poller.py +0 -0
- {truss-0.11.8rc12 → truss-0.11.9}/truss/cli/utils/common.py +0 -0
- {truss-0.11.8rc12 → truss-0.11.9}/truss/cli/utils/output.py +0 -0
- {truss-0.11.8rc12 → truss-0.11.9}/truss/cli/utils/self_upgrade.py +0 -0
- {truss-0.11.8rc12 → truss-0.11.9}/truss/contexts/docker_build_setup.py +0 -0
- {truss-0.11.8rc12 → truss-0.11.9}/truss/contexts/image_builder/cache_warmer.py +0 -0
- {truss-0.11.8rc12 → truss-0.11.9}/truss/contexts/image_builder/image_builder.py +0 -0
- {truss-0.11.8rc12 → truss-0.11.9}/truss/contexts/image_builder/serving_image_builder.py +0 -0
- {truss-0.11.8rc12 → truss-0.11.9}/truss/contexts/image_builder/util.py +0 -0
- {truss-0.11.8rc12 → truss-0.11.9}/truss/contexts/local_loader/docker_build_emulator.py +0 -0
- {truss-0.11.8rc12 → truss-0.11.9}/truss/contexts/local_loader/dockerfile_parser.py +0 -0
- {truss-0.11.8rc12 → truss-0.11.9}/truss/contexts/local_loader/load_model_local.py +0 -0
- {truss-0.11.8rc12 → truss-0.11.9}/truss/contexts/local_loader/truss_module_loader.py +0 -0
- {truss-0.11.8rc12 → truss-0.11.9}/truss/contexts/local_loader/utils.py +0 -0
- {truss-0.11.8rc12 → truss-0.11.9}/truss/contexts/truss_context.py +0 -0
- {truss-0.11.8rc12 → truss-0.11.9}/truss/local/local_config.py +0 -0
- {truss-0.11.8rc12 → truss-0.11.9}/truss/local/local_config_handler.py +0 -0
- {truss-0.11.8rc12 → truss-0.11.9}/truss/patch/__init__.py +0 -0
- {truss-0.11.8rc12 → truss-0.11.9}/truss/patch/hash.py +0 -0
- {truss-0.11.8rc12 → truss-0.11.9}/truss/patch/signature.py +0 -0
- {truss-0.11.8rc12 → truss-0.11.9}/truss/patch/truss_dir_patch_applier.py +0 -0
- {truss-0.11.8rc12 → truss-0.11.9}/truss/remote/baseten/__init__.py +0 -0
- {truss-0.11.8rc12 → truss-0.11.9}/truss/remote/baseten/auth.py +0 -0
- {truss-0.11.8rc12 → truss-0.11.9}/truss/remote/baseten/core.py +0 -0
- {truss-0.11.8rc12 → truss-0.11.9}/truss/remote/baseten/custom_types.py +0 -0
- {truss-0.11.8rc12 → truss-0.11.9}/truss/remote/baseten/error.py +0 -0
- {truss-0.11.8rc12 → truss-0.11.9}/truss/remote/baseten/remote.py +0 -0
- {truss-0.11.8rc12 → truss-0.11.9}/truss/remote/baseten/rest_client.py +0 -0
- {truss-0.11.8rc12 → truss-0.11.9}/truss/remote/baseten/service.py +0 -0
- {truss-0.11.8rc12 → truss-0.11.9}/truss/remote/baseten/utils/status.py +0 -0
- {truss-0.11.8rc12 → truss-0.11.9}/truss/remote/baseten/utils/tar.py +0 -0
- {truss-0.11.8rc12 → truss-0.11.9}/truss/remote/baseten/utils/time.py +0 -0
- {truss-0.11.8rc12 → truss-0.11.9}/truss/remote/baseten/utils/transfer.py +0 -0
- {truss-0.11.8rc12 → truss-0.11.9}/truss/remote/remote_factory.py +0 -0
- {truss-0.11.8rc12 → truss-0.11.9}/truss/remote/truss_remote.py +0 -0
- {truss-0.11.8rc12 → truss-0.11.9}/truss/templates/README.md.jinja +0 -0
- {truss-0.11.8rc12 → truss-0.11.9}/truss/templates/__init__.py +0 -0
- {truss-0.11.8rc12 → truss-0.11.9}/truss/templates/base.Dockerfile.jinja +0 -0
- {truss-0.11.8rc12 → truss-0.11.9}/truss/templates/cache.Dockerfile.jinja +0 -0
- {truss-0.11.8rc12 → truss-0.11.9}/truss/templates/cache_requirements.txt +0 -0
- {truss-0.11.8rc12 → truss-0.11.9}/truss/templates/control/control/helpers/context_managers.py +0 -0
- {truss-0.11.8rc12 → truss-0.11.9}/truss/templates/control/control/helpers/custom_types.py +0 -0
- {truss-0.11.8rc12 → truss-0.11.9}/truss/templates/control/control/helpers/errors.py +0 -0
- {truss-0.11.8rc12 → truss-0.11.9}/truss/templates/control/control/helpers/inference_server_controller.py +0 -0
- {truss-0.11.8rc12 → truss-0.11.9}/truss/templates/control/control/helpers/inference_server_process_controller.py +0 -0
- {truss-0.11.8rc12 → truss-0.11.9}/truss/templates/control/control/helpers/inference_server_starter.py +0 -0
- {truss-0.11.8rc12 → truss-0.11.9}/truss/templates/control/control/helpers/truss_patch/__init__.py +0 -0
- {truss-0.11.8rc12 → truss-0.11.9}/truss/templates/control/control/helpers/truss_patch/model_code_patch_applier.py +0 -0
- {truss-0.11.8rc12 → truss-0.11.9}/truss/templates/control/control/helpers/truss_patch/requirement_name_identifier.py +0 -0
- {truss-0.11.8rc12 → truss-0.11.9}/truss/templates/control/control/helpers/truss_patch/system_packages.py +0 -0
- {truss-0.11.8rc12 → truss-0.11.9}/truss/templates/control/control/server.py +0 -0
- {truss-0.11.8rc12 → truss-0.11.9}/truss/templates/control/requirements.txt +0 -0
- {truss-0.11.8rc12 → truss-0.11.9}/truss/templates/copy_cache_files.Dockerfile.jinja +0 -0
- {truss-0.11.8rc12 → truss-0.11.9}/truss/templates/custom/examples.yaml +0 -0
- {truss-0.11.8rc12 → truss-0.11.9}/truss/templates/custom/model/__init__.py +0 -0
- {truss-0.11.8rc12 → truss-0.11.9}/truss/templates/custom/model/model.py +0 -0
- {truss-0.11.8rc12 → truss-0.11.9}/truss/templates/custom_python_dx/my_model.py +0 -0
- {truss-0.11.8rc12 → truss-0.11.9}/truss/templates/docker_server/proxy.conf.jinja +0 -0
- {truss-0.11.8rc12 → truss-0.11.9}/truss/templates/docker_server/supervisord.conf.jinja +0 -0
- {truss-0.11.8rc12 → truss-0.11.9}/truss/templates/docker_server_requirements.txt +0 -0
- {truss-0.11.8rc12 → truss-0.11.9}/truss/templates/server/__init__.py +0 -0
- {truss-0.11.8rc12 → truss-0.11.9}/truss/templates/server/common/__init__.py +0 -0
- {truss-0.11.8rc12 → truss-0.11.9}/truss/templates/server/common/errors.py +0 -0
- {truss-0.11.8rc12 → truss-0.11.9}/truss/templates/server/common/patches/whisper/patch.py +0 -0
- {truss-0.11.8rc12 → truss-0.11.9}/truss/templates/server/common/patches.py +0 -0
- {truss-0.11.8rc12 → truss-0.11.9}/truss/templates/server/common/retry.py +0 -0
- {truss-0.11.8rc12 → truss-0.11.9}/truss/templates/server/common/schema.py +0 -0
- {truss-0.11.8rc12 → truss-0.11.9}/truss/templates/server/common/tracing.py +0 -0
- {truss-0.11.8rc12 → truss-0.11.9}/truss/templates/server/main.py +0 -0
- {truss-0.11.8rc12 → truss-0.11.9}/truss/templates/server/model_wrapper.py +0 -0
- {truss-0.11.8rc12 → truss-0.11.9}/truss/templates/server/requirements.txt +0 -0
- {truss-0.11.8rc12 → truss-0.11.9}/truss/templates/server/truss_server.py +0 -0
- {truss-0.11.8rc12 → truss-0.11.9}/truss/templates/server.Dockerfile.jinja +0 -0
- {truss-0.11.8rc12 → truss-0.11.9}/truss/templates/shared/__init__.py +0 -0
- {truss-0.11.8rc12 → truss-0.11.9}/truss/templates/shared/dynamic_config_resolver.py +0 -0
- {truss-0.11.8rc12 → truss-0.11.9}/truss/templates/shared/lazy_data_resolver.py +0 -0
- {truss-0.11.8rc12 → truss-0.11.9}/truss/templates/shared/log_config.py +0 -0
- {truss-0.11.8rc12 → truss-0.11.9}/truss/templates/shared/secrets_resolver.py +0 -0
- {truss-0.11.8rc12 → truss-0.11.9}/truss/templates/shared/serialization.py +0 -0
- {truss-0.11.8rc12 → truss-0.11.9}/truss/templates/shared/util.py +0 -0
- {truss-0.11.8rc12 → truss-0.11.9}/truss/templates/train/config.py +0 -0
- {truss-0.11.8rc12 → truss-0.11.9}/truss/templates/train/run.sh +0 -0
- {truss-0.11.8rc12 → truss-0.11.9}/truss/templates/trtllm-audio/model/model.py +0 -0
- {truss-0.11.8rc12 → truss-0.11.9}/truss/templates/trtllm-audio/packages/sigint_patch.py +0 -0
- {truss-0.11.8rc12 → truss-0.11.9}/truss/templates/trtllm-audio/packages/whisper_trt/__init__.py +0 -0
- {truss-0.11.8rc12 → truss-0.11.9}/truss/templates/trtllm-audio/packages/whisper_trt/assets.py +0 -0
- {truss-0.11.8rc12 → truss-0.11.9}/truss/templates/trtllm-audio/packages/whisper_trt/batching.py +0 -0
- {truss-0.11.8rc12 → truss-0.11.9}/truss/templates/trtllm-audio/packages/whisper_trt/custom_types.py +0 -0
- {truss-0.11.8rc12 → truss-0.11.9}/truss/templates/trtllm-audio/packages/whisper_trt/modeling.py +0 -0
- {truss-0.11.8rc12 → truss-0.11.9}/truss/templates/trtllm-audio/packages/whisper_trt/tokenizer.py +0 -0
- {truss-0.11.8rc12 → truss-0.11.9}/truss/templates/trtllm-audio/packages/whisper_trt/utils.py +0 -0
- {truss-0.11.8rc12 → truss-0.11.9}/truss/templates/trtllm-briton/README.md +0 -0
- {truss-0.11.8rc12 → truss-0.11.9}/truss/templates/trtllm-briton/src/extension.py +0 -0
- {truss-0.11.8rc12 → truss-0.11.9}/truss/tests/__init__.py +0 -0
- {truss-0.11.8rc12 → truss-0.11.9}/truss/tests/cli/test_cli.py +0 -0
- {truss-0.11.8rc12 → truss-0.11.9}/truss/tests/cli/train/resources/test_deploy_from_checkpoint_config.yml +0 -0
- {truss-0.11.8rc12 → truss-0.11.9}/truss/tests/cli/train/test_cache_view.py +0 -0
- {truss-0.11.8rc12 → truss-0.11.9}/truss/tests/cli/train/test_train_cli_core.py +0 -0
- {truss-0.11.8rc12 → truss-0.11.9}/truss/tests/cli/train/test_train_init.py +0 -0
- {truss-0.11.8rc12 → truss-0.11.9}/truss/tests/conftest.py +0 -0
- {truss-0.11.8rc12 → truss-0.11.9}/truss/tests/contexts/image_builder/test_serving_image_builder.py +0 -0
- {truss-0.11.8rc12 → truss-0.11.9}/truss/tests/contexts/local_loader/test_load_local.py +0 -0
- {truss-0.11.8rc12 → truss-0.11.9}/truss/tests/contexts/local_loader/test_truss_module_finder.py +0 -0
- {truss-0.11.8rc12 → truss-0.11.9}/truss/tests/helpers.py +0 -0
- {truss-0.11.8rc12 → truss-0.11.9}/truss/tests/local/test_local_config_handler.py +0 -0
- {truss-0.11.8rc12 → truss-0.11.9}/truss/tests/patch/test_calc_patch.py +0 -0
- {truss-0.11.8rc12 → truss-0.11.9}/truss/tests/patch/test_dir_signature.py +0 -0
- {truss-0.11.8rc12 → truss-0.11.9}/truss/tests/patch/test_hash.py +0 -0
- {truss-0.11.8rc12 → truss-0.11.9}/truss/tests/patch/test_signature.py +0 -0
- {truss-0.11.8rc12 → truss-0.11.9}/truss/tests/patch/test_truss_dir_patch_applier.py +0 -0
- {truss-0.11.8rc12 → truss-0.11.9}/truss/tests/patch/test_types.py +0 -0
- {truss-0.11.8rc12 → truss-0.11.9}/truss/tests/remote/baseten/conftest.py +0 -0
- {truss-0.11.8rc12 → truss-0.11.9}/truss/tests/remote/baseten/test_api.py +0 -0
- {truss-0.11.8rc12 → truss-0.11.9}/truss/tests/remote/baseten/test_auth.py +0 -0
- {truss-0.11.8rc12 → truss-0.11.9}/truss/tests/remote/baseten/test_core.py +0 -0
- {truss-0.11.8rc12 → truss-0.11.9}/truss/tests/remote/baseten/test_remote.py +0 -0
- {truss-0.11.8rc12 → truss-0.11.9}/truss/tests/remote/baseten/test_service.py +0 -0
- {truss-0.11.8rc12 → truss-0.11.9}/truss/tests/remote/test_remote_factory.py +0 -0
- {truss-0.11.8rc12 → truss-0.11.9}/truss/tests/remote/test_truss_remote.py +0 -0
- {truss-0.11.8rc12 → truss-0.11.9}/truss/tests/templates/control/control/helpers/test_context_managers.py +0 -0
- {truss-0.11.8rc12 → truss-0.11.9}/truss/tests/templates/control/control/helpers/test_model_container_patch_applier.py +0 -0
- {truss-0.11.8rc12 → truss-0.11.9}/truss/tests/templates/control/control/helpers/test_requirement_name_identifier.py +0 -0
- {truss-0.11.8rc12 → truss-0.11.9}/truss/tests/templates/core/server/test_dynamic_config_resolver.py +0 -0
- {truss-0.11.8rc12 → truss-0.11.9}/truss/tests/templates/core/server/test_lazy_data_resolver_v2.py +0 -0
- {truss-0.11.8rc12 → truss-0.11.9}/truss/tests/templates/core/server/test_secrets_resolver.py +0 -0
- {truss-0.11.8rc12 → truss-0.11.9}/truss/tests/templates/server/common/test_retry.py +0 -0
- {truss-0.11.8rc12 → truss-0.11.9}/truss/tests/templates/server/test_model_wrapper.py +0 -0
- {truss-0.11.8rc12 → truss-0.11.9}/truss/tests/templates/server/test_schema.py +0 -0
- {truss-0.11.8rc12 → truss-0.11.9}/truss/tests/templates/server/test_truss_server.py +0 -0
- {truss-0.11.8rc12 → truss-0.11.9}/truss/tests/test_build.py +0 -0
- {truss-0.11.8rc12 → truss-0.11.9}/truss/tests/test_config.py +0 -0
- {truss-0.11.8rc12 → truss-0.11.9}/truss/tests/test_context_builder_image.py +0 -0
- {truss-0.11.8rc12 → truss-0.11.9}/truss/tests/test_control_truss_patching.py +0 -0
- {truss-0.11.8rc12 → truss-0.11.9}/truss/tests/test_custom_server.py +0 -0
- {truss-0.11.8rc12 → truss-0.11.9}/truss/tests/test_data/__init__.py +0 -0
- {truss-0.11.8rc12 → truss-0.11.9}/truss/tests/test_data/annotated_types_truss/__init__.py +0 -0
- {truss-0.11.8rc12 → truss-0.11.9}/truss/tests/test_data/annotated_types_truss/config.yaml +0 -0
- {truss-0.11.8rc12 → truss-0.11.9}/truss/tests/test_data/annotated_types_truss/model/__init__.py +0 -0
- {truss-0.11.8rc12 → truss-0.11.9}/truss/tests/test_data/annotated_types_truss/model/model.py +0 -0
- {truss-0.11.8rc12 → truss-0.11.9}/truss/tests/test_data/auto-mpg.data +0 -0
- {truss-0.11.8rc12 → truss-0.11.9}/truss/tests/test_data/context_builder_image_test/Dockerfile +0 -0
- {truss-0.11.8rc12 → truss-0.11.9}/truss/tests/test_data/context_builder_image_test/__init__.py +0 -0
- {truss-0.11.8rc12 → truss-0.11.9}/truss/tests/test_data/context_builder_image_test/test.py +0 -0
- {truss-0.11.8rc12 → truss-0.11.9}/truss/tests/test_data/gcs_fix/__init__.py +0 -0
- {truss-0.11.8rc12 → truss-0.11.9}/truss/tests/test_data/gcs_fix/config.yaml +0 -0
- {truss-0.11.8rc12 → truss-0.11.9}/truss/tests/test_data/gcs_fix/model/__init__.py +0 -0
- {truss-0.11.8rc12 → truss-0.11.9}/truss/tests/test_data/gcs_fix/model/model.py +0 -0
- {truss-0.11.8rc12 → truss-0.11.9}/truss/tests/test_data/happy.ipynb +0 -0
- {truss-0.11.8rc12 → truss-0.11.9}/truss/tests/test_data/model_load_failure_test/__init__.py +0 -0
- {truss-0.11.8rc12 → truss-0.11.9}/truss/tests/test_data/model_load_failure_test/config.yaml +0 -0
- {truss-0.11.8rc12 → truss-0.11.9}/truss/tests/test_data/model_load_failure_test/model/__init__.py +0 -0
- {truss-0.11.8rc12 → truss-0.11.9}/truss/tests/test_data/model_load_failure_test/model/model.py +0 -0
- {truss-0.11.8rc12 → truss-0.11.9}/truss/tests/test_data/patch_ping_test_server/__init__.py +0 -0
- {truss-0.11.8rc12 → truss-0.11.9}/truss/tests/test_data/patch_ping_test_server/app.py +0 -0
- {truss-0.11.8rc12 → truss-0.11.9}/truss/tests/test_data/pima-indians-diabetes.csv +0 -0
- {truss-0.11.8rc12 → truss-0.11.9}/truss/tests/test_data/readme_int_example.md +0 -0
- {truss-0.11.8rc12 → truss-0.11.9}/truss/tests/test_data/readme_no_example.md +0 -0
- {truss-0.11.8rc12 → truss-0.11.9}/truss/tests/test_data/readme_str_example.md +0 -0
- {truss-0.11.8rc12 → truss-0.11.9}/truss/tests/test_data/server.Dockerfile +0 -0
- {truss-0.11.8rc12 → truss-0.11.9}/truss/tests/test_data/server_conformance_test_truss/__init__.py +0 -0
- {truss-0.11.8rc12 → truss-0.11.9}/truss/tests/test_data/server_conformance_test_truss/config.yaml +0 -0
- {truss-0.11.8rc12 → truss-0.11.9}/truss/tests/test_data/server_conformance_test_truss/model/__init__.py +0 -0
- {truss-0.11.8rc12 → truss-0.11.9}/truss/tests/test_data/server_conformance_test_truss/model/model.py +0 -0
- {truss-0.11.8rc12 → truss-0.11.9}/truss/tests/test_data/test_async_truss/__init__.py +0 -0
- {truss-0.11.8rc12 → truss-0.11.9}/truss/tests/test_data/test_async_truss/config.yaml +0 -0
- {truss-0.11.8rc12 → truss-0.11.9}/truss/tests/test_data/test_async_truss/model/__init__.py +0 -0
- {truss-0.11.8rc12 → truss-0.11.9}/truss/tests/test_data/test_async_truss/model/model.py +0 -0
- {truss-0.11.8rc12 → truss-0.11.9}/truss/tests/test_data/test_basic_truss/__init__.py +0 -0
- {truss-0.11.8rc12 → truss-0.11.9}/truss/tests/test_data/test_basic_truss/config.yaml +0 -0
- {truss-0.11.8rc12 → truss-0.11.9}/truss/tests/test_data/test_basic_truss/model/__init__.py +0 -0
- {truss-0.11.8rc12 → truss-0.11.9}/truss/tests/test_data/test_basic_truss/model/model.py +0 -0
- {truss-0.11.8rc12 → truss-0.11.9}/truss/tests/test_data/test_build_commands/__init__.py +0 -0
- {truss-0.11.8rc12 → truss-0.11.9}/truss/tests/test_data/test_build_commands/config.yaml +0 -0
- {truss-0.11.8rc12 → truss-0.11.9}/truss/tests/test_data/test_build_commands/model/__init__.py +0 -0
- {truss-0.11.8rc12 → truss-0.11.9}/truss/tests/test_data/test_build_commands/model/model.py +0 -0
- {truss-0.11.8rc12 → truss-0.11.9}/truss/tests/test_data/test_build_commands_failure/__init__.py +0 -0
- {truss-0.11.8rc12 → truss-0.11.9}/truss/tests/test_data/test_build_commands_failure/config.yaml +0 -0
- {truss-0.11.8rc12 → truss-0.11.9}/truss/tests/test_data/test_build_commands_failure/model/__init__.py +0 -0
- {truss-0.11.8rc12 → truss-0.11.9}/truss/tests/test_data/test_build_commands_failure/model/model.py +0 -0
- {truss-0.11.8rc12 → truss-0.11.9}/truss/tests/test_data/test_concurrency_truss/__init__.py +0 -0
- {truss-0.11.8rc12 → truss-0.11.9}/truss/tests/test_data/test_concurrency_truss/config.yaml +0 -0
- {truss-0.11.8rc12 → truss-0.11.9}/truss/tests/test_data/test_concurrency_truss/model/__init__.py +0 -0
- {truss-0.11.8rc12 → truss-0.11.9}/truss/tests/test_data/test_concurrency_truss/model/model.py +0 -0
- {truss-0.11.8rc12 → truss-0.11.9}/truss/tests/test_data/test_custom_server_truss/__init__.py +0 -0
- {truss-0.11.8rc12 → truss-0.11.9}/truss/tests/test_data/test_custom_server_truss/config.yaml +0 -0
- {truss-0.11.8rc12 → truss-0.11.9}/truss/tests/test_data/test_custom_server_truss/test_docker_image/Dockerfile +0 -0
- {truss-0.11.8rc12 → truss-0.11.9}/truss/tests/test_data/test_custom_server_truss/test_docker_image/README.md +0 -0
- {truss-0.11.8rc12 → truss-0.11.9}/truss/tests/test_data/test_custom_server_truss/test_docker_image/VERSION +0 -0
- {truss-0.11.8rc12 → truss-0.11.9}/truss/tests/test_data/test_custom_server_truss/test_docker_image/__init__.py +0 -0
- {truss-0.11.8rc12 → truss-0.11.9}/truss/tests/test_data/test_custom_server_truss/test_docker_image/app.py +0 -0
- {truss-0.11.8rc12 → truss-0.11.9}/truss/tests/test_data/test_custom_server_truss/test_docker_image/build_upload_new_image.sh +0 -0
- {truss-0.11.8rc12 → truss-0.11.9}/truss/tests/test_data/test_env_vars/config.yaml +0 -0
- {truss-0.11.8rc12 → truss-0.11.9}/truss/tests/test_data/test_go_custom_server_truss/config.yaml +0 -0
- {truss-0.11.8rc12 → truss-0.11.9}/truss/tests/test_data/test_go_custom_server_truss/docker/Dockerfile +0 -0
- {truss-0.11.8rc12 → truss-0.11.9}/truss/tests/test_data/test_go_custom_server_truss/docker/README.md +0 -0
- {truss-0.11.8rc12 → truss-0.11.9}/truss/tests/test_data/test_go_custom_server_truss/docker/VERSION +0 -0
- {truss-0.11.8rc12 → truss-0.11.9}/truss/tests/test_data/test_go_custom_server_truss/docker/build_upload_new_image.sh +0 -0
- {truss-0.11.8rc12 → truss-0.11.9}/truss/tests/test_data/test_go_custom_server_truss/docker/main.go +0 -0
- {truss-0.11.8rc12 → truss-0.11.9}/truss/tests/test_data/test_openai/__init__.py +0 -0
- {truss-0.11.8rc12 → truss-0.11.9}/truss/tests/test_data/test_openai/config.yaml +0 -0
- {truss-0.11.8rc12 → truss-0.11.9}/truss/tests/test_data/test_openai/model/__init__.py +0 -0
- {truss-0.11.8rc12 → truss-0.11.9}/truss/tests/test_data/test_openai/model/model.py +0 -0
- {truss-0.11.8rc12 → truss-0.11.9}/truss/tests/test_data/test_pyantic_v1/__init__.py +0 -0
- {truss-0.11.8rc12 → truss-0.11.9}/truss/tests/test_data/test_pyantic_v1/config.yaml +0 -0
- {truss-0.11.8rc12 → truss-0.11.9}/truss/tests/test_data/test_pyantic_v1/model/__init__.py +0 -0
- {truss-0.11.8rc12 → truss-0.11.9}/truss/tests/test_data/test_pyantic_v1/model/model.py +0 -0
- {truss-0.11.8rc12 → truss-0.11.9}/truss/tests/test_data/test_pyantic_v1/requirements.txt +0 -0
- {truss-0.11.8rc12 → truss-0.11.9}/truss/tests/test_data/test_pyantic_v2/__init__.py +0 -0
- {truss-0.11.8rc12 → truss-0.11.9}/truss/tests/test_data/test_pyantic_v2/config.yaml +0 -0
- {truss-0.11.8rc12 → truss-0.11.9}/truss/tests/test_data/test_pyantic_v2/model/__init__.py +0 -0
- {truss-0.11.8rc12 → truss-0.11.9}/truss/tests/test_data/test_pyantic_v2/model/model.py +0 -0
- {truss-0.11.8rc12 → truss-0.11.9}/truss/tests/test_data/test_pyantic_v2/requirements.txt +0 -0
- {truss-0.11.8rc12 → truss-0.11.9}/truss/tests/test_data/test_requirements_file_truss/__init__.py +0 -0
- {truss-0.11.8rc12 → truss-0.11.9}/truss/tests/test_data/test_requirements_file_truss/config.yaml +0 -0
- {truss-0.11.8rc12 → truss-0.11.9}/truss/tests/test_data/test_requirements_file_truss/model/__init__.py +0 -0
- {truss-0.11.8rc12 → truss-0.11.9}/truss/tests/test_data/test_requirements_file_truss/model/model.py +0 -0
- {truss-0.11.8rc12 → truss-0.11.9}/truss/tests/test_data/test_requirements_file_truss/requirements.txt +0 -0
- {truss-0.11.8rc12 → truss-0.11.9}/truss/tests/test_data/test_streaming_async_generator_truss/__init__.py +0 -0
- {truss-0.11.8rc12 → truss-0.11.9}/truss/tests/test_data/test_streaming_async_generator_truss/config.yaml +0 -0
- {truss-0.11.8rc12 → truss-0.11.9}/truss/tests/test_data/test_streaming_async_generator_truss/model/__init__.py +0 -0
- {truss-0.11.8rc12 → truss-0.11.9}/truss/tests/test_data/test_streaming_async_generator_truss/model/model.py +0 -0
- {truss-0.11.8rc12 → truss-0.11.9}/truss/tests/test_data/test_streaming_read_timeout/__init__.py +0 -0
- {truss-0.11.8rc12 → truss-0.11.9}/truss/tests/test_data/test_streaming_read_timeout/config.yaml +0 -0
- {truss-0.11.8rc12 → truss-0.11.9}/truss/tests/test_data/test_streaming_read_timeout/model/__init__.py +0 -0
- {truss-0.11.8rc12 → truss-0.11.9}/truss/tests/test_data/test_streaming_read_timeout/model/model.py +0 -0
- {truss-0.11.8rc12 → truss-0.11.9}/truss/tests/test_data/test_streaming_truss/__init__.py +0 -0
- {truss-0.11.8rc12 → truss-0.11.9}/truss/tests/test_data/test_streaming_truss/config.yaml +0 -0
- {truss-0.11.8rc12 → truss-0.11.9}/truss/tests/test_data/test_streaming_truss/model/__init__.py +0 -0
- {truss-0.11.8rc12 → truss-0.11.9}/truss/tests/test_data/test_streaming_truss/model/model.py +0 -0
- {truss-0.11.8rc12 → truss-0.11.9}/truss/tests/test_data/test_streaming_truss_with_error/__init__.py +0 -0
- {truss-0.11.8rc12 → truss-0.11.9}/truss/tests/test_data/test_streaming_truss_with_error/config.yaml +0 -0
- {truss-0.11.8rc12 → truss-0.11.9}/truss/tests/test_data/test_streaming_truss_with_error/model/__init__.py +0 -0
- {truss-0.11.8rc12 → truss-0.11.9}/truss/tests/test_data/test_streaming_truss_with_error/model/model.py +0 -0
- {truss-0.11.8rc12 → truss-0.11.9}/truss/tests/test_data/test_streaming_truss_with_error/packages/__init__.py +0 -0
- {truss-0.11.8rc12 → truss-0.11.9}/truss/tests/test_data/test_streaming_truss_with_error/packages/helpers_1.py +0 -0
- {truss-0.11.8rc12 → truss-0.11.9}/truss/tests/test_data/test_streaming_truss_with_error/packages/helpers_2.py +0 -0
- {truss-0.11.8rc12 → truss-0.11.9}/truss/tests/test_data/test_streaming_truss_with_tracing/__init__.py +0 -0
- {truss-0.11.8rc12 → truss-0.11.9}/truss/tests/test_data/test_streaming_truss_with_tracing/config.yaml +0 -0
- {truss-0.11.8rc12 → truss-0.11.9}/truss/tests/test_data/test_streaming_truss_with_tracing/model/__init__.py +0 -0
- {truss-0.11.8rc12 → truss-0.11.9}/truss/tests/test_data/test_streaming_truss_with_tracing/model/model.py +0 -0
- {truss-0.11.8rc12 → truss-0.11.9}/truss/tests/test_data/test_trt_llm_truss/__init__.py +0 -0
- {truss-0.11.8rc12 → truss-0.11.9}/truss/tests/test_data/test_trt_llm_truss/config.yaml +0 -0
- {truss-0.11.8rc12 → truss-0.11.9}/truss/tests/test_data/test_trt_llm_truss/model/__init__.py +0 -0
- {truss-0.11.8rc12 → truss-0.11.9}/truss/tests/test_data/test_trt_llm_truss/model/model.py +0 -0
- {truss-0.11.8rc12 → truss-0.11.9}/truss/tests/test_data/test_truss/__init__.py +0 -0
- {truss-0.11.8rc12 → truss-0.11.9}/truss/tests/test_data/test_truss/config.yaml +0 -0
- {truss-0.11.8rc12 → truss-0.11.9}/truss/tests/test_data/test_truss/examples.yaml +0 -0
- {truss-0.11.8rc12 → truss-0.11.9}/truss/tests/test_data/test_truss/model/__init__.py +0 -0
- {truss-0.11.8rc12 → truss-0.11.9}/truss/tests/test_data/test_truss/model/dummy +0 -0
- {truss-0.11.8rc12 → truss-0.11.9}/truss/tests/test_data/test_truss/model/model.py +0 -0
- {truss-0.11.8rc12 → truss-0.11.9}/truss/tests/test_data/test_truss/packages/__init__.py +0 -0
- {truss-0.11.8rc12 → truss-0.11.9}/truss/tests/test_data/test_truss/packages/test_package/__init__.py +0 -0
- {truss-0.11.8rc12 → truss-0.11.9}/truss/tests/test_data/test_truss/packages/test_package/test.py +0 -0
- {truss-0.11.8rc12 → truss-0.11.9}/truss/tests/test_data/test_truss_server_model_cache_v1/__init__.py +0 -0
- {truss-0.11.8rc12 → truss-0.11.9}/truss/tests/test_data/test_truss_server_model_cache_v1/config.yaml +0 -0
- {truss-0.11.8rc12 → truss-0.11.9}/truss/tests/test_data/test_truss_server_model_cache_v1/model/__init__.py +0 -0
- {truss-0.11.8rc12 → truss-0.11.9}/truss/tests/test_data/test_truss_server_model_cache_v1/model/model.py +0 -0
- {truss-0.11.8rc12 → truss-0.11.9}/truss/tests/test_data/test_truss_server_model_cache_v2/__init__.py +0 -0
- {truss-0.11.8rc12 → truss-0.11.9}/truss/tests/test_data/test_truss_server_model_cache_v2/config.yaml +0 -0
- {truss-0.11.8rc12 → truss-0.11.9}/truss/tests/test_data/test_truss_server_model_cache_v2/model/__init__.py +0 -0
- {truss-0.11.8rc12 → truss-0.11.9}/truss/tests/test_data/test_truss_server_model_cache_v2/model/model.py +0 -0
- {truss-0.11.8rc12 → truss-0.11.9}/truss/tests/test_data/test_truss_with_error/__init__.py +0 -0
- {truss-0.11.8rc12 → truss-0.11.9}/truss/tests/test_data/test_truss_with_error/config.yaml +0 -0
- {truss-0.11.8rc12 → truss-0.11.9}/truss/tests/test_data/test_truss_with_error/model/__init__.py +0 -0
- {truss-0.11.8rc12 → truss-0.11.9}/truss/tests/test_data/test_truss_with_error/model/model.py +0 -0
- {truss-0.11.8rc12 → truss-0.11.9}/truss/tests/test_data/test_truss_with_error/packages/__init__.py +0 -0
- {truss-0.11.8rc12 → truss-0.11.9}/truss/tests/test_data/test_truss_with_error/packages/helpers_1.py +0 -0
- {truss-0.11.8rc12 → truss-0.11.9}/truss/tests/test_data/test_truss_with_error/packages/helpers_2.py +0 -0
- {truss-0.11.8rc12 → truss-0.11.9}/truss/tests/test_docker.py +0 -0
- {truss-0.11.8rc12 → truss-0.11.9}/truss/tests/test_model_inference.py +0 -0
- {truss-0.11.8rc12 → truss-0.11.9}/truss/tests/test_model_schema.py +0 -0
- {truss-0.11.8rc12 → truss-0.11.9}/truss/tests/test_testing_utilities_for_other_tests.py +0 -0
- {truss-0.11.8rc12 → truss-0.11.9}/truss/tests/test_truss_gatherer.py +0 -0
- {truss-0.11.8rc12 → truss-0.11.9}/truss/tests/test_truss_handle.py +0 -0
- {truss-0.11.8rc12 → truss-0.11.9}/truss/tests/test_util.py +0 -0
- {truss-0.11.8rc12 → truss-0.11.9}/truss/tests/trt_llm/test_trt_llm_config.py +0 -0
- {truss-0.11.8rc12 → truss-0.11.9}/truss/tests/trt_llm/test_validation.py +0 -0
- {truss-0.11.8rc12 → truss-0.11.9}/truss/tests/util/test_config_checks.py +0 -0
- {truss-0.11.8rc12 → truss-0.11.9}/truss/tests/util/test_env_vars.py +0 -0
- {truss-0.11.8rc12 → truss-0.11.9}/truss/tests/util/test_path.py +0 -0
- {truss-0.11.8rc12 → truss-0.11.9}/truss/trt_llm/config_checks.py +0 -0
- {truss-0.11.8rc12 → truss-0.11.9}/truss/trt_llm/validation.py +0 -0
- {truss-0.11.8rc12 → truss-0.11.9}/truss/truss_handle/__init__.py +0 -0
- {truss-0.11.8rc12 → truss-0.11.9}/truss/truss_handle/build.py +0 -0
- {truss-0.11.8rc12 → truss-0.11.9}/truss/truss_handle/decorators.py +0 -0
- {truss-0.11.8rc12 → truss-0.11.9}/truss/truss_handle/patch/__init__.py +0 -0
- {truss-0.11.8rc12 → truss-0.11.9}/truss/truss_handle/patch/calc_patch.py +0 -0
- {truss-0.11.8rc12 → truss-0.11.9}/truss/truss_handle/patch/constants.py +0 -0
- {truss-0.11.8rc12 → truss-0.11.9}/truss/truss_handle/patch/custom_types.py +0 -0
- {truss-0.11.8rc12 → truss-0.11.9}/truss/truss_handle/patch/dir_signature.py +0 -0
- {truss-0.11.8rc12 → truss-0.11.9}/truss/truss_handle/patch/hash.py +0 -0
- {truss-0.11.8rc12 → truss-0.11.9}/truss/truss_handle/patch/local_truss_patch_applier.py +0 -0
- {truss-0.11.8rc12 → truss-0.11.9}/truss/truss_handle/patch/signature.py +0 -0
- {truss-0.11.8rc12 → truss-0.11.9}/truss/truss_handle/patch/truss_dir_patch_applier.py +0 -0
- {truss-0.11.8rc12 → truss-0.11.9}/truss/truss_handle/readme_generator.py +0 -0
- {truss-0.11.8rc12 → truss-0.11.9}/truss/truss_handle/truss_gatherer.py +0 -0
- {truss-0.11.8rc12 → truss-0.11.9}/truss/truss_handle/truss_handle.py +0 -0
- {truss-0.11.8rc12 → truss-0.11.9}/truss/util/.truss_ignore +0 -0
- {truss-0.11.8rc12 → truss-0.11.9}/truss/util/docker.py +0 -0
- {truss-0.11.8rc12 → truss-0.11.9}/truss/util/download.py +0 -0
- {truss-0.11.8rc12 → truss-0.11.9}/truss/util/env_vars.py +0 -0
- {truss-0.11.8rc12 → truss-0.11.9}/truss/util/gpu.py +0 -0
- {truss-0.11.8rc12 → truss-0.11.9}/truss/util/jinja.py +0 -0
- {truss-0.11.8rc12 → truss-0.11.9}/truss/util/log_utils.py +0 -0
- {truss-0.11.8rc12 → truss-0.11.9}/truss/util/notebook.py +0 -0
- {truss-0.11.8rc12 → truss-0.11.9}/truss/util/path.py +0 -0
- {truss-0.11.8rc12 → truss-0.11.9}/truss/util/requirements.py +0 -0
- {truss-0.11.8rc12 → truss-0.11.9}/truss/util/user_config.py +0 -0
- {truss-0.11.8rc12 → truss-0.11.9}/truss-chains/examples/README.md +0 -0
- {truss-0.11.8rc12 → truss-0.11.9}/truss-chains/examples/audio-transcription/README.md +0 -0
- {truss-0.11.8rc12 → truss-0.11.9}/truss-chains/examples/rag/README.md +0 -0
- {truss-0.11.8rc12 → truss-0.11.9}/truss-chains/tests/itest_chain/requirements.txt +0 -0
- {truss-0.11.8rc12 → truss-0.11.9}/truss-chains/truss_chains/__init__.py +0 -0
- {truss-0.11.8rc12 → truss-0.11.9}/truss-chains/truss_chains/deployment/__init__.py +0 -0
- {truss-0.11.8rc12 → truss-0.11.9}/truss-chains/truss_chains/deployment/code_gen.py +0 -0
- {truss-0.11.8rc12 → truss-0.11.9}/truss-chains/truss_chains/deployment/deployment_client.py +0 -0
- {truss-0.11.8rc12 → truss-0.11.9}/truss-chains/truss_chains/framework.py +0 -0
- {truss-0.11.8rc12 → truss-0.11.9}/truss-chains/truss_chains/private_types.py +0 -0
- {truss-0.11.8rc12 → truss-0.11.9}/truss-chains/truss_chains/public_api.py +0 -0
- {truss-0.11.8rc12 → truss-0.11.9}/truss-chains/truss_chains/public_types.py +0 -0
- {truss-0.11.8rc12 → truss-0.11.9}/truss-chains/truss_chains/py.typed +0 -0
- {truss-0.11.8rc12 → truss-0.11.9}/truss-chains/truss_chains/pydantic_numpy.py +0 -0
- {truss-0.11.8rc12 → truss-0.11.9}/truss-chains/truss_chains/reference_code/reference_chainlet.py +0 -0
- {truss-0.11.8rc12 → truss-0.11.9}/truss-chains/truss_chains/reference_code/reference_model.py +0 -0
- {truss-0.11.8rc12 → truss-0.11.9}/truss-chains/truss_chains/remote_chainlet/__init__.py +0 -0
- {truss-0.11.8rc12 → truss-0.11.9}/truss-chains/truss_chains/remote_chainlet/model_skeleton.py +0 -0
- {truss-0.11.8rc12 → truss-0.11.9}/truss-chains/truss_chains/remote_chainlet/stub.py +0 -0
- {truss-0.11.8rc12 → truss-0.11.9}/truss-chains/truss_chains/remote_chainlet/utils.py +0 -0
- {truss-0.11.8rc12 → truss-0.11.9}/truss-chains/truss_chains/streaming.py +0 -0
- {truss-0.11.8rc12 → truss-0.11.9}/truss-chains/truss_chains/utils.py +0 -0
- {truss-0.11.8rc12 → truss-0.11.9}/truss-train/truss_train/__init__.py +0 -0
- {truss-0.11.8rc12 → truss-0.11.9}/truss-train/truss_train/deployment.py +0 -0
- {truss-0.11.8rc12 → truss-0.11.9}/truss-train/truss_train/loader.py +0 -0
- {truss-0.11.8rc12 → truss-0.11.9}/truss-train/truss_train/public_api.py +0 -0
- {truss-0.11.8rc12 → truss-0.11.9}/truss-train/truss_train/restore_from_checkpoint.py +0 -0
- {truss-0.11.8rc12 → truss-0.11.9}/truss-transfer/README.md +0 -0
- {truss-0.11.8rc12 → truss-0.11.9}/truss-transfer/tests/README.md +0 -0
|
@@ -17,7 +17,9 @@ class LogWatcher(ABC):
|
|
|
17
17
|
# NB(nikhil): we add buffer for clock skew, so this helps us detect duplicates.
|
|
18
18
|
# TODO(nikhil): clean up hashes so this doesn't grow indefinitely.
|
|
19
19
|
_log_hashes: set[str] = set()
|
|
20
|
-
|
|
20
|
+
|
|
21
|
+
_last_poll_time_ms: Optional[int] = None
|
|
22
|
+
_last_log_time_ms: Optional[int] = None
|
|
21
23
|
|
|
22
24
|
def __init__(self, api: BasetenApi):
|
|
23
25
|
self.api = api
|
|
@@ -26,37 +28,54 @@ class LogWatcher(ABC):
|
|
|
26
28
|
log_str = f"{log.timestamp}-{log.message}-{log.replica}"
|
|
27
29
|
return hashlib.sha256(log_str.encode("utf-8")).hexdigest()
|
|
28
30
|
|
|
29
|
-
def
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
31
|
+
def get_start_epoch_ms(self, now_ms: int) -> Optional[int]:
|
|
32
|
+
if self._last_poll_time_ms:
|
|
33
|
+
return self._last_poll_time_ms - CLOCK_SKEW_BUFFER_MS
|
|
34
|
+
|
|
35
|
+
return None
|
|
34
36
|
|
|
37
|
+
def fetch_and_parse_logs(
|
|
38
|
+
self, start_epoch_millis: Optional[int], end_epoch_millis: Optional[int]
|
|
39
|
+
) -> Iterator[ParsedLog]:
|
|
35
40
|
api_logs = self.fetch_logs(
|
|
36
|
-
start_epoch_millis=
|
|
41
|
+
start_epoch_millis=start_epoch_millis, end_epoch_millis=end_epoch_millis
|
|
37
42
|
)
|
|
38
43
|
|
|
39
44
|
parsed_logs = parse_logs(api_logs)
|
|
45
|
+
|
|
40
46
|
for log in parsed_logs:
|
|
41
|
-
h
|
|
42
|
-
if h not in self._log_hashes:
|
|
47
|
+
if (h := self._hash_log(log)) not in self._log_hashes:
|
|
43
48
|
self._log_hashes.add(h)
|
|
49
|
+
|
|
44
50
|
yield log
|
|
45
51
|
|
|
46
|
-
|
|
52
|
+
def poll(self) -> Iterator[ParsedLog]:
|
|
53
|
+
now_ms = int(time.time() * 1000)
|
|
54
|
+
start_epoch_ms = self.get_start_epoch_ms(now_ms)
|
|
55
|
+
|
|
56
|
+
for log in self.fetch_and_parse_logs(
|
|
57
|
+
start_epoch_millis=start_epoch_ms,
|
|
58
|
+
end_epoch_millis=now_ms + CLOCK_SKEW_BUFFER_MS,
|
|
59
|
+
):
|
|
60
|
+
yield log
|
|
61
|
+
|
|
62
|
+
epoch_ns = int(log.timestamp)
|
|
63
|
+
self._last_log_time_ms = int(epoch_ns / 1e6)
|
|
64
|
+
|
|
65
|
+
self._last_poll_time_ms = now_ms
|
|
47
66
|
|
|
48
67
|
def watch(self) -> Iterator[ParsedLog]:
|
|
49
68
|
self.before_polling()
|
|
50
69
|
with console.status("Polling logs", spinner="aesthetic"):
|
|
51
70
|
while True:
|
|
52
|
-
for log in self.
|
|
71
|
+
for log in self.poll():
|
|
53
72
|
yield log
|
|
54
73
|
if self._log_hashes:
|
|
55
74
|
break
|
|
56
75
|
time.sleep(POLL_INTERVAL_SEC)
|
|
57
76
|
|
|
58
77
|
while self.should_poll_again():
|
|
59
|
-
for log in self.
|
|
78
|
+
for log in self.poll():
|
|
60
79
|
yield log
|
|
61
80
|
time.sleep(POLL_INTERVAL_SEC)
|
|
62
81
|
self.post_poll()
|
|
@@ -1,9 +1,12 @@
|
|
|
1
|
+
from functools import cached_property
|
|
1
2
|
from typing import Any, List, Optional
|
|
2
3
|
|
|
3
4
|
from truss.cli.logs.base_watcher import LogWatcher
|
|
4
5
|
from truss.remote.baseten.api import BasetenApi
|
|
5
6
|
from truss.remote.baseten.utils.status import MODEL_RUNNING_STATES
|
|
6
7
|
|
|
8
|
+
MAX_LOOK_BACK_MS = 1000 * 60 * 60 # 1 hour.
|
|
9
|
+
|
|
7
10
|
|
|
8
11
|
class ModelDeploymentLogWatcher(LogWatcher):
|
|
9
12
|
_model_id: str
|
|
@@ -25,11 +28,31 @@ class ModelDeploymentLogWatcher(LogWatcher):
|
|
|
25
28
|
self._model_id, self._deployment_id, start_epoch_millis, end_epoch_millis
|
|
26
29
|
)
|
|
27
30
|
|
|
31
|
+
def get_start_epoch_ms(self, now_ms: int) -> Optional[int]:
|
|
32
|
+
# NOTE(Tyron): If there can be multiple replicas,
|
|
33
|
+
# we can't use a timestamp cursor to poll for logs.
|
|
34
|
+
if not self._is_development:
|
|
35
|
+
return super().get_start_epoch_ms(now_ms)
|
|
36
|
+
|
|
37
|
+
# Cursor logic.
|
|
38
|
+
|
|
39
|
+
if self._last_log_time_ms:
|
|
40
|
+
return max(self._last_log_time_ms, now_ms - MAX_LOOK_BACK_MS)
|
|
41
|
+
|
|
42
|
+
return None
|
|
43
|
+
|
|
28
44
|
def should_poll_again(self) -> bool:
|
|
29
45
|
return self._current_status in MODEL_RUNNING_STATES
|
|
30
46
|
|
|
47
|
+
def _get_deployment(self) -> Any:
|
|
48
|
+
return self.api.get_deployment(self._model_id, self._deployment_id)
|
|
49
|
+
|
|
31
50
|
def _get_current_status(self) -> str:
|
|
32
|
-
return self.
|
|
51
|
+
return self._get_deployment()["status"]
|
|
52
|
+
|
|
53
|
+
@cached_property
|
|
54
|
+
def _is_development(self) -> bool:
|
|
55
|
+
return self._get_deployment()["is_development"]
|
|
33
56
|
|
|
34
57
|
def post_poll(self) -> None:
|
|
35
58
|
self._current_status = self._get_current_status()
|
|
@@ -16,7 +16,7 @@ from rich.text import Text
|
|
|
16
16
|
|
|
17
17
|
from truss.cli.train import common, deploy_checkpoints
|
|
18
18
|
from truss.cli.train.metrics_watcher import MetricsWatcher
|
|
19
|
-
from truss.cli.train.types import
|
|
19
|
+
from truss.cli.train.types import DeployCheckpointArgs, DeployCheckpointsConfigComplete
|
|
20
20
|
from truss.cli.utils import common as cli_common
|
|
21
21
|
from truss.cli.utils.output import console
|
|
22
22
|
from truss.remote.baseten.custom_types import (
|
|
@@ -242,35 +242,35 @@ def view_training_job_metrics(
|
|
|
242
242
|
metrics_display.watch()
|
|
243
243
|
|
|
244
244
|
|
|
245
|
-
def
|
|
246
|
-
remote_provider: BasetenRemote, args:
|
|
247
|
-
) ->
|
|
245
|
+
def create_model_version_from_inference_template(
|
|
246
|
+
remote_provider: BasetenRemote, args: DeployCheckpointArgs
|
|
247
|
+
) -> DeployCheckpointsConfigComplete:
|
|
248
248
|
if not args.deploy_config_path:
|
|
249
|
-
return deploy_checkpoints.
|
|
249
|
+
return deploy_checkpoints.create_model_version_from_inference_template(
|
|
250
250
|
remote_provider, DeployCheckpointsConfig(), args.project_id, args.job_id
|
|
251
251
|
)
|
|
252
252
|
#### User provided a checkpoint deploy config file
|
|
253
253
|
with loader.import_deploy_checkpoints_config(
|
|
254
254
|
Path(args.deploy_config_path)
|
|
255
255
|
) as checkpoint_deploy:
|
|
256
|
-
return deploy_checkpoints.
|
|
256
|
+
return deploy_checkpoints.create_model_version_from_inference_template(
|
|
257
257
|
remote_provider, checkpoint_deploy, args.project_id, args.job_id
|
|
258
258
|
)
|
|
259
259
|
|
|
260
260
|
|
|
261
261
|
def _get_checkpoint_names(
|
|
262
|
-
|
|
262
|
+
checkpoint_deploy_config: DeployCheckpointsConfigComplete,
|
|
263
263
|
) -> list[str]:
|
|
264
264
|
return [
|
|
265
265
|
checkpoint.paths[0].strip("/").split("/")[-1]
|
|
266
|
-
for checkpoint in
|
|
266
|
+
for checkpoint in checkpoint_deploy_config.checkpoint_details.checkpoints
|
|
267
267
|
]
|
|
268
268
|
|
|
269
269
|
|
|
270
270
|
def print_deploy_checkpoints_success_message(
|
|
271
|
-
|
|
271
|
+
checkpoint_deploy_config: DeployCheckpointsConfigComplete,
|
|
272
272
|
):
|
|
273
|
-
checkpoint_names = _get_checkpoint_names(
|
|
273
|
+
checkpoint_names = _get_checkpoint_names(checkpoint_deploy_config)
|
|
274
274
|
console.print(
|
|
275
275
|
Text("\nTo run the model"),
|
|
276
276
|
Text("ensure your `model` parameter is set to one of"),
|
|
@@ -279,7 +279,9 @@ def print_deploy_checkpoints_success_message(
|
|
|
279
279
|
style="magenta",
|
|
280
280
|
),
|
|
281
281
|
Text("in your request. An example request body might look like this:"),
|
|
282
|
-
Text(
|
|
282
|
+
Text(
|
|
283
|
+
f'\n{{"model": "{checkpoint_names[0]}", "messages": [...]}}', style="green"
|
|
284
|
+
),
|
|
283
285
|
)
|
|
284
286
|
|
|
285
287
|
|
|
@@ -1,7 +1,5 @@
|
|
|
1
1
|
import re
|
|
2
|
-
import tempfile
|
|
3
2
|
from collections import OrderedDict
|
|
4
|
-
from pathlib import Path
|
|
5
3
|
from typing import List, Optional, Union
|
|
6
4
|
|
|
7
5
|
import rich_click as click
|
|
@@ -9,10 +7,7 @@ from InquirerPy import inquirer
|
|
|
9
7
|
|
|
10
8
|
from truss.base import truss_config
|
|
11
9
|
from truss.cli.train import common
|
|
12
|
-
from truss.cli.train.types import
|
|
13
|
-
DeployCheckpointsConfigComplete,
|
|
14
|
-
PrepareCheckpointResult,
|
|
15
|
-
)
|
|
10
|
+
from truss.cli.train.types import DeployCheckpointsConfigComplete
|
|
16
11
|
from truss.cli.utils.output import console
|
|
17
12
|
from truss.remote.baseten.remote import BasetenRemote
|
|
18
13
|
from truss_train.definitions import (
|
|
@@ -25,18 +20,9 @@ from truss_train.definitions import (
|
|
|
25
20
|
SecretReference,
|
|
26
21
|
)
|
|
27
22
|
|
|
28
|
-
from .deploy_full_checkpoints import
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
)
|
|
32
|
-
from .deploy_lora_checkpoints import (
|
|
33
|
-
hydrate_lora_checkpoint,
|
|
34
|
-
render_vllm_lora_truss_config,
|
|
35
|
-
)
|
|
36
|
-
from .deploy_whisper_checkpoints import (
|
|
37
|
-
hydrate_whisper_checkpoint,
|
|
38
|
-
render_vllm_whisper_truss_config,
|
|
39
|
-
)
|
|
23
|
+
from .deploy_full_checkpoints import hydrate_full_checkpoint
|
|
24
|
+
from .deploy_lora_checkpoints import hydrate_lora_checkpoint
|
|
25
|
+
from .deploy_whisper_checkpoints import hydrate_whisper_checkpoint
|
|
40
26
|
|
|
41
27
|
HF_TOKEN_ENVVAR_NAME = "HF_TOKEN"
|
|
42
28
|
# If we change this, make sure to update the logic in backend codebase
|
|
@@ -44,28 +30,162 @@ CHECKPOINT_PATTERN = re.compile(r".*checkpoint-\d+(?:-\d+)?$")
|
|
|
44
30
|
ALLOWED_DEPLOYMENT_NAMES = re.compile(r"^[0-9a-zA-Z_\-\.]*$")
|
|
45
31
|
|
|
46
32
|
|
|
47
|
-
def
|
|
33
|
+
def create_model_version_from_inference_template(
|
|
48
34
|
remote_provider: BasetenRemote,
|
|
49
35
|
checkpoint_deploy_config: DeployCheckpointsConfig,
|
|
50
36
|
project_id: Optional[str],
|
|
51
37
|
job_id: Optional[str],
|
|
52
|
-
) ->
|
|
38
|
+
) -> DeployCheckpointsConfigComplete:
|
|
53
39
|
checkpoint_deploy_config = _hydrate_deploy_config(
|
|
54
40
|
checkpoint_deploy_config, remote_provider, project_id, job_id
|
|
55
41
|
)
|
|
56
|
-
|
|
57
|
-
|
|
42
|
+
|
|
43
|
+
request_data = _build_inference_template_request(
|
|
44
|
+
checkpoint_deploy_config, remote_provider
|
|
58
45
|
)
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
46
|
+
|
|
47
|
+
# Call the GraphQL mutation to create model version from inference template
|
|
48
|
+
try:
|
|
49
|
+
result = remote_provider.api.create_model_version_from_inference_template(
|
|
50
|
+
request_data
|
|
51
|
+
)
|
|
52
|
+
|
|
53
|
+
if result and result.get("model_version"):
|
|
54
|
+
console.print(
|
|
55
|
+
f"Successfully created model version: {result['model_version']['name']}",
|
|
56
|
+
style="green",
|
|
57
|
+
)
|
|
58
|
+
console.print(
|
|
59
|
+
f"Model version ID: {result['model_version']['id']}", style="yellow"
|
|
60
|
+
)
|
|
61
|
+
else:
|
|
62
|
+
console.print(
|
|
63
|
+
"Warning: Unexpected response format from server", style="yellow"
|
|
64
|
+
)
|
|
65
|
+
console.print(f"Response: {result}", style="yellow")
|
|
66
|
+
|
|
67
|
+
except Exception as e:
|
|
68
|
+
console.print(f"Error creating model version: {e}", style="red")
|
|
69
|
+
raise
|
|
70
|
+
|
|
71
|
+
return checkpoint_deploy_config
|
|
72
|
+
|
|
73
|
+
|
|
74
|
+
def _build_inference_template_request(
|
|
75
|
+
checkpoint_deploy_config: DeployCheckpointsConfigComplete,
|
|
76
|
+
remote_provider: BasetenRemote,
|
|
77
|
+
) -> dict:
|
|
78
|
+
"""
|
|
79
|
+
Build the GraphQL request data structure for createModelVersionFromInferenceTemplate mutation.
|
|
80
|
+
"""
|
|
81
|
+
|
|
82
|
+
# Build weights sources
|
|
83
|
+
weights_sources = []
|
|
84
|
+
for checkpoint in checkpoint_deploy_config.checkpoint_details.checkpoints:
|
|
85
|
+
# Extract checkpoint name from the first path
|
|
86
|
+
checkpoint_name = (
|
|
87
|
+
checkpoint.paths[0].strip("/").split("/")[-1]
|
|
88
|
+
if checkpoint.paths
|
|
89
|
+
else "checkpoint"
|
|
90
|
+
)
|
|
91
|
+
|
|
92
|
+
weights_source = {
|
|
93
|
+
"weight_source_type": "B10_CHECKPOINTING",
|
|
94
|
+
"b10_training_checkpoint_weights_source": {
|
|
95
|
+
"checkpoint": {
|
|
96
|
+
"training_job_id": checkpoint.training_job_id,
|
|
97
|
+
"checkpoint_name": checkpoint_name,
|
|
98
|
+
}
|
|
99
|
+
},
|
|
100
|
+
}
|
|
101
|
+
weights_sources.append(weights_source)
|
|
102
|
+
|
|
103
|
+
# Build environment variables
|
|
104
|
+
environment_variables = []
|
|
105
|
+
for name, value in checkpoint_deploy_config.runtime.environment_variables.items():
|
|
106
|
+
if isinstance(value, SecretReference):
|
|
107
|
+
env_var = {"name": name, "value": value.name, "is_secret_reference": True}
|
|
108
|
+
else:
|
|
109
|
+
env_var = {"name": name, "value": str(value), "is_secret_reference": False}
|
|
110
|
+
environment_variables.append(env_var)
|
|
111
|
+
|
|
112
|
+
# Build inference stack
|
|
113
|
+
inference_stack = {
|
|
114
|
+
"stack_type": "VLLM",
|
|
115
|
+
"environment_variables": environment_variables,
|
|
116
|
+
}
|
|
117
|
+
|
|
118
|
+
# Get instance type ID from compute spec
|
|
119
|
+
instance_type_id = _get_instance_type_id(
|
|
120
|
+
checkpoint_deploy_config.compute, remote_provider
|
|
67
121
|
)
|
|
68
122
|
|
|
123
|
+
# Build the complete request
|
|
124
|
+
request_data = {
|
|
125
|
+
"metadata": {"oracle_name": checkpoint_deploy_config.model_name},
|
|
126
|
+
"weights_sources": weights_sources,
|
|
127
|
+
"inference_stack": inference_stack,
|
|
128
|
+
"instance_type_id": instance_type_id,
|
|
129
|
+
}
|
|
130
|
+
|
|
131
|
+
return request_data
|
|
132
|
+
|
|
133
|
+
|
|
134
|
+
def _get_instance_type_id(compute: Compute, remote_provider: BasetenRemote) -> str:
|
|
135
|
+
"""
|
|
136
|
+
Get the instance type ID based on the compute specification.
|
|
137
|
+
Fetches available instance types from the API and maps compute specs to instance type IDs.
|
|
138
|
+
Only considers single-node instances (node_count == 1).
|
|
139
|
+
"""
|
|
140
|
+
# step 1: fetch the instance types from the API
|
|
141
|
+
instance_types = remote_provider.api.get_instance_types()
|
|
142
|
+
# step 2: sort them into two different dictionaries, excluding multi-node instances:
|
|
143
|
+
cpu_instance_types = {
|
|
144
|
+
it.id: it for it in instance_types if it.gpu_count == 0 and it.node_count == 1
|
|
145
|
+
}
|
|
146
|
+
gpu_instance_types = {
|
|
147
|
+
it.id: it for it in instance_types if it.gpu_count > 0 and it.node_count == 1
|
|
148
|
+
}
|
|
149
|
+
# step 3: if compute is cpu, find the smallest such cpu that matches the compute request
|
|
150
|
+
if not compute.accelerator or compute.accelerator.accelerator is None:
|
|
151
|
+
compute_as_truss_config = compute.to_truss_config()
|
|
152
|
+
smallest_cpu_instance_type = None
|
|
153
|
+
for it in cpu_instance_types.values():
|
|
154
|
+
if (
|
|
155
|
+
it.millicpu_limit / 1000 >= compute.cpu_count
|
|
156
|
+
and it.memory_limit >= compute_as_truss_config.memory_in_bytes
|
|
157
|
+
):
|
|
158
|
+
if (
|
|
159
|
+
smallest_cpu_instance_type is None
|
|
160
|
+
or it.millicpu_limit < smallest_cpu_instance_type.millicpu_limit
|
|
161
|
+
):
|
|
162
|
+
smallest_cpu_instance_type = it
|
|
163
|
+
if not smallest_cpu_instance_type:
|
|
164
|
+
raise ValueError(
|
|
165
|
+
f"Unable to find single-node instance type for {compute.cpu_count} CPU and {compute.memory} memory. Reach out to Baseten for support if this persists."
|
|
166
|
+
)
|
|
167
|
+
return smallest_cpu_instance_type.id
|
|
168
|
+
# step 4: if compute is gpu, find the smallest such gpu by instance type
|
|
169
|
+
else:
|
|
170
|
+
assert compute.accelerator.accelerator is not None
|
|
171
|
+
compute_as_truss_config = compute.to_truss_config()
|
|
172
|
+
smallest_gpu_instance_type = None
|
|
173
|
+
for it in gpu_instance_types.values():
|
|
174
|
+
if (
|
|
175
|
+
it.gpu_type == compute.accelerator.accelerator.value
|
|
176
|
+
and it.gpu_count >= compute.accelerator.count
|
|
177
|
+
):
|
|
178
|
+
if (
|
|
179
|
+
smallest_gpu_instance_type is None
|
|
180
|
+
or it.gpu_count < smallest_gpu_instance_type.gpu_count
|
|
181
|
+
):
|
|
182
|
+
smallest_gpu_instance_type = it
|
|
183
|
+
if not smallest_gpu_instance_type:
|
|
184
|
+
raise ValueError(
|
|
185
|
+
f"Unable to find single-node instance type for {compute.accelerator}:{compute.accelerator.count}. Reach out to Baseten for support if this persists."
|
|
186
|
+
)
|
|
187
|
+
return smallest_gpu_instance_type.id
|
|
188
|
+
|
|
69
189
|
|
|
70
190
|
def _validate_base_model_id(
|
|
71
191
|
base_model_id: Optional[str], model_weight_format: ModelWeightsFormat
|
|
@@ -93,18 +213,12 @@ def _get_model_name(
|
|
|
93
213
|
else ""
|
|
94
214
|
)
|
|
95
215
|
|
|
96
|
-
|
|
216
|
+
return inquirer.text(
|
|
97
217
|
message=f"Enter the model name for your {model_weight_format.value} model.",
|
|
98
218
|
validate=lambda s: s and s.strip(),
|
|
99
219
|
default=default,
|
|
100
220
|
).execute()
|
|
101
221
|
|
|
102
|
-
if model_weight_format == ModelWeightsFormat.FULL:
|
|
103
|
-
model_name += "-vLLM-Full"
|
|
104
|
-
elif model_weight_format == ModelWeightsFormat.LORA:
|
|
105
|
-
model_name += "-vLLM-LORA"
|
|
106
|
-
return model_name
|
|
107
|
-
|
|
108
222
|
|
|
109
223
|
def _hydrate_deploy_config(
|
|
110
224
|
deploy_config: DeployCheckpointsConfig,
|
|
@@ -123,53 +237,18 @@ def _hydrate_deploy_config(
|
|
|
123
237
|
else:
|
|
124
238
|
model_name = _get_model_name(model_weight_format, base_model_id)
|
|
125
239
|
|
|
126
|
-
compute = _ensure_compute_spec(deploy_config.compute)
|
|
240
|
+
compute = _ensure_compute_spec(deploy_config.compute, remote_provider)
|
|
127
241
|
|
|
128
242
|
runtime = _ensure_runtime_config(deploy_config.runtime)
|
|
129
|
-
deployment_name = _ensure_deployment_name(
|
|
130
|
-
deploy_config.deployment_name, checkpoint_details.checkpoints
|
|
131
|
-
)
|
|
132
243
|
|
|
133
244
|
return DeployCheckpointsConfigComplete(
|
|
134
245
|
checkpoint_details=checkpoint_details,
|
|
135
246
|
model_name=model_name,
|
|
136
|
-
deployment_name=deployment_name,
|
|
137
247
|
runtime=runtime,
|
|
138
248
|
compute=compute,
|
|
139
|
-
model_weight_format=model_weight_format.to_truss_config(), # type: ignore[attr-defined]
|
|
140
249
|
)
|
|
141
250
|
|
|
142
251
|
|
|
143
|
-
def _ensure_deployment_name(
|
|
144
|
-
deploy_config_deployment_name: Optional[str], checkpoints: List[Checkpoint]
|
|
145
|
-
) -> str:
|
|
146
|
-
if deploy_config_deployment_name:
|
|
147
|
-
return deploy_config_deployment_name
|
|
148
|
-
|
|
149
|
-
default_deployment_name = "checkpoint"
|
|
150
|
-
|
|
151
|
-
if checkpoints and checkpoints[0].paths:
|
|
152
|
-
first_checkpoint_name = checkpoints[0].paths[0].strip("/").split("/")[-1]
|
|
153
|
-
|
|
154
|
-
if ALLOWED_DEPLOYMENT_NAMES.match(first_checkpoint_name):
|
|
155
|
-
# Allow autoincrementing if the checkpoint matches both regexes
|
|
156
|
-
if (
|
|
157
|
-
CHECKPOINT_PATTERN.match(first_checkpoint_name)
|
|
158
|
-
and len(checkpoints) == 1
|
|
159
|
-
):
|
|
160
|
-
return first_checkpoint_name
|
|
161
|
-
|
|
162
|
-
# If no valid autoincrementing checkpoint name is found, prompt the user
|
|
163
|
-
deployment_name = inquirer.text(
|
|
164
|
-
message="Enter the deployment name.", default=default_deployment_name
|
|
165
|
-
).execute()
|
|
166
|
-
|
|
167
|
-
if not deployment_name:
|
|
168
|
-
raise click.UsageError("Deployment name is required.")
|
|
169
|
-
|
|
170
|
-
return deployment_name
|
|
171
|
-
|
|
172
|
-
|
|
173
252
|
def hydrate_checkpoint(
|
|
174
253
|
job_id: str, checkpoint_id: str, checkpoint: dict, checkpoint_type: str
|
|
175
254
|
) -> Checkpoint:
|
|
@@ -190,26 +269,6 @@ def hydrate_checkpoint(
|
|
|
190
269
|
)
|
|
191
270
|
|
|
192
271
|
|
|
193
|
-
def _render_truss_config_for_checkpoint_deployment(
|
|
194
|
-
checkpoint_deploy: DeployCheckpointsConfigComplete,
|
|
195
|
-
) -> truss_config.TrussConfig:
|
|
196
|
-
"""
|
|
197
|
-
Render truss config for checkpoint deployment.
|
|
198
|
-
Currently supports LoRA checkpoints via vLLM, but can be extended for other formats.
|
|
199
|
-
"""
|
|
200
|
-
# Delegate to specific rendering function based on model weight format
|
|
201
|
-
if checkpoint_deploy.model_weight_format == ModelWeightsFormat.LORA:
|
|
202
|
-
return render_vllm_lora_truss_config(checkpoint_deploy)
|
|
203
|
-
elif checkpoint_deploy.model_weight_format == ModelWeightsFormat.FULL:
|
|
204
|
-
return render_vllm_full_truss_config(checkpoint_deploy)
|
|
205
|
-
elif checkpoint_deploy.model_weight_format == ModelWeightsFormat.WHISPER:
|
|
206
|
-
return render_vllm_whisper_truss_config(checkpoint_deploy)
|
|
207
|
-
else:
|
|
208
|
-
raise ValueError(
|
|
209
|
-
f"Unsupported model weight format: {checkpoint_deploy.model_weight_format}. Please upgrade to the latest Truss version to access the latest supported formats. Contact Baseten if you would like us to support additional formats."
|
|
210
|
-
)
|
|
211
|
-
|
|
212
|
-
|
|
213
272
|
def _ensure_checkpoint_details(
|
|
214
273
|
remote_provider: BasetenRemote,
|
|
215
274
|
checkpoint_details: Optional[CheckpointList],
|
|
@@ -309,31 +368,77 @@ def _select_multiple_checkpoints(checkpoint_id_options: List[str]) -> List[str]:
|
|
|
309
368
|
return checkpoint_ids
|
|
310
369
|
|
|
311
370
|
|
|
312
|
-
def _ensure_compute_spec(
|
|
371
|
+
def _ensure_compute_spec(
|
|
372
|
+
compute: Optional[Compute], remote_provider: BasetenRemote
|
|
373
|
+
) -> Compute:
|
|
313
374
|
if not compute:
|
|
314
375
|
compute = Compute(cpu_count=0, memory="0Mi")
|
|
315
|
-
compute
|
|
376
|
+
compute = _get_accelerator_if_specified(compute, remote_provider)
|
|
316
377
|
return compute
|
|
317
378
|
|
|
318
379
|
|
|
319
380
|
def _get_accelerator_if_specified(
|
|
320
|
-
user_input: Optional[
|
|
321
|
-
) ->
|
|
322
|
-
if user_input:
|
|
381
|
+
user_input: Optional[Compute], remote_provider: BasetenRemote
|
|
382
|
+
) -> Compute:
|
|
383
|
+
if user_input and user_input.accelerator:
|
|
323
384
|
return user_input
|
|
385
|
+
|
|
386
|
+
# Fetch available instance types to get valid GPU options
|
|
387
|
+
instance_types = remote_provider.api.get_instance_types()
|
|
388
|
+
|
|
389
|
+
# Extract unique accelerator types from instance types
|
|
390
|
+
accelerator_options = set()
|
|
391
|
+
for it in instance_types:
|
|
392
|
+
if it.gpu_type and it.gpu_count > 0:
|
|
393
|
+
accelerator_options.add(it.gpu_type)
|
|
394
|
+
|
|
395
|
+
# Convert to sorted list and add CPU option
|
|
396
|
+
choices = sorted(list(accelerator_options)) + [None]
|
|
397
|
+
|
|
398
|
+
if not choices or choices == [None]:
|
|
399
|
+
console.print("No GPU instance types available, using CPU", style="yellow")
|
|
400
|
+
return Compute(cpu_count=0, memory="0Mi", accelerator=None)
|
|
401
|
+
|
|
324
402
|
# prompt user for accelerator
|
|
325
403
|
gpu_type = inquirer.select(
|
|
326
404
|
message="Select the GPU type to use for deployment. Select None for CPU.",
|
|
327
|
-
choices=
|
|
405
|
+
choices=choices,
|
|
328
406
|
).execute()
|
|
407
|
+
|
|
329
408
|
if gpu_type is None:
|
|
330
|
-
return None
|
|
331
|
-
|
|
332
|
-
|
|
333
|
-
|
|
334
|
-
|
|
335
|
-
|
|
336
|
-
|
|
409
|
+
return Compute(cpu_count=0, memory="0Mi", accelerator=None)
|
|
410
|
+
|
|
411
|
+
# Get available counts for the selected GPU type
|
|
412
|
+
available_counts = set()
|
|
413
|
+
for it in instance_types:
|
|
414
|
+
if it.gpu_type == gpu_type and it.gpu_count > 0:
|
|
415
|
+
available_counts.add(it.gpu_count)
|
|
416
|
+
if not available_counts:
|
|
417
|
+
raise ValueError(
|
|
418
|
+
f"No available counts for {gpu_type}. Reach out to Baseten for support if this persists."
|
|
419
|
+
)
|
|
420
|
+
|
|
421
|
+
if available_counts:
|
|
422
|
+
count_choices = sorted(list(available_counts))
|
|
423
|
+
count = inquirer.select(
|
|
424
|
+
message=f"Select the number of {gpu_type} GPUs to use for deployment.",
|
|
425
|
+
choices=count_choices,
|
|
426
|
+
default=str(count_choices[0]),
|
|
427
|
+
).execute()
|
|
428
|
+
else:
|
|
429
|
+
count = inquirer.text(
|
|
430
|
+
message=f"Enter the number of {gpu_type} accelerators to use for deployment.",
|
|
431
|
+
default="1",
|
|
432
|
+
validate=lambda x: x.isdigit() and int(x) > 0 and int(x) <= 8,
|
|
433
|
+
).execute()
|
|
434
|
+
|
|
435
|
+
return Compute(
|
|
436
|
+
cpu_count=0,
|
|
437
|
+
memory="0Mi",
|
|
438
|
+
accelerator=truss_config.AcceleratorSpec(
|
|
439
|
+
accelerator=gpu_type.replace("-", "_"), count=int(count)
|
|
440
|
+
),
|
|
441
|
+
)
|
|
337
442
|
|
|
338
443
|
|
|
339
444
|
def _get_base_model_id(user_input: Optional[str], checkpoint: dict) -> Optional[str]:
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
# This file is kept for potential future use but currently contains no active code
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
from pathlib import Path
|
|
2
|
+
|
|
3
|
+
from truss_train.definitions import FullCheckpoint
|
|
4
|
+
|
|
5
|
+
|
|
6
|
+
def hydrate_full_checkpoint(
|
|
7
|
+
job_id: str, checkpoint_id: str, checkpoint: dict
|
|
8
|
+
) -> FullCheckpoint:
|
|
9
|
+
"""Create a Checkpoint object for full model weights."""
|
|
10
|
+
# NOTE: Slash at the end is important since it means the checkpoint is a directory
|
|
11
|
+
paths = [f"rank-0/{checkpoint_id}/"]
|
|
12
|
+
return FullCheckpoint(training_job_id=job_id, paths=paths)
|
|
13
|
+
|
|
14
|
+
|
|
15
|
+
def build_full_checkpoint_string(truss_deploy_config) -> str:
|
|
16
|
+
"""Build checkpoint string from artifact references for full checkpoints.
|
|
17
|
+
|
|
18
|
+
Args:
|
|
19
|
+
truss_deploy_config: The truss deploy configuration containing training checkpoints.
|
|
20
|
+
|
|
21
|
+
Returns:
|
|
22
|
+
A space-separated string of checkpoint paths.
|
|
23
|
+
"""
|
|
24
|
+
checkpoint_parts = []
|
|
25
|
+
for (
|
|
26
|
+
truss_checkpoint
|
|
27
|
+
) in truss_deploy_config.training_checkpoints.artifact_references: # type: ignore
|
|
28
|
+
ckpt_path = Path(
|
|
29
|
+
truss_deploy_config.training_checkpoints.download_folder, # type: ignore
|
|
30
|
+
truss_checkpoint.training_job_id,
|
|
31
|
+
truss_checkpoint.paths[0],
|
|
32
|
+
)
|
|
33
|
+
checkpoint_parts.append(str(ckpt_path))
|
|
34
|
+
|
|
35
|
+
return " ".join(checkpoint_parts)
|