Asosiy qismga o'tish

Model registri: hozir qaysi model ishlayapti?

23-bob 13 kod bloki 3083 so'z

Bu bobdagi kod shu fayllar bilan ishlaydio'z kompyuteringizda ishga tushiring

model_final_v2_YANGI_oxirgi.pkl

Yangi ishga kirdingiz. Sizga modelni yaxshilash topshirildi.

Papkani ochasiz:

matn7 qator
model.pkl
model_v2.pkl
model_final.pkl
model_final_v2.pkl
model_final_v2_YANGI.pkl
model_final_v2_YANGI_oxirgi.pkl
model_ishlaydi_TEGMA.pkl

Yetti fayl. Bitta savol: hozir ishlab chiqarishda qaysi biri turibdi?

Hamkasbingizdan so'raysiz. U o'ylanadi. "Menimcha model_ishlaydi_TEGMA bo'lsa kerak... yoki oxirgi mi? Uni Aziz qo'ygan edi, u ishdan ketgan."

Endi ikkinchi savol: bu model qaysi ma'lumotda o'qitilgan? Uchinchi: uning F1 qancha edi? To'rtinchi: kimdir uni tekshirganmi?

Hech biriga javob yo'q. Va eng yomoni — bu holat normal hisoblanadi.

Kutubxona va kitob javoni

Muammo fayllarda emas, tartibda.

Kutubxonani tasavvur qiling. Har kitobning raqami bor, katalogda kim olgani yozilgan, javonda "o'qish zali uchun" va "uyga berish mumkin" degan belgilar bor.

Endi o'sha kutubxonani katalogsiz tasavvur qiling: kitoblar bor, lekin qaysi biri qayerda va kim olganini hech kim bilmaydi. Kitoblar yo'qolmaydi — faqat topilmaydi.

Model registri — o'sha katalog. U modelni saqlamaydi (modellar allaqachon saqlangan), u kim, qachon, nima uchun degan savollarga javob beradi va har modelga holat beradi: sinovdami, ishlab chiqarishdami, arxivdami.

Savol oddiy, javob odatda yo'q

22-bobda o'nlab tajriba yozdik. Endi bittasini tanlab, ishlab chiqarishga chiqarish kerak. Va shu yerda savollar boshlanadi:

python8 qator
import pandas as pd
show(pd.DataFrame([
    {"savol": "Hozir serverda qaysi model?", "fayl nomi bilan": "model_final_v2.joblib — qaysi tajriba?"},
    {"savol": "Kim va qachon chiqargan?", "fayl nomi bilan": "Fayl vaqti — lekin kim noma'lum"},
    {"savol": "Oldingisiga qaytsak bo'ladimi?", "fayl nomi bilan": "Eski fayl saqlanganmi? Balki yo'q"},
    {"savol": "Bu model qaysi ma'lumotda o'qitilgan?", "fayl nomi bilan": "Hech qayerda yozilmagan"},
    {"savol": "Sinovdan o'tganmi?", "fayl nomi bilan": "Og'zaki kelishuv"},
]))
savolfayl nomi bilan
Hozir serverda qaysi model?model_final_v2.joblib — qaysi tajriba?
Kim va qachon chiqargan?Fayl vaqti — lekin kim noma'lum
Oldingisiga qaytsak bo'ladimi?Eski fayl saqlanganmi? Balki yo'q
Bu model qaysi ma'lumotda o'qitilgan?Hech qayerda yozilmagan
Sinovdan o'tganmi?Og'zaki kelishuv

Model registri shu savollarga javob beradi. U model fayllarini emas, model versiyalarini va ularning holatini boshqaradi.

Registr qanday ishlaydi

