-
Notifications
You must be signed in to change notification settings - Fork 8
validator logic updates #5
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
base: main
Are you sure you want to change the base?
Changes from 1 commit
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
Original file line number | Diff line number | Diff line change |
---|---|---|
|
@@ -14,12 +14,12 @@ def __init__(self): | |
self.setup_logging() | ||
self.setup_bittensor_objects() | ||
self.my_uid = self.metagraph.hotkeys.index(self.wallet.hotkey.ss58_address) | ||
self.scores = [1.0] * len(self.metagraph.S) | ||
self.scores = [0] * len(self.metagraph.S) | ||
self.last_update = self.subtensor.blocks_since_last_update( | ||
self.config.netuid, self.my_uid | ||
) | ||
self.tempo = self.subtensor.tempo(self.config.netuid) | ||
self.moving_avg_scores = [1.0] * len(self.metagraph.S) | ||
self.moving_avg_scores = [0] * len(self.metagraph.S) | ||
self.alpha = 0.1 | ||
|
||
def get_config(self): | ||
|
@@ -99,7 +99,7 @@ def setup_bittensor_objects(self): | |
|
||
# Set up initial scoring weights for validation. | ||
bt.logging.info("Building validation weights.") | ||
self.scores = [1.0] * len(self.metagraph.S) | ||
self.scores = [0] * len(self.metagraph.S) | ||
bt.logging.info(f"Weights: {self.scores}") | ||
|
||
def run(self): | ||
|
@@ -116,28 +116,33 @@ def run(self): | |
axons=self.metagraph.axons, synapse=synapse, timeout=12 | ||
) | ||
bt.logging.info(f"sending input {synapse.dummy_input}") | ||
if responses: | ||
responses = [ | ||
response.dummy_output | ||
for response in responses | ||
if response is not None | ||
] | ||
|
||
|
||
# Log the results. | ||
bt.logging.info(f"Received dummy responses: {responses}") | ||
|
||
# Adjust the length of moving_avg_scores to match the number of responses | ||
if len(self.moving_avg_scores) < len(responses): | ||
self.moving_avg_scores.extend( | ||
[1] * (len(responses) - len(self.moving_avg_scores)) | ||
) | ||
|
||
# Adjust the scores based on responses from miners and update moving average. | ||
for i, resp_i in enumerate(responses): | ||
current_score = 1 if resp_i == synapse.dummy_input * 2 else 0 | ||
self.moving_avg_scores[i] = ( | ||
1 - self.alpha | ||
) * self.moving_avg_scores[i] + self.alpha * current_score | ||
bt.logging.info(f"Received responses: {responses}") | ||
|
||
# Filter successful responses for logging | ||
successful_responses = [ | ||
response.dummy_output | ||
for response in responses | ||
if response is not None | ||
] | ||
bt.logging.info(f"Successful responses: {successful_responses}") | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. It would be nice if we can also mention the index which corresponds to the uid of the responses. Helps easily identify There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. |
||
|
||
# Score all miners based on their responses | ||
for i, response in enumerate(responses): | ||
if response is not None: | ||
# Miner responded - score based on correctness | ||
current_score = 1 if response.dummy_output == synapse.dummy_input * 2 else 0 | ||
self.moving_avg_scores[i] = ( | ||
(1 - self.alpha) * self.moving_avg_scores[i] + | ||
self.alpha * current_score | ||
) | ||
else: | ||
# Miner didn't respond - set score to 0 | ||
self.moving_avg_scores[i] = ( | ||
(1 - self.alpha) * self.moving_avg_scores[i] + | ||
self.alpha * 0 | ||
) | ||
|
||
bt.logging.info(f"Moving Average Scores: {self.moving_avg_scores}") | ||
self.last_update = self.subtensor.blocks_since_last_update( | ||
|
@@ -146,7 +151,11 @@ def run(self): | |
|
||
# set weights once every tempo | ||
total = sum(self.moving_avg_scores) | ||
weights = [score / total for score in self.moving_avg_scores] | ||
if total > 0: | ||
weights = [score / total for score in self.moving_avg_scores] | ||
else: | ||
# If no miners responded, set zero weights | ||
weights = [0.0] * len(self.moving_avg_scores) | ||
bt.logging.info(f"[blue]Setting weights: {weights}[/blue]") | ||
# Update the incentive mechanism on the Bittensor blockchain. | ||
self.subtensor.set_weights( | ||
|
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
I don't think this is what we want to do for a template.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
could you let me know what the idea is?
asking cause the readme walks through running the miner/validator logic defined in the repo but using the previous clone/change directory commands doesnt work.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Well this is a template. So it's designed to be forked and the information in it updated by the forker. Having this hard-coded will work, and that's the problem. Because it works, people will think that's correct to do rather than updating the info to the fork.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
gotcha! i can edit the README so that it includes the forking of the repo and then change the command to reflect that.
does that work?