MLOps β€” Cook book, chapter 1

MLOps — Cook book, chapter 1

ВсСм ΠΏΡ€ΠΈΠ²Π΅Ρ‚! Π― CV-Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊ Π² КРОК. Π£ΠΆΠ΅ 3 Π³ΠΎΠ΄Π° ΠΌΡ‹ Ρ€Π΅Π°Π»ΠΈΠ·ΡƒΠ΅ΠΌ ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Ρ‹ Π² области CV. Π—Π° это врСмя Ρ‡Π΅Π³ΠΎ ΠΌΡ‹ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Π½Π΅ Π΄Π΅Π»Π°Π»ΠΈ, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€: ΠΌΠΎΠ½ΠΈΡ‚ΠΎΡ€ΠΈΠ»ΠΈ Π²ΠΎΠ΄ΠΈΡ‚Π΅Π»Π΅ΠΉ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ Π²ΠΎ врСмя двиТСния ΠΎΠ½ΠΈ Π½Π΅ ΠΏΠΈΠ»ΠΈ, Π½Π΅ ΠΊΡƒΡ€ΠΈΠ»ΠΈ, ΠΏΠΎ Ρ‚Π΅Π»Π΅Ρ„ΠΎΠ½Ρƒ Π½Π΅ Ρ€Π°Π·Π³ΠΎΠ²Π°Ρ€ΠΈΠ²Π°Π»ΠΈ, смотрСли Π½Π° Π΄ΠΎΡ€ΠΎΠ³Ρƒ, Π° Π½Π΅ сны ΠΈΠ»ΠΈ Π² ΠΎΠ±Π»Π°ΠΊΠ°; фиксировали Π»ΡŽΠ±ΠΈΡ‚Π΅Π»Π΅ΠΉ Π΅Π·Π΄ΠΈΡ‚ΡŒ ΠΏΠΎ Π²Ρ‹Π΄Π΅Π»Π΅Π½Π½Ρ‹ΠΌ полосам ΠΈ Π·Π°Π½ΠΈΠΌΠ°Ρ‚ΡŒ нСсколько мСст Π½Π° ΠΏΠ°Ρ€ΠΊΠΎΠ²ΠΊΠ΅; слСдили Π·Π° Ρ‚Π΅ΠΌ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ Ρ€Π°Π±ΠΎΡ‚Π½ΠΈΠΊΠΈ носили каски, ΠΏΠ΅Ρ€Ρ‡Π°Ρ‚ΠΊΠΈ ΠΈ Ρ‚.ΠΏ.; ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΡ†ΠΈΡ€ΠΎΠ²Π°Π»ΠΈ сотрудника, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Ρ…ΠΎΡ‡Π΅Ρ‚ ΠΏΡ€ΠΎΠΉΡ‚ΠΈ Π½Π° ΠΎΠ±ΡŠΠ΅ΠΊΡ‚; подсчитывали всё, Ρ‡Ρ‚ΠΎ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΌΠΎΠΆΠ½ΠΎ.

Π― всС это ΠΊ Ρ‡Π΅ΠΌΡƒ?

Π’ процСссС Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ ΠΏΡ€ΠΎΠ΅ΠΊΡ‚ΠΎΠ² ΠΌΡ‹ Π½Π°Π±ΠΈΠ»ΠΈ шишки, ΠΌΠ½ΠΎΠ³ΠΎ шишСк, с Ρ‡Π°ΡΡ‚ΡŒΡŽ ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌ Π²Ρ‹ ΠΈΠ»ΠΈ Π·Π½Π°ΠΊΠΎΠΌΡ‹, ΠΈΠ»ΠΈ ΠΏΠΎΠ·Π½Π°ΠΊΠΎΠΌΠΈΡ‚Π΅ΡΡŒ Π² Π±ΡƒΠ΄ΡƒΡ‰Π΅ΠΌ.

ΠœΠΎΠ΄Π΅Π»ΠΈΡ€ΡƒΠ΅ΠΌ ΡΠΈΡ‚ΡƒΠ°Ρ†ΠΈΡŽ

