afdx2 commited on
Commit
31ffd52
·
verified ·
1 Parent(s): 3868453

Update server1.py

Browse files
Files changed (1) hide show
  1. server1.py +13 -20
server1.py CHANGED
@@ -1,16 +1,16 @@
1
  # app.py
2
  # comentarios sin tildes / sin enye
3
 
4
- import os, io
5
  from typing import Optional
6
  import torch
7
- from fastapi import FastAPI, File, UploadFile
8
  from fastapi.responses import JSONResponse
9
  from PIL import Image, UnidentifiedImageError
10
  import open_clip
11
- from fastapi import FastAPI, File, UploadFile, Request
12
- import traceback
13
- import os
14
  os.environ.setdefault("HF_HOME", "/app/cache")
15
  os.environ.setdefault("XDG_CACHE_HOME", "/app/cache")
16
  os.environ.setdefault("HUGGINGFACE_HUB_CACHE", "/app/cache/huggingface")
@@ -18,8 +18,6 @@ os.environ.setdefault("TRANSFORMERS_CACHE", "/app/cache/huggingface")
18
  os.environ.setdefault("TORCH_HOME", "/app/cache/torch")
19
  os.makedirs("/app/cache", exist_ok=True)
20
 
21
- from torchvision import transforms as T
22
-
23
  # limites basicos
24
  torch.set_num_threads(1)
25
  os.environ["OMP_NUM_THREADS"] = "1"
@@ -28,7 +26,6 @@ os.environ["MKL_NUM_THREADS"] = "1"
28
  DEVICE = "cuda" if torch.cuda.is_available() else "cpu"
29
  DTYPE = torch.float16 if DEVICE == "cuda" else torch.float32
30
 
31
- # nombres de ficheros (en el mismo repo)
32
  MODEL_EMB_PATH = os.getenv("MODEL_EMB_PATH", "text_embeddings_modelos_h14.pt")
33
  VERS_EMB_PATH = os.getenv("VERS_EMB_PATH", "text_embeddings_h14.pt")
34
 
@@ -60,12 +57,12 @@ def _ensure_label_list(x):
60
  def _load_embeddings(path: str):
61
  ckpt = torch.load(path, map_location="cpu")
62
  labels = _ensure_label_list(ckpt["labels"])
63
- embeds = ckpt["embeddings"].to("cpu", dtype=torch.float16)
64
  embeds = embeds / embeds.norm(dim=-1, keepdim=True)
65
  return labels, embeds
66
 
67
- model_labels, model_embeddings = _load_embeddings(MODEL_EMB_PATH) # "Marca Modelo"
68
- version_labels, version_embeddings = _load_embeddings(VERS_EMB_PATH) # "Marca Modelo Version"
69
 
70
  # ============== inferencia ==============
71
  @torch.inference_mode()
@@ -79,6 +76,8 @@ def _encode_image(img_tensor: torch.Tensor) -> torch.Tensor:
79
 
80
  def _predict_top(text_feats_dev: torch.Tensor, text_labels: list[str], image_tensor: torch.Tensor, topk: int = 1):
81
  img_f = _encode_image(image_tensor)
 
 
82
  sim = (100.0 * img_f @ text_feats_dev.T).softmax(dim=-1)[0]
83
  vals, idxs = torch.topk(sim, k=topk)
84
  return [{"label": text_labels[i], "confidence": round(float(v)*100.0, 2)} for v, i in zip(vals, idxs)]
@@ -94,7 +93,7 @@ def process_image_bytes(image_bytes: bytes):
94
  img_tensor = transform(img).unsqueeze(0).to(device=DEVICE, dtype=DTYPE)
95
 
96
  # paso 1: top-1 modelo
97
- model_feats_dev = model_embeddings.to(DEVICE) if DEVICE == "cuda" else model_embeddings
98
  top_model = _predict_top(model_feats_dev, model_labels, img_tensor, topk=1)[0]
99
  modelo_full = top_model["label"]; conf_m = top_model["confidence"]
100
 
@@ -112,7 +111,7 @@ def process_image_bytes(image_bytes: bytes):
112
 
113
  idxs = [i for _, i in matches]
114
  labels_sub = [lab for lab, _ in matches]
115
- embeds_sub = version_embeddings[idxs].to(DEVICE) if DEVICE == "cuda" else version_embeddings[idxs]
116
 
117
  # paso 3: top-1 version
118
  top_ver = _predict_top(embeds_sub, labels_sub, img_tensor, topk=1)[0]
@@ -137,23 +136,16 @@ def process_image_bytes(image_bytes: bytes):
137
  def root():
138
  return {"status": "ok", "device": DEVICE}
139
 
140
-
141
  @app.post("/predict")
142
  async def predict(front: UploadFile = File(None), back: Optional[UploadFile] = File(None), request: Request = None):
143
  try:
144
- # log de cabeceras y tipos
145
  if request:
146
  print("headers:", dict(request.headers))
147
  if front is None:
148
- print("no llego 'front'")
149
  return JSONResponse(content={"code": 400, "error": "faltan archivos: 'front' es obligatorio"}, status_code=200)
150
 
