CoolFace
Modelpublic

Harley-ml/Tenete-8M

sourceHugging Facemitupdated 4mo agoView on Hugging Face
8likes85downloads
Model Card

Tenete-8M

Tenete-8M is an eight-million parameter model trained on five hundred and seventy-seven million tokens. While it can't answer "2 + 2" or write a coherent, logically sound essay, it will surprise you, and the credit goes to nampdnai's **tiny-textbooks**.

Why "Tenete"?

Tenete means "Small Canoe" in Taushiro, an endangered language with only one fluent speaker. This seemed like the most fitting name. Tenete, being the closest word to "small" in Taushiro that had an English translation, and the fact that the language itself has only one fluent speaker, reflects the tiny and limited size that Tenete-8M represents.

Architecture

Tenete-8M uses the Qwen3 architecture.

Parametervalue
NUMHIDDENLAYERS4
MAXWINDOWLAYERS3
HIDDEN_SIZE256
NUMATTENTIONHEADS4
NUMKEYVALUE_HEADS4
VOCAB_SIZE16000
INTERMEDIATE_SIZE1024
ROPE_THETA30000.0
MAXPOSITIONEMBEDDINGS1024
sliding_window384
TIEWORDEMBEDDINGSTrue
Embedding parametersNon-embedding parametersTotal parameters% of kv heads out of total heads% of swa layers out of total layers
4,096,0004,197,8888,293,888100%75%

Training

Tenete-8M was trained on an RTX 2060 6GB for one epoch with a batch size of 4 and a gradient accumulation of 18 (effective batch size=72) for two hours and twenty minutes.

Dataset

The dataset encompasses 577M tokens, and includes 4 sources:

  1. 1.Textbooks (1.2GB): Web data is too noisy, so we decided to use Tiny-Textbooks, a synthetic dataset generated by Nous-Hermes-Llama2-13b
  2. 2.**Medium Articles** (960MB): While web data, especially medium articles, is noisy, we still need human-written examples
  3. 3.**Books** (284MB): Albeit small, books are still needed to instill creativity into the model
  4. 4.Q&A (14MB): Sprinkled in to add more knowledgeable examples and question-answering.

We chose to not include code, raw webdata (e.g., fineweb, c4, etc.), and more narrow domains (e.g., arxiv, clinical trials, lesswrong, etc.).

Stats
MetricValue
tokens577M
Words384M
Characters2.428B
Bits/byte1.7054
Nats/byte1.1821
Nats/token5.0926
Characters/Token4.3081509289548

Training Results

EpochTrain LossEval LossTrain PPLEval PPLTrain BPBEval BPBTrain BPWEval BPW
0.072346.5484.870698.0130.42.1931.63114.19510.558
0.144704.2973.81673.545.41.4391.2789.3138.273
0.217003.5843.43636.031.11.2001.1517.7697.446
0.289303.3373.27928.126.51.1171.0987.2347.107
0.361703.2173.18425.024.11.0771.0666.9746.903
0.434003.1513.11923.422.61.0551.0446.8316.761
0.506403.0913.07522.021.71.0351.0306.7006.665
0.578703.0453.03621.020.81.0201.0176.5996.580
0.651003.0153.00320.420.21.0101.0066.5356.509
0.723402.9862.97819.819.61.0000.9976.4716.455
0.795702.9632.95819.419.30.9920.9916.4226.411
0.868002.9382.94018.918.90.9840.9856.3686.372
0.940402.9272.92718.718.70.9800.9806.3436.343

[image] Note: BPB stands for Bits Per Byte, and BPW stands for Bits Per Word. BPB is simply the amount of yes-no questions the model needs to predict the next byte accurately (1.0 BPB = 1 yes-no question), and BPW is the same thing but at the word level.


We decided to evaluate the model on each source to see the difference in perplexity.

SourceLossPerplexity
Textbooks2.027.57
Q&A3.2024.65
Books3.7341.88
Medium articles3.7944.40

The textbooks' perplexity is six times lower than that of the Medium articles. This is expected. Tiny-Textbooks uses a templated structure (e.g., Section 1, conclusion, etc.) and an LLM generates the rest, resulting in a lower entropy than standard English. Medium articles are structurally, tonally, and stylistically more diverse and unpredictable. The same could be said for the books.


Benchmarks

