Safetensors
gpt2
gss1147's picture
Update README.md
07103d9 verified
---
datasets:
- TeichAI/gpt-5.1-codex-max-1000x
- TeichAI/gpt-5.1-high-reasoning-1000x
base_model:
- openai-community/gpt2-medium
---
Below is a standalone Python GUI application that loads the gss1147/GPT5.1-high-reasoning-codex-0.4B model from Hugging Face and provides a simple interface for text generation. The GUI is built with tkinter and uses transformers and torch for model inference. Generation runs in a separate thread to keep the interface responsive.
Features
· Load the model once at startup.
· Input text box for user prompts.
· Adjustable generation parameters: max new tokens, temperature, top‑p, and repetition penalty.
· Generate button with a progress indicator (text changes to "Generating..." while busy).
· Output displayed in a scrollable text area.
· Error handling for missing dependencies and CUDA issues.
Requirements
Install the required packages before running the script:
```bash
pip install transformers torch
```
(If you have a GPU, ensure you install the appropriate version of PyTorch with CUDA support. The script will automatically use GPU if available.)
The Code
```python
import tkinter as tk
from tkinter import scrolledtext, messagebox, ttk
import threading
import torch
from transformers import AutoModelForCausalLM, AutoTokenizer
# Model name
MODEL_NAME = "gss1147/GPT5.1-high-reasoning-codex-0.4B"
# Global variables for model and tokenizer (loaded once)
model = None
tokenizer = None
def load_model():
"""Load the model and tokenizer from Hugging Face."""
global model, tokenizer
try:
# Show loading message in the GUI (if root already exists)
if 'root' in globals():
status_label.config(text="Loading model... This may take a while.")
root.update()
device = "cuda" if torch.cuda.is_available() else "cpu"
tokenizer = AutoTokenizer.from_pretrained(MODEL_NAME)
model = AutoModelForCausalLM.from_pretrained(
MODEL_NAME,
torch_dtype=torch.float16 if device == "cuda" else torch.float32,
device_map="auto" if device == "cuda" else None
)
if device == "cpu":
model.to(device)
model.eval()
if 'root' in globals():
status_label.config(text="Model loaded. Ready.")
generate_button.config(state=tk.NORMAL)
except Exception as e:
messagebox.showerror("Error", f"Failed to load model:\n{e}")
if 'root' in globals():
status_label.config(text="Loading failed.")
raise
def generate_text():
"""Start generation in a separate thread."""
thread = threading.Thread(target=generate_thread)
thread.start()
def generate_thread():
"""Run generation and update the GUI when done."""
# Disable the generate button and show progress
generate_button.config(state=tk.DISABLED, text="Generating...")
status_label.config(text="Generating...")
root.update()
try:
# Get parameters from the GUI
prompt = input_text.get("1.0", tk.END).strip()
if not prompt:
messagebox.showwarning("Warning", "Please enter a prompt.")
return
max_new = int(max_new_tokens_var.get())
temp = float(temperature_var.get())
top_p_val = float(top_p_var.get())
rep_penalty = float(rep_penalty_var.get())
# Tokenize input
inputs = tokenizer(prompt, return_tensors="pt").to(model.device)
# Generate
with torch.no_grad():
outputs = model.generate(
**inputs,
max_new_tokens=max_new,
temperature=temp,
top_p=top_p_val,
repetition_penalty=rep_penalty,
do_sample=True,
pad_token_id=tokenizer.eos_token_id
)
# Decode and display
generated = tokenizer.decode(outputs[0], skip_special_tokens=True)
# Remove the input prompt from the output if desired
if generated.startswith(prompt):
generated = generated[len(prompt):].lstrip()
# Update output in GUI (thread-safe via after)
root.after(0, lambda: display_output(generated))
except Exception as e:
root.after(0, lambda: messagebox.showerror("Error", f"Generation failed:\n{e}"))
finally:
# Re-enable button and reset status
root.after(0, lambda: generate_button.config(state=tk.NORMAL, text="Generate"))
root.after(0, lambda: status_label.config(text="Ready."))
def display_output(text):
"""Insert generated text into the output box."""
output_text.delete("1.0", tk.END)
output_text.insert(tk.END, text)
# ------------------- GUI Setup -------------------
root = tk.Tk()
root.title("GPT-5.1 0.4B Text Generator")
root.geometry("800x700")
root.resizable(True, True)
# Style
root.option_add("*Font", "Arial 11")
# Status bar at the top
status_label = tk.Label(root, text="Initializing...", bd=1, relief=tk.SUNKEN, anchor=tk.W)
status_label.pack(fill=tk.X, padx=5, pady=2)
# Main frame
main_frame = ttk.Frame(root, padding="10")
main_frame.pack(fill=tk.BOTH, expand=True)
# Input label and text area
ttk.Label(main_frame, text="Input Prompt:").grid(row=0, column=0, sticky=tk.W, pady=5)
input_text = scrolledtext.ScrolledText(main_frame, height=8, wrap=tk.WORD)
input_text.grid(row=1, column=0, columnspan=3, sticky=(tk.W, tk.E, tk.N, tk.S), pady=5)
# Generation parameters
param_frame = ttk.LabelFrame(main_frame, text="Generation Parameters", padding="10")
param_frame.grid(row=2, column=0, columnspan=3, sticky=(tk.W, tk.E), pady=10)
# Max new tokens
ttk.Label(param_frame, text="Max New Tokens:").grid(row=0, column=0, sticky=tk.W, padx=5)
max_new_tokens_var = tk.StringVar(value="100")
ttk.Entry(param_frame, textvariable=max_new_tokens_var, width=8).grid(row=0, column=1, sticky=tk.W)
# Temperature
ttk.Label(param_frame, text="Temperature:").grid(row=0, column=2, sticky=tk.W, padx=5)
temperature_var = tk.StringVar(value="0.7")
ttk.Entry(param_frame, textvariable=temperature_var, width=8).grid(row=0, column=3, sticky=tk.W)
# Top-p
ttk.Label(param_frame, text="Top-p:").grid(row=1, column=0, sticky=tk.W, padx=5)
top_p_var = tk.StringVar(value="0.9")
ttk.Entry(param_frame, textvariable=top_p_var, width=8).grid(row=1, column=1, sticky=tk.W)
# Repetition penalty
ttk.Label(param_frame, text="Rep. Penalty:").grid(row=1, column=2, sticky=tk.W, padx=5)
rep_penalty_var = tk.StringVar(value="1.1")
ttk.Entry(param_frame, textvariable=rep_penalty_var, width=8).grid(row=1, column=3, sticky=tk.W)
# Generate button
generate_button = ttk.Button(main_frame, text="Generate", command=generate_text, state=tk.DISABLED)
generate_button.grid(row=3, column=0, pady=10)
# Output label and text area
ttk.Label(main_frame, text="Generated Output:").grid(row=4, column=0, sticky=tk.W, pady=5)
output_text = scrolledtext.ScrolledText(main_frame, height=15, wrap=tk.WORD)
output_text.grid(row=5, column=0, columnspan=3, sticky=(tk.W, tk.E, tk.N, tk.S), pady=5)
# Configure grid weights so text areas expand
main_frame.columnconfigure(0, weight=1)
main_frame.rowconfigure(1, weight=1)
main_frame.rowconfigure(5, weight=1)
# Start loading the model in the background after GUI is up
root.after(100, lambda: threading.Thread(target=load_model, daemon=True).start())
root.mainloop()
```
How to Use
1. Save the code as gpt_gui.py.
2. Install the dependencies: pip install transformers torch.
3. Run the script: python gpt_gui.py.
4. Wait for the model to load (a status bar shows progress).
5. Enter a prompt, adjust parameters if needed, and click Generate.
6. The generated text appears in the lower box.
Notes
· The model is about 0.4 B parameters, so it requires roughly 1–2 GB of RAM/VRAM.
· If you have a GPU with sufficient memory, the script will automatically use it (via device_map="auto").
· Generation can take a few seconds to tens of seconds depending on your hardware and the number of tokens requested.
· The GUI remains responsive during generation because the work is done in a separate thread.
Enjoy experimenting with the model!