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