agentic-rag / docs /Build Dataset Guide.md
vksepm
feat: HF Spaces deployment — FAISS retriever, single-container Docker build
635dd02
|
Raw
History Blame Contribute Delete
6.45 kB
# Build Dataset Guide
This guide explains how to use `build_dataset.py` to create the pre-embedded ArXiv corpus required by Agentic-RAG's HF Spaces deployment.
---
## Overview
The retriever tool loads a HuggingFace Dataset of pre-computed 384-dim embeddings at startup and builds a FAISS index in memory. `build_dataset.py` is the one-time script that creates this dataset.
```
jamescalam/ai-arxiv2-chunks → embed locally → ./dataset_cache → push to HF Hub
(~241k raw chunks) (SentenceTransformer) (Arrow format) (your repo)
```
---
## Prerequisites
Install the required packages into any Python 3.10+ environment:
```bash
pip install datasets sentence-transformers huggingface-hub numpy tqdm torch
```
> **GPU users:** install the CUDA-enabled torch build for your driver version.
> See [pytorch.org/get-started](https://pytorch.org/get-started/locally/).
> CPU-only torch also works — it just runs slower.
A HuggingFace account with a **write-access token** is required for the push step.
Generate one at [huggingface.co/settings/tokens](https://huggingface.co/settings/tokens).
---
## Recommended: Two-Step Workflow
Separating the embed step from the push step means a failed or interrupted upload does not require re-embedding everything.
### Step 1 — Embed and save locally
```bash
python build_dataset.py --build-only --limit 5000 --output-dir ./dataset_cache
```
This streams `jamescalam/ai-arxiv2-chunks` from HF Hub, embeds each chunk with `all-MiniLM-L6-v2`, and saves an Arrow dataset to `./dataset_cache/`.
| Flag | Description |
|---|---|
| `--limit N` | Process only the first N chunks. Omit for the full ~241k corpus. |
| `--output-dir PATH` | Where to save the Arrow dataset (default: `./dataset_cache`). |
| `--device auto\|cpu\|cuda\|mps` | Compute device (default: `auto`). See [GPU section](#gpu-acceleration) below. |
**Expected output:**
```
INFO: GPU detected (CUDA): NVIDIA GeForce RTX 3080
INFO: Loading source dataset: jamescalam/ai-arxiv2-chunks
INFO: Rows to embed: 5000 (of 241874 available)
INFO: Loading embedding model: sentence-transformers/all-MiniLM-L6-v2 [device=cuda]
INFO: Embedding 5000 chunks [batch_size=256, estimated time ~10s] …
...
INFO: Embedding complete in 9.3s (537 chunks/s)
INFO: Saved 5000 rows (8.2 MB) → ./dataset_cache
```
### Step 2 — Push to HuggingFace Hub
```bash
python build_dataset.py --push-only \
--output-dir ./dataset_cache \
--repo-id myuser/agentic-rag-chunks \
--hf-token hf_xxxxxxxxxxxxxxxxxxxx
```
Or set the token in your environment to avoid passing it on the command line:
```bash
export HF_TOKEN=hf_xxxxxxxxxxxxxxxxxxxx
python build_dataset.py --push-only \
--output-dir ./dataset_cache \
--repo-id myuser/agentic-rag-chunks
```
The `--repo-id` is created automatically if it does not exist. To create a **private** dataset:
```bash
python build_dataset.py --push-only --output-dir ./dataset_cache \
--repo-id myuser/agentic-rag-chunks --private
```
---
## One-Shot Workflow
Build and push in a single command:
```bash
python build_dataset.py \
--limit 5000 \
--repo-id myuser/agentic-rag-chunks \
--hf-token hf_xxxxxxxxxxxxxxxxxxxx
```
---
## GPU Acceleration
The script detects the best available device automatically (`--device auto`):
| Priority | Device | Typical throughput | Time for 5k chunks |
|---|---|---|---|
| 1 | CUDA (NVIDIA GPU) | ~500 chunks/s | ~10s |
| 2 | MPS (Apple Silicon) | ~300 chunks/s | ~17s |
| 3 | CPU | ~40 chunks/s | ~2 min |
GPU batch size is automatically set to 256; CPU batch size is 64.
**Override the device:**
```bash
# Force CPU (e.g. to benchmark or avoid VRAM issues)
python build_dataset.py --build-only --limit 5000 --device cpu
# Force a specific CUDA device (multi-GPU machine)
CUDA_VISIBLE_DEVICES=1 python build_dataset.py --build-only --limit 5000
```
**Verify GPU is being used:**
```bash
# In another terminal while the script runs
watch -n 1 nvidia-smi
```
---
## Corpus Size Reference
| `--limit` | Chunks | Disk size | CPU time | GPU time |
|---|---|---|---|---|
| `5000` | 5 000 | ~8 MB | ~2 min | ~10s |
| `50000` | 50 000 | ~80 MB | ~20 min | ~2 min |
| *(omit)* | ~241 000 | ~370 MB | ~2–4 hrs | ~8 min |
For HF Spaces demos, `--limit 5000` gives good coverage of the corpus at minimal build time.
---
## Overwriting an Existing Dataset
By default the push step refuses to overwrite an existing HF Hub dataset as a safety guard:
```
ERROR: Dataset 'myuser/agentic-rag-chunks' already exists on HF Hub.
Pass --force to overwrite it.
```
To overwrite intentionally:
```bash
python build_dataset.py --push-only --output-dir ./dataset_cache \
--repo-id myuser/agentic-rag-chunks --force
```
Similarly, `--build-only` refuses to write into an existing `--output-dir`. Delete it first:
```bash
rm -rf ./dataset_cache
python build_dataset.py --build-only --limit 5000 --output-dir ./dataset_cache
```
---
## After Pushing
Set `HF_DATASET_REPO` as a secret in your HF Space:
```
HF_DATASET_REPO=myuser/agentic-rag-chunks
```
If the dataset is private, also set:
```
HF_TOKEN=hf_xxxxxxxxxxxxxxxxxxxx
```
The dataset is loaded at container startup and a FAISS index is built in memory (~60s for 5k chunks, ~5 min for 241k).
---
## Dataset Schema
| Column | Type | Description |
|---|---|---|
| `chunk_id` | string | Original `chunk-id` from the source dataset |
| `content` | string | Raw chunk text |
| `title` | string | Paper title |
| `source_url` | string | `https://arxiv.org/abs/<doi>` |
| `full_citation` | string | `<title> arXiv:<doi>` |
| `embedding` | float32[384] | L2-normalised embedding from `all-MiniLM-L6-v2` |
---
## Troubleshooting
| Error | Cause | Fix |
|---|---|---|
| `403 Forbidden: You don't have the rights to create a dataset` | Token missing or read-only | Generate a **write** token at huggingface.co/settings/tokens |
| `Output directory already exists` | Previous `--build-only` run left data | Delete `./dataset_cache` and re-run, or use `--push-only` |
| `CUDA out of memory` | Batch too large for VRAM | Add `--device cpu` or reduce `BATCH_SIZE_GPU` in the script |
| `RepositoryNotFoundError` on push | `--repo-id` typo or wrong namespace | Check the exact username at huggingface.co |
| Dataset loads but FAISS search returns no results | Embeddings not L2-normalised | Rebuild with the current script (`normalize_embeddings=True` is set) |