File size: 7,081 Bytes
c0b0ec6
 
 
 
 
 
ccf08fa
c0b0ec6
 
ccf08fa
 
 
 
 
 
 
 
 
c0b0ec6
 
ccf08fa
c0b0ec6
 
 
ccf08fa
c0b0ec6
 
 
 
 
 
 
 
ccf08fa
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
c0b0ec6
 
 
ccf08fa
 
 
 
 
 
 
 
 
c0b0ec6
ccf08fa
 
c0b0ec6
ccf08fa
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
c0b0ec6
 
 
 
 
 
ccf08fa
 
 
 
c0b0ec6
ccf08fa
 
 
 
c0b0ec6
 
 
 
ccf08fa
 
 
c0b0ec6
 
ccf08fa
 
 
 
 
 
 
 
 
c0b0ec6
ccf08fa
 
 
c0b0ec6
 
 
ccf08fa
 
 
 
 
c0b0ec6
ccf08fa
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
c0b0ec6
ccf08fa
 
c0b0ec6
ccf08fa
 
c0b0ec6
ccf08fa
c0b0ec6
 
 
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
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
from __future__ import annotations
import torch
import gradio as gr
import spaces
from huggingface_hub import hf_hub_download
from safetensors.torch import load_file
from transformers import AutoTokenizer, AutoModelForCausalLM
from configuration_riemann import RiemannConfig
from modeling_riemann import RiemannForCausalLM
from analysis import (
    token_surprisal,
    surprisal_html,
    greedy_continue,
    contrast_rows,
    md_table,
    WIKI_FEWSHOT,
    CONTRAST_SET,
)

OPENPEER_REPO = "OpenPeerAI/OpenPeerLLM"
RIEMANN_REPO = "OpenPeerAI/My-Name-is-Riemann-Prerelease"

tokenizer = AutoTokenizer.from_pretrained("gpt2")
tokenizer.pad_token = tokenizer.eos_token

config = RiemannConfig(
    vocab_size=50257,
    hidden_size=768,
    num_hidden_layers=12,
    num_attention_heads=12,
    intermediate_size=3072,
    max_position_embeddings=1024,
)
openpeer = RiemannForCausalLM(config)
_state = load_file(hf_hub_download(OPENPEER_REPO, "model.safetensors"))
_missing, _unexpected = openpeer.load_state_dict(_state, strict=False)
openpeer.eval()
LOAD_REPORT = f"{len(_state)} tensors loaded from {OPENPEER_REPO}, {len(_missing)} missing, {len(_unexpected)} unexpected."
N_OPENPEER = sum(p.numel() for p in openpeer.parameters())

_riemann = {"model": None}


def riemann():
    if _riemann["model"] is None:
        m = AutoModelForCausalLM.from_pretrained(
            RIEMANN_REPO,
            trust_remote_code=True,
            dtype=torch.bfloat16,
            low_cpu_mem_usage=True,
        )
        m.eval()
        _riemann["model"] = m
    return _riemann["model"]


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


@spaces.GPU(duration=60)
def complete(subject, opening, max_new, compare):
    prompt_tail = f"{subject.strip()} {opening.strip()}".strip()
    _gpu(openpeer)
    a = greedy_continue(
        openpeer,
        tokenizer,
        WIKI_FEWSHOT + prompt_tail,
        int(max_new),
        repetition_penalty=1.3,
    )
    out = (
        f"### OpenPeerLLM ({N_OPENPEER/1e6:.0f}M, the starting rung)\n{prompt_tail}{a}"
    )
    if compare:
        r = riemann()
        _gpu(r)
        b = greedy_continue(
            r,
            tokenizer,
            WIKI_FEWSHOT + prompt_tail,
            int(max_new),
            repetition_penalty=1.25,
            max_context=2048,
        )
        out += f"\n\n### My Name is Riemann Prerelease (13.1B, six rungs later)\n{prompt_tail}{b}"
    return out


