rusticluftig commited on
Commit
f2a2662
1 Parent(s): 47f06c3

Temp commit

Browse files
Files changed (1) hide show
  1. utils.py +159 -70
utils.py CHANGED
@@ -1,25 +1,23 @@
1
- import os
2
- import math
3
- import time
4
- import json
5
- import wandb
6
- import pickle
7
- import datetime
8
  import argparse
 
9
  import functools
 
 
 
 
10
  import traceback
 
 
11
 
12
- import pandas as pd
13
- import numpy as np
14
  import bittensor as bt
15
-
16
- from dotenv import load_dotenv
17
- from dataclasses import dataclass
18
- from typing import Dict, List, Any, Optional, Tuple
19
  from bittensor.extrinsics.serving import get_metadata
 
20
 
21
-
22
- NETUID = 9
23
  DELAY_SECS = 3
24
  RETRIES = 3
25
 
@@ -27,18 +25,22 @@ load_dotenv()
27
 
28
  WANDB_TOKEN = os.environ.get("WANDB_API_KEY", None)
29
  SUBTENSOR_ENDPOINT = os.environ.get("SUBTENSOR_ENDPOINT", None)
30
- VALIDATOR_WANDB_PROJECT = "opentensor-dev/pretraining-subnet"
31
- BENCHMARK_WANDB_PROJECT = "pretraining-benchmark-data"
32
  BENCHMARK_FLAG = os.environ.get("BENCHMARK_FLAG", None)
33
 
34
- @dataclass
 
35
  class ModelData:
36
  uid: int
37
  hotkey: str
 
38
  namespace: str
39
  name: str
40
  commit: str
41
- hash: str
 
 
42
  block: int
43
  incentive: float
44
  emission: float
@@ -60,8 +62,9 @@ class ModelData:
60
  hotkey=hotkey,
61
  namespace=tokens[0],
62
  name=tokens[1],
63
- commit=tokens[2] if tokens[2] != "None" else None,
64
- hash=tokens[3] if tokens[3] != "None" else None,
 
65
  block=block,
66
  incentive=incentive,
67
  emission=emission,
@@ -69,6 +72,7 @@ class ModelData:
69
 
70
 
71
  def run_with_retries(func, *args, **kwargs):
 
72
  for i in range(0, RETRIES):
73
  try:
74
  return func(*args, **kwargs)
@@ -81,12 +85,18 @@ def run_with_retries(func, *args, **kwargs):
81
 
82
 
83
  def get_subtensor_and_metagraph() -> Tuple[bt.subtensor, bt.metagraph]:
 
84
 
85
  def _internal() -> Tuple[bt.subtensor, bt.metagraph]:
86
  if SUBTENSOR_ENDPOINT:
87
  parser = argparse.ArgumentParser()
88
  bt.subtensor.add_args(parser)
89
- subtensor = bt.subtensor(config=bt.config(parser=parser, args=["--subtensor.chain_endpoint", SUBTENSOR_ENDPOINT]))
 
 
 
 
 
90
  else:
91
  subtensor = bt.subtensor("finney")
92
 
@@ -235,7 +245,11 @@ def get_losses_over_time(wandb_runs: List) -> pd.DataFrame:
235
  for _, uid_data in all_uid_data.items():
236
  loss = uid_data.get("average_loss", math.inf)
237
  # Filter out the numbers from the exploit and when validators lost the best model.
238
- if loss < best_loss and (loss > 2.5 or timestamp > datetime.datetime(2024,2,12)) and (loss < 5 or timestamp > datetime.datetime(2024,3,27)):
 
 
 
 
239
  best_loss = uid_data["average_loss"]
240
  if best_loss != math.inf:
241
  timestamps.append(timestamp)
@@ -298,53 +312,67 @@ def get_benchmarks() -> Tuple[pd.DataFrame, datetime.datetime]:
298
  if artifacts:
299
  table = artifacts[-1].get("benchmarks")
300
  if table:
301
- return table.get_dataframe(), datetime.datetime.strptime(run.metadata["startedAt"], "%Y-%m-%dT%H:%M:%S.%f")
 
 
302
  bt.logging.error("Failed to get benchmarks from Wandb.")
303
  return None, None
304
 
305
 
306
- def make_validator_dataframe(validator_df: pd.DataFrame, model_data: ModelData) -> pd.DataFrame:
 
 
307
 
