truss 0.10.9rc535__tar.gz → 0.10.10rc0__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 (412) hide show
  1. {truss-0.10.9rc535 → truss-0.10.10rc0}/PKG-INFO +2 -2
  2. {truss-0.10.9rc535 → truss-0.10.10rc0}/pyproject.toml +3 -2
  3. {truss-0.10.9rc535 → truss-0.10.10rc0}/truss/cli/logs/base_watcher.py +1 -1
  4. {truss-0.10.9rc535 → truss-0.10.10rc0}/truss/cli/train/deploy_checkpoints/deploy_checkpoints.py +30 -22
  5. {truss-0.10.9rc535 → truss-0.10.10rc0}/truss/cli/train/deploy_checkpoints/deploy_checkpoints_helpers.py +8 -2
  6. {truss-0.10.9rc535 → truss-0.10.10rc0}/truss/cli/train/deploy_checkpoints/deploy_full_checkpoints.py +14 -7
  7. truss-0.10.10rc0/truss/cli/train/deploy_checkpoints/deploy_whisper_checkpoints.py +63 -0
  8. truss-0.10.10rc0/truss/cli/train/deploy_from_checkpoint_config_whisper.yml +17 -0
  9. truss-0.10.10rc0/truss/cli/train/metrics_watcher.py +331 -0
  10. {truss-0.10.9rc535 → truss-0.10.10rc0}/truss/cli/train_commands.py +11 -3
  11. {truss-0.10.9rc535 → truss-0.10.10rc0}/truss/contexts/image_builder/serving_image_builder.py +22 -39
  12. {truss-0.10.9rc535 → truss-0.10.10rc0}/truss/remote/baseten/api.py +11 -0
  13. {truss-0.10.9rc535 → truss-0.10.10rc0}/truss/remote/baseten/core.py +209 -1
  14. truss-0.10.10rc0/truss/remote/baseten/utils/time.py +15 -0
  15. {truss-0.10.9rc535 → truss-0.10.10rc0}/truss/templates/base.Dockerfile.jinja +6 -23
  16. {truss-0.10.9rc535 → truss-0.10.10rc0}/truss/templates/cache.Dockerfile.jinja +5 -5
  17. truss-0.10.10rc0/truss/templates/copy_cache_files.Dockerfile.jinja +3 -0
  18. {truss-0.10.9rc535 → truss-0.10.10rc0}/truss/templates/docker_server/supervisord.conf.jinja +0 -1
  19. {truss-0.10.9rc535 → truss-0.10.10rc0}/truss/templates/server/requirements.txt +1 -1
  20. {truss-0.10.9rc535 → truss-0.10.10rc0}/truss/templates/server.Dockerfile.jinja +16 -33
  21. {truss-0.10.9rc535 → truss-0.10.10rc0}/truss/tests/cli/train/test_deploy_checkpoints.py +446 -2
  22. truss-0.10.10rc0/truss/tests/cli/train/test_train_cli_core.py +191 -0
  23. truss-0.10.10rc0/truss/tests/remote/baseten/conftest.py +18 -0
  24. {truss-0.10.9rc535 → truss-0.10.10rc0}/truss/tests/remote/baseten/test_api.py +49 -14
  25. truss-0.10.10rc0/truss/tests/remote/baseten/test_core.py +763 -0
  26. {truss-0.10.9rc535 → truss-0.10.10rc0}/truss-train/truss_train/definitions.py +6 -0
  27. {truss-0.10.9rc535 → truss-0.10.10rc0}/truss-train/truss_train/deployment.py +15 -2
  28. {truss-0.10.9rc535 → truss-0.10.10rc0}/truss-train/truss_train/loader.py +7 -20
  29. truss-0.10.9rc535/truss/cli/train/metrics_watcher.py +0 -220
  30. truss-0.10.9rc535/truss/templates/copy_cache_files.Dockerfile.jinja +0 -3
  31. truss-0.10.9rc535/truss/tests/cli/train/test_train_cli_core.py +0 -95
  32. truss-0.10.9rc535/truss/tests/remote/baseten/test_core.py +0 -247
  33. truss-0.10.9rc535/truss/tests/util/test_basetenpointer.py +0 -227
  34. truss-0.10.9rc535/truss/util/basetenpointer.py +0 -160
  35. {truss-0.10.9rc535 → truss-0.10.10rc0}/.github/ISSUE_TEMPLATE/bug_report.md +0 -0
  36. {truss-0.10.9rc535 → truss-0.10.10rc0}/.github/ISSUE_TEMPLATE/feature_request.md +0 -0
  37. {truss-0.10.9rc535 → truss-0.10.10rc0}/.github/pull_request_template.md +0 -0
  38. {truss-0.10.9rc535 → truss-0.10.10rc0}/.gitignore +0 -0
  39. {truss-0.10.9rc535 → truss-0.10.10rc0}/CODE_OF_CONDUCT.md +0 -0
  40. {truss-0.10.9rc535 → truss-0.10.10rc0}/CONTRIBUTING.md +0 -0
  41. {truss-0.10.9rc535 → truss-0.10.10rc0}/LICENSE +0 -0
  42. {truss-0.10.9rc535 → truss-0.10.10rc0}/README.md +0 -0
  43. {truss-0.10.9rc535 → truss-0.10.10rc0}/baseten-performance-client/README.md +0 -0
  44. {truss-0.10.9rc535 → truss-0.10.10rc0}/baseten-performance-client/node_bindings/README.md +0 -0
  45. {truss-0.10.9rc535 → truss-0.10.10rc0}/baseten-performance-client/node_bindings/npm/android-arm-eabi/README.md +0 -0
  46. {truss-0.10.9rc535 → truss-0.10.10rc0}/baseten-performance-client/node_bindings/npm/android-arm64/README.md +0 -0
  47. {truss-0.10.9rc535 → truss-0.10.10rc0}/baseten-performance-client/node_bindings/npm/darwin-arm64/README.md +0 -0
  48. {truss-0.10.9rc535 → truss-0.10.10rc0}/baseten-performance-client/node_bindings/npm/darwin-universal/README.md +0 -0
  49. {truss-0.10.9rc535 → truss-0.10.10rc0}/baseten-performance-client/node_bindings/npm/darwin-x64/README.md +0 -0
  50. {truss-0.10.9rc535 → truss-0.10.10rc0}/baseten-performance-client/node_bindings/npm/freebsd-x64/README.md +0 -0
  51. {truss-0.10.9rc535 → truss-0.10.10rc0}/baseten-performance-client/node_bindings/npm/linux-arm-gnueabihf/README.md +0 -0
  52. {truss-0.10.9rc535 → truss-0.10.10rc0}/baseten-performance-client/node_bindings/npm/linux-arm-musleabihf/README.md +0 -0
  53. {truss-0.10.9rc535 → truss-0.10.10rc0}/baseten-performance-client/node_bindings/npm/linux-arm64-gnu/README.md +0 -0
  54. {truss-0.10.9rc535 → truss-0.10.10rc0}/baseten-performance-client/node_bindings/npm/linux-arm64-musl/README.md +0 -0
  55. {truss-0.10.9rc535 → truss-0.10.10rc0}/baseten-performance-client/node_bindings/npm/linux-riscv64-gnu/README.md +0 -0
  56. {truss-0.10.9rc535 → truss-0.10.10rc0}/baseten-performance-client/node_bindings/npm/linux-x64-gnu/README.md +0 -0
  57. {truss-0.10.9rc535 → truss-0.10.10rc0}/baseten-performance-client/node_bindings/npm/linux-x64-musl/README.md +0 -0
  58. {truss-0.10.9rc535 → truss-0.10.10rc0}/baseten-performance-client/node_bindings/npm/win32-arm64-msvc/README.md +0 -0
  59. {truss-0.10.9rc535 → truss-0.10.10rc0}/baseten-performance-client/node_bindings/npm/win32-ia32-msvc/README.md +0 -0
  60. {truss-0.10.9rc535 → truss-0.10.10rc0}/baseten-performance-client/node_bindings/npm/win32-x64-msvc/README.md +0 -0
  61. {truss-0.10.9rc535 → truss-0.10.10rc0}/baseten-performance-client/python_bindings/README.md +0 -0
  62. {truss-0.10.9rc535 → truss-0.10.10rc0}/baseten-performance-client/scripts/README_nodejs.md +0 -0
  63. {truss-0.10.9rc535 → truss-0.10.10rc0}/context_builder.Dockerfile +0 -0
  64. {truss-0.10.9rc535 → truss-0.10.10rc0}/docs/README.md +0 -0
  65. {truss-0.10.9rc535 → truss-0.10.10rc0}/docs/chains/doc_gen/README.md +0 -0
  66. {truss-0.10.9rc535 → truss-0.10.10rc0}/docs/contribute/base-images.md +0 -0
  67. {truss-0.10.9rc535 → truss-0.10.10rc0}/docs/contribute/release.md +0 -0
  68. {truss-0.10.9rc535 → truss-0.10.10rc0}/truss/__init__.py +0 -0
  69. {truss-0.10.9rc535 → truss-0.10.10rc0}/truss/api/__init__.py +0 -0
  70. {truss-0.10.9rc535 → truss-0.10.10rc0}/truss/api/definitions.py +0 -0
  71. {truss-0.10.9rc535 → truss-0.10.10rc0}/truss/base/__init__.py +0 -0
  72. {truss-0.10.9rc535 → truss-0.10.10rc0}/truss/base/constants.py +0 -0
  73. {truss-0.10.9rc535 → truss-0.10.10rc0}/truss/base/custom_types.py +0 -0
  74. {truss-0.10.9rc535 → truss-0.10.10rc0}/truss/base/errors.py +0 -0
  75. {truss-0.10.9rc535 → truss-0.10.10rc0}/truss/base/trt_llm_config.py +0 -0
  76. {truss-0.10.9rc535 → truss-0.10.10rc0}/truss/base/truss_config.py +0 -0
  77. {truss-0.10.9rc535 → truss-0.10.10rc0}/truss/base/truss_spec.py +0 -0
  78. {truss-0.10.9rc535 → truss-0.10.10rc0}/truss/cli/chains_commands.py +0 -0
  79. {truss-0.10.9rc535 → truss-0.10.10rc0}/truss/cli/cli.py +0 -0
  80. {truss-0.10.9rc535 → truss-0.10.10rc0}/truss/cli/logs/model_log_watcher.py +0 -0
  81. {truss-0.10.9rc535 → truss-0.10.10rc0}/truss/cli/logs/training_log_watcher.py +0 -0
  82. {truss-0.10.9rc535 → truss-0.10.10rc0}/truss/cli/logs/utils.py +0 -0
  83. {truss-0.10.9rc535 → truss-0.10.10rc0}/truss/cli/remote_cli.py +0 -0
  84. {truss-0.10.9rc535 → truss-0.10.10rc0}/truss/cli/train/common.py +0 -0
  85. {truss-0.10.9rc535 → truss-0.10.10rc0}/truss/cli/train/core.py +0 -0
  86. {truss-0.10.9rc535 → truss-0.10.10rc0}/truss/cli/train/deploy_checkpoints/__init__.py +0 -0
  87. {truss-0.10.9rc535 → truss-0.10.10rc0}/truss/cli/train/deploy_checkpoints/deploy_lora_checkpoints.py +0 -0
  88. {truss-0.10.9rc535 → truss-0.10.10rc0}/truss/cli/train/deploy_from_checkpoint_config.yml +0 -0
  89. {truss-0.10.9rc535 → truss-0.10.10rc0}/truss/cli/train/poller.py +0 -0
  90. {truss-0.10.9rc535 → truss-0.10.10rc0}/truss/cli/train/types.py +0 -0
  91. {truss-0.10.9rc535 → truss-0.10.10rc0}/truss/cli/utils/common.py +0 -0
  92. {truss-0.10.9rc535 → truss-0.10.10rc0}/truss/cli/utils/output.py +0 -0
  93. {truss-0.10.9rc535 → truss-0.10.10rc0}/truss/cli/utils/self_upgrade.py +0 -0
  94. {truss-0.10.9rc535 → truss-0.10.10rc0}/truss/contexts/docker_build_setup.py +0 -0
  95. {truss-0.10.9rc535 → truss-0.10.10rc0}/truss/contexts/image_builder/cache_warmer.py +0 -0
  96. {truss-0.10.9rc535 → truss-0.10.10rc0}/truss/contexts/image_builder/image_builder.py +0 -0
  97. {truss-0.10.9rc535 → truss-0.10.10rc0}/truss/contexts/image_builder/util.py +0 -0
  98. {truss-0.10.9rc535 → truss-0.10.10rc0}/truss/contexts/local_loader/docker_build_emulator.py +0 -0
  99. {truss-0.10.9rc535 → truss-0.10.10rc0}/truss/contexts/local_loader/dockerfile_parser.py +0 -0
  100. {truss-0.10.9rc535 → truss-0.10.10rc0}/truss/contexts/local_loader/load_model_local.py +0 -0
  101. {truss-0.10.9rc535 → truss-0.10.10rc0}/truss/contexts/local_loader/truss_module_loader.py +0 -0
  102. {truss-0.10.9rc535 → truss-0.10.10rc0}/truss/contexts/local_loader/utils.py +0 -0
  103. {truss-0.10.9rc535 → truss-0.10.10rc0}/truss/contexts/truss_context.py +0 -0
  104. {truss-0.10.9rc535 → truss-0.10.10rc0}/truss/local/local_config.py +0 -0
  105. {truss-0.10.9rc535 → truss-0.10.10rc0}/truss/local/local_config_handler.py +0 -0
  106. {truss-0.10.9rc535 → truss-0.10.10rc0}/truss/patch/__init__.py +0 -0
  107. {truss-0.10.9rc535 → truss-0.10.10rc0}/truss/patch/hash.py +0 -0
  108. {truss-0.10.9rc535 → truss-0.10.10rc0}/truss/patch/signature.py +0 -0
  109. {truss-0.10.9rc535 → truss-0.10.10rc0}/truss/patch/truss_dir_patch_applier.py +0 -0
  110. {truss-0.10.9rc535 → truss-0.10.10rc0}/truss/remote/baseten/__init__.py +0 -0
  111. {truss-0.10.9rc535 → truss-0.10.10rc0}/truss/remote/baseten/auth.py +0 -0
  112. {truss-0.10.9rc535 → truss-0.10.10rc0}/truss/remote/baseten/custom_types.py +0 -0
  113. {truss-0.10.9rc535 → truss-0.10.10rc0}/truss/remote/baseten/error.py +0 -0
  114. {truss-0.10.9rc535 → truss-0.10.10rc0}/truss/remote/baseten/remote.py +0 -0
  115. {truss-0.10.9rc535 → truss-0.10.10rc0}/truss/remote/baseten/rest_client.py +0 -0
  116. {truss-0.10.9rc535 → truss-0.10.10rc0}/truss/remote/baseten/service.py +0 -0
  117. {truss-0.10.9rc535 → truss-0.10.10rc0}/truss/remote/baseten/utils/status.py +0 -0
  118. {truss-0.10.9rc535 → truss-0.10.10rc0}/truss/remote/baseten/utils/tar.py +0 -0
  119. {truss-0.10.9rc535 → truss-0.10.10rc0}/truss/remote/baseten/utils/transfer.py +0 -0
  120. {truss-0.10.9rc535 → truss-0.10.10rc0}/truss/remote/remote_factory.py +0 -0
  121. {truss-0.10.9rc535 → truss-0.10.10rc0}/truss/remote/truss_remote.py +0 -0
  122. {truss-0.10.9rc535 → truss-0.10.10rc0}/truss/templates/README.md.jinja +0 -0
  123. {truss-0.10.9rc535 → truss-0.10.10rc0}/truss/templates/__init__.py +0 -0
  124. {truss-0.10.9rc535 → truss-0.10.10rc0}/truss/templates/cache_requirements.txt +0 -0
  125. {truss-0.10.9rc535 → truss-0.10.10rc0}/truss/templates/control/control/application.py +0 -0
  126. {truss-0.10.9rc535 → truss-0.10.10rc0}/truss/templates/control/control/endpoints.py +0 -0
  127. {truss-0.10.9rc535 → truss-0.10.10rc0}/truss/templates/control/control/helpers/context_managers.py +0 -0
  128. {truss-0.10.9rc535 → truss-0.10.10rc0}/truss/templates/control/control/helpers/custom_types.py +0 -0
  129. {truss-0.10.9rc535 → truss-0.10.10rc0}/truss/templates/control/control/helpers/errors.py +0 -0
  130. {truss-0.10.9rc535 → truss-0.10.10rc0}/truss/templates/control/control/helpers/inference_server_controller.py +0 -0
  131. {truss-0.10.9rc535 → truss-0.10.10rc0}/truss/templates/control/control/helpers/inference_server_process_controller.py +0 -0
  132. {truss-0.10.9rc535 → truss-0.10.10rc0}/truss/templates/control/control/helpers/inference_server_starter.py +0 -0
  133. {truss-0.10.9rc535 → truss-0.10.10rc0}/truss/templates/control/control/helpers/truss_patch/__init__.py +0 -0
  134. {truss-0.10.9rc535 → truss-0.10.10rc0}/truss/templates/control/control/helpers/truss_patch/model_code_patch_applier.py +0 -0
  135. {truss-0.10.9rc535 → truss-0.10.10rc0}/truss/templates/control/control/helpers/truss_patch/model_container_patch_applier.py +0 -0
  136. {truss-0.10.9rc535 → truss-0.10.10rc0}/truss/templates/control/control/helpers/truss_patch/requirement_name_identifier.py +0 -0
  137. {truss-0.10.9rc535 → truss-0.10.10rc0}/truss/templates/control/control/helpers/truss_patch/system_packages.py +0 -0
  138. {truss-0.10.9rc535 → truss-0.10.10rc0}/truss/templates/control/control/server.py +0 -0
  139. {truss-0.10.9rc535 → truss-0.10.10rc0}/truss/templates/control/requirements.txt +0 -0
  140. {truss-0.10.9rc535 → truss-0.10.10rc0}/truss/templates/custom/examples.yaml +0 -0
  141. {truss-0.10.9rc535 → truss-0.10.10rc0}/truss/templates/custom/model/__init__.py +0 -0
  142. {truss-0.10.9rc535 → truss-0.10.10rc0}/truss/templates/custom/model/model.py +0 -0
  143. {truss-0.10.9rc535 → truss-0.10.10rc0}/truss/templates/custom_python_dx/my_model.py +0 -0
  144. {truss-0.10.9rc535 → truss-0.10.10rc0}/truss/templates/docker_server/proxy.conf.jinja +0 -0
  145. {truss-0.10.9rc535 → truss-0.10.10rc0}/truss/templates/docker_server_requirements.txt +0 -0
  146. {truss-0.10.9rc535 → truss-0.10.10rc0}/truss/templates/server/__init__.py +0 -0
  147. {truss-0.10.9rc535 → truss-0.10.10rc0}/truss/templates/server/common/__init__.py +0 -0
  148. {truss-0.10.9rc535 → truss-0.10.10rc0}/truss/templates/server/common/errors.py +0 -0
  149. {truss-0.10.9rc535 → truss-0.10.10rc0}/truss/templates/server/common/patches/whisper/patch.py +0 -0
  150. {truss-0.10.9rc535 → truss-0.10.10rc0}/truss/templates/server/common/patches.py +0 -0
  151. {truss-0.10.9rc535 → truss-0.10.10rc0}/truss/templates/server/common/retry.py +0 -0
  152. {truss-0.10.9rc535 → truss-0.10.10rc0}/truss/templates/server/common/schema.py +0 -0
  153. {truss-0.10.9rc535 → truss-0.10.10rc0}/truss/templates/server/common/tracing.py +0 -0
  154. {truss-0.10.9rc535 → truss-0.10.10rc0}/truss/templates/server/main.py +0 -0
  155. {truss-0.10.9rc535 → truss-0.10.10rc0}/truss/templates/server/model_wrapper.py +0 -0
  156. {truss-0.10.9rc535 → truss-0.10.10rc0}/truss/templates/server/truss_server.py +0 -0
  157. {truss-0.10.9rc535 → truss-0.10.10rc0}/truss/templates/shared/__init__.py +0 -0
  158. {truss-0.10.9rc535 → truss-0.10.10rc0}/truss/templates/shared/dynamic_config_resolver.py +0 -0
  159. {truss-0.10.9rc535 → truss-0.10.10rc0}/truss/templates/shared/lazy_data_resolver.py +0 -0
  160. {truss-0.10.9rc535 → truss-0.10.10rc0}/truss/templates/shared/log_config.py +0 -0
  161. {truss-0.10.9rc535 → truss-0.10.10rc0}/truss/templates/shared/secrets_resolver.py +0 -0
  162. {truss-0.10.9rc535 → truss-0.10.10rc0}/truss/templates/shared/serialization.py +0 -0
  163. {truss-0.10.9rc535 → truss-0.10.10rc0}/truss/templates/shared/util.py +0 -0
  164. {truss-0.10.9rc535 → truss-0.10.10rc0}/truss/templates/trtllm-audio/model/model.py +0 -0
  165. {truss-0.10.9rc535 → truss-0.10.10rc0}/truss/templates/trtllm-audio/packages/sigint_patch.py +0 -0
  166. {truss-0.10.9rc535 → truss-0.10.10rc0}/truss/templates/trtllm-audio/packages/whisper_trt/__init__.py +0 -0
  167. {truss-0.10.9rc535 → truss-0.10.10rc0}/truss/templates/trtllm-audio/packages/whisper_trt/assets.py +0 -0
  168. {truss-0.10.9rc535 → truss-0.10.10rc0}/truss/templates/trtllm-audio/packages/whisper_trt/batching.py +0 -0
  169. {truss-0.10.9rc535 → truss-0.10.10rc0}/truss/templates/trtllm-audio/packages/whisper_trt/custom_types.py +0 -0
  170. {truss-0.10.9rc535 → truss-0.10.10rc0}/truss/templates/trtllm-audio/packages/whisper_trt/modeling.py +0 -0
  171. {truss-0.10.9rc535 → truss-0.10.10rc0}/truss/templates/trtllm-audio/packages/whisper_trt/tokenizer.py +0 -0
  172. {truss-0.10.9rc535 → truss-0.10.10rc0}/truss/templates/trtllm-audio/packages/whisper_trt/utils.py +0 -0
  173. {truss-0.10.9rc535 → truss-0.10.10rc0}/truss/templates/trtllm-briton/README.md +0 -0
  174. {truss-0.10.9rc535 → truss-0.10.10rc0}/truss/templates/trtllm-briton/src/extension.py +0 -0
  175. {truss-0.10.9rc535 → truss-0.10.10rc0}/truss/tests/__init__.py +0 -0
  176. {truss-0.10.9rc535 → truss-0.10.10rc0}/truss/tests/cli/test_cli.py +0 -0
  177. {truss-0.10.9rc535 → truss-0.10.10rc0}/truss/tests/cli/train/resources/test_deploy_from_checkpoint_config.yml +0 -0
  178. {truss-0.10.9rc535 → truss-0.10.10rc0}/truss/tests/conftest.py +0 -0
  179. {truss-0.10.9rc535 → truss-0.10.10rc0}/truss/tests/contexts/image_builder/test_serving_image_builder.py +0 -0
  180. {truss-0.10.9rc535 → truss-0.10.10rc0}/truss/tests/contexts/local_loader/test_load_local.py +0 -0
  181. {truss-0.10.9rc535 → truss-0.10.10rc0}/truss/tests/contexts/local_loader/test_truss_module_finder.py +0 -0
  182. {truss-0.10.9rc535 → truss-0.10.10rc0}/truss/tests/helpers.py +0 -0
  183. {truss-0.10.9rc535 → truss-0.10.10rc0}/truss/tests/local/test_local_config_handler.py +0 -0
  184. {truss-0.10.9rc535 → truss-0.10.10rc0}/truss/tests/patch/test_calc_patch.py +0 -0
  185. {truss-0.10.9rc535 → truss-0.10.10rc0}/truss/tests/patch/test_dir_signature.py +0 -0
  186. {truss-0.10.9rc535 → truss-0.10.10rc0}/truss/tests/patch/test_hash.py +0 -0
  187. {truss-0.10.9rc535 → truss-0.10.10rc0}/truss/tests/patch/test_signature.py +0 -0
  188. {truss-0.10.9rc535 → truss-0.10.10rc0}/truss/tests/patch/test_truss_dir_patch_applier.py +0 -0
  189. {truss-0.10.9rc535 → truss-0.10.10rc0}/truss/tests/patch/test_types.py +0 -0
  190. {truss-0.10.9rc535 → truss-0.10.10rc0}/truss/tests/remote/baseten/test_auth.py +0 -0
  191. {truss-0.10.9rc535 → truss-0.10.10rc0}/truss/tests/remote/baseten/test_remote.py +0 -0
  192. {truss-0.10.9rc535 → truss-0.10.10rc0}/truss/tests/remote/baseten/test_service.py +0 -0
  193. {truss-0.10.9rc535 → truss-0.10.10rc0}/truss/tests/remote/test_remote_factory.py +0 -0
  194. {truss-0.10.9rc535 → truss-0.10.10rc0}/truss/tests/remote/test_truss_remote.py +0 -0
  195. {truss-0.10.9rc535 → truss-0.10.10rc0}/truss/tests/templates/control/control/helpers/test_context_managers.py +0 -0
  196. {truss-0.10.9rc535 → truss-0.10.10rc0}/truss/tests/templates/control/control/helpers/test_model_container_patch_applier.py +0 -0
  197. {truss-0.10.9rc535 → truss-0.10.10rc0}/truss/tests/templates/control/control/helpers/test_requirement_name_identifier.py +0 -0
  198. {truss-0.10.9rc535 → truss-0.10.10rc0}/truss/tests/templates/control/control/test_endpoints.py +0 -0
  199. {truss-0.10.9rc535 → truss-0.10.10rc0}/truss/tests/templates/control/control/test_server.py +0 -0
  200. {truss-0.10.9rc535 → truss-0.10.10rc0}/truss/tests/templates/control/control/test_server_integration.py +0 -0
  201. {truss-0.10.9rc535 → truss-0.10.10rc0}/truss/tests/templates/core/server/test_dynamic_config_resolver.py +0 -0
  202. {truss-0.10.9rc535 → truss-0.10.10rc0}/truss/tests/templates/core/server/test_lazy_data_resolver_v2.py +0 -0
  203. {truss-0.10.9rc535 → truss-0.10.10rc0}/truss/tests/templates/core/server/test_secrets_resolver.py +0 -0
  204. {truss-0.10.9rc535 → truss-0.10.10rc0}/truss/tests/templates/server/common/test_retry.py +0 -0
  205. {truss-0.10.9rc535 → truss-0.10.10rc0}/truss/tests/templates/server/test_model_wrapper.py +0 -0
  206. {truss-0.10.9rc535 → truss-0.10.10rc0}/truss/tests/templates/server/test_schema.py +0 -0
  207. {truss-0.10.9rc535 → truss-0.10.10rc0}/truss/tests/templates/server/test_truss_server.py +0 -0
  208. {truss-0.10.9rc535 → truss-0.10.10rc0}/truss/tests/test_build.py +0 -0
  209. {truss-0.10.9rc535 → truss-0.10.10rc0}/truss/tests/test_config.py +0 -0
  210. {truss-0.10.9rc535 → truss-0.10.10rc0}/truss/tests/test_context_builder_image.py +0 -0
  211. {truss-0.10.9rc535 → truss-0.10.10rc0}/truss/tests/test_control_truss_patching.py +0 -0
  212. {truss-0.10.9rc535 → truss-0.10.10rc0}/truss/tests/test_custom_server.py +0 -0
  213. {truss-0.10.9rc535 → truss-0.10.10rc0}/truss/tests/test_data/__init__.py +0 -0
  214. {truss-0.10.9rc535 → truss-0.10.10rc0}/truss/tests/test_data/annotated_types_truss/__init__.py +0 -0
  215. {truss-0.10.9rc535 → truss-0.10.10rc0}/truss/tests/test_data/annotated_types_truss/config.yaml +0 -0
  216. {truss-0.10.9rc535 → truss-0.10.10rc0}/truss/tests/test_data/annotated_types_truss/model/__init__.py +0 -0
  217. {truss-0.10.9rc535 → truss-0.10.10rc0}/truss/tests/test_data/annotated_types_truss/model/model.py +0 -0
  218. {truss-0.10.9rc535 → truss-0.10.10rc0}/truss/tests/test_data/auto-mpg.data +0 -0
  219. {truss-0.10.9rc535 → truss-0.10.10rc0}/truss/tests/test_data/context_builder_image_test/Dockerfile +0 -0
  220. {truss-0.10.9rc535 → truss-0.10.10rc0}/truss/tests/test_data/context_builder_image_test/__init__.py +0 -0
  221. {truss-0.10.9rc535 → truss-0.10.10rc0}/truss/tests/test_data/context_builder_image_test/test.py +0 -0
  222. {truss-0.10.9rc535 → truss-0.10.10rc0}/truss/tests/test_data/gcs_fix/__init__.py +0 -0
  223. {truss-0.10.9rc535 → truss-0.10.10rc0}/truss/tests/test_data/gcs_fix/config.yaml +0 -0
  224. {truss-0.10.9rc535 → truss-0.10.10rc0}/truss/tests/test_data/gcs_fix/model/__init__.py +0 -0
  225. {truss-0.10.9rc535 → truss-0.10.10rc0}/truss/tests/test_data/gcs_fix/model/model.py +0 -0
  226. {truss-0.10.9rc535 → truss-0.10.10rc0}/truss/tests/test_data/happy.ipynb +0 -0
  227. {truss-0.10.9rc535 → truss-0.10.10rc0}/truss/tests/test_data/model_load_failure_test/__init__.py +0 -0
  228. {truss-0.10.9rc535 → truss-0.10.10rc0}/truss/tests/test_data/model_load_failure_test/config.yaml +0 -0
  229. {truss-0.10.9rc535 → truss-0.10.10rc0}/truss/tests/test_data/model_load_failure_test/model/__init__.py +0 -0
  230. {truss-0.10.9rc535 → truss-0.10.10rc0}/truss/tests/test_data/model_load_failure_test/model/model.py +0 -0
  231. {truss-0.10.9rc535 → truss-0.10.10rc0}/truss/tests/test_data/patch_ping_test_server/__init__.py +0 -0
  232. {truss-0.10.9rc535 → truss-0.10.10rc0}/truss/tests/test_data/patch_ping_test_server/app.py +0 -0
  233. {truss-0.10.9rc535 → truss-0.10.10rc0}/truss/tests/test_data/pima-indians-diabetes.csv +0 -0
  234. {truss-0.10.9rc535 → truss-0.10.10rc0}/truss/tests/test_data/readme_int_example.md +0 -0
  235. {truss-0.10.9rc535 → truss-0.10.10rc0}/truss/tests/test_data/readme_no_example.md +0 -0
  236. {truss-0.10.9rc535 → truss-0.10.10rc0}/truss/tests/test_data/readme_str_example.md +0 -0
  237. {truss-0.10.9rc535 → truss-0.10.10rc0}/truss/tests/test_data/server.Dockerfile +0 -0
  238. {truss-0.10.9rc535 → truss-0.10.10rc0}/truss/tests/test_data/server_conformance_test_truss/__init__.py +0 -0
  239. {truss-0.10.9rc535 → truss-0.10.10rc0}/truss/tests/test_data/server_conformance_test_truss/config.yaml +0 -0
  240. {truss-0.10.9rc535 → truss-0.10.10rc0}/truss/tests/test_data/server_conformance_test_truss/model/__init__.py +0 -0
  241. {truss-0.10.9rc535 → truss-0.10.10rc0}/truss/tests/test_data/server_conformance_test_truss/model/model.py +0 -0
  242. {truss-0.10.9rc535 → truss-0.10.10rc0}/truss/tests/test_data/test_async_truss/__init__.py +0 -0
  243. {truss-0.10.9rc535 → truss-0.10.10rc0}/truss/tests/test_data/test_async_truss/config.yaml +0 -0
  244. {truss-0.10.9rc535 → truss-0.10.10rc0}/truss/tests/test_data/test_async_truss/model/__init__.py +0 -0
  245. {truss-0.10.9rc535 → truss-0.10.10rc0}/truss/tests/test_data/test_async_truss/model/model.py +0 -0
  246. {truss-0.10.9rc535 → truss-0.10.10rc0}/truss/tests/test_data/test_basic_truss/__init__.py +0 -0
  247. {truss-0.10.9rc535 → truss-0.10.10rc0}/truss/tests/test_data/test_basic_truss/config.yaml +0 -0
  248. {truss-0.10.9rc535 → truss-0.10.10rc0}/truss/tests/test_data/test_basic_truss/model/__init__.py +0 -0
  249. {truss-0.10.9rc535 → truss-0.10.10rc0}/truss/tests/test_data/test_basic_truss/model/model.py +0 -0
  250. {truss-0.10.9rc535 → truss-0.10.10rc0}/truss/tests/test_data/test_build_commands/__init__.py +0 -0
  251. {truss-0.10.9rc535 → truss-0.10.10rc0}/truss/tests/test_data/test_build_commands/config.yaml +0 -0
  252. {truss-0.10.9rc535 → truss-0.10.10rc0}/truss/tests/test_data/test_build_commands/model/__init__.py +0 -0
  253. {truss-0.10.9rc535 → truss-0.10.10rc0}/truss/tests/test_data/test_build_commands/model/model.py +0 -0
  254. {truss-0.10.9rc535 → truss-0.10.10rc0}/truss/tests/test_data/test_build_commands_failure/__init__.py +0 -0
  255. {truss-0.10.9rc535 → truss-0.10.10rc0}/truss/tests/test_data/test_build_commands_failure/config.yaml +0 -0
  256. {truss-0.10.9rc535 → truss-0.10.10rc0}/truss/tests/test_data/test_build_commands_failure/model/__init__.py +0 -0
  257. {truss-0.10.9rc535 → truss-0.10.10rc0}/truss/tests/test_data/test_build_commands_failure/model/model.py +0 -0
  258. {truss-0.10.9rc535 → truss-0.10.10rc0}/truss/tests/test_data/test_concurrency_truss/__init__.py +0 -0
  259. {truss-0.10.9rc535 → truss-0.10.10rc0}/truss/tests/test_data/test_concurrency_truss/config.yaml +0 -0
  260. {truss-0.10.9rc535 → truss-0.10.10rc0}/truss/tests/test_data/test_concurrency_truss/model/__init__.py +0 -0
  261. {truss-0.10.9rc535 → truss-0.10.10rc0}/truss/tests/test_data/test_concurrency_truss/model/model.py +0 -0
  262. {truss-0.10.9rc535 → truss-0.10.10rc0}/truss/tests/test_data/test_custom_server_truss/__init__.py +0 -0
  263. {truss-0.10.9rc535 → truss-0.10.10rc0}/truss/tests/test_data/test_custom_server_truss/config.yaml +0 -0
  264. {truss-0.10.9rc535 → truss-0.10.10rc0}/truss/tests/test_data/test_custom_server_truss/test_docker_image/Dockerfile +0 -0
  265. {truss-0.10.9rc535 → truss-0.10.10rc0}/truss/tests/test_data/test_custom_server_truss/test_docker_image/README.md +0 -0
  266. {truss-0.10.9rc535 → truss-0.10.10rc0}/truss/tests/test_data/test_custom_server_truss/test_docker_image/VERSION +0 -0
  267. {truss-0.10.9rc535 → truss-0.10.10rc0}/truss/tests/test_data/test_custom_server_truss/test_docker_image/__init__.py +0 -0
  268. {truss-0.10.9rc535 → truss-0.10.10rc0}/truss/tests/test_data/test_custom_server_truss/test_docker_image/app.py +0 -0
  269. {truss-0.10.9rc535 → truss-0.10.10rc0}/truss/tests/test_data/test_custom_server_truss/test_docker_image/build_upload_new_image.sh +0 -0
  270. {truss-0.10.9rc535 → truss-0.10.10rc0}/truss/tests/test_data/test_env_vars/config.yaml +0 -0
  271. {truss-0.10.9rc535 → truss-0.10.10rc0}/truss/tests/test_data/test_go_custom_server_truss/config.yaml +0 -0
  272. {truss-0.10.9rc535 → truss-0.10.10rc0}/truss/tests/test_data/test_go_custom_server_truss/docker/Dockerfile +0 -0
  273. {truss-0.10.9rc535 → truss-0.10.10rc0}/truss/tests/test_data/test_go_custom_server_truss/docker/README.md +0 -0
  274. {truss-0.10.9rc535 → truss-0.10.10rc0}/truss/tests/test_data/test_go_custom_server_truss/docker/VERSION +0 -0
  275. {truss-0.10.9rc535 → truss-0.10.10rc0}/truss/tests/test_data/test_go_custom_server_truss/docker/build_upload_new_image.sh +0 -0
  276. {truss-0.10.9rc535 → truss-0.10.10rc0}/truss/tests/test_data/test_go_custom_server_truss/docker/main.go +0 -0
  277. {truss-0.10.9rc535 → truss-0.10.10rc0}/truss/tests/test_data/test_openai/__init__.py +0 -0
  278. {truss-0.10.9rc535 → truss-0.10.10rc0}/truss/tests/test_data/test_openai/config.yaml +0 -0
  279. {truss-0.10.9rc535 → truss-0.10.10rc0}/truss/tests/test_data/test_openai/model/__init__.py +0 -0
  280. {truss-0.10.9rc535 → truss-0.10.10rc0}/truss/tests/test_data/test_openai/model/model.py +0 -0
  281. {truss-0.10.9rc535 → truss-0.10.10rc0}/truss/tests/test_data/test_pyantic_v1/__init__.py +0 -0
  282. {truss-0.10.9rc535 → truss-0.10.10rc0}/truss/tests/test_data/test_pyantic_v1/config.yaml +0 -0
  283. {truss-0.10.9rc535 → truss-0.10.10rc0}/truss/tests/test_data/test_pyantic_v1/model/__init__.py +0 -0
  284. {truss-0.10.9rc535 → truss-0.10.10rc0}/truss/tests/test_data/test_pyantic_v1/model/model.py +0 -0
  285. {truss-0.10.9rc535 → truss-0.10.10rc0}/truss/tests/test_data/test_pyantic_v1/requirements.txt +0 -0
  286. {truss-0.10.9rc535 → truss-0.10.10rc0}/truss/tests/test_data/test_pyantic_v2/__init__.py +0 -0
  287. {truss-0.10.9rc535 → truss-0.10.10rc0}/truss/tests/test_data/test_pyantic_v2/config.yaml +0 -0
  288. {truss-0.10.9rc535 → truss-0.10.10rc0}/truss/tests/test_data/test_pyantic_v2/model/__init__.py +0 -0
  289. {truss-0.10.9rc535 → truss-0.10.10rc0}/truss/tests/test_data/test_pyantic_v2/model/model.py +0 -0
  290. {truss-0.10.9rc535 → truss-0.10.10rc0}/truss/tests/test_data/test_pyantic_v2/requirements.txt +0 -0
  291. {truss-0.10.9rc535 → truss-0.10.10rc0}/truss/tests/test_data/test_requirements_file_truss/__init__.py +0 -0
  292. {truss-0.10.9rc535 → truss-0.10.10rc0}/truss/tests/test_data/test_requirements_file_truss/config.yaml +0 -0
  293. {truss-0.10.9rc535 → truss-0.10.10rc0}/truss/tests/test_data/test_requirements_file_truss/model/__init__.py +0 -0
  294. {truss-0.10.9rc535 → truss-0.10.10rc0}/truss/tests/test_data/test_requirements_file_truss/model/model.py +0 -0
  295. {truss-0.10.9rc535 → truss-0.10.10rc0}/truss/tests/test_data/test_requirements_file_truss/requirements.txt +0 -0
  296. {truss-0.10.9rc535 → truss-0.10.10rc0}/truss/tests/test_data/test_streaming_async_generator_truss/__init__.py +0 -0
  297. {truss-0.10.9rc535 → truss-0.10.10rc0}/truss/tests/test_data/test_streaming_async_generator_truss/config.yaml +0 -0
  298. {truss-0.10.9rc535 → truss-0.10.10rc0}/truss/tests/test_data/test_streaming_async_generator_truss/model/__init__.py +0 -0
  299. {truss-0.10.9rc535 → truss-0.10.10rc0}/truss/tests/test_data/test_streaming_async_generator_truss/model/model.py +0 -0
  300. {truss-0.10.9rc535 → truss-0.10.10rc0}/truss/tests/test_data/test_streaming_read_timeout/__init__.py +0 -0
  301. {truss-0.10.9rc535 → truss-0.10.10rc0}/truss/tests/test_data/test_streaming_read_timeout/config.yaml +0 -0
  302. {truss-0.10.9rc535 → truss-0.10.10rc0}/truss/tests/test_data/test_streaming_read_timeout/model/__init__.py +0 -0
  303. {truss-0.10.9rc535 → truss-0.10.10rc0}/truss/tests/test_data/test_streaming_read_timeout/model/model.py +0 -0
  304. {truss-0.10.9rc535 → truss-0.10.10rc0}/truss/tests/test_data/test_streaming_truss/__init__.py +0 -0
  305. {truss-0.10.9rc535 → truss-0.10.10rc0}/truss/tests/test_data/test_streaming_truss/config.yaml +0 -0
  306. {truss-0.10.9rc535 → truss-0.10.10rc0}/truss/tests/test_data/test_streaming_truss/model/__init__.py +0 -0
  307. {truss-0.10.9rc535 → truss-0.10.10rc0}/truss/tests/test_data/test_streaming_truss/model/model.py +0 -0
  308. {truss-0.10.9rc535 → truss-0.10.10rc0}/truss/tests/test_data/test_streaming_truss_with_error/__init__.py +0 -0
  309. {truss-0.10.9rc535 → truss-0.10.10rc0}/truss/tests/test_data/test_streaming_truss_with_error/config.yaml +0 -0
  310. {truss-0.10.9rc535 → truss-0.10.10rc0}/truss/tests/test_data/test_streaming_truss_with_error/model/__init__.py +0 -0
  311. {truss-0.10.9rc535 → truss-0.10.10rc0}/truss/tests/test_data/test_streaming_truss_with_error/model/model.py +0 -0
  312. {truss-0.10.9rc535 → truss-0.10.10rc0}/truss/tests/test_data/test_streaming_truss_with_error/packages/__init__.py +0 -0
  313. {truss-0.10.9rc535 → truss-0.10.10rc0}/truss/tests/test_data/test_streaming_truss_with_error/packages/helpers_1.py +0 -0
  314. {truss-0.10.9rc535 → truss-0.10.10rc0}/truss/tests/test_data/test_streaming_truss_with_error/packages/helpers_2.py +0 -0
  315. {truss-0.10.9rc535 → truss-0.10.10rc0}/truss/tests/test_data/test_streaming_truss_with_tracing/__init__.py +0 -0
  316. {truss-0.10.9rc535 → truss-0.10.10rc0}/truss/tests/test_data/test_streaming_truss_with_tracing/config.yaml +0 -0
  317. {truss-0.10.9rc535 → truss-0.10.10rc0}/truss/tests/test_data/test_streaming_truss_with_tracing/model/__init__.py +0 -0
  318. {truss-0.10.9rc535 → truss-0.10.10rc0}/truss/tests/test_data/test_streaming_truss_with_tracing/model/model.py +0 -0
  319. {truss-0.10.9rc535 → truss-0.10.10rc0}/truss/tests/test_data/test_trt_llm_truss/__init__.py +0 -0
  320. {truss-0.10.9rc535 → truss-0.10.10rc0}/truss/tests/test_data/test_trt_llm_truss/config.yaml +0 -0
  321. {truss-0.10.9rc535 → truss-0.10.10rc0}/truss/tests/test_data/test_trt_llm_truss/model/__init__.py +0 -0
  322. {truss-0.10.9rc535 → truss-0.10.10rc0}/truss/tests/test_data/test_trt_llm_truss/model/model.py +0 -0
  323. {truss-0.10.9rc535 → truss-0.10.10rc0}/truss/tests/test_data/test_truss/__init__.py +0 -0
  324. {truss-0.10.9rc535 → truss-0.10.10rc0}/truss/tests/test_data/test_truss/config.yaml +0 -0
  325. {truss-0.10.9rc535 → truss-0.10.10rc0}/truss/tests/test_data/test_truss/examples.yaml +0 -0
  326. {truss-0.10.9rc535 → truss-0.10.10rc0}/truss/tests/test_data/test_truss/model/__init__.py +0 -0
  327. {truss-0.10.9rc535 → truss-0.10.10rc0}/truss/tests/test_data/test_truss/model/dummy +0 -0
  328. {truss-0.10.9rc535 → truss-0.10.10rc0}/truss/tests/test_data/test_truss/model/model.py +0 -0
  329. {truss-0.10.9rc535 → truss-0.10.10rc0}/truss/tests/test_data/test_truss/packages/__init__.py +0 -0
  330. {truss-0.10.9rc535 → truss-0.10.10rc0}/truss/tests/test_data/test_truss/packages/test_package/__init__.py +0 -0
  331. {truss-0.10.9rc535 → truss-0.10.10rc0}/truss/tests/test_data/test_truss/packages/test_package/test.py +0 -0
  332. {truss-0.10.9rc535 → truss-0.10.10rc0}/truss/tests/test_data/test_truss_server_model_cache_v1/__init__.py +0 -0
  333. {truss-0.10.9rc535 → truss-0.10.10rc0}/truss/tests/test_data/test_truss_server_model_cache_v1/config.yaml +0 -0
  334. {truss-0.10.9rc535 → truss-0.10.10rc0}/truss/tests/test_data/test_truss_server_model_cache_v1/model/__init__.py +0 -0
  335. {truss-0.10.9rc535 → truss-0.10.10rc0}/truss/tests/test_data/test_truss_server_model_cache_v1/model/model.py +0 -0
  336. {truss-0.10.9rc535 → truss-0.10.10rc0}/truss/tests/test_data/test_truss_server_model_cache_v2/__init__.py +0 -0
  337. {truss-0.10.9rc535 → truss-0.10.10rc0}/truss/tests/test_data/test_truss_server_model_cache_v2/config.yaml +0 -0
  338. {truss-0.10.9rc535 → truss-0.10.10rc0}/truss/tests/test_data/test_truss_server_model_cache_v2/model/__init__.py +0 -0
  339. {truss-0.10.9rc535 → truss-0.10.10rc0}/truss/tests/test_data/test_truss_server_model_cache_v2/model/model.py +0 -0
  340. {truss-0.10.9rc535 → truss-0.10.10rc0}/truss/tests/test_data/test_truss_with_error/__init__.py +0 -0
  341. {truss-0.10.9rc535 → truss-0.10.10rc0}/truss/tests/test_data/test_truss_with_error/config.yaml +0 -0
  342. {truss-0.10.9rc535 → truss-0.10.10rc0}/truss/tests/test_data/test_truss_with_error/model/__init__.py +0 -0
  343. {truss-0.10.9rc535 → truss-0.10.10rc0}/truss/tests/test_data/test_truss_with_error/model/model.py +0 -0
  344. {truss-0.10.9rc535 → truss-0.10.10rc0}/truss/tests/test_data/test_truss_with_error/packages/__init__.py +0 -0
  345. {truss-0.10.9rc535 → truss-0.10.10rc0}/truss/tests/test_data/test_truss_with_error/packages/helpers_1.py +0 -0
  346. {truss-0.10.9rc535 → truss-0.10.10rc0}/truss/tests/test_data/test_truss_with_error/packages/helpers_2.py +0 -0
  347. {truss-0.10.9rc535 → truss-0.10.10rc0}/truss/tests/test_docker.py +0 -0
  348. {truss-0.10.9rc535 → truss-0.10.10rc0}/truss/tests/test_model_inference.py +0 -0
  349. {truss-0.10.9rc535 → truss-0.10.10rc0}/truss/tests/test_model_schema.py +0 -0
  350. {truss-0.10.9rc535 → truss-0.10.10rc0}/truss/tests/test_testing_utilities_for_other_tests.py +0 -0
  351. {truss-0.10.9rc535 → truss-0.10.10rc0}/truss/tests/test_truss_gatherer.py +0 -0
  352. {truss-0.10.9rc535 → truss-0.10.10rc0}/truss/tests/test_truss_handle.py +0 -0
  353. {truss-0.10.9rc535 → truss-0.10.10rc0}/truss/tests/test_util.py +0 -0
  354. {truss-0.10.9rc535 → truss-0.10.10rc0}/truss/tests/trt_llm/test_trt_llm_config.py +0 -0
  355. {truss-0.10.9rc535 → truss-0.10.10rc0}/truss/tests/trt_llm/test_validation.py +0 -0
  356. {truss-0.10.9rc535 → truss-0.10.10rc0}/truss/tests/util/test_config_checks.py +0 -0
  357. {truss-0.10.9rc535 → truss-0.10.10rc0}/truss/tests/util/test_env_vars.py +0 -0
  358. {truss-0.10.9rc535 → truss-0.10.10rc0}/truss/tests/util/test_path.py +0 -0
  359. {truss-0.10.9rc535 → truss-0.10.10rc0}/truss/trt_llm/config_checks.py +0 -0
  360. {truss-0.10.9rc535 → truss-0.10.10rc0}/truss/trt_llm/validation.py +0 -0
  361. {truss-0.10.9rc535 → truss-0.10.10rc0}/truss/truss_handle/__init__.py +0 -0
  362. {truss-0.10.9rc535 → truss-0.10.10rc0}/truss/truss_handle/build.py +0 -0
  363. {truss-0.10.9rc535 → truss-0.10.10rc0}/truss/truss_handle/decorators.py +0 -0
  364. {truss-0.10.9rc535 → truss-0.10.10rc0}/truss/truss_handle/patch/__init__.py +0 -0
  365. {truss-0.10.9rc535 → truss-0.10.10rc0}/truss/truss_handle/patch/calc_patch.py +0 -0
  366. {truss-0.10.9rc535 → truss-0.10.10rc0}/truss/truss_handle/patch/constants.py +0 -0
  367. {truss-0.10.9rc535 → truss-0.10.10rc0}/truss/truss_handle/patch/custom_types.py +0 -0
  368. {truss-0.10.9rc535 → truss-0.10.10rc0}/truss/truss_handle/patch/dir_signature.py +0 -0
  369. {truss-0.10.9rc535 → truss-0.10.10rc0}/truss/truss_handle/patch/hash.py +0 -0
  370. {truss-0.10.9rc535 → truss-0.10.10rc0}/truss/truss_handle/patch/local_truss_patch_applier.py +0 -0
  371. {truss-0.10.9rc535 → truss-0.10.10rc0}/truss/truss_handle/patch/signature.py +0 -0
  372. {truss-0.10.9rc535 → truss-0.10.10rc0}/truss/truss_handle/patch/truss_dir_patch_applier.py +0 -0
  373. {truss-0.10.9rc535 → truss-0.10.10rc0}/truss/truss_handle/readme_generator.py +0 -0
  374. {truss-0.10.9rc535 → truss-0.10.10rc0}/truss/truss_handle/truss_gatherer.py +0 -0
  375. {truss-0.10.9rc535 → truss-0.10.10rc0}/truss/truss_handle/truss_handle.py +0 -0
  376. {truss-0.10.9rc535 → truss-0.10.10rc0}/truss/util/.truss_ignore +0 -0
  377. {truss-0.10.9rc535 → truss-0.10.10rc0}/truss/util/docker.py +0 -0
  378. {truss-0.10.9rc535 → truss-0.10.10rc0}/truss/util/download.py +0 -0
  379. {truss-0.10.9rc535 → truss-0.10.10rc0}/truss/util/env_vars.py +0 -0
  380. {truss-0.10.9rc535 → truss-0.10.10rc0}/truss/util/gpu.py +0 -0
  381. {truss-0.10.9rc535 → truss-0.10.10rc0}/truss/util/jinja.py +0 -0
  382. {truss-0.10.9rc535 → truss-0.10.10rc0}/truss/util/log_utils.py +0 -0
  383. {truss-0.10.9rc535 → truss-0.10.10rc0}/truss/util/notebook.py +0 -0
  384. {truss-0.10.9rc535 → truss-0.10.10rc0}/truss/util/path.py +0 -0
  385. {truss-0.10.9rc535 → truss-0.10.10rc0}/truss/util/requirements.py +0 -0
  386. {truss-0.10.9rc535 → truss-0.10.10rc0}/truss/util/user_config.py +0 -0
  387. {truss-0.10.9rc535 → truss-0.10.10rc0}/truss-chains/examples/README.md +0 -0
  388. {truss-0.10.9rc535 → truss-0.10.10rc0}/truss-chains/examples/audio-transcription/README.md +0 -0
  389. {truss-0.10.9rc535 → truss-0.10.10rc0}/truss-chains/examples/rag/README.md +0 -0
  390. {truss-0.10.9rc535 → truss-0.10.10rc0}/truss-chains/tests/itest_chain/requirements.txt +0 -0
  391. {truss-0.10.9rc535 → truss-0.10.10rc0}/truss-chains/truss_chains/__init__.py +0 -0
  392. {truss-0.10.9rc535 → truss-0.10.10rc0}/truss-chains/truss_chains/deployment/__init__.py +0 -0
  393. {truss-0.10.9rc535 → truss-0.10.10rc0}/truss-chains/truss_chains/deployment/code_gen.py +0 -0
  394. {truss-0.10.9rc535 → truss-0.10.10rc0}/truss-chains/truss_chains/deployment/deployment_client.py +0 -0
  395. {truss-0.10.9rc535 → truss-0.10.10rc0}/truss-chains/truss_chains/framework.py +0 -0
  396. {truss-0.10.9rc535 → truss-0.10.10rc0}/truss-chains/truss_chains/private_types.py +0 -0
  397. {truss-0.10.9rc535 → truss-0.10.10rc0}/truss-chains/truss_chains/public_api.py +0 -0
  398. {truss-0.10.9rc535 → truss-0.10.10rc0}/truss-chains/truss_chains/public_types.py +0 -0
  399. {truss-0.10.9rc535 → truss-0.10.10rc0}/truss-chains/truss_chains/py.typed +0 -0
  400. {truss-0.10.9rc535 → truss-0.10.10rc0}/truss-chains/truss_chains/pydantic_numpy.py +0 -0
  401. {truss-0.10.9rc535 → truss-0.10.10rc0}/truss-chains/truss_chains/reference_code/reference_chainlet.py +0 -0
  402. {truss-0.10.9rc535 → truss-0.10.10rc0}/truss-chains/truss_chains/reference_code/reference_model.py +0 -0
  403. {truss-0.10.9rc535 → truss-0.10.10rc0}/truss-chains/truss_chains/remote_chainlet/__init__.py +0 -0
  404. {truss-0.10.9rc535 → truss-0.10.10rc0}/truss-chains/truss_chains/remote_chainlet/model_skeleton.py +0 -0
  405. {truss-0.10.9rc535 → truss-0.10.10rc0}/truss-chains/truss_chains/remote_chainlet/stub.py +0 -0
  406. {truss-0.10.9rc535 → truss-0.10.10rc0}/truss-chains/truss_chains/remote_chainlet/utils.py +0 -0
  407. {truss-0.10.9rc535 → truss-0.10.10rc0}/truss-chains/truss_chains/streaming.py +0 -0
  408. {truss-0.10.9rc535 → truss-0.10.10rc0}/truss-chains/truss_chains/utils.py +0 -0
  409. {truss-0.10.9rc535 → truss-0.10.10rc0}/truss-train/truss_train/__init__.py +0 -0
  410. {truss-0.10.9rc535 → truss-0.10.10rc0}/truss-train/truss_train/public_api.py +0 -0
  411. {truss-0.10.9rc535 → truss-0.10.10rc0}/truss-transfer/README.md +0 -0
  412. {truss-0.10.9rc535 → truss-0.10.10rc0}/truss-transfer/tests/README.md +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: truss
