truss 0.11.13rc1__tar.gz → 0.11.13rc3__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.

Potentially problematic release.


This version of truss might be problematic. Click here for more details.

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