chandassu-recognition / load_hf_model.py
sprx7767's picture
feat(cnn): publish eight-class weights, loader, and notebook
d8539db verified
Raw History Blame Contribute Delete
2.2 kB
"""Load the public eight-class poem CNN and classify a UTF-8 poem text file.
python scripts/load_hf_model.py --poem poem.txt --revision FULL_HF_COMMIT
"""
import argparse
from pathlib import Path
import torch
from huggingface_hub import HfApi
from transformers import AutoModelForSequenceClassification, AutoTokenizer
def main(argv=None):
parser = argparse.ArgumentParser(description=__doc__)
parser.add_argument("--repo_id", default="sprx7767/chandassu-recognition")
parser.add_argument("--revision", help="Immutable HF commit; if omitted, resolve main once and pin both loaders")
parser.add_argument("--subfolder", help="Optional explicit package: cnn-eight-class")
parser.add_argument("--poem", type=Path, required=True, help="Complete newline-separated poem in UTF-8")
parser.add_argument("--device", choices=["cpu", "cuda", "mps"], default="cpu")
args = parser.parse_args(argv)
revision = args.revision or HfApi().model_info(args.repo_id, token=False).sha
if len(revision) != 40 or any(c not in "0123456789abcdef" for c in revision):
parser.error("--revision must be a complete lowercase hexadecimal HF commit ID")
options = dict(revision=revision, trust_remote_code=True, token=False)
if args.subfolder:
options["subfolder"] = args.subfolder
tokenizer = AutoTokenizer.from_pretrained(args.repo_id, **options)
model = AutoModelForSequenceClassification.from_pretrained(args.repo_id, **options).to(args.device).eval()
if getattr(model.config, "prediction_unit", None) != "poem":
parser.error("This script requires the eight-class whole-poem model; original four-class models classify lines")
inputs = tokenizer(args.poem.read_text(encoding="utf-8"), padding=True, return_tensors="pt").to(args.device)
with torch.inference_mode():
scores = model(**inputs).logits.double().softmax(-1)[0]
print(f"Hugging Face revision: {revision}")
print(f"Prediction: {model.config.id2label[int(scores.argmax())]} (uncalibrated score)")
for i in scores.argsort(descending=True).tolist():
print(f"{model.config.id2label[i]}: {float(scores[i]):.4%}")
if __name__ == "__main__":
main()