feat(BA-5389): resolve model definition at revision creation time instead of PROVISIONING#10458
feat(BA-5389): resolve model definition at revision creation time instead of PROVISIONING#10458jopemachine wants to merge 29 commits intomainfrom
Conversation
model_definition into generated model definition
There was a problem hiding this comment.
Pull request overview
This PR ensures deployment revision model_definition stored in the deployment_revisions DB record is merged into the generated model definition during inference session creation, aligning runtime behavior with the intended override precedence.
Changes:
- Added
model_definitiontoModelRevisionSpecand propagated it fromDeploymentRevisionRowinto revision specs. - Updated
ModelDefinitionGeneratorRegistry.generate_model_definition()to merge DBmodel_definitionbefore applying optional storage-file overrides. - Introduced
ModelDefinition.merge()(deep-merge helper) and expanded unit tests to cover DB merge and precedence vs storage overrides.
Reviewed changes
Copilot reviewed 6 out of 6 changed files in this pull request and generated 5 comments.
Show a summary per file
| File | Description |
|---|---|
src/ai/backend/manager/data/deployment/types.py |
Adds model_definition field to revision spec for downstream merging. |
src/ai/backend/manager/models/endpoint/row.py |
Propagates DeploymentRevisionRow.model_definition into ModelRevisionSpec. |
src/ai/backend/manager/sokovan/deployment/definition_generator/registry.py |
Merges DB model_definition into generated definition and reuses ModelDefinition.merge() for storage overrides. |
src/ai/backend/common/config.py |
Adds ModelDefinition.merge() deep-merge helper (and imports deep_merge). |
tests/unit/manager/sokovan/deployment/definition_generator/test_registry.py |
Adds tests/fixtures for DB merge behavior and override precedence. |
changes/10458.feature.md |
Adds changelog entry for the feature. |
💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.
src/ai/backend/manager/sokovan/deployment/definition_generator/registry.py
Outdated
Show resolved
Hide resolved
tests/unit/manager/sokovan/deployment/definition_generator/test_registry.py
Show resolved
Hide resolved
src/ai/backend/manager/sokovan/deployment/definition_generator/registry.py
Outdated
Show resolved
Hide resolved
model_definition into generated model definition
fregataa
left a comment
There was a problem hiding this comment.
- Version annotations are needed
- Does the new model definition value override a stored value or is merged with it? Could you describe how the model definition of model deployment and revision changes after this work?
The system no longer references the vfolder's model definition at the PROVISIONING stage. |
Replace loose Mapping[str, Any] with strongly-typed ModelDefinition across ModelRevisionSpec, DeploymentRevisionCreatorSpec, and merge() signature. Improve field descriptions for clarity per review feedback. Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Move model definition resolution from PROVISIONING (executor) to add_model_revision (service layer). The DB now stores the fully-merged definition so runtime only reads the stored value. - Introduce ModelDefinitionContext as lightweight generator input - Remove generate_model_definition call from executor - Add _resolve_model_definition to DeploymentService - Update all generators to accept ModelDefinitionContext - Inline _build_revision into add_model_revision Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Add gql_added_field with NEXT_RELEASE_VERSION to model_definition fields in CreateRevisionInput and AddRevisionInput, since they were added after the parent type's initial version (25.19.0). Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Co-authored-by: octodog <mu001@lablup.com>
- Make model_definition field optional (None default) across all DTOs, GQL inputs, and ModelRevisionCreator so deployments can be created without providing a model_definition override - Fix unit test failures: add missing model_definition to test helpers, patch _register_endpoint in executor test, fix mypy attr-defined error - Add merge verification unit tests for custom and non-custom variants Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
…e dataclass Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Co-authored-by: octodog <mu001@lablup.com>
- Rename should_fetch to expect_vfolder_fetch for clarity - Extract user override data into fixtures (custom_user_override, vllm_user_override) - Rename test_three_layer_merge to test_vfolder_and_user_override_merged_on_generated_definition Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
…mediate layers Remove = None default from ModelRevisionCreator.model_definition and ModelDefinitionContext.model_definition to force callers to pass it explicitly. API DTO layer retains default=None since users may omit it. Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
- Extract mock_model_definition_generator_registry as a separate fixture - Remove cast(AsyncMock, ...) by using the fixture directly in tests - Remove resolved_model_definition fixture, reuse sample_model_definition - Remove unused cast import Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
…hods Split generate_model_definition() merge steps into _apply_vfolder_override() and _apply_user_override() for readability. Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
…n component test The deployment component test used MagicMock for the generator registry, which cannot be awaited. This caused a TypeError in add_revision flow. Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Remove 32f0e1a3420f which duplicates f5338adb2de1 from main, both merging the same heads (cff56a8381dd, d7879c511ea1). Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
…type Replace _to_deployment_info_legacy fallback (method doesn't exist) with _to_deployment_info_with_revisions([]) empty list fallback. Fix Sequence -> list type for model_revisions parameter. Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
| # Assert - Deployment skipped due to missing revision | ||
| assert len(result.successes) == 0 | ||
| assert len(result.failures) == 0 | ||
| assert len(result.skipped) == 1 |
| assert model.service.start_command == "vfolder-command" | ||
| assert model.service.health_check is not None | ||
| # from vfolder (preserved through user override) | ||
| assert model.service.health_check.initial_delay == 300.0 |
There was a problem hiding this comment.
vllm_vfolder_definition and vllm_user_override share the same start_command and initial_delay fixtures, which leads to weak assertion.
resolves #10457 (BA-5389)
Summary
Move model definition resolution from every PROVISIONING cycle to revision creation time. The DB now stores the fully-resolved definition; PROVISIONING reads it directly without vfolder access.
What changed
DeploymentService._resolve_model_definition()resolves the final definition before creating the revision rowgenerate_model_definition()— uses storedtarget_revision.model_definitiondirectlyModelDefinitionContextreplacesModelRevisionSpecas the generator input (only the fields generators actually need)Mapping[str, Any]→ModelDefinitionstrong typing across revision spec and creatormodel_definitionfield annotated withNEXT_RELEASE_VERSIONMerge priority (applied at revision creation)
enable_model_definition_overrideflag)model_definitionoverride (highest)Not included
The legacy session creation path (
_get_health_check_infoinregistry.py) still reads model definition from vfolder at runtime. This serves the old endpoint system and should be migrated separately.Merge dependency
Checklist: (if applicable)
ai.backend.testdocsdirectory📚 Documentation preview 📚: https://sorna--10458.org.readthedocs.build/en/10458/
📚 Documentation preview 📚: https://sorna-ko--10458.org.readthedocs.build/ko/10458/