FineWeb-HQ-Classifiers
This repository contains the model weights of the trained deep learning classifiers used to identify structured and knowledge-rich samples for the FineWeb-HQ and FineWeb2-HQ datasets.
FineWeb-HQ and FineWeb2-HQ are high-quality, model-filtered, multilingual pretraining datasets derived as subsets of FineWeb and FineWeb2. The datasets were created by selecting the top 10% of FineWeb and FineWeb-2 documents. The classifiers use XLM-RoBERTa embeddings to score the documents.
For more details, see our paper Enhancing Multilingual LLM Pretraining with Model-Based Data Selection.
Quickstart
Classifiers use a simple architecture that takes mean-pooled XLM-RoBERTa embeddings as input and outputs the score logit.
import torch
import torch.nn.functional as F
from transformers import AutoModel, AutoTokenizer
import huggingface_hub
class BinaryClassifier(torch.nn.Module):
def __init__(self, embedding_dim=768, hidden_dim=256):
super(BinaryClassifier, self).__init__()
self.classifier = torch.nn.Sequential(
torch.nn.Linear(embedding_dim, hidden_dim),
torch.nn.ReLU(),
torch.nn.Dropout(0.2),
torch.nn.Linear(hidden_dim, 1),
)
def forward(self, X):
return self.classifier(X)
def to_pt(self, file_name):
torch.save(self.state_dict(), file_name)
def from_pt(file_name, embedding_dim=768, hidden_dim=256):
state_dict = torch.load(
file_name,
weights_only=True,
map_location=torch.device("cpu"),
)
classifier = BinaryClassifier(
embedding_dim=embedding_dim,
hidden_dim=hidden_dim,
)
classifier.load_state_dict(state_dict)
classifier.eval()
return classifier
if __name__ == "__main__":
embedding_model_name = "FacebookAI/xlm-roberta-base"
tokenizer = AutoTokenizer.from_pretrained(embedding_model_name)
embedding_model = AutoModel.from_pretrained(
embedding_model_name,
dtype=torch.bfloat16,
)
classifiers_dir = huggingface_hub.snapshot_download("epfml/FineWeb-HQ-Classifiers")
classifier_model_en = BinaryClassifier.from_pt(f"{classifiers_dir}/eng_Latn.pt")
def score_sample(text, classifier_model):
inputs = tokenizer([text], return_tensors="pt")
embeddings = embedding_model(**inputs).last_hidden_state.float().mean(1)
score = F.sigmoid(classifier_model(embeddings)).item()
return score
text = "Question: How is bipolar disorder different from unipolar depression or 'regular' depression?\nAnswer: Both bipolar disorder and major depression are typically associated with depressive episodes. So both illnesses are accompanied by depressions. The difference is that in bipolar disorder people also have periods of elevation -- or severe irritability. We call these manic or hypomanic episodes."
score = score_sample(text, classifier_model_en)
print(f"{score:0.4f}") # 0.9338
text = "Custom Wedding Gifts\nPersonalized photo frames, albums & keepsakes. Heirloom quality!\nCustom Engraved Journals\nHandmade in Florence Italy. Dozens of sizes and paper styles!"
score = score_sample(text, classifier_model_en)
print(f"{score:0.4f}") # 0.0001
For a more efficient implementation, see our Github repository.
Citation information
@article
{messmer2025multilingdatacomp,
title={Enhancing Multilingual LLM Pretraining with Model-Based Data Selection},
author={Bettina Messmer and Vinko Sabolčec and Martin Jaggi},
journal={arXiv},
year={2025},
url={https://arxiv.org/abs/2502.10361},
}