Views
No views yet
| Parameter | Value |
|---|---|
| hidden_size | 256 |
| num_hidden_layers | 4 |
| num_attention_heads | 4 |
| num_key_value_heads | 4 |
| intermediate_size | 1024 |
| max_position_embeddings | 1024 |
| rope_theta | 100000.0 |
| tie_word_embeddings | true |
| Step | Epoch | Train Loss | Train PPL | Eval Loss | Eval PPL |
|---|---|---|---|---|---|
| 200 | 0.44 | 4.1022 | 60.53 | 1.8218 | 6.18 |
| 400 | 0.88 | 1.0227 | 2.78 | 0.5671 | 1.76 |
| 600 | 1.33 | 0.5434 | 1.72 | 0.3560 | 1.43 |
| 800 | 1.77 | 0.3978 | 1.49 | 0.2939 | 1.34 |
| 1000 | 2.21 | 0.3486 | 1.42 | 0.2514 | 1.29 |
| 1200 | 2.65 | 0.2944 | 1.34 | 0.2259 | 1.25 |

{"model_type": "gpt2", "n_ctx": 1024, "n_embd": 768, "n_head": 12, "n_inner": null, "n_layer": 6, "n_positions": 1024, "reorder_and_upcast_attn": false, "resid_pdrop": 0.1, "scale_attn_by_inverse_layer_idx": false, "scale_attn_weights": true, "summary_activation": null, "summary_first_dropout": 0.1, "summary_proj_to_labels": true, "summary_type": "cls_index", "summary_use_proj": true, "task_specific_params": {"text-generation": {"do_sample": true, "max_length": 50}}, "torch_dtype": "float32", "transformers_version": "4.25.1", "use_cache": true, "vocab_size": 50257}{"architectures": ["RobertaForSequenceClassification"], "attention_probs_dropout_prob": 0.1, "bos_token_id": 0, "classifier_dropout": null, "eos_token_id": 2, "hidden_act": "gelu", "hidden_dropout_prob": 0.1, "hidden_size": 768, "id2label": {"0": "LABEL_0"}, "initializer_range": 0.02, "intermediate_size": 3072, "label2id": {"LABEL_0": 0}, "layer_norm_eps": 1e-05, "max_position_embeddings": 514, "model_type": "roberta", "num_attention_heads": 12, "num_hidden_layers": 6, "pad_token_id": 1, "position_embedding_type": "absolute", "problem_type": "single_label_classification", "torch_dtype": "float32", "transformers_version": "4.11.3", "type_vocab_size": 1, "use_cache": true, "vocab_size": 50265}The cat crossed, "architectures": ["BertForSequenceClassification"], "attention_probs_dropout_prob": 0.1, "classifier_dropout": null, "hidden_act": "gelu", "hidden_dropout_prob": 0.1, "hidden_size": 768, "id2label": {"0": "anger", "1": "fear", "2": "surprise"}, "initializer_range": 0.02, "intermediate_size": 3072, "label2id": {"sadness": 0, "neutral": 1, "joy": 2}, "layer_norm_eps": 1e-12, "max_position_embeddings": 512, "model_type": "bert", "num_attention_heads": 12, "num_hidden_layers": 12, "pad_token_id": 0, "position_embedding_type": "absolute", "problem_type": "single_label_classification", "torch_dtype": "float32", "transformers_version": "4.11.3", "type_vocab_size": 2, "use_cache": true, "vocab_size": 30522}1# =============================================================================
2# Inference
3# =============================================================================
4
5MODEL_DIR = "Harley-ml/MCOD-4.7M" # path
6TOKENIZER_PATH = MODEL_DIR
7
8# --- Generation settings ---
9PROMPT = "{" # prompt
10MAX_NEW_TOKENS = 1024
11TEMPERATURE = 0.7
12TOP_P = 0.95
13TOP_K = 50
14REPETITION_PENALTY = 1.1
15DO_SAMPLE = True
16
17# =============================================================================
18
19import torch
20from pathlib import Path
21from transformers import (
22 AutoModelForCausalLM,
23 PreTrainedTokenizerFast,
24 AddedToken,
25)
26
27# ---------------------------------------------------------------------------
28# Device
29# ---------------------------------------------------------------------------
30
31device = (
32 "cuda" if torch.cuda.is_available() else
33 "mps" if torch.backends.mps.is_available() else
34 "cpu"
35)
36print(f"Device : {device}")
37
38# ---------------------------------------------------------------------------
39# Tokenizer (mirrors training setup)
40# ---------------------------------------------------------------------------
41
42def load_tokenizer(path: str):
43 p = Path(path).resolve()
44 if not p.exists():
45 raise FileNotFoundError(f"Tokenizer not found: {p}")
46 tok = PreTrainedTokenizerFast(tokenizer_file=str(p))
47 specials = {}
48 if tok.bos_token is None: specials["bos_token"] = AddedToken("<|bos|>", special=True)
49 if tok.eos_token is None: specials["eos_token"] = AddedToken("<|eos|>", special=True)
50 if tok.unk_token is None: specials["unk_token"] = AddedToken("<|unk|>", special=True)
51 if tok.pad_token is None:
52 if tok.eos_token is not None:
53 tok.pad_token = tok.eos_token
54 else:
55 specials["pad_token"] = AddedToken("<|pad|>", special=True)
56 if specials:
57 tok.add_special_tokens(specials)
58 tok.padding_side = "left" # left-pad for batched generation
59 return tok
60
61print("Loading tokenizer...")
62tokenizer = load_tokenizer(TOKENIZER_PATH)
63print(f" Vocab size : {tokenizer.vocab_size}")
64print(f" BOS : {tokenizer.bos_token!r}")
65print(f" EOS : {tokenizer.eos_token!r}")
66print(f" PAD : {tokenizer.pad_token!r} (id={tokenizer.pad_token_id})")
67
68# ---------------------------------------------------------------------------
69# Model
70# ---------------------------------------------------------------------------
71
72print(f"\nLoading model from {MODEL_DIR} ...")
73model = AutoModelForCausalLM.from_pretrained(
74 MODEL_DIR,
75 dtype=torch.float16 if device == "cuda" else torch.float32,
76 low_cpu_mem_usage=True,
77)
78model.eval()
79model.to(device)
80
81total_params = sum(p.numel() for p in model.parameters())
82print(f" Parameters : {total_params:,}")
83
84# ---------------------------------------------------------------------------
85# Generation helper
86# ---------------------------------------------------------------------------
87
88def generate(
89 prompt: str = PROMPT,
90 max_new_tokens: int = MAX_NEW_TOKENS,
91 temperature: float = TEMPERATURE,
92 top_p: float = TOP_P,
93 top_k: int = TOP_K,
94 repetition_penalty: float = REPETITION_PENALTY,
95 do_sample: bool = DO_SAMPLE,
96) -> str:
97
98 bos = tokenizer.bos_token or ""
99 full_prompt = bos + prompt
100
101 inputs = tokenizer(
102 full_prompt,
103 return_tensors="pt",
104 add_special_tokens=False,
105 ).to(device)
106 inputs.pop("token_type_ids", None) # Qwen3 doesn't use this
107
108 gen_kwargs = dict(
109 max_new_tokens = max_new_tokens,
110 do_sample = do_sample,
111 repetition_penalty = repetition_penalty,
112 eos_token_id = tokenizer.eos_token_id,
113 pad_token_id = tokenizer.pad_token_id,
114 )
115 if do_sample:
116 gen_kwargs["temperature"] = temperature
117 gen_kwargs["top_p"] = top_p
118 gen_kwargs["top_k"] = top_k
119
120 with torch.inference_mode():
121 output_ids = model.generate(**inputs, **gen_kwargs)
122
123 # Strip the prompt tokens so we only return what was generated
124 prompt_len = inputs["input_ids"].shape[-1]
125 new_ids = output_ids[0][prompt_len:]
126 return tokenizer.decode(new_ids, skip_special_tokens=True)
127
128
129# ---------------------------------------------------------------------------
130# Run
131# ---------------------------------------------------------------------------
132
133if __name__ == "__main__":
134 print(f"\nPrompt : {PROMPT!r}")
135 print("-" * 60)
136
137 output = generate(PROMPT)
138
139 print("Generated:")
140 print(output)1@misc{mcod-4.7m,
2 title = {MCOD-4.7M: Low Entropy Training; Hugging Face Model Configs},
3 author = {Harley-ml},
4 year = {2026},
5 url = {https://huggingface.co/Harley-ml/MCOD-4.7M}
6}