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
isa_model/training/__init__.py
DELETED
@@ -1,168 +0,0 @@
|
|
1
|
-
"""
|
2
|
-
ISA Model Training Module
|
3
|
-
|
4
|
-
Provides unified training capabilities for AI models including:
|
5
|
-
- Local training with SFT (Supervised Fine-Tuning)
|
6
|
-
- Cloud training on RunPod
|
7
|
-
- Model evaluation and management
|
8
|
-
- HuggingFace integration
|
9
|
-
- 🧠 Intelligent training with AI-powered optimization
|
10
|
-
|
11
|
-
Example usage:
|
12
|
-
```python
|
13
|
-
from isa_model.training import TrainingFactory, train_gemma
|
14
|
-
|
15
|
-
# Quick Gemma training
|
16
|
-
model_path = train_gemma(
|
17
|
-
dataset_path="tatsu-lab/alpaca",
|
18
|
-
model_size="4b",
|
19
|
-
num_epochs=3
|
20
|
-
)
|
21
|
-
|
22
|
-
# Advanced training with custom configuration
|
23
|
-
factory = TrainingFactory()
|
24
|
-
model_path = factory.train_model(
|
25
|
-
model_name="google/gemma-2-4b-it",
|
26
|
-
dataset_path="your-dataset.json",
|
27
|
-
use_lora=True,
|
28
|
-
batch_size=4,
|
29
|
-
num_epochs=3
|
30
|
-
)
|
31
|
-
|
32
|
-
# 🧠 Intelligent training with natural language
|
33
|
-
from isa_model.training import IntelligentTrainingFactory
|
34
|
-
|
35
|
-
intelligent_factory = IntelligentTrainingFactory()
|
36
|
-
recommendation = intelligent_factory.analyze_training_request(
|
37
|
-
"Train a customer service chatbot for medical domain",
|
38
|
-
dataset_path="medical_dialogues.json",
|
39
|
-
quality_target="high",
|
40
|
-
budget_limit=200.0
|
41
|
-
)
|
42
|
-
model_path = intelligent_factory.train_with_recommendation(recommendation)
|
43
|
-
```
|
44
|
-
"""
|
45
|
-
|
46
|
-
# Import the new clean factory
|
47
|
-
from .factory import TrainingFactory, train_gemma
|
48
|
-
|
49
|
-
# Import core components
|
50
|
-
from .core import (
|
51
|
-
TrainingConfig,
|
52
|
-
LoRAConfig,
|
53
|
-
DatasetConfig,
|
54
|
-
BaseTrainer,
|
55
|
-
SFTTrainer,
|
56
|
-
TrainingUtils,
|
57
|
-
DatasetManager,
|
58
|
-
RunPodConfig,
|
59
|
-
StorageConfig,
|
60
|
-
JobConfig
|
61
|
-
)
|
62
|
-
|
63
|
-
# Import cloud training components
|
64
|
-
from .cloud import (
|
65
|
-
TrainingJobOrchestrator
|
66
|
-
)
|
67
|
-
|
68
|
-
# Import intelligent training components (optional)
|
69
|
-
try:
|
70
|
-
from .intelligent import (
|
71
|
-
IntelligentTrainingFactory,
|
72
|
-
IntelligentDecisionEngine,
|
73
|
-
TaskClassifier,
|
74
|
-
KnowledgeBase,
|
75
|
-
ResourceOptimizer,
|
76
|
-
TrainingRequest,
|
77
|
-
TrainingRecommendation
|
78
|
-
)
|
79
|
-
INTELLIGENT_AVAILABLE = True
|
80
|
-
except ImportError as e:
|
81
|
-
INTELLIGENT_AVAILABLE = False
|
82
|
-
# Create placeholder classes for graceful degradation
|
83
|
-
class IntelligentTrainingFactory:
|
84
|
-
def __init__(self, *args, **kwargs):
|
85
|
-
raise ImportError("Intelligent training features not available. Please install required dependencies.")
|
86
|
-
|
87
|
-
class IntelligentDecisionEngine:
|
88
|
-
def __init__(self, *args, **kwargs):
|
89
|
-
raise ImportError("Intelligent training features not available.")
|
90
|
-
|
91
|
-
class TaskClassifier:
|
92
|
-
def __init__(self, *args, **kwargs):
|
93
|
-
raise ImportError("Intelligent training features not available.")
|
94
|
-
|
95
|
-
class KnowledgeBase:
|
96
|
-
def __init__(self, *args, **kwargs):
|
97
|
-
raise ImportError("Intelligent training features not available.")
|
98
|
-
|
99
|
-
class ResourceOptimizer:
|
100
|
-
def __init__(self, *args, **kwargs):
|
101
|
-
raise ImportError("Intelligent training features not available.")
|
102
|
-
|
103
|
-
class TrainingRequest:
|
104
|
-
def __init__(self, *args, **kwargs):
|
105
|
-
raise ImportError("Intelligent training features not available.")
|
106
|
-
|
107
|
-
class TrainingRecommendation:
|
108
|
-
def __init__(self, *args, **kwargs):
|
109
|
-
raise ImportError("Intelligent training features not available.")
|
110
|
-
|
111
|
-
__all__ = [
|
112
|
-
# Main factory
|
113
|
-
'TrainingFactory',
|
114
|
-
'train_gemma',
|
115
|
-
|
116
|
-
# Core components
|
117
|
-
'TrainingConfig',
|
118
|
-
'LoRAConfig',
|
119
|
-
'DatasetConfig',
|
120
|
-
'BaseTrainer',
|
121
|
-
'SFTTrainer',
|
122
|
-
'TrainingUtils',
|
123
|
-
'DatasetManager',
|
124
|
-
|
125
|
-
# Cloud components
|
126
|
-
'RunPodConfig',
|
127
|
-
'StorageConfig',
|
128
|
-
'JobConfig',
|
129
|
-
'TrainingJobOrchestrator',
|
130
|
-
|
131
|
-
# Intelligent training components
|
132
|
-
'IntelligentTrainingFactory',
|
133
|
-
'IntelligentDecisionEngine',
|
134
|
-
'TaskClassifier',
|
135
|
-
'KnowledgeBase',
|
136
|
-
'ResourceOptimizer',
|
137
|
-
'TrainingRequest',
|
138
|
-
'TrainingRecommendation',
|
139
|
-
'INTELLIGENT_AVAILABLE',
|
140
|
-
|
141
|
-
# Training storage components (optional)
|
142
|
-
'TrainingStorage',
|
143
|
-
'TrainingRepository',
|
144
|
-
'CoreModelIntegration'
|
145
|
-
]
|
146
|
-
|
147
|
-
# Import training storage components (optional)
|
148
|
-
try:
|
149
|
-
from .storage import (
|
150
|
-
TrainingStorage,
|
151
|
-
TrainingRepository,
|
152
|
-
CoreModelIntegration
|
153
|
-
)
|
154
|
-
STORAGE_AVAILABLE = True
|
155
|
-
except ImportError:
|
156
|
-
STORAGE_AVAILABLE = False
|
157
|
-
# Create placeholder classes for graceful degradation
|
158
|
-
class TrainingStorage:
|
159
|
-
def __init__(self, *args, **kwargs):
|
160
|
-
raise ImportError("Training storage features not available.")
|
161
|
-
|
162
|
-
class TrainingRepository:
|
163
|
-
def __init__(self, *args, **kwargs):
|
164
|
-
raise ImportError("Training repository features not available.")
|
165
|
-
|
166
|
-
class CoreModelIntegration:
|
167
|
-
def __init__(self, *args, **kwargs):
|
168
|
-
raise ImportError("Core model integration features not available.")
|
@@ -1,47 +0,0 @@
|
|
1
|
-
# app/services/llm_model/tracing/annotation/annotation_schema.py
|
2
|
-
from enum import Enum
|
3
|
-
from pydantic import BaseModel, Field
|
4
|
-
from typing import Dict, Any, List, Optional
|
5
|
-
from datetime import datetime
|
6
|
-
|
7
|
-
class AnnotationType(str, Enum):
|
8
|
-
ACCURACY = "accuracy"
|
9
|
-
HELPFULNESS = "helpfulness"
|
10
|
-
TOXICITY = "toxicity"
|
11
|
-
CUSTOM = "custom"
|
12
|
-
|
13
|
-
class RatingScale(int, Enum):
|
14
|
-
POOR = 1
|
15
|
-
FAIR = 2
|
16
|
-
GOOD = 3
|
17
|
-
EXCELLENT = 4
|
18
|
-
|
19
|
-
class AnnotationAspects(BaseModel):
|
20
|
-
factually_correct: bool = True
|
21
|
-
relevant: bool = True
|
22
|
-
harmful: bool = False
|
23
|
-
biased: bool = False
|
24
|
-
complete: bool = True
|
25
|
-
efficient: bool = True
|
26
|
-
|
27
|
-
class BetterResponse(BaseModel):
|
28
|
-
content: str
|
29
|
-
reason: Optional[str]
|
30
|
-
metadata: Optional[Dict[str, Any]] = {}
|
31
|
-
|
32
|
-
class AnnotationFeedback(BaseModel):
|
33
|
-
rating: RatingScale
|
34
|
-
category: AnnotationType
|
35
|
-
aspects: AnnotationAspects
|
36
|
-
better_response: Optional[BetterResponse]
|
37
|
-
comment: Optional[str]
|
38
|
-
metadata: Optional[Dict[str, Any]] = {}
|
39
|
-
is_selected_for_training: bool = False
|
40
|
-
|
41
|
-
class ItemAnnotation(BaseModel):
|
42
|
-
item_id: str
|
43
|
-
feedback: Optional[AnnotationFeedback]
|
44
|
-
status: str = "pending"
|
45
|
-
annotated_at: Optional[datetime]
|
46
|
-
annotator_id: Optional[str]
|
47
|
-
training_status: Optional[str] = None
|
@@ -1,126 +0,0 @@
|
|
1
|
-
from typing import Dict, Any, List
|
2
|
-
from datetime import datetime
|
3
|
-
from app.config.config_manager import config_manager
|
4
|
-
from app.services.training.llm_model.annotation.annotation_schema import AnnotationFeedback, RatingScale, AnnotationAspects
|
5
|
-
from bson.objectid import ObjectId
|
6
|
-
from app.services.training.llm_model.annotation.storage.dataset_manager import DatasetManager
|
7
|
-
|
8
|
-
class AnnotationProcessor:
|
9
|
-
def __init__(self):
|
10
|
-
self.logger = config_manager.get_logger(__name__)
|
11
|
-
self.dataset_manager = DatasetManager()
|
12
|
-
self.batch_size = 1000 # Configure as needed
|
13
|
-
|
14
|
-
async def process_queue(self) -> None:
|
15
|
-
"""Process pending items and create datasets"""
|
16
|
-
db = await config_manager.get_db('mongodb')
|
17
|
-
queue = db['training_queue']
|
18
|
-
|
19
|
-
# Process SFT items
|
20
|
-
sft_items = await self._get_pending_items("sft")
|
21
|
-
if len(sft_items) >= self.batch_size:
|
22
|
-
await self._create_sft_dataset(sft_items)
|
23
|
-
|
24
|
-
# Process RLHF items
|
25
|
-
rlhf_items = await self._get_pending_items("rlhf")
|
26
|
-
if len(rlhf_items) >= self.batch_size:
|
27
|
-
await self._create_rlhf_dataset(rlhf_items)
|
28
|
-
|
29
|
-
async def _create_sft_dataset(self, items: List[Dict[str, Any]]):
|
30
|
-
"""Create and upload SFT dataset"""
|
31
|
-
dataset = await self.dataset_manager.create_dataset(
|
32
|
-
name=f"sft_dataset_v{datetime.now().strftime('%Y%m%d')}",
|
33
|
-
type="sft",
|
34
|
-
version=datetime.now().strftime("%Y%m%d"),
|
35
|
-
source_annotations=[item["annotation_id"] for item in items]
|
36
|
-
)
|
37
|
-
|
38
|
-
formatted_data = [
|
39
|
-
await self._process_sft_item(item)
|
40
|
-
for item in items
|
41
|
-
]
|
42
|
-
|
43
|
-
await self.dataset_manager.upload_dataset_file(
|
44
|
-
dataset.id,
|
45
|
-
formatted_data
|
46
|
-
)
|
47
|
-
|
48
|
-
async def _process_sft_item(self, item: Dict[str, Any]) -> Dict[str, Any]:
|
49
|
-
"""Process item for SFT dataset generation
|
50
|
-
Format follows HF conversation format for SFT training
|
51
|
-
"""
|
52
|
-
db = await config_manager.get_db('mongodb')
|
53
|
-
annotations = db['annotations']
|
54
|
-
|
55
|
-
# Get full annotation context
|
56
|
-
annotation = await annotations.find_one({"_id": ObjectId(item["annotation_id"])})
|
57
|
-
target_item = next(i for i in annotation["items"] if i["item_id"] == item["item_id"])
|
58
|
-
|
59
|
-
# Format as conversation
|
60
|
-
messages = [
|
61
|
-
{
|
62
|
-
"role": "system",
|
63
|
-
"content": "You are a helpful AI assistant that provides accurate and relevant information."
|
64
|
-
},
|
65
|
-
{
|
66
|
-
"role": "user",
|
67
|
-
"content": target_item["input"]["messages"][0]["content"]
|
68
|
-
},
|
69
|
-
{
|
70
|
-
"role": "assistant",
|
71
|
-
"content": target_item["output"]["content"]
|
72
|
-
}
|
73
|
-
]
|
74
|
-
|
75
|
-
return {
|
76
|
-
"messages": messages,
|
77
|
-
"metadata": {
|
78
|
-
"rating": item["feedback"]["rating"],
|
79
|
-
"aspects": item["feedback"]["aspects"],
|
80
|
-
"category": item["feedback"]["category"]
|
81
|
-
}
|
82
|
-
}
|
83
|
-
|
84
|
-
async def _process_rlhf_item(self, item: Dict[str, Any]) -> Dict[str, Any]:
|
85
|
-
"""Process item for RLHF dataset generation
|
86
|
-
Format follows preference pairs structure for RLHF training
|
87
|
-
"""
|
88
|
-
db = await config_manager.get_db('mongodb')
|
89
|
-
annotations = db['annotations']
|
90
|
-
|
91
|
-
# Get full annotation context
|
92
|
-
annotation = await annotations.find_one({"_id": ObjectId(item["annotation_id"])})
|
93
|
-
target_item = next(i for i in annotation["items"] if i["item_id"] == item["item_id"])
|
94
|
-
|
95
|
-
# Format as preference pairs
|
96
|
-
return {
|
97
|
-
"prompt": target_item["input"]["messages"][0]["content"],
|
98
|
-
"chosen": item["feedback"]["better_response"]["content"],
|
99
|
-
"rejected": target_item["output"]["content"],
|
100
|
-
"metadata": {
|
101
|
-
"reason": item["feedback"]["better_response"]["reason"],
|
102
|
-
"category": item["feedback"]["category"]
|
103
|
-
}
|
104
|
-
}
|
105
|
-
|
106
|
-
async def get_training_data(
|
107
|
-
self,
|
108
|
-
data_type: str,
|
109
|
-
limit: int = 1000
|
110
|
-
) -> List[Dict[str, Any]]:
|
111
|
-
"""Retrieve formatted training data"""
|
112
|
-
db = await config_manager.get_db('mongodb')
|
113
|
-
training_data = db['training_data']
|
114
|
-
|
115
|
-
data = await training_data.find(
|
116
|
-
{"type": data_type}
|
117
|
-
).limit(limit).to_list(length=limit)
|
118
|
-
|
119
|
-
if data_type == "sft":
|
120
|
-
return [item["data"]["messages"] for item in data]
|
121
|
-
else: # rlhf
|
122
|
-
return [{
|
123
|
-
"prompt": item["data"]["prompt"],
|
124
|
-
"chosen": item["data"]["chosen"],
|
125
|
-
"rejected": item["data"]["rejected"]
|
126
|
-
} for item in data]
|
@@ -1,131 +0,0 @@
|
|
1
|
-
# app/services/llm_model/annotation/dataset/dataset_manager.py
|
2
|
-
from typing import Dict, Any, List
|
3
|
-
from datetime import datetime
|
4
|
-
import json
|
5
|
-
import io
|
6
|
-
from app.config.config_manager import config_manager
|
7
|
-
from .dataset_schema import Dataset, DatasetType, DatasetStatus, DatasetFiles, DatasetStats
|
8
|
-
from bson import ObjectId
|
9
|
-
|
10
|
-
class DatasetManager:
|
11
|
-
def __init__(self):
|
12
|
-
self.logger = config_manager.get_logger(__name__)
|
13
|
-
self.minio_client = None
|
14
|
-
self.bucket_name = "training-datasets"
|
15
|
-
|
16
|
-
async def _ensure_minio_client(self):
|
17
|
-
if not self.minio_client:
|
18
|
-
self.minio_client = await config_manager.get_storage_client()
|
19
|
-
|
20
|
-
async def create_dataset(
|
21
|
-
self,
|
22
|
-
name: str,
|
23
|
-
type: DatasetType,
|
24
|
-
version: str,
|
25
|
-
source_annotations: List[str]
|
26
|
-
) -> Dataset:
|
27
|
-
"""Create a new dataset record"""
|
28
|
-
db = await config_manager.get_db('mongodb')
|
29
|
-
collection = db['training_datasets']
|
30
|
-
|
31
|
-
dataset = Dataset(
|
32
|
-
name=name,
|
33
|
-
type=type,
|
34
|
-
version=version,
|
35
|
-
storage_path=f"datasets/{type.value}/{version}",
|
36
|
-
files=DatasetFiles(
|
37
|
-
train="train.jsonl",
|
38
|
-
eval=None,
|
39
|
-
test=None
|
40
|
-
),
|
41
|
-
stats=DatasetStats(
|
42
|
-
total_examples=0,
|
43
|
-
avg_length=0.0,
|
44
|
-
num_conversations=0,
|
45
|
-
additional_metrics={}
|
46
|
-
),
|
47
|
-
source_annotations=source_annotations,
|
48
|
-
created_at=datetime.utcnow(),
|
49
|
-
status=DatasetStatus.PENDING,
|
50
|
-
metadata={}
|
51
|
-
)
|
52
|
-
|
53
|
-
result = await collection.insert_one(dataset.dict(exclude={'id'}))
|
54
|
-
return Dataset(**{**dataset.dict(), '_id': result.inserted_id})
|
55
|
-
|
56
|
-
async def upload_dataset_file(
|
57
|
-
self,
|
58
|
-
dataset_id: str,
|
59
|
-
data: List[Dict[str, Any]],
|
60
|
-
file_type: str = "train"
|
61
|
-
) -> bool:
|
62
|
-
"""Upload dataset to MinIO"""
|
63
|
-
try:
|
64
|
-
await self._ensure_minio_client()
|
65
|
-
db = await config_manager.get_db('mongodb')
|
66
|
-
|
67
|
-
object_id = ObjectId(dataset_id)
|
68
|
-
dataset = await db['training_datasets'].find_one({"_id": object_id})
|
69
|
-
|
70
|
-
if not dataset:
|
71
|
-
self.logger.error(f"Dataset not found with id: {dataset_id}")
|
72
|
-
return False
|
73
|
-
|
74
|
-
# Convert to JSONL
|
75
|
-
buffer = io.StringIO()
|
76
|
-
for item in data:
|
77
|
-
buffer.write(json.dumps(item) + "\n")
|
78
|
-
|
79
|
-
storage_path = dataset['storage_path'].rstrip('/')
|
80
|
-
file_path = f"{storage_path}/{file_type}.jsonl"
|
81
|
-
|
82
|
-
buffer_value = buffer.getvalue().encode()
|
83
|
-
|
84
|
-
self.logger.debug(f"Uploading to MinIO path: {file_path}")
|
85
|
-
|
86
|
-
self.minio_client.put_object(
|
87
|
-
self.bucket_name,
|
88
|
-
file_path,
|
89
|
-
io.BytesIO(buffer_value),
|
90
|
-
len(buffer_value)
|
91
|
-
)
|
92
|
-
|
93
|
-
avg_length = sum(len(str(item)) for item in data) / len(data) if data else 0
|
94
|
-
|
95
|
-
await db['training_datasets'].update_one(
|
96
|
-
{"_id": object_id},
|
97
|
-
{
|
98
|
-
"$set": {
|
99
|
-
f"files.{file_type}": f"{file_type}.jsonl",
|
100
|
-
"stats.total_examples": len(data),
|
101
|
-
"stats.avg_length": avg_length,
|
102
|
-
"stats.num_conversations": len(data),
|
103
|
-
"status": DatasetStatus.READY
|
104
|
-
}
|
105
|
-
}
|
106
|
-
)
|
107
|
-
|
108
|
-
return True
|
109
|
-
|
110
|
-
except Exception as e:
|
111
|
-
self.logger.error(f"Failed to upload dataset: {e}")
|
112
|
-
return False
|
113
|
-
|
114
|
-
async def get_dataset_info(self, dataset_id: str) -> Dict[str, Any]:
|
115
|
-
"""Get dataset information"""
|
116
|
-
try:
|
117
|
-
db = await config_manager.get_db('mongodb')
|
118
|
-
object_id = ObjectId(dataset_id) # Convert string ID to ObjectId
|
119
|
-
dataset = await db['training_datasets'].find_one({"_id": object_id})
|
120
|
-
|
121
|
-
if not dataset:
|
122
|
-
self.logger.error(f"Dataset not found with id: {dataset_id}")
|
123
|
-
return None
|
124
|
-
|
125
|
-
# Convert ObjectId to string for JSON serialization
|
126
|
-
dataset['_id'] = str(dataset['_id'])
|
127
|
-
return dataset
|
128
|
-
|
129
|
-
except Exception as e:
|
130
|
-
self.logger.error(f"Failed to get dataset info: {e}")
|
131
|
-
return None
|
@@ -1,44 +0,0 @@
|
|
1
|
-
# app/services/llm_model/annotation/dataset/dataset_schema.py
|
2
|
-
from enum import Enum
|
3
|
-
from pydantic import BaseModel, Field
|
4
|
-
from typing import Dict, List, Optional
|
5
|
-
from datetime import datetime
|
6
|
-
from bson import ObjectId
|
7
|
-
|
8
|
-
class DatasetType(str, Enum):
|
9
|
-
SFT = "sft"
|
10
|
-
RLHF = "rlhf"
|
11
|
-
|
12
|
-
class DatasetStatus(str, Enum):
|
13
|
-
PENDING = "pending"
|
14
|
-
PROCESSING = "processing"
|
15
|
-
READY = "ready"
|
16
|
-
ERROR = "error"
|
17
|
-
|
18
|
-
class DatasetFiles(BaseModel):
|
19
|
-
train: str
|
20
|
-
eval: Optional[str]
|
21
|
-
test: Optional[str]
|
22
|
-
|
23
|
-
class DatasetStats(BaseModel):
|
24
|
-
total_examples: int
|
25
|
-
avg_length: Optional[float]
|
26
|
-
num_conversations: Optional[int]
|
27
|
-
additional_metrics: Optional[Dict] = {}
|
28
|
-
|
29
|
-
class Dataset(BaseModel):
|
30
|
-
id: Optional[ObjectId] = Field(None, alias="_id")
|
31
|
-
name: str
|
32
|
-
type: DatasetType
|
33
|
-
version: str
|
34
|
-
storage_path: str
|
35
|
-
files: DatasetFiles
|
36
|
-
stats: DatasetStats
|
37
|
-
source_annotations: List[str]
|
38
|
-
created_at: datetime
|
39
|
-
status: DatasetStatus
|
40
|
-
metadata: Optional[Dict] = {}
|
41
|
-
|
42
|
-
class Config:
|
43
|
-
arbitrary_types_allowed = True
|
44
|
-
populate_by_name = True
|
@@ -1,109 +0,0 @@
|
|
1
|
-
# test_annotation_flow.py
|
2
|
-
import os
|
3
|
-
os.environ["ENV"] = "local"
|
4
|
-
|
5
|
-
import asyncio
|
6
|
-
from datetime import datetime
|
7
|
-
from bson import ObjectId
|
8
|
-
from app.services.llm_model.annotation.views.annotation_controller import AnnotationController
|
9
|
-
from app.services.llm_model.annotation.processors.annotation_processor import AnnotationProcessor
|
10
|
-
from app.services.llm_model.annotation.annotation_schema import (
|
11
|
-
AnnotationFeedback,
|
12
|
-
RatingScale,
|
13
|
-
AnnotationType,
|
14
|
-
AnnotationAspects,
|
15
|
-
BetterResponse
|
16
|
-
)
|
17
|
-
from app.config.config_manager import config_manager
|
18
|
-
|
19
|
-
async def setup_test_data():
|
20
|
-
"""Setup initial test data in MongoDB"""
|
21
|
-
db = await config_manager.get_db('mongodb')
|
22
|
-
|
23
|
-
# Create a test annotation
|
24
|
-
test_annotation = {
|
25
|
-
"_id": ObjectId(),
|
26
|
-
"project_name": "test_project",
|
27
|
-
"items": [{
|
28
|
-
"item_id": "test_item_1",
|
29
|
-
"input": {
|
30
|
-
"messages": [{
|
31
|
-
"role": "user",
|
32
|
-
"content": "What is the capital of France?"
|
33
|
-
}]
|
34
|
-
},
|
35
|
-
"output": {
|
36
|
-
"content": "The capital of France is Paris."
|
37
|
-
},
|
38
|
-
"status": "pending"
|
39
|
-
}],
|
40
|
-
"created_at": datetime.utcnow().isoformat()
|
41
|
-
}
|
42
|
-
|
43
|
-
await db['annotations'].insert_one(test_annotation)
|
44
|
-
return test_annotation
|
45
|
-
|
46
|
-
async def test_annotation_flow():
|
47
|
-
"""Test the complete annotation flow"""
|
48
|
-
try:
|
49
|
-
# Initialize controllers
|
50
|
-
annotation_controller = AnnotationController()
|
51
|
-
annotation_processor = AnnotationProcessor()
|
52
|
-
|
53
|
-
# Setup test data
|
54
|
-
test_data = await setup_test_data()
|
55
|
-
annotation_id = str(test_data["_id"])
|
56
|
-
item_id = test_data["items"][0]["item_id"]
|
57
|
-
|
58
|
-
print("1. Created test annotation")
|
59
|
-
|
60
|
-
# Create test feedback
|
61
|
-
feedback = AnnotationFeedback(
|
62
|
-
rating=RatingScale.EXCELLENT,
|
63
|
-
category=AnnotationType.ACCURACY,
|
64
|
-
aspects=AnnotationAspects(
|
65
|
-
factually_correct=True,
|
66
|
-
relevant=True,
|
67
|
-
harmful=False,
|
68
|
-
biased=False,
|
69
|
-
complete=True,
|
70
|
-
efficient=True
|
71
|
-
),
|
72
|
-
better_response=BetterResponse(
|
73
|
-
content="Paris is the capital city of France, known for its iconic Eiffel Tower.",
|
74
|
-
reason="Added more context and detail"
|
75
|
-
),
|
76
|
-
comment="Good response, but could be more detailed"
|
77
|
-
)
|
78
|
-
|
79
|
-
# Submit annotation
|
80
|
-
result = await annotation_controller.submit_annotation(
|
81
|
-
annotation_id=annotation_id,
|
82
|
-
item_id=item_id,
|
83
|
-
feedback=feedback,
|
84
|
-
annotator_id="test_annotator"
|
85
|
-
)
|
86
|
-
|
87
|
-
print("2. Submitted annotation:", result)
|
88
|
-
|
89
|
-
# Process annotation queue
|
90
|
-
await annotation_processor.process_queue()
|
91
|
-
print("3. Processed annotation queue")
|
92
|
-
|
93
|
-
# Verify dataset creation
|
94
|
-
db = await config_manager.get_db('mongodb')
|
95
|
-
datasets = await db['training_datasets'].find().to_list(length=10)
|
96
|
-
|
97
|
-
print("\nCreated Datasets:")
|
98
|
-
for dataset in datasets:
|
99
|
-
print(f"- {dataset['name']} ({dataset['type']})")
|
100
|
-
print(f" Status: {dataset['status']}")
|
101
|
-
print(f" Examples: {dataset['stats']['total_examples']}")
|
102
|
-
|
103
|
-
except Exception as e:
|
104
|
-
print(f"Error during test: {e}")
|
105
|
-
|
106
|
-
if __name__ == "__main__":
|
107
|
-
# Run the test
|
108
|
-
print("Starting annotation flow test...")
|
109
|
-
asyncio.run(test_annotation_flow())
|