Ronda de Diseño ML · Parte 2 · estimaciones de C01

Las seis etapas

Formulario de estimaciones

Las nueve cuentas de la sección de estimaciones, cada una con su fórmula en variables, qué significa cada símbolo, el ejemplo de C01 paso a paso, una figura y un truco para recordarla. En la versión web, al final hay una calculadora para cambiar los supuestos.

Cómo recordarlaTrampa típicaValores de C01 en verde

0

Números de bolsillo

Lo que conviene saberse de memoria antes de cualquier cuenta.

Tiempo

1 dıˊa=86,400 s≈1051\ \text{día} = 86{,}400\ \text{s} \approx 10^5

1 M/dıˊa≈11.6 req/s1\ \text{M/día} \approx 11.6\ \text{req/s}

Mes

costos: 730 h730\ \text{h}

SLO: 30 dıˊas=720 h30\ \text{días} = 720\ \text{h}

predicciones al mes = diarias × 30.4

Bits y bytes

bits/s=8×bytes/s\text{bits/s} = 8 \times \text{bytes/s}

1 Gb/s=125 MB/s1\ \text{Gb/s} = 125\ \text{MB/s}

Bytes por valor

FP32 4 · FP16/BF16 2 · INT8 1 · INT4 ½

imagen 224 × 224 × 3 = 150,528 valores

Utilización objetivo

GPU online: ρ≈0.5–0.7\rho \approx 0.5\text{–}0.7

HPA de CPU: ρ≈0.6\rho \approx 0.6

batch offline: cerca de 100 %

Colas (M/M/1) y Little

W=S1−ρW = \dfrac{S}{1-\rho} · p99≈4.6 Wp99 \approx 4.6\,W

L=λ WL = \lambda\, W (requests en vuelo)

Instancias (aprox., us-east-1)

g4dn.xlarge (T4) US$0.526/h · g4dn.2xlarge 0.752 · c6i.xlarge (4 vCPU) 0.17 (≈ 0.0425 por vCPU-h)

Por uso (aprox.)

entre AZs US$0.01/GB por sentido · S3 GET US$0.0004 por 1,000 · ALB ≈ US$0.008 por GB procesado

↳

La cadena

Cada número sale del anterior. Si aprendes el orden, las fórmulas se acomodan solas.

N día10 M req÷ 86,400λ̄ promedio116 req/s× f picoλ pico350 req/s× margenλ diseño500 req/sGPUs⌈λ ÷ ρμ⌉ + 1 → 2CPU prepλ·t ÷ ρ → 5 vCPURedλ·s·8 → 2.4 Gb/sAlmacenamientoN día × bytesN día × bytes por registroCosto× 730 h × US$/hCatálogo200 M imágenes÷ (n·μ)Backfill≈ 14 h con 4 T4ModeloP, bytes, batchVRAMP·b + activ. + ctx¿cabe en la GPU?si no, otra GPU
Del volumen diario al pico de diseño; de ahí, GPUs, CPU y red; todo termina en el costo. La VRAM solo pregunta si el modelo cabe, y el backfill es un cálculo aparte.
1

Tráfico

¿Cuántos requests por segundo tienes que aguantar?

λˉ  =  Ndıˊa86,400 s\bar{\lambda} \;=\; \frac{N_{\text{día}}}{86{,}400\ \text{s}}
λpico  =  fpico⋅λˉfpico≈24⋅shora pico\lambda_{\text{pico}} \;=\; f_{\text{pico}}\cdot\bar{\lambda} \qquad f_{\text{pico}} \approx 24\cdot s_{\text{hora pico}}
λdisen˜o  =  m⋅λpico\lambda_{\text{diseño}} \;=\; m\cdot\lambda_{\text{pico}}
SímboloQué esUnidadEn C01
NdıˊaN_{\text{día}}requests (o imágenes) por díareq/día10 M
λˉ\bar{\lambda}tasa promedioreq/s≈ 116
fpicof_{\text{pico}}factor de pico diurno (2–5×)—3
shora picos_{\text{hora pico}}fracción del día en la hora pico—12.5 % → 3×
mmmargen por spikes y crecimiento (1.3–1.5)—≈ 1.4
λdisen˜o\lambda_{\text{diseño}}tasa para la que dimensionasreq/s500
01002003004005000 h6 h12 h18 h24 hλ̄ ≈ 116 promedioλ pico ≈ 350 (×3)λ diseño = 500 (×1.4)área bajo la curva= 10 M requestsreq/s
La curva de un día. El área bajo la curva son los 10 M requests; el promedio la reparte parejo; dimensionas para la línea de diseño.

