Qo'llanma: buyruqlar, jadvallar va tuzoqlar
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:
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"}, ]))
| Nima | Ishonchliligi | Nega |
|---|---|---|
| Model metrikalari (F1, aniqlik) | Yuqori | Seed qat'iy — sizda ham shu chiqadi |
| Tezlik va kechikish (ms, so'rov/s) | **Faqat mening mashinamda** | Protsessor, disk, yuk — hammasi boshqa |
| Rasm hajmi (MB) | Taxminan | Kutubxona versiyalari o'zgaradi |
| Xarajat hisobi (37-bob) | **Taxminiy narxlar** | Bulut narxlari o'zgaradi — o'z narxingizni qo'ying |
| PSI chegaralari (0.10 / 0.25) | Kelishuv | Teoremadan 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
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"}, ]))
| Vazifa | Buyruq | Bob |
|---|---|---|
| Rasm qurish | docker build -f Dockerfile.servis -t servis:v1 . | 28 |
| Konteyner ishga tushirish | docker compose up -d | 30 |
| Jurnal ko'rish | docker logs -f <nom> | 30 |
| Kafka topic yaratish | KafkaAdminClient(...).create_topics([...]) | 10 |
| Kafka lag tekshirish | end_offsets() - committed() | 36 |
| Postgres CDC sloti | pg_create_logical_replication_slot(...) | 11 |
| Spark klasterda | spark-submit --master k8s://... | 13 |
| So'rov rejasi | EXPLAIN ANALYZE <sorov> | 18 |
| MLflow tajribalari | mlflow.search_runs(...) | 22 |
| Model alias | set_registered_model_alias(...) | 23 |
| O'lchovlar | curl localhost:PORT/metrics | 34 |
Qaror jadvallari
Ish paytida eng ko'p beriladigan savollar va javoblar.
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"}, ]))
| Savol | Javob | Bob |
|---|---|---|
| CSV yoki Parquet? | Almashish uchun CSV, saqlash uchun Parquet | 4 |
| Batch yoki oqim? | "Javob 6 soat kechiksa nima yo'qoladi?" | 9 |
| Nechta partition? | Iste'molchidan 2-3x ko'p; kamaytirib bo'lmaydi | 10 |
| Model rasm ichidami? | < 500 MB va kam o'zgarsa — ichiga | 28 |
| To'plam kerakmi? | Foydalanuvchi kutmasa — ha | 29 |
| Qachon qayta o'qitish? | Jadval bo'yicha emas — **signal bo'yicha** | 35 |
| Yangi model qanday chiqariladi? | Shadow → canary → to'liq | 33 |
| Kubernetes kerakmi? | O'nlab server bo'lmasa — yo'q | 13 |
| GPU kerakmi? | O'lchamaguncha — yo'q | 37 |
Tuzoqlar ro'yxati
Kitobdagi barcha gotcha laridan eng ko'p vaqt yeydiganlari.
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"}, ]))
| Tuzoq | Bob |
|---|---|
| Ustunlar tartibi buzilsa model jim xato qiladi | 3 |
| CSV turlarni saqlamaydi — `007` → `7` | 4 |
| Model manfiy qiymatni ham qabul qiladi | 6 |
| Dockerfile tartibi: o'zgaruvchan qism oxirida | 7 |
| 4-iste'molchi partition bo'lmasa bo'sh turadi | 10 |
| Unutilgan replikatsiya sloti diskni to'ldiradi | 11 |
| `collect()` driver xotirasini to'ldiradi | 12 |
| Kech kelgan ma'lumot jim yo'qoladi — sanang | 14 |
| Eski snapshotlar joyni egallaydi | 15 |
| SCD 2-turda `joriy=TRUE` unutilsa raqam shishadi | 17 |
| Funksiyaga o'ralgan ustun indeksni ishlatmaydi | 18 |
| `pickle.load()` kod bajaradi | 26 |
| `:latest` bilan orqaga qaytib bo'lmaydi | 32 |
| `docker kill` qayta ishga tushirishni ishga solmaydi | 32 |
| Kuzatuvsiz canary — shunchaki xavf | 33 |
… 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.
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}]'`"}, ]))
| Muammo | Yechim |
|---|---|
| `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 emas | Xatoni matndan qidiring yoki `PIPESTATUS` |
| `pkill -f "naqsh"` skriptning **o'zini** o'ldiradi | PID ni faylga saqlang |
| `cd X && cmd &` — bash orqa fon jarayonini **kutib qoladi** | `cd` ni alohida qatorga chiqaring |
| f-string **ifoda** qismida apostrof bo'lmaydi | Matnni o'zgaruvchiga oling |
| O'zbekcha apostrof (`yo'q`) bash `${VAR:-...}` ichida qatorni buzadi | Skriptda 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:
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"}, ]))
| Qadam | Nima | Bob | Qachon |
|---|---|---|---|
| 1 | Takrorlanish (seed + ma'lumot xeshi) | 2, 5 | Birinchi kundan |
| 2 | Sifat tekshiruvi chegarada | 6 | Birinchi buzuq ma'lumotdan keyin |
| 3 | Bitta buyruqli quvur | 24 | Ikkinchi marta qo'lda o'qitganda |
| 4 | Sifat darvozasi | 31 | Birinchi yomon model chiqqanda |
| 5 | Servis va konteyner | 27, 28 | Boshqa tizim modelni so'raganda |
| 6 | Monitoring | 34 | "Qachondan beri buzuq?" deb so'ralganda |
| 7 | Drift va qayta o'qitish | 35 | Model bir necha oy ishlagach |
| 8 | Qaytarish, canary, shadow | 32, 33 | Chiqarish 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.