amkyawdev's picture
Initial upload from AmkyawDev-LLM-V3
058ba59 verified
#!/usr/bin/env python3
"""
AmkyawDev-LLM-V3 Gradio Web UI
Burmese Language Model Chat Interface
"""
import os
import torch
from transformers import AutoTokenizer, AutoModelForCausalLM, AutoPeftModel
from peft import PeftModel, PeftConfig
import gradio as gr
from threading import Thread
# Model Configuration
BASE_MODEL = "Qwen/Qwen2.5-1.5B-Instruct" # Qwen2.5-1.5B model
ADAPTER_PATH = "./model/adapter" # Path to your LoRA weights
# Load model and tokenizer
def load_model():
"""Load the fine-tuned model with LoRA adapters."""
print("Loading tokenizer...")
tokenizer = AutoTokenizer.from_pretrained(
BASE_MODEL,
trust_remote_code=True
)
tokenizer.pad_token = tokenizer.eos_token
print("Loading base model...")
base_model = AutoModelForCausalLM.from_pretrained(
BASE_MODEL,
trust_remote_code=True,
torch_dtype=torch.float16,
device_map="auto",
)
# Check if adapter exists
if os.path.exists(ADAPTER_PATH) and os.listdir(ADAPTER_PATH):
print("Loading LoRA adapter...")
model = PeftModel.from_pretrained(
base_model,
ADAPTER_PATH,
torch_dtype=torch.float16,
)
else:
print("No adapter found, using base model.")
model = base_model
model.eval()
return model, tokenizer
# Initialize model globally
print("Initializing model... This may take a few minutes.")
try:
model, tokenizer = load_model()
print("Model loaded successfully!")
except Exception as e:
print(f"Error loading model: {e}")
print("Running in demo mode with mock responses.")
model = None
tokenizer = None
def generate_response(prompt, system_prompt=None, temperature=0.7, max_tokens=512):
"""Generate response from the model."""
if model is None:
# Demo mode - return mock response
return "πŸ“ α€€α€žα€Šα€Ία€™α€Ύα€¬ demo mode α€–α€Όα€…α€Ία€•α€«α€α€šα€Ία‹ α€™α€±α€¬α€Ία€’α€šα€Ία€•α€«α€α€Ία€€α€Ία€™α€•α€«α€α€²α€·α€‘α€α€½α€€α€Ία€…α€™α€Ία€Έα€žα€•α€Ία€–α€Όα€±α€†α€­α€―α€•α€«α€α€šα€Ία‹"
# Build conversation
if system_prompt:
full_prompt = f"System: {system_prompt}\n\nUser: {prompt}\nAssistant:"
else:
full_prompt = f"User: {prompt}\nAssistant:"
# Tokenize
inputs = tokenizer(full_prompt, return_tensors="pt").to(model.device)
# Generate
with torch.no_grad():
outputs = model.generate(
**inputs,
temperature=temperature,
max_new_tokens=max_tokens,
do_sample=True,
top_p=0.9,
repetition_penalty=1.1,
)
# Decode response
response = tokenizer.decode(outputs[0], skip_special_tokens=True)
# Extract assistant response
if "Assistant:" in response:
response = response.split("Assistant:")[-1].strip()
return response
def chat(message, history, system_prompt, temperature, max_tokens):
"""Chat function for Gradio."""
response = generate_response(
message,
system_prompt=system_prompt,
temperature=temperature,
max_tokens=max_tokens
)
return response
# Build Gradio Interface
def create_ui():
"""Create the Gradio web UI."""
with gr.Blocks(
title="AmkyawDev-LLM-V3",
theme=gr.themes.Soft(),
css="""
.gradio-container {max-width: 1200px !important;}
.main {background: linear-gradient(135deg, #667eea 0%, #764ba2 100%);}
"""
) as demo:
gr.Markdown("""
# πŸ‡²πŸ‡² AmkyawDev-LLM-V3
### Burmese Language Model Chat Interface
α€€α€žα€Šα€Ία€™α€Ύα€¬ α€™α€Όα€”α€Ία€™α€¬α€˜α€¬α€žα€¬α€…α€€α€¬α€Έ Large Language Model α€–α€Όα€…α€Ία€•α€«α€α€šα€Ία‹
""")
with gr.Row():
with gr.Column(scale=3):
chatbot = gr.Chatbot(
height=500,
show_copy_button=True,
bubble_full_width=False,
)
with gr.Row():
msg = gr.Textbox(
label="Message",
placeholder="α€™α€±α€Έα€α€½α€”α€Ία€Έα€›α€­α€―α€€α€Ία€•α€«α€α€šα€Ί...",
lines=3,
container=True,
)
with gr.Row():
submit_btn = gr.Button("πŸ“€ α€•α€­α€―α€·α€™α€šα€Ί", variant="primary")
clear_btn = gr.Button("πŸ—‘οΈ α€›α€Ύα€„α€Ία€Έα€™α€šα€Ί", variant="secondary")
with gr.Column(scale=1):
gr.Markdown("### βš™οΈ Settings")
system_prompt = gr.Textbox(
label="System Prompt",
value="You are a helpful Burmese language assistant.",
lines=3,
)
temperature = gr.Slider(
label="Temperature",
minimum=0.1,
maximum=1.5,
value=0.7,
step=0.1,
)
max_tokens = gr.Slider(
label="Max Tokens",
minimum=64,
maximum=2048,
value=512,
step=64,
)
# Chat functionality
def respond(message, history, system_prompt, temperature, max_tokens):
response = generate_response(
message,
system_prompt=system_prompt,
temperature=temperature,
max_tokens=max_tokens
)
history.append((message, response))
return "", history
submit_btn.click(
respond,
inputs=[msg, chatbot, system_prompt, temperature, max_tokens],
outputs=[msg, chatbot],
)
msg.submit(
respond,
inputs=[msg, chatbot, system_prompt, temperature, max_tokens],
outputs=[msg, chatbot],
)
clear_btn.click(lambda: (None, [])), outputs=[msg, chatbot])
gr.Markdown("""
---
### πŸ“ Notes
- α€™α€±α€¬α€Ία€’α€šα€Ία€™α€•α€«α€•α€«α€€ demo mode α€–α€Όα€…α€Ία€•α€•α€«α€α€šα€Ία‹
- LoRA weights α€•α€«α€α€»α€„α€Ία€Έα€†α€­α€―α€„α€Ία€Έα€•α€«α€α€šα€Ία‹
""")
return demo
# Main
if __name__ == "__main__":
print("Starting AmkyawDev-LLM-V3 Web UI...")
demo = create_ui()
demo.launch(
server_name="0.0.0.0",
server_port=7860,
share=False,
)