TaskDatasetMetric0-shot5-shot
ANLI R1anli_r1acc0.3690.35
ANLI R2anli_r2acc0.3310.334
ANLI R3anli_r3acc0.32330.325
ARC Challengearc_challengeacc_norm0.2210.2184
ARC Easyarc_easyacc_norm0.31940.3215
HellaSwaghellaswagacc_norm0.26770.2657
MMLUmmluacc0.230.2413
MMLU Humanitiesmmluacc0.24290.2446
MMLU Othermmluacc0.2350.2288
MMLU Social Sciencesmmluacc0.21680.2317
MMLU STEMmmluacc0.21850.2578
PiQApiqaacc_norm0.55710.5533
SWAGswagacc_norm0.32970.3201
TruthfulQA MC1truthfulqa_mc1acc0.27050.2705
TruthfulQA MC2truthfulqa_mc2acc0.45910.4591
GSM8Kgsm8kexact_match (flexible)0.01140.0114
TruthfulQA Gentruthfulqa_genrouge1_acc0.28640.2864

The model achieves random or near-random on most tasks, which is expected. An 8M parameter model cannot store world-level knowledge or thoroughly reason.

Note: The full breakdown (LM Harness Output) is right here

Coherency Benchmark

To evaluate the coherency, factuality, and fluency of our (and other) models, we use Qwen3-32B to grade 300 different generations generated from an unconditional prompt.

Example configuration:

# --- Inference settings (local or huggingface) ---
NUM_GENERATIONS = 300
MAX_NEW_TOKENS  = 256
MIN_NEW_TOKENS  = 30
TEMPERATURE     = 0.7
TOP_K           = 30
TOP_P           = 0.9
REP_PENALTY     = 1.2
DO_SAMPLE       = True
INFERENCE_BATCH = 5

# --- Judge settings ---
JUDGE_MODEL    = "qwen/qwen3-32b"
JUDGE_MAX_TOKENS     = 80
JUDGE_TEMPERATURE    = 0.0
ModelAvg ScoreIncoherentMostly CoherentPartially CoherentCoherent
pythia-31m-deduped0.319620753355
Tenete-8M0.4862133865328
gpt20.5052108967521

Our model outperforms Pythia-31M-deduped while being 3.8 times smaller, and looses to GPT2 by only ~0.02 points. Note: In our other model cards, the score may be lower or higher for the same model, because MAX_NEW_TOKENS was set to 80, not 256. Furthermore, we changed the judge_prompt to be more accurate. This doesn't mean the scores from other model cards are invalid; they're just a little bit outdated.

Generations

Prompt: The

Output:

higher with a great taste of the damp and a more vibrant beauty than others.  It also has its own unique style.  They have been looking for different shades, and they have a wide range of shades to suit their tastes.  Some people find themselves in love with a rich variety of styles that are popular among those who feel it's beautiful. For example, many brands like Nielson are known for their bright colors and bold color.  Here is a simple recipe:

- What is your favorite type of hair?
- How do you use your skin to make a smooth look?
- Can I use my hair instead of cotton or wool?
- Can I use my hair instead of cotton?

Section 3: Practical Examples and Real-World Scenarios
Let's say you want to create an outfit that looks very well on your face. You can choose from a traditional one such as Jyubande, Scikit-learn, Shoeson, Ring and Towl, or Aramis, or Ladies. Your hair should be slightly darker than other options. On the other hand, if you're looking for clothes with a black dress, you may need to paint a white palette (like red or blue) around your skin.

Conclusion:
In this lesson, we learned how to set up a dress for a fashion design by adding color and texture, pairing and tanks, and sewing techniques. By following these guidelines, you will become a savvy designer and be able to create a personal touch of clothing while enjoying a strong look at all things.

Prompt: Question: What is AI?\nAnswer:

Output:

 Machine learning is a method of computer programs that allows us to learn from each other and perform tasks more efficiently. This makes it easier for students to find information about the world around them, whether they are interested in learning or not.
## III. Why is AI important?
Answer: AI is essential because it helps us make informed decisions based on data and decision-making. It enables us to identify trends, patterns, and relationships with others, which can help us stay focused and motivated during difficult times. Additionally, AI technology has been used by companies like Amazon, Apple, and Google, helping businesses improve their operations, productivity, and profitability.

Prompt: 'GPT2 is

Output:

 a type of gympos that uses the OA to produce an image. This technique has many applications in various fields, including:

1. **Interpreting:** An example of this method is a process by which you create an image using the ERGE model to produce images and other images.