ΠŸΡ€Π΅Π΄ΡΡ‚Π°Π²ΠΈΠΌ, Ρ‡Ρ‚ΠΎ ΠΌΡ‹ ΡƒΡΡ‚Ρ€ΠΎΠΈΠ»ΠΈΡΡŒ Π² ΠΌΠΎΠ»ΠΎΠ΄ΡƒΡŽ компанию β€œN”, Π΄Π΅ΡΡ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΡŒ ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΉ связана с ML. Π Π°Π±ΠΎΡ‚Π°Π΅ΠΌ ΠΌΡ‹ Π½Π°Π΄ ML (DL, CV) ΠΏΡ€ΠΎΠ΅ΠΊΡ‚ΠΎΠΌ, ΠΏΠΎΡ‚ΠΎΠΌ ΠΏΠΎ ΠΊΠ°ΠΊΠΈΠΌ-Π»ΠΈΠ±ΠΎ ΠΏΡ€ΠΈΡ‡ΠΈΠ½Π°ΠΌ ΠΏΠ΅Ρ€Π΅ΠΊΠ»ΡŽΡ‡Π°Π΅ΠΌΡΡ Π½Π° Π΄Ρ€ΡƒΠ³ΡƒΡŽ Ρ€Π°Π±ΠΎΡ‚Ρƒ, Π² ΠΎΠ±Ρ‰Π΅ΠΌ Π΄Π΅Π»Π°Π΅ΠΌ ΠΏΠ΅Ρ€Π΅Ρ€Ρ‹Π², ΠΈ возвращаСмся ΠΊ своСй ΠΈΠ»ΠΈ Ρ‡ΡƒΠΆΠΎΠΉ Π½Π΅ΠΉΡ€ΠΎΠ½ΠΎΡ‡ΠΊΠ΅.

  1. НаступаСт ΠΌΠΎΠΌΠ΅Π½Ρ‚ истины, Π½ΡƒΠΆΠ½ΠΎ ΠΊΠ°ΠΊ-Ρ‚ΠΎ Π²ΡΠΏΠΎΠΌΠ½ΠΈΡ‚ΡŒ Π½Π° Ρ‡Π΅ΠΌ Ρ‚Ρ‹ остановился, ΠΊΠ°ΠΊΠΈΠ΅ Π³ΠΈΠΏΠ΅Ρ€ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Ρ‹ ΠΏΡ€ΠΎΠ±ΠΎΠ²Π°Π» ΠΈ, самоС Π³Π»Π°Π²Π½ΠΎΠ΅, ΠΊ ΠΊΠ°ΠΊΠΈΠΌ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Π°ΠΌ ΠΎΠ½ΠΈ ΠΏΡ€ΠΈΠ²Π΅Π»ΠΈ. ΠœΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ мноТСство Π²Π°Ρ€ΠΈΠ°Π½Ρ‚ΠΎΠ², ΠΊΡ‚ΠΎ ΠΊΠ°ΠΊ Ρ…Ρ€Π°Π½ΠΈΠ» ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΡŽ ΠΏΠΎ всСм запускам: Π² Π³ΠΎΠ»ΠΎΠ²Π΅, ΠΊΠΎΠ½Ρ„ΠΈΠ³Π°Ρ…, Π±Π»ΠΎΠΊΠ½ΠΎΡ‚Π΅, Π² Ρ€Π°Π±ΠΎΡ‡Π΅ΠΉ срСдС Π² ΠΎΠ±Π»Π°ΠΊΠ΅. МнС довСлось Π²ΠΈΠ΄Π΅Ρ‚ΡŒ Π²Π°Ρ€ΠΈΠ°Π½Ρ‚, ΠΊΠΎΠ³Π΄Π° Π³ΠΈΠΏΠ΅Ρ€ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Ρ‹ Ρ…Ρ€Π°Π½ΠΈΠ»ΠΈΡΡŒ Π² Π²ΠΈΠ΄Π΅ Π·Π°ΠΊΠΎΠΌΠΌΠ΅Π½Ρ‚ΠΈΡ€ΠΎΠ²Π°Π½Π½Ρ‹Ρ… строк Π² ΠΊΠΎΠ΄Π΅, Π² ΠΎΠ±Ρ‰Π΅ΠΌ ΠΏΠΎΠ»Π΅Ρ‚ Ρ„Π°Π½Ρ‚Π°Π·ΠΈΠΈ. А Ρ‚Π΅ΠΏΠ΅Ρ€ΡŒ ΠΏΡ€Π΅Π΄ΡΡ‚Π°Π²ΡŒΡ‚Π΅, Ρ‡Ρ‚ΠΎ Π²Ρ‹ Π²Π΅Ρ€Π½ΡƒΠ»ΠΈΡΡŒ Π½Π΅ ΠΊ своСму ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Ρƒ, Π° ΠΊ ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Ρƒ Ρ‡Π΅Π»ΠΎΠ²Π΅ΠΊΠ°, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΏΠΎΠΊΠΈΠ½ΡƒΠ» компанию ΠΈ Π² наслСдство Π²Π°ΠΌ достался ΠΊΠΎΠ΄ ΠΈ модСль ΠΏΠΎΠ΄ Π½Π°Π·Π²Π°Π½ΠΈΠ΅ΠΌ model_1.pb. Для ΠΏΠΎΠ»Π½ΠΎΡ‚Ρ‹ ΠΊΠ°Ρ€Ρ‚ΠΈΠ½Ρ‹ ΠΈ ΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‡ΠΈ всСй Π±ΠΎΠ»ΠΈ, прСдставим, Ρ‡Ρ‚ΠΎ Π²Ρ‹ Π΅Ρ‰Π΅ ΠΈ Π½Π°Ρ‡ΠΈΠ½Π°ΡŽΡ‰ΠΈΠΉ спСциалист.
  2. ИдСм дальшС. Для запуска ΠΊΠΎΠ΄Π° Π½Π°ΠΌ ΠΈ всСм ΠΊΡ‚ΠΎ Π±ΡƒΠ΄Π΅Ρ‚ с Π½ΠΈΠΌ Ρ€Π°Π±ΠΎΡ‚Π°Ρ‚ΡŒ Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ ΡΠΎΠ·Π΄Π°Ρ‚ΡŒ ΠΎΠΊΡ€ΡƒΠΆΠ΅Π½ΠΈΠ΅. Часто Π±Ρ‹Π²Π°Π΅Ρ‚, Ρ‡Ρ‚ΠΎ ΠΈ Π΅Π³ΠΎ Π½Π°ΠΌ Π² наслСдство Ρ‚Π°ΠΊΠΆΠ΅ ΠΏΠΎ ΠΊΠ°ΠΊΠΈΠΌ-Ρ‚ΠΎ ΠΏΡ€ΠΈΡ‡ΠΈΠ½Π°ΠΌ Π½Π΅ оставили. Π­Ρ‚ΠΎ Ρ‚ΠΎΠΆΠ΅ ΠΌΠΎΠΆΠ΅Ρ‚ ΡΡ‚Π°Ρ‚ΡŒ Π½Π΅Ρ‚Ρ€ΠΈΠ²ΠΈΠ°Π»ΡŒΠ½ΠΎΠΉ Π·Π°Π΄Π°Ρ‡Π΅ΠΉ. На этот шаг Π½Π΅ хочСтся Ρ‚Ρ€Π°Ρ‚ΠΈΡ‚ΡŒ врСмя, Π½Π΅ Ρ‚Π°ΠΊ Π»ΠΈ?
  3. Π’Ρ€Π΅Π½ΠΈΡ€ΡƒΠ΅ΠΌ модСль (Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, Π΄Π΅Ρ‚Π΅ΠΊΡ‚ΠΎΡ€ Π°Π²Ρ‚ΠΎΠΌΠΎΠ±ΠΈΠ»Π΅ΠΉ). Π”ΠΎΡ…ΠΎΠ΄ΠΈΠΌ Π΄ΠΎ ΠΌΠΎΠΌΠ΅Π½Ρ‚Π°, ΠΊΠΎΠ³Π΄Π° ΠΎΠ½Π° становится ΠΎΡ‡Π΅Π½ΡŒ Π΄Π°ΠΆΠ΅ Π½ΠΈΡ‡Π΅Π³ΠΎ β€” самоС врСмя ΡΠΎΡ…Ρ€Π°Π½ΠΈΡ‚ΡŒ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚. НазовСм Π΅Π΅ car_detection_v1.pb. ΠŸΠΎΡ‚ΠΎΠΌ Ρ‚Ρ€Π΅Π½ΠΈΡ€ΡƒΠ΅ΠΌ Π΅Ρ‰Π΅ ΠΎΠ΄Π½Ρƒ β€” car_detection_v2.pb. НСкотороС врСмя спустя наши ΠΊΠΎΠ»Π»Π΅Π³ΠΈ ΠΈΠ»ΠΈ ΠΌΡ‹ сами ΠΎΠ±ΡƒΡ‡Π°Π΅ΠΌ Π΅Ρ‰Ρ‘ ΠΈ Π΅Ρ‰Ρ‘, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡ Ρ€Π°Π·Π»ΠΈΡ‡Π½Ρ‹Π΅ Π°Ρ€Ρ…ΠΈΡ‚Π΅ΠΊΡ‚ΡƒΡ€Ρ‹. Π’ ΠΈΡ‚ΠΎΠ³Π΅ формируСтся ΠΊΡƒΡ‡Π° Π°Ρ€Ρ‚Π΅Ρ„Π°ΠΊΡ‚ΠΎΠ², ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΡŽ ΠΎ ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… Π½ΡƒΠΆΠ½ΠΎ ΠΊΡ€ΠΎΠΏΠΎΡ‚Π»ΠΈΠ²ΠΎ ΡΠΎΠ±ΠΈΡ€Π°Ρ‚ΡŒ (Π½ΠΎ, Π΄Π΅Π»Π°Ρ‚ΡŒ ΠΌΡ‹ это Π±ΡƒΠ΄Π΅ΠΌ ΠΏΠΎΠ·ΠΆΠ΅, Ρƒ нас вСдь ΠΏΠΎΠΊΠ° Π΅ΡΡ‚ΡŒ Π±ΠΎΠ»Π΅Π΅ ΠΏΡ€ΠΈΠΎΡ€ΠΈΡ‚Π΅Ρ‚Π½Ρ‹Π΅ Π΄Π΅Π»Π°).
  4. Ну Π²ΠΎΡ‚ ΠΈ всё! Π£ нас Π΅ΡΡ‚ΡŒ модСль! ΠœΡ‹ ΠΌΠΎΠΆΠ΅ΠΌ ΠΏΡ€ΠΈΡΡ‚ΡƒΠΏΠ°Ρ‚ΡŒ ΠΊ ΠΎΠ±ΡƒΡ‡Π΅Π½ΠΈΡŽ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅ΠΉ ΠΌΠΎΠ΄Π΅Π»ΠΈ, ΠΊ Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚ΠΊΠ΅ Π°Ρ€Ρ…ΠΈΡ‚Π΅ΠΊΡ‚ΡƒΡ€Ρ‹ для Ρ€Π΅ΡˆΠ΅Π½ΠΈΡ Π½ΠΎΠ²ΠΎΠΉ Π·Π°Π΄Π°Ρ‡ΠΈ ΠΈΠ»ΠΈ ΠΌΠΎΠΆΠ΅ΠΌ ΠΏΠΎΠΉΡ‚ΠΈ ΠΏΠΎΠΏΠΈΡ‚ΡŒ Ρ‡Π°ΠΉ? А Π΄Π΅ΠΏΠ»ΠΎΠΈΡ‚ΡŒ ΠΊΡ‚ΠΎ Π±ΡƒΠ΄Π΅Ρ‚?

ВыявляСм ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΡ‹

