<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Azure on lo0 — Blog Técnico</title><link>https://blog.lo0.es/tags/azure/</link><description>Recent content in Azure on lo0 — Blog Técnico</description><generator>Hugo -- gohugo.io</generator><language>es</language><lastBuildDate>Sat, 23 May 2026 07:00:00 +0200</lastBuildDate><atom:link href="https://blog.lo0.es/tags/azure/index.xml" rel="self" type="application/rss+xml"/><item><title>El catálogo paralelo: las seis etapas LLMOps en open source y en los hyperscalers (AWS, GCP, Azure)</title><link>https://blog.lo0.es/posts/oss-vs-hyperscalers-llmops/</link><pubDate>Sat, 23 May 2026 07:00:00 +0200</pubDate><guid>https://blog.lo0.es/posts/oss-vs-hyperscalers-llmops/</guid><description>&lt;h2 id="tldr">TL;DR&lt;/h2>
&lt;p>El &lt;a href="https://blog.lo0.es/posts/anatomia-request-llm-mayo-2026/">post forense anterior&lt;/a> usó una única request para recorrer las seis etapas del pipeline LLMOps y los dos componentes transversales. Este post recorre las mismas etapas pero las cruza con tres columnas extra: cómo se monta cada etapa en &lt;strong>open source on-premise&lt;/strong>, y cuáles son los servicios equivalentes en &lt;strong>AWS&lt;/strong>, &lt;strong>GCP&lt;/strong> y &lt;strong>Azure&lt;/strong>. No es una guía de migración ni un benchmark de coste: es un &lt;strong>catálogo de equivalencias&lt;/strong> con sus gaps. El patrón general que verás: el OSS te da control, soberanía y composición libre a cambio de operativa cara; los hyperscalers te dan integración y time-to-market a cambio de lock-in en márgenes, contratos de datos y dependencia política. Para escenarios sometidos a ENS / NIS2 con datos críticos del cliente, el OSS gana por defecto; para proyectos de descubrimiento donde el time-to-market es la métrica que decide, el hyperscaler gana por defecto. La parte interesante está en el medio. Como hilo concreto, al final tomamos el chatbot multi-tenant del post anterior y lo portamos a AWS pieza a pieza para mostrar qué desaparece, qué aparece, y dónde se materializa el lock-in.&lt;/p>
&lt;h2 id="estás-aquí-las-mismas-seis-etapas-pero-por-columna">Estás aquí: las mismas seis etapas, pero por columna&lt;/h2>
&lt;p>Este post comparte mapa con el post anterior — las seis etapas y los dos transversales están todas activas — pero cambia el corte: en lugar de seguir una request horizontalmente, hace el corte vertical y muestra qué herramientas viven en cada etapa según el modelo de despliegue.&lt;/p>
&lt;div class="diagram" style="max-width:840px;margin:1rem auto;">
&lt;svg viewBox="0 0 840 310" xmlns="http://www.w3.org/2000/svg" role="img" aria-label="las seis etapas LLMOps con sus equivalentes OSS y hyperscaler">
&lt;style>.box{stroke:#444;stroke-width:1.4;rx:6}.active{fill:#ff8a4c;stroke-width:2}.cross{fill:#ffe9d6;stroke:#c66;stroke-width:1.4;rx:6}.lbl{font:600 12px sans-serif;fill:#222}.sm{font:10px sans-serif;fill:#333}.tiny{font:9px sans-serif;fill:#222}.row{font:600 10px sans-serif;fill:#333}.oss{fill:#dfe9f5;stroke:#356}.aws{fill:#fde6c8;stroke:#a65}.gcp{fill:#dceaf8;stroke:#369}.azu{fill:#dde2f8;stroke:#447}.foot{font:9px sans-serif;fill:#666}&lt;/style>
&lt;text x="420" y="20" text-anchor="middle" class="lbl">Catálogo paralelo: open source on-premise vs hyperscalers gestionados&lt;/text>
&lt;rect x="60" y="35" width="125" height="30" class="box active"/>&lt;text x="122.5" y="54" text-anchor="middle" class="lbl">1 · Data&lt;/text>
&lt;rect x="190" y="35" width="125" height="30" class="box active"/>&lt;text x="252.5" y="54" text-anchor="middle" class="lbl">2 · Tune&lt;/text>
&lt;rect x="320" y="35" width="125" height="30" class="box active"/>&lt;text x="382.5" y="54" text-anchor="middle" class="lbl">3 · Eval&lt;/text>
&lt;rect x="450" y="35" width="125" height="30" class="box active"/>&lt;text x="512.5" y="54" text-anchor="middle" class="lbl">4 · Deploy&lt;/text>
&lt;rect x="580" y="35" width="125" height="30" class="box active"/>&lt;text x="642.5" y="54" text-anchor="middle" class="lbl">5 · Observe&lt;/text>
&lt;rect x="710" y="35" width="125" height="30" class="box active"/>&lt;text x="772.5" y="54" text-anchor="middle" class="lbl">6 · Retrain&lt;/text>
&lt;text x="52" y="98" text-anchor="end" class="row">OSS&lt;/text>
&lt;rect x="60" y="80" width="125" height="30" class="box oss"/>&lt;text x="122.5" y="99" text-anchor="middle" class="tiny">DVC · lakeFS · Qdrant&lt;/text>
&lt;rect x="190" y="80" width="125" height="30" class="box oss"/>&lt;text x="252.5" y="99" text-anchor="middle" class="tiny">PEFT · MLflow · Ray&lt;/text>
&lt;rect x="320" y="80" width="125" height="30" class="box oss"/>&lt;text x="382.5" y="99" text-anchor="middle" class="tiny">DeepEval · Promptfoo&lt;/text>
&lt;rect x="450" y="80" width="125" height="30" class="box oss"/>&lt;text x="512.5" y="99" text-anchor="middle" class="tiny">vLLM · KServe · Operators&lt;/text>
&lt;rect x="580" y="80" width="125" height="30" class="box oss"/>&lt;text x="642.5" y="99" text-anchor="middle" class="tiny">OTel · Tempo · Langfuse&lt;/text>
&lt;rect x="710" y="80" width="125" height="30" class="box oss"/>&lt;text x="772.5" y="99" text-anchor="middle" class="tiny">Airflow · Argo · Kubeflow&lt;/text>
&lt;text x="52" y="138" text-anchor="end" class="row">AWS&lt;/text>
&lt;rect x="60" y="120" width="125" height="30" class="box aws"/>&lt;text x="122.5" y="139" text-anchor="middle" class="tiny">S3 · OpenSearch · MSK&lt;/text>
&lt;rect x="190" y="120" width="125" height="30" class="box aws"/>&lt;text x="252.5" y="139" text-anchor="middle" class="tiny">SageMaker · Bedrock&lt;/text>
&lt;rect x="320" y="120" width="125" height="30" class="box aws"/>&lt;text x="382.5" y="139" text-anchor="middle" class="tiny">Bedrock Eval · Guardrails&lt;/text>
&lt;rect x="450" y="120" width="125" height="30" class="box aws"/>&lt;text x="512.5" y="139" text-anchor="middle" class="tiny">Bedrock · SM Endpoints&lt;/text>
&lt;rect x="580" y="120" width="125" height="30" class="box aws"/>&lt;text x="642.5" y="139" text-anchor="middle" class="tiny">CloudWatch · X-Ray · ADOT&lt;/text>
&lt;rect x="710" y="120" width="125" height="30" class="box aws"/>&lt;text x="772.5" y="139" text-anchor="middle" class="tiny">SM Pipelines · GT&lt;/text>
&lt;text x="52" y="178" text-anchor="end" class="row">GCP&lt;/text>
&lt;rect x="60" y="160" width="125" height="30" class="box gcp"/>&lt;text x="122.5" y="179" text-anchor="middle" class="tiny">GCS · BQ · Vertex VS&lt;/text>
&lt;rect x="190" y="160" width="125" height="30" class="box gcp"/>&lt;text x="252.5" y="179" text-anchor="middle" class="tiny">Vertex Training · Tuning&lt;/text>
&lt;rect x="320" y="160" width="125" height="30" class="box gcp"/>&lt;text x="382.5" y="179" text-anchor="middle" class="tiny">Vertex Eval · Model Armor&lt;/text>
&lt;rect x="450" y="160" width="125" height="30" class="box gcp"/>&lt;text x="512.5" y="179" text-anchor="middle" class="tiny">Vertex Pred · Gemini API&lt;/text>
&lt;rect x="580" y="160" width="125" height="30" class="box gcp"/>&lt;text x="642.5" y="179" text-anchor="middle" class="tiny">Cloud Trace · Monitoring&lt;/text>
&lt;rect x="710" y="160" width="125" height="30" class="box gcp"/>&lt;text x="772.5" y="179" text-anchor="middle" class="tiny">Vertex Pipelines&lt;/text>
&lt;text x="52" y="218" text-anchor="end" class="row">Azure&lt;/text>
&lt;rect x="60" y="200" width="125" height="30" class="box azu"/>&lt;text x="122.5" y="219" text-anchor="middle" class="tiny">ADLS · AI Search · ADF&lt;/text>
&lt;rect x="190" y="200" width="125" height="30" class="box azu"/>&lt;text x="252.5" y="219" text-anchor="middle" class="tiny">Azure ML · AOAI tuning&lt;/text>
&lt;rect x="320" y="200" width="125" height="30" class="box azu"/>&lt;text x="382.5" y="219" text-anchor="middle" class="tiny">AI Eval · Content Safety&lt;/text>
&lt;rect x="450" y="200" width="125" height="30" class="box azu"/>&lt;text x="512.5" y="219" text-anchor="middle" class="tiny">AOAI · ML Endpoints&lt;/text>
&lt;rect x="580" y="200" width="125" height="30" class="box azu"/>&lt;text x="642.5" y="219" text-anchor="middle" class="tiny">App Insights · Monitor&lt;/text>
&lt;rect x="710" y="200" width="125" height="30" class="box azu"/>&lt;text x="772.5" y="219" text-anchor="middle" class="tiny">Azure ML Pipelines&lt;/text>
&lt;rect x="60" y="245" width="385" height="26" class="cross"/>
&lt;text x="252.5" y="262" text-anchor="middle" class="sm">Prompt versioning: Langfuse · MLflow ↔ Bedrock · Vertex · Foundry&lt;/text>
&lt;rect x="450" y="245" width="385" height="26" class="cross"/>
&lt;text x="642.5" y="262" text-anchor="middle" class="sm">Data versioning: DVC · lakeFS · OpenLineage ↔ S3 · Dataplex · Purview&lt;/text>
&lt;text x="420" y="295" text-anchor="middle" class="foot">El stack OSS se monta on-premise; AWS / GCP / Azure muestran los equivalentes gestionados por etapa.&lt;/text>
&lt;/svg>
&lt;/div>
&lt;h2 id="la-analogía-la-panadería-propia-y-la-franquicia">La analogía: la panadería propia y la franquicia&lt;/h2>
&lt;p>Un panadero abre negocio. Tiene dos modelos posibles.&lt;/p>
&lt;p>Puede abrir &lt;strong>panadería propia&lt;/strong>: alquila el local, compra el horno, elige los proveedores de harina, contrata a su maestro panadero, escribe sus recetas, decide los precios, decora el escaparate. El día que quiere lanzar un pan ecológico de masa madre de centeno, no pide permiso a nadie. El día que el precio de la harina sube, busca otro proveedor. Pero todo lo paga él: la inversión inicial, el riesgo, la operativa diaria, los meses en los que no acierta con el barrio. La panadería es suya.&lt;/p>
&lt;p>O puede entrar en &lt;strong>franquicia&lt;/strong>: el franquiciador le entrega el local llave en mano, el horno con contrato de mantenimiento, los proveedores ya negociados, los manuales operativos, las recetas escritas, el marketing centralizado, la app de fidelización, el sistema TPV. La curva de aprendizaje es de semanas, no de años. Pero las recetas son del franquiciador, los proveedores también, el precio del pan está en el catálogo y el día que cambia la fórmula del croissant le llega un correo informativo, no una decisión de negocio.&lt;/p>
&lt;p>Ambas panaderías sacan pan. Ambas cumplen sanidad y producen ingresos. La diferencia operativa es enorme y no es de tecnología: es de &lt;strong>propiedad, control y plazo&lt;/strong>.&lt;/p>
&lt;p>El paralelismo con LLMOps es directo. El stack OSS on-premise es la panadería propia. El stack gestionado en hyperscalers es la franquicia. Las &lt;strong>piezas&lt;/strong> que aparecen en cada etapa son equivalentes funcionalmente — al final del día las dos resuelven el mismo problema técnico —, pero el modelo de gobierno, el coste operativo, el lock-in y las garantías de cumplimiento son distintos. Este post hace el catálogo paralelo para que la elección no se haga por defecto.&lt;/p>
&lt;h2 id="recap-rápido-del-post-anterior">Recap rápido del post anterior&lt;/h2>
&lt;p>En el &lt;a href="https://blog.lo0.es/posts/anatomia-request-llm-mayo-2026/">post forense&lt;/a> seguimos una request específica: un usuario premium-es de una aseguradora preguntando &lt;em>&amp;quot;¿Cómo cancelo mi suscripción premium?&amp;quot;&lt;/em> al chatbot de soporte multi-tenant del proveedor SaaS que la hospeda. El recorrido atravesó las &lt;strong>seis etapas del pipeline LLMOps&lt;/strong> —Data, Tune, Eval, Deploy, Observe, Retrain— más los &lt;strong>dos componentes transversales&lt;/strong> —prompt versioning y data versioning— sobre una infraestructura on-premise: RKE2 con Cilium BGP, cluster 4×H100 SXM, RTX 4090 de desarrollo, vLLM en Kubernetes, Langfuse + OTel + Prometheus + Tempo, Postgres + Qdrant, DVC + lakeFS + MinIO, Kafka y MLflow. El sistema cumple ENS / NIS2 y mantiene &lt;code>trace_id&lt;/code> propagado extremo a extremo.&lt;/p>
&lt;p>Lo que viene ahora es ese mismo sistema, pieza a pieza, mostrando para cada caja qué herramienta hace el trabajo si estás en cloud público — porque la pregunta del integrador rara vez es &amp;ldquo;¿OSS sí o no?&amp;rdquo;: es &amp;ldquo;¿qué pierdo y qué gano si esta caja la cojo gestionada?&amp;rdquo;. Y la respuesta es distinta por caja.&lt;/p>
&lt;h2 id="etapa-1--data">Etapa 1 — Data&lt;/h2>
&lt;p>&lt;strong>El problema.&lt;/strong> Hay tres sub-problemas que la etapa Data resuelve, frecuentemente confundidos. Primero, &lt;strong>versionado e identidad&lt;/strong> del corpus y de los datasets de entrenamiento (que un &lt;code>dataset_id, dataset_version&lt;/code> exista y propague). Segundo, &lt;strong>almacenamiento y servido&lt;/strong> del corpus operativo (object store + vector index + texto estructurado). Tercero, &lt;strong>streams e ingestión&lt;/strong> desde sistemas fuente con CDC, transformación y esquemas estables (Schema Registry).&lt;/p>
&lt;p>&lt;strong>Stack OSS de referencia.&lt;/strong> El versionado vive en &lt;strong>DVC&lt;/strong> (apuntadores en git, contenido en object store) combinado con &lt;strong>lakeFS&lt;/strong> para semántica branch/merge sobre datos. El &lt;a href="https://blog.lo0.es/posts/data-versioning-dvc-lakefs/">post sobre data versioning&lt;/a> profundiza en la diferencia funcional. El object store es &lt;strong>MinIO&lt;/strong> o &lt;strong>Ceph&lt;/strong>. El vector index es &lt;strong>Qdrant&lt;/strong> o &lt;strong>Milvus&lt;/strong> para corpus grandes (millones de chunks) y &lt;strong>pgvector sobre Postgres 18&lt;/strong> para casos pequeños donde la operativa de un componente menos compensa. La capa stream es &lt;strong>Kafka&lt;/strong> (Apache puro o &lt;strong>Redpanda&lt;/strong>) con &lt;strong>Schema Registry&lt;/strong> (Confluent o &lt;strong>Karapace&lt;/strong> OSS), CDC con &lt;strong>Debezium&lt;/strong> o &lt;strong>Flink CDC&lt;/strong>, transformación con &lt;strong>Flink&lt;/strong> o &lt;strong>Spark Structured Streaming&lt;/strong>. El catálogo / lineage es &lt;strong>DataHub&lt;/strong>, &lt;strong>Apache Atlas&lt;/strong> o &lt;strong>OpenMetadata&lt;/strong> con eventos &lt;strong>OpenLineage&lt;/strong> entre sistemas. El &lt;a href="https://blog.lo0.es/posts/postgresql-qdrant-ingestion-microservicios/">post sobre ingestión PostgreSQL + Qdrant&lt;/a> y el &lt;a href="https://blog.lo0.es/posts/rag-kafka-datalake-arquitectura/">post sobre RAG sobre Kafka&lt;/a> cubren la operativa detallada.&lt;/p>
&lt;p>&lt;strong>Equivalentes hyperscaler.&lt;/strong> En &lt;strong>AWS&lt;/strong>, el corpus vive en &lt;strong>S3&lt;/strong> (con versioning habilitado, que es el sustituto barato del data versioning serio), las consultas tabulares en &lt;strong>Athena&lt;/strong> o &lt;strong>Redshift&lt;/strong>, el vector index en &lt;strong>Amazon OpenSearch&lt;/strong> con plug-in vectorial o en &lt;strong>Amazon Aurora pgvector&lt;/strong>. La capa stream es &lt;strong>MSK&lt;/strong> (Kafka gestionado) o &lt;strong>Kinesis Data Streams&lt;/strong>, CDC con &lt;strong>AWS DMS&lt;/strong>, transformación con &lt;strong>Glue Streaming&lt;/strong> o &lt;strong>MSK Connect&lt;/strong>. El catálogo es &lt;strong>AWS Glue Data Catalog&lt;/strong> + &lt;strong>AWS Lake Formation&lt;/strong> para gobierno de datos. Y para el caso RAG hay además &lt;strong>Amazon Bedrock Knowledge Bases&lt;/strong>, que es el atajo gestionado: le das S3, te indexa en OpenSearch o Aurora pgvector, te expone un retrieval API y se acaba la operativa — a cambio de pagar por chunk indexado y consulta.&lt;/p>
&lt;p>En &lt;strong>GCP&lt;/strong>, el corpus vive en &lt;strong>Cloud Storage&lt;/strong> (con object versioning), el almacén analítico es &lt;strong>BigQuery&lt;/strong> (con &lt;strong>BigQuery Vector Search&lt;/strong> ya integrado), el vector dedicado es &lt;strong>Vertex AI Vector Search&lt;/strong> (antes Matching Engine). La capa stream es &lt;strong>Pub/Sub&lt;/strong> + &lt;strong>Dataflow&lt;/strong>, CDC con &lt;strong>Datastream&lt;/strong>. El catálogo y lineage es &lt;strong>Dataplex&lt;/strong> (que en 2024-2025 absorbió Data Catalog y añadió lineage automático). El equivalente gestionado de Knowledge Bases es &lt;strong>Vertex AI Search&lt;/strong> (antes Discovery Engine).&lt;/p>
&lt;p>En &lt;strong>Azure&lt;/strong>, el corpus vive en &lt;strong>ADLS Gen2&lt;/strong>, las consultas tabulares en &lt;strong>Microsoft Fabric&lt;/strong> / &lt;strong>Azure Synapse&lt;/strong>, el vector index en &lt;strong>Azure AI Search&lt;/strong> (vector mode) o &lt;strong>Azure Cosmos DB for PostgreSQL&lt;/strong> con pgvector. La capa stream es &lt;strong>Event Hubs&lt;/strong> + &lt;strong>Stream Analytics&lt;/strong> o &lt;strong>Microsoft Fabric Real-Time Intelligence&lt;/strong>, CDC con &lt;strong>Azure Data Factory&lt;/strong>. El catálogo es &lt;strong>Microsoft Purview&lt;/strong>, que cubre catalog, lineage y data governance integrados con Entra ID.&lt;/p>
&lt;p>&lt;strong>Tabla resumen — Etapa Data.&lt;/strong>&lt;/p>
&lt;table>
&lt;thead>
&lt;tr>
&lt;th>Pieza funcional&lt;/th>
&lt;th>OSS on-premise&lt;/th>
&lt;th>AWS&lt;/th>
&lt;th>GCP&lt;/th>
&lt;th>Azure&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td>Object store&lt;/td>
&lt;td>MinIO, Ceph&lt;/td>
&lt;td>S3&lt;/td>
&lt;td>Cloud Storage&lt;/td>
&lt;td>ADLS Gen2&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>Versionado de datasets&lt;/td>
&lt;td>DVC, lakeFS&lt;/td>
&lt;td>S3 Versioning (limitado), Lake Formation&lt;/td>
&lt;td>GCS Versioning, Dataplex&lt;/td>
&lt;td>ADLS versioning, Purview&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>Vector index&lt;/td>
&lt;td>Qdrant, Milvus, pgvector&lt;/td>
&lt;td>OpenSearch, Aurora pgvector, Bedrock KB&lt;/td>
&lt;td>Vertex Vector Search, BigQuery VS&lt;/td>
&lt;td>Azure AI Search, Cosmos pgvector&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>Stream + CDC&lt;/td>
&lt;td>Kafka + Debezium + Flink&lt;/td>
&lt;td>MSK / Kinesis + DMS + Glue&lt;/td>
&lt;td>Pub/Sub + Datastream + Dataflow&lt;/td>
&lt;td>Event Hubs + ADF&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>Schema Registry&lt;/td>
&lt;td>Karapace, Confluent OSS&lt;/td>
&lt;td>Glue Schema Registry&lt;/td>
&lt;td>Pub/Sub schemas&lt;/td>
&lt;td>Schema Registry (Event Hubs)&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>Catalog + lineage&lt;/td>
&lt;td>DataHub, Atlas, OpenLineage&lt;/td>
&lt;td>Glue Catalog + Lake Formation&lt;/td>
&lt;td>Dataplex&lt;/td>
&lt;td>Purview&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>RAG gestionado end-to-end&lt;/td>
&lt;td>— (lo montas)&lt;/td>
&lt;td>Bedrock Knowledge Bases&lt;/td>
&lt;td>Vertex AI Search&lt;/td>
&lt;td>Azure AI Studio Knowledge&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;p>&lt;strong>Dónde los nombres engañan.&lt;/strong> &lt;em>S3 Versioning&lt;/em> no es DVC. Conserva versiones de objetos pero no tiene noción de &lt;strong>dataset&lt;/strong> (¿qué objetos forman juntos la versión 3 del enriquecido?), no propaga &lt;code>dataset_hash&lt;/code> al trainer, no integra con experiment tracking, y no falla un CI si un dataset rompe schema. Cubrirlo de verdad en AWS exige combinarlo con Lake Formation, Glue Data Catalog y registros propios en SageMaker Experiments. Lo mismo en GCP con Dataplex y en Azure con Purview. El gap es real y se paga en operativa o en lineage roto.&lt;/p>
&lt;h2 id="etapa-2--tune">Etapa 2 — Tune&lt;/h2>
&lt;p>&lt;strong>El problema.&lt;/strong> Producir un nuevo &lt;code>model_id, model_version&lt;/code> —típicamente un adapter LoRA sobre un base estable, como cuenta el &lt;a href="https://blog.lo0.es/posts/fine-tuning-continuo-produccion/">post de fine-tuning continuo&lt;/a>— con lineage hasta el dataset que lo entrenó y experiment tracking que permita reproducirlo seis meses después.&lt;/p>
&lt;p>&lt;strong>Stack OSS.&lt;/strong> Núcleo técnico: &lt;strong>HuggingFace Transformers + PEFT&lt;/strong> (LoRA, QLoRA), &lt;strong>bitsandbytes&lt;/strong> para quantization, &lt;strong>DeepSpeed&lt;/strong> o &lt;strong>FSDP&lt;/strong> para paralelismo. Experiment tracking: &lt;strong>MLflow&lt;/strong> (autoritativo) o &lt;strong>Weights &amp;amp; Biases self-hosted&lt;/strong>. Frameworks de conveniencia: &lt;strong>Axolotl&lt;/strong> y &lt;strong>Llama Factory&lt;/strong> envuelven la maquinaria anterior con configuración declarativa. Orquestación distribuida: &lt;strong>Kubeflow Training Operator&lt;/strong> o &lt;strong>Ray Train&lt;/strong>. En infraestructuras pequeñas, scripts directos con &lt;strong>Slurm&lt;/strong> o &lt;strong>K8s Jobs&lt;/strong> sobre GPU pools. La cadena de lineage &lt;code>dataset → run → model&lt;/code> se cierra registrando el dataset como input artifact MLflow.&lt;/p>
&lt;p>&lt;strong>Equivalentes hyperscaler.&lt;/strong> En &lt;strong>AWS&lt;/strong>, &lt;strong>SageMaker Training Jobs&lt;/strong> sirve para la mayoría de cargas, &lt;strong>SageMaker HyperPod&lt;/strong> para entrenamientos grandes con resiliencia a fallos de nodo, &lt;strong>SageMaker JumpStart&lt;/strong> ofrece fine-tuning click-to-train sobre catálogo de modelos pre-curados. Para fine-tuning de modelos Bedrock (Claude, Llama, Mistral hospedados) está &lt;strong>Bedrock Custom Models&lt;/strong>: tú subes el dataset al S3, Bedrock entrena, te devuelve un endpoint privado con throughput provisionado. El experiment tracking equivalente es &lt;strong>SageMaker Experiments&lt;/strong> o &lt;strong>MLflow gestionado en SageMaker&lt;/strong> (sí, AWS hospeda MLflow oficialmente desde 2024).&lt;/p>
&lt;p>En &lt;strong>GCP&lt;/strong>, &lt;strong>Vertex AI Custom Training&lt;/strong> corre cualquier contenedor con GPUs o TPUs; &lt;strong>Vertex AI Tuning&lt;/strong> es la API gestionada para fine-tunear Gemini y modelos del Model Garden. Experiment tracking en &lt;strong>Vertex AI Experiments&lt;/strong> (con compatibilidad MLflow).&lt;/p>
&lt;p>En &lt;strong>Azure&lt;/strong>, &lt;strong>Azure ML Training Jobs&lt;/strong> sobre clusters propios o managed compute; &lt;strong>Azure OpenAI fine-tuning&lt;/strong> para fine-tunear GPT y o-series; &lt;strong>Azure ML Experiments&lt;/strong> con MLflow integrado nativamente desde 2022.&lt;/p>
&lt;p>&lt;strong>Tabla resumen — Etapa Tune.&lt;/strong>&lt;/p>
&lt;table>
&lt;thead>
&lt;tr>
&lt;th>Pieza funcional&lt;/th>
&lt;th>OSS on-premise&lt;/th>
&lt;th>AWS&lt;/th>
&lt;th>GCP&lt;/th>
&lt;th>Azure&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td>Framework de entrenamiento&lt;/td>
&lt;td>HF Transformers + PEFT&lt;/td>
&lt;td>SageMaker SDK&lt;/td>
&lt;td>Vertex AI SDK&lt;/td>
&lt;td>Azure ML SDK&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>Quantization / paralelismo&lt;/td>
&lt;td>bitsandbytes, DeepSpeed, FSDP&lt;/td>
&lt;td>SageMaker libs + soporte HF&lt;/td>
&lt;td>Vertex + soporte HF&lt;/td>
&lt;td>Azure ML + soporte HF&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>Fine-tuning gestionado (caja negra)&lt;/td>
&lt;td>—&lt;/td>
&lt;td>Bedrock Custom Models, JumpStart&lt;/td>
&lt;td>Vertex Tuning (Gemini)&lt;/td>
&lt;td>Azure OpenAI fine-tuning&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>Distribuido en cluster&lt;/td>
&lt;td>Kubeflow, Ray Train, Slurm&lt;/td>
&lt;td>SageMaker HyperPod&lt;/td>
&lt;td>Vertex AI Training (multinodo)&lt;/td>
&lt;td>Azure ML compute clusters&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>Experiment tracking&lt;/td>
&lt;td>MLflow, W&amp;amp;B self-hosted&lt;/td>
&lt;td>SageMaker Experiments, MLflow gestionado&lt;/td>
&lt;td>Vertex Experiments&lt;/td>
&lt;td>Azure ML + MLflow&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>Acceso a base de modelo&lt;/td>
&lt;td>El que descargues (Llama, Mistral, Qwen)&lt;/td>
&lt;td>Bedrock catalog + HF Hub&lt;/td>
&lt;td>Vertex Model Garden + HF Hub&lt;/td>
&lt;td>Azure ML model catalog + HF Hub&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;p>&lt;strong>Dónde los nombres engañan.&lt;/strong> Los fine-tunings &lt;em>managed&lt;/em> (Bedrock Custom, Vertex Tuning, AOAI fine-tuning) son &lt;strong>caja negra&lt;/strong>: no eliges hiperparámetros más allá de un puñado, no ves los logs detallados del trainer, no puedes inspeccionar el dataset una vez en su pipeline. El experiment tracking que ofrecen no es comparable al MLflow puesto al lado del trainer, donde puedes capturar cualquier métrica y artefacto. Para escenarios donde &lt;em>operativamente&lt;/em> no necesitas inspección esto es liberador; para escenarios de ENS / NIS2 donde tienes que demostrar qué entrenó qué, el caja negra incumple por construcción.&lt;/p>
&lt;h2 id="etapa-3--eval">Etapa 3 — Eval&lt;/h2>
&lt;p>&lt;strong>El problema.&lt;/strong> Validar candidatos antes y después de promotion contra un golden set, con métricas operativas (faithfulness al RAG, tono, format compliance, toxicidad, jailbreak resistance, PII leakage) ejecutadas como gates en CI y como sampling online. Cubierto en el &lt;a href="https://blog.lo0.es/posts/evals-llm-la-capa-despues-de-tracing/">post sobre evals&lt;/a> y en el de &lt;a href="https://blog.lo0.es/posts/guardrails-safety-llm/">guardrails&lt;/a>.&lt;/p>
&lt;p>&lt;strong>Stack OSS.&lt;/strong> Suites de evals: &lt;strong>DeepEval&lt;/strong>, &lt;strong>RAGAS&lt;/strong> (especializada en RAG), &lt;strong>Promptfoo&lt;/strong> (declarativa, ideal para CI), &lt;strong>lm-eval-harness&lt;/strong> (académica), &lt;strong>HELM&lt;/strong>. Evals integrados con tracing: &lt;strong>Langfuse Evals&lt;/strong>, &lt;strong>Phoenix Arize OSS&lt;/strong>. Judges LLM-as-judge: cualquier modelo OSS local; en sistemas serios, dos judges distintos para reducir sesgo. Safety y guardrails: &lt;strong>NeMo Guardrails&lt;/strong> (NVIDIA), &lt;strong>Guardrails AI&lt;/strong>, &lt;strong>LlamaGuard&lt;/strong> + &lt;strong>PromptGuard&lt;/strong> (Meta), &lt;strong>ShieldGemma&lt;/strong> (Google, pesos abiertos), &lt;strong>PII detectors&lt;/strong> tipo &lt;strong>Presidio&lt;/strong> (Microsoft) on-prem.&lt;/p>
&lt;p>&lt;strong>Equivalentes hyperscaler.&lt;/strong> En &lt;strong>AWS&lt;/strong>, &lt;strong>Bedrock Model Evaluation&lt;/strong> ofrece evals automáticos (toxicity, accuracy, robustness) y human-in-the-loop, &lt;strong>Bedrock Guardrails&lt;/strong> cubre la capa de safety (denied topics, PII, prompt injection, contextual grounding check), &lt;strong>SageMaker Clarify&lt;/strong> añade bias y explainability sobre modelos generales.&lt;/p>
&lt;p>En &lt;strong>GCP&lt;/strong>, &lt;strong>Vertex AI Evaluation Service&lt;/strong> ejecuta evals con métricas automáticas y judge LLM, &lt;strong>Vertex AI Model Armor&lt;/strong> y los &lt;strong>safety filters&lt;/strong> integrados en Gemini API cubren la capa de guardrails. &lt;strong>Vertex AI Studio&lt;/strong> expone Eval interactivo para iteración con prompts.&lt;/p>
&lt;p>En &lt;strong>Azure&lt;/strong>, &lt;strong>Azure AI Evaluation SDK&lt;/strong> corre evals offline contra datasets, &lt;strong>Azure AI Content Safety&lt;/strong> cubre safety (Prompt Shields contra jailbreak, &lt;strong>Groundedness detection&lt;/strong>, content categories, &lt;strong>PII detection&lt;/strong>). Todo accesible desde &lt;strong>Azure AI Foundry&lt;/strong>.&lt;/p>
&lt;p>&lt;strong>Tabla resumen — Etapa Eval.&lt;/strong>&lt;/p>
&lt;table>
&lt;thead>
&lt;tr>
&lt;th>Pieza funcional&lt;/th>
&lt;th>OSS on-premise&lt;/th>
&lt;th>AWS&lt;/th>
&lt;th>GCP&lt;/th>
&lt;th>Azure&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td>Suite de evals automáticos&lt;/td>
&lt;td>DeepEval, RAGAS, Promptfoo&lt;/td>
&lt;td>Bedrock Model Evaluation&lt;/td>
&lt;td>Vertex AI Evaluation Service&lt;/td>
&lt;td>Azure AI Evaluation SDK&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>LLM-as-judge&lt;/td>
&lt;td>Cualquier modelo OSS&lt;/td>
&lt;td>Bedrock judge models&lt;/td>
&lt;td>Vertex judge (Gemini)&lt;/td>
&lt;td>Azure OpenAI judges&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>Golden set management&lt;/td>
&lt;td>Langfuse datasets, manual&lt;/td>
&lt;td>SageMaker Ground Truth datasets&lt;/td>
&lt;td>Vertex Datasets&lt;/td>
&lt;td>Azure ML Datasets&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>Guardrails (jailbreak, PII, prompt injection)&lt;/td>
&lt;td>NeMo Guardrails, LlamaGuard, Presidio&lt;/td>
&lt;td>Bedrock Guardrails&lt;/td>
&lt;td>Vertex Model Armor + Gemini safety&lt;/td>
&lt;td>Azure AI Content Safety (Prompt Shields, Groundedness)&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>Eval en CI&lt;/td>
&lt;td>Promptfoo + GitHub Actions&lt;/td>
&lt;td>Bedrock Eval API + CodeBuild&lt;/td>
&lt;td>Vertex Eval API + Cloud Build&lt;/td>
&lt;td>Azure AI Eval + Azure Pipelines&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;p>&lt;strong>Dónde los nombres engañan.&lt;/strong> Los guardrails gestionados son convenientes pero &lt;strong>opacos&lt;/strong>: las reglas de Bedrock Guardrails son configurables pero la implementación de detección no se inspecciona; lo mismo en Azure AI Content Safety. En OSS, NeMo Guardrails te enseña el grafo de Colang y Presidio te enseña los recognizers — auditables, modificables. Para sistemas regulados donde un auditor pregunta &lt;em>&amp;quot;¿cómo detecta exactamente PII?&amp;quot;&lt;/em>, el OSS responde con código; el cloud responde con documentación.&lt;/p>
&lt;h2 id="etapa-4--deploy">Etapa 4 — Deploy&lt;/h2>
&lt;p>&lt;strong>El problema.&lt;/strong> Servir tokens al usuario final con latencia y throughput predecibles, ratio coste / token decente, soporte de adapters hot-swap, y multi-tenancy si el negocio lo exige. Cubierto en los posts de &lt;a href="https://blog.lo0.es/posts/kv-cache-fundamentos/">KV cache&lt;/a>, &lt;a href="https://blog.lo0.es/posts/pagedattention-deep-dive/">PagedAttention&lt;/a>, &lt;a href="https://blog.lo0.es/posts/disaggregated-serving-prefill-decode/">disaggregated serving&lt;/a>, &lt;a href="https://blog.lo0.es/posts/vllm-kubernetes/">vLLM en K8s&lt;/a>, &lt;a href="https://blog.lo0.es/posts/operators-llm-kubernetes/">operators LLM&lt;/a> y &lt;a href="https://blog.lo0.es/posts/cluster-h100-plataforma-multi-tenant/">cluster multi-tenant&lt;/a>.&lt;/p>
&lt;p>&lt;strong>Stack OSS.&lt;/strong> Motor de inferencia: &lt;strong>vLLM&lt;/strong> (PagedAttention, prefix caching, LoRA hot-swap, OpenAI-compatible API) como referencia, &lt;strong>TensorRT-LLM&lt;/strong> para máxima optimización sobre Hopper / Ada, &lt;strong>SGLang&lt;/strong> para cargas con muchas restructuraciones de prompt, &lt;strong>TGI&lt;/strong> (Hugging Face) como alternativa madura, &lt;strong>llama.cpp&lt;/strong> para edge y CPUs, &lt;strong>NVIDIA Dynamo&lt;/strong> para disaggregated serving multinodo en clusters grandes. Orquestación en Kubernetes: &lt;strong>KServe&lt;/strong>, &lt;strong>KubeRay&lt;/strong>, operators dedicados como &lt;strong>llm-d&lt;/strong>, &lt;strong>vLLM Production Stack&lt;/strong> y &lt;strong>KAITO&lt;/strong>. Gateway / control plane: &lt;strong>Envoy AI Gateway&lt;/strong>, &lt;strong>LiteLLM Proxy&lt;/strong>, &lt;strong>Portkey AI Gateway&lt;/strong>, &lt;strong>Kong AI Gateway&lt;/strong>. Triton Inference Server cubre cargas mixtas (LLM + tradicionales) donde un solo backend importa.&lt;/p>
&lt;p>&lt;strong>Equivalentes hyperscaler.&lt;/strong> En &lt;strong>AWS&lt;/strong>, dos rutas distintas. La ruta &lt;em>gestionada por modelo&lt;/em> es &lt;strong>Amazon Bedrock&lt;/strong>: catálogo de modelos hospedados (Claude, Llama, Mistral, Cohere, Titan), pago por token o &lt;strong>Provisioned Throughput&lt;/strong> con SLA, &lt;strong>Bedrock Prompt Caching&lt;/strong> equivalente conceptual al prefix caching de vLLM, &lt;strong>Bedrock Agents&lt;/strong> y &lt;strong>Bedrock Knowledge Bases&lt;/strong> integrados. La ruta &lt;em>gestionada por infraestructura&lt;/em> es &lt;strong>SageMaker Endpoints&lt;/strong> (real-time, async, serverless, batch) con &lt;strong>Inference Components&lt;/strong> para densificar múltiples modelos en una instancia. Hardware propio: &lt;strong>AWS Inferentia&lt;/strong> y &lt;strong>Trainium&lt;/strong> vía el chip &lt;strong>Neuron&lt;/strong>, alternativa a NVIDIA con coste / token mejor en cargas estables si compila tu modelo.&lt;/p>
&lt;p>En &lt;strong>GCP&lt;/strong>, &lt;strong>Vertex AI Prediction Endpoints&lt;/strong> corre tus contenedores o modelos del &lt;strong>Model Garden&lt;/strong>, &lt;strong>Gemini API&lt;/strong> vía Vertex AI ofrece los Gemini gestionados, &lt;strong>Cloud TPU v5e / v5p / Trillium (v6)&lt;/strong> como hardware propio competidor de H100 para entrenamiento e inferencia. Para soberanía está &lt;strong>Google Distributed Cloud air-gapped&lt;/strong>, que lleva Vertex AI a un rack on-premise certificable.&lt;/p>
&lt;p>En &lt;strong>Azure&lt;/strong>, &lt;strong>Azure OpenAI Service&lt;/strong> sirve modelos OpenAI (GPT-4.1, o-series, GPT-image), &lt;strong>Azure ML Managed Online Endpoints&lt;/strong> corre cualquier modelo (incluido OSS vía contenedor), &lt;strong>Azure AI Foundry models&lt;/strong> absorbió en 2025 el catálogo de modelos abiertos servidos as-a-service. Hardware: &lt;strong>Azure ND H100 v5&lt;/strong>, &lt;strong>ND H200 v5&lt;/strong>, &lt;strong>ND GB200 v6&lt;/strong> y la apuesta propia &lt;strong>Microsoft Maia 100&lt;/strong> para inferencia interna.&lt;/p>
&lt;p>&lt;strong>Tabla resumen — Etapa Deploy.&lt;/strong>&lt;/p>
&lt;table>
&lt;thead>
&lt;tr>
&lt;th>Pieza funcional&lt;/th>
&lt;th>OSS on-premise&lt;/th>
&lt;th>AWS&lt;/th>
&lt;th>GCP&lt;/th>
&lt;th>Azure&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td>Motor de inferencia&lt;/td>
&lt;td>vLLM, TensorRT-LLM, SGLang, TGI&lt;/td>
&lt;td>Bedrock (modelo gestionado), SM Endpoints (tu contenedor)&lt;/td>
&lt;td>Vertex Prediction, Gemini API&lt;/td>
&lt;td>Azure OpenAI, Azure ML Endpoints&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>Prefix / prompt caching&lt;/td>
&lt;td>vLLM nativo&lt;/td>
&lt;td>Bedrock Prompt Caching&lt;/td>
&lt;td>Vertex AI context caching&lt;/td>
&lt;td>Azure OpenAI prompt caching&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>Adapter hot-swap (LoRA)&lt;/td>
&lt;td>vLLM &lt;code>--enable-lora&lt;/code>, S-LoRA&lt;/td>
&lt;td>Bedrock Custom Models endpoints&lt;/td>
&lt;td>Vertex Tuning endpoints&lt;/td>
&lt;td>Azure OpenAI fine-tuned deployments&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>Disaggregated serving&lt;/td>
&lt;td>NVIDIA Dynamo, vLLM PD-disagg&lt;/td>
&lt;td>— (interno gestionado, no expuesto)&lt;/td>
&lt;td>— (interno gestionado, no expuesto)&lt;/td>
&lt;td>— (interno gestionado, no expuesto)&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>Hardware acelerador&lt;/td>
&lt;td>NVIDIA H100/H200/B200, AMD MI300&lt;/td>
&lt;td>Inferentia, Trainium, NVIDIA&lt;/td>
&lt;td>TPU v5/v6, NVIDIA&lt;/td>
&lt;td>Maia, NVIDIA&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>AI Gateway / proxy&lt;/td>
&lt;td>Envoy AI Gateway, LiteLLM, Portkey, Kong&lt;/td>
&lt;td>API Gateway + Bedrock&lt;/td>
&lt;td>Vertex AI + Apigee&lt;/td>
&lt;td>Azure API Management + AOAI&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>Orquestación K8s&lt;/td>
&lt;td>KServe, KubeRay, llm-d, KAITO&lt;/td>
&lt;td>EKS + SageMaker Operators&lt;/td>
&lt;td>GKE + Vertex AI&lt;/td>
&lt;td>AKS + KAITO&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;p>&lt;strong>Dónde los nombres engañan.&lt;/strong> Bedrock Prompt Caching y Vertex context caching &lt;strong>suenan&lt;/strong> equivalentes al prefix caching de vLLM, pero operativamente son distintos: el cache vive en el plano del hyperscaler, su política de eviction es opaca, su coste se cobra aparte, y no podés ver hit ratio por tenant fácilmente. En vLLM ves el hit ratio en métricas Prometheus y decides la política. Igual con disaggregated serving: los hyperscalers lo implementan internamente para reducir su propio coste de servir, pero &lt;strong>no exponen&lt;/strong> el control de prefill/decode al usuario — si necesitas que tu workload tenga TTFT controlado por separado del TPS, no es palanca disponible.&lt;/p>
&lt;h2 id="etapa-5--observe">Etapa 5 — Observe&lt;/h2>
&lt;p>&lt;strong>El problema.&lt;/strong> Trazas LLM end-to-end con &lt;code>trace_id&lt;/code> propagado por todos los componentes, métricas de runtime por tenant, scoring online (judge LLM sobre sampling), drift estadístico, y safety / guardrails monitoring. Cubierto en los posts de &lt;a href="https://blog.lo0.es/posts/agentsight-tracing-llm/">tracing AgentSight&lt;/a>, &lt;a href="https://blog.lo0.es/posts/mcp-observability-otel/">MCP observability con OTel&lt;/a> y &lt;a href="https://blog.lo0.es/posts/ebpf-on-device-inference-drift/">eBPF + drift&lt;/a>.&lt;/p>
&lt;p>&lt;strong>Stack OSS.&lt;/strong> Estándar base: &lt;strong>OpenTelemetry&lt;/strong> (especificación + collector + SDKs) con las &lt;strong>gen_ai semantic conventions&lt;/strong> que se estabilizaron en 2025. Backends: &lt;strong>Tempo&lt;/strong> o &lt;strong>Jaeger&lt;/strong> para traces, &lt;strong>Prometheus&lt;/strong> para metrics, &lt;strong>Loki&lt;/strong> para logs, &lt;strong>Grafana&lt;/strong> como UI común. Capa LLM-específica: &lt;strong>Langfuse&lt;/strong> (self-hosted con licencia EE opcional) y &lt;strong>Phoenix Arize OSS&lt;/strong>. Capa eBPF para observabilidad de bajo nivel: &lt;strong>Pixie&lt;/strong>, &lt;strong>Hubble&lt;/strong>, y &lt;strong>Cilium Tetragon&lt;/strong> para runtime security. Drift: &lt;strong>Evidently AI&lt;/strong>, &lt;strong>NannyML&lt;/strong>, &lt;strong>Alibi Detect&lt;/strong>.&lt;/p>
&lt;p>&lt;strong>Equivalentes hyperscaler.&lt;/strong> En &lt;strong>AWS&lt;/strong>, &lt;strong>CloudWatch&lt;/strong> (metrics + logs) + &lt;strong>AWS X-Ray&lt;/strong> (traces) son la base, &lt;strong>CloudWatch Application Signals&lt;/strong> añade APM con OTel compatible, &lt;strong>Amazon Managed Prometheus&lt;/strong> y &lt;strong>Amazon Managed Grafana&lt;/strong> sirven el plano si quieres mantener Prom + Grafana sin operar. &lt;strong>Bedrock logging&lt;/strong> integrado con CloudWatch y S3. &lt;strong>ADOT&lt;/strong> (AWS Distro for OpenTelemetry) es el collector oficial.&lt;/p>
&lt;p>En &lt;strong>GCP&lt;/strong>, &lt;strong>Cloud Monitoring&lt;/strong> + &lt;strong>Cloud Logging&lt;/strong> + &lt;strong>Cloud Trace&lt;/strong> + &lt;strong>Cloud Profiler&lt;/strong> forman el quinteto, todos compatibles con OTel. &lt;strong>Vertex AI Model Monitoring&lt;/strong> ofrece drift detection (feature skew, prediction drift) integrado con runs.&lt;/p>
&lt;p>En &lt;strong>Azure&lt;/strong>, &lt;strong>Azure Monitor&lt;/strong> + &lt;strong>Application Insights&lt;/strong> + &lt;strong>Log Analytics&lt;/strong> cubren la pila APM con OTel nativo, &lt;strong>Azure ML Model Monitor&lt;/strong> añade drift y data quality, &lt;strong>Azure OpenAI diagnostic logs&lt;/strong> enriquecen los traces con metadata de tokens y modelo.&lt;/p>
&lt;p>&lt;strong>Tabla resumen — Etapa Observe.&lt;/strong>&lt;/p>
&lt;table>
&lt;thead>
&lt;tr>
&lt;th>Pieza funcional&lt;/th>
&lt;th>OSS on-premise&lt;/th>
&lt;th>AWS&lt;/th>
&lt;th>GCP&lt;/th>
&lt;th>Azure&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td>Traces (OTel)&lt;/td>
&lt;td>OTel + Tempo / Jaeger&lt;/td>
&lt;td>X-Ray + ADOT, App Signals&lt;/td>
&lt;td>Cloud Trace&lt;/td>
&lt;td>App Insights + Azure Monitor&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>Metrics&lt;/td>
&lt;td>Prometheus + Grafana&lt;/td>
&lt;td>CloudWatch + AMP / AMG&lt;/td>
&lt;td>Cloud Monitoring&lt;/td>
&lt;td>Azure Monitor Metrics&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>Logs&lt;/td>
&lt;td>Loki, ELK&lt;/td>
&lt;td>CloudWatch Logs&lt;/td>
&lt;td>Cloud Logging&lt;/td>
&lt;td>Log Analytics&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>LLM-específico (prompt, scores, sessions)&lt;/td>
&lt;td>Langfuse, Phoenix Arize OSS&lt;/td>
&lt;td>Bedrock logging + CW + custom&lt;/td>
&lt;td>Vertex AI tracing + custom&lt;/td>
&lt;td>App Insights + AOAI logs + custom&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>Drift detection&lt;/td>
&lt;td>Evidently, NannyML, Alibi Detect&lt;/td>
&lt;td>SageMaker Model Monitor&lt;/td>
&lt;td>Vertex AI Model Monitoring&lt;/td>
&lt;td>Azure ML Model Monitor&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>eBPF / runtime&lt;/td>
&lt;td>Pixie, Hubble, Tetragon&lt;/td>
&lt;td>— (no equivalente directo)&lt;/td>
&lt;td>GKE Dataplane v2 / Cloud Service Mesh&lt;/td>
&lt;td>Azure CNI + Defender for Cloud&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;p>&lt;strong>Dónde los nombres engañan.&lt;/strong> Las herramientas APM clásicas del cloud (X-Ray, Cloud Trace, App Insights) no entienden &lt;strong>prompt versioning&lt;/strong> ni &lt;strong>adapter id&lt;/strong> como conceptos nativos. Aceptan los atributos &lt;code>gen_ai.*&lt;/code> como dimensions, pero las UIs no priorizan esas vistas. Langfuse y Phoenix sí, porque están diseñadas para LLM. En cloud, el patrón habitual es enviar dual: APM al servicio gestionado para infra + Langfuse / Phoenix self-hosted para el plano LLM. Eso compensa.&lt;/p>
&lt;h2 id="etapa-6--retrain--transversales">Etapa 6 — Retrain + transversales&lt;/h2>
&lt;p>&lt;strong>El problema (Retrain).&lt;/strong> Cerrar el bucle feedback → triage → dataset enriquecido → adapter nuevo, con cadencia mixta (trimestral + incident-driven). Cubierto en el &lt;a href="https://blog.lo0.es/posts/retrain-cerrar-el-bucle-feedback-dataset-adapter/">post de Retrain&lt;/a>.&lt;/p>
&lt;p>&lt;strong>Stack OSS Retrain.&lt;/strong> Orquestación: &lt;strong>Apache Airflow&lt;/strong>, &lt;strong>Prefect&lt;/strong>, &lt;strong>Dagster&lt;/strong> o &lt;strong>Argo Workflows&lt;/strong> y &lt;strong>Kubeflow Pipelines&lt;/strong> para K8s-native. Feature store cuando aplica: &lt;strong>Feast&lt;/strong>. Annotation y human-in-the-loop: &lt;strong>Argilla&lt;/strong>, &lt;strong>Label Studio&lt;/strong>, &lt;strong>Trubrics&lt;/strong>. Captura de feedback estructurado: tabla &lt;strong>Postgres&lt;/strong> propia + &lt;strong>Langfuse scores&lt;/strong> + &lt;strong>Phoenix annotations&lt;/strong>. Lineage del ciclo cerrado: &lt;strong>OpenLineage&lt;/strong> atando dataset → run → model → deployment → feedback → dataset siguiente.&lt;/p>
&lt;p>&lt;strong>Equivalentes hyperscaler Retrain.&lt;/strong> En &lt;strong>AWS&lt;/strong>, &lt;strong>SageMaker Pipelines&lt;/strong> orquesta el ciclo, &lt;strong>SageMaker Ground Truth&lt;/strong> y &lt;strong>A2I&lt;/strong> (Augmented AI) gestionan annotation y HiL, &lt;strong>SageMaker Model Monitor&lt;/strong> dispara alertas que pueden invocar pipelines de retrain. &lt;strong>AWS Step Functions&lt;/strong> sirve como orquestador alternativo más general.&lt;/p>
&lt;p>En &lt;strong>GCP&lt;/strong>, &lt;strong>Vertex AI Pipelines&lt;/strong> (basado en Kubeflow Pipelines, compatible) orquesta, &lt;strong>Vertex AI Data Labeling Service&lt;/strong> anota, &lt;strong>Vertex AI Feature Store&lt;/strong> gestiona features, &lt;strong>Workflows&lt;/strong> o &lt;strong>Cloud Composer&lt;/strong> (Airflow gestionado) como alternativas de orquestación.&lt;/p>
&lt;p>En &lt;strong>Azure&lt;/strong>, &lt;strong>Azure ML Pipelines&lt;/strong> orquesta, &lt;strong>Azure ML Data Labeling&lt;/strong> anota, &lt;strong>Azure ML Feature Store&lt;/strong> gestiona features.&lt;/p>
&lt;p>&lt;strong>El problema (transversales: prompt + data versioning).&lt;/strong> Que &lt;code>prompt_id, prompt_version&lt;/code> y &lt;code>dataset_id, dataset_version&lt;/code> propaguen por todo el sistema y aparezcan en spans, runs y métricas. Cubiertos en los posts de &lt;a href="https://blog.lo0.es/posts/prompt-versioning-langfuse-mlflow/">prompt versioning&lt;/a> y &lt;a href="https://blog.lo0.es/posts/data-versioning-dvc-lakefs/">data versioning&lt;/a>.&lt;/p>
&lt;p>&lt;strong>Equivalentes prompt versioning.&lt;/strong> OSS: &lt;strong>Langfuse Prompts&lt;/strong>, &lt;strong>MLflow Prompt Registry&lt;/strong>. AWS: &lt;strong>Bedrock Prompt Management&lt;/strong> (catalog, versiones, labels, A/B testing integrado) y &lt;strong>SageMaker Prompt Hub&lt;/strong>. GCP: &lt;strong>Vertex AI Prompt Management&lt;/strong> dentro de Vertex AI Studio. Azure: &lt;strong>Azure AI Foundry Prompt flow&lt;/strong> y prompt versioning en &lt;strong>Azure OpenAI deployments&lt;/strong>.&lt;/p>
&lt;p>&lt;strong>Equivalentes data versioning.&lt;/strong> OSS: DVC + lakeFS (ya cubierto en Data). AWS: S3 Versioning + Lake Formation + Glue Catalog (no son DVC pero juntos cubren parte). GCP: Cloud Storage versioning + Dataplex (idem). Azure: ADLS Gen2 versioning + Purview (idem). El &lt;strong>gap real&lt;/strong> aquí es que ningún hyperscaler ofrece DVC nativamente — la operativa de dataset-as-first-class-citizen sigue requiriendo capa propia.&lt;/p>
&lt;p>&lt;strong>Tabla resumen — Etapa Retrain + transversales.&lt;/strong>&lt;/p>
&lt;table>
&lt;thead>
&lt;tr>
&lt;th>Pieza funcional&lt;/th>
&lt;th>OSS on-premise&lt;/th>
&lt;th>AWS&lt;/th>
&lt;th>GCP&lt;/th>
&lt;th>Azure&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td>Orquestación pipelines ML&lt;/td>
&lt;td>Airflow, Dagster, Argo, Kubeflow&lt;/td>
&lt;td>SageMaker Pipelines, Step Functions&lt;/td>
&lt;td>Vertex AI Pipelines, Cloud Composer&lt;/td>
&lt;td>Azure ML Pipelines&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>Feature store&lt;/td>
&lt;td>Feast&lt;/td>
&lt;td>SageMaker Feature Store&lt;/td>
&lt;td>Vertex AI Feature Store&lt;/td>
&lt;td>Azure ML Feature Store&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>Annotation / HiL&lt;/td>
&lt;td>Argilla, Label Studio&lt;/td>
&lt;td>SageMaker Ground Truth, A2I&lt;/td>
&lt;td>Vertex Data Labeling&lt;/td>
&lt;td>Azure ML Data Labeling&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>Captura de feedback&lt;/td>
&lt;td>Postgres + Langfuse scores&lt;/td>
&lt;td>Bedrock + custom + Ground Truth&lt;/td>
&lt;td>Vertex + custom&lt;/td>
&lt;td>App Insights + custom&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>Prompt versioning&lt;/td>
&lt;td>Langfuse Prompts, MLflow Prompts&lt;/td>
&lt;td>Bedrock Prompt Management&lt;/td>
&lt;td>Vertex Prompt Management&lt;/td>
&lt;td>Azure AI Foundry Prompt flow&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>Data versioning&lt;/td>
&lt;td>DVC + lakeFS + OpenLineage&lt;/td>
&lt;td>S3 Versioning + Lake Formation&lt;/td>
&lt;td>GCS + Dataplex&lt;/td>
&lt;td>ADLS + Purview&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>Lineage cross-system&lt;/td>
&lt;td>OpenLineage + DataHub&lt;/td>
&lt;td>SageMaker Lineage Tracking&lt;/td>
&lt;td>Dataplex lineage&lt;/td>
&lt;td>Purview&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;h2 id="el-chatbot-del-post-anterior-portado-a-aws">El chatbot del post anterior portado a AWS&lt;/h2>
&lt;p>Para que el catálogo deje de ser abstracto, tomamos el escenario completo del &lt;a href="https://blog.lo0.es/posts/anatomia-request-llm-mayo-2026/">post anterior&lt;/a> — el chatbot multi-tenant de soporte para aseguradoras sobre stack OSS on-premise — y lo describimos componente a componente con stack AWS. No es una migración ejecutable; es el &lt;strong>mapa de qué desaparece, qué aparece y dónde aparece el lock-in&lt;/strong>.&lt;/p>
&lt;p>&lt;strong>El plano de red.&lt;/strong> Edge LB y WAF: &lt;strong>AWS WAF + CloudFront&lt;/strong>. Ingress al cluster: &lt;strong>AWS Load Balancer Controller&lt;/strong> sobre &lt;strong>EKS&lt;/strong>. Lo que era Cilium BGP + RKE2 se sustituye por EKS con &lt;strong>VPC CNI&lt;/strong> (o Cilium en EKS, posible). El equivalente conceptual de Tetragon es &lt;strong>Amazon GuardDuty for EKS&lt;/strong> + &lt;strong>Falco&lt;/strong> opcional. Lock-in moderado: el control de red se acopla a VPC.&lt;/p>
&lt;p>&lt;strong>El gateway de chat y la auth.&lt;/strong> Lo que era una API gateway propia con JWT verificación se materializa como &lt;strong>Amazon API Gateway&lt;/strong> + &lt;strong>Amazon Cognito&lt;/strong> (o IAM Identity Center si es B2B). El AI-aware routing del gateway se cubre con &lt;strong>Bedrock&lt;/strong> + tags por cliente o con &lt;strong>AWS API Gateway custom authorizers&lt;/strong> invocando una Lambda para tenant resolution. Lock-in alto en la capa de identidad si se elige Cognito.&lt;/p>
&lt;p>&lt;strong>El motor de inferencia.&lt;/strong> Tres opciones distintas, con trade-off claro.&lt;/p>
&lt;ul>
&lt;li>&lt;strong>Bedrock con modelo gestionado&lt;/strong> (Claude / Llama / Mistral): se elimina toda la operativa de vLLM, K8s Operators, KV cache y disaggregated serving. Se pasa a &lt;strong>Provisioned Throughput&lt;/strong> para garantía de latencia. Se gana time-to-market; se pierde control sobre prefill/decode, sobre adapter LoRA custom (Bedrock acepta fine-tunes Bedrock-managed pero no LoRAs arbitrarios), y se entra en lock-in de modelo (cambiar de Claude a Llama es cambiar de API).&lt;/li>
&lt;li>&lt;strong>SageMaker Endpoints con tu contenedor vLLM&lt;/strong>: se mantiene vLLM y sus optimizaciones, pero K8s desaparece y SageMaker lo reemplaza como plano de orquestación. Inference Components permite densificar múltiples adapters. El KV cache, prefix caching y LoRA hot-swap funcionan igual. Lock-in moderado en el SDK SageMaker y en el formato de Inference Components.&lt;/li>
&lt;li>&lt;strong>EKS con vLLM&lt;/strong> (la opción minimalista): básicamente el stack OSS pero con EKS en lugar de RKE2 y EBS/EFS en lugar de Ceph. Lock-in bajo, beneficio limitado del cloud.&lt;/li>
&lt;/ul>
&lt;p>&lt;strong>Data layer.&lt;/strong> El corpus pasa a &lt;strong>S3&lt;/strong> con versioning, los embeddings a &lt;strong>Amazon OpenSearch Service&lt;/strong> o a &lt;strong>Aurora pgvector&lt;/strong>. La opción gestionada radical es &lt;strong>Bedrock Knowledge Bases&lt;/strong>: subes documentos a S3, te indexa, te expone un retrieval API. Eliminamos Qdrant, eliminamos pipelines de embedding manuales, eliminamos parte de Kafka + Flink. Pero el control sobre reranking custom, ACL fino por chunk y la posibilidad de re-embeber con un encoder propio nuevo desaparece — Bedrock KB usa los embedders de Titan o Cohere disponibles en Bedrock, y cambiarlos es cambiar todo el índice. Compliance ENS: hay que validar que los buckets y el índice viven en regiones EU y que el modelo de embedding también.&lt;/p>
&lt;p>&lt;strong>Stream + CDC.&lt;/strong> Kafka + Debezium se reemplaza por &lt;strong>MSK&lt;/strong> + &lt;strong>MSK Connect&lt;/strong> o por &lt;strong>Kinesis + DMS&lt;/strong>. Schema Registry: &lt;strong>Glue Schema Registry&lt;/strong>. Los eventos siguen siendo equivalentes funcionalmente. Lock-in moderado si vas a Kinesis (Kinesis no es Kafka), bajo si vas a MSK (compatibilidad Kafka).&lt;/p>
&lt;p>&lt;strong>Data versioning.&lt;/strong> Aquí el gap es claro. S3 Versioning + Lake Formation + Glue Catalog &lt;strong>no es DVC&lt;/strong>. Para conservar la disciplina del post anterior — &lt;code>(dataset_id, dataset_version, sha256_hash)&lt;/code> propagado como input artifact al trainer — se puede mantener DVC sobre S3 (DVC funciona perfectamente con S3 como remote) o aceptar la limitación y registrar manualmente el lineage en SageMaker Lineage Tracking. La primera opción mantiene la operativa; la segunda acepta degradación.&lt;/p>
&lt;p>&lt;strong>Etapa Tune.&lt;/strong> El adapter LoRA &lt;code>customer_support_v7&lt;/code> se entrena con &lt;strong>SageMaker Training Jobs&lt;/strong> sobre instancias &lt;strong>ml.p5.48xlarge&lt;/strong> (8× H100), usando un contenedor HuggingFace + PEFT estándar. MLflow gestionado por SageMaker o MLflow propio en EC2 cubren el tracking. Alternativa: si se acepta el caja negra, &lt;strong>Bedrock Custom Models&lt;/strong> con un dataset en S3 produce un modelo Bedrock fine-tuneado sin instanciar GPU manualmente, a cambio de no poder inspeccionar el run.&lt;/p>
&lt;p>&lt;strong>Etapa Eval.&lt;/strong> Promptfoo + RAGAS en CI corre igual sobre &lt;strong>CodeBuild&lt;/strong>. &lt;strong>Bedrock Model Evaluation&lt;/strong> sustituye buena parte de la suite de evals automáticos. &lt;strong>Bedrock Guardrails&lt;/strong> sustituye NeMo Guardrails + Presidio + LlamaGuard, con la pérdida de transparencia comentada antes.&lt;/p>
&lt;p>&lt;strong>Etapa Deploy.&lt;/strong> Si se eligió Bedrock como motor, esta etapa se desvanece — Bedrock sirve. Si se eligió SageMaker Endpoints + vLLM, KServe se sustituye por SageMaker Operators (o se conserva KServe sobre EKS). El AI Gateway que en OSS era Envoy AI Gateway o LiteLLM pasa a ser &lt;strong>API Gateway&lt;/strong> + &lt;strong>Bedrock&lt;/strong> o &lt;strong>API Gateway&lt;/strong> + &lt;strong>Lambda&lt;/strong> + &lt;strong>SageMaker&lt;/strong>.&lt;/p>
&lt;p>&lt;strong>Etapa Observe.&lt;/strong> OTel Collector sigue siendo el estándar. Trazas a &lt;strong>AWS X-Ray&lt;/strong> + &lt;strong>CloudWatch Application Signals&lt;/strong>. Métricas a &lt;strong>Amazon Managed Prometheus&lt;/strong>. Logs a &lt;strong>CloudWatch Logs&lt;/strong> + opcional &lt;strong>OpenSearch&lt;/strong> para búsqueda. &lt;strong>Langfuse&lt;/strong> se hospeda en &lt;strong>ECS Fargate&lt;/strong> o &lt;strong>EKS&lt;/strong> porque el cloud no tiene equivalente nativo del prompt + traces + scores integrado. Drift: &lt;strong>SageMaker Model Monitor&lt;/strong> sustituye Evidently / NannyML. eBPF (Pixie / Hubble / Tetragon) &lt;strong>no tiene equivalente directo&lt;/strong> en AWS gestionado — Falco o instalación de Tetragon en EKS sigue siendo la ruta.&lt;/p>
&lt;p>&lt;strong>Etapa Retrain.&lt;/strong> &lt;strong>SageMaker Pipelines&lt;/strong> orquesta el ciclo trimestral. &lt;strong>SageMaker Ground Truth&lt;/strong> + &lt;strong>A2I&lt;/strong> sustituyen Argilla. El &lt;code>feedback_signals&lt;/code> en Postgres se mantiene tal cual (RDS Postgres) o se traslada a DynamoDB para escalas grandes.&lt;/p>
&lt;p>&lt;strong>Cuánto pesa el lock-in.&lt;/strong> El componente con lock-in más alto es Bedrock + Bedrock Knowledge Bases + Bedrock Guardrails: salir de ahí requiere reescribir el plano de inferencia y reindexar todo el RAG. Le sigue SageMaker SDK (Pipelines, Endpoints, Training) — salir cuesta pero es reescribir scripts, no datos. Datos en S3 son portables (S3 → MinIO con &lt;code>rclone&lt;/code> funciona). El observabilidad OTel es portable casi sin coste si se mantiene el collector como abstracción. El gateway de auth es el otro punto de lock-in alto si va Cognito.&lt;/p>
&lt;p>&lt;strong>Qué se gana.&lt;/strong> Reducción dramática de operativa de infraestructura GPU, parches K8s, gestión de drivers CUDA, dimensionamiento de prefill/decode, gestión de Ceph / MinIO. Curva de arranque muy corta: una request servida en menos de un sprint vs varias semanas de bring-up del stack OSS. SLAs explícitos del proveedor.&lt;/p>
&lt;p>&lt;strong>Qué se pierde.&lt;/strong> Soberanía contractual de datos (los datos siguen en regiones EU si así se configura, pero el operador es un tercero estadounidense bajo Cloud Act). Visibilidad de la pila completa (Bedrock es caja negra desde el modelo hacia abajo). Independencia de roadmap (la decisión de discontinuar un modelo, subir precios o cambiar guardrails no la controla el cliente). Optimización fina del coste por token (las palancas son las que el proveedor expone). Para clientes ENS bajo declaración ALTA o NIS2 categoría esencial, varios de estos puntos son &lt;strong>incumplimiento&lt;/strong>, no preferencia.&lt;/p>
&lt;h2 id="tabla-maestra-el-catálogo-paralelo-entero">Tabla maestra: el catálogo paralelo entero&lt;/h2>
&lt;table>
&lt;thead>
&lt;tr>
&lt;th>Etapa / componente&lt;/th>
&lt;th>OSS on-premise (referencia del blog)&lt;/th>
&lt;th>AWS&lt;/th>
&lt;th>GCP&lt;/th>
&lt;th>Azure&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td>&lt;strong>Data&lt;/strong>&lt;/td>
&lt;td>DVC + lakeFS + MinIO + Qdrant + Kafka + Debezium&lt;/td>
&lt;td>S3 + Lake Formation + OpenSearch / Aurora pgvector + MSK + DMS&lt;/td>
&lt;td>GCS + Dataplex + Vertex Vector Search + Pub/Sub + Datastream&lt;/td>
&lt;td>ADLS Gen2 + Purview + Azure AI Search + Event Hubs + ADF&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;strong>Data versioning (transv.)&lt;/strong>&lt;/td>
&lt;td>DVC + lakeFS + OpenLineage&lt;/td>
&lt;td>S3 Versioning + Lake Formation + Glue Catalog&lt;/td>
&lt;td>GCS Versioning + Dataplex lineage&lt;/td>
&lt;td>ADLS versioning + Purview&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;strong>Tune&lt;/strong>&lt;/td>
&lt;td>HF Transformers + PEFT + bitsandbytes + MLflow + Ray/Kubeflow&lt;/td>
&lt;td>SageMaker Training + HyperPod + Bedrock Custom + SM Experiments&lt;/td>
&lt;td>Vertex AI Training + Vertex Tuning + Vertex Experiments&lt;/td>
&lt;td>Azure ML Training + Azure OpenAI fine-tuning + Azure ML + MLflow&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;strong>Eval&lt;/strong>&lt;/td>
&lt;td>DeepEval + RAGAS + Promptfoo + Langfuse Evals + NeMo Guardrails&lt;/td>
&lt;td>Bedrock Model Evaluation + Bedrock Guardrails + SageMaker Clarify&lt;/td>
&lt;td>Vertex AI Evaluation Service + Model Armor + Gemini safety&lt;/td>
&lt;td>Azure AI Evaluation SDK + Content Safety (Prompt Shields, Groundedness)&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;strong>Deploy&lt;/strong>&lt;/td>
&lt;td>vLLM + KServe + LLM Operators + Envoy AI Gateway&lt;/td>
&lt;td>Bedrock + SageMaker Endpoints (+ Inferentia / Trainium)&lt;/td>
&lt;td>Vertex AI Prediction + Gemini API (+ TPU)&lt;/td>
&lt;td>Azure OpenAI + Azure ML Endpoints (+ Maia)&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;strong>Observe&lt;/strong>&lt;/td>
&lt;td>OTel + Tempo + Prometheus + Loki + Langfuse + Phoenix + Hubble&lt;/td>
&lt;td>CloudWatch + X-Ray + ADOT + AMP/AMG + SM Model Monitor&lt;/td>
&lt;td>Cloud Monitoring + Cloud Trace + Vertex Model Monitoring&lt;/td>
&lt;td>Azure Monitor + App Insights + Azure ML Model Monitor&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;strong>Retrain&lt;/strong>&lt;/td>
&lt;td>Airflow / Argo / Kubeflow Pipelines + Argilla + Feast&lt;/td>
&lt;td>SageMaker Pipelines + Ground Truth + A2I + SM Feature Store&lt;/td>
&lt;td>Vertex AI Pipelines + Data Labeling + Vertex Feature Store&lt;/td>
&lt;td>Azure ML Pipelines + Data Labeling + Azure ML Feature Store&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;strong>Prompt versioning (transv.)&lt;/strong>&lt;/td>
&lt;td>Langfuse Prompts + MLflow Prompt Registry&lt;/td>
&lt;td>Bedrock Prompt Management + SM Prompt Hub&lt;/td>
&lt;td>Vertex AI Prompt Management&lt;/td>
&lt;td>Azure AI Foundry Prompt flow&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;h2 id="cuándo-elegir-cada-lado--la-decisión-real">Cuándo elegir cada lado — la decisión real&lt;/h2>
&lt;p>La pregunta correcta no es &lt;em>&amp;quot;¿OSS o cloud?&amp;quot;&lt;/em>. Es por etapa.&lt;/p>
&lt;p>El &lt;strong>lado OSS gana por defecto&lt;/strong> cuando hay:&lt;/p>
&lt;ul>
&lt;li>Datos sometidos a ENS categoría ALTA, NIS2 sectores esenciales o equivalentes (datos sanitarios identificables, banca regulada, infra crítica). Aquí la trazabilidad del proveedor y el contrato de procesamiento no son negociables; usar un servicio cuyo operador esté sometido a Cloud Act, FISA 702 o equivalente compromete la base legal.&lt;/li>
&lt;li>Requisitos de inspección auditable del modelo, los guardrails y el pipeline completo. Si un regulador pregunta &lt;em>&amp;quot;¿cómo detecta exactamente PII?&amp;quot;&lt;/em> y la respuesta acabable en código abierto es obligatoria.&lt;/li>
&lt;li>Volúmenes grandes con cargas estables. Por encima de cierto umbral de tokens/mes, el coste de Bedrock / AOAI / Vertex se aleja del coste amortizado de un cluster GPU propio. El umbral depende de carga, pero típicamente está entre 5-50 mil millones de tokens/mes para modelos del rango Llama 70B.&lt;/li>
&lt;li>Independencia de roadmap es prioritaria. El día que el proveedor discontinúa un modelo o sube el precio un 40%, la organización tiene que poder ignorarlo.&lt;/li>
&lt;/ul>
&lt;p>El &lt;strong>lado hyperscaler gana por defecto&lt;/strong> cuando hay:&lt;/p>
&lt;ul>
&lt;li>Time-to-market crítico, MVP en semanas. La operativa del stack OSS pesa demasiado para un proyecto que aún no ha probado producto-mercado.&lt;/li>
&lt;li>Equipo pequeño sin SREs / MLEs especializados en inferencia GPU. La operativa de KServe + vLLM + KV cache + multi-tenant no es trivial; si el equipo no puede sostenerla, hospedar es el camino.&lt;/li>
&lt;li>Cargas variables / spikes impredecibles. Bedrock on-demand y SageMaker serverless cobran lo que usas; un cluster propio paga la GPU esté ocupada o no.&lt;/li>
&lt;li>Necesidad de modelos propietarios específicos (Claude, GPT-4.1, Gemini Pro) que no tienen equivalente OSS aceptable para el caso.&lt;/li>
&lt;/ul>
&lt;p>Las &lt;strong>etapas mixtas&lt;/strong> son frecuentes y razonables. En la práctica, un patrón común en 2026 es: data, observe y retrain en OSS self-hosted (lineage y soberanía), tune en OSS sobre cluster propio, eval en OSS + guardrails gestionados según safety profile, deploy gestionado para modelos propietarios y self-hosted para modelos abiertos. La pregunta a hacerse para cada etapa es: &lt;em>&amp;ldquo;si el proveedor sube precios un 50% o discontinúa un componente mañana, ¿cuánto cuesta moverlo?&amp;rdquo;&lt;/em>. El catálogo paralelo de este post da la respuesta para cada caja.&lt;/p>
&lt;h2 id="lo-que-no-hemos-cubierto-todavía">Lo que no hemos cubierto (todavía)&lt;/h2>
&lt;p>Quedan piezas merecedoras de su propio post:&lt;/p>
&lt;ul>
&lt;li>&lt;strong>OpenAI / Anthropic API directamente&lt;/strong> (no a través de Bedrock o AOAI): otro nivel de gestionado, otro contrato.&lt;/li>
&lt;li>&lt;strong>Híbridos serios&lt;/strong>: Outposts AWS, Distributed Cloud GCP, Azure Stack HCI / Azure Local — el hyperscaler en tu sala.&lt;/li>
&lt;li>&lt;strong>Cost accounting por tenant&lt;/strong> comparado OSS vs cloud: cómo se hace la factura y dónde se rompe la atribución.&lt;/li>
&lt;li>&lt;strong>Migración real&lt;/strong> OSS → cloud o cloud → OSS: pasos, scripts, gotchas.&lt;/li>
&lt;li>&lt;strong>Soberanía europea concreta&lt;/strong>: GAIA-X, EuroHPC, oferta de cloud europeo (OVHcloud, Scaleway, IONOS, Aruba), comparativa con los tres grandes para casos ENS / NIS2.&lt;/li>
&lt;li>&lt;strong>AWS Inferentia / Trainium, GCP TPU v6 Trillium, Azure Maia&lt;/strong>: chips propios y cómo cambian el cálculo de coste / token.&lt;/li>
&lt;/ul>
&lt;h2 id="ver-también">Ver también&lt;/h2>
&lt;ul>
&lt;li>&lt;a href="https://blog.lo0.es/posts/anatomia-request-llm-mayo-2026/">Anatomía de una petición LLM en producción&lt;/a> — el recorrido forense de una request por las seis etapas, hilo del que este post hace el corte vertical.&lt;/li>
&lt;li>&lt;a href="https://blog.lo0.es/posts/catalogo-herramientas-oss-llmops/">El catálogo OSS para LLMOps en seis etapas: ficha por ficha&lt;/a> — el zoom in al lado open source de la tabla maestra de este post: ficha de ~150 palabras por herramienta OSS core (vLLM, Langfuse, DVC, Qdrant, Airflow, NeMo Guardrails, Presidio…), licencia y gobierno, matriz de decisión por etapa y diagrama del stack OSS conectado.&lt;/li>
&lt;li>&lt;a href="https://blog.lo0.es/posts/pipeline-llmops-seis-etapas/">El pipeline LLMOps de seis etapas&lt;/a> — el mapa maestro al que este catálogo es complemento.&lt;/li>
&lt;li>&lt;a href="https://blog.lo0.es/posts/mlops-llms-panorama-2026/">MLOps específico para LLMs en 2026&lt;/a> — contexto general sobre por qué LLMOps no es MLOps clásico.&lt;/li>
&lt;li>&lt;a href="https://blog.lo0.es/posts/data-versioning-dvc-lakefs/">Data versioning con DVC y lakeFS&lt;/a> — el deep-dive del transversal Data.&lt;/li>
&lt;li>&lt;a href="https://blog.lo0.es/posts/prompt-versioning-langfuse-mlflow/">Prompt versioning con Langfuse y MLflow&lt;/a> — el deep-dive del transversal Prompt.&lt;/li>
&lt;li>&lt;a href="https://blog.lo0.es/posts/fine-tuning-continuo-produccion/">Fine-tuning continuo en producción&lt;/a> — Tune detallado.&lt;/li>
&lt;li>&lt;a href="https://blog.lo0.es/posts/evals-llm-la-capa-despues-de-tracing/">Evals: la capa después del tracing&lt;/a> — Eval detallado.&lt;/li>
&lt;li>&lt;a href="https://blog.lo0.es/posts/guardrails-safety-llm/">Guardrails y safety en LLMs&lt;/a> — la capa de safety en detalle.&lt;/li>
&lt;li>&lt;a href="https://blog.lo0.es/posts/kv-cache-fundamentos/">KV cache&lt;/a> · &lt;a href="https://blog.lo0.es/posts/pagedattention-deep-dive/">PagedAttention&lt;/a> · &lt;a href="https://blog.lo0.es/posts/disaggregated-serving-prefill-decode/">Disaggregated serving&lt;/a> — Deploy desde dentro.&lt;/li>
&lt;li>&lt;a href="https://blog.lo0.es/posts/vllm-kubernetes/">vLLM en Kubernetes&lt;/a> · &lt;a href="https://blog.lo0.es/posts/operators-llm-kubernetes/">Operators LLM en K8s&lt;/a> · &lt;a href="https://blog.lo0.es/posts/cluster-h100-plataforma-multi-tenant/">Cluster GPU multi-tenant&lt;/a> — Deploy operativo.&lt;/li>
&lt;li>&lt;a href="https://blog.lo0.es/posts/agentsight-tracing-llm/">AgentSight tracing LLM&lt;/a> · &lt;a href="https://blog.lo0.es/posts/mcp-observability-otel/">MCP observability con OTel&lt;/a> · &lt;a href="https://blog.lo0.es/posts/ebpf-on-device-inference-drift/">eBPF + drift&lt;/a> — Observe en sus capas.&lt;/li>
&lt;li>&lt;a href="https://blog.lo0.es/posts/retrain-cerrar-el-bucle-feedback-dataset-adapter/">Retrain: cerrar el bucle feedback → dataset → adapter&lt;/a> — Retrain detallado.&lt;/li>
&lt;/ul>
&lt;h2 id="referencias">Referencias&lt;/h2>
&lt;ul>
&lt;li>&lt;a href="https://docs.vllm.ai/">vLLM documentation&lt;/a> y &lt;a href="https://github.com/vllm-project/production-stack">vLLM Production Stack&lt;/a> — motor de inferencia OSS de referencia.&lt;/li>
&lt;li>&lt;a href="https://docs.aws.amazon.com/bedrock/">Amazon Bedrock documentation&lt;/a> — catálogo de modelos gestionados AWS, Knowledge Bases, Guardrails y Prompt Management.&lt;/li>
&lt;li>&lt;a href="https://docs.aws.amazon.com/sagemaker/">Amazon SageMaker AI&lt;/a> — training, endpoints, pipelines, model monitoring.&lt;/li>
&lt;li>&lt;a href="https://cloud.google.com/vertex-ai/docs">Google Vertex AI documentation&lt;/a> — training, prediction, evaluation, model monitoring.&lt;/li>
&lt;li>&lt;a href="https://learn.microsoft.com/azure/ai-foundry/">Azure AI Foundry documentation&lt;/a> — plano unificado de Microsoft para AI applications.&lt;/li>
&lt;li>&lt;a href="https://learn.microsoft.com/azure/ai-services/openai/">Azure OpenAI Service documentation&lt;/a> — modelos OpenAI hospedados en Azure.&lt;/li>
&lt;li>&lt;a href="https://opentelemetry.io/docs/specs/semconv/gen-ai/">OpenTelemetry GenAI semantic conventions&lt;/a> — el estándar que cose la observabilidad a través de las fronteras OSS / cloud.&lt;/li>
&lt;li>&lt;a href="https://langfuse.com/docs">Langfuse documentation&lt;/a> y &lt;a href="https://docs.arize.com/phoenix">Arize Phoenix&lt;/a> — LLM observability OSS de referencia.&lt;/li>
&lt;li>&lt;a href="https://dvc.org/">DVC&lt;/a> y &lt;a href="https://lakefs.io/">lakeFS&lt;/a> — data versioning OSS.&lt;/li>
&lt;li>&lt;a href="https://docs.nvidia.com/nemo/guardrails/">NeMo Guardrails&lt;/a> — safety + dialog policy OSS.&lt;/li>
&lt;li>ENS (Esquema Nacional de Seguridad) y NIS2 (Network and Information Security Directive 2) — los marcos de cumplimiento que tienen la última palabra en la elección OSS vs cloud para clientes regulados de la UE.&lt;/li>
&lt;/ul></description></item></channel></rss>