biter-zephyr / app.py
askbyte's picture
Update app.py
928cd07 verified
raw
history blame
3.3 kB
from flask import Flask, request, jsonify
from transformers import AutoModelForCausalLM, AutoTokenizer
import torch
import os
app = Flask(__name__)
# Configuraci贸n CORS para permitir solicitudes desde tu dominio
@app.after_request
def after_request(response):
response.headers.add('Access-Control-Allow-Origin', 'https://justbyte.es')
response.headers.add('Access-Control-Allow-Headers', 'Content-Type')
response.headers.add('Access-Control-Allow-Methods', 'POST')
return response
# Cargar el modelo y tokenizador (se carga una sola vez al iniciar)
@app.before_first_request
def load_model():
global model, tokenizer
print("Cargando modelo Zephyr-7B...")
# Cargar el modelo y tokenizador
model_name = "HuggingFaceH4/zephyr-7b-beta"
tokenizer = AutoTokenizer.from_pretrained(model_name)
model = AutoModelForCausalLM.from_pretrained(
model_name,
torch_dtype=torch.float16, # Usar precisi贸n reducida para ahorrar memoria
device_map="auto", # Distribuir el modelo autom谩ticamente
load_in_8bit=True # Cuantizaci贸n a 8 bits para reducir uso de memoria
)
print("Modelo cargado correctamente!")
# Cargar el prompt desde el archivo
def get_system_prompt():
with open("prompt.txt", "r", encoding="utf-8") as f:
return f.read().strip()
@app.route('/generate', methods=['POST'])
def generate_response():
try:
# Obtener la pregunta del usuario
data = request.json
user_message = data.get('message', '')
if not user_message:
return jsonify({"error": "No se proporcion贸 ninguna pregunta"}), 400
# Obtener el prompt del sistema
system_prompt = get_system_prompt()
# Crear el formato de conversaci贸n para Zephyr
messages = [
{"role": "system", "content": system_prompt},
{"role": "user", "content": user_message}
]
# Convertir mensajes al formato que espera el modelo
prompt = tokenizer.apply_chat_template(messages, tokenize=False)
# Generar respuesta
inputs = tokenizer(prompt, return_tensors="pt").to(model.device)
# Configuraci贸n de generaci贸n
generation_config = {
"max_new_tokens": 500,
"temperature": 0.7,
"top_p": 0.9,
"do_sample": True,
"pad_token_id": tokenizer.eos_token_id
}
# Generar respuesta
with torch.no_grad():
outputs = model.generate(**inputs, **generation_config)
# Decodificar la respuesta
full_response = tokenizer.decode(outputs[0], skip_special_tokens=True)
# Extraer solo la respuesta del asistente (despu茅s del 煤ltimo mensaje del usuario)
assistant_response = full_response.split("assistant:")[-1].strip()
return jsonify({"response": assistant_response})
except Exception as e:
print(f"Error: {str(e)}")
return jsonify({"error": f"Error al generar respuesta: {str(e)}"}), 500
if __name__ == '__main__':
# Puerto que Hugging Face Spaces utiliza
port = int(os.environ.get('PORT', 7860))
app.run(host='0.0.0.0', port=port)