Con los números de C01

  1. λˉ=10,000,00086,400 s≈116 req/s\bar{\lambda} = \frac{10{,}000{,}000}{86{,}400\ \text{s}} \approx 116\ \text{req/s}
  2. λpico=3×116≈350 req/s\lambda_{\text{pico}} = 3 \times 116 \approx 350\ \text{req/s}
  3. λdisen˜o=1.4×350≈490  →  500 req/s  (redondeas hacia arriba)\lambda_{\text{diseño}} = 1.4 \times 350 \approx 490 \;\rightarrow\; \boxed{500\ \text{req/s}}\ \ \text{(redondeas hacia arriba)}
  4. por GPU con 2 GPUs: 5002=250 req/s\text{por GPU con 2 GPUs: } \frac{500}{2} = 250\ \text{req/s}

Cómo recordarla

Divide por el día, multiplica por el pico, súmale margen. Atajo: 1 M/dıˊa≈11.6 req/s1\ \text{M/día} \approx 11.6\ \text{req/s}. Con 10510^5 s por día subestimas ≈ 14 %.

Trampa

Dimensionar con el promedio. El pico decide cuántas máquinas pones; el promedio decide cuánto pagas, porque la mayor parte del día el sistema trabaja muy por debajo de su capacidad.

2

Presupuesto de latencia

¿Cuántos milisegundos le tocan a cada tramo?

SLOp99  ≥  ∑ibi  +  margen\text{SLO}_{p99} \;\ge\; \sum_{i} b_i \;+\; \text{margen}
bmodelo  =  SLO  −  ∑i ≠ modelobi  −  margenb_{\text{modelo}} \;=\; \text{SLO} \;-\; \sum_{i\,\neq\,\text{modelo}} b_i \;-\; \text{margen}
p99(X+Y)  ≠  p99(X)+p99(Y)p99(X+Y) \;\neq\; p99(X) + p99(Y)
SímboloQué esUnidadEn C01
SLOp99\text{SLO}_{p99}objetivo de latencia server-sidems200
bib_ipresupuesto p99 del tramo imsver la barra
margen\text{margen}lo que no está en la tabla: fotos gigantes, GC, throttlingms≈ 48
ttimeoutt_{\text{timeout}}tiempo máximo hacia el tramo siguientems150 (gateway → Triton)
margen ≈ 480 ms50 ms100 ms150 ms200 msSLO p99 = 200 msΣ p99 de los tramos ≈ 152 ms
  • ALB + routing 10
  • Leer el body 30
  • Decode + resize + crop 50
  • Normalizar → tensor 2
  • Hop gateway → Triton 10
  • Cola de batching 2
  • Cómputo GPU 15
  • Postproceso + JSON 3
  • Overhead de Python 30
  • margen ≈ 48
Las cotas altas de p99 de cada tramo, apiladas. Suman ≈ 152 ms y quedan ≈ 48 ms de margen contra el SLO.

Con los números de C01

  1. ∑bi≈10+30+50+2+10+2+15+3+30≈152 ms\sum b_i \approx 10 + 30 + 50 + 2 + 10 + 2 + 15 + 3 + 30 \approx 152\ \text{ms}
  2. margen=200−152≈48 ms\text{margen} = 200 - 152 \approx 48\ \text{ms}
  3. ttimeout gateway→Triton=150 ms  (despueˊs ya no cumples el SLO: falla raˊpido)t_{\text{timeout}}^{\,\text{gateway}\to\text{Triton}} = 150\ \text{ms}\ \ \text{(después ya no cumples el SLO: falla rápido)}
  4. bcola de batching≤max_queue_delay=2 msb_{\text{cola de batching}} \le \texttt{max\_queue\_delay} = 2\ \text{ms}

Cómo recordarla

Reparte el SLO antes de elegir tecnología. Primero la cuenta y después el stack: así sabes dónde puedes gastar (2 ms de cola de batching) y dónde no (decodificar un JPEG de 12 MP sin cuidado).

Trampa