308
  values = [
309
- [uid, int(validator_df[uid][1]), round(validator_df[uid][0], 4)]
310
- + [
311
- validator_df[uid][-1].get(c.uid)
312
- for c in model_data
313
- if c.incentive
314
- ]
315
- for uid, _ in sorted(
316
- zip(
317
- validator_df.keys(),
318
- [validator_df[x][1] for x in validator_df.keys()],
319
- ),
320
- key=lambda x: x[1],
321
- reverse=True,
322
- )
323
- ]
324
- dtypes = {"UID":int, "Stake (τ)":float, "V-Trust":float}
325
- dtypes.update({
326
  f"{c.namespace}/{c.name} ({c.commit[0:8]})": float
327
  for c in model_data
328
  if c.incentive
329
- })
 
330
  return pd.DataFrame(values, columns=dtypes.keys()).astype(dtypes)
331
 
 
332
  def make_metagraph_dataframe(metagraph: bt.metagraph, weights=False) -> pd.DataFrame:
333
 
334
- cols = ['stake','emission','trust','validator_trust','dividends','incentive','R', 'consensus','validator_permit']
 
 
 
 
 
 
 
 
 
 
335
 
336
  frame = pd.DataFrame({k: getattr(metagraph, k) for k in cols})
337
- frame['block'] = metagraph.block.item()
338
- frame['netuid'] = NETUID
339
- frame['uid'] = range(len(frame))
340
- frame['hotkey'] = [axon.hotkey for axon in metagraph.axons]
341
- frame['coldkey'] = [axon.coldkey for axon in metagraph.axons]
342
  if weights and metagraph.W is not None:
343
  # convert NxN tensor to a list of lists so it fits into the dataframe
344
- frame['weights'] = [w.tolist() for w in metagraph.W]
345
 
346
  return frame
347
 
 
348
  def load_state_vars() -> dict[Any]:
349
  while True:
350
  try:
@@ -355,8 +383,11 @@ def load_state_vars() -> dict[Any]:
355
  model_data: List[ModelData] = get_subnet_data(subtensor, metagraph)
356
  model_data.sort(key=lambda x: x.incentive, reverse=True)
357
 
358
- bt.logging.success(f'Loaded {len(model_data)} models')
359
- vali_runs = get_wandb_runs(project=VALIDATOR_WANDB_PROJECT, filters={"config.type": "validator", "config.uid": 238})
 
 
 
360
 
361
  scores = get_scores([x.uid for x in model_data], vali_runs)
362
 
@@ -385,40 +416,98 @@ def load_state_vars() -> dict[Any]:
385
  time.sleep(30)
386
 
387
  return {
388
- 'metagraph': metagraph,
389
  "model_data": model_data,
390
  "vali_runs": vali_runs,
391
  "scores": scores,
392
  "validator_df": validator_df,
393
  "benchmarks": benchmarks,
394
- "benchmark_timestamp": benchmark_timestamp
395
  }
396
 
 
397
  def test_load_state_vars():
398
 
399
  subtensor = bt.subtensor("finney")
400
  metagraph = subtensor.metagraph(NETUID, lite=True)
401
  model_data = [
402
- ModelData(uid=253, hotkey='5DjoPAgZ54Zf6NsuiVYh8RjonnWWWREE2iXBNzM2VDBMQDPm', namespace='jw-hf-test', name='jw2', commit='aad131f6b02219964e6dcf749c2a23e75a7ceca8', hash='L1ImYzWJwV+9KSnZ2TYW0Iy2KMcVjJVTd30YJoRkpbw=', block=3131103, incentive=1.0, emission=209.06051635742188),
403
- ModelData(uid=1, hotkey='5CccVtjk4yamCao6QYgEg7jc8vktdj16RbLKNUftHfEsjuJS', namespace='borggAI', name='bittensor-subnet9-models', commit='d373864bc6c972872edb8db95eed570958054bac', hash='+drdTIKYEGYClW2FFVVID6A2Dh//4rLmExRFCJsH6Y4=', block=2081837, incentive=0.0, emission=0.0),
404
- ModelData(uid=2, hotkey='5HYwoXaczs3jAptbb5mk4aUCkgZqeNcNzJKxSec97GwasfLy', namespace='jungiebeen', name='pretrain1', commit='4c0c6bfd0f92e243d6c8a82209142e7204c852c3', hash='ld/agc0XIWICom/Cpj0fkQLcMogMNj/F65MJogK5RLY=', block=2467482, incentive=0.0, emission=0.0),
405
- ModelData(uid=3, hotkey='5Dnb6edh9yTeEp5aasRPZVPRAkxvQ6qnERVcXw22awMZ5rxm', namespace='jungiebeen', name='pretrain2', commit='e827b7281c92224adb11124489cc45356553a87a', hash='ld/agc0XIWICom/Cpj0fkQLcMogMNj/F65MJogK5RLY=', block=2467497, incentive=0.0, emission=0.0),
406
- ModelData(uid=4, hotkey='5FRfca8NbnH424WaX43PMhKBnbLA1bZpRRoXXiVs6HgsxN4K', namespace='ZainAli60', name='mine_modeles', commit='8a4ed4ad1f1fb58d424fd22e8e9874b87d32917c', hash='tVcbZAFoNIOF+Ntxq31OQ2NrLXf5iFCmmPUJlpkMYYo=', block=2508509, incentive=0.0, emission=0.0)
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
407
  ]
