truss 0.10.0rc1__py3-none-any.whl → 0.60.0__py3-none-any.whl
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/__init__.py +10 -3
- truss/api/__init__.py +123 -0
- truss/api/definitions.py +51 -0
- truss/base/constants.py +116 -0
- truss/base/custom_types.py +29 -0
- truss/{errors.py → base/errors.py} +4 -0
- truss/base/trt_llm_config.py +310 -0
- truss/{truss_config.py → base/truss_config.py} +344 -31
- truss/{truss_spec.py → base/truss_spec.py} +20 -6
- truss/{validation.py → base/validation.py} +60 -11
- truss/cli/cli.py +841 -88
- truss/{remote → cli}/remote_cli.py +2 -7
- truss/contexts/docker_build_setup.py +67 -0
- truss/contexts/image_builder/cache_warmer.py +2 -8
- truss/contexts/image_builder/image_builder.py +1 -1
- truss/contexts/image_builder/serving_image_builder.py +292 -46
- truss/contexts/image_builder/util.py +1 -3
- truss/contexts/local_loader/docker_build_emulator.py +58 -0
- truss/contexts/local_loader/load_model_local.py +2 -2
- truss/contexts/local_loader/truss_module_loader.py +1 -1
- truss/contexts/local_loader/utils.py +1 -1
- truss/local/local_config.py +2 -6
- truss/local/local_config_handler.py +20 -5
- truss/patch/__init__.py +1 -0
- truss/patch/hash.py +4 -70
- truss/patch/signature.py +4 -16
- truss/patch/truss_dir_patch_applier.py +3 -78
- truss/remote/baseten/api.py +308 -23
- truss/remote/baseten/auth.py +3 -3
- truss/remote/baseten/core.py +257 -50
- truss/remote/baseten/custom_types.py +44 -0
- truss/remote/baseten/error.py +4 -0
- truss/remote/baseten/remote.py +369 -118
- truss/remote/baseten/service.py +118 -11
- truss/remote/baseten/utils/status.py +29 -0
- truss/remote/baseten/utils/tar.py +34 -22
- truss/remote/baseten/utils/transfer.py +36 -23
- truss/remote/remote_factory.py +14 -5
- truss/remote/truss_remote.py +72 -45
- truss/templates/base.Dockerfile.jinja +18 -16
- truss/templates/cache.Dockerfile.jinja +3 -3
- truss/{server → templates/control}/control/application.py +14 -35
- truss/{server → templates/control}/control/endpoints.py +39 -9
- truss/{server/control/patch/types.py → templates/control/control/helpers/custom_types.py} +13 -52
- truss/{server → templates/control}/control/helpers/inference_server_controller.py +4 -8
- truss/{server → templates/control}/control/helpers/inference_server_process_controller.py +2 -4
- truss/{server → templates/control}/control/helpers/inference_server_starter.py +5 -10
- truss/{server/control → templates/control/control/helpers}/truss_patch/model_code_patch_applier.py +8 -6
- truss/{server/control/patch → templates/control/control/helpers/truss_patch}/model_container_patch_applier.py +18 -26
- truss/templates/control/control/helpers/truss_patch/requirement_name_identifier.py +66 -0
- truss/{server → templates/control}/control/server.py +11 -6
- truss/templates/control/requirements.txt +9 -0
- truss/templates/custom_python_dx/my_model.py +28 -0
- truss/templates/docker_server/proxy.conf.jinja +42 -0
- truss/templates/docker_server/supervisord.conf.jinja +27 -0
- truss/templates/docker_server_requirements.txt +1 -0
- truss/templates/server/common/errors.py +231 -0
- truss/{server → templates/server}/common/patches/whisper/patch.py +1 -0
- truss/{server/common/patches/__init__.py → templates/server/common/patches.py} +1 -3
- truss/{server → templates/server}/common/retry.py +1 -0
- truss/{server → templates/server}/common/schema.py +11 -9
- truss/templates/server/common/tracing.py +157 -0
- truss/templates/server/main.py +9 -0
- truss/templates/server/model_wrapper.py +961 -0
- truss/templates/server/requirements.txt +21 -0
- truss/templates/server/truss_server.py +447 -0
- truss/templates/server.Dockerfile.jinja +62 -14
- truss/templates/shared/dynamic_config_resolver.py +28 -0
- truss/templates/shared/lazy_data_resolver.py +164 -0
- truss/templates/shared/log_config.py +125 -0
- truss/{server → templates}/shared/secrets_resolver.py +1 -2
- truss/{server → templates}/shared/serialization.py +31 -9
- truss/{server → templates}/shared/util.py +3 -13
- truss/templates/trtllm-audio/model/model.py +49 -0
- truss/templates/trtllm-audio/packages/sigint_patch.py +14 -0
- truss/templates/trtllm-audio/packages/whisper_trt/__init__.py +215 -0
- truss/templates/trtllm-audio/packages/whisper_trt/assets.py +25 -0
- truss/templates/trtllm-audio/packages/whisper_trt/batching.py +52 -0
- truss/templates/trtllm-audio/packages/whisper_trt/custom_types.py +26 -0
- truss/templates/trtllm-audio/packages/whisper_trt/modeling.py +184 -0
- truss/templates/trtllm-audio/packages/whisper_trt/tokenizer.py +185 -0
- truss/templates/trtllm-audio/packages/whisper_trt/utils.py +245 -0
- truss/templates/trtllm-briton/src/extension.py +64 -0
- truss/tests/conftest.py +302 -94
- truss/tests/contexts/image_builder/test_serving_image_builder.py +74 -31
- truss/tests/contexts/local_loader/test_load_local.py +2 -2
- truss/tests/contexts/local_loader/test_truss_module_finder.py +1 -1
- truss/tests/patch/test_calc_patch.py +439 -127
- truss/tests/patch/test_dir_signature.py +3 -12
- truss/tests/patch/test_hash.py +1 -1
- truss/tests/patch/test_signature.py +1 -1
- truss/tests/patch/test_truss_dir_patch_applier.py +23 -11
- truss/tests/patch/test_types.py +2 -2
- truss/tests/remote/baseten/test_api.py +153 -58
- truss/tests/remote/baseten/test_auth.py +2 -1
- truss/tests/remote/baseten/test_core.py +160 -12
- truss/tests/remote/baseten/test_remote.py +489 -77
- truss/tests/remote/baseten/test_service.py +55 -0
- truss/tests/remote/test_remote_factory.py +16 -18
- truss/tests/remote/test_truss_remote.py +26 -17
- truss/tests/templates/control/control/helpers/test_context_managers.py +11 -0
- truss/tests/templates/control/control/helpers/test_model_container_patch_applier.py +184 -0
- truss/tests/templates/control/control/helpers/test_requirement_name_identifier.py +89 -0
- truss/tests/{server → templates/control}/control/test_server.py +79 -24
- truss/tests/{server → templates/control}/control/test_server_integration.py +24 -16
- truss/tests/templates/core/server/test_dynamic_config_resolver.py +108 -0
- truss/tests/templates/core/server/test_lazy_data_resolver.py +329 -0
- truss/tests/templates/core/server/test_lazy_data_resolver_v2.py +79 -0
- truss/tests/{server → templates}/core/server/test_secrets_resolver.py +1 -1
- truss/tests/{server → templates/server}/common/test_retry.py +3 -3
- truss/tests/templates/server/test_model_wrapper.py +248 -0
- truss/tests/{server → templates/server}/test_schema.py +3 -5
- truss/tests/{server/core/server/common → templates/server}/test_truss_server.py +8 -5
- truss/tests/test_build.py +9 -52
- truss/tests/test_config.py +336 -77
- truss/tests/test_context_builder_image.py +3 -11
- truss/tests/test_control_truss_patching.py +7 -12
- truss/tests/test_custom_server.py +38 -0
- truss/tests/test_data/context_builder_image_test/test.py +3 -0
- truss/tests/test_data/happy.ipynb +56 -0
- truss/tests/test_data/model_load_failure_test/config.yaml +2 -0
- truss/tests/test_data/model_load_failure_test/model/__init__.py +0 -0
- truss/tests/test_data/patch_ping_test_server/__init__.py +0 -0
- truss/{test_data → tests/test_data}/patch_ping_test_server/app.py +3 -9
- truss/{test_data → tests/test_data}/server.Dockerfile +20 -21
- truss/tests/test_data/server_conformance_test_truss/__init__.py +0 -0
- truss/tests/test_data/server_conformance_test_truss/model/__init__.py +0 -0
- truss/{test_data → tests/test_data}/server_conformance_test_truss/model/model.py +1 -3
- truss/tests/test_data/test_async_truss/__init__.py +0 -0
- truss/tests/test_data/test_async_truss/model/__init__.py +0 -0
- truss/tests/test_data/test_basic_truss/__init__.py +0 -0
- truss/tests/test_data/test_basic_truss/config.yaml +16 -0
- truss/tests/test_data/test_basic_truss/model/__init__.py +0 -0
- truss/tests/test_data/test_build_commands/__init__.py +0 -0
- truss/tests/test_data/test_build_commands/config.yaml +13 -0
- truss/tests/test_data/test_build_commands/model/__init__.py +0 -0
- truss/{test_data/test_streaming_async_generator_truss → tests/test_data/test_build_commands}/model/model.py +2 -3
- truss/tests/test_data/test_build_commands_failure/__init__.py +0 -0
- truss/tests/test_data/test_build_commands_failure/config.yaml +14 -0
- truss/tests/test_data/test_build_commands_failure/model/__init__.py +0 -0
- truss/tests/test_data/test_build_commands_failure/model/model.py +17 -0
- truss/tests/test_data/test_concurrency_truss/__init__.py +0 -0
- truss/tests/test_data/test_concurrency_truss/config.yaml +4 -0
- truss/tests/test_data/test_concurrency_truss/model/__init__.py +0 -0
- truss/tests/test_data/test_custom_server_truss/__init__.py +0 -0
- truss/tests/test_data/test_custom_server_truss/config.yaml +20 -0
- truss/tests/test_data/test_custom_server_truss/test_docker_image/Dockerfile +17 -0
- truss/tests/test_data/test_custom_server_truss/test_docker_image/README.md +10 -0
- truss/tests/test_data/test_custom_server_truss/test_docker_image/VERSION +1 -0
- truss/tests/test_data/test_custom_server_truss/test_docker_image/__init__.py +0 -0
- truss/tests/test_data/test_custom_server_truss/test_docker_image/app.py +19 -0
- truss/tests/test_data/test_custom_server_truss/test_docker_image/build_upload_new_image.sh +6 -0
- truss/tests/test_data/test_openai/__init__.py +0 -0
- truss/{test_data/test_basic_truss → tests/test_data/test_openai}/config.yaml +1 -2
- truss/tests/test_data/test_openai/model/__init__.py +0 -0
- truss/tests/test_data/test_openai/model/model.py +15 -0
- truss/tests/test_data/test_pyantic_v1/__init__.py +0 -0
- truss/tests/test_data/test_pyantic_v1/model/__init__.py +0 -0
- truss/tests/test_data/test_pyantic_v1/model/model.py +28 -0
- truss/tests/test_data/test_pyantic_v1/requirements.txt +1 -0
- truss/tests/test_data/test_pyantic_v2/__init__.py +0 -0
- truss/tests/test_data/test_pyantic_v2/config.yaml +13 -0
- truss/tests/test_data/test_pyantic_v2/model/__init__.py +0 -0
- truss/tests/test_data/test_pyantic_v2/model/model.py +30 -0
- truss/tests/test_data/test_pyantic_v2/requirements.txt +1 -0
- truss/tests/test_data/test_requirements_file_truss/__init__.py +0 -0
- truss/tests/test_data/test_requirements_file_truss/config.yaml +13 -0
- truss/tests/test_data/test_requirements_file_truss/model/__init__.py +0 -0
- truss/{test_data → tests/test_data}/test_requirements_file_truss/model/model.py +1 -0
- truss/tests/test_data/test_streaming_async_generator_truss/__init__.py +0 -0
- truss/tests/test_data/test_streaming_async_generator_truss/config.yaml +4 -0
- truss/tests/test_data/test_streaming_async_generator_truss/model/__init__.py +0 -0
- truss/tests/test_data/test_streaming_async_generator_truss/model/model.py +7 -0
- truss/tests/test_data/test_streaming_read_timeout/__init__.py +0 -0
- truss/tests/test_data/test_streaming_read_timeout/model/__init__.py +0 -0
- truss/tests/test_data/test_streaming_truss/__init__.py +0 -0
- truss/tests/test_data/test_streaming_truss/config.yaml +4 -0
- truss/tests/test_data/test_streaming_truss/model/__init__.py +0 -0
- truss/tests/test_data/test_streaming_truss_with_error/__init__.py +0 -0
- truss/tests/test_data/test_streaming_truss_with_error/model/__init__.py +0 -0
- truss/{test_data → tests/test_data}/test_streaming_truss_with_error/model/model.py +3 -11
- truss/tests/test_data/test_streaming_truss_with_error/packages/__init__.py +0 -0
- truss/tests/test_data/test_streaming_truss_with_error/packages/helpers_1.py +5 -0
- truss/tests/test_data/test_streaming_truss_with_error/packages/helpers_2.py +2 -0
- truss/tests/test_data/test_streaming_truss_with_tracing/__init__.py +0 -0
- truss/tests/test_data/test_streaming_truss_with_tracing/config.yaml +43 -0
- truss/tests/test_data/test_streaming_truss_with_tracing/model/__init__.py +0 -0
- truss/tests/test_data/test_streaming_truss_with_tracing/model/model.py +65 -0
- truss/tests/test_data/test_trt_llm_truss/__init__.py +0 -0
- truss/tests/test_data/test_trt_llm_truss/config.yaml +15 -0
- truss/tests/test_data/test_trt_llm_truss/model/__init__.py +0 -0
- truss/tests/test_data/test_trt_llm_truss/model/model.py +15 -0
- truss/tests/test_data/test_truss/__init__.py +0 -0
- truss/tests/test_data/test_truss/config.yaml +4 -0
- truss/tests/test_data/test_truss/model/__init__.py +0 -0
- truss/tests/test_data/test_truss/model/dummy +0 -0
- truss/tests/test_data/test_truss/packages/__init__.py +0 -0
- truss/tests/test_data/test_truss/packages/test_package/__init__.py +0 -0
- truss/tests/test_data/test_truss_server_caching_truss/__init__.py +0 -0
- truss/tests/test_data/test_truss_server_caching_truss/model/__init__.py +0 -0
- truss/tests/test_data/test_truss_with_error/__init__.py +0 -0
- truss/tests/test_data/test_truss_with_error/config.yaml +4 -0
- truss/tests/test_data/test_truss_with_error/model/__init__.py +0 -0
- truss/tests/test_data/test_truss_with_error/model/model.py +8 -0
- truss/tests/test_data/test_truss_with_error/packages/__init__.py +0 -0
- truss/tests/test_data/test_truss_with_error/packages/helpers_1.py +5 -0
- truss/tests/test_data/test_truss_with_error/packages/helpers_2.py +2 -0
- truss/tests/test_docker.py +2 -1
- truss/tests/test_model_inference.py +1340 -292
- truss/tests/test_model_schema.py +33 -26
- truss/tests/test_testing_utilities_for_other_tests.py +50 -5
- truss/tests/test_truss_gatherer.py +3 -5
- truss/tests/test_truss_handle.py +62 -59
- truss/tests/test_util.py +2 -1
- truss/tests/test_validation.py +15 -13
- truss/tests/trt_llm/test_trt_llm_config.py +41 -0
- truss/tests/trt_llm/test_validation.py +91 -0
- truss/tests/util/test_config_checks.py +40 -0
- truss/tests/util/test_env_vars.py +14 -0
- truss/tests/util/test_path.py +10 -23
- truss/trt_llm/config_checks.py +43 -0
- truss/trt_llm/validation.py +42 -0
- truss/truss_handle/__init__.py +0 -0
- truss/truss_handle/build.py +122 -0
- truss/{decorators.py → truss_handle/decorators.py} +1 -1
- truss/truss_handle/patch/__init__.py +0 -0
- truss/{patch → truss_handle/patch}/calc_patch.py +146 -92
- truss/{types.py → truss_handle/patch/custom_types.py} +35 -27
- truss/{patch → truss_handle/patch}/dir_signature.py +1 -1
- truss/truss_handle/patch/hash.py +71 -0
- truss/{patch → truss_handle/patch}/local_truss_patch_applier.py +6 -4
- truss/truss_handle/patch/signature.py +22 -0
- truss/truss_handle/patch/truss_dir_patch_applier.py +87 -0
- truss/{readme_generator.py → truss_handle/readme_generator.py} +3 -2
- truss/{truss_gatherer.py → truss_handle/truss_gatherer.py} +3 -2
- truss/{truss_handle.py → truss_handle/truss_handle.py} +174 -78
- truss/util/.truss_ignore +3 -0
- truss/{docker.py → util/docker.py} +6 -2
- truss/util/download.py +6 -15
- truss/util/env_vars.py +41 -0
- truss/util/log_utils.py +52 -0
- truss/util/path.py +20 -20
- truss/util/requirements.py +11 -0
- {truss-0.10.0rc1.dist-info → truss-0.60.0.dist-info}/METADATA +18 -16
- truss-0.60.0.dist-info/RECORD +324 -0
- {truss-0.10.0rc1.dist-info → truss-0.60.0.dist-info}/WHEEL +1 -1
- truss-0.60.0.dist-info/entry_points.txt +4 -0
- truss_chains/__init__.py +71 -0
- truss_chains/definitions.py +756 -0
- truss_chains/deployment/__init__.py +0 -0
- truss_chains/deployment/code_gen.py +816 -0
- truss_chains/deployment/deployment_client.py +871 -0
- truss_chains/framework.py +1480 -0
- truss_chains/public_api.py +231 -0
- truss_chains/py.typed +0 -0
- truss_chains/pydantic_numpy.py +131 -0
- truss_chains/reference_code/reference_chainlet.py +34 -0
- truss_chains/reference_code/reference_model.py +10 -0
- truss_chains/remote_chainlet/__init__.py +0 -0
- truss_chains/remote_chainlet/model_skeleton.py +60 -0
- truss_chains/remote_chainlet/stub.py +380 -0
- truss_chains/remote_chainlet/utils.py +332 -0
- truss_chains/streaming.py +378 -0
- truss_chains/utils.py +178 -0
- CODE_OF_CONDUCT.md +0 -131
- CONTRIBUTING.md +0 -48
- README.md +0 -137
- context_builder.Dockerfile +0 -24
- truss/blob/blob_backend.py +0 -10
- truss/blob/blob_backend_registry.py +0 -23
- truss/blob/http_public_blob_backend.py +0 -23
- truss/build/__init__.py +0 -2
- truss/build/build.py +0 -143
- truss/build/configure.py +0 -63
- truss/cli/__init__.py +0 -2
- truss/cli/console.py +0 -5
- truss/cli/create.py +0 -5
- truss/config/trt_llm.py +0 -81
- truss/constants.py +0 -61
- truss/model_inference.py +0 -123
- truss/patch/types.py +0 -30
- truss/pytest.ini +0 -7
- truss/server/common/errors.py +0 -100
- truss/server/common/termination_handler_middleware.py +0 -64
- truss/server/common/truss_server.py +0 -389
- truss/server/control/patch/model_code_patch_applier.py +0 -46
- truss/server/control/patch/requirement_name_identifier.py +0 -17
- truss/server/inference_server.py +0 -29
- truss/server/model_wrapper.py +0 -434
- truss/server/shared/logging.py +0 -81
- truss/templates/trtllm/model/model.py +0 -97
- truss/templates/trtllm/packages/build_engine_utils.py +0 -34
- truss/templates/trtllm/packages/constants.py +0 -11
- truss/templates/trtllm/packages/schema.py +0 -216
- truss/templates/trtllm/packages/tensorrt_llm_model_repository/ensemble/config.pbtxt +0 -246
- truss/templates/trtllm/packages/tensorrt_llm_model_repository/postprocessing/1/model.py +0 -181
- truss/templates/trtllm/packages/tensorrt_llm_model_repository/postprocessing/config.pbtxt +0 -64
- truss/templates/trtllm/packages/tensorrt_llm_model_repository/preprocessing/1/model.py +0 -260
- truss/templates/trtllm/packages/tensorrt_llm_model_repository/preprocessing/config.pbtxt +0 -99
- truss/templates/trtllm/packages/tensorrt_llm_model_repository/tensorrt_llm/config.pbtxt +0 -208
- truss/templates/trtllm/packages/triton_client.py +0 -150
- truss/templates/trtllm/packages/utils.py +0 -43
- truss/test_data/context_builder_image_test/test.py +0 -4
- truss/test_data/happy.ipynb +0 -54
- truss/test_data/model_load_failure_test/config.yaml +0 -2
- truss/test_data/test_concurrency_truss/config.yaml +0 -2
- truss/test_data/test_streaming_async_generator_truss/config.yaml +0 -2
- truss/test_data/test_streaming_truss/config.yaml +0 -3
- truss/test_data/test_truss/config.yaml +0 -2
- truss/tests/server/common/test_termination_handler_middleware.py +0 -93
- truss/tests/server/control/test_model_container_patch_applier.py +0 -203
- truss/tests/server/core/server/common/test_util.py +0 -19
- truss/tests/server/test_model_wrapper.py +0 -87
- truss/util/data_structures.py +0 -16
- truss-0.10.0rc1.dist-info/RECORD +0 -216
- truss-0.10.0rc1.dist-info/entry_points.txt +0 -3
- truss/{server/shared → base}/__init__.py +0 -0
- truss/{server → templates/control}/control/helpers/context_managers.py +0 -0
- truss/{server/control → templates/control/control/helpers}/errors.py +0 -0
- truss/{server/control/patch → templates/control/control/helpers/truss_patch}/__init__.py +0 -0
- truss/{server/control/patch → templates/control/control/helpers/truss_patch}/system_packages.py +0 -0
- truss/{test_data/annotated_types_truss/model → templates/server}/__init__.py +0 -0
- truss/{server → templates/server}/common/__init__.py +0 -0
- truss/{test_data/gcs_fix/model → templates/shared}/__init__.py +0 -0
- truss/templates/{trtllm → trtllm-briton}/README.md +0 -0
- truss/{test_data/server_conformance_test_truss/model → tests/test_data}/__init__.py +0 -0
- truss/{test_data/test_basic_truss/model → tests/test_data/annotated_types_truss}/__init__.py +0 -0
- truss/{test_data → tests/test_data}/annotated_types_truss/config.yaml +0 -0
- truss/{test_data/test_requirements_file_truss → tests/test_data/annotated_types_truss}/model/__init__.py +0 -0
- truss/{test_data → tests/test_data}/annotated_types_truss/model/model.py +0 -0
- truss/{test_data → tests/test_data}/auto-mpg.data +0 -0
- truss/{test_data → tests/test_data}/context_builder_image_test/Dockerfile +0 -0
- truss/{test_data/test_truss/model → tests/test_data/context_builder_image_test}/__init__.py +0 -0
- truss/{test_data/test_truss_server_caching_truss/model → tests/test_data/gcs_fix}/__init__.py +0 -0
- truss/{test_data → tests/test_data}/gcs_fix/config.yaml +0 -0
- truss/tests/{local → test_data/gcs_fix/model}/__init__.py +0 -0
- truss/{test_data → tests/test_data}/gcs_fix/model/model.py +0 -0
- truss/{test_data/test_truss/model/dummy → tests/test_data/model_load_failure_test/__init__.py} +0 -0
- truss/{test_data → tests/test_data}/model_load_failure_test/model/model.py +0 -0
- truss/{test_data → tests/test_data}/pima-indians-diabetes.csv +0 -0
- truss/{test_data → tests/test_data}/readme_int_example.md +0 -0
- truss/{test_data → tests/test_data}/readme_no_example.md +0 -0
- truss/{test_data → tests/test_data}/readme_str_example.md +0 -0
- truss/{test_data → tests/test_data}/server_conformance_test_truss/config.yaml +0 -0
- truss/{test_data → tests/test_data}/test_async_truss/config.yaml +0 -0
- truss/{test_data → tests/test_data}/test_async_truss/model/model.py +3 -3
- /truss/{test_data → tests/test_data}/test_basic_truss/model/model.py +0 -0
- /truss/{test_data → tests/test_data}/test_concurrency_truss/model/model.py +0 -0
- /truss/{test_data/test_requirements_file_truss → tests/test_data/test_pyantic_v1}/config.yaml +0 -0
- /truss/{test_data → tests/test_data}/test_requirements_file_truss/requirements.txt +0 -0
- /truss/{test_data → tests/test_data}/test_streaming_read_timeout/config.yaml +0 -0
- /truss/{test_data → tests/test_data}/test_streaming_read_timeout/model/model.py +0 -0
- /truss/{test_data → tests/test_data}/test_streaming_truss/model/model.py +0 -0
- /truss/{test_data → tests/test_data}/test_streaming_truss_with_error/config.yaml +0 -0
- /truss/{test_data → tests/test_data}/test_truss/examples.yaml +0 -0
- /truss/{test_data → tests/test_data}/test_truss/model/model.py +0 -0
- /truss/{test_data → tests/test_data}/test_truss/packages/test_package/test.py +0 -0
- /truss/{test_data → tests/test_data}/test_truss_server_caching_truss/config.yaml +0 -0
- /truss/{test_data → tests/test_data}/test_truss_server_caching_truss/model/model.py +0 -0
- /truss/{patch → truss_handle/patch}/constants.py +0 -0
- /truss/{notebook.py → util/notebook.py} +0 -0
- {truss-0.10.0rc1.dist-info → truss-0.60.0.dist-info}/LICENSE +0 -0
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
from unittest.mock import patch
|
|
2
|
+
|
|
3
|
+
import pytest
|
|
4
|
+
from truss.base.constants import TRTLLM_MIN_MEMORY_REQUEST_GI
|
|
5
|
+
from truss.trt_llm.config_checks import (
|
|
6
|
+
is_missing_secrets_for_trt_llm_builder,
|
|
7
|
+
memory_updated_for_trt_llm_builder,
|
|
8
|
+
)
|
|
9
|
+
from truss.truss_handle.truss_handle import TrussHandle
|
|
10
|
+
|
|
11
|
+
|
|
12
|
+
@patch("truss.trt_llm.config_checks._is_model_public")
|
|
13
|
+
@pytest.mark.parametrize(
|
|
14
|
+
"has_secret, is_model_public, expected_result",
|
|
15
|
+
[
|
|
16
|
+
(False, False, True),
|
|
17
|
+
(False, True, False),
|
|
18
|
+
(True, False, False),
|
|
19
|
+
(True, True, False),
|
|
20
|
+
],
|
|
21
|
+
)
|
|
22
|
+
def test_is_missing_secrets_for_trt_llm_builder(
|
|
23
|
+
_is_model_public_mock,
|
|
24
|
+
has_secret,
|
|
25
|
+
is_model_public,
|
|
26
|
+
expected_result,
|
|
27
|
+
custom_model_trt_llm,
|
|
28
|
+
):
|
|
29
|
+
_is_model_public_mock.return_value = is_model_public
|
|
30
|
+
handle = TrussHandle(custom_model_trt_llm)
|
|
31
|
+
if has_secret:
|
|
32
|
+
handle.add_secret("hf_access_token")
|
|
33
|
+
assert is_missing_secrets_for_trt_llm_builder(handle) == expected_result
|
|
34
|
+
|
|
35
|
+
|
|
36
|
+
def test_check_and_update_memory_for_trt_llm_builder(custom_model_trt_llm):
|
|
37
|
+
handle = TrussHandle(custom_model_trt_llm)
|
|
38
|
+
assert memory_updated_for_trt_llm_builder(handle)
|
|
39
|
+
assert handle.spec.memory == f"{TRTLLM_MIN_MEMORY_REQUEST_GI}Gi"
|
|
40
|
+
assert handle.spec.memory_in_bytes == TRTLLM_MIN_MEMORY_REQUEST_GI * 1024**3
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import os
|
|
2
|
+
|
|
3
|
+
from truss.util.env_vars import override_env_vars
|
|
4
|
+
|
|
5
|
+
|
|
6
|
+
def test_override_env_vars():
|
|
7
|
+
os.environ["API_KEY"] = "original_key"
|
|
8
|
+
|
|
9
|
+
with override_env_vars({"API_KEY": "new_key", "DEBUG": "true"}):
|
|
10
|
+
assert os.environ["API_KEY"] == "new_key"
|
|
11
|
+
assert os.environ["DEBUG"] == "true"
|
|
12
|
+
|
|
13
|
+
assert os.environ["API_KEY"] == "original_key"
|
|
14
|
+
assert "DEBUG" not in os.environ
|
truss/tests/util/test_path.py
CHANGED
|
@@ -3,10 +3,10 @@ import tempfile
|
|
|
3
3
|
import time
|
|
4
4
|
from pathlib import Path
|
|
5
5
|
|
|
6
|
-
from truss import load
|
|
7
6
|
from truss.contexts.image_builder.serving_image_builder import (
|
|
8
7
|
ServingImageBuilderContext,
|
|
9
8
|
)
|
|
9
|
+
from truss.truss_handle.build import load
|
|
10
10
|
from truss.util import path
|
|
11
11
|
|
|
12
12
|
|
|
@@ -43,7 +43,7 @@ def test_copy_tree_path_with_hidden_files(custom_model_truss_dir_with_hidden_fil
|
|
|
43
43
|
with path.given_or_temporary_dir() as dir:
|
|
44
44
|
path.copy_tree_path(custom_model_truss_dir_with_hidden_files, dir)
|
|
45
45
|
|
|
46
|
-
assert not (dir / "__pycache__" / "test.cpython-
|
|
46
|
+
assert not (dir / "__pycache__" / "test.cpython-311.pyc").exists()
|
|
47
47
|
assert not (dir / ".DS_Store").exists()
|
|
48
48
|
assert not (dir / ".git").exists()
|
|
49
49
|
assert (dir / "model").exists()
|
|
@@ -56,7 +56,7 @@ def test_is_ignored(custom_model_truss_dir_with_hidden_files):
|
|
|
56
56
|
assert path.is_ignored(
|
|
57
57
|
custom_model_truss_dir_with_hidden_files
|
|
58
58
|
/ "__pycache__"
|
|
59
|
-
/ "test.cpython-
|
|
59
|
+
/ "test.cpython-311.pyc",
|
|
60
60
|
patterns,
|
|
61
61
|
)
|
|
62
62
|
|
|
@@ -116,9 +116,7 @@ def test_is_ignored_with_base_dir(custom_model_truss_dir_with_hidden_files):
|
|
|
116
116
|
)
|
|
117
117
|
|
|
118
118
|
|
|
119
|
-
def test_ignored_files_in_docker_context(
|
|
120
|
-
custom_model_truss_dir_with_hidden_files,
|
|
121
|
-
):
|
|
119
|
+
def test_ignored_files_in_docker_context(custom_model_truss_dir_with_hidden_files):
|
|
122
120
|
tr = load(custom_model_truss_dir_with_hidden_files)
|
|
123
121
|
|
|
124
122
|
with path.given_or_temporary_dir() as dir:
|
|
@@ -127,7 +125,7 @@ def test_ignored_files_in_docker_context(
|
|
|
127
125
|
|
|
128
126
|
assert dir.exists()
|
|
129
127
|
|
|
130
|
-
assert not (dir / "__pycache__" / "test.cpython-
|
|
128
|
+
assert not (dir / "__pycache__" / "test.cpython-311.pyc").exists()
|
|
131
129
|
assert not (dir / ".DS_Store").exists()
|
|
132
130
|
assert not (dir / ".git").exists()
|
|
133
131
|
assert (dir / "model").exists()
|
|
@@ -135,7 +133,7 @@ def test_ignored_files_in_docker_context(
|
|
|
135
133
|
assert (
|
|
136
134
|
custom_model_truss_dir_with_hidden_files
|
|
137
135
|
/ "__pycache__"
|
|
138
|
-
/ "test.cpython-
|
|
136
|
+
/ "test.cpython-311.pyc"
|
|
139
137
|
).exists()
|
|
140
138
|
assert (custom_model_truss_dir_with_hidden_files / ".DS_Store").exists()
|
|
141
139
|
assert (custom_model_truss_dir_with_hidden_files / ".git").exists()
|
|
@@ -159,13 +157,7 @@ def test_copy_tree_path_with_truss_ignore(custom_model_truss_dir_with_truss_igno
|
|
|
159
157
|
|
|
160
158
|
|
|
161
159
|
def test_get_ignored_relative_paths():
|
|
162
|
-
ignore_patterns = [
|
|
163
|
-
".mypy_cache/",
|
|
164
|
-
"venv/",
|
|
165
|
-
"*.tmp",
|
|
166
|
-
".git",
|
|
167
|
-
"data/*",
|
|
168
|
-
]
|
|
160
|
+
ignore_patterns = [".mypy_cache/", "venv/", "*.tmp", ".git", "data/*"]
|
|
169
161
|
|
|
170
162
|
root_relative_paths = {
|
|
171
163
|
".mypy_cache/should_ignore.json",
|
|
@@ -174,7 +166,7 @@ def test_get_ignored_relative_paths():
|
|
|
174
166
|
".git",
|
|
175
167
|
".git/HEAD",
|
|
176
168
|
"data/should_ignore.txt",
|
|
177
|
-
"data.
|
|
169
|
+
"data.txtconfig.yaml",
|
|
178
170
|
"model/model.py",
|
|
179
171
|
}
|
|
180
172
|
|
|
@@ -192,12 +184,7 @@ def test_get_ignored_relative_paths():
|
|
|
192
184
|
|
|
193
185
|
|
|
194
186
|
def test_get_ignored_relative_paths_from_root(custom_model_truss_dir_with_hidden_files):
|
|
195
|
-
ignore_patterns = [
|
|
196
|
-
"__pycache__",
|
|
197
|
-
".DS_Store",
|
|
198
|
-
".git",
|
|
199
|
-
"data/*",
|
|
200
|
-
]
|
|
187
|
+
ignore_patterns = ["__pycache__", ".DS_Store", ".git", "data/*"]
|
|
201
188
|
|
|
202
189
|
unignored_relative_paths = path.get_unignored_relative_paths_from_root(
|
|
203
190
|
custom_model_truss_dir_with_hidden_files, ignore_patterns
|
|
@@ -220,7 +207,7 @@ def test_get_ignored_relative_paths_from_root(custom_model_truss_dir_with_hidden
|
|
|
220
207
|
)
|
|
221
208
|
ignored_relative_paths_strs = {
|
|
222
209
|
"__pycache__",
|
|
223
|
-
"__pycache__/test.cpython-
|
|
210
|
+
"__pycache__/test.cpython-311.pyc",
|
|
224
211
|
".DS_Store",
|
|
225
212
|
".git",
|
|
226
213
|
".git/.test_file",
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
import requests
|
|
2
|
+
from truss.base.constants import (
|
|
3
|
+
HF_ACCESS_TOKEN_KEY,
|
|
4
|
+
HF_MODELS_API_URL,
|
|
5
|
+
TRTLLM_MIN_MEMORY_REQUEST_GI,
|
|
6
|
+
)
|
|
7
|
+
from truss.base.trt_llm_config import CheckpointSource
|
|
8
|
+
from truss.truss_handle.truss_handle import TrussHandle
|
|
9
|
+
|
|
10
|
+
|
|
11
|
+
def is_missing_secrets_for_trt_llm_builder(tr: TrussHandle) -> bool:
|
|
12
|
+
for trt_llm_build_config in tr.spec.config.parsed_trt_llm_build_configs:
|
|
13
|
+
source = trt_llm_build_config.checkpoint_repository.source
|
|
14
|
+
hf_model_id = trt_llm_build_config.checkpoint_repository.repo
|
|
15
|
+
if (
|
|
16
|
+
source == CheckpointSource.HF
|
|
17
|
+
and HF_ACCESS_TOKEN_KEY not in tr.spec.secrets
|
|
18
|
+
and not _is_model_public(hf_model_id)
|
|
19
|
+
):
|
|
20
|
+
return True
|
|
21
|
+
return False
|
|
22
|
+
|
|
23
|
+
|
|
24
|
+
def memory_updated_for_trt_llm_builder(tr: TrussHandle) -> bool:
|
|
25
|
+
if uses_trt_llm_builder(tr):
|
|
26
|
+
if tr.spec.memory_in_bytes < TRTLLM_MIN_MEMORY_REQUEST_GI * 1024**3:
|
|
27
|
+
tr.spec.config.resources.memory = f"{TRTLLM_MIN_MEMORY_REQUEST_GI}Gi"
|
|
28
|
+
tr.spec.config.write_to_yaml_file(tr.spec.config_path, verbose=False)
|
|
29
|
+
return True
|
|
30
|
+
return False
|
|
31
|
+
|
|
32
|
+
|
|
33
|
+
def _is_model_public(model_id: str) -> bool:
|
|
34
|
+
"""Validate that a huggingface hub model is public.
|
|
35
|
+
|
|
36
|
+
The hf hub API will return 401 when trying to access a private or gated model without auth.
|
|
37
|
+
"""
|
|
38
|
+
response = requests.get(f"{HF_MODELS_API_URL}/{model_id}")
|
|
39
|
+
return response.status_code == 200
|
|
40
|
+
|
|
41
|
+
|
|
42
|
+
def uses_trt_llm_builder(tr: TrussHandle) -> bool:
|
|
43
|
+
return tr.spec.config.trt_llm is not None
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
import ast
|
|
2
|
+
|
|
3
|
+
from truss.base.errors import ValidationError
|
|
4
|
+
from truss.base.truss_spec import TrussSpec
|
|
5
|
+
|
|
6
|
+
|
|
7
|
+
def validate(truss_spec: TrussSpec):
|
|
8
|
+
model_class_filepath = truss_spec.model_class_filepath
|
|
9
|
+
if not model_class_filepath.exists():
|
|
10
|
+
# It's ok if model class file is not provided,
|
|
11
|
+
# trt_llm will generate one.
|
|
12
|
+
return
|
|
13
|
+
|
|
14
|
+
source = model_class_filepath.read_text()
|
|
15
|
+
_verify_has_class_init_arg(source, truss_spec.model_class_name, "trt_llm")
|
|
16
|
+
|
|
17
|
+
|
|
18
|
+
def _verify_has_class_init_arg(source: str, class_name: str, arg_name: str):
|
|
19
|
+
tree = ast.parse(source)
|
|
20
|
+
model_class_init_found = False
|
|
21
|
+
for node in tree.body:
|
|
22
|
+
if isinstance(node, ast.ClassDef) and node.name == class_name:
|
|
23
|
+
for child in node.body:
|
|
24
|
+
if child.name == "__init__": # type: ignore[attr-defined]
|
|
25
|
+
model_class_init_found = True
|
|
26
|
+
arg_found = False
|
|
27
|
+
for arg in child.args.args: # type: ignore[attr-defined]
|
|
28
|
+
if arg.arg == arg_name:
|
|
29
|
+
arg_found = True
|
|
30
|
+
if not arg_found:
|
|
31
|
+
raise ValidationError(
|
|
32
|
+
(
|
|
33
|
+
"Model class `__init__` method is required to have `trt_llm` as an argument. Please add that argument.\n "
|
|
34
|
+
"Or if you want to use the automatically generated model class then remove the `model.py` file.\n "
|
|
35
|
+
"Refer to https://docs.baseten.co/performance/engine-builder-customization for details on engine object usage."
|
|
36
|
+
)
|
|
37
|
+
)
|
|
38
|
+
|
|
39
|
+
if not model_class_init_found:
|
|
40
|
+
raise ValidationError(
|
|
41
|
+
"Model class does not have an `__init__` method; when using `trt_llm` it is required"
|
|
42
|
+
)
|
|
File without changes
|
|
@@ -0,0 +1,122 @@
|
|
|
1
|
+
import logging
|
|
2
|
+
import os
|
|
3
|
+
import sys
|
|
4
|
+
from pathlib import Path
|
|
5
|
+
from typing import Optional, Union
|
|
6
|
+
|
|
7
|
+
import yaml
|
|
8
|
+
|
|
9
|
+
from truss.base.constants import (
|
|
10
|
+
CONFIG_FILE,
|
|
11
|
+
PYTHON_DX_CUSTOM_TEMPLATE_DIR,
|
|
12
|
+
TRADITIONAL_CUSTOM_TEMPLATE_DIR,
|
|
13
|
+
)
|
|
14
|
+
from truss.base.truss_config import (
|
|
15
|
+
Build,
|
|
16
|
+
TrussConfig,
|
|
17
|
+
map_local_to_supported_python_version,
|
|
18
|
+
)
|
|
19
|
+
from truss.truss_handle.truss_handle import TrussHandle
|
|
20
|
+
from truss.util.notebook import is_notebook_or_ipython
|
|
21
|
+
from truss.util.path import copy_tree_path
|
|
22
|
+
|
|
23
|
+
logger: logging.Logger = logging.getLogger(__name__)
|
|
24
|
+
|
|
25
|
+
if is_notebook_or_ipython():
|
|
26
|
+
logger.setLevel(logging.INFO)
|
|
27
|
+
logger.addHandler(logging.StreamHandler(sys.stdout))
|
|
28
|
+
|
|
29
|
+
|
|
30
|
+
def _populate_traditional_target_directory(config: TrussConfig, dir_path: Path):
|
|
31
|
+
# Create data dir
|
|
32
|
+
(dir_path / config.data_dir).mkdir()
|
|
33
|
+
|
|
34
|
+
# Create bundled packages dir
|
|
35
|
+
# TODO: Drop by default
|
|
36
|
+
(dir_path / config.bundled_packages_dir).mkdir()
|
|
37
|
+
|
|
38
|
+
# Create model module dir
|
|
39
|
+
model_dir = dir_path / config.model_module_dir
|
|
40
|
+
copy_tree_path(TRADITIONAL_CUSTOM_TEMPLATE_DIR / "model", model_dir)
|
|
41
|
+
|
|
42
|
+
# Write config
|
|
43
|
+
with (dir_path / CONFIG_FILE).open("w") as config_file:
|
|
44
|
+
yaml.dump(config.to_dict(verbose=False), config_file)
|
|
45
|
+
|
|
46
|
+
|
|
47
|
+
def _populate_python_dx_target_directory(config: TrussConfig, dir_path: Path):
|
|
48
|
+
copy_tree_path(PYTHON_DX_CUSTOM_TEMPLATE_DIR, dir_path)
|
|
49
|
+
|
|
50
|
+
# Hack: We want to place the user provided model name into generated code. Until
|
|
51
|
+
# this gets more complicated, we rely on a brittle string replace. Eventually, we
|
|
52
|
+
# can consider moving to jinja templates.
|
|
53
|
+
model_file_path = dir_path / "my_model.py"
|
|
54
|
+
with open(model_file_path, "r") as f:
|
|
55
|
+
content = f.read()
|
|
56
|
+
|
|
57
|
+
assert config.model_name is not None
|
|
58
|
+
content = content.replace("{{ MODEL_NAME }}", config.model_name)
|
|
59
|
+
with open(model_file_path, "w") as f:
|
|
60
|
+
f.write(content)
|
|
61
|
+
|
|
62
|
+
|
|
63
|
+
def init_directory(
|
|
64
|
+
target_directory: Union[str, Path],
|
|
65
|
+
build_config: Optional[Build] = None,
|
|
66
|
+
model_name: Optional[str] = None,
|
|
67
|
+
python_config: bool = False,
|
|
68
|
+
) -> Path:
|
|
69
|
+
"""
|
|
70
|
+
Initialize an empty placeholder Truss. A Truss is a build context designed
|
|
71
|
+
to be built as a container locally or uploaded into a baseten serving
|
|
72
|
+
environment. This placeholder structure can be filled to represent ML
|
|
73
|
+
models.
|
|
74
|
+
|
|
75
|
+
Args:
|
|
76
|
+
target_directory: Absolute or relative path of the directory to create
|
|
77
|
+
Truss in. The directory is created if it doesn't exist.
|
|
78
|
+
"""
|
|
79
|
+
config = TrussConfig(
|
|
80
|
+
model_name=model_name, python_version=map_local_to_supported_python_version()
|
|
81
|
+
)
|
|
82
|
+
|
|
83
|
+
if build_config:
|
|
84
|
+
config.build = build_config
|
|
85
|
+
|
|
86
|
+
target_directory_path = Path(target_directory)
|
|
87
|
+
target_directory_path.mkdir(parents=True, exist_ok=True)
|
|
88
|
+
|
|
89
|
+
if not python_config:
|
|
90
|
+
_populate_traditional_target_directory(
|
|
91
|
+
config=config, dir_path=target_directory_path
|
|
92
|
+
)
|
|
93
|
+
else:
|
|
94
|
+
_populate_python_dx_target_directory(
|
|
95
|
+
config=config, dir_path=target_directory_path
|
|
96
|
+
)
|
|
97
|
+
|
|
98
|
+
return target_directory_path
|
|
99
|
+
|
|
100
|
+
|
|
101
|
+
def load(truss_directory: Union[str, Path]) -> TrussHandle:
|
|
102
|
+
"""Get a handle to a Truss. A Truss is a build context designed to be built
|
|
103
|
+
as a container locally or uploaded into a model serving environment.
|
|
104
|
+
|
|
105
|
+
Args:
|
|
106
|
+
truss_directory (str | Path): The local directory of an existing Truss
|
|
107
|
+
Returns:
|
|
108
|
+
TrussHandle
|
|
109
|
+
"""
|
|
110
|
+
return TrussHandle(Path(truss_directory))
|
|
111
|
+
|
|
112
|
+
|
|
113
|
+
def cleanup() -> None:
|
|
114
|
+
"""
|
|
115
|
+
Cleans up .truss directory.
|
|
116
|
+
"""
|
|
117
|
+
build_folder_path = Path(Path.home(), ".truss")
|
|
118
|
+
if build_folder_path.exists():
|
|
119
|
+
for obj in build_folder_path.glob("**/*"):
|
|
120
|
+
if (not obj.name == "config.yaml") and (obj.is_file()):
|
|
121
|
+
os.remove(obj)
|
|
122
|
+
return
|
|
File without changes
|