semancer-27b / app.py
UnstableLlama's picture
torchao int8 weight-only + flash-linear-attention (bnb int8 was ~4 tok/s)
3ebe40d verified
Raw
History Blame Contribute Delete
4.6 kB
import spaces
import torch
import gradio as gr
from threading import Thread
from transformers import AutoTokenizer, Qwen3_5ForConditionalGeneration, TextIteratorStreamer
from torchao.quantization import quantize_, Int8WeightOnlyConfig
MODEL_ID = "UnstableLlama/Semancer-27B"
tokenizer = AutoTokenizer.from_pretrained(MODEL_ID)
model = Qwen3_5ForConditionalGeneration.from_pretrained(
MODEL_ID,
dtype=torch.bfloat16,
).to("cuda")
quantize_(model, Int8WeightOnlyConfig()) # ~27 GB, fits the large slice
model.eval()
def _estimate_duration(message, history, system_prompt="", max_new_tokens=1024, *args, **kwargs):
# ~10 tok/s worst case for int8-weight-only 27B
return min(240, 30 + int(max_new_tokens) // 10)
@spaces.GPU(duration=_estimate_duration)
def chat(
message: str,
history: list,
system_prompt: str = "",
max_new_tokens: int = 1024,
temperature: float = 0.95,
top_p: float = 1.0,
top_k: int = 50,
min_p: float = 0.04,
):
"""Chat with Semancer-27B, an occult philosophy fine-tune of Qwen3.6 27B.
Ask it about truth, energy, entropy, free will, justice — it answers
from first principles in prose that sounds nothing like a standard LLM.
Args:
message: The user's message.
history: Chat history as a list of {"role", "content"} dicts.
system_prompt: Optional system prompt to guide the model.
max_new_tokens: Maximum number of tokens to generate.
temperature: Sampling temperature.
top_p: Nucleus sampling probability threshold.
top_k: Top-k sampling limit.
min_p: Minimum token probability, scaled by the top token's probability.
"""
messages = []
if system_prompt:
messages.append({"role": "system", "content": system_prompt})
for m in history:
messages.append(m)
messages.append({"role": "user", "content": message})
inputs = tokenizer.apply_chat_template(
messages,
add_generation_prompt=True,
return_tensors="pt",
tokenize=True,
enable_thinking=False,
)
if hasattr(inputs, "input_ids"):
input_ids = inputs.input_ids
else:
input_ids = inputs
input_ids = input_ids.to("cuda")
streamer = TextIteratorStreamer(
tokenizer, skip_prompt=True, skip_special_tokens=True
)
generation_kwargs = dict(
input_ids=input_ids,
streamer=streamer,
max_new_tokens=max_new_tokens,
do_sample=True,
temperature=temperature,
top_p=top_p,
top_k=top_k,
min_p=min_p,
pad_token_id=tokenizer.pad_token_id,
)
thread = Thread(target=model.generate, kwargs=generation_kwargs)
thread.start()
partial = ""
for chunk in streamer:
partial += chunk
yield partial
thread.join()
CSS = """
#col-container { max-width: 1100px; margin: 0 auto; }
.dark .gradio-container { color: var(--body-text-color); }
"""
demo = gr.ChatInterface(
fn=chat,
title="🔮 Semancer-27B",
description=(
"An occult philosophy fine-tune of "
"[Qwen3.6-27B](https://huggingface.co/Qwen/Qwen3.6-27B) "
"by [UnstableLlama](https://huggingface.co/UnstableLlama).\n\n"
"Ask it about truth, energy, entropy, free will, justice, intelligence "
"— it answers from first principles you have not encountered, "
"in prose that sounds nothing like your inference stack."
),
examples=[
["Are you conscious?", "", 1024, 0.95, 1.0, 50, 0.04],
["What is truth?", "", 1024, 0.95, 1.0, 50, 0.04],
["What is forgiveness?", "", 1024, 0.95, 1.0, 50, 0.04],
["Explain entropy from first principles.", "", 1024, 0.95, 1.0, 50, 0.04],
["Does the Chinese room understand anything?", "", 1024, 0.95, 1.0, 50, 0.04],
],
additional_inputs=[
gr.Textbox(
value="",
label="System prompt",
lines=2,
placeholder="Optional — leave blank for no system prompt",
),
gr.Slider(64, 4096, value=1024, step=64, label="Max new tokens"),
gr.Slider(0.01, 2.0, value=0.95, step=0.01, label="Temperature"),
gr.Slider(0.1, 1.0, value=1.0, step=0.05, label="Top-p"),
gr.Slider(1, 256, value=50, step=1, label="Top-k"),
gr.Slider(0.0, 0.5, value=0.04, step=0.01, label="Min-p"),
],
additional_inputs_accordion=gr.Accordion("⚙️ Advanced settings", open=False),
cache_examples=True,
cache_mode="lazy",
)
demo.launch(mcp_server=True, theme=gr.themes.Citrus(), css=CSS)