Views
No views yet
1from datasets import load_dataset
2from ragatouille import RAGTrainer
3from tqdm import tqdm
4import pickle
5from concurrent.futures import ThreadPoolExecutor
6from tqdm.notebook import tqdm
7import concurrent
8
9SAMPLE_SIZE = -1
10
11
12
13def int_to_string(number):
14 if number < 0:
15 return "full"
16 elif number < 1000:
17 return str(number)
18 elif number < 1000000:
19 return f"{number // 1000}K"
20 elif number >= 1000000:
21 return f"{number // 1000000}M"
22
23def process_chunk(chunk):
24 return [list(item) for item in zip(chunk["query"], chunk["positive"], chunk["negative"])]
25
26def chunked_iterable(iterable, chunk_size):
27 """Yield successive chunks from iterable."""
28 for i in range(0, len(iterable), chunk_size):
29 yield iterable[i:i + chunk_size]
30
31def process_dataset_concurrently(dataset, chunksize=1000):
32 with ThreadPoolExecutor() as executor:
33 # Wrap the dataset with tqdm for real-time updates
34 wrapped_dataset = tqdm(chunked_iterable(dataset, chunksize), total=(len(dataset) + chunksize - 1) // chunksize)
35 # Submit each chunk to the executor
36 futures = [executor.submit(process_chunk, chunk) for chunk in wrapped_dataset]
37 results = []
38 for future in concurrent.futures.as_completed(futures):
39 results.extend(future.result())
40 return results
41
42dataset = load_dataset('unicamp-dl/mmarco', 'german', trust_remote_code=True)
43
44
45# Shuffle the dataset and seed for reproducibility if needed
46shuffled_dataset = dataset['train'].shuffle(seed=42)
47
48
49if SAMPLE_SIZE > 0:
50 sampled_dataset = shuffled_dataset.select(range(SAMPLE_SIZE))
51else:
52 sampled_dataset = shuffled_dataset
53
54
55triplets = process_dataset_concurrently(sampled_dataset, chunksize=10000)
56trainer = RAGTrainer(model_name=f"ColBERT-mmacro-de-{int_to_string(SAMPLE_SIZE)}", pretrained_model_name="dbmdz/bert-base-german-cased", language_code="de",)
57trainer.prepare_training_data(raw_data=triplets, mine_hard_negatives=False)
581from datasets import load_dataset
2import os
3from ragatouille import RAGTrainer
4from tqdm import tqdm
5import pickle
6from concurrent.futures import ThreadPoolExecutor
7from tqdm.notebook import tqdm
8import concurrent
9from pathlib import Path
10
11
12def int_to_string(number):
13 if number < 1000:
14 return str(number)
15 elif number < 1000000:
16 return f"{number // 1000}K"
17 elif number >= 1000000:
18 return f"{number // 1000000}M"
19
20
21
22SAMPLE_SIZE = 1000000
23
24
25trainer = RAGTrainer(model_name=f"ColBERT-mmacro-de-{int_to_string(SAMPLE_SIZE)}", pretrained_model_name="dbmdz/bert-base-german-cased", language_code="de",)
26
27trainer.data_dir = Path("/kaggle/input/mmarco-de-10m")
28
29trainer.train(batch_size=32,
30 nbits=4, # How many bits will the trained model use when compressing indexes
31 maxsteps=500000, # Maximum steps hard stop
32 use_ib_negatives=True, # Use in-batch negative to calculate loss
33 dim=128, # How many dimensions per embedding. 128 is the default and works well.
34 learning_rate=5e-6, # Learning rate, small values ([3e-6,3e-5] work best if the base model is BERT-like, 5e-6 is often the sweet spot)
35 doc_maxlen=256, # Maximum document length. Because of how ColBERT works, smaller chunks (128-256) work very well.
36 use_relu=False, # Disable ReLU -- doesn't improve performance
37 warmup_steps="auto", # Defaults to 10%
38 )