Π Π°Π±ΠΎΡ‚Π° Π½Π°Π΄ ΠΏΡ€ΠΎΠ΅ΠΊΡ‚ΠΎΠΌ ΠΈΠ»ΠΈ ΠΏΡ€ΠΎΠ΄ΡƒΠΊΡ‚ΠΎΠΌ β€” это Ρ‚Ρ€ΡƒΠ΄ ΠΌΠ½ΠΎΠ³ΠΈΡ… Ρ‡Π΅Π»ΠΎΠ²Π΅ΠΊ. А с Ρ‚Π΅Ρ‡Π΅Π½ΠΈΠ΅ΠΌ Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ люди уходят ΠΈ приходят, ΠΏΡ€ΠΎΠ΅ΠΊΡ‚ΠΎΠ² становится большС, сами ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Ρ‹ становятся слоТнСС. Π’Π°ΠΊ ΠΈΠ»ΠΈ ΠΈΠ½Π°Ρ‡Π΅, ситуации ΠΈΠ· описанного Π²Ρ‹ΡˆΠ΅ Ρ†ΠΈΠΊΠ»Π° (ΠΈ Π½Π΅ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ) Π² Ρ‚Π΅Ρ… ΠΈΠ»ΠΈ ΠΈΠ½Ρ‹Ρ… комбинациях Π±ΡƒΠ΄ΡƒΡ‚ Π²ΡΡ‚Ρ€Π΅Ρ‡Π°Ρ‚ΡŒΡΡ ΠΎΡ‚ ΠΈΡ‚Π΅Ρ€Π°Ρ†ΠΈΠΈ ΠΊ ΠΈΡ‚Π΅Ρ€Π°Ρ†ΠΈΠΈ. ВсС это выливаСтся Π² Ρ‚Ρ€Π°Ρ‚Ρƒ Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ, ΠΏΡƒΡ‚Π°Π½ΠΈΡ†Ρƒ, Π½Π΅Ρ€Π²Ρ‹, Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ β€” Π² Π½Π΅Π΄ΠΎΠ²ΠΎΠ»ΡŒΡΡ‚Π²ΠΎ Π·Π°ΠΊΠ°Π·Ρ‡ΠΈΠΊΠ°, ΠΈ Π² ΠΊΠΎΠ½Π΅Ρ‡Π½ΠΎΠΌ счСтС β€” Π² ΡƒΠΏΡƒΡ‰Π΅Π½Π½Ρ‹Π΅ дСньги. Π₯ΠΎΡ‚ΡŒ всС ΠΌΡ‹ ΠΎΠ±Ρ‹Ρ‡Π½ΠΎ Ρ…ΠΎΠ΄ΠΈΠΌ ΠΏΠΎ старым граблям, Π½ΠΎ полагаю, Ρ‡Ρ‚ΠΎ Π½ΠΈΠΊΡ‚ΠΎ ΠΏΡ€ΠΈ этом Π½Π΅ Ρ…ΠΎΡ‡Π΅Ρ‚ Ρ€Π°Π· Π·Π° Ρ€Π°Π·ΠΎΠΌ ΠΏΠ΅Ρ€Π΅ΠΆΠΈΠ²Π°Ρ‚ΡŒ эти ΠΌΠΎΠΌΠ΅Π½Ρ‚Ρ‹.

MLOps — Cook book, chapter 1

Π˜Ρ‚Π°ΠΊ, ΠΌΡ‹ ΠΏΡ€ΠΎΡˆΠ»ΠΈ ΠΏΠΎ ΠΎΠ΄Π½ΠΎΠΌΡƒ Ρ†ΠΈΠΊΠ»Ρƒ Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ ΠΈ Π²ΠΈΠ΄ΠΈΠΌ, Ρ‡Ρ‚ΠΎ Π΅ΡΡ‚ΡŒ ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΡ‹, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ Ρ€Π΅ΡˆΠΈΡ‚ΡŒ. Для этого Π½ΡƒΠΆΠ½ΠΎ:

  • ΡƒΠ΄ΠΎΠ±Π½ΠΎ Ρ…Ρ€Π°Π½ΠΈΡ‚ΡŒ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Ρ‹ Ρ€Π°Π±ΠΎΡ‚Ρ‹;
  • ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ простым процСсс вовлСчСния Π½ΠΎΠ²Ρ‹Ρ… сотрудников;
  • ΡƒΠΏΡ€ΠΎΡΡ‚ΠΈΡ‚ΡŒ процСсс развСртывания срСды Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ;
  • Π½Π°ΡΡ‚Ρ€ΠΎΠΈΡ‚ΡŒ процСсс вСрсионирования ΠΌΠΎΠ΄Π΅Π»Π΅ΠΉ;
  • ΠΈΠΌΠ΅Ρ‚ΡŒ ΡƒΠ΄ΠΎΠ±Π½Ρ‹ΠΉ способ Π²Π°Π»ΠΈΠ΄Π°Ρ†ΠΈΠΈ ΠΌΠΎΠ΄Π΅Π»Π΅ΠΉ;
  • Π½Π°ΠΉΡ‚ΠΈ инструмСнт управлСния состояниСм ΠΌΠΎΠ΄Π΅Π»Π΅ΠΉ;
  • Π½Π°ΠΉΡ‚ΠΈ способ доставки ΠΌΠΎΠ΄Π΅Π»Π΅ΠΉ Π² production.

Π’ΠΈΠ΄ΠΈΠΌΠΎ Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ ΠΏΡ€ΠΈΠ΄ΡƒΠΌΠ°Ρ‚ΡŒ workflow, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π±Ρ‹ позволял Π»Π΅Π³ΠΊΠΎ ΠΈ ΡƒΠ΄ΠΎΠ±Π½ΠΎ ΡƒΠΏΡ€Π°Π²Π»ΡΡ‚ΡŒ этим ΠΆΠΈΠ·Π½Π΅Π½Π½Ρ‹ΠΌ Ρ†ΠΈΠΊΠ»ΠΎΠΌ? Π£ Ρ‚Π°ΠΊΠΎΠΉ ΠΏΡ€Π°ΠΊΡ‚ΠΈΠΊΠΈ Π΅ΡΡ‚ΡŒ Π½Π°Π·Π²Π°Π½ΠΈΠ΅ MLOps

MLOps, ΠΈΠ»ΠΈ DevOps для машинного обучСния, позволяСт ΠΊΠΎΠΌΠ°Π½Π΄Π°ΠΌ спСциалистов ΠΏΠΎ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠ΅ ΠΈ Π°Π½Π°Π»ΠΈΠ·Ρƒ Π΄Π°Π½Π½Ρ‹Ρ… ΠΈ ИВ-спСциалистов ΡΠΎΡ‚Ρ€ΡƒΠ΄Π½ΠΈΡ‡Π°Ρ‚ΡŒ, Π° Ρ‚Π°ΠΊΠΆΠ΅ ΡƒΠ²Π΅Π»ΠΈΡ‡ΠΈΠ²Π°Ρ‚ΡŒ Ρ‚Π΅ΠΌΠΏΡ‹ Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ ΠΈ развСртывания ΠΌΠΎΠ΄Π΅Π»Π΅ΠΉ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ ΠΌΠΎΠ½ΠΈΡ‚ΠΎΡ€ΠΈΠ½Π³Π°, ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΠΈ ΠΈ систСмы управлСния для ΠΌΠΎΠ΄Π΅Π»Π΅ΠΉ машинного обучСния.

ΠœΠΎΠΆΠ΅Ρ‚Π΅ ΠΏΠΎΡ‡ΠΈΡ‚Π°Ρ‚ΡŒ, Ρ‡Ρ‚ΠΎ ΠΎΠ±ΠΎ всСм этом Π΄ΡƒΠΌΠ°ΡŽΡ‚ рСбята ΠΈΠ· Google. Из ΡΡ‚Π°Ρ‚ΡŒΠΈ понятно, Ρ‡Ρ‚ΠΎ MLOps, довольно, объСмная ΡˆΡ‚ΡƒΠΊΠ°.

MLOps — Cook book, chapter 1