Los percentiles no se suman. La suma de p99 suele sobrestimar el p99 total, pero no es una cota garantizada: úsala para repartir y mide el p99 de punta a punta. Y la subida de la foto no entra: el SLO es server-side.

3

GPUs

¿Cuántas GPUs pones y qué tan cargadas van?

μplan  =  ρobj⋅μmax⁡\mu_{\text{plan}} \;=\; \rho_{\text{obj}}\cdot\mu_{\max}
nthr  =  ⌈λdisen˜oμplan⌉n  =  max⁡ ⁣(nthr+1,  nAZ)n_{\text{thr}} \;=\; \left\lceil \frac{\lambda_{\text{diseño}}}{\mu_{\text{plan}}} \right\rceil \qquad n \;=\; \max\!\big(n_{\text{thr}}+1,\; n_{\text{AZ}}\big)
u  =  λn μmax⁡u \;=\; \frac{\lambda}{n\,\mu_{\max}}
W  =  S1−ρp99≈4.6 WL  =  λ WW \;=\; \frac{S}{1-\rho} \qquad p99 \approx 4.6\,W \qquad L \;=\; \lambda\, W
SímboloQué esUnidadEn C01
μmax⁡\mu_{\max}máximo medido por GPU (perf_analyzer)img/s≈ 1,200 (T4)
ρobj\rho_{\text{obj}}utilización objetivo (50–70 %)—0.5
nthrn_{\text{thr}}GPUs por throughputGPU1
nAZn_{\text{AZ}}una por zona (disponibilidad)GPU2
uucarga real sobre el máximo%5–42 %
W, SW,\,Stiempo en el sistema y de servicios—
LLrequests en vuelo (Little)——
planeas aquí0×2×4×6×8×10×0 %25 %50 %75 %100 %2×3.3×10×ρ = utilizaciónW/S ρ obj = 50 %Promedio5 %Pico de diseño21 %Si cae una GPU42 %0 %25 %50 %75 %
Izquierda: cerca de la saturación la espera explota (M/M/1). Derecha: la carga real de cada T4 en C01; el número de GPUs lo fija la disponibilidad, no el throughput.

Con los números de C01

  1. μplan=0.5×1,200=600 img/s\mu_{\text{plan}} = 0.5 \times 1{,}200 = 600\ \text{img/s}
  2. nthr=⌈500600⌉=⌈0.83⌉=1n_{\text{thr}} = \left\lceil \tfrac{500}{600} \right\rceil = \lceil 0.83 \rceil = 1
  3. n=max⁡(1+1, 2)=2 T4  (una por AZ)n = \max(1+1,\ 2) = \boxed{2\ \text{T4}}\ \ \text{(una por AZ)}
  4. udisen˜o=5002×1,200≈21 %ufalla=5001,200≈42 %uprom=1162×1,200≈5 %u_{\text{diseño}} = \tfrac{500}{2 \times 1{,}200} \approx 21\,\% \qquad u_{\text{falla}} = \tfrac{500}{1{,}200} \approx 42\,\% \qquad u_{\text{prom}} = \tfrac{116}{2\times 1{,}200} \approx 5\,\%
  5. PyTorch eager FP32: 500≈100 img/s≈5 GPUs\text{PyTorch eager FP32: } \tfrac{500}{\approx 100\ \text{img/s}} \approx 5\ \text{GPUs}

Cómo recordarla

Mide, baja a ρ, redondea hacia arriba, suma una. El orden importa: primero el máximo medido, luego la utilización objetivo, luego el techo, al final N+1. Y con Little, L=λWL=\lambda W: 500 req/s × 50 ms = 25 requests en vuelo.

Trampa

Planear al 90 %: con ρ=0.9\rho = 0.9 el tiempo en el sistema es 10× el de servicio. Y nv_gpu_utilization no mide capacidad usada: marca tiempo con kernels corriendo.

4

¿Y sin GPU?

¿Cuántos vCPU harían el mismo trabajo y cuánto cuestan?

