Skip to content

Commit c9778a3

Browse files
committed
updating random --> rng
1 parent 2d456c4 commit c9778a3

File tree

3 files changed

+35
-23
lines changed

3 files changed

+35
-23
lines changed

dspy/propose/grounded_proposer.py

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -259,6 +259,7 @@ def __init__(
259259
set_tip_randomly=True,
260260
set_history_randomly=True,
261261
verbose=False,
262+
rng=None
262263
):
263264
super().__init__()
264265
self.program_aware = program_aware
@@ -269,6 +270,7 @@ def __init__(
269270
self.set_tip_randomly=set_tip_randomly
270271
self.set_history_randomly=set_history_randomly
271272
self.verbose = verbose
273+
self.rng = rng or random
272274

273275
self.prompt_model = get_prompt_model(prompt_model)
274276

@@ -309,7 +311,7 @@ def propose_instructions_for_program(
309311

310312
if self.set_history_randomly:
311313
# Randomly select whether or not we're using instruction history
312-
use_history = random.random() < 0.5
314+
use_history = self.rng.random() < 0.5
313315
self.use_instruct_history = use_history
314316
if self.verbose: print(f"Use history T/F: {self.use_instruct_history}")
315317

@@ -327,7 +329,7 @@ def propose_instructions_for_program(
327329
if self.set_tip_randomly:
328330
if self.verbose: print("Using a randomly generated configuration for our grounded proposer.")
329331
# Randomly select the tip
330-
selected_tip_key = random.choice(list(TIPS.keys()))
332+
selected_tip_key = self.rng.choice(list(TIPS.keys()))
331333
selected_tip = TIPS[selected_tip_key]
332334
self.use_tip = bool(
333335
selected_tip,

dspy/teleprompt/mipro_optimizer_v2.py

Lines changed: 14 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -87,6 +87,7 @@ def __init__(
8787
self.max_errors = max_errors
8888
self.metric_threshold = metric_threshold
8989
self.seed = seed
90+
self.rng = None
9091

9192
def compile(
9293
self,
@@ -110,8 +111,7 @@ def compile(
110111
) -> Any:
111112
# Set random seeds
112113
seed = seed or self.seed
113-
random.seed(seed)
114-
np.random.seed(seed)
114+
self._set_random_seeds(seed)
115115

116116
# Update max demos if specified
117117
if max_bootstrapped_demos is not None:
@@ -197,6 +197,12 @@ def compile(
197197
)
198198

199199
return best_program
200+
201+
def _set_random_seeds(self,
202+
seed
203+
):
204+
self.rng = random.Random(seed)
205+
np.random.seed(seed)
200206

201207
def _set_hyperparams_from_run_mode(
202208
self,
@@ -215,7 +221,7 @@ def _set_hyperparams_from_run_mode(
215221

216222
auto_settings = AUTO_RUN_SETTINGS[self.auto]
217223
num_trials = auto_settings["num_trials"]
218-
valset = create_minibatch(valset, batch_size=auto_settings["val_size"])
224+
valset = create_minibatch(valset, batch_size=auto_settings["val_size"], rng=self.rng)
219225
minibatch = len(valset) > MIN_MINIBATCH_SIZE
220226
self.num_candidates = int(
221227
np.round(np.min([num_trials * num_vars, (1.5 * num_trials) / num_vars]))
@@ -395,6 +401,7 @@ def _bootstrap_fewshot_examples(
395401
teacher_settings=self.teacher_settings,
396402
seed=seed,
397403
metric_threshold=self.metric_threshold,
404+
rng=self.rng,
398405
)
399406
except Exception as e:
400407
print(f"Error generating few-shot examples: {e}")
@@ -432,6 +439,7 @@ def _propose_instructions(
432439
use_instruct_history=False,
433440
set_history_randomly=False,
434441
verbose=self.verbose,
442+
rng=self.rng
435443
)
436444

437445
print("\nProposing instructions...\n")
@@ -467,7 +475,7 @@ def _optimize_prompt_parameters(
467475
seed: int,
468476
) -> Optional[Any]:
469477
print("Evaluating the default program...\n")
470-
default_score = eval_candidate_program(len(valset), valset, program, evaluate)
478+
default_score = eval_candidate_program(len(valset), valset, program, evaluate, self.rng)
471479
print(f"Default program score: {default_score}\n")
472480

473481
# Initialize optimization variables
@@ -521,7 +529,7 @@ def objective(trial):
521529
# Evaluate the candidate program
522530
batch_size = minibatch_size if minibatch else len(valset)
523531
score = eval_candidate_program(
524-
batch_size, valset, candidate_program, evaluate
532+
batch_size, valset, candidate_program, evaluate, self.rng
525533
)
526534

527535
# Update best score and program
@@ -690,7 +698,7 @@ def _perform_full_evaluation(
690698
f"Doing full eval on next top averaging program (Avg Score: {mean_score}) from minibatch trials..."
691699
)
692700
full_eval_score = eval_candidate_program(
693-
len(valset), valset, highest_mean_program, evaluate
701+
len(valset), valset, highest_mean_program, evaluate, self.rng
694702
)
695703
full_eval_scores.append(full_eval_score)
696704

dspy/teleprompt/utils.py

Lines changed: 17 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -24,22 +24,25 @@
2424
### OPTIMIZER TRAINING UTILS ###
2525

2626

27-
def create_minibatch(trainset, batch_size=50):
27+
def create_minibatch(trainset, batch_size=50, rng=None):
2828
"""Create a minibatch from the trainset."""
2929

3030
# Ensure batch_size isn't larger than the size of the dataset
3131
batch_size = min(batch_size, len(trainset))
3232

33-
# Randomly sample indices for the mini-batch
34-
sampled_indices = random.sample(range(len(trainset)), batch_size)
33+
# If no RNG is provided, fall back to the global random instance
34+
rng = rng or random
35+
36+
# Randomly sample indices for the mini-batch using the provided rng
37+
sampled_indices = rng.sample(range(len(trainset)), batch_size)
3538

3639
# Create the mini-batch using the sampled indices
3740
minibatch = [trainset[i] for i in sampled_indices]
3841

3942
return minibatch
4043

4144

42-
def eval_candidate_program(batch_size, trainset, candidate_program, evaluate):
45+
def eval_candidate_program(batch_size, trainset, candidate_program, evaluate, rng=None):
4346
"""Evaluate a candidate program on the trainset, using the specified batch size."""
4447
# Evaluate on the full trainset
4548
if batch_size >= len(trainset):
@@ -48,7 +51,7 @@ def eval_candidate_program(batch_size, trainset, candidate_program, evaluate):
4851
else:
4952
score = evaluate(
5053
candidate_program,
51-
devset=create_minibatch(trainset, batch_size),
54+
devset=create_minibatch(trainset, batch_size, rng),
5255
)
5356

5457
return score
@@ -279,6 +282,7 @@ def create_n_fewshot_demo_sets(
279282
teacher=None,
280283
include_non_bootstrapped=True,
281284
seed=0,
285+
rng=None
282286
):
283287
"""
284288
This function is copied from random_search.py, and creates fewshot examples in the same way that random search does.
@@ -292,17 +296,15 @@ def create_n_fewshot_demo_sets(
292296
# Initialize demo_candidates dictionary
293297
for i, _ in enumerate(student.predictors()):
294298
demo_candidates[i] = []
295-
296-
starter_seed = seed
297-
# Shuffle the trainset with the starter seed
298-
random.Random(starter_seed).shuffle(trainset)
299+
300+
rng = rng or random.Random(seed)
299301

300302
# Go through and create each candidate set
301303
for seed in range(-3, num_candidate_sets):
302304

303305
print(f"Bootstrapping set {seed+4}/{num_candidate_sets+3}")
304306

305-
trainset2 = list(trainset)
307+
trainset_copy = list(trainset)
306308

307309
if seed == -3 and include_non_bootstrapped:
308310
# zero-shot
@@ -316,7 +318,7 @@ def create_n_fewshot_demo_sets(
316318
# labels only
317319
teleprompter = LabeledFewShot(k=max_labeled_demos)
318320
program2 = teleprompter.compile(
319-
student, trainset=trainset2, sample=labeled_sample,
321+
student, trainset=trainset_copy, sample=labeled_sample,
320322
)
321323

322324
elif seed == -1:
@@ -329,12 +331,12 @@ def create_n_fewshot_demo_sets(
329331
teacher_settings=teacher_settings,
330332
max_rounds=max_rounds,
331333
)
332-
program2 = program.compile(student, teacher=teacher, trainset=trainset2)
334+
program2 = program.compile(student, teacher=teacher, trainset=trainset_copy)
333335

334336
else:
335337
# shuffled few-shot
336-
random.Random(seed).shuffle(trainset2)
337-
size = random.Random(seed).randint(min_num_samples, max_bootstrapped_demos)
338+
rng.shuffle(trainset_copy)
339+
size = rng.randint(min_num_samples, max_bootstrapped_demos)
338340

339341
teleprompter = BootstrapFewShot(
340342
metric=metric,
@@ -347,7 +349,7 @@ def create_n_fewshot_demo_sets(
347349
)
348350

349351
program2 = teleprompter.compile(
350-
student, teacher=teacher, trainset=trainset2,
352+
student, teacher=teacher, trainset=trainset_copy,
351353
)
352354

353355
for i, _ in enumerate(student.predictors()):

0 commit comments

Comments
 (0)