151
- print("front filename:", front.filename, "content_type:", front.content_type)
152
  front_bytes = await front.read()
153
- print("front size:", len(front_bytes))
154
-
155
  if back is not None:
156
- print("back filename:", back.filename, "content_type:", back.content_type)
157
  _ = await back.read()
158
 
159
  result = process_image_bytes(front_bytes)
@@ -163,3 +155,4 @@ async def predict(front: UploadFile = File(None), back: Optional[UploadFile] = F
163
  print("EXCEPTION:", repr(e))
164
  traceback.print_exc()
165
  return JSONResponse(content={"code": 404, "data": {}, "error": str(e)}, status_code=200)
 
 
1
  # app.py
2
  # comentarios sin tildes / sin enye
3
 
4
+ import os, io, traceback
5
  from typing import Optional
6
  import torch
7
+ from fastapi import FastAPI, File, UploadFile, Request
8
  from fastapi.responses import JSONResponse
9
  from PIL import Image, UnidentifiedImageError
10
  import open_clip
11
+ from torchvision import transforms as T
12
+
13
+ # caches locales
14
  os.environ.setdefault("HF_HOME", "/app/cache")
15
  os.environ.setdefault("XDG_CACHE_HOME", "/app/cache")
16
  os.environ.setdefault("HUGGINGFACE_HUB_CACHE", "/app/cache/huggingface")
 
18
  os.environ.setdefault("TORCH_HOME", "/app/cache/torch")
19
  os.makedirs("/app/cache", exist_ok=True)
20
 
 
 
21
  # limites basicos
22
  torch.set_num_threads(1)
23
  os.environ["OMP_NUM_THREADS"] = "1"
 
26
  DEVICE = "cuda" if torch.cuda.is_available() else "cpu"
27
  DTYPE = torch.float16 if DEVICE == "cuda" else torch.float32
28
 
 
29
  MODEL_EMB_PATH = os.getenv("MODEL_EMB_PATH", "text_embeddings_modelos_h14.pt")
30
  VERS_EMB_PATH = os.getenv("VERS_EMB_PATH", "text_embeddings_h14.pt")
31
 
 
57
  def _load_embeddings(path: str):
58
  ckpt = torch.load(path, map_location="cpu")
59
  labels = _ensure_label_list(ckpt["labels"])
60
+ embeds = ckpt["embeddings"].to("cpu") # guardados como fp16
61
  embeds = embeds / embeds.norm(dim=-1, keepdim=True)
62
  return labels, embeds
63
 
64
+ model_labels, model_embeddings = _load_embeddings(MODEL_EMB_PATH)
65
+ version_labels, version_embeddings = _load_embeddings(VERS_EMB_PATH)
66
 
67
  # ============== inferencia ==============
68
  @torch.inference_mode()
 
76
 
77
  def _predict_top(text_feats_dev: torch.Tensor, text_labels: list[str], image_tensor: torch.Tensor, topk: int = 1):
78
  img_f = _encode_image(image_tensor)
79
+ # casteamos embeddings al mismo dtype que la imagen
80
+ text_feats_dev = text_feats_dev.to(device=img_f.device, dtype=img_f.dtype)
81
  sim = (100.0 * img_f @ text_feats_dev.T).softmax(dim=-1)[0]
82
  vals, idxs = torch.topk(sim, k=topk)
83
  return [{"label": text_labels[i], "confidence": round(float(v)*100.0, 2)} for v, i in zip(vals, idxs)]
 
93
  img_tensor = transform(img).unsqueeze(0).to(device=DEVICE, dtype=DTYPE)
94
 
95
  # paso 1: top-1 modelo
96
+ model_feats_dev = model_embeddings.to(device=DEVICE, dtype=DTYPE)
97
  top_model = _predict_top(model_feats_dev, model_labels, img_tensor, topk=1)[0]
98
  modelo_full = top_model["label"]; conf_m = top_model["confidence"]
99
 
 
111
 
112
  idxs = [i for _, i in matches]
113
  labels_sub = [lab for lab, _ in matches]
114
+ embeds_sub = version_embeddings[idxs].to(device=DEVICE, dtype=DTYPE)
115
 
116
  # paso 3: top-1 version
117
  top_ver = _predict_top(embeds_sub, labels_sub, img_tensor, topk=1)[0]
 
136
  def root():
137
  return {"status": "ok", "device": DEVICE}
138
 
 
139
  @app.post("/predict")
140
  async def predict(front: UploadFile = File(None), back: Optional[UploadFile] = File(None), request: Request = None):
141
  try:
 
142
  if request:
143
  print("headers:", dict(request.headers))
144
  if front is None:
 
145
  return JSONResponse(content={"code": 400, "error": "faltan archivos: 'front' es obligatorio"}, status_code=200)
146
 
 
147
  front_bytes = await front.read()
 
 
148
  if back is not None:
 
149
  _ = await back.read()
150
 
151
  result = process_image_bytes(front_bytes)
 
155
  print("EXCEPTION:", repr(e))
156
  traceback.print_exc()
157
  return JSONResponse(content={"code": 404, "data": {}, "error": str(e)}, status_code=200)
158
+