Cocup  =  λ⋅tCPUC_{\text{ocup}} \;=\; \lambda\cdot t_{\text{CPU}}
Cprov  =  λ tCPUρHPAC_{\text{prov}} \;=\; \frac{\lambda\, t_{\text{CPU}}}{\rho_{\text{HPA}}}
Costomes  =  Cfacturado⋅pvCPU-h⋅730 h\text{Costo}_{\text{mes}} \;=\; C_{\text{facturado}}\cdot p_{\text{vCPU-h}}\cdot 730\ \text{h}
SímboloQué esUnidadEn C01
tCPUt_{\text{CPU}}segundos de CPU por imagen por vCPUsFP32 0.04–0.08 · INT8 0.008–0.025
CocupC_{\text{ocup}}vCPU ocupados (Little con S = t)vCPU—
ρHPA\rho_{\text{HPA}}objetivo de CPU del autoscaler—0.6
CfacturadoC_{\text{facturado}}promedio que pagas (sigue la curva + mínimos)vCPU≈ 4–8
pvCPU-hp_{\text{vCPU-h}}precio por vCPU-horaUS$≈ 0.0425
US$0US$300US$600US$9002 × T4 (N+1, 24/7)≈ US$768CPU INT8 que sigue la curva≈ US$125–250
Las GPUs con N+1 no bajan de 2 las 24 horas; la CPU puede seguir la curva diaria. Con INT8, CPU-only puede costar igual o menos.

Con los números de C01

  1. FP32: 500×(0.04–0.08) s=20–40 vCPU ocupados en el pico\text{FP32: } 500 \times (0.04\text{–}0.08)\ \text{s} = 20\text{–}40\ \text{vCPU ocupados en el pico}
  2. INT8, pico: 500×(0.008–0.025)0.6≈7–21 vCPU\text{INT8, pico: } \frac{500 \times (0.008\text{–}0.025)}{0.6} \approx 7\text{–}21\ \text{vCPU}
  3. INT8, promedio: 116×(0.008–0.025)0.6≈2–5 vCPU  (+ mıˊnimos⇒4–8)\text{INT8, promedio: } \frac{116 \times (0.008\text{–}0.025)}{0.6} \approx 2\text{–}5\ \text{vCPU}\ \ (+\ \text{mínimos} \Rightarrow 4\text{–}8)
  4. (4–8)×0.0425×730≈US$125–250/mesvs2×0.526×730≈US$768(4\text{–}8) \times 0.0425 \times 730 \approx \text{US}\$125\text{–}250/\text{mes} \quad\text{vs}\quad 2 \times 0.526 \times 730 \approx \text{US}\$768

Cómo recordarla

vCPU ocupados = tráfico × segundos de CPU por imagen. Es Little otra vez: cada vCPU es un “servidor” y tCPUt_{\text{CPU}} su tiempo de servicio.

Trampa

Comparar pico contra pico. La diferencia está en el promedio: la CPU escala con la curva y la GPU con N+1 se queda encendida. Y lo mides la primera semana: latencia por vCPU y pérdida de INT8 en el golden set.

5

Memoria de GPU (VRAM)

¿Cabe el modelo en la GPU, y cuánto sobra?

Mpesos  =  P⋅bM_{\text{pesos}} \;=\; P\cdot b
Mentrada  =  B⋅C⋅H⋅W⋅binM_{\text{entrada}} \;=\; B\cdot C\cdot H\cdot W\cdot b_{\text{in}}
Mtotal  ≈  MCUDA  +  k (Mengine+Mact(B)+Mentrada(B))M_{\text{total}} \;\approx\; M_{\text{CUDA}} \;+\; k\,\big(M_{\text{engine}} + M_{\text{act}}(B) + M_{\text{entrada}}(B)\big)

Para LLMs, lo que domina es el KV cache: MKV/token=2⋅Lcapas⋅Hkv⋅dhead⋅bM_{\text{KV/token}} = 2\cdot L_{\text{capas}}\cdot H_{\text{kv}}\cdot d_{\text{head}}\cdot b (Llama 3 8B en BF16: 2⋅32⋅8⋅128⋅2=128 KiB2\cdot 32\cdot 8\cdot 128\cdot 2 = 128\ \text{KiB} por token).