python17 qator
diagramma(
    {
        "Tajriba\n(22-bob)": (0, 1.8, 2.3, 1.0, "qayta"),
        "REGISTR\nnomli model": (3.1, 1.8, 2.5, 1.0, "saqlash"),
        "v1": (6.4, 0, 1.5, 0.8, "oddiy"),
        "v2  (Staging)": (6.4, 1.3, 2.4, 0.8, "kuzatuv"),
        "v3  (Production)": (6.4, 2.6, 2.7, 0.8, "xizmat"),
        "v4  (Archived)": (6.4, 3.9, 2.5, 0.8, "oddiy"),
    },
    [
        ("Tajriba\n(22-bob)", "REGISTR\nnomli model", "ro'yxatga olish"),
        ("REGISTR\nnomli model", "v2  (Staging)"),
        ("REGISTR\nnomli model", "v3  (Production)"),
    ],
    nom="registr.png", kenglik=12,
    izoh="Bitta nom, ko'p versiya. Har versiyaning holati bor: Staging, Production, Archived.",
)

Bitta nom, ko'p versiya. Har versiyaning holati bor: Staging, Production, Archived.

Bitta nom, ko'p versiya. Har versiyaning holati bor: Staging, Production, Archived.

Asosiy g'oya: xizmat kodi fayl yo'lini emas, models:/broker-aniqlash@production kabi mantiqiy manzilni so'raydi. Qaysi versiya "production" ekanini registr biladi.

Modelni ro'yxatga olamiz

shu faylni yaratingsrc/quvur/registr.py

python49 qator
"""MLflow Model Registry bilan ishlash.

MLflow 3.x da bosqichlar (stages) o'rniga ALIAS lar ishlatiladi:
  @champion, @production, @staging — istalgan nom.
Alias bitta versiyaga ishora qiladi va uni bir buyruq bilan ko'chirish mumkin.
"""
from typing import Any

import mlflow
from mlflow.tracking import MlflowClient


def royxatga_ol(yugurish_id: str, model_nomi: str,
                artefakt: str = "model") -> int:
    """Tajriba artefaktini registrga qo'shadi. Yangi versiya raqamini qaytaradi."""
    natija = mlflow.register_model(f"runs:/{yugurish_id}/{artefakt}", model_nomi)
    return int(natija.version)


def alias_qoy(model_nomi: str, alias: str, versiya: int) -> None:
    """Aliasni versiyaga bog'laydi. Eski bog'lanish avtomatik uziladi."""
    MlflowClient().set_registered_model_alias(model_nomi, alias, str(versiya))


def alias_versiyasi(model_nomi: str, alias: str) -> int | None:
    try:
        return int(MlflowClient().get_model_version_by_alias(model_nomi, alias).version)
    except Exception:
        return None


def versiyalar(model_nomi: str) -> list[dict[str, Any]]:
    """Barcha versiyalar: raqam, aliaslar, metrikalar."""
    k = MlflowClient()
    chiqish = []
    for v in k.search_model_versions(f"name='{model_nomi}'"):
        y = k.get_run(v.run_id) if v.run_id else None
        chiqish.append({
            "versiya": int(v.version),
            "aliaslar": list(v.aliases or []),
            "f1": round(y.data.metrics.get("f1", 0), 4) if y else None,
            "yugurish": (v.run_id or "")[:8],
        })
    return sorted(chiqish, key=lambda x: x["versiya"])


def yukla(model_nomi: str, alias: str = "production"):
    """Xizmat kodi FAQAT shuni chaqiradi — fayl yo'li bilan ishlamaydi."""
    return mlflow.sklearn.load_model(f"models:/{model_nomi}@{alias}")

Avval tajribalar borligiga ishonch hosil qilamiz. Bu bobni alohida o'qiyotgan bo'lsangiz ham ishlashi uchun, tajriba bo'lmasa — yaratamiz:

python22 qator
python3 -c "
import sys; sys.path.insert(0, 'src')
import mlflow
from quvur.kuzatuv import omborni_sozla
omborni_sozla()
bor = 0
try:
    bor = len(mlflow.search_runs(experiment_names=['broker-aniqlash']))
except Exception:
    pass
