Aquesta última lliçó no construeix res de nou — i això és exactament el que la fa important. Després de sis mòduls afegint peces, toca fer un pas enrere i veure el sistema sencer: el mapa complet de la plataforma de CineClick, un incident real recorregut de punta a punta que exercita cada component, l'inventari del repo com a plantilla reutilitzable, i el tancament de l'arc que vam obrir al mòdul 1 — els deu problemes d'aquell diagnòstic, revisitats un per un. Acaba amb el teu projecte: replicar la plataforma completa en un altre domini, perquè la prova que saps MLOps no és haver seguit CineClick, sinó poder construir-lo sense ella.
Contingut
- El mapa complet de la plataforma
- Un incident de punta a punta: la promo de primavera
- Inventari del repo:
cineclick-churncom a plantilla - Els deu problemes del mòdul 1, revisitats
- El teu projecte: la plataforma de "LuzYa"
- Guia d'adaptació: quan el teu cas no és CineClick
- Exercicis de síntesi
El mapa complet de la plataforma
Aquest és el sistema que has construït, amb les persones dibuixades exactament on el sistema s'atura a esperar-les:
flowchart TB
subgraph DEV["Desenvolupament (M2-M3)"]
COD["Codi a src/<br/>features.py font única"] --> DVCP["dvc repro<br/>pipeline reproduïble"]
DVCP --> MLF["MLflow tracking<br/>experiment churn-cineclick"]
end
subgraph CI["CI (M5)"]
TESTS["ci.yml: tests de codi,<br/>dades (pandera) i model<br/>llindar: recall>=0.60, precision>=0.50"]
end
subgraph REG["Registry (M3)"]
CHAL["@challenger"] -.-> CHAMP["@champion (v2)"]
end
subgraph CD["CD (M5)"]
IMG["cd-servei.yml: imatge<br/>ghcr.io/cineclick/churn-api"]
PROM["PR de promoció +<br/>promocionar_champion.py"]
end
subgraph SRV["Serving (M4)"]
API["FastAPI a Kubernetes<br/>3-10 rèpliques, p95 92 ms"]
BATCH["scoring-setmanal-churn<br/>dilluns 06:00 (Prefect)"]
end
subgraph OPS["Operació (M6)"]
MON["Monitoratge 06-01<br/>2 plans + taula de prediccions"]
DRIFT["Evidently 06-02<br/>dilluns 07:00, PSI"]
RETRAIN["reentrenament-churn 06-03<br/>mensual + extraordinari"]
GOV["Governança 06-04<br/>model card, ADRs, subgrups"]
end
COD --> TESTS
TESTS --> IMG
MLF --> CHAL
H1((("Humà:<br/>revisió PR"))) --> TESTS
H2((("Humà:<br/>aprovació<br/>environment"))) --> IMG
IMG --> API
CHAL -->|"ombra 2 setm +<br/>canary 5-25-100%"| PROM
H3((("Humà:<br/>revisió de<br/>promoció"))) --> PROM
PROM --> CHAMP
CHAMP --> API
CHAMP --> BATCH
API --> MON
BATCH --> MON
MON --> DRIFT
DRIFT -->|"alerta"| H4((("Humà:<br/>playbook")))
H4 --> RETRAIN
RETRAIN -->|"mai @champion"| CHAL
GOV -.->|"traçabilitat i<br/>documentació"| REG
GOV -.-> MONTres lectures del mapa abans de continuar:
- És un bucle, no una canonada. La fletxa de
MONaDRIFTaRETRAINi de tornada al registry és el que separa el nivell 2 de maduresa del nivell 1: el sistema es retroalimenta. - Quatre humans, quatre judicis. Revisar codi, aprovar el desplegament del servei, aprovar la promoció del model, interpretar la deriva. Tot el mecànic entre ells és automàtic; cap dels quatre no és eliminable sense perdre una salvaguarda.
- Dues cadències conviuen: la del servei (desplegaments quan hi ha canvis de codi) i la del model (promocions quan hi ha challenger validat). Desacoblar-les va ser la decisió central del mòdul 5.
Un incident de punta a punta: la promo de primavera
Res no demostra un sistema com un incident. Aquest escenari exercita, en ordre, gairebé totes les peces del mapa. Cada pas fa servir comandes i pantalles que ja coneixes — no hi ha res de nou per aprendre, només veure-ho tot funcionar junt.
Dia 0 — el món canvia. Màrqueting llança la promo de primavera: tres mesos a meitat de preu. Ningú no avisa l'equip de ML (mai no avisen). Comencen a entrar milers d'altes: clients joves, pla basic, antiguitat zero. El servei ni s'immuta — l'HPA escala de 3 a 5 rèpliques, p95 estable a ~90 ms. Pla de servei: verd. El dashboard de 06-01 comença a moure els proxies: la mescla per pla llisca cap a basic i l'histograma de probabilitats s'engreixa per dalt.
Setmana 2 — el sistema mira, i veu. Dilluns 07:00, el flow deteccio-deriva-churn compara l'última setmana de la taula de prediccions contra la referència versionada del champion. Resultat: PSI 0.31 a antiguitat_mesos (> 0.25), deriva també a pla i hores_setmana, drift_share per sobre del llindar. Alerta a #alertes-ml amb les features derivades i l'enllaç a l'informe HTML d'Evidently. Ningú no es va haver de recordar de mirar: aquest era el punt de tot el mòdul 6.
Setmana 2, mateix dia — playbook, no reflex. La Laura obre l'informe i aplica el playbook de 06-02. Error de dades aigües amunt? No: l'esquema_clients de pandera passa, els valors són plausibles, i les distribucions desplaçades expliquen una història coherent (clients nous de debò). Cohort legítima? Sí — dos missatges a màrqueting ho confirmen: és la promo. Impacte? La taxa de positius ha pujat al 23%, encara dins de la banda 10–25%, però el model està extrapolant sobre una població que amb prou feines va veure a l'entrenament. Decisió humana: tret extraordinari del reentrenament, documentada al fil de l'alerta.
Setmana 2-3 — el reentrenament proposa. La Laura llança reentrenament-churn des de la UI de Prefect amb motiu="extraordinari-PSI-antiguitat". El flow construeix el dataset nou amb tall point-in-time (la cohort de la promo entra amb les etiquetes que ja té; el grup de control manté les etiquetes netes), fa dvc repro, i avalua: test congelat recall 0.69 / precision 0.55 (llindar superat), test fresc recall 0.66. Registra v3 com a @challenger amb els seus tags de llinatge (dades_dvc_md5, finestra temporal, flow run) i notifica a #alertes-ml. En cap moment no toca @champion.
Setmanes 3-5 — l'ombra escolta. El PR de promoció s'obre, però abans: dues setmanes d'ombra obligatòries (ADR-007). S'activa MODE_OMBRA al ConfigMap churn-api-config; cada petició es puntua amb v2 (que respon) i v3 (que només es registra: probabilitat_ombra, versio_model_ombra). En tancar la finestra, l'anàlisi de la taula de prediccions mostra un desacord del 9%, concentrat gairebé del tot a la cohort nova — v3 assigna probabilitats més baixes als nouvinguts de la promo. És exactament el que havia de passar: v3 va aprendre que "antiguitat zero + pla basic + promo" no implica el risc que v2 els extrapolava. L'avaluació per subgrups (06-04) confirma que cap segment no empitjora; la model card de v3 es redacta amb la cohort com a novetat i les seves etiquetes encara joves com a limitació.
Setmanes 5-6 — canary i promoció. Revisió humana del PR de promoció: checklist de docs/promocio-model.md, evidència d'ombra adjunta, subgrups, model card. Aprovat. Canary de model: 5% → 25% → 100%, 24-48 h per esglaó, amb les mètriques de guàrdia vigilant (5xx, p95, taxa de positius en banda). Sense ensurts. promocionar_champion.py mou l'alias: v3 = @champion. L'endpoint /versio ho confirma; la referència del detector de deriva s'actualitza sola al dataset de v3 (el mecanisme de l'exercici 3 de 06-02).
Setmana 6 — tancament. ADR nou a docs/decisions/: context (promo no comunicada), decisió (reentrenament extraordinari i política acordada amb màrqueting: avisar de campanyes amb dues setmanes d'antelació), conseqüències. El dashboard torna al verd amb una anotació a la línia temporal: "v3 promocionat". Del dia 0 al tancament: el sistema va detectar sol, l'humà va decidir quatre vegades, i cap client no va notar res.
| Fase | Component exercitat | Lliçó |
|---|---|---|
| Detecció | Dashboard de proxies + Evidently + alerta | 06-01, 06-02 |
| Diagnòstic | Playbook + pandera + taula de prediccions | 06-02, 05-01 |
| Resposta | Flow de reentrenament point-in-time + registry | 06-03, 02-04, 03-02 |
| Validació | Ombra + subgrups + model card | 05-04, 06-04 |
| Lliurament | PR de promoció + canary + alias | 05-02, 05-04 |
| Tancament | ADR + anotació + referència actualitzada | 06-04, 06-02 |
Inventari del repo: cineclick-churn com a plantilla
El repo que has vist créixer és, a hores d'ara, una plantilla reutilitzable. L'inventari complet, amb la lliçó on va néixer cada peça:
| Fitxer / directori | Per a què serveix | Lliçó |
|---|---|---|
src/cineclick_churn/data.py |
Càrrega i construcció del dataset (point-in-time des de 06-03) | 02-01, 06-03 |
src/cineclick_churn/features.py |
Font única de features (ratio_tickets, …) |
02-01, 03-03 |
src/cineclick_churn/train.py, evaluate.py |
Entrenament i avaluació, invocats pel pipeline | 02-01, 02-04 |
src/cineclick_churn/validacio.py |
Esquema pandera esquema_clients |
05-01 |
src/cineclick_churn/api/ (main.py, schemas.py, enrutament.py) |
Servei FastAPI: /predir, /predir-lot, /salut, /versio, /metrics |
04-02, 06-01 |
tests/ (test_features.py, test_api.py, test_model.py) |
Tests de codi, API i model (marcador model) |
05-01 |
dvc.yaml + remote magatzem |
Pipeline preparar_dades → construir_features → entrenar → avaluar; dades versionades | 02-03, 02-04 |
data/processed/test.csv |
Test set congelat, versionat | 02-03, 06-03 |
scripts/cercar_hiperparametres.py |
Cerca amb tracking a MLflow | 03-01 |
scripts/score_batch.py |
Scoring per lots (l'invoca el flow setmanal) | 04-01 |
scripts/mesurar_carrega.py |
Proves de càrrega (p95, req/s) | 04-05 |
scripts/promocionar_champion.py |
Moviment de l'alias, sempre després de revisió humana | 05-02 |
scripts/avaluar_subgrups.py |
Mètriques per pla i antiguitat a cada candidat | 06-04 |
flows/scoring_setmanal.py |
Flow scoring-setmanal-churn, dilluns 06:00, pool cineclick-pool |
05-03 |
flows/deteccio_deriva.py |
Flow Evidently setmanal, dilluns 07:00 | 06-02 |
flows/reentrenament.py |
Flow reentrenament-churn: dataset → repro → avaluació doble → @challenger |
06-03 |
flows/avaluacio_real.py |
Job de ground truth: recall/precision reals per setmana | 06-01 |
deploy/k8s/ |
Manifests: Deployment, HPA, ConfigMap, Secret, ServiceMonitor, alertes | 04-04, 06-01 |
.github/workflows/ci.yml |
Tests de codi/dades/model amb llindar bloquejant | 05-01 |
.github/workflows/cd-servei.yml |
Build i desplegament de la imatge amb aprovació | 05-02 |
Dockerfile (multi-stage) |
Imatge ghcr.io/cineclick/churn-api |
04-03 |
docs/promocio-model.md |
Procés i checklist de promoció | 05-02 |
docs/decisions/ |
ADRs | 06-04 |
docs/model-card-churn-v2.md, datasheet-clients-churn.md |
Model card i datasheet | 06-04 |
Per al teu proper projecte, aquesta taula és la llista de la compra: cada fila és una peça que sabràs construir, i l'ordre de les lliçons és un ordre de construcció raonable.
Els deu problemes del mòdul 1, revisitats
A 01-04 vam diagnosticar el punt de partida de CineClick: un model prometedor morint al notebook de la Laura. Aquells deu problemes, tancats un per un:
| # | Problema (mòdul 1) | Solució construïda | On |
|---|---|---|---|
| 1 | El model viu en un notebook que només la Laura sap executar | Paquet cineclick_churn amb src/, tests i entorn amb lock |
M2 |
| 2 | "A la meva màquina funciona": dependències sense fixar | Entorns reproduïbles + lock + imatge Docker multi-stage | 02-02, 04-03 |
| 3 | Ningú no sap amb quines dades exactes es va entrenar el model | DVC: dades versionades a magatzem, hash al llinatge de cada versió |
02-03, 06-03 |
| 4 | Resultats d'experiments en cel·les sobreescrites i fulls de càlcul | MLflow: experiment churn-cineclick, cada run amb params/mètriques/artefactes |
03-01 |
| 5 | "Quin model hi ha en producció?" — ningú no pot contestar | Registry amb alias @champion/@challenger + endpoint /versio |
03-02, 04-02 |
| 6 | Les prediccions es generaven a mà quan màrqueting les demanava | Batch setmanal orquestrat (Prefect, dilluns 06:00) + API online per a temps real | 05-03, 04-02 |
| 7 | Desplegar era copiar fitxers a un servidor i creuar els dits | CI amb llindar de negoci + CD desacoblat amb aprovació + ombra/canary amb rollback | M5 |
| 8 | Les features es recalculaven diferent a cada lloc (skew) | features.py com a font única, compartida per entrenament, API i batch |
03-03 |
| 9 | Ningú no sabia si el model continuava encertant mesos després | Dos plans de monitoratge, taula de prediccions, mètriques reals, deriva amb Evidently, reentrenament amb tret | M6 |
| 10 | Si la Laura se'n va de vacances, el sistema s'atura | Automatització + documentació (model card, ADRs, playbook, checklist): el coneixement viu al repo, no en una persona | M5-M6 |
L'arc complet del curs cap en aquesta taula. Fixa't que cap fila no es va resoldre amb "més model": el recall va passar de 0.43 (v1) a 0.68 (v2) al mòdul 3, i tota la resta va ser convertir aquell model en un sistema.
El teu projecte: la plataforma de "LuzYa"
Ara et toca a tu. El projecte final consisteix a replicar la plataforma completa amb un altre cas: LuzYa, una comercialitzadora elèctrica fictícia que vol predir l'impagament de factures per anticipar avisos i plans de pagament. Mateix esquelet, domini nou — que és exactament la situació en què et trobaràs a la feina. Totes les dades han de ser sintètiques, generades per tu (com ho van ser les de CineClick).
El dataset (factures_luzya.csv, genera ~20.000 files sintètiques amb ~12% d'impagament):
| Columna | Tipus | Descripció |
|---|---|---|
id_contracte |
id intern | Identificador del contracte |
antiguitat_mesos |
int | Mesos des de l'alta |
consum_kwh_mes |
float | Consum mitjà mensual |
import_factura |
float | Import de la factura a predir |
num_impagaments_previs |
int | Impagaments històrics (compte amb el point-in-time!) |
tarifa |
cat | fixa / indexada / nocturna |
metode_pagament |
cat | domiciliacio / targeta / transferencia |
pla_pagament_actiu |
bool | Si ja té un pla de pagament (intervenció!) |
impagament |
0/1 | Etiqueta: la factura no es va pagar en 30 dies |
Fases, mapades als mòduls del curs, amb criteris d'autoavaluació:
- Fase 1 (M2) — Reproduïbilitat. Repo
luzya-impagamentamb paquet, entorn amb lock, DVC i pipelinedvc reprode 4 etapes.- [ ] Un company (o tu en una altra màquina) reprodueix l'entrenament amb 3 comandes.
- [ ]
dvc reprosense canvis no re-executa res.
- Fase 2 (M3) — Experiments i registry. MLflow, com a mínim dues versions registrades (base + millora), alias
@champion,features.pycom a font única. Defineix EL TEU criteri de negoci (p. ex. recall ≥ 0.65 amb precision ≥ 0.45 — justifica'l: què costa més, un avís de més o un impagament no detectat?).- [ ] Pots respondre "amb quines dades i codi es va entrenar el champion?" només amb MLflow + DVC.
- Fase 3 (M4) — Serving. API FastAPI (
/predir,/salut,/versio), Docker multi-stage, desplegament a Kubernetes local (kind/minikube) amb 2+ rèpliques; batch mensual de scoring de la facturació.- [ ] p95 mesurat i pressupost de latència definit i documentat.
- Fase 4 (M5) — Automatització. CI amb tests de codi/dades (pandera)/model i el teu llindar bloquejant; CD desacoblat; flow de scoring programat; pla de release per escrit (ombra? canary? quines mètriques de guàrdia?).
- [ ] Un PR que degrada el recall per sota del llindar es bloqueja sol.
- Fase 5 (M6) — Operació.
/metrics+ proxies, taula de prediccions, deriva amb Evidently programada, flow de reentrenament amb point-in-time (num_impagaments_previsipla_pagament_actiusón les teves trampes de leakage i intervenció: resol-les com CineClick va resoldre les seves — tall temporal i grup de control), model card, dos ADRs i la checklist de governança de 06-04 completada.- [ ] Simula una deriva (genera un mes de dades amb una altra distribució de
tarifa) i verifica que el teu detector la veu. - [ ] Respon el simulacre d'auditoria de l'exercici 1 de 06-04, versió LuzYa.
- [ ] Simula una deriva (genera un mes de dades amb una altra distribució de
Consell d'abast: fes-ho en sèrie, no en paral·lel, i no passis de fase sense complir la seva checklist — l'ordre dels mòduls era també un ordre de dependències. Un projecte amb les fases 1-3 impecables val més que les cinc a mitges.
Guia d'adaptació: quan el teu cas no és CineClick
L'esquelet és el mateix gairebé sempre; aquests són els ajustos típics, en pinzellades:
- Models de deep learning: el bucle no canvia (registry, challenger, ombra, deriva), però l'entrenament s'encareix — hi entra el tracking de checkpoints, datasets que no caben en un CSV (DVC continua valent; canvia el remote i el format), i avaluació més cara. Els fonaments de modelatge els cobreix el curs de deep_learning del portal.
- Amb GPU: afecta dos llocs — l'entrenament (cues i nodes GPU a l'orquestrador; el flow de reentrenament demana recursos diferents) i de vegades la inferència (batching de peticions, i el pressupost de latència/cost de 04-05 es recalcula per complet). A Kubernetes, node pools i
resources.limitsamb GPU: curs de kubernetes. - Equip gran: el que a CineClick era "la Laura i tu" es converteix en plataforma compartida — registry i tracking centralitzats multiprojecte, entorns per equip, i les aprovacions humanes es formalitzen en CODEOWNERS i environments protegits. La disciplina de branques, revisions i pipelines a escala: cursos de ci_cd i docker per reforçar la base de lliurament.
- Regulació forta (banca, salut, assegurances): el mòdul 6-04 passa de "bona pràctica" a requisit dur; la checklist creix amb validació independent de models i comitès — però fixa-t'hi: l'estructura és la mateixa, només canvia l'exigència de cada casella.
Errors Comuns i Consells
- Començar el projecte de LuzYa per la fase 4 o 5. La temptació d'"anar a l'interessant" (CI/CD, deriva) sense una fase 1 sòlida reprodueix l'error original de CineClick: automatitzar sobre sorra. Si
dvc reprono funciona en una màquina neta, res del que muntis a sobre no és de fiar. - Copiar els números de CineClick en lloc de derivar els teus. El llindar recall ≥ 0.60/precision ≥ 0.50, la banda 10-25% de positius o el pressupost de 300 ms surten del negoci de CineClick. A LuzYa el cost d'un fals negatiu (impagament no detectat) i d'un fals positiu (avís injust a un bon client) són uns altres — fes els comptes abans de fixar el llindar, com a la fase 2.
- Tractar les trampes del dataset com a detalls opcionals.
num_impagaments_previssense tall temporal és leakage pur (comptaràs impagaments que encara no havien passat) ipla_pagament_actiués una intervenció que contamina l'etiqueta, igual que el descompte de retenció de CineClick. Si el model de la fase 2 et dona mètriques sospitosament bones, gairebé segur que has caigut a la primera. - Confondre "tenir les peces" amb "tenir la plataforma". L'escenari de la promo ho va ensenyar: el valor no és a Evidently ni a Prefect per separat, sinó en el fet que l'alerta porti a un playbook, el playbook a un reentrenament amb llinatge i aquest a un camí de release segur. En autoavaluar-te, recorre un incident inventat de punta a punta — és la checklist que de debò importa.
- Saltar-se els humans del mapa. Si a la teva rèplica el flow de reentrenament acaba movent
@championdirectament "perquè total, soc jo sol", has tornat al nivell 0 amb més YAML. La disciplina de challenger + revisió s'entrena en projectes petits perquè existeixi en els grans.
Exercicis de síntesi
Sobre l'escenari de la promo de primavera (no requereixen escriure codi):
-
El contrafactual. Recorre l'incident imaginant que CineClick s'hagués quedat com al final del mòdul 4 (sense mòdul 5 ni 6): en quin moment s'hauria detectat el problema, qui l'hauria detectat, i què hauria passat amb la campanya de retenció durant aquelles setmanes? Assenyala les dues peces l'absència de les quals hauria fet més mal.
-
Els quatre humans. Durant l'incident hi ha quatre intervencions humanes (playbook, llançament del reentrenament, revisió del PR de promoció, decisió sobre el canary). Per a cadascuna, explica quin judici aporta aquesta persona que el sistema no pot automatitzar amb el que s'ha construït al curs — i quina de les quatre creus que seria la primera candidata a automatitzar-se en un hipotètic nivell 3 de maduresa, amb quina salvaguarda a canvi.
-
La peça que va fallar silenciosament. A l'escenari, màrqueting no va avisar de la promo i el sistema la va detectar per deriva dues setmanes després. L'ADR de tancament afegeix l'avís previ de campanyes com a política. Què t'ensenya això sobre els límits de la solució tècnica — és a dir, quina classe de problemes d'un sistema de ML en producció no es resolen amb més monitoratge?
Solucions
-
Sense mòdul 6 no hi ha detecció: ni proxies, ni Evidently, ni alerta. El problema s'hauria descobert quan algú de màrqueting notés — setmanes o mesos després — que la campanya de retenció "funcionava estrany": massa clients nous marcats en risc (v2 extrapolant antiguitat zero com a perill), pressupost de descomptes disparat sobre una cohort que potser no el necessitava, i clients veterans en risc competint per lloc a la campanya amb falsos positius. Sense mòdul 5, a més, la resposta hauria estat artesanal: reentrenar a mà al portàtil de la Laura, sense ombra ni canary, amb el risc de substituir un problema conegut per un de desconegut. Les dues absències més doloroses: la taula de prediccions (sense ella no hi ha ni diagnòstic retrospectiu: no sabries ni quants clients de la promo van ser marcats) i el camí segur challenger → ombra → canary (sense ell, la correcció és tan arriscada com el problema).
-
Playbook: distingeix causes que requereixen context extern al sistema (és una promo? un bug de l'equip de dades?) — el sistema veu que la distribució ha canviat, no per què; aquest perquè viu en converses amb altres equips. Llançament del reentrenament: decideix si el canvi mereix la resposta cara (còmput, risc, revisió) — un judici de cost/benefici amb informació de negoci. Revisió del PR: responsabilitat — algú amb nom assumeix que l'evidència (ombra, subgrups, model card) justifica el canvi; és tant control com rendició de comptes. Canary: interpretar mètriques de guàrdia en context (aquest pic de p95 és el model o és el partit de futbol?). La candidata natural a automatitzar en un nivell 3 és la progressió del canary (els llindars ja són objectius i el rollback automàtic ja existeix): s'automatitzaria l'avanç 5→25→100 quan les mètriques de guàrdia porten N hores netes, amb la salvaguarda que qualsevol alerta congela la progressió i notifica — l'humà passa d'aprovar cada esglaó a supervisar per excepció. Les altres tres involucren context extern o responsabilitat, i automatitzar-les eliminaria el judici, no el tràmit.
-
Que el monitoratge és un detector de símptomes, no un substitut de la comunicació entre equips: el sistema tècnic perfecte va detectar la promo amb dues setmanes de retard perquè el problema no era tècnic — era organitzatiu (una decisió de negoci que afecta les dades no va arribar a qui opera el model). Cap quantitat de PSI no converteix una sorpresa en un avís. Per això el tancament de l'incident és un ADR amb una política de comunicació i no una eina nova: hi ha una classe sencera de problemes (canvis de negoci, decisions de producte, esdeveniments externs previsibles) la solució barata dels quals és avisar abans i la solució tècnica dels quals és només l'airbag. MLOps, com el seu parent DevOps, és en última instància una disciplina sociotècnica: la meitat de la plataforma són pipelines; l'altra meitat, acords entre persones — els quatre humans del mapa, els ADRs, el playbook i una promo comunicada a temps.
Conclusió
Aquí acaba el viatge. Va començar al mòdul 1 amb un notebook al portàtil de la Laura: un random forest prometedor amb recall 0.43 i deu problemes que li impedien tocar la realitat. Acaba amb la plataforma del mapa d'aquesta lliçó: un paquet reproduïble amb dades versionades (M2); experiments traçats i un registry on v2 — i ara v3 — porten el seu llinatge complet (M3); un servei a Kubernetes amb p95 de 92 ms i un batch setmanal que alimenta la campanya de retenció (M4); CI que converteix el criteri de negoci en llindar bloquejant, CD desacoblat amb humans als punts de responsabilitat, i releases amb ombra, canary i rollback assajat (M5); i un sistema que mira sol — dos plans de monitoratge, deriva detectada cada dilluns, reentrenament amb tret i point-in-time correctness, governança auditable per disseny (M6). CineClick va creuar al nivell 2 de maduresa, i tu hi vas creuar amb ella.
El que saps fer ara, en concret: estructurar un projecte de ML com a paquet reproduïble amb entorn fixat; versionar dades i pipelines amb DVC; traçar experiments i gestionar el cicle champion/challenger a MLflow; servir models online amb FastAPI, empaquetar-los amb Docker i operar-los a Kubernetes amb pressupost de latència; muntar CI amb tests de codi, dades i model, i CD desacoblat per a servei i model; orquestrar amb Prefect; dissenyar releases amb ombra, canary i A/B; monitorar en dos plans i construir una taula de prediccions auditable; detectar deriva amb PSI i Evidently i reaccionar amb un playbook; automatitzar el reentrenament sense cedir la decisió de promoció; i documentar i governar el sistema — model cards, ADRs, subgrups, privadesa — fins a poder superar un simulacre d'auditoria en minuts.
Per continuar aprofundint, tres camins naturals: cap al modelatge (el curs de deep_learning del portal, si els teus models creixen més que els teus pipelines), cap a la infraestructura (els cursos de kubernetes, docker i ci_cd, si vols operar la plataforma que altres fan servir), i cap a la pràctica — que és el camí que de debò consolida: el projecte de LuzYa t'està esperant, i després d'ell, el primer model real del teu equip que avui estigui morint en un notebook. Ja saps exactament què fer-ne.
Curs de MLOps
Mòdul 1: Fonaments de MLOps
- Què és MLOps i per què els models moren al notebook
- El cicle de vida d'un model de ML en producció
- Nivells de maduresa MLOps i rols de l'equip
- El projecte del curs: del notebook a producció
Mòdul 2: Del notebook al codi reproduïble
- Estructura d'un projecte de ML: del notebook al paquet
- Entorns reproduïbles i gestió de dependències
- Versionat de dades amb DVC
- Pipelines d'entrenament reproduïbles
Mòdul 3: Experiments i registre de models
- Tracking d'experiments amb MLflow
- Model registry: versionar i promocionar models
- Feature stores: quan i per a què
Mòdul 4: Servir models en producció
- Patrons de desplegament: batch, online i streaming
- Un servei de predicció amb FastAPI
- Empaquetatge amb Docker
- Escalat i desplegament: Kubernetes i serverless
- Optimització de la inferència: latència i cost
Mòdul 5: Automatització: CI/CD i orquestració
- CI per a ML: tests de codi, dades i models
- CD: automatitzar el desplegament del model
- Orquestració de pipelines de ML
- Estratègies de release: shadow, canary i A/B