SímboloQué esUnidadEn C01
PPparámetros del modelo—24.5 M (ResNet-50 de 500 clases)
bbbytes por parámetro: FP32 4 · FP16 2 · INT8 1B2 (FP16)
BBtamaño del batch—32
C⋅H⋅WC\cdot H\cdot Wcanales × alto × ancho de la entrada—3 × 224 × 224
kkinstancias del modelo en la GPU—2
MCUDAM_{\text{CUDA}}contexto CUDA + libreríasGB≈ 0.3–0.8
T4 · 16 GBlibre ≈ 14.5 GB0 GB4 GB8 GB12 GB16 GBContexto CUDA + libs0.55 GBInstancia 1: engine0.10 GBactivaciones b=320.35 GBentrada20 MBInstancia 2 (duplicada)0.47 GB≈ 1.5 GB
Arriba, la T4 completa; abajo, el zoom de lo que sí se usa. La VRAM no es la restricción en C01.

Con los números de C01

  1. Mpesos=24.5 M×2 B≈49 MBM_{\text{pesos}} = 24.5\ \text{M} \times 2\ \text{B} \approx 49\ \text{MB}
  2. Mentrada=32×3×224×224×4 B≈19 MBM_{\text{entrada}} = 32 \times 3 \times 224 \times 224 \times 4\ \text{B} \approx 19\ \text{MB}
  3. Mact(32)≈0.2–0.5 GBMCUDA≈0.3–0.8 GBM_{\text{act}}(32) \approx 0.2\text{–}0.5\ \text{GB} \qquad M_{\text{CUDA}} \approx 0.3\text{–}0.8\ \text{GB}
  4. Mtotal≈1–3 GB  ≪  16 GB ⇒ la VRAM no limitaM_{\text{total}} \approx 1\text{–}3\ \text{GB} \;\ll\; 16\ \text{GB}\ \Rightarrow\ \text{la VRAM no limita}

Cómo recordarla

Parámetros × bytes es el piso, no el total. Súmale el contexto CUDA, las activaciones del batch y una copia por instancia.

Trampa

Creer que solo pesan los pesos. En visión casi siempre sobra memoria; en LLMs el KV cache crece con los tokens en vuelo y es lo que decide cuántas conversaciones caben.

6

CPU para preprocesamiento

¿Cuántos vCPU necesita el gateway que decodifica y prepara la imagen?

tˉprep  =  ∑kwk tk\bar{t}_{\text{prep}} \;=\; \sum_k w_k\, t_k
Cocup  =  λdisen˜o⋅tˉprepCreq  =  CocupρHPAC_{\text{ocup}} \;=\; \lambda_{\text{diseño}}\cdot \bar{t}_{\text{prep}} \qquad C_{\text{req}} \;=\; \frac{C_{\text{ocup}}}{\rho_{\text{HPA}}}
nnodos  =  max⁡ ⁣(⌈CreqvCPU por nodo⌉,  nAZ)n_{\text{nodos}} \;=\; \max\!\left(\left\lceil \frac{C_{\text{req}}}{\text{vCPU por nodo}} \right\rceil,\; n_{\text{AZ}}\right)
SímboloQué esUnidadEn C01
wkw_kfracción del tráfico de cada tipo de imagen—85 % móvil · 15 % web
tkt_kCPU por imagen de ese tipoms≈ 5 · ≈ 60 (originales)
tˉprep\bar{t}_{\text{prep}}CPU promedio por imagen (con draft mode)ms≈ 6
ρHPA\rho_{\text{HPA}}objetivo de CPU del HPA—0.6
vCPU por nodo\text{vCPU por nodo}tamaño del nodovCPU4 (c6i.xlarge)
JPEG≈ 200 KBdecodedraft moderesize 256crop 224normalizarCHW FP32tensor602 KBCPU por imagen en la mezcla (originales: 85 % móvil ≈ 5 ms · 15 % web ≈ 60 ms)85 % de las fotos → 32 %15 % de las fotos → 68 % de la CPU0.85 × 5 ms = 4.25 ms0.15 × 60 ms = 9 mstotal ≈ 13.25 ms por imagen: el promedio lo dominan las fotos grandes
Arriba, lo que hace el gateway con cada foto. Abajo, por qué el promedio engaña: una minoría de fotos grandes se come la mayor parte de la CPU.