Π”Π°Π»Π΅Π΅ Π² своСй ΡΡ‚Π°Ρ‚ΡŒΠ΅ я ΠΎΠΏΠΈΡˆΡƒ лишь Ρ‡Π°ΡΡ‚ΡŒ процСсса. Для Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ я Π²ΠΎΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡΡŒ инструмСнтом MLflow, Ρ‚.ΠΊ. это open-source ΠΏΡ€ΠΎΠ΅ΠΊΡ‚, для ΠΏΠΎΠ΄ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΡ Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ нСбольшоС количСство ΠΊΠΎΠ΄Π° ΠΈ Π΅ΡΡ‚ΡŒ интСграция с популярными ml-Ρ„Ρ€Π΅ΠΉΠΌΠ²ΠΎΡ€ΠΊΠ°ΠΌΠΈ. Π’Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ ΠΏΠΎΠΈΡΠΊΠ°Ρ‚ΡŒ Π½Π° просторах ΠΈΠ½Ρ‚Π΅Ρ€Π½Π΅Ρ‚Π° Π΄Ρ€ΡƒΠ³ΠΈΠ΅ инструмСнты, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€ Kubeflow, SageMaker, Trains ΠΈ Ρ‚.Π΄., ΠΈ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ, ΠΏΠΎΠ΄ΠΎΠ±Ρ€Π°Ρ‚ΡŒ Ρ‚ΠΎΡ‚, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π»ΡƒΡ‡ΡˆΠ΅ ΠΏΠΎΠ΄Ρ…ΠΎΠ΄ΠΈΡ‚ ΠΏΠΎΠ΄ ваши Π½ΡƒΠΆΠ΄Ρ‹.

"CΡ‚Ρ€ΠΎΠΈΠΌ" MLOps Π½Π° ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅ использования инструмСнта MLFlow

