YAML Metadata Warning:empty or missing yaml metadata in repo card
Check out the documentation for more information.
ParaRater: Enhancing Cross-Lingual Transfer in LLMs with Meta-Learning
ParaRater is a data selection method that enhances cross-lingual transfer by selecting the most valuable parallel pairs, forming high-impact parallel corpora with two meta-learned raters.
Raters
This is the repository of trained rater models of ParaRater. Raters are trained based on Qwen3-Embedding-0.6B.
Usage
Each pair of Rater1 and Rater2 trained for a specific target language can be jointly used to filter English corpora.
import argparse
import torch
import pandas as pd
import pyarrow.parquet as pq
from transformers import AutoTokenizer, AutoModelForSequenceClassification
def percentile_ranks(scores):
# higher=better -> percentile in [0,1], 1.0 is best
order = torch.argsort(scores, descending=True)
ranks = torch.empty_like(order, dtype=torch.float)
ranks[order] = torch.arange(len(scores), dtype=torch.float)
denom = max(1, len(scores) - 1)
return 1.0 - ranks / denom
@torch.no_grad()
def batched_logits(texts, tokenizer, model, batch_size=64, max_length=512, device="cuda" if torch.cuda.is_available() else "cpu"):
model.to(device).eval()
out_scores = []
for i in range(0, len(texts), batch_size):
batch = texts[i:i+batch_size]
enc = tokenizer(batch, padding=True, truncation=True,
max_length=max_length, return_tensors="pt").to(device)
logits = model(**enc).logits.squeeze(-1) # (B,) for class_num=1
out_scores.append(logits.cpu())
return torch.cat(out_scores, dim=0)
def main():
ap = argparse.ArgumentParser()
ap.add_argument("--parquet", required=True, help="Input parquet path with column 'text'.")
ap.add_argument("--rater1", default="pararater_rater1_en-ar", help="Rater1.")
ap.add_argument("--rater2", default="pararater_rater2_en-ar", help="Rater2.")
ap.add_argument("--save_parquet", default=None, help="Optional output parquet for kept samples.")
ap.add_argument("--batch_size", type=int, default=64)
ap.add_argument("--max_length", type=int, default=512)
args = ap.parse_args()
# 1) Load data
df = pq.read_table(args.parquet).to_pandas()
assert "text" in df.columns, "Parquet must have a 'text' column."
texts = df["text"].astype(str).tolist()
# 2) Load raters
tok = AutoTokenizer.from_pretrained(args.rater1, trust_remote_code=True)
r1 = AutoModelForSequenceClassification.from_pretrained(args.rater1, trust_remote_code=True)
r2 = AutoModelForSequenceClassification.from_pretrained(args.rater2, trust_remote_code=True)
# 3) Score -> percentile ranks
s1 = batched_logits(texts, tok, r1, batch_size=args.batch_size, max_length=args.max_length)
s2 = batched_logits(texts, tok, r2, batch_size=args.batch_size, max_length=args.max_length)
p1 = percentile_ranks(s1) # 1.0 best
p2 = percentile_ranks(s2)
# 4) Rule: keep if (p1 >= 0.6) and (p2 <= p1 - 0.2)
top = p1 >= 0.6
drop = p2 <= (p1 - 0.2)
keep_mask = (top & drop).numpy()
kept = df.loc[keep_mask]
print(f"Total: {len(df)} | Rater1 top-0.6: {int(top.sum().item())} | Kept(final): {keep_mask.sum()}")
if args.save_parquet:
kept.to_parquet(args.save_parquet, index=False)
print(f"Saved: {args.save_parquet}")
if __name__ == "__main__":
main()
Inference Providers NEW
This model isn't deployed by any Inference Provider. 🙋 Ask for provider support