Con los números de C01

  1. Cocup=500×6 ms=3 vCPU ocupadosC_{\text{ocup}} = 500 \times 6\ \text{ms} = 3\ \text{vCPU ocupados}
  2. Creq=30.6=5 vCPUC_{\text{req}} = \frac{3}{0.6} = 5\ \text{vCPU}
  3. nnodos=max⁡ ⁣(⌈5/4⌉, 2)=2×c6i.xlarge=8 vCPUn_{\text{nodos}} = \max\!\left(\lceil 5/4 \rceil,\ 2\right) = 2 \times \text{c6i.xlarge} = 8\ \text{vCPU}
  4. mezcla de originales: 0.85×5+0.15×60=13.25 ms  ⇒  68 % lo pone el 15 %\text{mezcla de originales: } 0.85 \times 5 + 0.15 \times 60 = 13.25\ \text{ms} \;\Rightarrow\; 68\,\%\ \text{lo pone el 15}\,\%

Cómo recordarla

La CPU se cuenta igual que la GPU: tráfico × tiempo ÷ utilización, y al final redondeas a nodos enteros con uno por zona.

Trampa

Quedarte con el promedio: la cola de fotos gigantes manda (por eso el draft mode no es micro-optimización). Y la VM de la GPU solo tiene 4 vCPU: el preprocesamiento va en su propio tier.

7

Red entre tiers

¿Cuántos Gb/s viajan del gateway al model server, y cuánto cuestan?

s  =  C⋅H⋅W⋅bs \;=\; C\cdot H\cdot W\cdot b
BW  =  λ⋅s⋅8 bitsbyteuNIC  =  BW/nnodosBWbaselineBW \;=\; \lambda\cdot s\cdot 8\ \tfrac{\text{bits}}{\text{byte}} \qquad u_{\text{NIC}} \;=\; \frac{BW / n_{\text{nodos}}}{BW_{\text{baseline}}}
Vmes  =  s⋅Ndıˊa⋅30CostoAZ  =  fcruce⋅Vmes⋅pGBV_{\text{mes}} \;=\; s\cdot N_{\text{día}}\cdot 30 \qquad \text{Costo}_{\text{AZ}} \;=\; f_{\text{cruce}}\cdot V_{\text{mes}}\cdot p_{\text{GB}}
SímboloQué esUnidadEn C01
ssbytes por request que cruzan la redB602,112 (FP32)
BWBWancho de bandaGb/s≈ 2.4
BWbaselineBW_{\text{baseline}}red sostenida de la instancia (no el “hasta”)Gb/s1.56 (c6i.xlarge)
fcrucef_{\text{cruce}}fracción que cruza de zona—0.5 si balanceas al azar
pGBp_{\text{GB}}precio entre AZs (ida y vuelta)US$/GB0.02
01230.8JPEG móvil200 KB2.4Tensor FP32602 KB1.2FP16301 KB0.6UINT8150 KB1 nodo c6i.xlargebaseline 1.56 Gb/s2 nodos: 3.12 Gb/sGb/s
Lo que viaja a 500 req/s según el formato. El tensor FP32 pesa 3× el JPEG móvil y deja cada nodo del gateway al 77 % de su baseline.

Con los números de C01

  1. s=3×224×224×4 B=602,112 B≈602 KBs = 3 \times 224 \times 224 \times 4\ \text{B} = 602{,}112\ \text{B} \approx 602\ \text{KB}
  2. BW=500×602 KB×8≈2.4 Gb/sBW = 500 \times 602\ \text{KB} \times 8 \approx 2.4\ \text{Gb/s}
  3. uNIC=2.4/21.56≈77 %si cae una zona: 2.41.56≈154 %u_{\text{NIC}} = \frac{2.4 / 2}{1.56} \approx 77\,\% \qquad \text{si cae una zona: } \frac{2.4}{1.56} \approx 154\,\%
  4. Vmes≈602 KB×10 M×30≈180 TB  ⇒  0.5×180,000 GB×0.02≈US$1,800/mesV_{\text{mes}} \approx 602\ \text{KB} \times 10\ \text{M} \times 30 \approx 180\ \text{TB} \;\Rightarrow\; 0.5 \times 180{,}000\ \text{GB} \times 0.02 \approx \text{US}\$1{,}800/\text{mes}

Cómo recordarla

Bytes × requests × 8 = bits por segundo. Y la tabla de bytes por valor: FP32 4, FP16 2, UINT8 1 (÷ 2 y ÷ 4 del tensor).

Trampa

Olvidar el × 8, usar el ancho de banda “hasta” en vez del baseline sostenido, y balancear al azar entre zonas: la transferencia entre AZs costaría más que las dos GPUs. Ruteo por zona desde el día 1.

8