print('mavjud tajribalar:', bor)
if bor < 2:
    print('22-bobdagi tajribalarni qayta yaratamiz...')
    kod = open('oqit_mlflow.py').read().split('if __name__')[0]
    ns = {'__name__': 'setup'}
    exec(kod, ns)
    ns['omborni_sozla']()
    for par, nom in [({'n_estimators': 30, 'min_samples_leaf': 1}, 'kichik-30'),
                     ({'n_estimators': 150, 'min_samples_leaf': 20}, 'sodda-barg20')]:
        m = ns['bitta_yugurish'](par, nom)
        print(f\"  {nom:14} F1={m['f1']:.4f}\")
"
Chiqish (qaytish kodi 0, 48952 ms)
mavjud tajribalar: 0
22-bobdagi tajribalarni qayta yaratamiz...
  kichik-30      F1=0.8585
  sodda-barg20   F1=0.8630
/home/abulqosim/.local/lib/python3.10/site-packages/requests/__init__.py:113: RequestsDependencyWarning: urllib3 (2.6.3) or chardet (6.0.0.post1)/charset_normalizer (3.4.4) doesn't match a supported version!
  warnings.warn(
2026/09/29 18:57:51 INFO mlflow.agent.hint: Load the `instrumenting-with-mlflow-tracing` skill at /home/abulqosim/.local/lib/python3.10/site-packages/mlflow/assistant/skills/instrumenting-with-mlflow-tracing/SKILL.md before writing any tracing code; it ships with this MLflow install. Set MLFLOW_DISABLE_AGENT_HINT=1 to silence this.
2026/09/29 18:57:52 INFO mlflow.store.db.utils: Creating initial MLflow database tables...
2026/09/29 18:57:52 INFO mlflow.store.db.utils: Updating database tables
2026/09/29 18:58:18 WARNING mlflow.tracking.fluent: Cannot retrieve experiment by name broker-aniqlash
2026/09/29 18:58:20 INFO mlflow.tracking.fluent: Experiment with name 'broker-aniqlash' does not exist. Creating a new experiment.
/home/abulqosim/.local/lib/python3.10/site-packages/mlflow/types/utils.py:440: UserWarning: Hint: Inferred schema contains integer column(s). Integer columns in Python cannot represent missing values. If your input data contains missing values at inference time, it will be encoded as floats and will cause a schema enforcement error. The best way to avoid this problem is to infer the model schema based on a realistic data sample (training dataset) that includes missing values. Alternatively, you can declare integer columns as doubles (float64) whenever these columns may have missing values. See `Handling Integers With Missing Values <https://www.mlflow.org/docs/latest/models.html#handling-integers-with-missing-values>`_ for more details.
  warnings.warn(
/home/abulqosim/.local/lib/python3.10/site-packages/mlflow/types/utils.py:440: UserWarning: Hint: Inferred schema contains integer column(s). Integer columns in Python cannot represent missing values. If your input data contains missing values at inference time, it will be encoded as floats and will cause a schema enforcement error. The best way to avoid this problem is to infer the model schema based on a realistic data sample (training dataset) that includes missing values. Alternatively, you can declare integer columns as doubles (float64) whenever these columns may have missing values. See `Handling Integers With Missing Values <https://www.mlflow.org/docs/latest/models.html#handling-integers-with-missing-values>`_ for more details.
  warnings.warn(
2026/09/29 18:58:29 WARNING mlflow.utils.requirements_utils: Found torch version (2.9.1+cu128) contains a local version label (+cu128). MLflow logged a pip requirement for this package as 'torch==2.9.1' without the local version label to make it installable from PyPI. To specify pip requirements containing local version labels, please use `conda_env` or `pip_requirements`.
/home/abulqosim/.local/lib/python3.10/site-packages/mlflow/types/utils.py:440: UserWarning: Hint: Inferred schema contains integer column(s). Integer columns in Python cannot represent missing values. If your input data contains missing values at inference time, it will be encoded as floats and will cause a schema enforcement error. The best way to avoid this problem is to infer the model schema based on a realistic data sample (training dataset) that includes missing values. Alternatively, you can declare integer columns as doubles (float64) whenever these columns may have missing values. See `Handling Integers With Missing Values <https://www.mlflow.org/docs/latest/models.html#handling-integers-with-missing-values>`_ for more details.
  warnings.warn(
/home/abulqosim/.local/lib/python3.10/site-packages/mlflow/types/utils.py:440: UserWarning: Hint: Inferred schema contains integer column(s). Integer columns in Python cannot represent missing values. If your input data contains missing values at inference time, it will be encoded as floats and will cause a schema enforcement error. The best way to avoid this problem is to infer the model schema based on a realistic data sample (training dataset) that includes missing values. Alternatively, you can declare integer columns as doubles (float64) whenever these columns may have missing values. See `Handling Integers With Missing Values <https://www.mlflow.org/docs/latest/models.html#handling-integers-with-missing-values>`_ for more details.
  warnings.warn(
2026/09/29 18:58:38 WARNING mlflow.utils.requirements_utils: Found torch version (2.9.1+cu128) contains a local version label (+cu128). MLflow logged a pip requirement for this package as 'torch==2.9.1' without the local version label to make it installable from PyPI. To specify pip requirements containing local version labels, please use `conda_env` or `pip_requirements`.

Endi ikkita tajribani registrga qo'shamiz:

python16 qator
python3 -c "
import sys; sys.path.insert(0, 'src')
import mlflow
from quvur.kuzatuv import omborni_sozla
from quvur.registr import royxatga_ol, versiyalar
omborni_sozla()

MODEL = 'broker-aniqlash'
y = mlflow.search_runs(experiment_names=['broker-aniqlash'],
                       filter_string=\"attributes.status = 'FINISHED'\",
                       order_by=['metrics.f1 ASC'])
# ataylab: avval yomonroq, keyin yaxshiroq — versiya tarixi ko'rinsin
for _, q in y.head(2).iterrows():
    v = royxatga_ol(q['run_id'], MODEL)
    print(f\"  v{v}  <- {q['tags.mlflow.runName']:14} F1={q['metrics.f1']:.4f}\")
"
Chiqish (qaytish kodi 0, 2791 ms)
  v1  <- kichik-30      F1=0.8585
  v2  <- sodda-barg20   F1=0.8630
/home/abulqosim/.local/lib/python3.10/site-packages/requests/__init__.py:113: RequestsDependencyWarning: urllib3 (2.6.3) or chardet (6.0.0.post1)/charset_normalizer (3.4.4) doesn't match a supported version!
  warnings.warn(
2026/09/29 18:58:40 INFO mlflow.agent.hint: Load the `instrumenting-with-mlflow-tracing` skill at /home/abulqosim/.local/lib/python3.10/site-packages/mlflow/assistant/skills/instrumenting-with-mlflow-tracing/SKILL.md before writing any tracing code; it ships with this MLflow install. Set MLFLOW_DISABLE_AGENT_HINT=1 to silence this.
Successfully registered model 'broker-aniqlash'.
2026/09/29 18:58:41 WARNING mlflow.tracking._model_registry.fluent: Run with id 3f1ff930661541a7aa5e3c4cd8bd8a05 has no artifacts at artifact path 'model', registering model based on models:/m-d6f5cb42270c4ac1985197f95b5dd1be instead
Created version '1' of model 'broker-aniqlash'.
Registered model 'broker-aniqlash' already exists. Creating a new version of this model...
2026/09/29 18:58:41 WARNING mlflow.tracking._model_registry.fluent: Run with id 6930f36afa614251a7c2cd7d54b1d37d has no artifacts at artifact path 'model', registering model based on models:/m-032d58bbb6104785a23d2e9ad6b91d08 instead
Created version '2' of model 'broker-aniqlash'.
python9 qator
python3 -c "
import sys; sys.path.insert(0, 'src')
from quvur.kuzatuv import omborni_sozla
from quvur.registr import versiyalar
omborni_sozla()
for v in versiyalar('broker-aniqlash'):
    a = ', '.join(v['aliaslar']) if v['aliaslar'] else 'yoq'
    print(f\"  v{v['versiya']}  F1={v['f1']}  aliaslar={a}\")
"
Chiqish (qaytish kodi 0, 1979 ms)
  v1  F1=0.8585  aliaslar=yoq
  v2  F1=0.863  aliaslar=yoq
/home/abulqosim/.local/lib/python3.10/site-packages/requests/__init__.py:113: RequestsDependencyWarning: urllib3 (2.6.3) or chardet (6.0.0.post1)/charset_normalizer (3.4.4) doesn't match a supported version!
  warnings.warn(
2026/09/29 18:58:43 INFO mlflow.agent.hint: Load the `instrumenting-with-mlflow-tracing` skill at /home/abulqosim/.local/lib/python3.10/site-packages/mlflow/assistant/skills/instrumenting-with-mlflow-tracing/SKILL.md before writing any tracing code; it ships with this MLflow install. Set MLFLOW_DISABLE_AGENT_HINT=1 to silence this.

Hozircha ikki versiya bor, lekin hech biri "production" emas. Xizmat qaysi birini olishini bilmaydi — va bu to'g'ri: hali hech kim tanlov qilmagan.

Alias: qaysi versiya ishlaydi

Registrda endi bir nechta versiya bor: v1, v2, v3. Savol tug'iladi — qaysi biri hozir ishlab chiqarishda?

Birinchi xayolga keladigan javob: "eng oxirgisi". Lekin bu xato, va xato qimmat.

Yangi versiya o'qitilgani uni yaxshi qiladi degani emas. U hali sinalmagan bo'lishi mumkin, yoki sinovdan o'tmagan bo'lishi mumkin. "Eng oxirgi" qoidasi har o'qitishdan keyin ishlab chiqarishga tekshirilmagan modelni chiqaradi.

Kerak bo'lgan narsa — versiya raqamidan alohida belgi. Uni alias deb ataymiz.

Teatrdagi rollarni tasavvur qiling. "Hamlet" rolini bugun Aziz o'ynaydi, ertaga Bobur. Tomoshabin afishaga qaraydi va "Hamlet" ni ko'radi — aktyor ismini emas.

Rejissor aktyorni almashtirsa, afisha o'zgarmaydi. Rol o'sha, ijrochi boshqa.

Registrda ham shunday:

  • production — hozir mijozlarga xizmat qilayotgan versiya
  • staging — sinovdan o'tayotgan versiya
  • champion / challenger — taqqoslanayotgan ikkita

Alias ko'chib yuradi: bugun v1 da, ertaga v3 da. Versiyalarning o'zi esa hech qachon o'zgarmaydi.

python15 qator
python3 -c "
import sys; sys.path.insert(0, 'src')
from quvur.kuzatuv import omborni_sozla
from quvur.registr import alias_qoy, alias_versiyasi, versiyalar
omborni_sozla()
MODEL = 'broker-aniqlash'

alias_qoy(MODEL, 'production', 1)
print('production ->', alias_versiyasi(MODEL, 'production'))
alias_qoy(MODEL, 'staging', 2)
print('staging    ->', alias_versiyasi(MODEL, 'staging'))
print()
for v in versiyalar(MODEL):
    print(f\"  v{v['versiya']}  F1={v['f1']}  {v['aliaslar']}\")
"
Chiqish (qaytish kodi 0, 2018 ms)
production -> 1
staging    -> 2

  v1  F1=0.8585  []
  v2  F1=0.863  []
/home/abulqosim/.local/lib/python3.10/site-packages/requests/__init__.py:113: RequestsDependencyWarning: urllib3 (2.6.3) or chardet (6.0.0.post1)/charset_normalizer (3.4.4) doesn't match a supported version!
  warnings.warn(
2026/09/29 18:58:45 INFO mlflow.agent.hint: Load the `instrumenting-with-mlflow-tracing` skill at /home/abulqosim/.local/lib/python3.10/site-packages/mlflow/assistant/skills/instrumenting-with-mlflow-tracing/SKILL.md before writing any tracing code; it ships with this MLflow install. Set MLFLOW_DISABLE_AGENT_HINT=1 to silence this.

Xizmat kodi fayl yo'lini bilmaydi

Bu registrning asosiy foydasi. Xizmat shunday yoziladi:

python16 qator
python3 -c "
import sys; sys.path.insert(0, 'src')
import pandas as pd
from quvur.kuzatuv import omborni_sozla
from quvur.registr import yukla
omborni_sozla()

XUS = ['xonalar','maydon','qavat','jami_qavat','narx_mln','tavsif_uzunligi',
       'rasmlar_soni','telefon_takrorlanishi','kunlik_elonlar','egasi_tasdiqlangan']
d = pd.read_csv('../datasets/ijara.csv').head(5)

m = yukla('broker-aniqlash', 'production')   # fayl yo'li YO'Q
p = m.predict_proba(d[XUS])[:, 1]
print('production modeli yuklandi:', type(m).__name__)
print('bashoratlar:', [round(float(x), 3) for x in p])
"
Chiqish (qaytish kodi 0, 4966 ms)
production modeli yuklandi: RandomForestClassifier
bashoratlar: [0.2, 0.167, 0.9, 0.033, 1.0]
/home/abulqosim/.local/lib/python3.10/site-packages/requests/__init__.py:113: RequestsDependencyWarning: urllib3 (2.6.3) or chardet (6.0.0.post1)/charset_normalizer (3.4.4) doesn't match a supported version!
  warnings.warn(
2026/09/29 18:58:47 INFO mlflow.agent.hint: Load the `instrumenting-with-mlflow-tracing` skill at /home/abulqosim/.local/lib/python3.10/site-packages/mlflow/assistant/skills/instrumenting-with-mlflow-tracing/SKILL.md before writing any tracing code; it ships with this MLflow install. Set MLFLOW_DISABLE_AGENT_HINT=1 to silence this.

Kodga diqqat bilan qarang: unda hech qanday .joblib, hech qanday papka yo'li yo'q.

Faqat ikkita so'z: model nomi va alias.

Nega bu shunchalik muhim? Chunki bu kim nima qilishini ajratadi.

Ilgari model almashtirish uchun dasturchi kerak edi: kodda yo'lni o'zgartirish, sinash, tarqatish. Endi esa alias ko'chiriladi — va bu bir buyruq, kodga tegmasdan.

Amaliy natijalar:

  • Model almashtirish uchun deploy kerak emas (30-bobda bu qayta tiklash uchun asos bo'ladi).
  • Yomon model chiqsa, aliasni orqaga ko'chirasiz — soniyalar ichida.
  • Ishlab chiqarishda qaysi model turgani bir joyda yozilgan, kimningdir esida emas.

Teatr afishasini eslang: tomoshabin aktyor almashganini sezmaydi ham.

Yangi versiyani chiqarish (promote)

Endi staging dagi model sinovdan o'tdi deylik. Uni production ga ko'chiramiz — bitta buyruq:

python15 qator
python3 -c "
import sys; sys.path.insert(0, 'src')
from quvur.kuzatuv import omborni_sozla
from quvur.registr import alias_qoy, alias_versiyasi
omborni_sozla()
MODEL = 'broker-aniqlash'

eski = alias_versiyasi(MODEL, 'production')
yangi = alias_versiyasi(MODEL, 'staging')
print(f'oldin : production = v{eski}')
alias_qoy(MODEL, 'production', yangi)
print(f'keyin : production = v{alias_versiyasi(MODEL, \"production\")}')
print()
print('eski versiya o\'chmadi — u hali ham registrda turibdi.')
"
Chiqish (qaytish kodi 0, 3152 ms)
oldin : production = v1
keyin : production = v2

eski versiya o'chmadi — u hali ham registrda turibdi.
/home/abulqosim/.local/lib/python3.10/site-packages/requests/__init__.py:113: RequestsDependencyWarning: urllib3 (2.6.3) or chardet (6.0.0.post1)/charset_normalizer (3.4.4) doesn't match a supported version!
  warnings.warn(
2026/09/29 18:58:52 INFO mlflow.agent.hint: Load the `instrumenting-with-mlflow-tracing` skill at /home/abulqosim/.local/lib/python3.10/site-packages/mlflow/assistant/skills/instrumenting-with-mlflow-tracing/SKILL.md before writing any tracing code; it ships with this MLflow install. Set MLFLOW_DISABLE_AGENT_HINT=1 to silence this.

Orqaga qaytarish (rollback)

Yangi model yomon ishlayotgani ma'lum bo'ldi. Qaytarish ham bitta buyruq:

python14 qator
python3 -c "
import sys; sys.path.insert(0, 'src')
from quvur.kuzatuv import omborni_sozla
from quvur.registr import alias_qoy, alias_versiyasi, versiyalar
omborni_sozla()
MODEL = 'broker-aniqlash'

print('muammo aniqlandi, production =', f'v{alias_versiyasi(MODEL, \"production\")}')
alias_qoy(MODEL, 'production', 1)
print('rollback qilindi, production =', f'v{alias_versiyasi(MODEL, \"production\")}')
print()
for v in versiyalar(MODEL):
    print(f\"  v{v['versiya']}  F1={v['f1']}  {v['aliaslar']}\")
"
Chiqish (qaytish kodi 0, 1948 ms)
muammo aniqlandi, production = v2
rollback qilindi, production = v1

  v1  F1=0.8585  []
  v2  F1=0.863  []
/home/abulqosim/.local/lib/python3.10/site-packages/requests/__init__.py:113: RequestsDependencyWarning: urllib3 (2.6.3) or chardet (6.0.0.post1)/charset_normalizer (3.4.4) doesn't match a supported version!
  warnings.warn(
2026/09/29 18:58:55 INFO mlflow.agent.hint: Load the `instrumenting-with-mlflow-tracing` skill at /home/abulqosim/.local/lib/python3.10/site-packages/mlflow/assistant/skills/instrumenting-with-mlflow-tracing/SKILL.md before writing any tracing code; it ships with this MLflow install. Set MLFLOW_DISABLE_AGENT_HINT=1 to silence this.

Mana nima uchun registr kerak: rollback soniyalarda bo'ladi va model qayta o'qitilmaydi. Fayl bilan ishlaganda eski modelni topish, nusxalash va serverni qayta yuklash kerak edi.

Rollback — bu tuzatish emas

Rollback muammoni to'xtatadi, lekin sababini yo'qotmaydi. Qaytargandan keyin:

  1. Nima uchun yangi model yomon ishlaganini aniqlang (35-bob: drift)
  2. Sinov to'plamiga o'sha holatni qo'shing
  3. Shundan keyingina qayta urinib ko'ring

Aks holda o'sha muammo keyingi chiqarishda qaytadi.

Nima registrga tushadi, nima tushmaydi

python9 qator
import pandas as pd
show(pd.DataFrame([
    {"narsa": "Model vaznlari", "registrda": "HA", "izoh": "Asosiy artefakt"},
    {"narsa": "Qaysi tajribadan", "registrda": "HA", "izoh": "run_id saqlanadi"},
    {"narsa": "Metrikalar", "registrda": "HA", "izoh": "Tajriba orqali bog'langan"},
    {"narsa": "Xususiyat tayyorlash kodi", "registrda": "QISMAN", "izoh": "3-bob: birga qadoqlansin"},
    {"narsa": "O'qitish ma'lumoti", "registrda": "YO'Q", "izoh": "5-bob: hash tegi bilan bog'lanadi"},
    {"narsa": "Kim tasdiqladi", "registrda": "HA", "izoh": "Teg yoki tavsif orqali"},
]))
narsaregistrdaizoh
Model vaznlariHAAsosiy artefakt
Qaysi tajribadanHArun_id saqlanadi
MetrikalarHATajriba orqali bog'langan
Xususiyat tayyorlash kodiQISMAN3-bob: birga qadoqlansin
O'qitish ma'lumotiYO'Q5-bob: hash tegi bilan bog'lanadi
Kim tasdiqladiHATeg yoki tavsif orqali

To'rtinchi qator muhim: model xususiyat tayyorlash kodisiz ma'nosiz. 3-bobdagi o'qitish/xizmat nomuvofiqligini eslang. Shuning uchun modelni saqlashda tayyorlash kodini ham birga qadoqlash kerak — buni 26-bobda pipeline bilan qilamiz.

Registr va bosqichlar

python8 qator
import pandas as pd
show(pd.DataFrame([
    {"alias": "@champion", "ma'nosi": "Hozirgi eng yaxshi, lekin hali chiqarilmagan"},
    {"alias": "@staging", "ma'nosi": "Sinov muhitida ishlayapti"},
    {"alias": "@production", "ma'nosi": "Mijozlarga xizmat qilayapti"},
    {"alias": "@shadow", "ma'nosi": "Parallel ishlayapti, javobi ishlatilmaydi (33-bob)"},
    {"alias": "@oxirgi_yaxshi", "ma'nosi": "Rollback uchun ma'lum yaxshi nuqta"},
]))
aliasma'nosi
@championHozirgi eng yaxshi, lekin hali chiqarilmagan
@stagingSinov muhitida ishlayapti
@productionMijozlarga xizmat qilayapti
@shadowParallel ishlayapti, javobi ishlatilmaydi (33-bob)
@oxirgi_yaxshiRollback uchun ma'lum yaxshi nuqta

MLflow 2.x da qat'iy Staging/Production bosqichlari bor edi; 3.x da ular alias bilan almashtirildi. Sabab: har jamoaning o'z jarayoni bor va qat'iy ro'yxat hammaga to'g'ri kelmaydi.

Xulosa

Tushuncha Asosiy fikr
Muammo "Qaysi model ishlayapti?" — fayl nomi javob bermaydi
Registr Nomli model + versiyalar + aliaslar
Alias @production bitta versiyaga ishora qiladi, ko'chirish oson
Xizmat kodi models:/nom@production — fayl yo'li yo'q, kod o'zgarmaydi
Promote Bitta buyruq; eski versiya o'chmaydi
Rollback Soniyalarda, qayta o'qitishsiz
Rollback chegarasi Muammoni to'xtatadi, sababini yo'qotmaydi
Yetishmaydigan qism Tayyorlash kodi va ma'lumot — alohida bog'lanishi kerak

Talaba ishi

  1. royxatga_ol ga tavsif (description) qo'shing: kim, qachon va nega chiqargan.
  2. alias_qoy ga himoya qo'shing: F1 hozirgi production dan past bo'lsa, rad etsin. Bu 31-bobdagi sifat darvozasining registrdagi ko'rinishi.
  3. Registrdan @production va @staging modellarini bir xil ma'lumotda taqqoslang. Qaysi biri yaxshiroq va farq statistik jihatdan muhimmi?
  4. Model versiyasiga malumot_sha256 tegini qo'shing (5-bob). Endi "bu model qaysi ma'lumotda o'qitilgan?" degan savolga registrdan javob bera olasizmi?

Bu bobni bepul o'qidingiz.

Kitob o'rgatadi, lekin sizning kodingiz nega ishlamaganini ayta olmaydi. Kursda uy vazifangiz tekshiriladi.

Telegramda yozish Narxlar