arch_autoreg / app.py
MarkProMaster229's picture
Update app.py
022f3e4 verified
Raw
History Blame Contribute Delete
5.17 kB
import gradio as gr
from transformers import AutoTokenizer, AutoModelForCausalLM
from peft import PeftModel
import torch
import os
import gc
class EngineAutoreg:
def __init__(self):
print("=" * 50)
print("Loading Arch-Router with LoRA...")
print("=" * 50)
repo_name = "MarkProMaster229/experimental_models"
lora_subfolder = "loraForArchkit/loraForArch4"
base_model_name = "katanemo/Arch-Router-1.5B"
# Определяем устройство
if torch.cuda.is_available():
device_map = "auto"
torch_dtype = torch.float16
print("Using GPU")
else:
device_map = "cpu"
torch_dtype = torch.float32
print("Using CPU (slow)")
# Токенизатор
self.tokenizer = AutoTokenizer.from_pretrained(
base_model_name,
trust_remote_code=True
)
if self.tokenizer.pad_token is None:
self.tokenizer.pad_token = self.tokenizer.eos_token
# Базовая модель
base_model = AutoModelForCausalLM.from_pretrained(
base_model_name,
device_map=device_map,
torch_dtype=torch_dtype,
trust_remote_code=True,
low_cpu_mem_usage=True
)
# LoRA
self.model = PeftModel.from_pretrained(
base_model,
repo_name,
subfolder=lora_subfolder,
token=os.environ.get("HF_TOKEN")
)
self.model.eval()
gc.collect()
if torch.cuda.is_available():
torch.cuda.empty_cache()
print("Model loaded!")
def generate(self, prompt, max_new_tokens=100, temperature=0.1):
formatted_prompt = f"<|im_start|>user\n{prompt}<|im_end|>\n<|im_start|>assistant\n"
inputs = self.tokenizer(formatted_prompt, return_tensors="pt").to(self.model.device)
with torch.no_grad():
outputs = self.model.generate(
**inputs,
max_new_tokens=max_new_tokens,
temperature=temperature,
do_sample=temperature > 0,
pad_token_id=self.tokenizer.pad_token_id,
eos_token_id=self.tokenizer.eos_token_id,
)
generated_text = self.tokenizer.decode(outputs[0], skip_special_tokens=True)
# Извлекаем только ответ
if "<|im_start|>assistant" in generated_text:
response = generated_text.split("<|im_start|>assistant")[-1].strip()
else:
response = generated_text.replace(formatted_prompt, "").strip()
return response
# Глобальная модель
print("Initializing model...")
engine = EngineAutoreg()
def generate_response(prompt, max_tokens, temperature):
if not prompt.strip():
return "Please enter a prompt"
try:
response = engine.generate(
prompt=prompt,
max_new_tokens=int(max_tokens),
temperature=float(temperature)
)
return response
except Exception as e:
return f"Error: {str(e)}"
# Создаем Gradio интерфейс
with gr.Blocks(theme=gr.themes.Soft(), title="Arch-Router + LoRA") as demo:
gr.Markdown("""
# 🤖 Arch-Router with Custom LoRA
Base model: `katanemo/Arch-Router-1.5B`
LoRA adapter: `MarkProMaster229/experimental_models/loraForArchkit/loraForArch4`
""")
with gr.Row():
with gr.Column(scale=2):
prompt_input = gr.Textbox(
label="Your Prompt",
placeholder="Enter your prompt here...",
lines=4
)
with gr.Row():
max_tokens = gr.Slider(
minimum=10,
maximum=500,
value=100,
step=10,
label="Max New Tokens"
)
temperature = gr.Slider(
minimum=0,
maximum=2,
value=0.1,
step=0.1,
label="Temperature"
)
generate_btn = gr.Button("🚀 Generate", variant="primary", size="lg")
with gr.Column(scale=2):
output = gr.Textbox(
label="Generated Response",
lines=10,
interactive=False
)
# Примеры
gr.Examples(
examples=[
["What is MVC architecture?", 100, 0.1],
["Explain microservices architecture", 150, 0.1],
["What is the difference between monolithic and microservices?", 200, 0.1],
],
inputs=[prompt_input, max_tokens, temperature]
)
generate_btn.click(
fn=generate_response,
inputs=[prompt_input, max_tokens, temperature],
outputs=output
)
if __name__ == "__main__":
demo.launch(server_name="0.0.0.0", server_port=7860)