MLFlow β€” это ΠΏΠ»Π°Ρ‚Ρ„ΠΎΡ€ΠΌΠ° с ΠΎΡ‚ΠΊΡ€Ρ‹Ρ‚Ρ‹ΠΌ исходным ΠΊΠΎΠ΄ΠΎΠΌ для управлСния ΠΆΠΈΠ·Π½Π΅Π½Π½Ρ‹ΠΌ Ρ†ΠΈΠΊΠ»ΠΎΠΌ ml ΠΌΠΎΠ΄Π΅Π»Π΅ΠΉ (https://mlflow.org/).

MLflow Π²ΠΊΠ»ΡŽΡ‡Π°Π΅Ρ‚ Ρ‡Π΅Ρ‚Ρ‹Ρ€Π΅ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚Π°:

  • MLflow Tracking β€” Π·Π°ΠΊΡ€Ρ‹Π²Π°Π΅Ρ‚ вопросы фиксации Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ΠΎΠ² ΠΈ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΎΠ², ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΊ этому Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Ρƒ ΠΏΡ€ΠΈΠ²Π΅Π»ΠΈ;
  • MLflow Project β€” позволяСт ΡƒΠΏΠ°ΠΊΠΎΠ²Ρ‹Π²Π°Ρ‚ΡŒ ΠΊΠΎΠ΄ ΠΈ воспроизвСсти Π΅Π³ΠΎ Π½Π° любой ΠΏΠ»Π°Ρ‚Ρ„ΠΎΡ€ΠΌΠ΅;
  • MLflow Models β€” ΠΎΡ‚Π²Π΅Ρ‡Π°Π΅Ρ‚ Π·Π° Π΄Π΅ΠΏΠ»ΠΎΠΉ ΠΌΠΎΠ΄Π΅Π»Π΅ΠΉ Π² ΠΏΡ€ΠΎΠ΄;
  • MLflow Registry β€” позволяСт Ρ…Ρ€Π°Π½ΠΈΡ‚ΡŒ ΠΌΠΎΠ΄Π΅Π»ΠΈ ΠΈ ΡƒΠΏΡ€Π°Π²Π»ΡΡ‚ΡŒ ΠΈΡ… состояниСм Π² Ρ†Π΅Π½Ρ‚Ρ€Π°Π»ΠΈΠ·ΠΎΠ²Π°Π½Π½ΠΎΠΌ Ρ…Ρ€Π°Π½ΠΈΠ»ΠΈΡ‰Π΅.

MLflow ΠΎΠΏΠ΅Ρ€ΠΈΡ€ΡƒΠ΅Ρ‚ двумя сущностями:

  • запуск β€” это ΠΏΠΎΠ»Π½Ρ‹ΠΉ Ρ†ΠΈΠΊΠ» обучСния, ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Ρ‹ ΠΈ ΠΌΠ΅Ρ‚Ρ€ΠΈΠΊΠΈ ΠΏΠΎ ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΌ ΠΌΡ‹ Ρ…ΠΎΡ‚ΠΈΠΌ Ρ€Π΅Π³ΠΈΡΡ‚Ρ€ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ;
  • экспСримСнт β€” это β€œΡ‚Π΅ΠΌΠ°β€ ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΉ ΠΎΠ±ΡŠΠ΅Π΄ΠΈΠ½Π΅Π½Ρ‹ запуски.

ВсС шаги ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π° Ρ€Π΅Π°Π»ΠΈΠ·ΠΎΠ²Π°Π½Ρ‹ Π½Π° ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΎΠ½Π½ΠΎΠΉ систСмС Ubuntu 18.04.

1. Π Π°Π·Π²ΠΎΡ€Π°Ρ‡ΠΈΠ²Π°Π΅ΠΌ сСрвСр

Для Ρ‚ΠΎΠ³ΠΎ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΌΡ‹ ΠΌΠΎΠ³Π»ΠΈ Π»Π΅Π³ΠΊΠΎ ΡƒΠΏΡ€Π°Π²Π»ΡΡ‚ΡŒ нашим ΠΏΡ€ΠΎΠ΅ΠΊΡ‚ΠΎΠΌ ΠΈ ΠΏΠΎΠ»ΡƒΡ‡Π°Ρ‚ΡŒ всю Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΡƒΡŽ ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΡŽ, Ρ€Π°Π·Π²Π΅Ρ€Π½Π΅ΠΌ сСрвСр. MLflow tracking server ΠΈΠΌΠ΅Π΅Ρ‚ Π΄Π²Π° основных ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚Π°:

  • backend store β€” ΠΎΡ‚Π²Π΅Ρ‡Π°Π΅Ρ‚ Π·Π° Ρ…Ρ€Π°Π½Π΅Π½ΠΈΠ΅ ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΠΈ ΠΎ зарСгистрированных модСлях (ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°Π΅Ρ‚ 4 Π‘Π£Π‘Π”: mysql, mssql, sqlite, and postgresql);
  • artifact store β€” ΠΎΡ‚Π²Π΅Ρ‡Π°Π΅Ρ‚ Π·Π° Ρ…Ρ€Π°Π½Π΅Π½ΠΈΠ΅ Π°Ρ€Ρ‚Π΅Ρ„Π°ΠΊΡ‚ΠΎΠ² (ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°Π΅Ρ‚ 7 Π²Π°Ρ€ΠΈΠ°Π½Ρ‚ΠΎΠ² хранСния: Amazon S3, Azure Blob Storage, Google Cloud Storage, FTP server, SFTP Server, NFS, HDFS).

Π’ качСствС artifact store для простоты возьмСм sftp сСрвСр.

  • создаСм Π³Ρ€ΡƒΠΏΠΏΡƒ
    $ sudo groupadd sftpg
  • добавляСм ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Ρ ΠΈ устанавливаСм Π΅ΠΌΡƒ ΠΏΠ°Ρ€ΠΎΠ»ΡŒ
    $ sudo useradd -g sftpg mlflowsftp
    $ sudo passwd mlflowsftp 
  • ΠΊΠΎΡ€Ρ€Π΅ΠΊΡ‚ΠΈΡ€ΡƒΠ΅ΠΌ ΠΏΠ°Ρ€Ρƒ настроСк доступа
    $ sudo mkdir -p /data/mlflowsftp/upload
    $ sudo chown -R root.sftpg /data/mlflowsftp
    $ sudo chown -R mlflowsftp.sftpg /data/mlflowsftp/upload
  • добавляСм нСсколько строк Π² /etc/ssh/sshd_config
    Match Group sftpg
     ChrootDirectory /data/%u
     ForceCommand internal-sftp
  • пСрСзапускаСм слуТбу
    $ sudo systemctl restart sshd

Π’ качСствС backend store возьмСм postgresql.

$ sudo apt update
$ sudo apt-get install -y postgresql postgresql-contrib postgresql-server-dev-all
$ sudo apt install gcc
$ pip install psycopg2
$ sudo -u postgres -i
# Create new user: mlflow_user
[postgres@user_name~]$ createuser --interactive -P
Enter name of role to add: mlflow_user
Enter password for new role: mlflow
Enter it again: mlflow
Shall the new role be a superuser? (y/n) n
Shall the new role be allowed to create databases? (y/n) n
Shall the new role be allowed to create more new roles? (y/n) n
# Create database mlflow_bd owned by mlflow_user
$ createdb -O mlflow_user mlflow_db

Для запуска сСрвСра Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ ΡƒΡΡ‚Π°Π½ΠΎΠ²ΠΈΡ‚ΡŒ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠ΅ python ΠΏΠ°ΠΊΠ΅Ρ‚Ρ‹ (ΡΠΎΠ²Π΅Ρ‚ΡƒΡŽ ΡΠΎΠ·Π΄Π°Ρ‚ΡŒ ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½ΠΎΠ΅ Π²ΠΈΡ€Ρ‚ΡƒΠ°Π»ΡŒΠ½ΠΎΠ΅ ΠΎΠΊΡ€ΡƒΠΆΠ΅Π½ΠΈΠ΅):

pip install mlflow
pip install pysftp

ЗапускаСм наш сСрвСр

$ mlflow server  
                 --backend-store-uri postgresql://mlflow_user:mlflow@localhost/mlflow_db 
                 --default-artifact-root sftp://mlflowsftp:mlflow@sftp_host/upload  
                --host server_host 
                --port server_port

2. ДобавляСм Ρ‚Ρ€Π΅ΠΊΠΈΠ½Π³

Для Ρ‚ΠΎΠ³ΠΎ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Ρ‹ Π½Π°ΡˆΠΈΡ… Ρ‚Ρ€Π΅Π½ΠΈΡ€ΠΎΠ²ΠΎΠΊ Π½Π΅ ΠΏΡ€ΠΎΠΏΠ°Π»ΠΈ, Π±ΡƒΠ΄ΡƒΡ‰ΠΈΠ΅ поколСния Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠΎΠ² ΠΏΠΎΠ½ΠΈΠΌΠ°Π»ΠΈ, Ρ‡Ρ‚ΠΎ Π²ΠΎΠΎΠ±Ρ‰Π΅ происходило, Π° ΡΡ‚Π°Ρ€ΡˆΠΈΠ΅ Ρ‚ΠΎΠ²Π°Ρ€ΠΈΡ‰ΠΈ ΠΈ Π²Ρ‹ ΠΌΠΎΠ³Π»ΠΈ спокойно Π°Π½Π°Π»ΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ процСсс обучСния, Π½Π°ΠΌ Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ Π΄ΠΎΠ±Π°Π²ΠΈΡ‚ΡŒ Ρ‚Ρ€Π΅ΠΊΠΈΠ½Π³. Под Ρ‚Ρ€Π΅ΠΊΠΈΠ½Π³ΠΎΠΌ подразумСваСтся сохранСниС ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΎΠ², ΠΌΠ΅Ρ‚Ρ€ΠΈΠΊ, Π°Ρ€Ρ‚Π΅Ρ„Π°ΠΊΡ‚ΠΎΠ² ΠΈ любой Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΠΉ ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΠΈ ΠΎ запускС обучСния, Π² нашСм случаС, Π½Π° сСрвСрС.

Для ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π° я создал нСбольшой ΠΏΡ€ΠΎΠ΅ΠΊΡ‚ Π½Π° github Π½Π° Keras ΠΏΠΎ сСгмСнтации всСго, Ρ‡Ρ‚ΠΎ Π΅ΡΡ‚ΡŒ Π² COCO датасСтС. Для добавлСния Ρ‚Ρ€Π΅ΠΊΠΈΠ½Π³Π° я создал Ρ„Π°ΠΉΠ» mlflow_training.py.

Π’ΠΎΡ‚ строки, Π² ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… происходит самоС интСрСсноС:

def run(self, epochs, lr, experiment_name):
        # getting the id of the experiment, creating an experiment in its absence
        remote_experiment_id = self.remote_server.get_experiment_id(name=experiment_name)
        # creating a "run" and getting its id
        remote_run_id = self.remote_server.get_run_id(remote_experiment_id)

        # indicate that we want to save the results on a remote server
        mlflow.set_tracking_uri(self.tracking_uri)
        mlflow.set_experiment(experiment_name)

        with mlflow.start_run(run_id=remote_run_id, nested=False):
            mlflow.keras.autolog()
            self.train_pipeline.train(lr=lr, epochs=epochs)

        try:
            self.log_tags_and_params(remote_run_id)
        except mlflow.exceptions.RestException as e:
            print(e)

Π—Π΄Π΅ΡΡŒ self.remote_server это нСбольшая обвязка Π½Π°Π΄ ΠΌΠ΅Ρ‚ΠΎΠ΄Π°ΠΌΠΈ mlflow.tracking. MlflowClient (я сдСлал для удобства), с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… я создаю экспСримСнт ΠΈ запуск Π½Π° сСрвСрС. Π”Π°Π»Π΅Π΅ ΡƒΠΊΠ°Π·Ρ‹Π²Π°ΡŽ ΠΊΡƒΠ΄Π° Π΄ΠΎΠ»ΠΆΠ½Ρ‹ ΡΠ»ΠΈΠ²Π°Ρ‚ΡŒΡΡ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Ρ‹ запуска (mlflow.set_tracking_uri(self.tracking_uri)). ΠŸΠΎΠ΄ΠΊΠ»ΡŽΡ‡Π°ΡŽ автоматичСскоС Π»ΠΎΠ³ΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ mlflow.keras.autolog(). На Π΄Π°Π½Π½Ρ‹ΠΉ ΠΌΠΎΠΌΠ΅Π½Ρ‚ MLflow Tracking ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°Π΅Ρ‚ автоматичСскоС Π»ΠΎΠ³ΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ для TensorFlow, Keras, Gluon XGBoost, LightGBM, Spark. Если Π²Ρ‹ Π½Π΅ нашли своСго Ρ„Ρ€Π΅ΠΉΠΌΠ²ΠΎΡ€ΠΊΠ° ΠΈΠ»ΠΈ Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΈ, Ρ‚ΠΎ Π²Ρ‹ всСгда ΠΌΠΎΠΆΠ΅Ρ‚Π΅ Π»ΠΎΠ³ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ Π² явном Π²ΠΈΠ΄Π΅. ЗапускаСм ΠΎΠ±ΡƒΡ‡Π΅Π½ΠΈΠ΅. РСгистрируСм Ρ‚Π΅Π³ΠΈ ΠΈ Π²Ρ…ΠΎΠ΄Π½Ρ‹Π΅ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Ρ‹ Π½Π° ΡƒΠ΄Π°Π»Π΅Π½Π½ΠΎΠΌ сСрвСрС.

ΠŸΠ°Ρ€Π° строк ΠΈ Π²Ρ‹, ΠΊΠ°ΠΊ ΠΈ всС ΠΆΠ΅Π»Π°ΡŽΡ‰ΠΈΠ΅, ΠΈΠΌΠ΅Π΅Ρ‚Π΅ доступ ΠΊ ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΠΈ ΠΎ всСх запусках. ΠšΡ€ΡƒΡ‚ΠΎ?

3. ΠžΡ„ΠΎΡ€ΠΌΠ»ΡΠ΅ΠΌ ΠΏΡ€ΠΎΠ΅ΠΊΡ‚

Π’Π΅ΠΏΠ΅Ρ€ΡŒ сдСлаСм Ρ‚Π°ΠΊ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ Π·Π°ΠΏΡƒΡΡ‚ΠΈΡ‚ΡŒ ΠΏΡ€ΠΎΠ΅ΠΊΡ‚ Π±Ρ‹Π»ΠΎ ΠΏΡ€ΠΎΡ‰Π΅ простого. Для этого Π΄ΠΎΠ±Π°Π²ΠΈΠΌ Π² ΠΊΠΎΡ€Π΅Π½ΡŒ ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π° Ρ„Π°ΠΉΠ» MLproject ΠΈ conda.yaml.
MLproject

name: flow_segmentation
conda_env: conda.yaml

entry_points:
  main:
    parameters:
        categories: {help: 'list of categories from coco dataset'}
        epochs: {type: int, help: 'number of epochs in training'}

        lr: {type: float, default: 0.001, help: 'learning rate'}
        batch_size: {type: int, default: 8}
        model_name: {type: str, default: 'Unet', help: 'Unet, PSPNet, Linknet, FPN'}
        backbone_name: {type: str, default: 'resnet18', help: 'exampe resnet18, resnet50, mobilenetv2 ...'}

        tracking_uri: {type: str, help: 'the server address'}
        experiment_name: {type: str, default: 'My_experiment', help: 'remote and local experiment name'}
    command: "python mlflow_training.py 
            --epochs={epochs}
            --categories={categories}
            --lr={lr}
            --tracking_uri={tracking_uri}
            --model_name={model_name}
            --backbone_name={backbone_name}
            --batch_size={batch_size}
            --experiment_name={experiment_name}"

MLflow Project ΠΈΠΌΠ΅Π΅Ρ‚ нСсколько свойств:

  • Name β€” имя вашСго ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π°;
  • Environment β€” Π² ΠΌΠΎΠ΅ΠΌ случаС conda_env ΡƒΠΊΠ°Π·Ρ‹Π²Π°Π΅Ρ‚ Π½Π° Ρ‚ΠΎ, Ρ‡Ρ‚ΠΎ для запуска ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ Anaconda ΠΈ описаниС зависимостСй находится Π² Ρ„Π°ΠΉΠ»Π΅ conda.yaml;
  • Entry Points β€” ΡƒΠΊΠ°Π·Ρ‹Π²Π°Π΅Ρ‚ ΠΊΠ°ΠΊΠΈΠ΅ Ρ„Π°ΠΉΠ»Ρ‹ ΠΈ с ΠΊΠ°ΠΊΠΈΠΌΠΈ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Π°ΠΌΠΈ ΠΌΡ‹ ΠΌΠΎΠΆΠ΅ΠΌ Π·Π°ΠΏΡƒΡΡ‚ΠΈΡ‚ΡŒ (всС ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Ρ‹ ΠΏΡ€ΠΈ запускС обучСния автоматичСски Π»ΠΎΠ³ΠΈΡ€ΡƒΡŽΡ‚ΡΡ)

conda.yaml

name: flow_segmentation
channels:
  - defaults
  - anaconda
dependencies:
  - python==3.7
  - pip:
    - mlflow==1.8.0
    - pysftp==0.2.9
    - Cython==0.29.19
    - numpy==1.18.4
    - pycocotools==2.0.0
    - requests==2.23.0
    - matplotlib==3.2.1
    - segmentation-models==1.0.1
    - Keras==2.3.1
    - imgaug==0.4.0
    - tqdm==4.46.0
    - tensorflow-gpu==1.14.0

Π’ качСствС срСды исполнСния Π²Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ docker, Π·Π° Π±ΠΎΠ»Π΅Π΅ ΠΏΠΎΠ΄Ρ€ΠΎΠ±Π½ΠΎΠΉ ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΠ΅ΠΉ ΠΎΠ±Ρ€Π°Ρ‚ΠΈΡ‚Π΅ΡΡŒ ΠΊ Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚Π°Ρ†ΠΈΠΈ.

4. ЗапускаСм ΠΎΠ±ΡƒΡ‡Π΅Π½ΠΈΠ΅

ΠšΠ»ΠΎΠ½ΠΈΡ€ΡƒΠ΅ΠΌ ΠΏΡ€ΠΎΠ΅ΠΊΡ‚ ΠΈ ΠΏΠ΅Ρ€Π΅Ρ…ΠΎΠ΄ΠΈΠΌ Π² Π΄ΠΈΡ€Π΅ΠΊΡ‚ΠΎΡ€ΠΈΡŽ ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π°:

git clone https://github.com/simbakot/mlflow_example.git
cd mlflow_example/

Для запуска Π²Π°ΠΌ Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ ΡƒΡΡ‚Π°Π½ΠΎΠ²ΠΈΡ‚ΡŒ Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΈ

pip install mlflow
pip install pysftp

Π’.ΠΊ. Π² ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅ я ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽ conda_env Π½Π° вашСм ΠΊΠΎΠΌΠΏΡŒΡŽΡ‚Π΅Ρ€Π΅ Π΄ΠΎΠ»ΠΆΠ½Π° Π±Ρ‹Ρ‚ΡŒ установлСна Anaconda (Π½ΠΎ ΠΈ это ΠΌΠΎΠΆΠ½ΠΎ ΠΎΠ±ΠΎΠΉΡ‚ΠΈ установив всС Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΡ‹Π΅ ΠΏΠ°ΠΊΠ΅Ρ‚Ρ‹ ΡΠ°ΠΌΠΎΡΡ‚ΠΎΡΡ‚Π΅Π»ΡŒΠ½ΠΎ ΠΈ ΠΏΠΎΠΈΠ³Ρ€Π°Π²ΡˆΠΈΡΡŒ с ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Π°ΠΌΠΈ запуска).

ВсС ΠΏΠΎΠ΄Π³ΠΎΡ‚ΠΎΠ²ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹Π΅ шаги Π·Π°ΠΊΠΎΠ½Ρ‡Π΅Π½Ρ‹ ΠΈ ΠΌΡ‹ ΠΌΠΎΠΆΠ΅ΠΌ ΠΏΡ€ΠΈΡΡ‚ΡƒΠΏΠΈΡ‚ΡŒ ΠΊ запуску обучСния. Из корня ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π°:

$ mlflow run -P epochs=10 -P categories=cat,dog -P tracking_uri=http://server_host:server_port .

ПослС Π²Π²ΠΎΠ΄Π° ΠΊΠΎΠΌΠ°Π½Π΄Ρ‹ автоматичСски создастся conda ΠΎΠΊΡ€ΡƒΠΆΠ΅Π½ΠΈΠ΅ ΠΈ запустится Ρ‚Ρ€Π΅Π½ΠΈΡ€ΠΎΠ²ΠΊΠ°.
Π’ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅ Π²Ρ‹ΡˆΠ΅ я ΠΏΠ΅Ρ€Π΅Π΄Π°Π» количСство эпох для обучСния, ΠΊΠ°Ρ‚Π΅Π³ΠΎΡ€ΠΈΠΈ Π½Π° ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΌΡ‹ Ρ…ΠΎΡ‚ΠΈΠΌ ΡΠ΅Π³ΠΌΠ΅Π½Ρ‚ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ (ΠΏΠΎΠ»Π½Ρ‹ΠΉ список ΠΌΠΎΠΆΠ½ΠΎ ΠΏΠΎΡΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ здСсь) ΠΈ адрСс нашСго ΡƒΠ΄Π°Π»Π΅Π½Π½ΠΎΠ³ΠΎ сСрвСра.
ΠŸΠΎΠ»Π½Ρ‹ΠΉ список Π²ΠΎΠ·ΠΌΠΎΠΆΠ½Ρ‹Ρ… ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΎΠ² ΠΌΠΎΠΆΠ½ΠΎ ΠΏΠΎΡΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ Π² Ρ„Π°ΠΉΠ»Π΅ MLproject.

5. ΠžΡ†Π΅Π½ΠΈΠ²Π°Π΅ΠΌ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Ρ‹ обучСния

ПослС окончания обучСния ΠΌΡ‹ ΠΌΠΎΠΆΠ΅ΠΌ ΠΏΠ΅Ρ€Π΅ΠΉΡ‚ΠΈ Π² Π±Ρ€Π°ΡƒΠ·Π΅Ρ€Π΅ ΠΏΠΎ адрСсу нашСго сСрвСра http://server_host:server_port

MLOps — Cook book, chapter 1

Π—Π΄Π΅ΡΡŒ ΠΌΡ‹ Π²ΠΈΠ΄ΠΈΠΌ список всСх экспСримСнтов (слСва Π²Π²Π΅Ρ€Ρ…Ρƒ), Π° Ρ‚Π°ΠΊΠΆΠ΅ ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΡŽ ΠΏΠΎ запускам (посСрСдинС). ΠœΡ‹ ΠΌΠΎΠΆΠ΅ΠΌ ΠΏΠΎΡΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ Π±ΠΎΠ»Π΅Π΅ ΠΏΠΎΠ΄Ρ€ΠΎΠ±Π½ΡƒΡŽ ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΡŽ (ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Ρ‹, ΠΌΠ΅Ρ‚Ρ€ΠΈΠΊΠΈ, Π°Ρ€Ρ‚Π΅Ρ„Π°ΠΊΡ‚Ρ‹ ΠΈ ΠΊΠ°ΠΊΡƒΡŽ-Ρ‚ΠΎ Π΄ΠΎΠΏ. ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΡŽ) ΠΏΠΎ ΠΊΠ°ΠΆΠ΄ΠΎΠΌΡƒ запуску.

MLOps — Cook book, chapter 1

По ΠΊΠ°ΠΆΠ΄ΠΎΠΉ ΠΌΠ΅Ρ‚Ρ€ΠΈΠΊΠ΅ ΠΌΡ‹ ΠΌΠΎΠΆΠ΅ΠΌ Π½Π°Π±Π»ΡŽΠ΄Π°Ρ‚ΡŒ ΠΈΡΡ‚ΠΎΡ€ΠΈΡŽ измСнСния

MLOps — Cook book, chapter 1

Π’.Π΅. Π½Π° Π΄Π°Π½Π½Ρ‹ΠΉ ΠΌΠΎΠΌΠ΅Π½Ρ‚ ΠΌΡ‹ ΠΌΠΎΠΆΠ΅ΠΌ Π°Π½Π°Π»ΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Ρ‹ Π² "Ρ€ΡƒΡ‡Π½ΠΎΠΌ" Ρ€Π΅ΠΆΠΈΠΌΠ΅, Ρ‚Π°ΠΊΠΆΠ΅ Π²Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ Π½Π°ΡΡ‚Ρ€ΠΎΠΈΡ‚ΡŒ ΠΈ Π°Π²Ρ‚ΠΎΠΌΠ°Ρ‚ΠΈΡ‡Π΅ΡΠΊΡƒΡŽ Π²Π°Π»ΠΈΠ΄Π°Ρ†ΠΈΡŽ ΠΏΡ€ΠΈ ΠΏΠΎΠΌΠΎΡ‰ΠΈ MLflow API.

6. РСгистрируСм модСль

ПослС Ρ‚ΠΎΠ³ΠΎ ΠΊΠ°ΠΊ ΠΌΡ‹ ΠΏΡ€ΠΎΠ°Π½Π°Π»ΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Π»ΠΈ Π½Π°ΡˆΡƒ модСль ΠΈ Ρ€Π΅ΡˆΠΈΠ»ΠΈ, Ρ‡Ρ‚ΠΎ ΠΎΠ½Π° Π³ΠΎΡ‚ΠΎΠ²Π° ΠΊ бою, приступаСм ΠΊ Π΅Π΅ рСгистрации для этого Π²Ρ‹Π±ΠΈΡ€Π°Π΅ΠΌ Π½ΡƒΠΆΠ½Ρ‹ΠΉ Π½Π°ΠΌ запуск (ΠΊΠ°ΠΊ ΠΏΠΎΠΊΠ°Π·Π°Π½ΠΎ Π² ΠΏΡ€Π΅Π΄Ρ‹Π΄ΡƒΡ‰Π΅ΠΌ ΠΏΡƒΠ½ΠΊΡ‚Π΅) ΠΈ ΠΈΠ΄Π΅ΠΌ Π²Π½ΠΈΠ·.

MLOps — Cook book, chapter 1

ПослС Ρ‚ΠΎΠ³ΠΎ ΠΊΠ°ΠΊ ΠΌΡ‹ Π΄Π°Π»ΠΈ имя нашСй ΠΌΠΎΠ΄Π΅Π»ΠΈ, Ρƒ Π½Π΅Π΅ появляСтся вСрсия. ΠŸΡ€ΠΈ сохранСнии Π΄Ρ€ΡƒΠ³ΠΎΠΉ ΠΌΠΎΠ΄Π΅Π»ΠΈ с этим ΠΆΠ΅ ΠΈΠΌΠ΅Π½Π΅ΠΌ, вСрсия автоматичСски повысится.

MLOps — Cook book, chapter 1

Для ΠΊΠ°ΠΆΠ΄ΠΎΠΉ ΠΌΠΎΠ΄Π΅Π»ΠΈ ΠΌΡ‹ ΠΌΠΎΠΆΠ΅ΠΌ Π΄ΠΎΠ±Π°Π²ΠΈΡ‚ΡŒ описаниС ΠΈ Π²Ρ‹Π±Ρ€Π°Ρ‚ΡŒ ΠΎΠ΄Π½ΠΎ ΠΈΠ· Ρ‚Ρ€Π΅Ρ… состояний (Staging, Production, Archived), впослСдствии ΠΌΡ‹ ΠΏΡ€ΠΈ ΠΏΠΎΠΌΠΎΡ‰ΠΈ api ΠΌΠΎΠΆΠ΅ΠΌ ΠΎΠ±Ρ€Π°Ρ‰Π°Ρ‚ΡŒΡΡ ΠΊ этим состояниям, Ρ‡Ρ‚ΠΎ Π½Π° ряду с вСрсионированиСм Π΄Π°Π΅Ρ‚ Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½ΡƒΡŽ Π³ΠΈΠ±ΠΊΠΎΡΡ‚ΡŒ.

MLOps — Cook book, chapter 1

Π£ нас Ρ‚Π°ΠΊΠΆΠ΅ имССтся ΡƒΠ΄ΠΎΠ±Π½Ρ‹ΠΉ доступ ΠΊΠΎ всСм модСлям

MLOps — Cook book, chapter 1

ΠΈ ΠΈΡ… вСрсиям

MLOps — Cook book, chapter 1

Как ΠΈ Π² ΠΏΡ€Π΅Π΄Ρ‹Π΄ΡƒΡ‰Π΅ΠΌ ΠΏΡƒΠ½ΠΊΡ‚Π΅ всС ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ ΠΌΠΎΠΆΠ½ΠΎ ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ ΠΏΡ€ΠΈ ΠΏΠΎΠΌΠΎΡ‰ΠΈ API.

7. Π”Π΅ΠΏΠ»ΠΎΠΈΠΌ модСль

На Π΄Π°Π½Π½ΠΎΠΌ этапС Ρƒ нас ΡƒΠΆΠ΅ Π΅ΡΡ‚ΡŒ натрСнированная (keras) модСль. ΠŸΡ€ΠΈΠΌΠ΅Ρ€, ΠΊΠ°ΠΊ ΠΌΠΎΠΆΠ½ΠΎ Π΅Ρ‘ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ:

class SegmentationModel:
    def __init__(self, tracking_uri, model_name):

        self.registry = RemoteRegistry(tracking_uri=tracking_uri)
        self.model_name = model_name
        self.model = self.build_model(model_name)

    def get_latest_model(self, model_name):
        registered_models = self.registry.get_registered_model(model_name)
        last_model = self.registry.get_last_model(registered_models)
        local_path = self.registry.download_artifact(last_model.run_id, 'model', './')
        return local_path

    def build_model(self, model_name):
        local_path = self.get_latest_model(model_name)

        return mlflow.keras.load_model(local_path)

    def predict(self, image):
        image = self.preprocess(image)
        result = self.model.predict(image)
        return self.postprocess(result)

    def preprocess(self, image):
        image = cv2.resize(image, (256, 256))
        image = image / 255.
        image = np.expand_dims(image, 0)
        return image

    def postprocess(self, result):
        return result

Π—Π΄Π΅ΡΡŒ self.registry это ΠΎΠΏΡΡ‚ΡŒ нСбольшая обвязка Π½Π°Π΄ mlflow.tracking.MlflowClient, для удобства. Π‘ΡƒΡ‚ΡŒ Π² Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎ я ΠΎΠ±Ρ€Π°Ρ‰Π°ΡŽΡΡŒ ΠΊ ΡƒΠ΄Π°Π»Π΅Π½Π½ΠΎΠΌΡƒ сСрвСру ΠΈ ΠΈΡ‰Ρƒ Ρ‚Π°ΠΌ модСль с ΡƒΠΊΠ°Π·Π°Π½Π½Ρ‹ΠΌ ΠΈΠΌΠ΅Π½Π΅ΠΌ, ΠΏΡ€ΠΈΡ‡Π΅ΠΌ, ΡΠ°ΠΌΡƒΡŽ послСднюю production Π²Π΅Ρ€ΡΠΈΡŽ. Π”Π°Π»Π΅Π΅ ΡΠΊΠ°Ρ‡ΠΈΠ²Π°ΡŽ Π°Ρ€Ρ‚Π΅Ρ„Π°ΠΊΡ‚ локально Π² ΠΏΠ°ΠΏΠΊΡƒ ./model ΠΈ ΡΠΎΠ±ΠΈΡ€Π°ΡŽ модСль ΠΈΠ· этой Π΄ΠΈΡ€Π΅ΠΊΡ‚ΠΎΡ€ΠΈΠΈ mlflow.keras.load_model(local_path). Всё Ρ‚Π΅ΠΏΠ΅Ρ€ΡŒ ΠΌΡ‹ ΠΌΠΎΠΆΠ΅ΠΌ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Π½Π°ΡˆΡƒ модСль. CV (ML) Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠΈ ΠΌΠΎΠ³ΡƒΡ‚ спокойно Π·Π°Π½ΠΈΠΌΠ°Ρ‚ΡŒΡΡ ΡƒΠ»ΡƒΡ‡ΡˆΠ΅Π½ΠΈΠ΅ΠΌ ΠΌΠΎΠ΄Π΅Π»ΠΈ ΠΈ ΠΏΡƒΠ±Π»ΠΈΠΊΠΎΠ²Π°Ρ‚ΡŒ Π½ΠΎΠ²Ρ‹Π΅ вСрсии.

Π’ Π·Π°ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅

Π― прСдставил систСму которая позволяСт:

  • Ρ†Π΅Π½Ρ‚Ρ€Π°Π»ΠΈΠ·ΠΎΠ²Π°Π½Π½ΠΎ Ρ…Ρ€Π°Π½ΠΈΡ‚ΡŒ ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΡŽ ΠΎ ML модСлях, Ρ…ΠΎΠ΄Π΅ ΠΈ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Π°Ρ… обучСния;
  • быстро Ρ€Π°Π·Π²Π΅Ρ€Ρ‚Ρ‹Π²Π°Ρ‚ΡŒ срСду Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ;
  • ΡΠ»Π΅Π΄ΠΈΡ‚ΡŒ ΠΈ Π°Π½Π°Π»ΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ Ρ…ΠΎΠ΄ Ρ€Π°Π±ΠΎΡ‚Ρ‹ Π½Π°Π΄ модСлями;
  • ΡƒΠ΄ΠΎΠ±Π½ΠΎ вСсти вСрсионированиС ΠΈ ΡƒΠΏΡ€Π°Π²Π»ΡΡ‚ΡŒ состояниСм ΠΌΠΎΠ΄Π΅Π»Π΅ΠΉ;
  • Π»Π΅Π³ΠΊΠΎ Π΄Π΅ΠΏΠ»ΠΎΠΈΡ‚ΡŒ ΠΏΠΎΠ»ΡƒΡ‡Π΅Π½Π½Ρ‹Π΅ ΠΌΠΎΠ΄Π΅Π»ΠΈ.

Π”Π°Π½Π½Ρ‹ΠΉ ΠΏΡ€ΠΈΠΌΠ΅Ρ€ являСтся ΠΈΠ³Ρ€ΡƒΡˆΠ΅Ρ‡Π½Ρ‹ΠΌ ΠΈ слуТит Ρ‚ΠΎΡ‡ΠΊΠΎΠΉ старта для выстраивания вашСй собствСнной систСмы, которая, Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ, Π±ΡƒΠ΄Π΅Ρ‚ Π²ΠΊΠ»ΡŽΡ‡Π°Ρ‚ΡŒ Π² сСбя Π°Π²Ρ‚ΠΎΠΌΠ°Ρ‚ΠΈΠ·Π°Ρ†ΠΈΡŽ ΠΎΡ†Π΅Π½ΠΊΠΈ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ΠΎΠ² ΠΈ рСгистрации ΠΌΠΎΠ΄Π΅Π»Π΅ΠΉ (ΠΏ.5 ΠΈ ΠΏ.6 соотвСтствСнно) ΠΈΠ»ΠΈ Π²Ρ‹ Π΄ΠΎΠ±Π°Π²ΠΈΡ‚Π΅ вСрсионированиС датасСтов, ΠΈΠ»ΠΈ ΠΌΠΎΠΆΠ΅Ρ‚ Π΅Ρ‰Ρ‘ Ρ‡Ρ‚ΠΎ-Ρ‚ΠΎ? Π― пытался донСсти ΠΌΡ‹ΡΠ»ΡŒ, Ρ‡Ρ‚ΠΎ Π²Π°ΠΌ Π½ΡƒΠΆΠ΅Π½ MLOps Π² Ρ†Π΅Π»ΠΎΠΌ, MLflow лишь срСдство достиТСния Ρ†Π΅Π»ΠΈ.

ΠΠ°ΠΏΠΈΡˆΠΈΡ‚Π΅ ΠΊΠ°ΠΊΠΈΠ΅ ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΡ‹, с ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΌΠΈ Π²Ρ‹ ΡΡ‚Π°Π»ΠΊΠΈΠ²Π°Π»ΠΈΡΡŒ, я Π½Π΅ ΠΎΡ‚ΠΎΠ±Ρ€Π°Π·ΠΈΠ»?
Π§Ρ‚ΠΎ Π±Ρ‹ Π²Ρ‹ Π΄ΠΎΠ±Π°Π²ΠΈΠ»ΠΈ Π² систСму, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΎΠ½Π° Π·Π°ΠΊΡ€Ρ‹Π²Π°Π»Π° ваши потрСбности?
КакиС инструмСнты ΠΈ ΠΏΠΎΠ΄Ρ…ΠΎΠ΄Ρ‹ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚Π΅ Π²Ρ‹, Ρ‡Ρ‚ΠΎΠ±Ρ‹ Π·Π°ΠΊΡ€Ρ‹Ρ‚ΡŒ всС ΠΈΠ»ΠΈ Ρ‡Π°ΡΡ‚ΡŒ ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌ?

P.S. ΠžΡΡ‚Π°Π²Π»ΡŽ ΠΏΠ°Ρ€Ρƒ ссылок:
github ΠΏΡ€ΠΎΠ΅ΠΊΡ‚ β€” https://github.com/simbakot/mlflow_example
MLflow β€” https://mlflow.org/
Моя рабочая ΠΏΠΎΡ‡Ρ‚Π°, для вопросов β€” [email protected]

Π£ нас Π² ΠΊΠΎΠΌΠΏΠ°Π½ΠΈΠΈ пСриодичСски проводятся Ρ€Π°Π·Π»ΠΈΡ‡Π½Ρ‹Π΅ мСроприятия для ИВ-спСциалистов, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€: 8-Π³ΠΎ июля Π² 19:00 ΠΏΠΎ МБК Π±ΡƒΠ΄Π΅Ρ‚ ΠΏΡ€ΠΎΡ…ΠΎΠ΄ΠΈΡ‚ΡŒ ΠΌΠΈΡ‚Π°ΠΏ ΠΏΠΎ CV Π² ΠΎΠ½Π»Π°ΠΉΠ½-Ρ„ΠΎΡ€ΠΌΠ°Ρ‚Π΅, Ссли интСрСсно, Ρ‚ΠΎ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ ΠΏΡ€ΠΈΠ½ΡΡ‚ΡŒ участиС, рСгистрация здСсь .

Π˜ΡΡ‚ΠΎΡ‡Π½ΠΈΠΊ: habr.com

Π”ΠΎΠ±Π°Π²ΠΈΡ‚ΡŒ ΠΊΠΎΠΌΠΌΠ΅Π½Ρ‚Π°Ρ€ΠΈΠΉ