408
- vali_runs = get_wandb_runs(project=VALIDATOR_WANDB_PROJECT, filters={"config.type": "validator", "config.uid": 238})
 
 
 
409
 
410
  scores = get_scores([x.uid for x in model_data], vali_runs)
411
 
412
  validator_df = {
413
  28: (1.0, 33273.4453125, {253: 1.0}),
414
- 49: (0.9127794504165649,
415
- 10401.677734375,
416
- {7: 0.0867,
417
- 217: 0.0001,
418
- 219: 0.0001,
419
- 241: 0.0001,
420
- 248: 0.0001,
421
- 253: 0.9128}),
 
 
 
 
422
  78: (1.0, 26730.37109375, {253: 1.0}),
423
  116: (1.0, 629248.4375, {253: 1.0}),
424
  150: (1.0, 272634.53125, {253: 1.0}),
@@ -438,11 +527,11 @@ def test_load_state_vars():
438
  249: (1.0, 478127.3125, {253: 1.0}),
439
  252: (1.0, 442395.03125, {253: 1.0}),
440
  254: (1.0, 46845.2109375, {253: 1.0}),
441
- 255: (1.0, 28977.56640625, {253: 1.0})
442
  }
443
 
444
  return {
445
- 'metagraph': metagraph,
446
  "model_data": model_data,
447
  "vali_runs": vali_runs,
448
  "scores": scores,
 
 
 
 
 
 
 
 
1
  import argparse
2
+ import datetime
3
  import functools
4
+ import json
5
+ import math
6
+ import os
7
+ import time
8
  import traceback
9
+ from dataclasses import dataclass
10
+ from typing import Any, Dict, List, Optional, Tuple
11
 
 
 
12
  import bittensor as bt
13
+ import numpy as np
14
+ import pandas as pd
15
+ import wandb
 
16
  from bittensor.extrinsics.serving import get_metadata
17
+ from dotenv import load_dotenv
18
 
19
+ # TODO: Update once registered
20
+ NETUID = 179
21
  DELAY_SECS = 3
22
  RETRIES = 3
23
 
 
25
 
26
  WANDB_TOKEN = os.environ.get("WANDB_API_KEY", None)
27
  SUBTENSOR_ENDPOINT = os.environ.get("SUBTENSOR_ENDPOINT", None)
28
+ VALIDATOR_WANDB_PROJECT = "rusticluftig/finetuning"
29
+ BENCHMARK_WANDB_PROJECT = ""
30
  BENCHMARK_FLAG = os.environ.get("BENCHMARK_FLAG", None)
31
 
32
+
33
+ @dataclass(frozen=True)
34
  class ModelData:
35
  uid: int
36
  hotkey: str
37
+ competition_id: int
38
  namespace: str
39
  name: str
40
  commit: str
41
+
42
+ # Hash of (hash(model) + hotkey)
43
+ secure_hash: str
44
  block: int
45
  incentive: float
46
  emission: float
 
62
  hotkey=hotkey,
63
  namespace=tokens[0],
64
  name=tokens[1],
65
+ commit=tokens[2],
66
+ secure_hash=tokens[3],
67
+ competition_id=int(tokens[4]),
68
  block=block,
69
  incentive=incentive,
70
  emission=emission,
 
72
 
73
 
74
  def run_with_retries(func, *args, **kwargs):
75
+ """Runs a provided function with retries in the event of a failure."""
76
  for i in range(0, RETRIES):
77
  try:
78
  return func(*args, **kwargs)
 
85
 
86
 
87
  def get_subtensor_and_metagraph() -> Tuple[bt.subtensor, bt.metagraph]:
88
+ """Returns a subtensor and metagraph for the finetuning subnet."""
89
 
90
  def _internal() -> Tuple[bt.subtensor, bt.metagraph]:
91
  if SUBTENSOR_ENDPOINT:
92
  parser = argparse.ArgumentParser()
93
  bt.subtensor.add_args(parser)
94
+ subtensor = bt.subtensor(
95
+ config=bt.config(
96
+ parser=parser,
97
+ args=["--subtensor.chain_endpoint", SUBTENSOR_ENDPOINT],
98
+ )
99
+ )
100
  else:
101
  subtensor = bt.subtensor("finney")
102
 
 
245
  for _, uid_data in all_uid_data.items():
246
  loss = uid_data.get("average_loss", math.inf)
247
  # Filter out the numbers from the exploit and when validators lost the best model.
248
+ if (
249
+ loss < best_loss
250
+ and (loss > 2.5 or timestamp > datetime.datetime(2024, 2, 12))
251
+ and (loss < 5 or timestamp > datetime.datetime(2024, 3, 27))
252
+ ):
253
  best_loss = uid_data["average_loss"]
254
  if best_loss != math.inf:
255
  timestamps.append(timestamp)
 
312
  if artifacts:
313
  table = artifacts[-1].get("benchmarks")
314
  if table:
315
+ return table.get_dataframe(), datetime.datetime.strptime(
316
+ run.metadata["startedAt"], "%Y-%m-%dT%H:%M:%S.%f"
317
+ )
318
  bt.logging.error("Failed to get benchmarks from Wandb.")
319
  return None, None
320
 
321
 
322
+ def make_validator_dataframe(
323
+ validator_df: pd.DataFrame, model_data: ModelData
324
+ ) -> pd.DataFrame:
325
 
326
  values = [
327
+ [uid, int(validator_df[uid][1]), round(validator_df[uid][0], 4)]
328
+ + [validator_df[uid][-1].get(c.uid) for c in model_data if c.incentive]
329
+ for uid, _ in sorted(
330
+ zip(
331
+ validator_df.keys(),
332
+ [validator_df[x][1] for x in validator_df.keys()],
333
+ ),
334
+ key=lambda x: x[1],
335
+ reverse=True,
336
+ )
337
+ ]
338
+ dtypes = {"UID": int, "Stake (τ)": float, "V-Trust": float}
339
+ dtypes.update(
340
+ {
 
 
 
341
  f"{c.namespace}/{c.name} ({c.commit[0:8]})": float
342
  for c in model_data
343
  if c.incentive
344
+ }
345
+ )
346
  return pd.DataFrame(values, columns=dtypes.keys()).astype(dtypes)
347
 
348
+
349
  def make_metagraph_dataframe(metagraph: bt.metagraph, weights=False) -> pd.DataFrame:
350
 
351
+ cols = [
352
+ "stake",
353
+ "emission",
354
+ "trust",
355
+ "validator_trust",
356
+ "dividends",
357
+ "incentive",
358
+ "R",
359
+ "consensus",
360
+ "validator_permit",
361
+ ]
362
 
363
  frame = pd.DataFrame({k: getattr(metagraph, k) for k in cols})
364
+ frame["block"] = metagraph.block.item()
365
+ frame["netuid"] = NETUID
366
+ frame["uid"] = range(len(frame))
367
+ frame["hotkey"] = [axon.hotkey for axon in metagraph.axons]
368
+ frame["coldkey"] = [axon.coldkey for axon in metagraph.axons]
369
  if weights and metagraph.W is not None:
370
  # convert NxN tensor to a list of lists so it fits into the dataframe
371
+ frame["weights"] = [w.tolist() for w in metagraph.W]
372
 
373
  return frame
374
 
375
+
376
  def load_state_vars() -> dict[Any]:
377
  while True:
378
  try:
 
383
  model_data: List[ModelData] = get_subnet_data(subtensor, metagraph)
384
  model_data.sort(key=lambda x: x.incentive, reverse=True)
385
 
386
+ bt.logging.success(f"Loaded {len(model_data)} models")
387
+ vali_runs = get_wandb_runs(
388
+ project=VALIDATOR_WANDB_PROJECT,
389
+ filters={"config.type": "validator", "config.uid": 238},
390
+ )
391
 
392
  scores = get_scores([x.uid for x in model_data], vali_runs)
393
 
 
416
  time.sleep(30)
417
 
418
  return {
419
+ "metagraph": metagraph,
420
  "model_data": model_data,
421
  "vali_runs": vali_runs,
422
  "scores": scores,
423
  "validator_df": validator_df,
424
  "benchmarks": benchmarks,
425
+ "benchmark_timestamp": benchmark_timestamp,
426
  }
427
 
428
+
429
  def test_load_state_vars():
430
 
431
  subtensor = bt.subtensor("finney")
432
  metagraph = subtensor.metagraph(NETUID, lite=True)
433
  model_data = [
434
+ ModelData(
435
+ uid=253,
436
+ hotkey="5DjoPAgZ54Zf6NsuiVYh8RjonnWWWREE2iXBNzM2VDBMQDPm",
437
+ namespace="jw-hf-test",
438
+ name="jw2",
439
+ commit="aad131f6b02219964e6dcf749c2a23e75a7ceca8",
440
+ secure_hash="L1ImYzWJwV+9KSnZ2TYW0Iy2KMcVjJVTd30YJoRkpbw=",
441
+ block=3131103,
442
+ incentive=1.0,
443
+ emission=209.06051635742188,
444
+ ),
445
+ ModelData(
446
+ uid=1,
447
+ hotkey="5CccVtjk4yamCao6QYgEg7jc8vktdj16RbLKNUftHfEsjuJS",
448
+ namespace="borggAI",
449
+ name="bittensor-subnet9-models",
450
+ commit="d373864bc6c972872edb8db95eed570958054bac",
451
+ secure_hash="+drdTIKYEGYClW2FFVVID6A2Dh//4rLmExRFCJsH6Y4=",
452
+ block=2081837,
453
+ incentive=0.0,
454
+ emission=0.0,
455
+ ),
456
+ ModelData(
457
+ uid=2,
458
+ hotkey="5HYwoXaczs3jAptbb5mk4aUCkgZqeNcNzJKxSec97GwasfLy",
459
+ namespace="jungiebeen",
460
+ name="pretrain1",
461
+ commit="4c0c6bfd0f92e243d6c8a82209142e7204c852c3",
462
+ secure_hash="ld/agc0XIWICom/Cpj0fkQLcMogMNj/F65MJogK5RLY=",
463
+ block=2467482,
464
+ incentive=0.0,
465
+ emission=0.0,
466
+ ),
467
+ ModelData(
468
+ uid=3,
469
+ hotkey="5Dnb6edh9yTeEp5aasRPZVPRAkxvQ6qnERVcXw22awMZ5rxm",
470
+ namespace="jungiebeen",
471
+ name="pretrain2",
472
+ commit="e827b7281c92224adb11124489cc45356553a87a",
473
+ secure_hash="ld/agc0XIWICom/Cpj0fkQLcMogMNj/F65MJogK5RLY=",
474
+ block=2467497,
475
+ incentive=0.0,
476
+ emission=0.0,
477
+ ),
478
+ ModelData(
479
+ uid=4,
480
+ hotkey="5FRfca8NbnH424WaX43PMhKBnbLA1bZpRRoXXiVs6HgsxN4K",
481
+ namespace="ZainAli60",
482
+ name="mine_modeles",
483
+ commit="8a4ed4ad1f1fb58d424fd22e8e9874b87d32917c",
484
+ secure_hash="tVcbZAFoNIOF+Ntxq31OQ2NrLXf5iFCmmPUJlpkMYYo=",
485
+ block=2508509,
486
+ incentive=0.0,
487
+ emission=0.0,
488
+ ),
489
  ]
490
+ vali_runs = get_wandb_runs(
491
+ project=VALIDATOR_WANDB_PROJECT,
492
+ filters={"config.type": "validator", "config.uid": 238},
493
+ )
494
 
495
  scores = get_scores([x.uid for x in model_data], vali_runs)
496
 
497
  validator_df = {
498
  28: (1.0, 33273.4453125, {253: 1.0}),
499
+ 49: (
500
+ 0.9127794504165649,
501
+ 10401.677734375,
502
+ {
503
+ 7: 0.0867,
504
+ 217: 0.0001,
505
+ 219: 0.0001,
506
+ 241: 0.0001,
507
+ 248: 0.0001,
508
+ 253: 0.9128,
509
+ },
510
+ ),
511
  78: (1.0, 26730.37109375, {253: 1.0}),
512
  116: (1.0, 629248.4375, {253: 1.0}),
513
  150: (1.0, 272634.53125, {253: 1.0}),
 
527
  249: (1.0, 478127.3125, {253: 1.0}),
528
  252: (1.0, 442395.03125, {253: 1.0}),
529
  254: (1.0, 46845.2109375, {253: 1.0}),
530
+ 255: (1.0, 28977.56640625, {253: 1.0}),
531
  }
532
 
533
  return {
534
+ "metagraph": metagraph,
535
  "model_data": model_data,
536
  "vali_runs": vali_runs,
537
  "scores": scores,