Update handler.py
#4
by
ismailhakki37
- opened
- handler.py +1 -81
handler.py
CHANGED
|
@@ -436,87 +436,7 @@ class EndpointHandler:
|
|
| 436 |
print(f"🔥 Manual generation with PULSE demo logic: temp={temperature}, tokens={max_new_tokens}")
|
| 437 |
print(f"📝 Input text: '{text[:100]}...'")
|
| 438 |
|
| 439 |
-
|
| 440 |
-
|
| 441 |
-
use_multimodal = (
|
| 442 |
-
LLAVA_AVAILABLE
|
| 443 |
-
and hasattr(self, "model") and self.model is not None
|
| 444 |
-
and hasattr(self, "image_processor") and self.image_processor is not None
|
| 445 |
-
and image is not None
|
| 446 |
-
)
|
| 447 |
-
|
| 448 |
-
if use_multimodal:
|
| 449 |
-
try:
|
| 450 |
-
# 1) LLaVA prompt (konuşma şablonu)
|
| 451 |
-
from llava.constants import (
|
| 452 |
-
IMAGE_TOKEN_INDEX,
|
| 453 |
-
DEFAULT_IMAGE_TOKEN,
|
| 454 |
-
DEFAULT_IM_START_TOKEN,
|
| 455 |
-
DEFAULT_IM_END_TOKEN,
|
| 456 |
-
)
|
| 457 |
-
from llava.conversation import conv_templates
|
| 458 |
-
|
| 459 |
-
conv = conv_templates.get("llava_v1") or conv_templates[list(conv_templates.keys())[0]]
|
| 460 |
-
conv = conv.copy()
|
| 461 |
-
conv.append_message(conv.roles[0], text)
|
| 462 |
-
conv.append_message(conv.roles[1], None)
|
| 463 |
-
prompt = conv.get_prompt()
|
| 464 |
-
|
| 465 |
-
# 2) <image> sentinel'i başa ekle + gerekirse IM_START/END
|
| 466 |
-
image_token = DEFAULT_IMAGE_TOKEN
|
| 467 |
-
if getattr(getattr(self.model, "config", object()), "mm_use_im_start_end", False):
|
| 468 |
-
image_token = DEFAULT_IM_START_TOKEN + DEFAULT_IMAGE_TOKEN + DEFAULT_IM_END_TOKEN
|
| 469 |
-
prompt = image_token + "\n" + prompt
|
| 470 |
-
|
| 471 |
-
# 3) Görseli tensöre çevir
|
| 472 |
-
imgs = process_images([image], self.image_processor, self.model.config)
|
| 473 |
-
model_device = next(self.model.parameters()).device
|
| 474 |
-
model_dtype = next(self.model.parameters()).dtype
|
| 475 |
-
if isinstance(imgs, list):
|
| 476 |
-
images_tensor = [im.to(model_device, dtype=model_dtype) for im in imgs]
|
| 477 |
-
else:
|
| 478 |
-
images_tensor = imgs.to(model_device, dtype=model_dtype)
|
| 479 |
-
image_sizes = [image.size]
|
| 480 |
-
|
| 481 |
-
# 4) Promptu tokenize et (image sentinel'ı için özel tokenizer)
|
| 482 |
-
input_ids = tokenizer_image_token(
|
| 483 |
-
prompt, self.tokenizer, IMAGE_TOKEN_INDEX, return_tensors='pt'
|
| 484 |
-
).unsqueeze(0).to(model_device)
|
| 485 |
-
|
| 486 |
-
# 5) Sağlam attention mask (bazı sürümler istiyor)
|
| 487 |
-
attention_mask = torch.ones_like(input_ids, dtype=torch.long, device=model_device)
|
| 488 |
-
|
| 489 |
-
# 6) Jenerasyon — medikal için deterministik önerilir
|
| 490 |
-
gen_kwargs = dict(
|
| 491 |
-
max_new_tokens=min(parameters.get("max_new_tokens", 512), 1024),
|
| 492 |
-
temperature=0.0,
|
| 493 |
-
top_p=1.0,
|
| 494 |
-
do_sample=False,
|
| 495 |
-
repetition_penalty=parameters.get("repetition_penalty", 1.0),
|
| 496 |
-
pad_token_id=self.tokenizer.pad_token_id,
|
| 497 |
-
eos_token_id=getattr(self.tokenizer, "eos_token_id", None),
|
| 498 |
-
)
|
| 499 |
-
|
| 500 |
-
out = self.model.generate(
|
| 501 |
-
inputs=input_ids,
|
| 502 |
-
attention_mask=attention_mask,
|
| 503 |
-
images=images_tensor,
|
| 504 |
-
image_sizes=image_sizes,
|
| 505 |
-
**gen_kwargs
|
| 506 |
-
)
|
| 507 |
-
|
| 508 |
-
# 7) Decode
|
| 509 |
-
new_tokens = out.shape[-1] - input_ids.shape[-1]
|
| 510 |
-
resp_ids = out[:, -new_tokens:] if new_tokens > 0 else out
|
| 511 |
-
generated_text = self.tokenizer.decode(resp_ids[0], skip_special_tokens=True).strip()
|
| 512 |
-
|
| 513 |
-
return [{"generated_text": generated_text, "mode": "multimodal"}]
|
| 514 |
-
|
| 515 |
-
except Exception as e:
|
| 516 |
-
print(f"[⚠️] Multimodal path failed → falling back to text-only: {e}")
|
| 517 |
-
# Buradan sonra senin mevcut metin-only yolun çalışmaya devam etsin
|
| 518 |
-
# (hiçbir şey return etme; aşağıdaki text-only blok zaten var)
|
| 519 |
-
|
| 520 |
|
| 521 |
# Text-only generation with enhanced ECG context
|
| 522 |
print("🔤 Using enhanced text-only generation with ECG context")
|
|
|
|
| 436 |
print(f"🔥 Manual generation with PULSE demo logic: temp={temperature}, tokens={max_new_tokens}")
|
| 437 |
print(f"📝 Input text: '{text[:100]}...'")
|
| 438 |
|
| 439 |
+
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 440 |
|
| 441 |
# Text-only generation with enhanced ECG context
|
| 442 |
print("🔤 Using enhanced text-only generation with ECG context")
|