Solareva Taisia
chore(release): initial public snapshot
198ccb0
# Architecture Documentation
## System Architecture
### High-Level Overview
```
β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚ Client Layer β”‚
β”‚ (Web Apps, Mobile Apps, Other Services) β”‚
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜
β”‚
β”‚ HTTP/REST API
β”‚
β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β–Όβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚ API Gateway Layer β”‚
β”‚ β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”‚
β”‚ β”‚ FastAPI Application β”‚ β”‚
β”‚ β”‚ - Request Validation β”‚ β”‚
β”‚ β”‚ - Authentication (optional) β”‚ β”‚
β”‚ β”‚ - Rate Limiting β”‚ β”‚
β”‚ β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ β”‚
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜
β”‚
β”‚
β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β–Όβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚ Application Layer β”‚
β”‚ β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”‚
β”‚ β”‚ Monitoring Middleware β”‚ β”‚
β”‚ β”‚ - Prediction Logging β”‚ β”‚
β”‚ β”‚ - Data Drift Detection β”‚ β”‚
β”‚ β”‚ - Performance Tracking β”‚ β”‚
β”‚ β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ β”‚
β”‚ β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”‚
β”‚ β”‚ Inference Engine β”‚ β”‚
β”‚ β”‚ - Async Processing β”‚ β”‚
β”‚ β”‚ - Batch Handling β”‚ β”‚
β”‚ β”‚ - Error Handling β”‚ β”‚
β”‚ β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ β”‚
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜
β”‚
β”‚ Model Calls
β”‚
β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β–Όβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚ Model Layer β”‚
β”‚ β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”‚
β”‚ β”‚ Transformer Models β”‚ β”‚
β”‚ β”‚ - Russian BERT β”‚ β”‚
β”‚ β”‚ - RoBERTa β”‚ β”‚
β”‚ β”‚ - DistilBERT β”‚ β”‚
β”‚ β”‚ - Ensemble Models β”‚ β”‚
β”‚ β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ β”‚
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜
β”‚
β”‚
β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β–Όβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚ Data Layer β”‚
β”‚ β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”‚
β”‚ β”‚ Tokenization β”‚ β”‚
β”‚ β”‚ - HuggingFace Tokenizers β”‚ β”‚
β”‚ β”‚ - Subword Tokenization β”‚ β”‚
β”‚ β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ β”‚
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜
```
## Model Architecture Details
### Transformer Model Flow
```
Input Text: "ΠŸΡƒΡ‚ΠΈΠ½ объявил ΠΎ Π½ΠΎΠ²Ρ‹Ρ… ΠΌΠ΅Ρ€Π°Ρ… ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΊΠΈ экономики"
β”‚
β”œβ”€β–Ί Text Preprocessing
β”‚ └─► Normalize: "ΠΏΡƒΡ‚ΠΈΠ½ объявил ΠΎ Π½ΠΎΠ²Ρ‹Ρ… ΠΌΠ΅Ρ€Π°Ρ… ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΊΠΈ экономики"
β”‚
β”œβ”€β–Ί Tokenization (HuggingFace)
β”‚ └─► Tokens: ["[CLS]", "ΠΏΡƒΡ‚ΠΈΠ½", "объявил", "ΠΎ", "Π½ΠΎΠ²Ρ‹Ρ…", "ΠΌΠ΅Ρ€Π°Ρ…", ...]
β”‚ └─► Token IDs: [101, 1234, 5678, ...]
β”‚
β”œβ”€β–Ί Embedding Layer
β”‚ └─► [batch, seq_len, 768]
β”‚
β”œβ”€β–Ί BERT Encoder (12 layers)
β”‚ β”œβ”€β–Ί Multi-Head Self-Attention (12 heads)
β”‚ β”œβ”€β–Ί Feed-Forward Network
β”‚ β”œβ”€β–Ί Layer Normalization
β”‚ └─► Residual Connections
β”‚ └─► Output: [batch, seq_len, 768]
β”‚
β”œβ”€β–Ί Pooling
β”‚ └─► [CLS] token or Attention Pooling
β”‚ └─► [batch, 768]
β”‚
β”œβ”€β–Ί Classification Head
β”‚ β”œβ”€β–Ί Dropout(0.3)
β”‚ β”œβ”€β–Ί Linear(768 β†’ 768) + ReLU
β”‚ β”œβ”€β–Ί Dropout(0.3)
β”‚ └─► Linear(768 β†’ num_labels)
β”‚ └─► Output: [batch, num_labels]
β”‚
β”œβ”€β–Ί Sigmoid Activation
β”‚ └─► Probabilities: [batch, num_labels]
β”‚
└─► Threshold Filtering (0.5)
└─► Final Tags: ["ΠΏΠΎΠ»ΠΈΡ‚ΠΈΠΊΠ°", "экономика"]
```
### Ensemble Architecture
```
Input: Title + Snippet
β”‚
β”œβ”€β–Ί Model 1 (Russian BERT)
β”‚ └─► Predictions: [0.9, 0.7, 0.3, ...]
β”‚
β”œβ”€β–Ί Model 2 (RoBERTa)
β”‚ └─► Predictions: [0.85, 0.75, 0.4, ...]
β”‚
β”œβ”€β–Ί Model 3 (DistilBERT)
β”‚ └─► Predictions: [0.88, 0.72, 0.35, ...]
β”‚
└─► Ensemble Combination
β”œβ”€β–Ί Weighted Average (weights: [0.4, 0.3, 0.3])
└─► Final Predictions: [0.88, 0.73, 0.35, ...]
```
## Data Flow
### Training Data Flow
```
Raw TSV Files
β”‚
β”œβ”€β–Ί Load Data (pandas)
β”‚ └─► Filter nulls
β”‚
β”œβ”€β–Ί Text Preprocessing
β”‚ β”œβ”€β–Ί Normalize text
β”‚ β”œβ”€β–Ί Lowercase
β”‚ └─► Remove special chars
β”‚
β”œβ”€β–Ί Tag Processing
β”‚ β”œβ”€β–Ί Split tags
β”‚ β”œβ”€β–Ί Filter by frequency
β”‚ └─► Create label mapping
β”‚
β”œβ”€β–Ί Data Splitting
β”‚ β”œβ”€β–Ί Train (dates < 2018-10-01)
β”‚ β”œβ”€β–Ί Validation (2018-10-01 to 2018-12-01)
β”‚ └─► Test (dates >= 2018-12-01)
β”‚
β”œβ”€β–Ί Dataset Creation
β”‚ β”œβ”€β–Ί Tokenization
β”‚ β”œβ”€β–Ί Padding/Truncation
β”‚ └─► Multi-hot encoding
β”‚
└─► DataLoader
└─► Batches for training
```
### Inference Data Flow
```
API Request
β”‚
β”œβ”€β–Ί Request Validation (Pydantic)
β”‚ └─► Validate title, snippet, threshold
β”‚
β”œβ”€β–Ί Text Preprocessing
β”‚ └─► Normalize and clean
β”‚
β”œβ”€β–Ί Tokenization
β”‚ └─► Convert to token IDs
β”‚
β”œβ”€β–Ί Model Inference
β”‚ └─► Forward pass through BERT
β”‚
β”œβ”€β–Ί Post-processing
β”‚ β”œβ”€β–Ί Sigmoid activation
β”‚ β”œβ”€β–Ί Threshold filtering
β”‚ └─► Top-K selection
β”‚
β”œβ”€β–Ί Monitoring
β”‚ β”œβ”€β–Ί Log prediction
β”‚ β”œβ”€β–Ί Record for drift detection
β”‚ └─► Track performance
β”‚
└─► Response
└─► JSON with predictions
```
## Component Interactions
### Training Pipeline
```
Config (Hydra)
β”‚
β”œβ”€β–Ί Data Loading
β”‚ └─► Dataset Creation
β”‚
β”œβ”€β–Ί Model Initialization
β”‚ └─► Load Pre-trained BERT
β”‚
β”œβ”€β–Ί Training Loop
β”‚ β”œβ”€β–Ί Forward Pass
β”‚ β”œβ”€β–Ί Loss Calculation
β”‚ β”œβ”€β–Ί Backward Pass
β”‚ └─► Optimizer Step
β”‚
β”œβ”€β–Ί Validation
β”‚ └─► Metrics Calculation
β”‚
β”œβ”€β–Ί Experiment Tracking
β”‚ β”œβ”€β–Ί WandB Logging
β”‚ β”œβ”€β–Ί MLflow Tracking
β”‚ └─► DVC Versioning
β”‚
└─► Model Checkpointing
└─► Save Best Model
```
### API Request Flow
```
HTTP Request
β”‚
β”œβ”€β–Ί CORS Middleware
β”‚
β”œβ”€β–Ί Monitoring Middleware
β”‚ └─► Start timer
β”‚
β”œβ”€β–Ί Request Validation
β”‚ └─► Pydantic validation
β”‚
β”œβ”€β–Ί Inference
β”‚ β”œβ”€β–Ί Text preprocessing
β”‚ β”œβ”€β–Ί Tokenization
β”‚ β”œβ”€β–Ί Model forward pass
β”‚ └─► Post-processing
β”‚
β”œβ”€β–Ί Monitoring
β”‚ β”œβ”€β–Ί Log prediction
β”‚ β”œβ”€β–Ί Check drift
β”‚ └─► Update metrics
β”‚
└─► HTTP Response
└─► JSON with predictions
```
## Technology Stack
### Core ML
- **PyTorch**: Deep learning framework
- **PyTorch Lightning**: Training framework
- **Transformers**: HuggingFace transformers library
- **Russian BERT**: DeepPavlov/rubert-base-cased
### API & Web
- **FastAPI**: Modern Python web framework
- **Uvicorn**: ASGI server
- **Pydantic**: Data validation
### MLOps
- **WandB**: Experiment tracking
- **MLflow**: Model registry
- **DVC**: Data versioning
- **Optuna**: Hyperparameter tuning
- **Hydra**: Configuration management
### Infrastructure
- **Docker**: Containerization
- **GitHub Actions**: CI/CD
- **Nginx**: Reverse proxy (optional)
### Monitoring
- **Custom Monitoring**: Performance, drift, logging
- **Prometheus** (optional): Metrics collection
- **Grafana** (optional): Visualization
## Scalability Considerations
### Horizontal Scaling
- Stateless API design
- Load balancer support
- Multiple worker processes
- Container orchestration (Kubernetes)
### Performance Optimization
- Async inference
- Batch processing
- Model quantization (future)
- GPU acceleration
- Caching (future)
### High Availability
- Health checks
- Graceful degradation
- Circuit breakers (future)
- Retry mechanisms