File size: 7,069 Bytes
57976ee
 
 
 
 
 
7c5691f
 
 
 
 
 
 
 
 
 
57976ee
 
7c5691f
57976ee
7c5691f
 
57976ee
7c5691f
57976ee
 
7c5691f
57976ee
7c5691f
57976ee
 
7c5691f
 
57976ee
 
7c5691f
57976ee
 
7c5691f
 
57976ee
 
7c5691f
 
 
57976ee
 
7c5691f
 
57976ee
7c5691f
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
57976ee
7c5691f
 
 
 
57976ee
7c5691f
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
57976ee
 
 
 
7c5691f
57976ee
7c5691f
 
 
 
57976ee
7c5691f
 
8bd9f4c
 
57976ee
 
7c5691f
57976ee
7c5691f
 
 
 
 
 
 
 
 
 
57976ee
7c5691f
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
57976ee
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
from __future__ import annotations
import os
import torch
import gradio as gr
import spaces
from huggingface_hub import hf_hub_download
from transformers import AutoTokenizer, AutoModelForCausalLM
from analysis import (
    token_surprisal,
    surprisal_html,
    greedy_continue,
    contrast_rows,
    md_table,
    WIKI_FEWSHOT,
    CONTRAST_SET,
)

MODEL_REPO = os.environ.get("MODEL_REPO", "OpenPeerAI/My-Name-is-Riemann-Prerelease")
CONTROLLER_PATH = "ntk_controller/stage6_12.85b.pt"

tokenizer = AutoTokenizer.from_pretrained(MODEL_REPO)
tokenizer.pad_token = tokenizer.eos_token
model = AutoModelForCausalLM.from_pretrained(
    MODEL_REPO, trust_remote_code=True, dtype=torch.bfloat16, low_cpu_mem_usage=True
)
model.eval()
N_PARAMS = sum(p.numel() for p in model.parameters())

_ctl = {"tuner": None, "attached": False}


def _controller():
    if _ctl["tuner"] is None:
        from ntkmirror import ForwardFineTuner

        path = hf_hub_download(MODEL_REPO, CONTROLLER_PATH)
        tuner = ForwardFineTuner(model, tokenizer)
        tuner.load(path, allow_model_mismatch=True, map_location="cpu")
        _ctl["tuner"] = tuner
    return _ctl["tuner"]


def _attach(on: bool):
    tuner = _controller()
    if on and not _ctl["attached"]:
        tuner.controller.to(model.device)
        tuner.controller.attach()
        _ctl["attached"] = True
    elif not on and _ctl["attached"]:
        tuner.controller.remove()
        _ctl["attached"] = False


def _gpu():
    if model.device.type != "cuda":
        model.to("cuda")


@spaces.GPU(duration=90)
def complete_wiki(subject, opening, max_new, temperature):
    _gpu()
    _attach(False)
    prompt = WIKI_FEWSHOT + f"{subject.strip()} {opening.strip()}".strip()
    text = greedy_continue(
        model,
        tokenizer,
        prompt,
        int(max_new),
        repetition_penalty=1.25,
        temperature=temperature,
        max_context=2048,
    )
    return f"{subject.strip()} {opening.strip()}".strip() + text


@spaces.GPU(duration=60)
def analyse(text, use_ctl):
    _gpu()
    _attach(False)
    base = token_surprisal(model, tokenizer, text, max_length=2048)
    out = surprisal_html(base, "Base weights:")
    if use_ctl:
        _attach(True)
        ctl = token_surprisal(model, tokenizer, text, max_length=2048)
        _attach(False)
        delta = ctl["nll"] - base["nll"]
        out += "<hr/>" + surprisal_html(ctl, "With NTK controller:")
        out += f"<p><b>Controller effect on this text:</b> mean surprisal {base['nll']:.3f} to {ctl['nll']:.3f} nats ({delta:+.3f}); perplexity {base['ppl']:.1f} to {ctl['ppl']:.1f}.</p>"
    return out


