Medbot-chat / app.py
kzsnlsa's picture
Update app.py
666f6ec verified
Raw
History Blame Contribute Delete
2.67 kB
import os
import traceback
import torch
from flask import Flask, request, jsonify, render_template
from transformers import AutoTokenizer, AutoModelForCausalLM, BitsAndBytesConfig
from peft import PeftModel
app = Flask(__name__)
HF_MODEL_ID = "kzsnlsa/medbot-model"
PORT = int(os.getenv("PORT", 7860))
HOST = "0.0.0.0"
MAX_TOKENS = 512
model = None
tokenizer = None
device = "cuda" if torch.cuda.is_available() else "cpu"
def load_model():
global model, tokenizer
if model is not None and tokenizer is not None:
return
print(f"Loading model from Hugging Face: {HF_MODEL_ID} on {device}")
bnb_config = BitsAndBytesConfig(
load_in_4bit=True,
bnb_4bit_use_double_quant=True,
bnb_4bit_quant_type="nf4",
bnb_4bit_compute_dtype=torch.float16
)
tokenizer = AutoTokenizer.from_pretrained("EleutherAI/gpt-neox-20b")
tokenizer.pad_token = tokenizer.eos_token
base_model = AutoModelForCausalLM.from_pretrained(
"EleutherAI/gpt-neox-20b",
quantization_config=bnb_config,
device_map="auto",
trust_remote_code=True
)
model = PeftModel.from_pretrained(base_model, HF_MODEL_ID)
model.eval()
print("Model loaded successfully.")
@app.route("/", methods=["GET"])
def home():
return render_template("index.html")
@app.route("/generate", methods=["POST"])
def generate():
try:
load_model() # ensures globals are populated
data = request.json or {}
prompt = data.get("prompt", "").strip()
max_new_tokens = int(data.get("max_new_tokens", MAX_TOKENS))
temperature = float(data.get("temperature", 0.7))
top_p = float(data.get("top_p", 0.9))
if not prompt:
return jsonify({"error": "Prompt is required"}), 400
inputs = tokenizer(prompt, return_tensors="pt").to(device)
with torch.no_grad():
outputs = model.generate(
input_ids=inputs["input_ids"],
max_new_tokens=max_new_tokens,
temperature=temperature,
top_p=top_p,
do_sample=True,
pad_token_id=tokenizer.eos_token_id
)
response = tokenizer.decode(
outputs[0][inputs["input_ids"].shape[1]:],
skip_special_tokens=True
)
return jsonify({"response": response}), 200
except Exception as e:
return jsonify({"error": str(e), "trace": traceback.format_exc()}), 500
@app.route("/health", methods=["GET"])
def health():
return jsonify({"status": "ok"}), 200
if __name__ == "__main__":
load_model()
app.run(host=HOST, port=PORT)