3
- Version: 0.10.9rc535
3
+ Version: 0.10.10rc0
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.27
40
+ Requires-Dist: truss-transfer==0.0.28
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.10.9rc535"
3
+ version = "0.10.10rc0"
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.27",
46
+ "truss-transfer==0.0.28",
47
47
  ]
48
48
 
49
49
  [project.urls]
@@ -78,6 +78,7 @@ dev = [
78
78
  "types-aiofiles>=24.1.0",
79
79
  "types-requests==2.31.0.2",
80
80
  "types-setuptools>=69.0.0.0,<70",
81
+ "types-python-dateutil>=2.9.0.20250822",
81
82
  ]
82
83
  dev-server = [
83
84
  "aiohttp>3.11.13",
@@ -9,7 +9,7 @@ from truss.remote.baseten.api import BasetenApi
9
9
 
10
10
  POLL_INTERVAL_SEC = 2
11
11
  # NB(nikhil): This helps account for (1) log processing delays (2) clock skews
12
- CLOCK_SKEW_BUFFER_MS = 10000
12
+ CLOCK_SKEW_BUFFER_MS = 60000
13
13
 
14
14
 
15
15
  class LogWatcher(ABC):
@@ -33,6 +33,10 @@ from .deploy_lora_checkpoints import (
33
33
  hydrate_lora_checkpoint,
34
34
  render_vllm_lora_truss_config,
35
35
  )
36
+ from .deploy_whisper_checkpoints import (
37
+ hydrate_whisper_checkpoint,
38
+ render_vllm_whisper_truss_config,
39
+ )
36
40
 
37
41
  HF_TOKEN_ENVVAR_NAME = "HF_TOKEN"
38
42
  # If we change this, make sure to update the logic in backend codebase
@@ -178,6 +182,8 @@ def hydrate_checkpoint(
178
182
  return hydrate_lora_checkpoint(job_id, checkpoint_id, checkpoint)
179
183
  elif checkpoint_type.lower() == ModelWeightsFormat.FULL.value:
180
184
  return hydrate_full_checkpoint(job_id, checkpoint_id, checkpoint)
185
+ elif checkpoint_type.lower() == ModelWeightsFormat.WHISPER.value:
186
+ return hydrate_whisper_checkpoint(job_id, checkpoint_id, checkpoint)
181
187
  else:
182
188
  raise ValueError(
183
189
  f"Unsupported checkpoint type: {checkpoint_type}. Contact Baseten for support with other checkpoint types."
@@ -196,6 +202,8 @@ def _render_truss_config_for_checkpoint_deployment(
196
202
  return render_vllm_lora_truss_config(checkpoint_deploy)
197
203
  elif checkpoint_deploy.model_weight_format == ModelWeightsFormat.FULL:
198
204
  return render_vllm_full_truss_config(checkpoint_deploy)
205
+ elif checkpoint_deploy.model_weight_format == ModelWeightsFormat.WHISPER:
206
+ return render_vllm_whisper_truss_config(checkpoint_deploy)
199
207
  else:
200
208
  raise ValueError(
201
209
  f"Unsupported model weight format: {checkpoint_deploy.model_weight_format}. Please upgrade to the latest Truss version to access the latest supported formats. Contact Baseten if you would like us to support additional formats."
@@ -288,18 +296,6 @@ def _get_checkpoint_ids_to_deploy(
288
296
  return checkpoint_ids
289
297
 
290
298
 
291
- def _select_single_checkpoint(checkpoint_id_options: List[str]) -> List[str]:
292
- """Select a single checkpoint using interactive prompt."""
293
- checkpoint_id = inquirer.select(
294
- message="Select the checkpoint to deploy:", choices=checkpoint_id_options
295
- ).execute()
296
-
297
- if not checkpoint_id:
298
- raise click.UsageError("A checkpoint must be selected.")
299
-
300
- return [checkpoint_id]
301
-
302
-
303
299
  def _select_multiple_checkpoints(checkpoint_id_options: List[str]) -> List[str]:
304
300
  """Select multiple checkpoints using interactive checkbox."""
305
301
  checkpoint_ids = inquirer.checkbox(
@@ -351,6 +347,8 @@ def _get_base_model_id(user_input: Optional[str], checkpoint: dict) -> Optional[
351
347
  )
352
348
  elif checkpoint.get("checkpoint_type") == ModelWeightsFormat.FULL.value.lower():
353
349
  return None
350
+ elif checkpoint.get("checkpoint_type") == ModelWeightsFormat.WHISPER.value.lower():
351
+ return None
354
352
  else:
355
353
  base_model_id = inquirer.text(message="Enter the base model id.").execute()
356
354
  if not base_model_id:
@@ -416,18 +414,28 @@ def _validate_selected_checkpoints(
416
414
  "Unable to infer model weight format. Reach out to Baseten for support."
417
415
  )
418
416
 
419
- has_full_checkpoint = any(
420
- response_checkpoints[checkpoint_id].get("checkpoint_type")
421
- == ModelWeightsFormat.FULL.value
422
- for checkpoint_id in checkpoint_ids
423
- )
424
-
425
- if has_full_checkpoint and len(checkpoint_ids) > 1:
426
- # vLLM does not support multiple checkpoints when any checkpoint is full model weights.
427
- raise ValueError(
428
- "Full checkpoints are not supported for multiple checkpoints. Please select a single checkpoint."
417
+ validation_rules = {
418
+ ModelWeightsFormat.FULL.value: {
419
+ "error_message": "Full checkpoints are not supported for multiple checkpoints. Please select a single checkpoint.",
420
+ "reason": "vLLM does not support multiple checkpoints when any checkpoint is full model weights.",
421
+ },
422
+ ModelWeightsFormat.WHISPER.value: {
423
+ "error_message": "Whisper checkpoints are not supported for multiple checkpoints. Please select a single checkpoint.",
424
+ "reason": "vLLM does not support multiple checkpoints when any checkpoint is whisper model weights.",
425
+ },
426
+ }
427
+
428
+ # Check each checkpoint type that has restrictions
429
+ for checkpoint_type, rule in validation_rules.items():
430
+ has_restricted_checkpoint = any(
431
+ response_checkpoints[checkpoint_id].get("checkpoint_type")
432
+ == checkpoint_type
433
+ for checkpoint_id in checkpoint_ids
429
434
  )
430
435
 
436
+ if has_restricted_checkpoint and len(checkpoint_ids) > 1:
437
+ raise ValueError(rule["error_message"])
438
+
431
439
 
432
440
  def get_hf_secret_name(user_input: Union[str, SecretReference, None]) -> str:
433
441
  """Get HuggingFace secret name from user input or prompt for it."""
@@ -3,7 +3,7 @@ from pathlib import Path
3
3
 
4
4
  from truss.base import truss_config
5
5
  from truss.cli.train.types import DeployCheckpointsConfigComplete
6
- from truss_train.definitions import SecretReference
6
+ from truss_train.definitions import ModelWeightsFormat, SecretReference
7
7
 
8
8
  START_COMMAND_ENVVAR_NAME = "BT_DOCKER_SERVER_START_CMD"
9
9
 
@@ -12,8 +12,14 @@ def setup_base_truss_config(
12
12
  checkpoint_deploy: DeployCheckpointsConfigComplete,
13
13
  ) -> truss_config.TrussConfig:
14
14
  """Set up the base truss config with common properties."""
15
+ truss_deploy_config = None
16
+ truss_base_file = (
17
+ "deploy_from_checkpoint_config_whisper.yml"
18
+ if checkpoint_deploy.model_weight_format == ModelWeightsFormat.WHISPER
19
+ else "deploy_from_checkpoint_config.yml"
20
+ )
15
21
  truss_deploy_config = truss_config.TrussConfig.from_yaml(
16
- Path(os.path.dirname(__file__), "..", "deploy_from_checkpoint_config.yml")
22
+ Path(os.path.dirname(__file__), "..", truss_base_file)
17
23
  )
18
24
  if not truss_deploy_config.docker_server:
19
25
  raise ValueError(
@@ -14,12 +14,19 @@ from .deploy_checkpoints_helpers import (
14
14
  setup_environment_variables_and_secrets,
15
15
  )
16
16
 
17
+ # NB(aghilan): Transformers was recently changed to save a chat_template.jinja file instead of inside the tokenizer_config.json file.
18
+ # Old Models will not have this file, so we check for it and use it if it exists.
19
+ # vLLM will not automatically resolve the chat_template.jinja file, so we need to pass it to the start command.
20
+ # This logic is needed for any models trained using Transformers v4.51.3 or later
17
21
  VLLM_FULL_START_COMMAND = Template(
18
- 'sh -c "{%if envvars %}{{ envvars }} {% endif %}vllm serve {{ model_path }}'
19
- + " --port 8000"
20
- + " --tensor-parallel-size {{ specify_tensor_parallelism }}"
21
- + " --dtype bfloat16"
22
- + '"'
22
+ "sh -c '{% if envvars %}{{ envvars }} {% endif %}"
23
+ 'HF_TOKEN="$$(cat /secrets/hf_access_token)" && export HF_TOKEN && '
24
+ "if [ -f {{ model_path }}/chat_template.jinja ]; then "
25
+ " vllm serve {{ model_path }} --chat-template {{ model_path }}/chat_template.jinja "
26
+ " --port 8000 --tensor-parallel-size {{ specify_tensor_parallelism }} --dtype bfloat16; "
27
+ "else "
28
+ " vllm serve {{ model_path }} --port 8000 --tensor-parallel-size {{ specify_tensor_parallelism }} --dtype bfloat16; "
29
+ "fi'"
23
30
  )
24
31
 
25
32
 
@@ -33,7 +40,7 @@ def render_vllm_full_truss_config(
33
40
  truss_deploy_config, checkpoint_deploy
34
41
  )
35
42
 
36
- checkpoint_str = _build_full_checkpoint_string(truss_deploy_config)
43
+ checkpoint_str = build_full_checkpoint_string(truss_deploy_config)
37
44
 
38
45
  accelerator = checkpoint_deploy.compute.accelerator
39
46
 
@@ -64,7 +71,7 @@ def hydrate_full_checkpoint(
64
71
  return FullCheckpoint(training_job_id=job_id, paths=paths)
65
72
 
66
73
 
67
- def _build_full_checkpoint_string(truss_deploy_config) -> str:
74
+ def build_full_checkpoint_string(truss_deploy_config) -> str:
68
75
  """Build checkpoint string from artifact references for full checkpoints.
69
76
 
70
77
  Args:
@@ -0,0 +1,63 @@
1
+ from jinja2 import Template
2
+
3
+ from truss.base import truss_config
4
+ from truss.cli.train.deploy_checkpoints.deploy_checkpoints_helpers import (
5
+ START_COMMAND_ENVVAR_NAME,
6
+ )
7
+ from truss.cli.train.deploy_checkpoints.deploy_full_checkpoints import (
8
+ build_full_checkpoint_string,
9
+ )
10
+ from truss.cli.train.types import DeployCheckpointsConfigComplete
11
+ from truss_train.definitions import WhisperCheckpoint
12
+
13
+ from .deploy_checkpoints_helpers import (
14
+ setup_base_truss_config,
15
+ setup_environment_variables_and_secrets,
16
+ )
17
+
18
+ VLLM_WHISPER_START_COMMAND = Template(
19
+ "sh -c '{% if envvars %}{{ envvars }} {% endif %}"
20
+ 'HF_TOKEN="$$(cat /secrets/hf_access_token)" && export HF_TOKEN && '
21
+ "vllm serve {{ model_path }} --port 8000 --tensor-parallel-size {{ specify_tensor_parallelism }}'"
22
+ )
23
+
24
+
25
+ def render_vllm_whisper_truss_config(
26
+ checkpoint_deploy: DeployCheckpointsConfigComplete,
27
+ ) -> truss_config.TrussConfig:
28
+ """Render truss config specifically for whisper checkpoints using vLLM."""
29
+ truss_deploy_config = setup_base_truss_config(checkpoint_deploy)
30
+
31
+ start_command_envvars = setup_environment_variables_and_secrets(
32
+ truss_deploy_config, checkpoint_deploy
33
+ )
34
+
35
+ checkpoint_str = build_full_checkpoint_string(truss_deploy_config)
36
+
37
+ accelerator = checkpoint_deploy.compute.accelerator
38
+
39
+ start_command_args = {
40
+ "model_path": checkpoint_str,
41
+ "envvars": start_command_envvars,
42
+ "specify_tensor_parallelism": accelerator.count if accelerator else 1,
43
+ }
44
+ # Note: we set the start command as an environment variable in supervisord config.
45
+ # This is so that we don't have to change the supervisord config when the start command changes.
46
+ # Our goal is to reduce the number of times we need to rebuild the image, and allow us to deploy faster.
47
+ start_command = VLLM_WHISPER_START_COMMAND.render(**start_command_args)
48
+ truss_deploy_config.environment_variables[START_COMMAND_ENVVAR_NAME] = start_command
49
+ # Note: supervisord uses the convention %(ENV_VAR_NAME)s to access environment variable VAR_NAME
50
+ truss_deploy_config.docker_server.start_command = ( # type: ignore[union-attr]
51
+ f"%(ENV_{START_COMMAND_ENVVAR_NAME})s"
52
+ )
53
+
54
+ return truss_deploy_config
55
+
56
+
57
+ def hydrate_whisper_checkpoint(
58
+ job_id: str, checkpoint_id: str, checkpoint: dict
59
+ ) -> WhisperCheckpoint:
60
+ """Create a Checkpoint object for whisper model weights."""
61
+ # NOTE: Slash at the end is important since it means the checkpoint is a directory
62
+ paths = [f"rank-0/{checkpoint_id}/"]
63
+ return WhisperCheckpoint(training_job_id=job_id, paths=paths)
@@ -0,0 +1,17 @@
1
+ base_image:
2
+ image: vllm/vllm-openai:latest
3
+
4
+ docker_server:
5
+ start_command: sh -c "" # replaced when deploying
6
+ readiness_endpoint: /health
7
+ liveness_endpoint: /health
8
+ predict_endpoint: /v1/audio/transcriptions
9
+ server_port: 8000
10
+ runtime:
11
+ predict_concurrency : 256
12
+ environment_variables:
13
+ VLLM_LOGGING_LEVEL: WARNING
14
+ VLLM_USE_V1: 0
15
+ HF_HUB_ENABLE_HF_TRANSFER: 1
16
+ requirements:
17
+ - vllm[audio]
@@ -0,0 +1,331 @@
1
+ import signal
2
+ import time
3
+ import traceback
4
+ from typing import Any, Dict, List, Optional, Tuple, cast
5
+
6
+ from rich.columns import Columns
7
+ from rich.layout import Layout
8
+ from rich.live import Live
9
+ from rich.table import Table
10
+ from rich.text import Text
11
+
12
+ from truss.cli.train.poller import TrainingPollerMixin
13
+ from truss.cli.utils import common
14
+ from truss.cli.utils.output import console
15
+ from truss.remote.baseten.api import BasetenApi
16
+
17
+ METRICS_POLL_INTERVAL_SEC = 30
18
+
19
+
20
+ class MetricsWatcher(TrainingPollerMixin):
21
+ live: Optional[Live]
22
+
23
+ def __init__(self, api: BasetenApi, project_id: str, job_id: str):
24
+ super().__init__(api, project_id, job_id)
25
+
26
+ self.live = None
27
+ signal.signal(signal.SIGINT, self._handle_sigint)
28
+
29
+ def _handle_sigint(self, signum: int, frame: Any) -> None:
30
+ if self.live:
31
+ self.live.stop()
32
+ msg = f"\n\nExiting training job metrics. To stop the job, run `truss train stop --job-id {self.job_id}`"
33
+ console.print(msg, style="yellow")
34
+ raise KeyboardInterrupt()
35
+
36
+ def _format_bytes(self, bytes_val: float) -> Tuple[str, str]:
37
+ """Convert bytes to human readable format"""
38
+ color_map = {"MB": "green", "GB": "cyan", "TB": "magenta"}
39
+ unit = "MB"
40
+ if bytes_val > 1024 * 1024 * 1024 * 1024:
41
+ unit = "TB"
42
+ elif bytes_val > 1024 * 1024 * 1024:
43
+ unit = "GB"
44
+
45
+ if unit == "MB":
46
+ return f"{bytes_val / (1024 * 1024):.2f} MB", color_map[unit]
47
+ elif unit == "GB":
48
+ return f"{bytes_val / (1024 * 1024 * 1024):.2f} GB", color_map[unit]
49
+ return f"{bytes_val:.2f} bytes", color_map[unit]
50
+
51
+ def _format_storage_utilization(self, utilization: float) -> Tuple[str, str]:
52
+ percent = round(utilization * 100, 4)
53
+ if percent > 90:
54
+ return f"{percent}%", "red"
55
+ elif percent > 70:
56
+ return f"{percent}%", "yellow"
57
+ return f"{percent}%", "green"
58
+
59
+ def _get_latest_metric(self, metrics: List[Dict]) -> Optional[float]:
60
+ """Get the most recent metric value"""
61
+ if not metrics:
62
+ return None
63
+ return metrics[-1].get("value")
64
+
65
+ def _get_latest_storage_metrics(
66
+ self, storage_data: Optional[Dict[str, List[Dict]]]
67
+ ) -> Optional[Tuple[int, float]]:
68
+ if not storage_data:
69
+ return None
70
+ usage_data = storage_data.get("usage_bytes")
71
+ utilization_data = storage_data.get("utilization")
72
+ if not usage_data or not utilization_data:
73
+ return None
74
+ usage_value = usage_data[-1].get("value", None)
75
+ utilization_value = utilization_data[-1].get("value", None)
76
+ if not usage_value or not utilization_value:
77
+ return None
78
+ return cast(int, usage_value), cast(float, utilization_value)
79
+
80
+ def _maybe_format_storage_table_row(
81
+ self, table: Table, label: str, storage_data: Optional[Dict[str, List[Dict]]]
82
+ ) -> bool:
83
+ if not storage_data:
84
+ return False
85
+ maybe_values = self._get_latest_storage_metrics(storage_data)
86
+ if not maybe_values:
87
+ return False
88
+ raw_usage, raw_utilization = maybe_values
89
+ usage_value, usage_color = self._format_bytes(raw_usage)
90
+ utilization_value, utilization_color = self._format_storage_utilization(
91
+ raw_utilization
92
+ )
93
+ table.add_row(
94
+ label,
95
+ Text(usage_value, style=usage_color),
96
+ Text(utilization_value, style=utilization_color),
97
+ )
98
+ return True
99
+
100
+ def create_metrics_table(self, metrics_data: Dict) -> Layout:
101
+ """Create a Rich table with the metrics"""
102
+ tables = []
103
+
104
+ timestamp = self._get_timestamp_from_metrics(metrics_data)
105
+
106
+ node_tables = self._create_unified_node_metrics_tables(metrics_data)
107
+ tables.extend(node_tables)
108
+
109
+ storage_tables = self._create_storage_tables(metrics_data)
110
+ tables.extend(storage_tables)
111
+
112
+ columns = Columns(tables, title="Training Job Metrics")
113
+
114
+ layout = Layout()
115
+
116
+ if timestamp:
117
+ from rich.panel import Panel
118
+
119
+ layout.split_column(
120
+ Layout(
121
+ Panel(
122
+ f"🕐 Last Updated: {timestamp}\n💡 Press Ctrl+C to exit",
123
+ style="bold cyan",
124
+ ),
125
+ size=4,
126
+ ),
127
+ Layout(columns),
128
+ )
129
+ else:
130
+ layout.split_column(Layout(columns))
131
+
132
+ return layout
133
+
134
+ def _get_timestamp_from_metrics(self, metrics_data: Dict) -> Optional[str]:
135
+ """Extract timestamp from metrics data for display"""
136
+ # Try to get timestamp from per_node_metrics first. Fall back to main metrics if not there.
137
+ per_node_metrics = metrics_data.get("per_node_metrics", [])
138
+ if per_node_metrics and len(per_node_metrics) > 0:
139
+ first_node_metrics = per_node_metrics[0].get("metrics", {})
140
+ cpu_usage_data = first_node_metrics.get("cpu_usage", [])
141
+ if cpu_usage_data and len(cpu_usage_data) > 0:
142
+ timestamp = cpu_usage_data[-1].get("timestamp")
143
+ if timestamp:
144
+ return common.format_localized_time(timestamp)
145
+
146
+ cpu_usage_data = metrics_data.get("cpu_usage", [])
147
+ if cpu_usage_data and len(cpu_usage_data) > 0:
148
+ timestamp = cpu_usage_data[-1].get("timestamp")
149
+ if timestamp:
150
+ return common.format_localized_time(timestamp)
151
+
152
+ return None
153
+
154
+ def _create_unified_node_metrics_tables(self, metrics_data: Dict) -> List[Table]:
155
+ """Create tables for node metrics, handling both single and multi-node scenarios"""
156
+ tables = []
157
+
158
+ per_node_metrics = metrics_data.get("per_node_metrics", [])
159
+
160
+ if not per_node_metrics:
161
+ # Job is likely just starting up - it takes some type for the
162
+ # the metrics to become available after the job starts running.
163
+ from rich.text import Text
164
+
165
+ waiting_table = Table(title="Training Job Status")
166
+ waiting_table.add_column("Status")
167
+ waiting_table.add_column("Message")
168
+
169
+ waiting_table.add_row(
170
+ "Status",
171
+ Text("⏳ Waiting for metrics to become available...", style="yellow"),
172
+ )
173
+ waiting_table.add_row(
174
+ "Note",
175
+ Text(
176
+ "Metrics will appear once the training job starts running.",
177
+ style="dim",
178
+ ),
179
+ )
180
+
181
+ tables.append(waiting_table)
182
+ return tables
183
+
184
+ for node_metrics in per_node_metrics:
185
+ node_id = node_metrics.get("node_id", "Unknown")
186
+ metrics = node_metrics.get("metrics", {})
187
+
188
+ if not metrics:
189
+ continue
190
+
191
+ table = self._create_node_table(node_id, metrics)
192
+ tables.append(table)
193
+
194
+ return tables
195
+
196
+ def _create_node_table(self, node_id: str, metrics: Dict) -> Table:
197
+ """Create a table for a single node's metrics"""
198
+ table = Table(title=f"Node: {node_id}")
199
+ table.add_column("Metric")
200
+ table.add_column("Value")
201
+
202
+ cpu_usage = self._get_latest_metric(metrics.get("cpu_usage", []))
203
+ if cpu_usage is not None:
204
+ table.add_row("CPU usage", f"{cpu_usage:.2f} cores")
205
+
206
+ cpu_memory = self._get_latest_metric(metrics.get("cpu_memory_usage_bytes", []))
207
+ if cpu_memory is not None:
208
+ formatted_value, color = self._format_bytes(cpu_memory)
209
+ table.add_row("CPU memory", Text(formatted_value, style=color))
210
+
211
+ if cpu_usage is not None or cpu_memory is not None:
212
+ table.add_section()
213
+
214
+ gpu_utilization = metrics.get("gpu_utilization", {})
215
+ gpu_memory = metrics.get("gpu_memory_usage_bytes", {})
216
+
217
+ # API should return same GPU IDs for utilization and memory
218
+ keys = gpu_utilization.keys()
219
+ for idx, gpu_id in enumerate(keys):
220
+ latest_util = self._get_latest_metric(gpu_utilization.get(gpu_id, []))
221
+ if latest_util is not None:
222
+ table.add_row(f"GPU {gpu_id} utilization", f"{latest_util * 100:.1f}%")
223
+
224
+ latest_memory = self._get_latest_metric(gpu_memory.get(gpu_id, []))
225
+ if latest_memory is not None:
226
+ formatted_value, color = self._format_bytes(latest_memory)
227
+ table.add_row(
228
+ f"GPU {gpu_id} memory", Text(formatted_value, style=color)
229
+ )
230
+
231
+ if idx != len(keys) - 1:
232
+ table.add_section()
233
+
234
+ ephemeral_storage = metrics.get("ephemeral_storage")
235
+ if ephemeral_storage:
236
+ if gpu_utilization or gpu_memory:
237
+ table.add_section()
238
+
239
+ usage_bytes = self._get_latest_metric(
240
+ ephemeral_storage.get("usage_bytes", [])
241
+ )
242
+ utilization = self._get_latest_metric(
243
+ ephemeral_storage.get("utilization", [])
244
+ )
245
+
246
+ if usage_bytes is not None:
247
+ formatted_value, color = self._format_bytes(usage_bytes)
248
+ table.add_row("Eph. storage usage", Text(formatted_value, style=color))
249
+
250
+ if utilization is not None:
251
+ utilization_percent = utilization * 100
252
+ if utilization_percent > 90:
253
+ color = "red"
254
+ elif utilization_percent > 70:
255
+ color = "yellow"
256
+ else:
257
+ color = "green"
258
+ table.add_row(
259
+ "Eph. storage utilization",
260
+ Text(f"{utilization_percent:.1f}%", style=color),
261
+ )
262
+
263
+ return table
264
+
265
+ def _create_storage_tables(self, metrics_data: Dict) -> List[Table]:
266
+ """Create storage tables - only cache per job (ephemeral is now in node tables)"""
267
+ tables = []
268
+
269
+ # Create cache storage table (job-level, shown once)
270
+ cache_storage = metrics_data.get("cache")
271
+ if cache_storage:
272
+ table = self._create_cache_storage_table(cache_storage)
273
+ if table:
274
+ tables.append(table)
275
+
276
+ return tables
277
+
278
+ def _create_cache_storage_table(self, cache_storage: Dict) -> Optional[Table]:
279
+ """Create table for cache storage metrics (job-level)"""
280
+ usage_bytes = self._get_latest_metric(cache_storage.get("usage_bytes", []))
281
+ utilization = self._get_latest_metric(cache_storage.get("utilization", []))
282
+
283
+ if usage_bytes is None and utilization is None:
284
+ return None
285
+
286
+ table = Table(title="Cache storage")
287
+ table.add_column("Storage Type")
288
+ table.add_column("Usage")
289
+ table.add_column("Utilization")
290
+
291
+ self._maybe_format_storage_table_row(table, "Cache storage", cache_storage)
292
+
293
+ return table
294
+
295
+ def watch(self, refresh_rate: int = METRICS_POLL_INTERVAL_SEC):
296
+ """Display continuously updating metrics"""
297
+ self.before_polling()
298
+ with Live(auto_refresh=False) as live:
299
+ self.live = live
300
+ while True:
301
+ # our first instance of fetching metrics passes no explicit time range. We do this so that we can fetch metrics
302
+ # for inactive jobs, using the job's completion time to set the time range.
303
+ # Subsequent queries will fetch only the most recent data to avoid unnecessary load on VM
304
+ metrics = self.api.get_training_job_metrics(
305
+ self.project_id, self.job_id
306
+ )
307
+ try:
308
+ # range of one minute since we only want the last recording
309
+ table = self.create_metrics_table(metrics)
310
+ live.update(table, refresh=True)
311
+ if not self.should_poll_again():
312
+ live.stop()
313
+ break
314
+ time.sleep(refresh_rate)
315
+ end_epoch_millis = int(time.time() * 1000)
316
+ start_epoch_millis = end_epoch_millis - 60 * 1000
317
+ metrics = self.api.get_training_job_metrics(
318
+ self.project_id,
319
+ self.job_id,
320
+ end_epoch_millis=end_epoch_millis,
321
+ start_epoch_millis=start_epoch_millis,
322
+ )
323
+ self.post_poll()
324
+ except Exception as e:
325
+ live.stop()
326
+ console.print(
327
+ f"Error fetching metrics: {e}: {traceback.format_exc()}",
328
+ style="red",
329
+ )
330
+ break
331
+ self.after_polling()
@@ -13,6 +13,7 @@ from truss.cli.train import common as train_common
13
13
  from truss.cli.train import core
14
14
  from truss.cli.utils import common
15
15
  from truss.cli.utils.output import console, error_console
16
+ from truss.remote.baseten.core import get_training_job_logs_with_pagination
16
17
  from truss.remote.baseten.remote import BasetenRemote
17
18
  from truss.remote.remote_factory import RemoteFactory
18
19
 
@@ -72,8 +73,11 @@ def _prepare_click_context(f: click.Command, params: dict) -> click.Context:
72
73
  @click.argument("config", type=Path, required=True)
73
74
  @click.option("--remote", type=str, required=False, help="Remote to use")
74
75
  @click.option("--tail", is_flag=True, help="Tail for status + logs after push.")
76
+ @click.option("--job-name", type=str, required=False, help="Name of the training job.")
75
77
  @common.common_options()
76
- def push_training_job(config: Path, remote: Optional[str], tail: bool):
78
+ def push_training_job(
79
+ config: Path, remote: Optional[str], tail: bool, job_name: Optional[str]
80
+ ):
77
81
  """Run a training job"""
78
82
  from truss_train import deployment
79
83
 
@@ -84,7 +88,9 @@ def push_training_job(config: Path, remote: Optional[str], tail: bool):
84
88
  remote_provider: BasetenRemote = cast(
85
89
  BasetenRemote, RemoteFactory.create(remote=remote)
86
90
  )
87
- job_resp = deployment.create_training_job_from_file(remote_provider, config)
91
+ job_resp = deployment.create_training_job_from_file(
92
+ remote_provider, config, job_name
93
+ )
88
94
 
89
95
  # Note: This post create logic needs to happen outside the context
90
96
  # of the above context manager, as only one console session can be active
@@ -138,7 +144,9 @@ def get_job_logs(
138
144
  )
139
145
 
140
146
  if not tail:
141
- logs = remote_provider.api.get_training_job_logs(project_id, job_id)
147
+ logs = get_training_job_logs_with_pagination(
148
+ remote_provider.api, project_id, job_id
149
+ )
142
150
  for log in cli_log_utils.parse_logs(logs):
143
151
  cli_log_utils.output_log(log)
144
152
  else: