From 8126e87848638716a85db754afc906ceff905045 Mon Sep 17 00:00:00 2001 From: opentaco Date: Sun, 4 Sep 2022 12:14:21 +0200 Subject: [PATCH 1/2] Remove extra responsive_uids insertion in validator --- bittensor/_neuron/text/core_validator/__init__.py | 1 - 1 file changed, 1 deletion(-) diff --git a/bittensor/_neuron/text/core_validator/__init__.py b/bittensor/_neuron/text/core_validator/__init__.py index f52f37109f..226b335a00 100644 --- a/bittensor/_neuron/text/core_validator/__init__.py +++ b/bittensor/_neuron/text/core_validator/__init__.py @@ -552,7 +552,6 @@ def neuron_stats_update(self, neuron_stats: Dict[int, Dict[str, Any]]): responsive_uids = [] for _uid, _stats in neuron_stats.items(): stats = self.neuron_stats.setdefault(_uid, {}) - responsive_uids += [_uid] # === EMA zeroing update === # Push zero into EMA for synapse_keys to exponentially decay weighting keys if neuron non-responsive From 21a261b33e335fa79b8d2290171d350a065b8bde Mon Sep 17 00:00:00 2001 From: opentaco Date: Sun, 4 Sep 2022 12:23:16 +0200 Subject: [PATCH 2/2] Constrain validator epoch length to a maximum period Normal epoch duration is blocks_per_epoch if all UIDs have been queried. Try to query each UID at least once - assumes nucleus samples without replacement, but keep maximum epoch duration at 2 * blocks_per_epoch. Typically a low resource validator can complete full network querying in ~350 blocks, so 2 * blocks_per_epoch should normally suffice. --- bittensor/_neuron/text/core_validator/__init__.py | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/bittensor/_neuron/text/core_validator/__init__.py b/bittensor/_neuron/text/core_validator/__init__.py index 226b335a00..57e1f840be 100644 --- a/bittensor/_neuron/text/core_validator/__init__.py +++ b/bittensor/_neuron/text/core_validator/__init__.py @@ -377,8 +377,12 @@ def run_epoch( self ): epoch_start_time = time.time() start_block = self.subtensor.block + # normal epoch duration is blocks_per_epoch if all UIDs have been queried + # try to query each UID at least once - assumes nucleus samples without replacement + # but keep maximum epoch duration at 2 * blocks_per_epoch while (self.subtensor.block < start_block + blocks_per_epoch or - len(epoch_queried_uids) < self.metagraph.n): # ensure each UID is queried at least once - assumes nucleus samples without replacement + (self.subtensor.block < start_block + 2 * blocks_per_epoch and + len(epoch_queried_uids) < self.metagraph.n)): start_time = time.time() # === Forward ===