File size: 3,604 Bytes
71a50c1 2d9230d 71a50c1 bd54fbb 1fdc66d 82fb2c2 71a50c1 2d9230d 82fb2c2 2d9230d 82fb2c2 2d9230d bd54fbb 2d9230d bd54fbb 82fb2c2 2d9230d bd54fbb 2d9230d 82fb2c2 bd54fbb 2d9230d bd54fbb 82fb2c2 bd54fbb 82fb2c2 2d9230d 82fb2c2 2d9230d 82fb2c2 2d9230d 82fb2c2 2d9230d bd54fbb 82fb2c2 2d9230d 82fb2c2 2d9230d bd54fbb 82fb2c2 bd54fbb 2d9230d bd54fbb 2d9230d bd54fbb 2d9230d 82fb2c2 2d9230d 82fb2c2 2d9230d 82fb2c2 2d9230d 71a50c1 82fb2c2 | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 | from flask import Flask, request, jsonify
from transformers import pipeline, AutoTokenizer, AutoModelForCausalLM
import torch
import os
app = Flask(__name__)
# Модель
MODEL_NAME = "KingNish/Qwen2.5-0.5b-Test-ft"
# Глобальные переменные для модели
model = None
tokenizer = None
def load_model():
"""Функция для загрузки модели при запуске приложения."""
global model, tokenizer
print("Loading model...")
try:
# Загружаем токенизатор и модель
tokenizer = AutoTokenizer.from_pretrained(MODEL_NAME)
# Убедимся, что токенизатор имеет pad_token
if tokenizer.pad_token is None:
tokenizer.pad_token = tokenizer.eos_token
model = AutoModelForCausalLM.from_pretrained(
MODEL_NAME,
torch_dtype=torch.float16,
low_cpu_mem_usage=True
)
# Переносим модель на доступное устройство
if torch.cuda.is_available():
model = model.cuda()
print("Model loaded on CUDA")
elif hasattr(torch, 'backends') and torch.backends.mps.is_available():
model = model.to('mps')
print("Model loaded on MPS")
else:
print("Model loaded on CPU")
print("Model loaded successfully!")
except Exception as e:
print(f"Error loading model: {e}")
model = None
tokenizer = None
# Загружаем модель при запуске приложения
load_model()
@app.route("/")
def home():
return "API is running!"
@app.route("/health")
def health():
return jsonify({"status": "healthy", "model_loaded": model is not None})
@app.route("/generate", methods=["POST"])
def generate():
if model is None or tokenizer is None:
return jsonify({"error": "Model not loaded"}), 500
try:
data = request.json
prompt = data.get("prompt", "Hello")
# Получаем параметры из запроса или используем значения по умолчанию
max_length = data.get("max_length", 512)
temperature = data.get("temperature", 0.7)
top_p = data.get("top_p", 0.9)
top_k = data.get("top_k", 50)
do_sample = data.get("do_sample", True)
# Токенизация
inputs = tokenizer.encode(prompt, return_tensors="pt")
# Перенос на устройство
device = next(model.parameters()).device
inputs = inputs.to(device)
# Генерация
with torch.no_grad():
outputs = model.generate(
inputs,
max_length=max_length,
num_return_sequences=1,
temperature=temperature,
do_sample=do_sample,
top_p=top_p,
top_k=top_k,
pad_token_id=tokenizer.eos_token_id,
repetition_penalty=data.get("repetition_penalty", 1.1),
)
# Декодирование
generated_text = tokenizer.decode(outputs[0], skip_special_tokens=True)
return jsonify({
"prompt": prompt,
"generated_text": generated_text,
"status": "success"
})
except Exception as e:
return jsonify({"error": str(e)}), 500
if __name__ == "__main__":
port = int(os.environ.get("PORT", 7860))
app.run(host="0.0.0.0", port=port, debug=False) |