@spaces.GPU(duration=60)
def analyse(text, compare):
    _gpu(openpeer)
    a = token_surprisal(openpeer, tokenizer, text)
    out = surprisal_html(a, f"OpenPeerLLM ({N_OPENPEER/1e6:.0f}M):")
    if compare:
        r = riemann()
        _gpu(r)
        b = token_surprisal(r, tokenizer, text, max_length=2048)
        out += "<hr/>" + surprisal_html(b, "My Name is Riemann Prerelease (13.1B):")
        out += f"<p><b>Perplexity {a['ppl']:.1f} to {b['ppl']:.1f}</b> across the growth ladder on this text.</p>"
    return out


@spaces.GPU(duration=90)
def contrast(compare):
    _gpu(openpeer)
    rows_a = contrast_rows(openpeer, tokenizer, CONTRAST_SET)
    if not compare:
        return md_table([[r[0], r[1], r[2]] for r in rows_a])
    r = riemann()
    _gpu(r)
    rows_b = contrast_rows(r, tokenizer, CONTRAST_SET)
    header = ("Text", "OpenPeerLLM 163M", "Riemann Prerelease 13.1B")
    rows = [[ra[0], ra[1], rb[1]] for ra, rb in zip(rows_a, rows_b)]
    return (
        md_table(rows, header)
        + "\n\nPerplexity on each string. Lower is better on fluent text; the gap between fluent text and noise "
        "should widen as the model improves. OpenPeerLLM is the 163M checkpoint that every later rung inherits from."
    )


DESCRIPTION = f"""

# OpenPeerLLM Demo



[OpenPeerAI/OpenPeerLLM](https://huggingface.co/{OPENPEER_REPO}) is a decentralised-training language model

by Andrew Magdy Kamal Nassief (DOI [10.57967/hf/6469](https://doi.org/10.57967/hf/6469)). This space loads its

published `model.safetensors` ({N_OPENPEER/1e6:.0f}M parameters) into a faithful reimplementation of its

architecture, with the causal attention mask the reference forward pass omits. {LOAD_REPORT}



OpenPeerLLM is the **starting rung** of the

[My Name is Riemann](https://huggingface.co/{RIEMANN_REPO}) growth ladder. Every tab lets you put the

13.1B Prerelease next to it on the same input, so the effect of six rungs of growth and training is visible

directly. Both are base models: they complete and score text, they do not chat.

"""

with gr.Blocks(title="OpenPeerLLM Demo") as demo:
    gr.Markdown(DESCRIPTION)
    with gr.Tab("Complete an article"):
        gr.Markdown(
            "Two short example articles are prepended so the model knows the register."
        )
        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(16, 120, value=64, step=8, label="Max new tokens")
            cmp1 = gr.Checkbox(
                value=True, label="Also run My Name is Riemann Prerelease (13.1B)"
            )
        out1 = gr.Markdown()
        gr.Button("Complete", variant="primary").click(
            complete, [subject, opening, max_new, cmp1], out1
        )
        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",
                ],
            ],
            inputs=[subject, opening],
        )
    with gr.Tab("Analyse text"):
        gr.Markdown(
            "Each token is coloured by how surprised the model was to see it; green is expected, red is surprising."
        )
        a_text = gr.Textbox(
            label="Text",
            lines=4,
            value="The Great Pyramid of Giza is the oldest of the Seven Wonders of the Ancient World.",
        )
        cmp2 = gr.Checkbox(
            value=True, label="Also analyse with My Name is Riemann Prerelease (13.1B)"
        )
        out2 = gr.HTML()
        gr.Button("Analyse", variant="primary").click(analyse, [a_text, cmp2], out2)
    with gr.Tab("Fluency test"):
        gr.Markdown(
            "Six fixed strings from fluent English down to random words, scored by perplexity."
        )
        cmp3 = gr.Checkbox(
            value=True, label="Compare with My Name is Riemann Prerelease (13.1B)"
        )
        out3 = gr.Markdown()
        gr.Button("Run fluency test", variant="primary").click(contrast, cmp3, out3)
    gr.Markdown(
        "OpenPeerLLM is released under OPNL, MIT and CC BY 4.0. Maintained by OpenPeer AI."
    )

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