Download code/wp/prep_data.py from Broyojo/world-pretraining-runs: direct link, hf CLI and curl.
- Browser
- Download file 2.38 kB
-
https://huggingface.co/Broyojo/world-pretraining-runs/resolve/main/code/wp/prep_data.py
- Command line
-
hf download hf://Broyojo/world-pretraining-runs/code/wp/prep_data.py
-
curl -L -o prep_data.py https://huggingface.co/Broyojo/world-pretraining-runs/resolve/main/code/wp/prep_data.py
2.38 kB
| """Tokenize FineWeb-Edu (sample-10BT) with the GPT-2 tokenizer into flat uint16 files. | |
| Each document is written as [EOT] + tokens. Train comes from shards 000-006 | |
| (~5B tokens), val from the first --val_tokens of shard 013. | |
| """ | |
| import argparse | |
| from multiprocessing import Pool | |
| from pathlib import Path | |
| import numpy as np | |
| import pyarrow.parquet as pq | |
| import tiktoken | |
| from huggingface_hub import hf_hub_download | |
| REPO = "HuggingFaceFW/fineweb-edu" | |
| ENC = None | |
| def encode(texts): | |
| global ENC | |
| if ENC is None: | |
| ENC = tiktoken.get_encoding("gpt2") | |
| out = [] | |
| for ids in ENC.encode_ordinary_batch(texts): | |
| out.append(ENC.eot_token) | |
| out.extend(ids) | |
| return np.asarray(out, dtype=np.uint16) | |
| def text_batches(path, batch=1024): | |
| for rb in pq.ParquetFile(path).iter_batches(batch_size=batch, columns=["text"]): | |
| yield rb.column("text").to_pylist() | |
| def write_split(shards, dst, max_tokens, workers): | |
| n = 0 | |
| with open(dst, "wb") as f, Pool(workers) as pool: | |
| for shard in shards: | |
| local = hf_hub_download(REPO, f"sample/10BT/{shard}_00000.parquet", repo_type="dataset") | |
| for arr in pool.imap(encode, text_batches(local), chunksize=4): | |
| if max_tokens and n + len(arr) > max_tokens: | |
| arr = arr[: max_tokens - n] | |
| f.write(arr.tobytes()) | |
| n += len(arr) | |
| if max_tokens and n >= max_tokens: | |
| return n | |
| print(f"{dst.name}: {shard} done, {n / 1e9:.3f}B tokens", flush=True) | |
| return n | |
| def main(): | |
| p = argparse.ArgumentParser() | |
| p.add_argument("--out_dir", default="/data/fineweb-edu-gpt2") | |
| p.add_argument("--train_shards", default="000,001,002,003,004,005,006") | |
| p.add_argument("--val_shard", default="013") | |
| p.add_argument("--val_tokens", type=int, default=20_000_000) | |
| p.add_argument("--workers", type=int, default=32) | |
| args = p.parse_args() | |
| out = Path(args.out_dir) | |
| out.mkdir(parents=True, exist_ok=True) | |
| nv = write_split([args.val_shard], out / "val.bin", args.val_tokens, args.workers) | |
| print(f"val: {nv} tokens", flush=True) | |
| nt = write_split(args.train_shards.split(","), out / "train.bin", 0, args.workers) | |
| print(f"train: {nt} tokens", flush=True) | |
| (out / "DONE").write_text(f"train={nt}\nval={nv}\n") | |
| if __name__ == "__main__": | |
| main() | |