2. **Conditioning:** A method can be used to manipulate the image using the ERGE model. For instance, if you have 3 cmd4(3) and 4 cmd5(3).

**Glossary:**
- Image processing: The process of converting images into images.
- ERPPO: Visual Modeling for images with high quality pixels.
- Image processing: The process of converting images from image to image image image image image image image image image image image image image image image image image image image image image image image image image image image image image image image image image image image image image image image image image image image image image image image image image image image image image image image image image image image image image image image image image image image image image image image image image image image image image image image image image image image image image image image image image image image image image image image image image image image on image image image image image image image image image image image image image image image image image image? Image image image images image image image image image image image image.

### Section 1: Introduction to Image Image Images
Artography is a powerful tool that allows us to visualize and visualize images visually. It provides a wide range of tools and techniques that allow us to observe and understand images accurately. In this lesson, we will focus on image image image images image image image image image image image image image image image image image image image image image image image image image image image image image image image image image image image image image image image image image image image image image image image image image image image image image image image image image image image image image image image images image image image image image image image image image images image image image image image image image image image image image image image image image image image image image image image image image.

Example 2: Image image image image image image image image image image image image image image image image image image image image image image image image image image image image image image image image image image image image image image or image image image image image images image image image image image image image image image image image image image image.

Prompt: The color of the sky is

Output:

1.
2. It takes four-dimensional space in a triangle, where each inch of its shape has two sides and one or more angles to represent them. This creates a sense of depth and meaning that the sky is beautifully different from other shapes like circles and squares.
3. It can be used as a symbol for navigation and appreciation. For example: "The world is just beginning on the earth but still changing itself."
4. Color Scheme (rather colors)

Here's an example of how I learned about color theory:

import matplotlib as pdipis as y = ['Size', 'Size'].last_id(x))

Explanation:
To understand the concept of color theory, let's say you have three sides and one side, with the following equation:

Number of sides of length - 1 * 3 = 10^0/9
Total length - 2 + 5 = 12
Step 1: Find the top of the left hand
If there are no sides of length or number, we would be assigned to the bottom of the right hand. For example: "The world is not only darker than traditional, but also lightning."

Explanation:
Now, let's look at some examples of color theory:

1. What is the difference between color theory and composition?
Answer: Color theory is the study of colors and their properties.
2. How do you know which one part of the left hand?
Answer: To see if it means looking upwards and finding the right pair of shades, they may use geometric patterns or textures.
3. How does a color scheme benefit us?
Answer: A color scheme benefits both sides by providing a visual representation of the same value. Some examples include simplicity, creativity, and minimalism.
## Section 4: Practical Examples
Let's consider an example of how color theory can be applied in everyday life. Suppose you want to add a pair of shoes to your home. You could start by taking a pair of shoes with a black dress, then sketch out the size of the hips. Then, you might use a variety of colors to create a balanced and visually appealing shoe. Once you have chosen the type of shirt, you might choose a pair of shoes that complements the specific design elements. Finally, you might apply the appropriate pair of shoes to create a cohesive experience.

Prompt: dfuhudfhudishf88383838838EXMAPLEisdu938u39uAIs

Output:

Want. We also discussed how to use these techniques and best practices, such as using different strategies for delivering personalized experiences and tracking messages with our loved ones. By understanding the principles of self-reflection and learning from these tips, we can apply these skills to other areas of life.

We showcase the bad generations, such as the third generation, and good generations, such as the second generation. As you can see, the model is surprisingly coherent for its size, but it isn't as consistent as larger models. Some generations are coherent, while others can be well... broken. A larger model would be the same-ish quality consistently.

Limitations

  1. 1.Cannot reason, chat, code, or follow prompts accurately all the time
  2. 2.May loop or generate repetitive sequences
  3. 3.Almost all generations are unfactual, incoherent, or just wrong

Use Cases

  1. 1.Educational use and testing
  2. 2.Deployment on edge devices
  3. 3.Fine-tuned for downstream use
  4. 4.Or more simply, for fun.

Inference

# =============================================================================
# Inference
# =============================================================================


MODEL_DIR       = "Harley-ml/Tenete-8M"   # path
TOKENIZER_PATH = MODEL_DIR

# --- Generation settings ---
PROMPT             = "The"   # prompt
MAX_NEW_TOKENS     = 256
TEMPERATURE        = 0.7
TOP_P              = 0.95
TOP_K              = 30
REPETITION_PENALTY = 1.2
DO_SAMPLE          = True

