Nymbo's picture
Gradio 6.29; run SmolLM2-1.7B-Instruct on CPU with transformers (no provider serves it any more)
24f8a45 verified
Raw History Blame Contribute Delete
2.75 kB
# SmolLM2-1.7B-Instruct is no longer served by any Hugging Face Inference Provider,
# so this Space now runs the model itself on CPU with transformers.
from threading import Thread
import gradio as gr
import torch
from transformers import AutoModelForCausalLM, AutoTokenizer, TextIteratorStreamer
MODEL_ID = "HuggingFaceTB/SmolLM2-1.7B-Instruct"
torch.set_num_threads(max(1, torch.get_num_threads()))
tokenizer = AutoTokenizer.from_pretrained(MODEL_ID)
model = AutoModelForCausalLM.from_pretrained(MODEL_ID, dtype=torch.float32)
model.eval()
def content_to_text(content):
"""Gradio 6 message content may be a string or a list of parts; flatten to text."""
if isinstance(content, str):
return content
if isinstance(content, dict):
return content.get("text") or ""
if isinstance(content, (list, tuple)):
return "".join(content_to_text(p) for p in content)
return "" if content is None else str(content)
def respond(
message,
history,
system_message,
max_tokens,
temperature,
top_p,
):
messages = []
if system_message:
messages.append({"role": "system", "content": system_message})
for msg in history or []:
if isinstance(msg, dict) and msg.get("role") in ("user", "assistant"):
text = content_to_text(msg.get("content"))
if text:
messages.append({"role": msg["role"], "content": text})
messages.append({"role": "user", "content": content_to_text(message)})
inputs = tokenizer.apply_chat_template(
messages, add_generation_prompt=True, return_tensors="pt", return_dict=True
)
streamer = TextIteratorStreamer(tokenizer, skip_prompt=True, skip_special_tokens=True)
generate_kwargs = dict(
**inputs,
streamer=streamer,
max_new_tokens=int(max_tokens),
do_sample=temperature > 0,
temperature=float(temperature),
top_p=float(top_p),
)
thread = Thread(target=model.generate, kwargs=generate_kwargs)
thread.start()
response = ""
for token in streamer:
response += token
yield response
thread.join()
chatbot = gr.Chatbot(height=600)
demo = gr.ChatInterface(
respond,
additional_inputs=[
gr.Textbox(value="", label="System message"),
gr.Slider(minimum=1, maximum=2048, value=256, step=1, label="Max new tokens"),
gr.Slider(minimum=0.1, maximum=4.0, value=0.7, step=0.1, label="Temperature"),
gr.Slider(
minimum=0.1,
maximum=1.0,
value=0.95,
step=0.05,
label="Top-P",
),
],
fill_height=True,
chatbot=chatbot,
)
if __name__ == "__main__":
demo.launch(theme="Nymbo/Nymbo_Theme")