@spaces.GPU(duration=60)
def contrast():
    _gpu()
    _attach(False)
    rows = contrast_rows(model, tokenizer, CONTRAST_SET)
    table = md_table([[r[0], r[1], r[2]] for r in rows])
    best, worst = min(rows, key=lambda r: r[1]), max(rows, key=lambda r: r[1])
    return (
        table
        + f"\n\nThe model assigns the fluent sentence a perplexity of {best[1]} and the random-word string {worst[1]}, "
        f"a ratio of about {worst[1]/best[1]:,.0f}x. That spread is what a language model looks like from the inside: "
        "it has learned which sequences are English and which are not, independent of whether it can chat."
    )


DESCRIPTION = f"""

# My Name is Riemann Prerelease - Basic Demo



**{N_PARAMS/1e9:.1f}B parameters.** Grown rung by rung from

[OpenPeerLLM](https://huggingface.co/OpenPeerAI/OpenPeerLLM) and fine-tuned with the

[OpenPeer-AI-NTK-Trainer](https://huggingface.co/OpenPeerAI/OpenPeer-AI-NTK-Trainer)

gate controller instead of LoRA. Weights: [{MODEL_REPO}](https://huggingface.co/{MODEL_REPO}).



This is a **prerelease base model**, trained on about 2.2 billion tokens of encyclopedic text, agentic coding

transcripts and source code. It is not instruction-tuned and does not chat. The tabs below show what it has

actually learned: completing text in the register it was trained on, scoring how expected each token of a

passage is, and, most tellingly, telling fluent language from noise.

"""

with gr.Blocks(title="My Name is Riemann Prerelease - Basic Demo") as demo:
    gr.Markdown(DESCRIPTION)

    with gr.Tab("Complete an article"):
        gr.Markdown(
            "Give a subject and an opening clause in encyclopedia register; the model continues it. Two example articles are prepended as context."
        )
        with gr.Row():
            subject = gr.Textbox(label="Subject", value="The Nile")
            opening = gr.Textbox(
                label="Opening clause",
                value="is a major north-flowing river in northeastern Africa. It",
            )
        with gr.Row():
            max_new = gr.Slider(24, 160, value=80, step=8, label="Max new tokens")
            temp = gr.Slider(
                0.0, 1.0, value=0.0, step=0.1, label="Temperature (0 = greedy)"
            )
        wiki_out = gr.Textbox(label="Completion", lines=8)
        gr.Button("Complete", variant="primary").click(
            complete_wiki, [subject, opening, max_new, temp], wiki_out
        )
        gr.Examples(
            [
                ["Mount Kilimanjaro", "is a dormant volcano in Tanzania. It"],
                [
                    "The Rosetta Stone",
                    "is a stele inscribed with three versions of a decree issued in",
                ],
                ["Alexandria", "is the second-largest city in Egypt and"],
            ],
            inputs=[subject, opening],
        )

    with gr.Tab("Analyse text"):
        gr.Markdown(
            "Paste any text. Each token is coloured by how surprised the model was to see it. Fluent text in a register the model knows comes out green; errors, nonsense and unfamiliar registers come out red. With the controller enabled you also see how much the gates change the model's view of the text."
        )
        a_text = gr.Textbox(
            label="Text",
            lines=5,
            value="The Great Pyramid of Giza is the oldest of the Seven Wonders of the Ancient World, and the only one to remain largely intact.",
        )
        a_ctl = gr.Checkbox(value=True, label="Compare with NTK controller attached")
        a_out = gr.HTML()
        gr.Button("Analyse", variant="primary").click(analyse, [a_text, a_ctl], a_out)

    with gr.Tab("Fluency test"):
        gr.Markdown(
            "Six fixed strings, from fluent encyclopedic English down to random words, scored by the model. A working language model separates these by orders of magnitude."
        )
        c_out = gr.Markdown()
        gr.Button("Run fluency test", variant="primary").click(contrast, None, c_out)

    gr.Markdown(
        "Licensed under the Open Innovation License v2 (OPNL-2) and MIT. "
        "Developed by OpenPeer AI, Riemann Computing Inc., and Andrew Magdy Kamal."
    )

demo.queue(max_size=16).launch()