isa-model 0.4.0__py3-none-any.whl → 0.4.3__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- isa_model/client.py +466 -43
- isa_model/core/cache/redis_cache.py +12 -3
- isa_model/core/config/config_manager.py +230 -3
- isa_model/core/config.py +90 -0
- isa_model/core/database/direct_db_client.py +114 -0
- isa_model/core/database/migration_manager.py +563 -0
- isa_model/core/database/migrations.py +21 -1
- isa_model/core/database/supabase_client.py +154 -19
- isa_model/core/dependencies.py +316 -0
- isa_model/core/discovery/__init__.py +19 -0
- isa_model/core/discovery/consul_discovery.py +190 -0
- isa_model/core/logging/__init__.py +54 -0
- isa_model/core/logging/influx_logger.py +523 -0
- isa_model/core/logging/loki_logger.py +160 -0
- isa_model/core/models/__init__.py +27 -18
- isa_model/core/models/config_models.py +625 -0
- isa_model/core/models/deployment_billing_tracker.py +430 -0
- isa_model/core/models/model_manager.py +40 -17
- isa_model/core/models/model_metadata.py +690 -0
- isa_model/core/models/model_repo.py +174 -18
- isa_model/core/models/system_models.py +857 -0
- isa_model/core/repositories/__init__.py +9 -0
- isa_model/core/repositories/config_repository.py +912 -0
- isa_model/core/services/intelligent_model_selector.py +399 -21
- isa_model/core/storage/hf_storage.py +1 -1
- isa_model/core/types.py +1 -0
- isa_model/deployment/__init__.py +5 -48
- isa_model/deployment/core/__init__.py +2 -31
- isa_model/deployment/core/deployment_manager.py +1278 -370
- isa_model/deployment/local/__init__.py +31 -0
- isa_model/deployment/local/config.py +248 -0
- isa_model/deployment/local/gpu_gateway.py +607 -0
- isa_model/deployment/local/health_checker.py +428 -0
- isa_model/deployment/local/provider.py +586 -0
- isa_model/deployment/local/tensorrt_service.py +621 -0
- isa_model/deployment/local/transformers_service.py +644 -0
- isa_model/deployment/local/vllm_service.py +527 -0
- isa_model/deployment/modal/__init__.py +8 -0
- isa_model/deployment/modal/config.py +136 -0
- isa_model/deployment/{services/auto_hf_modal_deployer.py → modal/deployer.py} +1 -1
- isa_model/deployment/modal/services/__init__.py +3 -0
- isa_model/deployment/modal/services/audio/__init__.py +1 -0
- isa_model/deployment/modal/services/embedding/__init__.py +1 -0
- isa_model/deployment/modal/services/llm/__init__.py +1 -0
- isa_model/deployment/modal/services/llm/isa_llm_service.py +424 -0
- isa_model/deployment/modal/services/video/__init__.py +1 -0
- isa_model/deployment/modal/services/vision/__init__.py +1 -0
- isa_model/deployment/models/org-org-acme-corp-tenant-a-service-llm-20250825-225822/tenant-a-service_modal_service.py +48 -0
- isa_model/deployment/models/org-test-org-123-prefix-test-service-llm-20250825-225822/prefix-test-service_modal_service.py +48 -0
- isa_model/deployment/models/test-llm-service-llm-20250825-204442/test-llm-service_modal_service.py +48 -0
- isa_model/deployment/models/test-monitoring-gpt2-llm-20250825-212906/test-monitoring-gpt2_modal_service.py +48 -0
- isa_model/deployment/models/test-monitoring-gpt2-llm-20250825-213009/test-monitoring-gpt2_modal_service.py +48 -0
- isa_model/deployment/storage/__init__.py +5 -0
- isa_model/deployment/storage/deployment_repository.py +824 -0
- isa_model/deployment/triton/__init__.py +10 -0
- isa_model/deployment/triton/config.py +196 -0
- isa_model/deployment/triton/configs/__init__.py +1 -0
- isa_model/deployment/triton/provider.py +512 -0
- isa_model/deployment/triton/scripts/__init__.py +1 -0
- isa_model/deployment/triton/templates/__init__.py +1 -0
- isa_model/inference/__init__.py +47 -1
- isa_model/inference/ai_factory.py +137 -10
- isa_model/inference/legacy_services/__init__.py +21 -0
- isa_model/inference/legacy_services/model_evaluation.py +637 -0
- isa_model/inference/legacy_services/model_service.py +573 -0
- isa_model/inference/legacy_services/model_serving.py +717 -0
- isa_model/inference/legacy_services/model_training.py +561 -0
- isa_model/inference/models/__init__.py +21 -0
- isa_model/inference/models/inference_config.py +551 -0
- isa_model/inference/models/inference_record.py +675 -0
- isa_model/inference/models/performance_models.py +714 -0
- isa_model/inference/repositories/__init__.py +9 -0
- isa_model/inference/repositories/inference_repository.py +828 -0
- isa_model/inference/services/audio/base_stt_service.py +184 -11
- isa_model/inference/services/audio/openai_stt_service.py +22 -6
- isa_model/inference/services/custom_model_manager.py +277 -0
- isa_model/inference/services/embedding/ollama_embed_service.py +15 -3
- isa_model/inference/services/embedding/resilient_embed_service.py +285 -0
- isa_model/inference/services/llm/__init__.py +10 -2
- isa_model/inference/services/llm/base_llm_service.py +335 -24
- isa_model/inference/services/llm/cerebras_llm_service.py +628 -0
- isa_model/inference/services/llm/helpers/llm_adapter.py +9 -4
- isa_model/inference/services/llm/helpers/llm_prompts.py +342 -0
- isa_model/inference/services/llm/helpers/llm_utils.py +321 -23
- isa_model/inference/services/llm/huggingface_llm_service.py +581 -0
- isa_model/inference/services/llm/local_llm_service.py +747 -0
- isa_model/inference/services/llm/ollama_llm_service.py +9 -2
- isa_model/inference/services/llm/openai_llm_service.py +33 -16
- isa_model/inference/services/llm/yyds_llm_service.py +8 -2
- isa_model/inference/services/vision/__init__.py +22 -1
- isa_model/inference/services/vision/blip_vision_service.py +359 -0
- isa_model/inference/services/vision/helpers/image_utils.py +8 -5
- isa_model/inference/services/vision/isa_vision_service.py +65 -4
- isa_model/inference/services/vision/openai_vision_service.py +19 -10
- isa_model/inference/services/vision/vgg16_vision_service.py +257 -0
- isa_model/serving/api/cache_manager.py +245 -0
- isa_model/serving/api/dependencies/__init__.py +1 -0
- isa_model/serving/api/dependencies/auth.py +194 -0
- isa_model/serving/api/dependencies/database.py +139 -0
- isa_model/serving/api/error_handlers.py +284 -0
- isa_model/serving/api/fastapi_server.py +172 -22
- isa_model/serving/api/middleware/auth.py +8 -2
- isa_model/serving/api/middleware/security.py +23 -33
- isa_model/serving/api/middleware/tenant_context.py +414 -0
- isa_model/serving/api/routes/analytics.py +4 -1
- isa_model/serving/api/routes/config.py +645 -0
- isa_model/serving/api/routes/deployment_billing.py +315 -0
- isa_model/serving/api/routes/deployments.py +138 -2
- isa_model/serving/api/routes/gpu_gateway.py +440 -0
- isa_model/serving/api/routes/health.py +32 -12
- isa_model/serving/api/routes/inference_monitoring.py +486 -0
- isa_model/serving/api/routes/local_deployments.py +448 -0
- isa_model/serving/api/routes/tenants.py +575 -0
- isa_model/serving/api/routes/unified.py +680 -18
- isa_model/serving/api/routes/webhooks.py +479 -0
- isa_model/serving/api/startup.py +68 -54
- isa_model/utils/gpu_utils.py +311 -0
- {isa_model-0.4.0.dist-info → isa_model-0.4.3.dist-info}/METADATA +66 -24
- isa_model-0.4.3.dist-info/RECORD +193 -0
- isa_model/core/storage/minio_storage.py +0 -0
- isa_model/deployment/cloud/__init__.py +0 -9
- isa_model/deployment/cloud/modal/__init__.py +0 -10
- isa_model/deployment/core/deployment_config.py +0 -356
- isa_model/deployment/core/isa_deployment_service.py +0 -401
- isa_model/deployment/gpu_int8_ds8/app/server.py +0 -66
- isa_model/deployment/gpu_int8_ds8/scripts/test_client.py +0 -43
- isa_model/deployment/gpu_int8_ds8/scripts/test_client_os.py +0 -35
- isa_model/deployment/runtime/deployed_service.py +0 -338
- isa_model/deployment/services/__init__.py +0 -9
- isa_model/deployment/services/auto_deploy_vision_service.py +0 -538
- isa_model/deployment/services/model_service.py +0 -332
- isa_model/deployment/services/service_monitor.py +0 -356
- isa_model/deployment/services/service_registry.py +0 -527
- isa_model/eval/__init__.py +0 -92
- isa_model/eval/benchmarks/__init__.py +0 -27
- isa_model/eval/benchmarks/multimodal_datasets.py +0 -460
- isa_model/eval/benchmarks.py +0 -701
- isa_model/eval/config/__init__.py +0 -10
- isa_model/eval/config/evaluation_config.py +0 -108
- isa_model/eval/evaluators/__init__.py +0 -24
- isa_model/eval/evaluators/audio_evaluator.py +0 -727
- isa_model/eval/evaluators/base_evaluator.py +0 -503
- isa_model/eval/evaluators/embedding_evaluator.py +0 -742
- isa_model/eval/evaluators/llm_evaluator.py +0 -472
- isa_model/eval/evaluators/vision_evaluator.py +0 -564
- isa_model/eval/example_evaluation.py +0 -395
- isa_model/eval/factory.py +0 -798
- isa_model/eval/infrastructure/__init__.py +0 -24
- isa_model/eval/infrastructure/experiment_tracker.py +0 -466
- isa_model/eval/isa_benchmarks.py +0 -700
- isa_model/eval/isa_integration.py +0 -582
- isa_model/eval/metrics.py +0 -951
- isa_model/eval/tests/unit/test_basic.py +0 -396
- isa_model/serving/api/routes/evaluations.py +0 -579
- isa_model/training/__init__.py +0 -168
- isa_model/training/annotation/annotation_schema.py +0 -47
- isa_model/training/annotation/processors/annotation_processor.py +0 -126
- isa_model/training/annotation/storage/dataset_manager.py +0 -131
- isa_model/training/annotation/storage/dataset_schema.py +0 -44
- isa_model/training/annotation/tests/test_annotation_flow.py +0 -109
- isa_model/training/annotation/tests/test_minio copy.py +0 -113
- isa_model/training/annotation/tests/test_minio_upload.py +0 -43
- isa_model/training/annotation/views/annotation_controller.py +0 -158
- isa_model/training/cloud/__init__.py +0 -22
- isa_model/training/cloud/job_orchestrator.py +0 -402
- isa_model/training/cloud/runpod_trainer.py +0 -454
- isa_model/training/cloud/storage_manager.py +0 -482
- isa_model/training/core/__init__.py +0 -26
- isa_model/training/core/config.py +0 -181
- isa_model/training/core/dataset.py +0 -222
- isa_model/training/core/trainer.py +0 -720
- isa_model/training/core/utils.py +0 -213
- isa_model/training/examples/intelligent_training_example.py +0 -281
- isa_model/training/factory.py +0 -424
- isa_model/training/intelligent/__init__.py +0 -25
- isa_model/training/intelligent/decision_engine.py +0 -643
- isa_model/training/intelligent/intelligent_factory.py +0 -888
- isa_model/training/intelligent/knowledge_base.py +0 -751
- isa_model/training/intelligent/resource_optimizer.py +0 -839
- isa_model/training/intelligent/task_classifier.py +0 -576
- isa_model/training/storage/__init__.py +0 -24
- isa_model/training/storage/core_integration.py +0 -439
- isa_model/training/storage/training_repository.py +0 -552
- isa_model/training/storage/training_storage.py +0 -628
- isa_model-0.4.0.dist-info/RECORD +0 -182
- /isa_model/deployment/{cloud/modal → modal/services/audio}/isa_audio_chatTTS_service.py +0 -0
- /isa_model/deployment/{cloud/modal → modal/services/audio}/isa_audio_fish_service.py +0 -0
- /isa_model/deployment/{cloud/modal → modal/services/audio}/isa_audio_openvoice_service.py +0 -0
- /isa_model/deployment/{cloud/modal → modal/services/audio}/isa_audio_service_v2.py +0 -0
- /isa_model/deployment/{cloud/modal → modal/services/embedding}/isa_embed_rerank_service.py +0 -0
- /isa_model/deployment/{cloud/modal → modal/services/video}/isa_video_hunyuan_service.py +0 -0
- /isa_model/deployment/{cloud/modal → modal/services/vision}/isa_vision_ocr_service.py +0 -0
- /isa_model/deployment/{cloud/modal → modal/services/vision}/isa_vision_qwen25_service.py +0 -0
- /isa_model/deployment/{cloud/modal → modal/services/vision}/isa_vision_table_service.py +0 -0
- /isa_model/deployment/{cloud/modal → modal/services/vision}/isa_vision_ui_service.py +0 -0
- /isa_model/deployment/{cloud/modal → modal/services/vision}/isa_vision_ui_service_optimized.py +0 -0
- /isa_model/deployment/{services → modal/services/vision}/simple_auto_deploy_vision_service.py +0 -0
- {isa_model-0.4.0.dist-info → isa_model-0.4.3.dist-info}/WHEEL +0 -0
- {isa_model-0.4.0.dist-info → isa_model-0.4.3.dist-info}/top_level.txt +0 -0
@@ -1,439 +0,0 @@
|
|
1
|
-
"""
|
2
|
-
Training-Core Integration Layer
|
3
|
-
|
4
|
-
This module provides seamless integration between the training module
|
5
|
-
and the core model management system, ensuring:
|
6
|
-
- Trained models are automatically registered in Core ModelManager
|
7
|
-
- Training costs are tracked through Core billing system
|
8
|
-
- Model lifecycle is managed consistently
|
9
|
-
- No duplication of model metadata
|
10
|
-
"""
|
11
|
-
|
12
|
-
import logging
|
13
|
-
from typing import Dict, Optional, Any, List
|
14
|
-
from datetime import datetime
|
15
|
-
from pathlib import Path
|
16
|
-
|
17
|
-
try:
|
18
|
-
from ...core.models.model_manager import ModelManager
|
19
|
-
from ...core.models.model_repo import ModelType, ModelCapability
|
20
|
-
from ...core.models.model_billing_tracker import ModelBillingTracker, ModelOperationType
|
21
|
-
from ...core.models.model_statistics_tracker import ModelStatisticsTracker
|
22
|
-
CORE_AVAILABLE = True
|
23
|
-
except ImportError:
|
24
|
-
CORE_AVAILABLE = False
|
25
|
-
|
26
|
-
from .training_storage import TrainingStorage, TrainingJobRecord
|
27
|
-
|
28
|
-
logger = logging.getLogger(__name__)
|
29
|
-
|
30
|
-
|
31
|
-
class CoreModelIntegration:
|
32
|
-
"""
|
33
|
-
Integration layer between training and core model management.
|
34
|
-
|
35
|
-
This class ensures that:
|
36
|
-
1. Trained models are registered in the core ModelManager
|
37
|
-
2. Training costs are tracked through the core billing system
|
38
|
-
3. Model metadata is kept consistent between training and core
|
39
|
-
4. Training metrics are available in the core statistics system
|
40
|
-
|
41
|
-
Example:
|
42
|
-
```python
|
43
|
-
integration = CoreModelIntegration()
|
44
|
-
|
45
|
-
# After training completion
|
46
|
-
integration.register_trained_model(
|
47
|
-
job_record=training_job,
|
48
|
-
model_path="/path/to/trained/model",
|
49
|
-
performance_metrics={"accuracy": 0.95}
|
50
|
-
)
|
51
|
-
|
52
|
-
# This will:
|
53
|
-
# 1. Register model in CoreModelManager
|
54
|
-
# 2. Record training costs in billing tracker
|
55
|
-
# 3. Update model statistics
|
56
|
-
# 4. Link training job to core model record
|
57
|
-
```
|
58
|
-
"""
|
59
|
-
|
60
|
-
def __init__(self,
|
61
|
-
model_manager: Optional[ModelManager] = None,
|
62
|
-
training_storage: Optional[TrainingStorage] = None):
|
63
|
-
"""
|
64
|
-
Initialize core integration.
|
65
|
-
|
66
|
-
Args:
|
67
|
-
model_manager: Core model manager instance
|
68
|
-
training_storage: Training storage instance
|
69
|
-
"""
|
70
|
-
self.core_available = CORE_AVAILABLE
|
71
|
-
|
72
|
-
if self.core_available:
|
73
|
-
self.model_manager = model_manager or ModelManager()
|
74
|
-
self.billing_tracker = self.model_manager.billing_tracker
|
75
|
-
self.statistics_tracker = self.model_manager.statistics_tracker
|
76
|
-
self.model_registry = self.model_manager.registry
|
77
|
-
else:
|
78
|
-
logger.warning("Core model management not available")
|
79
|
-
self.model_manager = None
|
80
|
-
self.billing_tracker = None
|
81
|
-
self.statistics_tracker = None
|
82
|
-
self.model_registry = None
|
83
|
-
|
84
|
-
self.training_storage = training_storage or TrainingStorage()
|
85
|
-
|
86
|
-
logger.info(f"Core integration initialized (Core available: {self.core_available})")
|
87
|
-
|
88
|
-
def register_trained_model(
|
89
|
-
self,
|
90
|
-
job_record: TrainingJobRecord,
|
91
|
-
model_path: str,
|
92
|
-
performance_metrics: Optional[Dict[str, float]] = None,
|
93
|
-
model_size_mb: Optional[float] = None
|
94
|
-
) -> Optional[str]:
|
95
|
-
"""
|
96
|
-
Register a trained model in the core system.
|
97
|
-
|
98
|
-
Args:
|
99
|
-
job_record: Training job record
|
100
|
-
model_path: Path to the trained model
|
101
|
-
performance_metrics: Model performance metrics
|
102
|
-
model_size_mb: Model size in MB
|
103
|
-
|
104
|
-
Returns:
|
105
|
-
Core model ID if successful, None otherwise
|
106
|
-
"""
|
107
|
-
if not self.core_available:
|
108
|
-
logger.warning("Core integration not available, skipping model registration")
|
109
|
-
return None
|
110
|
-
|
111
|
-
try:
|
112
|
-
# Determine model type based on task
|
113
|
-
model_type = self._get_model_type_from_task(job_record.task_type)
|
114
|
-
|
115
|
-
# Determine capabilities
|
116
|
-
capabilities = self._get_capabilities_from_task(job_record.task_type, job_record.domain)
|
117
|
-
|
118
|
-
# Create model metadata
|
119
|
-
model_metadata = {
|
120
|
-
"base_model": job_record.base_model,
|
121
|
-
"training_job_id": job_record.job_id,
|
122
|
-
"task_type": job_record.task_type,
|
123
|
-
"domain": job_record.domain,
|
124
|
-
"dataset_source": job_record.dataset_source,
|
125
|
-
"training_config": job_record.training_config,
|
126
|
-
"performance_metrics": performance_metrics or {},
|
127
|
-
"trained_at": job_record.completed_at.isoformat() if job_record.completed_at else None,
|
128
|
-
"training_cost": sum(job_record.cost_breakdown.values()) if job_record.cost_breakdown else None,
|
129
|
-
"model_size_mb": model_size_mb
|
130
|
-
}
|
131
|
-
|
132
|
-
# Generate model name
|
133
|
-
model_name = self._generate_model_name(job_record)
|
134
|
-
|
135
|
-
# Register model in core registry
|
136
|
-
success = self.model_registry.register_model(
|
137
|
-
model_id=model_name,
|
138
|
-
model_type=model_type,
|
139
|
-
capabilities=capabilities,
|
140
|
-
metadata=model_metadata,
|
141
|
-
local_path=model_path
|
142
|
-
)
|
143
|
-
|
144
|
-
if success:
|
145
|
-
logger.info(f"Successfully registered trained model: {model_name}")
|
146
|
-
|
147
|
-
# Update training job with core model ID
|
148
|
-
self.training_storage.update_training_job(
|
149
|
-
job_record.job_id,
|
150
|
-
{"core_model_id": model_name}
|
151
|
-
)
|
152
|
-
|
153
|
-
# Record training costs
|
154
|
-
self._record_training_costs(job_record, model_name)
|
155
|
-
|
156
|
-
# Update statistics
|
157
|
-
self._update_model_statistics(job_record, model_name, performance_metrics)
|
158
|
-
|
159
|
-
return model_name
|
160
|
-
else:
|
161
|
-
logger.error("Failed to register model in core registry")
|
162
|
-
return None
|
163
|
-
|
164
|
-
except Exception as e:
|
165
|
-
logger.error(f"Failed to register trained model: {e}")
|
166
|
-
return None
|
167
|
-
|
168
|
-
def sync_training_knowledge_to_core(self) -> bool:
|
169
|
-
"""
|
170
|
-
Sync training knowledge base data to core model registry.
|
171
|
-
|
172
|
-
This helps keep the core system updated with training capabilities
|
173
|
-
and model information discovered through intelligent training.
|
174
|
-
|
175
|
-
Returns:
|
176
|
-
True if successful
|
177
|
-
"""
|
178
|
-
if not self.core_available:
|
179
|
-
return False
|
180
|
-
|
181
|
-
try:
|
182
|
-
# Import training knowledge base
|
183
|
-
from ..intelligent.knowledge_base import KnowledgeBase
|
184
|
-
|
185
|
-
kb = KnowledgeBase()
|
186
|
-
|
187
|
-
# Sync model specifications
|
188
|
-
synced_count = 0
|
189
|
-
for model_name, model_spec in kb.models.items():
|
190
|
-
try:
|
191
|
-
# Convert training model spec to core format
|
192
|
-
model_type = self._convert_model_type(model_spec.model_type)
|
193
|
-
capabilities = self._convert_capabilities(model_spec.supported_tasks)
|
194
|
-
|
195
|
-
metadata = {
|
196
|
-
"source": "training_knowledge_base",
|
197
|
-
"parameters": model_spec.parameters,
|
198
|
-
"context_length": model_spec.context_length,
|
199
|
-
"supported_tasks": model_spec.supported_tasks,
|
200
|
-
"supported_domains": model_spec.supported_domains,
|
201
|
-
"quality_score": model_spec.quality_score,
|
202
|
-
"efficiency_score": model_spec.efficiency_score,
|
203
|
-
"is_popular": model_spec.is_popular,
|
204
|
-
"description": model_spec.description,
|
205
|
-
"synced_at": datetime.now().isoformat()
|
206
|
-
}
|
207
|
-
|
208
|
-
# Only register if not already exists
|
209
|
-
existing = self.model_registry.get_model_by_id(model_name)
|
210
|
-
if not existing:
|
211
|
-
success = self.model_registry.register_model(
|
212
|
-
model_id=model_name,
|
213
|
-
model_type=model_type,
|
214
|
-
capabilities=capabilities,
|
215
|
-
metadata=metadata
|
216
|
-
)
|
217
|
-
if success:
|
218
|
-
synced_count += 1
|
219
|
-
|
220
|
-
except Exception as e:
|
221
|
-
logger.warning(f"Failed to sync model {model_name}: {e}")
|
222
|
-
continue
|
223
|
-
|
224
|
-
logger.info(f"Synced {synced_count} models from training knowledge base to core")
|
225
|
-
return True
|
226
|
-
|
227
|
-
except Exception as e:
|
228
|
-
logger.error(f"Failed to sync training knowledge to core: {e}")
|
229
|
-
return False
|
230
|
-
|
231
|
-
def get_core_model_for_training(self, base_model: str) -> Optional[Dict[str, Any]]:
|
232
|
-
"""
|
233
|
-
Get core model information for a base model used in training.
|
234
|
-
|
235
|
-
Args:
|
236
|
-
base_model: Base model identifier
|
237
|
-
|
238
|
-
Returns:
|
239
|
-
Core model information if available
|
240
|
-
"""
|
241
|
-
if not self.core_available:
|
242
|
-
return None
|
243
|
-
|
244
|
-
try:
|
245
|
-
return self.model_registry.get_model_by_id(base_model)
|
246
|
-
except Exception as e:
|
247
|
-
logger.error(f"Failed to get core model info for {base_model}: {e}")
|
248
|
-
return None
|
249
|
-
|
250
|
-
def get_training_history_for_model(self, model_id: str) -> List[TrainingJobRecord]:
|
251
|
-
"""
|
252
|
-
Get training history for a specific model.
|
253
|
-
|
254
|
-
Args:
|
255
|
-
model_id: Model identifier
|
256
|
-
|
257
|
-
Returns:
|
258
|
-
List of training job records
|
259
|
-
"""
|
260
|
-
try:
|
261
|
-
# Search for training jobs that produced this model
|
262
|
-
all_jobs = self.training_storage.list_training_jobs(limit=1000)
|
263
|
-
|
264
|
-
model_training_jobs = []
|
265
|
-
for job in all_jobs:
|
266
|
-
# Check if this job produced the model
|
267
|
-
if (hasattr(job, 'core_model_id') and job.core_model_id == model_id) or \
|
268
|
-
job.base_model == model_id:
|
269
|
-
model_training_jobs.append(job)
|
270
|
-
|
271
|
-
return model_training_jobs
|
272
|
-
|
273
|
-
except Exception as e:
|
274
|
-
logger.error(f"Failed to get training history for model {model_id}: {e}")
|
275
|
-
return []
|
276
|
-
|
277
|
-
def calculate_model_training_cost(self, model_id: str) -> Optional[float]:
|
278
|
-
"""
|
279
|
-
Calculate total training cost for a model.
|
280
|
-
|
281
|
-
Args:
|
282
|
-
model_id: Model identifier
|
283
|
-
|
284
|
-
Returns:
|
285
|
-
Total training cost in USD
|
286
|
-
"""
|
287
|
-
try:
|
288
|
-
training_jobs = self.get_training_history_for_model(model_id)
|
289
|
-
|
290
|
-
total_cost = 0.0
|
291
|
-
for job in training_jobs:
|
292
|
-
if job.cost_breakdown:
|
293
|
-
total_cost += sum(job.cost_breakdown.values())
|
294
|
-
|
295
|
-
return total_cost if total_cost > 0 else None
|
296
|
-
|
297
|
-
except Exception as e:
|
298
|
-
logger.error(f"Failed to calculate training cost for model {model_id}: {e}")
|
299
|
-
return None
|
300
|
-
|
301
|
-
def _get_model_type_from_task(self, task_type: str) -> ModelType:
|
302
|
-
"""Convert training task type to core model type."""
|
303
|
-
task_to_type_map = {
|
304
|
-
"chat": ModelType.CHAT,
|
305
|
-
"classification": ModelType.CLASSIFICATION,
|
306
|
-
"generation": ModelType.GENERATION,
|
307
|
-
"summarization": ModelType.SUMMARIZATION,
|
308
|
-
"translation": ModelType.TRANSLATION,
|
309
|
-
"code": ModelType.CODE_GENERATION,
|
310
|
-
"image_generation": ModelType.IMAGE_GENERATION
|
311
|
-
}
|
312
|
-
|
313
|
-
return task_to_type_map.get(task_type, ModelType.CHAT)
|
314
|
-
|
315
|
-
def _get_capabilities_from_task(self, task_type: str, domain: str) -> List[ModelCapability]:
|
316
|
-
"""Determine model capabilities from task and domain."""
|
317
|
-
capabilities = []
|
318
|
-
|
319
|
-
# Task-based capabilities
|
320
|
-
if task_type in ["chat", "generation"]:
|
321
|
-
capabilities.append(ModelCapability.TEXT_GENERATION)
|
322
|
-
if task_type == "classification":
|
323
|
-
capabilities.append(ModelCapability.TEXT_CLASSIFICATION)
|
324
|
-
if task_type == "summarization":
|
325
|
-
capabilities.append(ModelCapability.SUMMARIZATION)
|
326
|
-
if task_type == "translation":
|
327
|
-
capabilities.append(ModelCapability.TRANSLATION)
|
328
|
-
if task_type == "code":
|
329
|
-
capabilities.append(ModelCapability.CODE_GENERATION)
|
330
|
-
|
331
|
-
# Domain-based capabilities
|
332
|
-
if domain == "medical":
|
333
|
-
capabilities.append(ModelCapability.DOMAIN_SPECIFIC)
|
334
|
-
if domain in ["legal", "financial", "technical"]:
|
335
|
-
capabilities.append(ModelCapability.DOMAIN_SPECIFIC)
|
336
|
-
|
337
|
-
return capabilities
|
338
|
-
|
339
|
-
def _generate_model_name(self, job_record: TrainingJobRecord) -> str:
|
340
|
-
"""Generate a unique model name for core registration."""
|
341
|
-
base_name = job_record.base_model.split("/")[-1] if "/" in job_record.base_model else job_record.base_model
|
342
|
-
timestamp = job_record.created_at.strftime("%Y%m%d_%H%M%S")
|
343
|
-
task = job_record.task_type
|
344
|
-
domain = job_record.domain
|
345
|
-
|
346
|
-
return f"{base_name}_{task}_{domain}_{timestamp}"
|
347
|
-
|
348
|
-
def _record_training_costs(self, job_record: TrainingJobRecord, model_name: str) -> None:
|
349
|
-
"""Record training costs in the core billing system."""
|
350
|
-
if not self.billing_tracker or not job_record.cost_breakdown:
|
351
|
-
return
|
352
|
-
|
353
|
-
try:
|
354
|
-
total_cost = sum(job_record.cost_breakdown.values())
|
355
|
-
|
356
|
-
# Record training operation cost
|
357
|
-
self.billing_tracker.record_operation(
|
358
|
-
model_id=model_name,
|
359
|
-
operation_type=ModelOperationType.TRAINING,
|
360
|
-
cost=total_cost,
|
361
|
-
metadata={
|
362
|
-
"training_job_id": job_record.job_id,
|
363
|
-
"base_model": job_record.base_model,
|
364
|
-
"task_type": job_record.task_type,
|
365
|
-
"cost_breakdown": job_record.cost_breakdown,
|
366
|
-
"training_duration": str(job_record.completed_at - job_record.started_at) if job_record.completed_at and job_record.started_at else None
|
367
|
-
}
|
368
|
-
)
|
369
|
-
|
370
|
-
logger.info(f"Recorded training cost ${total_cost:.2f} for model {model_name}")
|
371
|
-
|
372
|
-
except Exception as e:
|
373
|
-
logger.error(f"Failed to record training costs: {e}")
|
374
|
-
|
375
|
-
def _update_model_statistics(
|
376
|
-
self,
|
377
|
-
job_record: TrainingJobRecord,
|
378
|
-
model_name: str,
|
379
|
-
performance_metrics: Optional[Dict[str, float]]
|
380
|
-
) -> None:
|
381
|
-
"""Update model statistics in the core system."""
|
382
|
-
if not self.statistics_tracker:
|
383
|
-
return
|
384
|
-
|
385
|
-
try:
|
386
|
-
# Record training completion
|
387
|
-
self.statistics_tracker.record_usage(
|
388
|
-
model_id=model_name,
|
389
|
-
operation_type="training",
|
390
|
-
metadata={
|
391
|
-
"training_job_id": job_record.job_id,
|
392
|
-
"task_type": job_record.task_type,
|
393
|
-
"domain": job_record.domain,
|
394
|
-
"performance_metrics": performance_metrics or {}
|
395
|
-
}
|
396
|
-
)
|
397
|
-
|
398
|
-
logger.info(f"Updated statistics for model {model_name}")
|
399
|
-
|
400
|
-
except Exception as e:
|
401
|
-
logger.error(f"Failed to update model statistics: {e}")
|
402
|
-
|
403
|
-
def _convert_model_type(self, training_model_type: str) -> ModelType:
|
404
|
-
"""Convert training model type to core model type."""
|
405
|
-
type_map = {
|
406
|
-
"llm": ModelType.CHAT,
|
407
|
-
"sd": ModelType.IMAGE_GENERATION,
|
408
|
-
"ml": ModelType.CLASSIFICATION
|
409
|
-
}
|
410
|
-
|
411
|
-
return type_map.get(training_model_type, ModelType.CHAT)
|
412
|
-
|
413
|
-
def _convert_capabilities(self, supported_tasks: List[str]) -> List[ModelCapability]:
|
414
|
-
"""Convert training supported tasks to core capabilities."""
|
415
|
-
capabilities = []
|
416
|
-
|
417
|
-
for task in supported_tasks:
|
418
|
-
if task in ["chat", "generation"]:
|
419
|
-
capabilities.append(ModelCapability.TEXT_GENERATION)
|
420
|
-
elif task == "classification":
|
421
|
-
capabilities.append(ModelCapability.TEXT_CLASSIFICATION)
|
422
|
-
elif task == "summarization":
|
423
|
-
capabilities.append(ModelCapability.SUMMARIZATION)
|
424
|
-
elif task == "translation":
|
425
|
-
capabilities.append(ModelCapability.TRANSLATION)
|
426
|
-
elif task == "code":
|
427
|
-
capabilities.append(ModelCapability.CODE_GENERATION)
|
428
|
-
|
429
|
-
return list(set(capabilities)) # Remove duplicates
|
430
|
-
|
431
|
-
def get_integration_status(self) -> Dict[str, Any]:
|
432
|
-
"""Get status of core integration."""
|
433
|
-
return {
|
434
|
-
"core_available": self.core_available,
|
435
|
-
"model_manager_connected": self.model_manager is not None,
|
436
|
-
"billing_tracker_available": self.billing_tracker is not None,
|
437
|
-
"statistics_tracker_available": self.statistics_tracker is not None,
|
438
|
-
"training_storage_available": self.training_storage is not None
|
439
|
-
}
|