Publicar modelo y Model Card
Browse files- README.md +8 -0
- cargar.py +1 -2
- config.json +21 -0
- exportar.py +6 -0
- model_ts.pt +1 -1
- predict_hub.py +34 -0
- requirements.txt +1 -0
README.md
CHANGED
|
@@ -24,6 +24,14 @@ python exportar.py
|
|
| 24 |
python cargar.py
|
| 25 |
```
|
| 26 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 27 |
## Qu茅 guarda el formato
|
| 28 |
|
| 29 |
| | |
|
|
|
|
| 24 |
python cargar.py
|
| 25 |
```
|
| 26 |
|
| 27 |
+
## Usar el modelo desde el Hub
|
| 28 |
+
|
| 29 |
+
Esta carpeta se puede subir tal cual como repositorio de modelo (desde la ra铆z: `python publicar_en_hub.py 00-formatos-exportacion/pytorch-exportar-torchscript`). Despu茅s, desde cualquier PC:
|
| 30 |
+
|
| 31 |
+
```bash
|
| 32 |
+
python predict_hub.py tu-usuario/casas-pytorch-exportar-torchscript
|
| 33 |
+
```
|
| 34 |
+
|
| 35 |
## Qu茅 guarda el formato
|
| 36 |
|
| 37 |
| | |
|
cargar.py
CHANGED
|
@@ -11,11 +11,10 @@ import numpy as np
|
|
| 11 |
import torch
|
| 12 |
|
| 13 |
CARPETA = Path(__file__).parent
|
| 14 |
-
ORIGEN = CARPETA.parent / "pytorch-entrenamiento-evaluacion"
|
| 15 |
ENTRADAS = ["m2", "balcon", "ascensor"]
|
| 16 |
|
| 17 |
# La normalizaci贸n no viaja dentro del archivo: se lee de config.json
|
| 18 |
-
config = json.loads((
|
| 19 |
media = np.array(config["normalizacion"]["media"], dtype="float32")
|
| 20 |
desvio = np.array(config["normalizacion"]["desvio"], dtype="float32")
|
| 21 |
|
|
|
|
| 11 |
import torch
|
| 12 |
|
| 13 |
CARPETA = Path(__file__).parent
|
|
|
|
| 14 |
ENTRADAS = ["m2", "balcon", "ascensor"]
|
| 15 |
|
| 16 |
# La normalizaci贸n no viaja dentro del archivo: se lee de config.json
|
| 17 |
+
config = json.loads((CARPETA / "config.json").read_text(encoding="utf-8"))
|
| 18 |
media = np.array(config["normalizacion"]["media"], dtype="float32")
|
| 19 |
desvio = np.array(config["normalizacion"]["desvio"], dtype="float32")
|
| 20 |
|
config.json
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
{
|
| 2 |
+
"arquitectura": "RegresionLineal (torch.nn.Linear)",
|
| 3 |
+
"entradas": [
|
| 4 |
+
"m2",
|
| 5 |
+
"balcon",
|
| 6 |
+
"ascensor"
|
| 7 |
+
],
|
| 8 |
+
"salida": "precio (miles de US$)",
|
| 9 |
+
"normalizacion": {
|
| 10 |
+
"media": [
|
| 11 |
+
78.51875305175781,
|
| 12 |
+
0.46875,
|
| 13 |
+
0.512499988079071
|
| 14 |
+
],
|
| 15 |
+
"desvio": [
|
| 16 |
+
23.397640228271484,
|
| 17 |
+
0.4990224838256836,
|
| 18 |
+
0.4998437762260437
|
| 19 |
+
]
|
| 20 |
+
}
|
| 21 |
+
}
|
exportar.py
CHANGED
|
@@ -8,6 +8,7 @@ Uso:
|
|
| 8 |
"""
|
| 9 |
|
| 10 |
import json
|
|
|
|
| 11 |
import sys
|
| 12 |
from pathlib import Path
|
| 13 |
|
|
@@ -34,3 +35,8 @@ modelo.eval()
|
|
| 34 |
ejemplo = torch.zeros(1, 3)
|
| 35 |
torch.jit.trace(modelo, ejemplo).save(CARPETA / "model_ts.pt")
|
| 36 |
print("Modelo guardado en model_ts.pt")
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 8 |
"""
|
| 9 |
|
| 10 |
import json
|
| 11 |
+
import shutil
|
| 12 |
import sys
|
| 13 |
from pathlib import Path
|
| 14 |
|
|
|
|
| 35 |
ejemplo = torch.zeros(1, 3)
|
| 36 |
torch.jit.trace(modelo, ejemplo).save(CARPETA / "model_ts.pt")
|
| 37 |
print("Modelo guardado en model_ts.pt")
|
| 38 |
+
|
| 39 |
+
# Se copian al lado del modelo: as铆 la carpeta se puede subir sola al Hub
|
| 40 |
+
for archivo in ["config.json"]:
|
| 41 |
+
shutil.copy(ORIGEN / archivo, CARPETA / archivo)
|
| 42 |
+
print("Copiados: config.json")
|
model_ts.pt
CHANGED
|
@@ -1,3 +1,3 @@
|
|
| 1 |
version https://git-lfs.github.com/spec/v1
|
| 2 |
-
oid sha256:
|
| 3 |
size 4258
|
|
|
|
| 1 |
version https://git-lfs.github.com/spec/v1
|
| 2 |
+
oid sha256:9cb1f50c9dd8a99c97f2ee06caab15acd700a088e2649ff5b547964442e165c9
|
| 3 |
size 4258
|
predict_hub.py
ADDED
|
@@ -0,0 +1,34 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
"""Descarga el modelo desde Hugging Face Hub y predice EN ESTA PC.
|
| 2 |
+
|
| 3 |
+
Baja model_ts.pt + config.json. El modelo vive en el Hub; la inferencia la hace este c贸digo.
|
| 4 |
+
|
| 5 |
+
No hace falta la clase RegresionLineal: el c贸digo viene en el archivo.
|
| 6 |
+
|
| 7 |
+
Uso:
|
| 8 |
+
python predict_hub.py tu-usuario/casas-pytorch-exportar-torchscript
|
| 9 |
+
"""
|
| 10 |
+
|
| 11 |
+
import json
|
| 12 |
+
import sys
|
| 13 |
+
|
| 14 |
+
import numpy as np
|
| 15 |
+
import torch
|
| 16 |
+
from huggingface_hub import hf_hub_download
|
| 17 |
+
|
| 18 |
+
REPO_ID = sys.argv[1] if len(sys.argv) > 1 else "TU-USUARIO/casas-pytorch-exportar-torchscript"
|
| 19 |
+
|
| 20 |
+
# La primera vez descarga el archivo; despu茅s usa la copia en cach茅
|
| 21 |
+
casas_nuevas = np.array([[50, 0, 0], [80, 1, 0], [110, 1, 1]], dtype="float32")
|
| 22 |
+
with open(hf_hub_download(repo_id=REPO_ID, filename="config.json"), encoding="utf-8") as f:
|
| 23 |
+
config = json.load(f)
|
| 24 |
+
media = np.array(config["normalizacion"]["media"], dtype="float32")
|
| 25 |
+
desvio = np.array(config["normalizacion"]["desvio"], dtype="float32")
|
| 26 |
+
x = torch.tensor((casas_nuevas - media) / desvio)
|
| 27 |
+
|
| 28 |
+
modelo = torch.jit.load(hf_hub_download(repo_id=REPO_ID, filename="model_ts.pt"))
|
| 29 |
+
with torch.no_grad():
|
| 30 |
+
precios = modelo(x).numpy()
|
| 31 |
+
|
| 32 |
+
ENTRADAS = ["m2", "balcon", "ascensor"]
|
| 33 |
+
for casa, precio in zip([[50, 0, 0], [80, 1, 0], [110, 1, 1]], np.ravel(precios)):
|
| 34 |
+
print(f"{dict(zip(ENTRADAS, casa))} -> {precio:.1f} miles de US$")
|
requirements.txt
CHANGED
|
@@ -1,3 +1,4 @@
|
|
| 1 |
torch>=2.1
|
| 2 |
safetensors
|
| 3 |
numpy
|
|
|
|
|
|
| 1 |
torch>=2.1
|
| 2 |
safetensors
|
| 3 |
numpy
|
| 4 |
+
huggingface_hub # para predict_hub.py
|