Almacenamiento y costo mensual

¿Cuánto guardas, cuánto pagas al mes y cuánto cuesta cada predicción?

Sdıˊa  =  Ndıˊa⋅sregistroSmes  ≈  30⋅SdıˊarcompresioˊnS_{\text{día}} \;=\; N_{\text{día}}\cdot s_{\text{registro}} \qquad S_{\text{mes}} \;\approx\; \frac{30\cdot S_{\text{día}}}{r_{\text{compresión}}}
Costomes  =  ∑jnj pj⋅730 h  +  ∑kqk ck\text{Costo}_{\text{mes}} \;=\; \sum_j n_j\, p_j\cdot 730\ \text{h} \;+\; \sum_k q_k\, c_k
c1k  =  CostomesNdıˊa⋅30.4⋅1,000c_{1k} \;=\; \frac{\text{Costo}_{\text{mes}}}{N_{\text{día}}\cdot 30.4}\cdot 1{,}000
SímboloQué esUnidadEn C01
sregistros_{\text{registro}}bytes por log de predicciónB≈ 300
rcompresioˊnr_{\text{compresión}}Parquet comprimido (5–10×)—5–10
nj, pjn_j,\ p_jinstancias de cada tipo y su precio por horaUS$/hT4 0.526 · c6i 0.17
qk, ckq_k,\ c_klo que se cobra por uso (GB, requests) y su precio—ALB 0.008/GB
c1kc_{1k}costo por 1,000 prediccionesUS$≈ 0.006
etiquetado US$250–500infra ≈ US$1.75kUS$0US$1,000US$2,000US$3,000presupuesto US$3k
  • GPUs (2 × g4dn.xlarge) ≈ US$768 44 %
  • ALB (hora + GB) ≈ US$503 29 %
  • Gateway (2 × c6i.xlarge) ≈ US$248 14 %
  • Logs, métricas, S3 ≈ US$100 6 %
  • EKS ≈ US$73 4 %
  • EBS, NAT, transferencia ≈ US$58 3 %
La infraestructura de C01 por línea, contra el presupuesto de US$3k. El ALB es la segunda línea de costo porque cobra por cada GB de imagen que lo cruza.

Con los números de C01

  1. Sdıˊa=10 M×300 B=3 GB/dıˊa≈90 GB/mes crudo  (÷5–10 en Parquet)S_{\text{día}} = 10\ \text{M} \times 300\ \text{B} = 3\ \text{GB/día} \approx 90\ \text{GB/mes crudo}\ \ (\div 5\text{–}10\ \text{en Parquet})
  2. GPUs=2×0.526×730≈768gateway=2×0.17×730≈248EKS=0.10×730≈73\text{GPUs} = 2 \times 0.526 \times 730 \approx 768 \qquad \text{gateway} = 2 \times 0.17 \times 730 \approx 248 \qquad \text{EKS} = 0.10 \times 730 \approx 73
  3. ALB=0.0225×730+2,000 GBdıˊa×30.4×0.008≈US$500\text{ALB} = 0.0225 \times 730 + 2{,}000\ \tfrac{\text{GB}}{\text{día}} \times 30.4 \times 0.008 \approx \text{US}\$500
  4. infra≈US$1.75k/mesc1k=1,750304 M×1,000≈US$0.006\text{infra} \approx \text{US}\$1.75\text{k/mes} \qquad c_{1k} = \frac{1{,}750}{304\ \text{M}} \times 1{,}000 \approx \text{US}\$0.006

Cómo recordarla

Mes de costos = 730 h. Precio por hora × horas × instancias, y después lo que se cobra por uso (GB procesados, requests a S3, transferencia). Para SLOs el mes es de 30 días = 720 h.

Trampa

Olvidar lo que se cobra por uso: aquí el ALB pesa ≈ 30 % de la infra. El almacenamiento casi nunca es lo caro; lo caro es la privacidad de lo que guardas.

9

Backfill de 200 M imágenes

¿Cuánto tarda y cuánto cuesta procesar el catálogo existente?

