Validator System
The Validator System is the core component responsible for evaluating miner capabilities, performing proof-of-GPU validation, and setting network weights in the NI Compute Subnet. It orchestrates the entire validation process including hardware verification, performance scoring, and blockchain weight updates.
For information about the specific proof-of-GPU validation algorithms, see Proof of GPU. For details about the scoring mechanisms, see Scoring System. For database schema and operations, see Database Operations.
Architecture Overview
Section titled “Architecture Overview”The validator system operates as a continuous validation loop that queries miners, validates their GPU capabilities, calculates performance scores, and updates network weights. The system is built around the Validator
class which coordinates all validation activities.
Validator System Components
Section titled “Validator System Components”graph TB subgraph "Validator Core" ValidatorClass["Validator Class<br/>neurons/validator.py"] Config["Configuration<br/>init_config()"] Prometheus["Prometheus Setup<br/>init_prometheus()"] end subgraph "Blockchain Interface" Subtensor["ComputeSubnetSubtensor<br/>subtensor connection"] Metagraph["bt.metagraph<br/>network state"] Wallet["bt.wallet<br/>validator identity"] end subgraph "Data Layer" ComputeDb["ComputeDb<br/>local database"] ComputeWandb["ComputeWandb<br/>metrics & monitoring"] ConfigData["config.yaml<br/>GPU performance data"] end subgraph "Validation Engine" PoGEngine["proof_of_gpu()<br/>GPU validation"] ScoringEngine["sync_scores()<br/>performance scoring"] WeightSetter["set_weights()<br/>blockchain updates"] end subgraph "Miner Communication" AllocateProtocol["Allocate Protocol<br/>resource allocation"] SpecsProtocol["Specs Protocol<br/>hardware queries"] ChallengeProtocol["Challenge Protocol<br/>PoW verification"] end ValidatorClass --> Config ValidatorClass --> Prometheus ValidatorClass --> Subtensor ValidatorClass --> Metagraph ValidatorClass --> Wallet ValidatorClass --> ComputeDb ValidatorClass --> ComputeWandb ValidatorClass --> ConfigData ValidatorClass --> PoGEngine ValidatorClass --> ScoringEngine ValidatorClass --> WeightSetter PoGEngine --> AllocateProtocol ValidatorClass --> SpecsProtocol ValidatorClass --> ChallengeProtocol ScoringEngine --> ComputeDb ScoringEngine --> ComputeWandb WeightSetter --> Subtensor
Sources: neurons/validator.py:70-209 , neurons/validator.py:130-175
Validation Process Flow
Section titled “Validation Process Flow”sequenceDiagram participant V as "Validator" participant DB as "ComputeDb" participant W as "ComputeWandb" participant BT as "Subtensor" participant M as "Miner" Note over V: Initialization Phase V->>DB: Initialize database connection V->>W: Setup WandB monitoring V->>BT: Connect to blockchain V->>V: init_scores() Note over V: Main Validation Loop loop Every Block V->>BT: sync_local() - Update metagraph V->>V: get_queryable() - Filter valid miners alt Every 360 blocks (PoG) V->>V: proof_of_gpu() V->>M: allocate_miner() V->>M: test_miner_gpu() V->>M: deallocate_miner() V->>DB: update_pog_stats() end alt Every 150 blocks (Specs) V->>W: get_specs_wandb() V->>DB: update_miner_details() end alt Every 25 blocks (Status) V->>V: sync_status() V->>W: log_chain_data() end alt Every 100 blocks (Weights) V->>V: sync_scores() V->>V: set_burn_weights() V->>BT: Submit weights to blockchain end end
Sources: neurons/validator.py:1161-1273 , neurons/validator.py:1192-1202 , neurons/validator.py:1240-1247
Core Components
Section titled “Core Components”Validator Class
Section titled “Validator Class”The Validator
class is the main orchestrator that manages all validation activities. It maintains state for queryable miners, scores, and validation results.
Property | Type | Description |
---|---|---|
scores | torch.Tensor | Current performance scores for all miners |
stats | dict | Detailed statistics for each miner |
_queryable_uids | Dict[int, bt.AxonInfo] | Valid miners available for validation |
allocated_hotkeys | list | Currently allocated miner hotkeys |
penalized_hotkeys | list | Penalized miner hotkeys |
Sources: neurons/validator.py:70-91 , neurons/validator.py:84-91
Configuration Management
Section titled “Configuration Management”The validator uses multiple configuration sources to manage validation parameters:
graph LR subgraph "Configuration Sources" ArgParser["ComputeArgPaser<br/>CLI arguments"] ConfigYaml["config.yaml<br/>GPU performance data"] EnvVars["Environment Variables<br/>system settings"] end subgraph "Configuration Properties" BatchSize["validator_specs_batch_size<br/>validator_challenge_batch_size"] HardwareQuery["validator_perform_hardware_query"] Thresholds["validator_whitelist_updated_threshold"] Blacklists["blacklist_hotkeys<br/>blacklist_coldkeys"] end ArgParser --> BatchSize ArgParser --> HardwareQuery ArgParser --> Thresholds ArgParser --> Blacklists ConfigYaml --> BatchSize EnvVars --> HardwareQuery
Sources: neurons/validator.py:210-235 , neurons/validator.py:132-147
Queryable Miners Management
Section titled “Queryable Miners Management”The validator maintains a filtered list of queryable miners based on multiple criteria:
graph TD AllMiners["All Network Miners<br/>metagraph.neurons"] subgraph "Filtering Pipeline" ValidTensors["get_valid_tensors()<br/>IP & blacklist filter"] FilterAxons["filter_axons()<br/>unique IP addresses"] FilterVersion["filter_axon_version()<br/>minimum version check"] end QueryableMiners["_queryable_uids<br/>Dict[int, bt.AxonInfo]"] AllMiners --> ValidTensors ValidTensors --> FilterAxons FilterAxons --> FilterVersion FilterVersion --> QueryableMiners subgraph "Blacklist Checks" BlacklistColdkeys["blacklist_coldkeys"] BlacklistHotkeys["blacklist_hotkeys"] ExploiterKeys["exploiters_hotkeys<br/>exploiters_coldkeys"] end ValidTensors --> BlacklistColdkeys ValidTensors --> BlacklistHotkeys ValidTensors --> ExploiterKeys
Sources: neurons/validator.py:571-579 , neurons/validator.py:487-515 , neurons/validator.py:517-544
Validation Process
Section titled “Validation Process”Proof-of-GPU Validation
Section titled “Proof-of-GPU Validation”The proof-of-GPU system allocates miners, tests their GPU capabilities, and verifies performance through cryptographic proofs:
graph TD subgraph "PoG Initialization" GetQueryable["get_queryable()<br/>filter available miners"] GetAllocated["wandb.get_allocated_hotkeys()<br/>skip allocated miners"] CreateQueue["asyncio.Queue<br/>miner processing queue"] end subgraph "Miner Testing Pipeline" AllocateMiner["allocate_miner()<br/>RSA key generation"] SSHConnect["paramiko.SSHClient<br/>secure connection"] HashCheck["compute_script_hash()<br/>integrity verification"] GPUInfo["get_remote_gpu_info()<br/>nvidia-smi query"] Benchmark["execute_script_on_miner('benchmark')<br/>performance test"] MerkleProof["execute_script_on_miner('compute')<br/>cryptographic proof"] VerifyProof["verify_responses()<br/>proof validation"] end subgraph "Result Processing" UpdatePoGStats["update_pog_stats()<br/>database update"] SyncScores["sync_scores()<br/>recalculate scores"] end GetQueryable --> GetAllocated GetAllocated --> CreateQueue CreateQueue --> AllocateMiner AllocateMiner --> SSHConnect SSHConnect --> HashCheck HashCheck --> GPUInfo GPUInfo --> Benchmark Benchmark --> MerkleProof MerkleProof --> VerifyProof VerifyProof --> UpdatePoGStats UpdatePoGStats --> SyncScores
Sources: neurons/validator.py:663-787 , neurons/validator.py:799-948
Scoring System
Section titled “Scoring System”The scoring system calculates performance scores based on GPU specifications and reliability metrics:
graph LR subgraph "Score Calculation" PoGSpecs["get_pog_specs()<br/>local GPU data"] CalcScore["calc_score_pog()<br/>performance calculation"] StatsAllocated["stats_allocated<br/>external scores"] PenalizedCheck["penalized_hotkeys<br/>penalty filter"] end subgraph "Score Sources" LocalDB["Local Database<br/>own_score: true"] ExternalWandb["WandB Stats<br/>own_score: false"] end subgraph "Final Score" FinalScore["stats[uid]['score']<br/>final miner score"] ReliabilityScore["reliability_score<br/>historical performance"] end PoGSpecs --> CalcScore CalcScore --> LocalDB StatsAllocated --> ExternalWandb LocalDB --> FinalScore ExternalWandb --> FinalScore PenalizedCheck --> FinalScore FinalScore --> ReliabilityScore
Sources: neurons/validator.py:312-402 , neurons/validator.py:360-386
Database Operations
Section titled “Database Operations”The validator uses ComputeDb
for persistent storage of miner information, validation results, and statistics:
Table | Purpose | Key Operations |
---|---|---|
miners | Miner registration data | select_miners() , update_miners() , purge_miner_entries() |
pog_stats | Proof-of-GPU results | get_pog_specs() , update_pog_stats() |
stats | Performance statistics | retrieve_stats() , write_stats() |
allocation | Resource allocations | update_miner_details() , get_miner_details() |
Sources: neurons/validator.py:171-172 , compute/utils/db.py
Monitoring and Metrics
Section titled “Monitoring and Metrics”WandB Integration
Section titled “WandB Integration”The validator integrates with Weights & Biases for distributed state management and metrics collection:
graph TD subgraph "WandB Operations" AllocatedHotkeys["update_allocated_hotkeys()<br/>track resource usage"] MinerSpecs["get_miner_specs()<br/>hardware specifications"] ChainData["log_chain_data()<br/>blockchain metrics"] PenalizedHotkeys["get_penalized_hotkeys_checklist_bak()"] end subgraph "Metrics Collection" BlockData["Block, Stake, Rank<br/>vTrust, Emission"] ValidatorStats["Validator performance<br/>validation results"] MinerStats["Miner capabilities<br/>GPU specifications"] end AllocatedHotkeys --> MinerStats MinerSpecs --> MinerStats ChainData --> BlockData PenalizedHotkeys --> ValidatorStats
Sources: neurons/validator.py:290-311 , neurons/validator.py:594-661 , neurons/validator.py:1229-1237
Weight Setting
Section titled “Weight Setting”The validator periodically updates network weights based on calculated scores:
graph LR subgraph "Weight Calculation" Scores["self.scores<br/>miner performance"] ClampNegative["scores[scores < 0] : 0<br/>remove negative scores"] Normalize["torch.nn.functional.normalize()<br/>L1 normalization"] end subgraph "Weight Submission" SetWeights["subtensor.set_weights()<br/>blockchain submission"] BurnWeights["set_burn_weights()<br/>burn account allocation"] VersionKey["version_key<br/>__version_as_int__"] end Scores --> ClampNegative ClampNegative --> Normalize Normalize --> SetWeights Normalize --> BurnWeights SetWeights --> VersionKey BurnWeights --> VersionKey
Sources: neurons/validator.py:1132-1153 , neurons/validator.py:1101-1131