# MiniCPM5-1B Demo from pathlib import Path import os import time import logging import threading import gradio as gr import spaces import torch from huggingface_hub import login from transformers import AutoModelForCausalLM, AutoTokenizer, TextIteratorStreamer from utils_chatbot import organize_messages_from_messages, stream2display_text logging.basicConfig(level=logging.INFO) logger = logging.getLogger(__name__) MODEL_PATH = "openbmb/MiniCPM5-1B" hf_token = os.environ.get("HF_TOKEN") if hf_token: login(token=hf_token) logger.info("Logged in to Hugging Face Hub") else: logger.warning("HF_TOKEN not set — private/gated models will be inaccessible") tokenizer = AutoTokenizer.from_pretrained(MODEL_PATH, trust_remote_code=True) model = AutoModelForCausalLM.from_pretrained( MODEL_PATH, torch_dtype=torch.bfloat16, trust_remote_code=True, ).to("cuda") @spaces.GPU(duration=60) def gpu_generate_stream(inputs, history, temperature, top_p): prompt_text = tokenizer.apply_chat_template( inputs, tokenize=False, add_generation_prompt=True, ) model_inputs = tokenizer([prompt_text], return_tensors="pt").to("cuda") history.append({"role": "assistant", "content": ""}) yield "", history streamer = TextIteratorStreamer( tokenizer, skip_prompt=True, skip_special_tokens=False, ) gen_kwargs = dict( **model_inputs, streamer=streamer, max_new_tokens=4096, ) if temperature > 0: gen_kwargs.update(temperature=temperature, top_p=top_p, do_sample=True) else: gen_kwargs.update(do_sample=False) thread = threading.Thread(target=model.generate, kwargs=gen_kwargs) thread.start() stream_text = "" gen_tk_count = 0 start_time = time.time() for new_token_text in streamer: if not new_token_text: continue stream_text += new_token_text gen_tk_count += 1 elapsed = time.time() - start_time token_per_sec = gen_tk_count / elapsed if elapsed > 0 else 0 display_text = stream2display_text(stream_text, token_per_sec) history[-1]["content"] = display_text yield "", history thread.join() history[-1]["content"] = stream_text.replace("<|im_end|>", "") yield "", history def gen_response_stream(message, history, temperature, top_p): chat_msg_ls = organize_messages_from_messages(message, history) history.append({"role": "user", "content": message}) yield from gpu_generate_stream( chat_msg_ls, history, temperature=temperature, top_p=top_p, ) def create_app(): assets_path = Path.cwd().absolute() / "assets" gr.set_static_paths(paths=[assets_path]) with gr.Blocks() as demo: with gr.Row(): with gr.Column(scale=1): gr.HTML( '
'
"