Asosiy qismga o'tish

Qo'llanma: buyruqlar, jadvallar va tuzoqlar

39-bob 6 kod bloki 1919 so'z

Bu bobni qanday ishlatish

Oldingi 38 bob o'rganish uchun edi. Bu bob eslash uchun.

Uni boshidan oxirigacha o'qish shart emas. Ish paytida ochib, kerakli qatorni toping.

Avval: bu kitobdagi raqamlar haqida rostini aytaman

Kitobdagi har bir raqam bajarilgan koddan olingan. Hech biri qo'lda yozilmagan yoki taxmin qilinmagan — kitob qurilganda kod ishlaydi va natija sahifaga tushadi.

Lekin bu hamma joyda shu raqam chiqadi degani emas. Halol bo'lish uchun farqni aniq qo'yaman:

python13 qator
import pandas as pd
show(pd.DataFrame([
    {"Nima": "Model metrikalari (F1, aniqlik)", "Ishonchliligi": "Yuqori",
     "Nega": "Seed qat'iy — sizda ham shu chiqadi"},
    {"Nima": "Tezlik va kechikish (ms, so'rov/s)", "Ishonchliligi": "**Faqat mening mashinamda**",
     "Nega": "Protsessor, disk, yuk — hammasi boshqa"},
    {"Nima": "Rasm hajmi (MB)", "Ishonchliligi": "Taxminan",
     "Nega": "Kutubxona versiyalari o'zgaradi"},
    {"Nima": "Xarajat hisobi (37-bob)", "Ishonchliligi": "**Taxminiy narxlar**",
     "Nega": "Bulut narxlari o'zgaradi — o'z narxingizni qo'ying"},
    {"Nima": "PSI chegaralari (0.10 / 0.25)", "Ishonchliligi": "Kelishuv",
     "Nega": "Teoremadan emas, tajribadan"},
]))
NimaIshonchliligiNega
Model metrikalari (F1, aniqlik)YuqoriSeed qat'iy — sizda ham shu chiqadi
Tezlik va kechikish (ms, so'rov/s)**Faqat mening mashinamda**Protsessor, disk, yuk — hammasi boshqa
Rasm hajmi (MB)TaxminanKutubxona versiyalari o'zgaradi
Xarajat hisobi (37-bob)**Taxminiy narxlar**Bulut narxlari o'zgaradi — o'z narxingizni qo'ying
PSI chegaralari (0.10 / 0.25)KelishuvTeoremadan emas, tajribadan

Ikkinchi qator eng muhimi. Agar siz "ONNX 193 barobar tez" degan raqamni ko'rgan bo'lsangiz — bu mening noutbukimda, o'sha kuni, o'sha yuk bilan. Sizda boshqa chiqadi.

Shuning uchun kitobda o'lchash usuli har doim ko'rsatilgan: raqamni ko'chirmang, o'zingizda o'lchang.

Kitobda men xato qilgan joylar

Kitobni yozish davomida o'lchov mening taxminimni bir necha marta rad etdi. Ularni olib tashlamadim — gotcha sifatida qoldirdim, chunki ular eng foydali qism:

  • 12-bob: partition soni haqidagi taxminim ikki marta noto'g'ri chiqdi;
  • 12-bob: shuffle kichik ma'lumotda qimmat emas ekan;
  • 19-bob: 83 barobar ko'p ma'lumot atigi 1.9 barobar sekinlashtirdi;
  • 29-bob: parallellik oshganda o'tkazuvchanlik deyarli o'zgarmadi;
  • 35-bob: eski va yangi ma'lumotni qo'shish natijani yomonlashtirdi.

Agar kitobda hamma taxmin to'g'ri chiqqanida — bu kitob o'lchanmagan bo'lardi.

Eng ko'p ishlatiladigan buyruqlar

python14 qator
import pandas as pd
show(pd.DataFrame([
    {"Vazifa": "Rasm qurish", "Buyruq": "docker build -f Dockerfile.servis -t servis:v1 .", "Bob": "28"},
    {"Vazifa": "Konteyner ishga tushirish", "Buyruq": "docker compose up -d", "Bob": "30"},
    {"Vazifa": "Jurnal ko'rish", "Buyruq": "docker logs -f <nom>", "Bob": "30"},
    {"Vazifa": "Kafka topic yaratish", "Buyruq": "KafkaAdminClient(...).create_topics([...])", "Bob": "10"},
    {"Vazifa": "Kafka lag tekshirish", "Buyruq": "end_offsets() - committed()", "Bob": "36"},
    {"Vazifa": "Postgres CDC sloti", "Buyruq": "pg_create_logical_replication_slot(...)", "Bob": "11"},
    {"Vazifa": "Spark klasterda", "Buyruq": "spark-submit --master k8s://...", "Bob": "13"},
    {"Vazifa": "So'rov rejasi", "Buyruq": "EXPLAIN ANALYZE <sorov>", "Bob": "18"},
    {"Vazifa": "MLflow tajribalari", "Buyruq": "mlflow.search_runs(...)", "Bob": "22"},
    {"Vazifa": "Model alias", "Buyruq": "set_registered_model_alias(...)", "Bob": "23"},
    {"Vazifa": "O'lchovlar", "Buyruq": "curl localhost:PORT/metrics", "Bob": "34"},
]))
VazifaBuyruqBob
Rasm qurishdocker build -f Dockerfile.servis -t servis:v1 .28
Konteyner ishga tushirishdocker compose up -d30
Jurnal ko'rishdocker logs -f <nom>30
Kafka topic yaratishKafkaAdminClient(...).create_topics([...])10
Kafka lag tekshirishend_offsets() - committed()36
Postgres CDC slotipg_create_logical_replication_slot(...)11
Spark klasterdaspark-submit --master k8s://...13
So'rov rejasiEXPLAIN ANALYZE <sorov>18
MLflow tajribalarimlflow.search_runs(...)22
Model aliasset_registered_model_alias(...)23
O'lchovlarcurl localhost:PORT/metrics34

Qaror jadvallari

Ish paytida eng ko'p beriladigan savollar va javoblar.

python12 qator
import pandas as pd
show(pd.DataFrame([
    {"Savol": "CSV yoki Parquet?", "Javob": "Almashish uchun CSV, saqlash uchun Parquet", "Bob": "4"},
    {"Savol": "Batch yoki oqim?", "Javob": "\"Javob 6 soat kechiksa nima yo'qoladi?\"", "Bob": "9"},
    {"Savol": "Nechta partition?", "Javob": "Iste'molchidan 2-3x ko'p; kamaytirib bo'lmaydi", "Bob": "10"},
    {"Savol": "Model rasm ichidami?", "Javob": "< 500 MB va kam o'zgarsa — ichiga", "Bob": "28"},
    {"Savol": "To'plam kerakmi?", "Javob": "Foydalanuvchi kutmasa — ha", "Bob": "29"},
    {"Savol": "Qachon qayta o'qitish?", "Javob": "Jadval bo'yicha emas — **signal bo'yicha**", "Bob": "35"},
    {"Savol": "Yangi model qanday chiqariladi?", "Javob": "Shadow → canary → to'liq", "Bob": "33"},
    {"Savol": "Kubernetes kerakmi?", "Javob": "O'nlab server bo'lmasa — yo'q", "Bob": "13"},
    {"Savol": "GPU kerakmi?", "Javob": "O'lchamaguncha — yo'q", "Bob": "37"},
]))
SavolJavobBob
CSV yoki Parquet?Almashish uchun CSV, saqlash uchun Parquet4
Batch yoki oqim?"Javob 6 soat kechiksa nima yo'qoladi?"9
Nechta partition?Iste'molchidan 2-3x ko'p; kamaytirib bo'lmaydi10
Model rasm ichidami?< 500 MB va kam o'zgarsa — ichiga28
To'plam kerakmi?Foydalanuvchi kutmasa — ha29
Qachon qayta o'qitish?Jadval bo'yicha emas — **signal bo'yicha**35
Yangi model qanday chiqariladi?Shadow → canary → to'liq33
Kubernetes kerakmi?O'nlab server bo'lmasa — yo'q13
GPU kerakmi?O'lchamaguncha — yo'q37

Tuzoqlar ro'yxati

Kitobdagi barcha gotcha laridan eng ko'p vaqt yeydiganlari.

python19 qator
import pandas as pd
show(pd.DataFrame([
    {"Tuzoq": "Ustunlar tartibi buzilsa model jim xato qiladi", "Bob": "3"},
    {"Tuzoq": "CSV turlarni saqlamaydi — `007` → `7`", "Bob": "4"},
    {"Tuzoq": "Model manfiy qiymatni ham qabul qiladi", "Bob": "6"},
    {"Tuzoq": "Dockerfile tartibi: o'zgaruvchan qism oxirida", "Bob": "7"},
    {"Tuzoq": "4-iste'molchi partition bo'lmasa bo'sh turadi", "Bob": "10"},
    {"Tuzoq": "Unutilgan replikatsiya sloti diskni to'ldiradi", "Bob": "11"},
    {"Tuzoq": "`collect()` driver xotirasini to'ldiradi", "Bob": "12"},
    {"Tuzoq": "Kech kelgan ma'lumot jim yo'qoladi — sanang", "Bob": "14"},
    {"Tuzoq": "Eski snapshotlar joyni egallaydi", "Bob": "15"},
    {"Tuzoq": "SCD 2-turda `joriy=TRUE` unutilsa raqam shishadi", "Bob": "17"},
    {"Tuzoq": "Funksiyaga o'ralgan ustun indeksni ishlatmaydi", "Bob": "18"},
    {"Tuzoq": "`pickle.load()` kod bajaradi", "Bob": "26"},
    {"Tuzoq": "`:latest` bilan orqaga qaytib bo'lmaydi", "Bob": "32"},
    {"Tuzoq": "`docker kill` qayta ishga tushirishni ishga solmaydi", "Bob": "32"},
    {"Tuzoq": "Kuzatuvsiz canary — shunchaki xavf", "Bob": "33"},
    {"Tuzoq": "Server grafiklari model eskirganini ko'rsatmaydi", "Bob": "34"},
]))
TuzoqBob
Ustunlar tartibi buzilsa model jim xato qiladi3
CSV turlarni saqlamaydi — `007` → `7`4
Model manfiy qiymatni ham qabul qiladi6
Dockerfile tartibi: o'zgaruvchan qism oxirida7
4-iste'molchi partition bo'lmasa bo'sh turadi10
Unutilgan replikatsiya sloti diskni to'ldiradi11
`collect()` driver xotirasini to'ldiradi12
Kech kelgan ma'lumot jim yo'qoladi — sanang14
Eski snapshotlar joyni egallaydi15
SCD 2-turda `joriy=TRUE` unutilsa raqam shishadi17
Funksiyaga o'ralgan ustun indeksni ishlatmaydi18
`pickle.load()` kod bajaradi26
`:latest` bilan orqaga qaytib bo'lmaydi32
`docker kill` qayta ishga tushirishni ishga solmaydi32
Kuzatuvsiz canary — shunchaki xavf33

… 16 qatordan birinchi 15 tasi

Kitob yozishda uchragan texnik tuzoqlar

Bular MLOps haqida emas, lekin ular menga ko'p vaqtga tushdi. Sizga ham tushishi mumkin.

python17 qator
import pandas as pd
show(pd.DataFrame([
    {"Muammo": "`curl -s URL > /dev/null` HTTP 502 da ham **muvaffaqiyat** qaytaradi",
     "Yechim": "`-w %{http_code}` bilan 200 ni tekshiring"},
    {"Muammo": "`cmd | grep ...` — chiqish kodi **grep** niki, dasturniki emas",
     "Yechim": "Xatoni matndan qidiring yoki `PIPESTATUS`"},
    {"Muammo": "`pkill -f \"naqsh\"` skriptning **o'zini** o'ldiradi",
     "Yechim": "PID ni faylga saqlang"},
    {"Muammo": "`cd X && cmd &` — bash orqa fon jarayonini **kutib qoladi**",
     "Yechim": "`cd` ni alohida qatorga chiqaring"},
    {"Muammo": "f-string **ifoda** qismida apostrof bo'lmaydi",
     "Yechim": "Matnni o'zgaruvchiga oling"},
    {"Muammo": "O'zbekcha apostrof (`yo'q`) bash `${VAR:-...}` ichida qatorni buzadi",
     "Yechim": "Skriptda apostrofsiz yozing"},
    {"Muammo": "Lotin so'zi ichida kirill harfi ko'rinmaydi (`yuбorish`)",
     "Yechim": "Muntazam `grep -P '[\\x{0400}-\\x{04FF}]'`"},
]))
MuammoYechim
`curl -s URL > /dev/null` HTTP 502 da ham **muvaffaqiyat** qaytaradi`-w %{http_code}` bilan 200 ni tekshiring
`cmd | grep ...` — chiqish kodi **grep** niki, dasturniki emasXatoni matndan qidiring yoki `PIPESTATUS`
`pkill -f "naqsh"` skriptning **o'zini** o'ldiradiPID ni faylga saqlang
`cd X && cmd &` — bash orqa fon jarayonini **kutib qoladi**`cd` ni alohida qatorga chiqaring
f-string **ifoda** qismida apostrof bo'lmaydiMatnni o'zgaruvchiga oling
O'zbekcha apostrof (`yo'q`) bash `${VAR:-...}` ichida qatorni buzadiSkriptda apostrofsiz yozing
Lotin so'zi ichida kirill harfi ko'rinmaydi (`yuбorish`)Muntazam `grep -P '[\x{0400}-\x{04FF}]'`

Oxirgi ikkitasi o'zbek tilida yozadiganlar uchun ayniqsa muhim — ular ko'zga ko'rinmaydi.

Yo'l xaritasi: nimadan boshlash

Yangi loyihada hammasini birdan qurmang (38-bob). Tartib:

python19 qator
import pandas as pd
show(pd.DataFrame([
    {"Qadam": 1, "Nima": "Takrorlanish (seed + ma'lumot xeshi)", "Bob": "2, 5",
     "Qachon": "Birinchi kundan"},
    {"Qadam": 2, "Nima": "Sifat tekshiruvi chegarada", "Bob": "6",
     "Qachon": "Birinchi buzuq ma'lumotdan keyin"},
    {"Qadam": 3, "Nima": "Bitta buyruqli quvur", "Bob": "24",
     "Qachon": "Ikkinchi marta qo'lda o'qitganda"},
    {"Qadam": 4, "Nima": "Sifat darvozasi", "Bob": "31",
     "Qachon": "Birinchi yomon model chiqqanda"},
    {"Qadam": 5, "Nima": "Servis va konteyner", "Bob": "27, 28",
     "Qachon": "Boshqa tizim modelni so'raganda"},
    {"Qadam": 6, "Nima": "Monitoring", "Bob": "34",
     "Qachon": "\"Qachondan beri buzuq?\" deb so'ralganda"},
    {"Qadam": 7, "Nima": "Drift va qayta o'qitish", "Bob": "35",
     "Qachon": "Model bir necha oy ishlagach"},
    {"Qadam": 8, "Nima": "Qaytarish, canary, shadow", "Bob": "32, 33",
     "Qachon": "Chiqarish qo'rqinchli bo'lganda"},
]))
QadamNimaBobQachon
1Takrorlanish (seed + ma'lumot xeshi)2, 5Birinchi kundan
2Sifat tekshiruvi chegarada6Birinchi buzuq ma'lumotdan keyin
3Bitta buyruqli quvur24Ikkinchi marta qo'lda o'qitganda
4Sifat darvozasi31Birinchi yomon model chiqqanda
5Servis va konteyner27, 28Boshqa tizim modelni so'raganda
6Monitoring34"Qachondan beri buzuq?" deb so'ralganda
7Drift va qayta o'qitish35Model bir necha oy ishlagach
8Qaytarish, canary, shadow32, 33Chiqarish qo'rqinchli bo'lganda

Oxirgi so'z

Kitob taksichi bilan boshlandi — o'n yil oldingi xaritani yoddan biladigan, hech qachon xato qilmaydigan, hech qachon signal chalmaydigan.

Butun kitob shu bitta muammoga qarshi yozilgan: model buzilganini o'zi aytmaydi.

Endi sizda aytadigan tizim bor. U ma'lumotni qaydga oladi, sifatini tekshiradi, o'zini sinaydi, yomonini chiqarmaydi, buzilsa qaytadi va eskirsa ogohlantiradi.

Bir narsani unutmang: bu tizim bir kunda qurilmaydi va qurilishi ham shart emas. Har qism o'z muammosi paydo bo'lganda qo'shiladi.

Va eng muhimi — kitobdagi hech bir raqamga ishonmang. O'zingizda o'lchang.

Bu bobni bepul o'qidingiz.

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

Telegramda yozish Narxlar