# =============================================================================

import torch
from pathlib import Path
from transformers import (
    AutoModelForCausalLM,
    PreTrainedTokenizerFast,
    AddedToken,
)

# ---------------------------------------------------------------------------
# Device
# ---------------------------------------------------------------------------

device = (
    "cuda" if torch.cuda.is_available() else
    "mps"  if torch.backends.mps.is_available() else
    "cpu"
)
print(f"Device : {device}")

# ---------------------------------------------------------------------------
# Tokenizer  (mirrors training setup)
# ---------------------------------------------------------------------------

def load_tokenizer(path: str):
    p = Path(path).resolve()
    if not p.exists():
        raise FileNotFoundError(f"Tokenizer not found: {p}")
    tok = PreTrainedTokenizerFast(tokenizer_file=str(p))
    specials = {}
    if tok.bos_token is None: specials["bos_token"] = AddedToken("<|bos|>", special=True)
    if tok.eos_token is None: specials["eos_token"] = AddedToken("<|eos|>", special=True)
    if tok.unk_token is None: specials["unk_token"] = AddedToken("<|unk|>", special=True)
    if tok.pad_token is None:
        if tok.eos_token is not None:
            tok.pad_token = tok.eos_token
        else:
            specials["pad_token"] = AddedToken("<|pad|>", special=True)
    if specials:
        tok.add_special_tokens(specials)
    tok.padding_side = "left" 
    return tok

print("Loading tokenizer...")
tokenizer = load_tokenizer(TOKENIZER_PATH)
print(f"  Vocab size : {tokenizer.vocab_size}")
print(f"  BOS        : {tokenizer.bos_token!r}")
print(f"  EOS        : {tokenizer.eos_token!r}")
print(f"  PAD        : {tokenizer.pad_token!r}  (id={tokenizer.pad_token_id})")

# ---------------------------------------------------------------------------
# Model
# ---------------------------------------------------------------------------

print(f"\nLoading model from {MODEL_DIR} ...")
model = AutoModelForCausalLM.from_pretrained(
    MODEL_DIR,
    dtype=torch.float16 if device == "cuda" else torch.float32,
    low_cpu_mem_usage=True,
)

model.eval()
model.to(device)

total_params = sum(p.numel() for p in model.parameters())
print(f"  Parameters : {total_params:,}")

# ---------------------------------------------------------------------------
# Generation helper
# ---------------------------------------------------------------------------

def generate(
    prompt: str             = PROMPT,
    max_new_tokens: int     = MAX_NEW_TOKENS,
    temperature: float      = TEMPERATURE,
    top_p: float            = TOP_P,
    top_k: int              = TOP_K,
    repetition_penalty: float = REPETITION_PENALTY,
    do_sample: bool         = DO_SAMPLE,
) -> str:
    
    bos         = tokenizer.bos_token or ""
    full_prompt = bos + prompt

    inputs = tokenizer(
        full_prompt,
        return_tensors="pt",
        add_special_tokens=False,
    ).to(device)
    inputs.pop("token_type_ids", None)  # Qwen3 doesn't use this

    gen_kwargs = dict(
        max_new_tokens     = max_new_tokens,
        do_sample          = do_sample,
        repetition_penalty = repetition_penalty,
        eos_token_id       = tokenizer.eos_token_id,
        pad_token_id       = tokenizer.pad_token_id,
    )
    if do_sample:
        gen_kwargs["temperature"] = temperature
        gen_kwargs["top_p"]       = top_p
        gen_kwargs["top_k"]       = top_k

    with torch.inference_mode():
        output_ids = model.generate(**inputs, **gen_kwargs)

    # Strip the prompt tokens so we only return what was generated
    prompt_len = inputs["input_ids"].shape[-1]
    new_ids    = output_ids[0][prompt_len:]
    return tokenizer.decode(new_ids, skip_special_tokens=True)


# ---------------------------------------------------------------------------
# Run
# ---------------------------------------------------------------------------

if __name__ == "__main__":
    print(f"\nPrompt : {PROMPT!r}")
    print("-" * 60)

    output = generate(PROMPT)

    print("Generated:")
    print(output)

Citation

bibtex
@misc{tenete-8m,
  title     = {Tenete-8M: An 8M Parameter Language Model that Beats Pythia-31M in Coherence},
  author    = {Harley-ml},
  year      = {2026},
  url       = {https://huggingface.co/Harley-ml/Tenete-8M}
}