T  =  Ncataˊlogon⋅μofflineT \;=\; \frac{N_{\text{catálogo}}}{n\cdot\mu_{\text{offline}}}
GPU-h  =  n⋅T  =  NcataˊlogoμofflineCosto  =  GPU-h⋅pGPU-h\text{GPU-h} \;=\; n\cdot T \;=\; \frac{N_{\text{catálogo}}}{\mu_{\text{offline}}} \qquad \text{Costo} \;=\; \text{GPU-h}\cdot p_{\text{GPU-h}}
Cdecode  =  μoffline⋅tdecodeGET  =  Ncataˊlogo⋅pGETC_{\text{decode}} \;=\; \mu_{\text{offline}}\cdot t_{\text{decode}} \qquad \text{GET} \;=\; N_{\text{catálogo}}\cdot p_{\text{GET}}
SímboloQué esUnidadEn C01
NcataˊlogoN_{\text{catálogo}}imágenes por procesar—200 M
μoffline\mu_{\text{offline}}throughput por GPU en batch (IO + decode)img/s≈ 1,000
nnmáquinas en paralelo—4
tdecodet_{\text{decode}}CPU por thumbnails≈ 0.002
pGPU-hp_{\text{GPU-h}}precio de la instanciaUS$/h0.752 (g4dn.2xlarge)
pGETp_{\text{GET}}precio por GET de S3US$0.0004 / 1,000
0 h15 h30 h45 h60 h1234567891055.6 h27.8 h13.9 h7.0 hn = máquinas (1 T4 cada una)n · T = GPU-horas= 200 M ÷ 1,000 img/s≈ 55.6 GPU-h siempre× US$0.752/h≈ US$42 con 1, 4 u 8Más máquinas:menos horas,mismo costo.
El tiempo cae como 1/n, pero las GPU-horas no cambian: paralelizar compra tiempo, no ahorra dinero.

Con los números de C01

  1. T=200 M4×1,000 img/s=50,000 s≈14 hT = \frac{200\ \text{M}}{4 \times 1{,}000\ \text{img/s}} = 50{,}000\ \text{s} \approx 14\ \text{h}
  2. GPU-h=4×13.9≈56  ⇒  56×0.752≈US$42 on-demand (menos en spot)\text{GPU-h} = 4 \times 13.9 \approx 56 \;\Rightarrow\; 56 \times 0.752 \approx \text{US}\$42\ \text{on-demand (menos en spot)}
  3. Cdecode=1,000×2 ms=2 cores  ⇒  g4dn.2xlarge (8 vCPU)C_{\text{decode}} = 1{,}000 \times 2\ \text{ms} = 2\ \text{cores} \;\Rightarrow\; \text{g4dn.2xlarge (8 vCPU)}
  4. GET=200 M×0.00041,000=US$80originales: 200 M×13.25 ms≈736 CPU-h\text{GET} = 200\ \text{M} \times \frac{0.0004}{1{,}000} = \text{US}\$80 \qquad \text{originales: } 200\ \text{M} \times 13.25\ \text{ms} \approx 736\ \text{CPU-h}

Cómo recordarla

Más máquinas = menos horas, mismo costo. n⋅Tn\cdot T es constante: el número de máquinas lo decide tu fecha límite, no tu presupuesto.

Trampa

Correrlo contra el Triton online. Es un job aparte, reanudable por shards. El cuello de botella es IO + decode, no la GPU, y los thumbnails se recomprimieron: valida en una muestra que las predicciones coinciden con las de los originales.

⚙

Juega con los números

Viene cargada con C01. Cambia un supuesto y mira qué se mueve en la cadena.

Tráfico
GPUs
CPU y red
Costo
Backfill

Tráfico

116 → 347 → 500

req/s: promedio → pico → diseño (sin redondeo: 486)

GPUs

2 GPUs

por throughput 1 (0.83 → techo) + 1, mínimo 2

Carga por GPU

21 %

promedio 5 % · si cae una 42 %

CPU del gateway

5.0 vCPU

3.0 ocupados → 2 nodos de 4 vCPU

Red a Triton

2.41 Gb/s

77 % del baseline por nodo · 181 TB/mes

Costo mensual (infra)

US$1,692

GPUs 768 · gateway 248 · ALB 503 · fijos 173

Costo por 1,000

US$0.0056

infra ÷ predicciones del mes × 1,000

Backfill

13.9 h

55.6 GPU-h → US$42

Mismas fórmulas que arriba. El pico de diseño se redondea hacia arriba al múltiplo de 50, como en C01. El costo incluye EKS (≈ US$73) y logs (≈ US$100) fijos.