ΠΠ΄ΡΠ°Π²ΠΎ Π½Π° ΡΠΈΡΠ΅! ΠΠ°Ρ ΡΡΠΌ ΡΠ°Π·Π²ΠΈΠ²Π°Ρ Π½Π° CV Π²ΠΎ CROC. ΠΠ΅ΡΠ΅ 3 Π³ΠΎΠ΄ΠΈΠ½ΠΈ ΡΠΏΡΠΎΠ²Π΅Π΄ΡΠ²Π°ΠΌΠ΅ ΠΏΡΠΎΠ΅ΠΊΡΠΈ ΠΎΠ΄ ΠΎΠ±Π»Π°ΡΡΠ° Π½Π° CV. ΠΠ° ΡΠΎΠ° Π²ΡΠ΅ΠΌΠ΅, Π½Π°ΠΏΡΠ°Π²ΠΈΠ²ΠΌΠ΅ ΠΌΠ½ΠΎΠ³Ρ ΡΠ°Π±ΠΎΡΠΈ, Π½Π° ΠΏΡΠΈΠΌΠ΅Ρ: Π³ΠΈ ΡΠ»Π΅Π΄Π΅Π²ΠΌΠ΅ Π²ΠΎΠ·Π°ΡΠΈΡΠ΅ ΡΠ°ΠΊΠ° ΡΡΠΎ Π΄ΠΎΠ΄Π΅ΠΊΠ° Π²ΠΎΠ·Π°Ρ ΡΠΈΠ΅ Π½Π΅ ΠΏΠΈΠ΅Π»Π΅, Π½Π΅ ΠΏΡΡΠ΅Π»Π΅, Π½Π΅ Π·Π±ΠΎΡΡΠ²Π°Π»Π΅ Π½Π° ΡΠ΅Π»Π΅ΡΠΎΠ½, Π³Π»Π΅Π΄Π°Π»Π΅ Π²ΠΎ ΠΏΠ°ΡΠΎΡ, Π° Π½Π΅ Π²ΠΎ ΡΠΎΠ½ΠΈΡΡΠ°ΡΠ° ΠΈΠ»ΠΈ Π²ΠΎ ΠΎΠ±Π»Π°ΡΠΈΡΠ΅. ; Π‘Π½ΠΈΠΌΠ°Π²ΠΌΠ΅ Π»ΡΡΠ΅ ΠΊΠΎΠΈ Π²ΠΎΠ·Π°Ρ ΠΏΠΎ ΠΏΠΎΡΠ΅Π±Π½ΠΈ Π»Π΅Π½ΡΠΈ ΠΈ Π·Π°ΡΠ°ΡΠ°Π°Ρ Π½Π΅ΠΊΠΎΠ»ΠΊΡ ΠΏΠ°ΡΠΊΠΈΠ½Π³ ΠΌΠ΅ΡΡΠ°; ΡΠ΅ ΠΏΠΎΠ³ΡΠΈΠΆΠΈ ΡΠ°Π±ΠΎΡΠ½ΠΈΡΠΈΡΠ΅ Π΄Π° Π½ΠΎΡΠ°Ρ ΡΠ»Π΅ΠΌΠΎΠ²ΠΈ, ΡΠ°ΠΊΠ°Π²ΠΈΡΠΈ ΠΈΡΠ½.; ΠΈΠ΄Π΅Π½ΡΠΈΡΠΈΠΊΡΠ²Π°Π» Π²ΡΠ°Π±ΠΎΡΠ΅Π½ ΠΊΠΎΡ ΡΠ°ΠΊΠ° Π΄Π° Π²Π»Π΅Π·Π΅ Π²ΠΎ ΠΎΠ±ΡΠ΅ΠΊΡΠΎΡ; ΠΠ·Π±ΡΠΎΠΈΠ²ΠΌΠ΅ ΡΠ΅ ΡΡΠΎ ΠΌΠΎΠΆΠ΅Π²ΠΌΠ΅.
ΠΠ° ΡΡΠΎ Π³ΠΎ ΠΏΡΠ°Π²Π°ΠΌ ΡΠ΅ΡΠΎ ΠΎΠ²Π°?
ΠΠΎ ΠΏΡΠΎΡΠ΅ΡΠΎΡ Π½Π° ΠΈΠΌΠΏΠ»Π΅ΠΌΠ΅Π½ΡΠ°ΡΠΈΡΠ° Π½Π° ΠΏΡΠΎΠ΅ΠΊΡΠΈ ΡΠ΄ΡΠΈΠ²ΠΌΠ΅ Π½Π΅ΡΠ°ΠΌΠ½ΠΈΠ½ΠΈ, ΠΌΠ½ΠΎΠ³Ρ Π½Π΅ΡΠ°ΠΌΠ½ΠΈΠ½ΠΈ, Π½Π΅ΠΊΠΎΠΈ ΠΎΠ΄ ΠΏΡΠΎΠ±Π»Π΅ΠΌΠΈΡΠ΅ ΡΠΎ ΠΊΠΎΠΈ ΠΈΠ»ΠΈ ΡΡΠ΅ Π·Π°ΠΏΠΎΠ·Π½Π°Π΅Π½ΠΈ ΠΈΠ»ΠΈ ΡΠ΅ ΡΠ΅ Π·Π°ΠΏΠΎΠ·Π½Π°Π΅ΡΠ΅ Π²ΠΎ ΠΈΠ΄Π½ΠΈΠ½Π°.
ΠΡΠ΄Π΅ Π΄Π° ΡΠ° ΡΠΈΠΌΡΠ»ΠΈΡΠ°ΠΌΠ΅ ΡΠΈΡΡΠ°ΡΠΈΡΠ°ΡΠ°
ΠΠ° Π·Π°ΠΌΠΈΡΠ»ΠΈΠΌΠ΅ Π΄Π΅ΠΊΠ° ΡΠ΅ Π²ΡΠ°Π±ΠΎΡΠΈΠ²ΠΌΠ΅ Π²ΠΎ Π΅Π΄Π½Π° ΠΌΠ»Π°Π΄Π° ΠΊΠΎΠΌΠΏΠ°Π½ΠΈΡΠ° βΠβ, ΡΠΈΠΈ Π°ΠΊΡΠΈΠ²Π½ΠΎΡΡΠΈ ΡΠ΅ ΠΏΠΎΠ²ΡΠ·Π°Π½ΠΈ ΡΠΎ ΠΠ. Π Π°Π±ΠΎΡΠΈΠΌΠ΅ Π½Π° ΠΏΡΠΎΠ΅ΠΊΡ ML (DL, CV), ΠΏΠΎΡΠΎΠ° ΠΏΠΎΡΠ°Π΄ΠΈ Π½Π΅ΠΊΠΎΡΠ° ΠΏΡΠΈΡΠΈΠ½Π° ΡΠ΅ ΠΏΡΠ΅ΡΡΠ»Π°ΠΌΠ΅ Π½Π° Π΄ΡΡΠ³Π° ΡΠ°Π±ΠΎΡΠ°, Π³Π΅Π½Π΅ΡΠ°Π»Π½ΠΎ ΠΏΡΠ°Π²ΠΈΠΌΠ΅ ΠΏΠ°ΡΠ·Π° ΠΈ ΡΠ΅ Π²ΡΠ°ΡΠ°ΠΌΠ΅ Π²ΠΎ Π½Π°ΡΠΈΠΎΡ ΠΈΠ»ΠΈ ΡΡΡ Π½Π΅Π²ΡΠΎΠ½.
- ΠΠΎΠ°ΡΠ° ΠΌΠΎΠΌΠ΅Π½ΡΠΎΡ Π½Π° Π²ΠΈΡΡΠΈΠ½Π°ΡΠ°, ΡΡΠ΅Π±Π° Π½Π΅ΠΊΠ°ΠΊΠΎ Π΄Π° ΡΠ΅ ΡΠ΅ΡΠΈΡΠ΅ ΠΊΠ°Π΄Π΅ ΡΡΠ΅ Π·Π°ΡΡΠ°Π½Π°Π»Π΅, ΡΠΎ ΠΊΠ°ΠΊΠ²ΠΈ Ρ
ΠΈΠΏΠ΅ΡΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡΠΈ ΡΡΠ΅ ΠΏΡΠΎΠ±Π°Π»Π΅ ΠΈ ΡΡΠΎ Π΅ Π½Π°ΡΠ²Π°ΠΆΠ½ΠΎ, Π΄ΠΎ ΠΊΠ°ΠΊΠ²ΠΈ ΡΠ΅Π·ΡΠ»ΡΠ°ΡΠΈ Π΄ΠΎΠ²Π΅Π΄ΠΎΠ°.
ΠΠΎΠΆΠ΅ Π΄Π° ΠΈΠΌΠ° ΠΌΠ½ΠΎΠ³Ρ ΠΎΠΏΡΠΈΠΈ Π·Π° ΡΠΎΠ° ΠΊΠΎΡ ΡΠΊΠ»Π°Π΄ΠΈΡΠ°Π» ΠΈΠ½ΡΠΎΡΠΌΠ°ΡΠΈΠΈ Π·Π° ΡΠΈΡΠ΅ Π»Π°Π½ΡΠΈΡΠ°ΡΠ°: Π²ΠΎ Π³Π»Π°Π²Π°ΡΠ°, ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΠΈ, Π±Π΅Π»Π΅ΠΆΠ½ΠΈΠΊ, Π²ΠΎ ΡΠ°Π±ΠΎΡΠ½Π° ΡΡΠ΅Π΄ΠΈΠ½Π° Π²ΠΎ ΠΎΠ±Π»Π°ΠΊΠΎΡ. Π‘Π»ΡΡΠ°ΡΠ½ΠΎ Π²ΠΈΠ΄ΠΎΠ² ΠΎΠΏΡΠΈΡΠ° ΠΊΠΎΠ³Π° Ρ ΠΈΠΏΠ΅ΡΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡΠΈΡΠ΅ Π±Π΅Π° Π·Π°ΡΡΠ²Π°Π½ΠΈ ΠΊΠ°ΠΊΠΎ ΠΊΠΎΠΌΠ΅Π½ΡΠΈΡΠ°Π½ΠΈ Π»ΠΈΠ½ΠΈΠΈ Π²ΠΎ ΠΊΠΎΠ΄ΠΎΡ, Π³Π΅Π½Π΅ΡΠ°Π»Π½ΠΎ, ΡΠ°Π½ΡΠ°Π·ΠΈΡΠ°ΡΠ°. Π‘Π΅Π³Π° Π·Π°ΠΌΠΈΡΠ»Π΅ΡΠ΅ Π΄Π΅ΠΊΠ° Π½Π΅ ΡΡΠ΅ ΡΠ΅ Π²ΡΠ°ΡΠΈΠ»Π΅ Π½Π° Π²Π°ΡΠΈΠΎΡ ΠΏΡΠΎΠ΅ΠΊΡ, ΡΡΠΊΡ Π½Π° ΠΏΡΠΎΠ΅ΠΊΡΠΎΡ Π½Π° Π»ΠΈΡΠ½ΠΎΡΡ ΠΊΠΎΡΠ° ΡΠ° Π½Π°ΠΏΡΡΡΠΈΠ»Π° ΠΊΠΎΠΌΠΏΠ°Π½ΠΈΡΠ°ΡΠ° ΠΈ ΡΡΠ΅ Π½Π°ΡΠ»Π΅Π΄ΠΈΠ»Π΅ ΠΊΠΎΠ΄ ΠΈ ΠΌΠΎΠ΄Π΅Π» Π½Π°ΡΠ΅ΡΠ΅Π½ model_1.pb. ΠΠ° Π΄Π° ΡΠ° ΠΊΠΎΠΌΠΏΠ»Π΅ΡΠΈΡΠ°ΠΌΠ΅ ΡΠ»ΠΈΠΊΠ°ΡΠ° ΠΈ Π΄Π° ΡΠ° ΠΏΡΠ΅Π½Π΅ΡΠ΅ΠΌΠ΅ ΡΠ΅Π»Π°ΡΠ° Π±ΠΎΠ»ΠΊΠ°, Π΄Π° Π·Π°ΠΌΠΈΡΠ»ΠΈΠΌΠ΅ Π΄Π΅ΠΊΠ° ΡΡΠ΅ ΠΈ ΠΏΠΎΡΠ΅ΡΠ½ΠΈΠΊ ΡΠΏΠ΅ΡΠΈΡΠ°Π»ΠΈΡΡ. - Π‘Π°ΠΌΠΎ Π½Π°ΠΏΡΠ΅Π΄. ΠΠ° Π΄Π° Π³ΠΎ ΠΈΠ·Π²ΡΡΠΈΠΌΠ΅ ΠΊΠΎΠ΄ΠΎΡ, Π½ΠΈΠ΅ ΠΈ ΡΠ΅ΠΊΠΎΡ ΡΡΠΎ ΡΠ΅ ΡΠ°Π±ΠΎΡΠΈ ΡΠΎ Π½Π΅Π³ΠΎ ΡΡΠ΅Π±Π° Π΄Π° ΡΠΎΠ·Π΄Π°Π΄Π΅ΠΌΠ΅ ΡΡΠ΅Π΄ΠΈΠ½Π°. Π§Π΅ΡΡΠΎ ΡΠ΅ ΡΠ»ΡΡΡΠ²Π° ΠΏΠΎΡΠ°Π΄ΠΈ Π½Π΅ΠΊΠΎΡΠ° ΠΏΡΠΈΡΠΈΠ½Π° Π΄Π° Π½Π΅ Π³ΠΎ ΠΎΡΡΠ°Π²Π°Ρ ΠΊΠ°ΠΊΠΎ Π½Π°ΡΠ»Π΅Π΄ΡΡΠ²ΠΎ. ΠΠ²Π° ΠΈΡΡΠΎ ΡΠ°ΠΊΠ° ΠΌΠΎΠΆΠ΅ Π΄Π° ΡΡΠ°Π½Π΅ Π½Π΅ΡΡΠΈΠ²ΠΈΡΠ°Π»Π½Π° Π·Π°Π΄Π°ΡΠ°. ΠΠ΅ ΡΠ°ΠΊΠ°ΡΠ΅ Π΄Π° Π³ΡΠ±ΠΈΡΠ΅ Π²ΡΠ΅ΠΌΠ΅ Π½Π° ΠΎΠ²ΠΎΡ ΡΠ΅ΠΊΠΎΡ, Π½Π΅Π»ΠΈ?
- ΠΠΈΠ΅ ΡΡΠ΅Π½ΠΈΡΠ°ΠΌΠ΅ ΠΌΠΎΠ΄Π΅Π» (Π½Π° ΠΏΡΠΈΠΌΠ΅Ρ, Π΄Π΅ΡΠ΅ΠΊΡΠΎΡ Π·Π° Π°Π²ΡΠΎΠΌΠΎΠ±ΠΈΠ»). Π‘ΡΠΈΠ³Π½ΡΠ²Π°ΠΌΠ΅ Π΄ΠΎ ΡΠΎΡΠΊΠ° ΠΊΠ°Π΄Π΅ ΡΡΠΎ ΡΡΠ°Π½ΡΠ²Π° ΠΌΠ½ΠΎΠ³Ρ Π΄ΠΎΠ±ΡΠΎ - Π²ΡΠ΅ΠΌΠ΅ Π΅ Π΄Π° Π³ΠΎ Π·Π°ΡΡΠ²Π°ΠΌΠ΅ ΡΠ΅Π·ΡΠ»ΡΠ°ΡΠΎΡ. ΠΠ° Π³ΠΎ Π½Π°ΡΠ΅ΡΠ΅ΠΌΠ΅ car_detection_v1.pb. ΠΠΎΡΠΎΠ° ΡΡΠ΅Π½ΠΈΡΠ°ΠΌΠ΅ ΡΡΡΠ΅ Π΅Π΄Π΅Π½ - car_detection_v2.pb. ΠΠ΅ΠΊΠΎΠ΅ Π²ΡΠ΅ΠΌΠ΅ ΠΏΠΎΠ΄ΠΎΡΠ½Π°, Π½Π°ΡΠΈΡΠ΅ ΠΊΠΎΠ»Π΅Π³ΠΈ ΠΈΠ»ΠΈ Π½ΠΈΠ΅ ΡΠ°ΠΌΠΈΡΠ΅ ΠΏΡΠ΅Π΄Π°Π²Π°ΠΌΠ΅ ΡΠ΅ ΠΏΠΎΠ²Π΅ΡΠ΅ ΠΈ ΠΏΠΎΠ²Π΅ΡΠ΅, ΠΊΠΎΡΠΈΡΡΠ΅ΡΡΠΈ ΡΠ°Π·Π»ΠΈΡΠ½ΠΈ Π°ΡΡ ΠΈΡΠ΅ΠΊΡΡΡΠΈ. ΠΠ°ΠΊΠΎ ΡΠ΅Π·ΡΠ»ΡΠ°Ρ Π½Π° ΡΠΎΠ°, ΡΠ΅ ΡΠΎΡΠΌΠΈΡΠ°Π°Ρ Π΅Π΄Π΅Π½ ΠΊΡΠΏ Π°ΡΡΠ΅ΡΠ°ΠΊΡΠΈ, ΠΈΠ½ΡΠΎΡΠΌΠ°ΡΠΈΠΈ Π·Π° ΠΊΠΎΠΈ ΠΌΠΎΡΠ° ΠΌΠ°ΠΊΠΎΡΡΠΏΠ½ΠΎ Π΄Π° ΡΠ΅ ΡΠΎΠ±Π΅ΡΠ°Ρ (Π½ΠΎ ΡΠΎΠ° ΡΠ΅ Π³ΠΎ Π½Π°ΠΏΡΠ°Π²ΠΈΠΌΠ΅ ΠΏΠΎΠ΄ΠΎΡΠ½Π°, Π±ΠΈΠ΄Π΅ΡΡΠΈ Π·Π°ΡΠ΅Π³Π° ΠΈΠΌΠ°ΠΌΠ΅ ΠΏΠΎΠ²Π΅ΡΠ΅ ΠΏΡΠΈΠΎΡΠΈΡΠ΅ΡΠ½ΠΈ ΡΠ°Π±ΠΎΡΠΈ).
- ΠΠ ΡΠ΅Π³Π° Π΅ Π³ΠΎΡΠΎΠ²ΠΎ! ΠΠΌΠ°ΠΌΠ΅ ΠΌΠΎΠ΄Π΅Π»! ΠΠΎΠΆΠ΅ΠΌΠ΅ Π»ΠΈ Π΄Π° Π·Π°ΠΏΠΎΡΠ½Π΅ΠΌΠ΅ Π΄Π° Π³ΠΎ ΡΡΠ΅Π½ΠΈΡΠ°ΠΌΠ΅ ΡΠ»Π΅Π΄Π½ΠΈΠΎΡ ΠΌΠΎΠ΄Π΅Π», Π΄Π° ΡΠ°Π·Π²ΠΈΠ²Π°ΠΌΠ΅ Π°ΡΡ ΠΈΡΠ΅ΠΊΡΡΡΠ° Π·Π° Π΄Π° ΡΠ΅ΡΠΈΠΌΠ΅ Π½ΠΎΠ² ΠΏΡΠΎΠ±Π»Π΅ΠΌ ΠΈΠ»ΠΈ Π΄Π° ΠΎΠ΄ΠΈΠΌΠ΅ Π΄Π° ΠΏΠΈΠ΅ΠΌΠ΅ ΡΠ°Ρ? Π ΠΊΠΎΡ ΡΠ΅ ΡΠ°ΡΠΏΠΎΡΠ΅Π΄ΠΈ?
ΠΠ΄Π΅Π½ΡΠΈΡΠΈΠΊΡΠ²Π°ΡΠ΅ Π½Π° ΠΏΡΠΎΠ±Π»Π΅ΠΌΠΈ
Π Π°Π±ΠΎΡΠ°ΡΠ° Π½Π° ΠΏΡΠΎΠ΅ΠΊΡ ΠΈΠ»ΠΈ ΠΏΡΠΎΠΈΠ·Π²ΠΎΠ΄ Π΅ ΡΠ°Π±ΠΎΡΠ° Π½Π° ΠΌΠ½ΠΎΠ³Ρ Π»ΡΡΠ΅. Π ΡΠΎ ΡΠ΅ΠΊ Π½Π° Π²ΡΠ΅ΠΌΠ΅ Π»ΡΡΠ΅ΡΠΎ ΡΠΈ Π·Π°ΠΌΠΈΠ½ΡΠ²Π°Π°Ρ ΠΈ Π΄ΠΎΠ°ΡΠ°Π°Ρ, ΠΈΠΌΠ° ΠΏΠΎΠ²Π΅ΡΠ΅ ΠΏΡΠΎΠ΅ΠΊΡΠΈ, Π° ΡΠ°ΠΌΠΈΡΠ΅ ΠΏΡΠΎΠ΅ΠΊΡΠΈ ΡΡΠ°Π½ΡΠ²Π°Π°Ρ ΠΏΠΎΡΠ»ΠΎΠΆΠ΅Π½ΠΈ. ΠΠ°ΠΊΠ° ΠΈΠ»ΠΈ ΠΎΠ½Π°ΠΊΠ°, ΡΠΈΡΡΠ°ΡΠΈΠΈΡΠ΅ ΠΎΠ΄ ΡΠΈΠΊΠ»ΡΡΠΎΡ ΠΎΠΏΠΈΡΠ°Π½ ΠΏΠΎΠ³ΠΎΡΠ΅ (ΠΈ Π½Π΅ ΡΠ°ΠΌΠΎ) Π²ΠΎ ΠΎΠ΄ΡΠ΅Π΄Π΅Π½ΠΈ ΠΊΠΎΠΌΠ±ΠΈΠ½Π°ΡΠΈΠΈ ΡΠ΅ ΡΠ΅ ΠΏΠΎΡΠ°Π²Π°Ρ ΠΎΠ΄ ΠΏΠΎΠ²ΡΠΎΡΡΠ²Π°ΡΠ΅ Π΄ΠΎ ΠΏΠΎΠ²ΡΠΎΡΡΠ²Π°ΡΠ΅. Π‘Π΅ΡΠΎ ΠΎΠ²Π° ΡΠ΅Π·ΡΠ»ΡΠΈΡΠ° ΡΠΎ ΠΏΠΎΡΡΠΎΡΠ΅Π½ΠΎ Π²ΡΠ΅ΠΌΠ΅, ΠΊΠΎΠ½ΡΡΠ·ΠΈΡΠ°, Π½Π΅ΡΠ²ΠΈ, Π²Π΅ΡΠΎΡΠ°ΡΠ½ΠΎ Π½Π΅Π·Π°Π΄ΠΎΠ²ΠΎΠ»ΡΡΠ²ΠΎ Π½Π° ΠΊΠ»ΠΈΠ΅Π½ΡΠΈΡΠ΅ ΠΈ Π½Π° ΠΊΡΠ°ΡΠΎΡ, ΠΈΠ·Π³ΡΠ±Π΅Π½ΠΈ ΠΏΠ°ΡΠΈ. ΠΠ°ΠΊΠΎ ΡΠΈΡΠ΅ Π½ΠΈΠ΅ ΠΎΠ±ΠΈΡΠ½ΠΎ Π³ΠΎ ΡΠ»Π΅Π΄ΠΈΠΌΠ΅ ΠΈΡΡΠΎΡΠΎ ΡΡΠ°ΡΠΎ Π³ΡΠ΅Π±Π»ΠΎ, Π²Π΅ΡΡΠ²Π°ΠΌ Π΄Π΅ΠΊΠ° Π½ΠΈΠΊΠΎΡ Π½Π΅ ΡΠ°ΠΊΠ° Π΄Π° Π³ΠΈ ΠΏΡΠ΅ΠΆΠΈΠ²ΡΠ²Π° ΠΎΠ²ΠΈΠ΅ ΠΌΠΎΠΌΠ΅Π½ΡΠΈ ΠΎΠ΄Π½ΠΎΠ²ΠΎ ΠΈ ΠΎΠ΄Π½ΠΎΠ²ΠΎ.
ΠΠ½Π°ΡΠΈ, ΠΏΠΎΠΌΠΈΠ½Π°Π²ΠΌΠ΅ Π΅Π΄Π΅Π½ ΡΠΈΠΊΠ»ΡΡ Π½Π° ΡΠ°Π·Π²ΠΎΡ ΠΈ Π³Π»Π΅Π΄Π°ΠΌΠ΅ Π΄Π΅ΠΊΠ° ΠΈΠΌΠ° ΠΏΡΠΎΠ±Π»Π΅ΠΌΠΈ ΡΡΠΎ ΡΡΠ΅Π±Π° Π΄Π° ΡΠ΅ ΡΠ΅ΡΠ°Ρ. ΠΠ° Π΄Π° Π³ΠΎ Π½Π°ΠΏΡΠ°Π²ΠΈΡΠ΅ ΠΎΠ²Π° Π²ΠΈ ΡΡΠ΅Π±Π°:
- ΠΏΠΎΠ³ΠΎΠ΄Π½ΠΎ ΡΠΊΠ»Π°Π΄ΠΈΡΠ°ΡΡΠ΅ Π³ΠΈ ΡΠ΅Π·ΡΠ»ΡΠ°ΡΠΈΡΠ΅ ΠΎΠ΄ ΡΠ°Π±ΠΎΡΠ°ΡΠ°;
- Π½Π°ΠΏΡΠ°Π²Π΅ΡΠ΅ Π³ΠΎ ΠΏΡΠΎΡΠ΅ΡΠΎΡ Π½Π° Π²ΠΊΠ»ΡΡΡΠ²Π°ΡΠ΅ Π½Π° Π½ΠΎΠ²ΠΈΡΠ΅ Π²ΡΠ°Π±ΠΎΡΠ΅Π½ΠΈ Π΅Π΄Π½ΠΎΡΡΠ°Π²Π΅Π½;
- ΠΏΠΎΠ΅Π΄Π½ΠΎΡΡΠ°Π²ΡΠ²Π°ΡΠ΅ Π½Π° ΠΏΡΠΎΡΠ΅ΡΠΎΡ Π½Π° ΡΠ°ΡΠΏΠΎΡΠ΅Π΄ΡΠ²Π°ΡΠ΅ ΡΠ°Π·Π²ΠΎΡΠ½Π° ΡΡΠ΅Π΄ΠΈΠ½Π°;
- ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠΈΡΠ°ΡΡΠ΅ Π³ΠΎ ΠΏΡΠΎΡΠ΅ΡΠΎΡ Π½Π° Π²Π΅ΡΠ·ΠΈΡΠ° Π½Π° ΠΌΠΎΠ΄Π΅Π»ΠΎΡ;
- ΠΈΠΌΠ°Π°Ρ ΠΏΡΠΈΠ³ΠΎΠ΄Π΅Π½ Π½Π°ΡΠΈΠ½ Π·Π° ΠΏΠΎΡΠ²ΡΠ΄ΡΠ²Π°ΡΠ΅ Π½Π° ΠΌΠΎΠ΄Π΅Π»ΠΈΡΠ΅;
- Π½Π°ΡΠ΄Π΅ΡΠ΅ ΠΌΠΎΠ΄Π΅Π» Π°Π»Π°ΡΠΊΠ° Π·Π° ΡΠΏΡΠ°Π²ΡΠ²Π°ΡΠ΅ ΡΠΎ Π΄ΡΠΆΠ°Π²Π°ΡΠ°;
- Π½Π°ΡΠ΄Π΅ΡΠ΅ Π½Π°ΡΠΈΠ½ Π΄Π° Π³ΠΈ Π΄ΠΎΡΡΠ°Π²ΠΈΡΠ΅ ΠΌΠΎΠ΄Π΅Π»ΠΈΡΠ΅ Π΄ΠΎ ΠΏΡΠΎΠΈΠ·Π²ΠΎΠ΄ΡΡΠ²ΠΎ.
ΠΡΠΈΠ³Π»Π΅Π΄Π½ΠΎ Π΅ Π½Π΅ΠΎΠΏΡ ΠΎΠ΄Π½ΠΎ Π΄Π° ΡΠ΅ ΡΠΌΠΈΡΠ»ΠΈ ΡΠ°Π±ΠΎΡΠ΅Π½ ΡΠ΅ΠΊ ΠΊΠΎΡ ΡΠ΅ Π²ΠΈ ΠΎΠ²ΠΎΠ·ΠΌΠΎΠΆΠΈ Π»Π΅ΡΠ½ΠΎ ΠΈ ΡΠ΄ΠΎΠ±Π½ΠΎ Π΄Π° ΡΠΏΡΠ°Π²ΡΠ²Π°ΡΠ΅ ΡΠΎ ΠΎΠ²ΠΎΡ ΠΆΠΈΠ²ΠΎΡΠ΅Π½ ΡΠΈΠΊΠ»ΡΡ? ΠΠ²Π°Π° ΠΏΡΠ°ΠΊΡΠΈΠΊΠ° ΡΠ΅ Π½Π°ΡΠ΅ΠΊΡΠ²Π° MLOps
MLOps, ΠΈΠ»ΠΈ DevOps Π·Π° ΠΌΠ°ΡΠΈΠ½ΡΠΊΠΎ ΡΡΠ΅ΡΠ΅, ΠΈΠΌ ΠΎΠ²ΠΎΠ·ΠΌΠΎΠΆΡΠ²Π° Π½Π° ΡΠΈΠΌΠΎΠ²ΠΈΡΠ΅ Π·Π° Π½Π°ΡΠΊΠ° Π·Π° ΠΏΠΎΠ΄Π°ΡΠΎΡΠΈ ΠΈ ΠΠ’ Π΄Π° ΡΠΎΡΠ°Π±ΠΎΡΡΠ²Π°Π°Ρ ΠΈ Π΄Π° Π³ΠΎ Π·Π³ΠΎΠ»Π΅ΠΌΠ°Ρ ΡΠ΅ΠΌΠΏΠΎΡΠΎ Π½Π° ΡΠ°Π·Π²ΠΎΡ ΠΈ ΡΠ°ΡΠΏΠΎΡΠ΅Π΄ΡΠ²Π°ΡΠ΅ Π½Π° ΠΌΠΎΠ΄Π΅Π»ΠΈ ΠΏΡΠ΅ΠΊΡ ΡΠ»Π΅Π΄Π΅ΡΠ΅, Π²Π°Π»ΠΈΠ΄Π°ΡΠΈΡΠ° ΠΈ ΡΠΏΡΠ°Π²ΡΠ²Π°ΡΠ΅ ΡΠΎ ΠΌΠΎΠ΄Π΅Π»ΠΈΡΠ΅ Π·Π° ΠΌΠ°ΡΠΈΠ½ΡΠΊΠΎ ΡΡΠ΅ΡΠ΅.
ΠΠΎΠΆΠ΅Ρ
ΠΠΎΠ½Π°ΡΠ°ΠΌΡ Π²ΠΎ ΠΌΠΎΡΠ°ΡΠ° ΡΡΠ°ΡΠΈΡΠ° ΡΠ΅ ΠΎΠΏΠΈΡΠ°ΠΌ ΡΠ°ΠΌΠΎ Π΄Π΅Π» ΠΎΠ΄ ΠΏΡΠΎΡΠ΅ΡΠΎΡ. ΠΠ° ΠΈΠΌΠΏΠ»Π΅ΠΌΠ΅Π½ΡΠ°ΡΠΈΡΠ° ΡΠ΅ ΡΠ° ΠΊΠΎΡΠΈΡΡΠ°ΠΌ Π°Π»Π°ΡΠΊΠ°ΡΠ° MLflow, Π±ΠΈΠ΄Π΅ΡΡΠΈ ... ΠΠ²Π° Π΅ ΠΏΡΠΎΠ΅ΠΊΡ ΡΠΎ ΠΎΡΠ²ΠΎΡΠ΅Π½ ΠΊΠΎΠ΄, ΠΏΠΎΡΡΠ΅Π±Π½Π° Π΅ ΠΌΠ°Π»Π° ΠΊΠΎΠ»ΠΈΡΠΈΠ½Π° Π½Π° ΠΊΠΎΠ΄ Π·Π° ΠΏΠΎΠ²ΡΠ·ΡΠ²Π°ΡΠ΅ ΠΈ ΠΈΠΌΠ° ΠΈΠ½ΡΠ΅Π³ΡΠ°ΡΠΈΡΠ° ΡΠΎ ΠΏΠΎΠΏΡΠ»Π°ΡΠ½ΠΈΡΠ΅ ΠΌΠ» ΡΠ°ΠΌΠΊΠΈ. ΠΠΎΠΆΠ΅ΡΠ΅ Π΄Π° ΠΏΡΠ΅Π±Π°ΡΡΠ²Π°ΡΠ΅ Π½Π° ΠΠ½ΡΠ΅ΡΠ½Π΅Ρ Π·Π° Π΄ΡΡΠ³ΠΈ Π°Π»Π°ΡΠΊΠΈ, ΠΊΠ°ΠΊΠΎ ΡΡΠΎ ΡΠ΅ Kubeflow, SageMaker, Trains ΠΈΡΠ½., Π° ΠΌΠΎΠΆΠ΅Π±ΠΈ ΠΈ Π΄Π° Π½Π°ΡΠ΄Π΅ΡΠ΅ Π½Π΅ΠΊΠΎΡΠ° ΡΡΠΎ ΠΏΠΎΠ΄ΠΎΠ±ΡΠΎ ΠΎΠ΄Π³ΠΎΠ²Π°ΡΠ° Π½Π° Π²Π°ΡΠΈΡΠ΅ ΠΏΠΎΡΡΠ΅Π±ΠΈ.
βΠΡΠ°Π΄Π΅ΡΠ΅β MLOps ΠΊΠΎΡΠΈΡΡΠ΅ΡΡΠΈ Π³ΠΎ ΠΏΡΠΈΠΌΠ΅ΡΠΎΡ Π·Π° ΠΊΠΎΡΠΈΡΡΠ΅ΡΠ΅ Π½Π° Π°Π»Π°ΡΠΊΠ°ΡΠ° MLFlow
MLFlow Π΅ ΠΏΠ»Π°ΡΡΠΎΡΠΌΠ° ΡΠΎ ΠΎΡΠ²ΠΎΡΠ΅Π½ ΠΊΠΎΠ΄ Π·Π° ΡΠΏΡΠ°Π²ΡΠ²Π°ΡΠ΅ ΡΠΎ ΠΆΠΈΠ²ΠΎΡΠ½ΠΈΠΎΡ ΡΠΈΠΊΠ»ΡΡ Π½Π° ΠΌΠΎΠ΄Π΅Π»ΠΈΡΠ΅ ml (
MLflow Π²ΠΊΠ»ΡΡΡΠ²Π° ΡΠ΅ΡΠΈΡΠΈ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½ΡΠΈ:
- MLflow Tracking - Π³ΠΈ ΠΎΠΏΡΠ°ΡΠ° ΠΏΡΠ°ΡΠ°ΡΠ°ΡΠ° Π·Π° Π΅Π²ΠΈΠ΄Π΅Π½ΡΠΈΡΠ°ΡΠ΅ Π½Π° ΡΠ΅Π·ΡΠ»ΡΠ°ΡΠΈΡΠ΅ ΠΈ ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡΠΈΡΠ΅ ΠΊΠΎΠΈ Π΄ΠΎΠ²Π΅Π΄ΠΎΠ° Π΄ΠΎ ΠΎΠ²ΠΎΡ ΡΠ΅Π·ΡΠ»ΡΠ°Ρ;
- MLflow Project - Π²ΠΈ ΠΎΠ²ΠΎΠ·ΠΌΠΎΠΆΡΠ²Π° Π΄Π° ΠΏΠ°ΠΊΡΠ²Π°ΡΠ΅ ΠΊΠΎΠ΄ ΠΈ Π΄Π° Π³ΠΎ ΡΠ΅ΠΏΡΠΎΠ΄ΡΡΠΈΡΠ°ΡΠ΅ Π½Π° ΠΊΠΎΡΠ° Π±ΠΈΠ»ΠΎ ΠΏΠ»Π°ΡΡΠΎΡΠΌΠ°;
- MLflow Models - ΠΎΠ΄Π³ΠΎΠ²ΠΎΡΠ½ΠΈ Π·Π° ΡΠ°ΡΠΏΠΎΡΠ΅Π΄ΡΠ²Π°ΡΠ΅ Π½Π° ΠΌΠΎΠ΄Π΅Π»ΠΈ Π²ΠΎ ΠΏΡΠΎΠΈΠ·Π²ΠΎΠ΄ΡΡΠ²ΠΎ;
- MLflow Registry - Π²ΠΈ ΠΎΠ²ΠΎΠ·ΠΌΠΎΠΆΡΠ²Π° Π΄Π° ΡΠΊΠ»Π°Π΄ΠΈΡΠ°ΡΠ΅ ΠΌΠΎΠ΄Π΅Π»ΠΈ ΠΈ Π΄Π° ΡΠΏΡΠ°Π²ΡΠ²Π°ΡΠ΅ ΡΠΎ Π½ΠΈΠ²Π½Π°ΡΠ° ΡΠΎΡΡΠΎΡΠ±Π° Π²ΠΎ ΡΠ΅Π½ΡΡΠ°Π»ΠΈΠ·ΠΈΡΠ°Π½ΠΎ ΡΠΊΠ»Π°Π΄ΠΈΡΡΠ΅.
MLflow ΡΠ°Π±ΠΎΡΠΈ Π½Π° Π΄Π²Π° Π΅Π½ΡΠΈΡΠ΅ΡΠ°:
- Π»Π°Π½ΡΠΈΡΠ°ΡΠ΅ΡΠΎ Π΅ ΡΠ΅Π»ΠΎΡΠ΅Π½ ΡΠΈΠΊΠ»ΡΡ Π½Π° ΠΎΠ±ΡΠΊΠ°, ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡΠΈ ΠΈ ΠΌΠ΅ΡΡΠΈΠΊΠ° ΡΠΎ ΠΊΠΎΠΈ ΡΠ°ΠΊΠ°ΠΌΠ΅ Π΄Π° ΡΠ΅ ΡΠ΅Π³ΠΈΡΡΡΠΈΡΠ°ΠΌΠ΅;
- ΠΠΊΡΠΏΠ΅ΡΠΈΠΌΠ΅Π½ΡΠΎΡ Π΅ βΡΠ΅ΠΌΠ°β ΡΡΠΎ ΡΠ°Π±ΠΎΡΠΈ Π·Π°Π΅Π΄Π½ΠΎ.
Π‘ΠΈΡΠ΅ ΡΠ΅ΠΊΠΎΡΠΈ ΠΎΠ΄ ΠΏΡΠΈΠΌΠ΅ΡΠΎΡ ΡΠ΅ ΠΈΠΌΠΏΠ»Π΅ΠΌΠ΅Π½ΡΠΈΡΠ°Π½ΠΈ Π½Π° ΠΎΠΏΠ΅ΡΠ°ΡΠΈΠ²Π½ΠΈΠΎΡ ΡΠΈΡΡΠ΅ΠΌ Ubuntu 18.04.
1. Π Π°ΡΠΏΠΎΡΠ΅Π΄Π΅ΡΠ΅ Π³ΠΎ ΡΠ΅ΡΠ²Π΅ΡΠΎΡ
ΠΠ° Π΄Π° ΠΌΠΎΠΆΠ΅ΠΌΠ΅ Π»Π΅ΡΠ½ΠΎ Π΄Π° ΡΠΏΡΠ°Π²ΡΠ²Π°ΠΌΠ΅ ΡΠΎ Π½Π°ΡΠΈΠΎΡ ΠΏΡΠΎΠ΅ΠΊΡ ΠΈ Π΄Π° Π³ΠΈ Π΄ΠΎΠ±ΠΈΠ΅ΠΌΠ΅ ΡΠΈΡΠ΅ ΠΏΠΎΡΡΠ΅Π±Π½ΠΈ ΠΈΠ½ΡΠΎΡΠΌΠ°ΡΠΈΠΈ, ΡΠ΅ ΡΠ°ΡΠΏΠΎΡΠ΅Π΄ΠΈΠΌΠ΅ ΡΠ΅ΡΠ²Π΅Ρ. Π‘Π΅ΡΠ²Π΅ΡΠΎΡ Π·Π° ΡΠ»Π΅Π΄Π΅ΡΠ΅ MLflow ΠΈΠΌΠ° Π΄Π²Π΅ Π³Π»Π°Π²Π½ΠΈ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½ΡΠΈ:
- backend ΠΏΡΠΎΠ΄Π°Π²Π½ΠΈΡΠ° - ΠΎΠ΄Π³ΠΎΠ²ΠΎΡΠ½Π° Π·Π° ΡΠΊΠ»Π°Π΄ΠΈΡΠ°ΡΠ΅ ΠΈΠ½ΡΠΎΡΠΌΠ°ΡΠΈΠΈ Π·Π° ΡΠ΅Π³ΠΈΡΡΡΠΈΡΠ°Π½ΠΈ ΠΌΠΎΠ΄Π΅Π»ΠΈ (ΠΏΠΎΠ΄ΡΠΆΡΠ²Π° 4 DBMS: mysql, mssql, sqlite ΠΈ postgresql);
- ΠΏΡΠΎΠ΄Π°Π²Π½ΠΈΡΠ° Π·Π° Π°ΡΡΠ΅ΡΠ°ΠΊΡΠΈ - ΠΎΠ΄Π³ΠΎΠ²ΠΎΡΠ½Π° Π·Π° ΡΠΊΠ»Π°Π΄ΠΈΡΠ°ΡΠ΅ Π°ΡΡΠ΅ΡΠ°ΠΊΡΠΈ (ΠΏΠΎΠ΄ΡΠΆΡΠ²Π° 7 ΠΎΠΏΡΠΈΠΈ Π·Π° ΡΠΊΠ»Π°Π΄ΠΈΡΠ°ΡΠ΅: Amazon S3, Azure Blob Storage, Google Cloud Storage, FTP ΡΠ΅ΡΠ²Π΅Ρ, SFTP Server, NFS, HDFS).
ΠΠ°ΠΊΠΎ ΠΏΡΠΎΠ΄Π°Π²Π½ΠΈΡΠ° Π·Π° Π°ΡΡΠ΅ΡΠ°ΠΊΡΠΈ ΠΠ° Π΅Π΄Π½ΠΎΡΡΠ°Π²Π½ΠΎΡΡ, Π΄Π° Π·Π΅ΠΌΠ΅ΠΌΠ΅ 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
ΠΠ°ΠΊΠΎ Π·Π°Π΄Π½ΠΈΠ½ΡΠΊΠ° ΠΏΡΠΎΠ΄Π°Π²Π½ΠΈΡΠ° ΠΠ° Π³ΠΎ Π·Π΅ΠΌΠ΅ΠΌΠ΅ 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. ΠΠΎΠ΄Π°ΡΡΠ΅ ΡΠ»Π΅Π΄Π΅ΡΠ΅
ΠΠ° Π΄Π° Π½Π΅ ΡΠ΅ ΠΈΠ·Π³ΡΠ±Π°Ρ ΡΠ΅Π·ΡΠ»ΡΠ°ΡΠΈΡΠ΅ ΠΎΠ΄ Π½Π°ΡΠ°ΡΠ° ΠΎΠ±ΡΠΊΠ°, ΠΈΠ΄Π½ΠΈΡΠ΅ Π³Π΅Π½Π΅ΡΠ°ΡΠΈΠΈ Π½Π° ΠΏΡΠΎΠ³ΡΠ°ΠΌΠ΅ΡΠΈ Π΄Π° ΡΠ°Π·Π±Π΅ΡΠ°Ρ ΡΡΠΎ ΡΠ΅ ΡΠ»ΡΡΡΠ²Π°, Π° ΠΏΠΎΡΡΠ°ΡΠΈΡΠ΅ Π΄ΡΡΠ³Π°ΡΠΈ ΠΈ Π²ΠΈΠ΅ Π΄Π° ΠΌΠΎΠΆΠ΅ΡΠ΅ ΠΌΠΈΡΠ½ΠΎ Π΄Π° Π³ΠΎ Π°Π½Π°Π»ΠΈΠ·ΠΈΡΠ°ΡΠ΅ ΠΏΡΠΎΡΠ΅ΡΠΎΡ Π½Π° ΡΡΠ΅ΡΠ΅, ΡΡΠ΅Π±Π° Π΄Π° Π΄ΠΎΠ΄Π°Π΄Π΅ΠΌΠ΅ ΡΠ»Π΅Π΄Π΅ΡΠ΅. Π‘Π»Π΅Π΄Π΅ΡΠ΅ΡΠΎ Π·Π½Π°ΡΠΈ Π·Π°ΡΡΠ²ΡΠ²Π°ΡΠ΅ Π½Π° ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡΠΈ, ΠΌΠ΅ΡΡΠΈΠΊΠ°, Π°ΡΡΠ΅ΡΠ°ΠΊΡΠΈ ΠΈ ΠΊΠ°ΠΊΠ²ΠΈ Π±ΠΈΠ»ΠΎ Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡΠ΅Π»Π½ΠΈ ΠΈΠ½ΡΠΎΡΠΌΠ°ΡΠΈΠΈ Π·Π° ΠΏΠΎΡΠ΅ΡΠΎΠΊΠΎΡ Π½Π° ΠΎΠ±ΡΠΊΠ°ΡΠ°, Π²ΠΎ Π½Π°ΡΠΈΠΎΡ ΡΠ»ΡΡΠ°Ρ, Π½Π° ΡΠ΅ΡΠ²Π΅ΡΠΎΡ.
ΠΠ° ΠΏΡΠΈΠΌΠ΅Ρ, ΡΠΎΠ·Π΄Π°Π΄ΠΎΠ² ΠΌΠ°Π»Π°
ΠΠ²Π΅ Π³ΠΈ ΡΠ΅Π΄ΠΎΠ²ΠΈΡΠ΅ ΠΊΠ°Π΄Π΅ ΡΡΠΎ ΡΠ΅ ΡΠ»ΡΡΡΠ²Π°Π°Ρ Π½Π°ΡΠΈΠ½ΡΠ΅ΡΠ΅ΡΠ½ΠΈΡΠ΅ ΡΠ°Π±ΠΎΡΠΈ:
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. MlflowClient (Π³ΠΎ Π½Π°ΠΏΡΠ°Π²ΠΈΠ² Π·Π° ΠΏΠΎΠ³ΠΎΠ΄Π½ΠΎΡΡ), ΡΠΎ ΡΠΈΡΠ° ΠΏΠΎΠΌΠΎΡ ΠΊΡΠ΅ΠΈΡΠ°ΠΌ Π΅ΠΊΡΠΏΠ΅ΡΠΈΠΌΠ΅Π½Ρ ΠΈ Π³ΠΎ ΡΡΠ°ΡΡΡΠ²Π°ΠΌ Π½Π° ΡΠ΅ΡΠ²Π΅ΡΠΎΡ. Π‘Π»Π΅Π΄Π½ΠΎ, ΡΠΊΠ°ΠΆΡΠ²Π°ΠΌ ΠΊΠ°Π΄Π΅ ΡΡΠ΅Π±Π° Π΄Π° ΡΠ΅ ΡΠΏΠΎΡΠ°Ρ ΡΠ΅Π·ΡΠ»ΡΠ°ΡΠΈΡΠ΅ ΠΎΠ΄ Π»Π°Π½ΡΠΈΡΠ°ΡΠ΅ΡΠΎ (mlflow.set_tracking_uri(self.tracking_uri)). ΠΠ²ΠΎΠ·ΠΌΠΎΠΆΡΠ²Π°ΠΌ Π°Π²ΡΠΎΠΌΠ°ΡΡΠΊΠΎ Π΅Π²ΠΈΠ΄Π΅Π½ΡΠΈΡΠ°ΡΠ΅ mlflow.keras.autolog(). ΠΠΎ ΠΌΠΎΠΌΠ΅Π½ΡΠΎΠ², MLflow Tracking ΠΏΠΎΠ΄Π΄ΡΠΆΡΠ²Π° Π°Π²ΡΠΎΠΌΠ°ΡΡΠΊΠΎ Π½Π°ΡΠ°Π²ΡΠ²Π°ΡΠ΅ Π·Π° TensorFlow, Keras, Gluon XGBoost, LightGBM, Spark. ΠΠΊΠΎ Π½Π΅ ΡΡΠ΅ ΡΠ° ΠΏΡΠΎΠ½Π°ΡΠ»Π΅ Π²Π°ΡΠ°ΡΠ° ΡΠ°ΠΌΠΊΠ° ΠΈΠ»ΠΈ Π±ΠΈΠ±Π»ΠΈΠΎΡΠ΅ΠΊΠ°, ΡΠΎΠ³Π°Ρ ΡΠ΅ΠΊΠΎΠ³Π°Ρ ΠΌΠΎΠΆΠ΅ΡΠ΅ Π΅ΠΊΡΠΏΠ»ΠΈΡΠΈΡΠ½ΠΎ Π΄Π° ΡΠ΅ Π½Π°ΡΠ°Π²ΠΈΡΠ΅. ΠΠΎΡΠ½ΡΠ²Π°ΠΌΠ΅ ΡΠΎ ΡΡΠ΅Π½ΠΈΠ½Π·ΠΈ. Π Π΅Π³ΠΈΡΡΡΠΈΡΠ°ΡΡΠ΅ ΠΎΠ·Π½Π°ΠΊΠΈ ΠΈ ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡΠΈ Π·Π° Π²Π½Π΅ΡΡΠ²Π°ΡΠ΅ Π½Π° ΠΎΠ΄Π΄Π°Π»Π΅ΡΠ΅Π½ΠΈΠΎΡ ΡΠ΅ΡΠ²Π΅Ρ.
ΠΠ΅ΠΊΠΎΠ»ΠΊΡ Π»ΠΈΠ½ΠΈΠΈ ΠΈ Π²ΠΈΠ΅, ΠΊΠ°ΠΊΠΎ ΠΈ ΡΠΈΡΠ΅ Π΄ΡΡΠ³ΠΈ, ΠΈΠΌΠ°ΡΠ΅ ΠΏΡΠΈΡΡΠ°ΠΏ Π΄ΠΎ ΠΈΠ½ΡΠΎΡΠΌΠ°ΡΠΈΠΈ Π·Π° ΡΠΈΡΠ΅ Π»Π°Π½ΡΠΈΡΠ°ΡΠ°. ΠΡΠ»?
3. ΠΠΎ ΠΏΠΎΠ΄Π³ΠΎΡΠ²ΡΠ²Π°ΠΌΠ΅ ΠΏΡΠΎΠ΅ΠΊΡΠΎΡ
Π‘Π΅Π³Π° Π΄Π° Π³ΠΎ ΠΎΠ»Π΅ΡΠ½ΠΈΠΌΠ΅ Π·Π°ΠΏΠΎΡΠ½ΡΠ²Π°ΡΠ΅ΡΠΎ Π½Π° ΠΏΡΠΎΠ΅ΠΊΡΠΎΡ. ΠΠ° Π΄Π° Π³ΠΎ Π½Π°ΠΏΡΠ°Π²ΠΈΡΠ΅ ΠΎΠ²Π°, Π΄ΠΎΠ΄Π°ΡΡΠ΅ ΡΠ° Π΄Π°ΡΠΎΡΠ΅ΠΊΠ°ΡΠ° MLproject ΠΈ conda.yaml Π²ΠΎ ΠΊΠΎΡΠ΅Π½ΠΎΡ Π½Π° ΠΏΡΠΎΠ΅ΠΊΡΠΎΡ.
ΠΠΠΏΡΠΎΠ΅ΠΊΡ
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 ΠΈΠΌΠ° Π½Π΅ΠΊΠΎΠ»ΠΊΡ ΡΠ²ΠΎΡΡΡΠ²Π°:
- ΠΠΌΠ΅ - ΠΈΠΌΠ΅ΡΠΎ Π½Π° Π²Π°ΡΠΈΠΎΡ ΠΏΡΠΎΠ΅ΠΊΡ;
- ΠΠΈΠ²ΠΎΡΠ½Π° ΡΡΠ΅Π΄ΠΈΠ½Π° - Π²ΠΎ ΠΌΠΎΡΠΎΡ ΡΠ»ΡΡΠ°Ρ, conda_env ΠΏΠΎΠΊΠ°ΠΆΡΠ²Π° Π΄Π΅ΠΊΠ° Anaconda ΡΠ΅ ΠΊΠΎΡΠΈΡΡΠΈ Π·Π° ΠΈΠ·Π²ΡΡΡΠ²Π°ΡΠ΅ ΠΈ ΠΎΠΏΠΈΡΠΎΡ Π½Π° Π·Π°Π²ΠΈΡΠ½ΠΎΡΡ Π΅ Π²ΠΎ Π΄Π°ΡΠΎΡΠ΅ΠΊΠ°ΡΠ° 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. ΠΡΠ΅Π½Π΅ΡΠ΅ Π³ΠΈ ΡΠ΅Π·ΡΠ»ΡΠ°ΡΠΈΡΠ΅ ΠΎΠ΄ ΡΡΠ΅ΡΠ΅ΡΠΎ
ΠΠΎ Π·Π°Π²ΡΡΡΠ²Π°ΡΠ΅ΡΠΎ Π½Π° ΠΎΠ±ΡΠΊΠ°ΡΠ°, ΠΌΠΎΠΆΠ΅ΠΌΠ΅ Π΄Π° ΠΎΠ΄ΠΈΠΌΠ΅ Π²ΠΎ ΠΏΡΠ΅Π»ΠΈΡΡΡΠ²Π°ΡΠΎΡ Π½Π° Π°Π΄ΡΠ΅ΡΠ°ΡΠ° Π½Π° Π½Π°ΡΠΈΠΎΡ ΡΠ΅ΡΠ²Π΅Ρ
ΠΠ²Π΄Π΅ Π³Π»Π΅Π΄Π°ΠΌΠ΅ ΡΠΏΠΈΡΠΎΠΊ Π½Π° ΡΠΈΡΠ΅ Π΅ΠΊΡΠΏΠ΅ΡΠΈΠΌΠ΅Π½ΡΠΈ (Π³ΠΎΡΠ΅ Π»Π΅Π²ΠΎ), ΠΊΠ°ΠΊΠΎ ΠΈ ΠΈΠ½ΡΠΎΡΠΌΠ°ΡΠΈΠΈ Π·Π° Π±Π΅Π³ΡΡΠ²Π°ΡΠ° (ΡΡΠ΅Π΄ΠΈΠ½Π°). ΠΠΎΠΆΠ΅ΠΌΠ΅ Π΄Π° Π³Π»Π΅Π΄Π°ΠΌΠ΅ ΠΏΠΎΠ΄Π΅ΡΠ°Π»Π½ΠΈ ΠΈΠ½ΡΠΎΡΠΌΠ°ΡΠΈΠΈ (ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡΠΈ, ΠΌΠ΅ΡΡΠΈΠΊΠ°, Π°ΡΡΠ΅ΡΠ°ΠΊΡΠΈ ΠΈ Π½Π΅ΠΊΠΎΠΈ Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡΠ΅Π»Π½ΠΈ ΠΈΠ½ΡΠΎΡΠΌΠ°ΡΠΈΠΈ) Π·Π° ΡΠ΅ΠΊΠΎΠ΅ Π»Π°Π½ΡΠΈΡΠ°ΡΠ΅.
ΠΠ° ΡΠ΅ΠΊΠΎΡΠ° ΠΌΠ΅ΡΡΠΈΠΊΠ° ΠΌΠΎΠΆΠ΅ΠΌΠ΅ Π΄Π° ΡΠ° Π½Π°Π±ΡΡΠ΄ΡΠ²Π°ΠΌΠ΅ ΠΈΡΡΠΎΡΠΈΡΠ°ΡΠ° Π½Π° ΠΏΡΠΎΠΌΠ΅Π½ΠΈΡΠ΅
ΠΠ½ΠΈΠ΅. ΠΠΎ ΠΌΠΎΠΌΠ΅Π½ΡΠΎΠ², ΠΌΠΎΠΆΠ΅ΠΌΠ΅ Π΄Π° Π³ΠΈ Π°Π½Π°Π»ΠΈΠ·ΠΈΡΠ°ΠΌΠ΅ ΡΠ΅Π·ΡΠ»ΡΠ°ΡΠΈΡΠ΅ Π²ΠΎ βΡΠ°ΡΠ΅Π½β ΡΠ΅ΠΆΠΈΠΌ, Π° ΠΈΡΡΠΎ ΡΠ°ΠΊΠ° ΠΌΠΎΠΆΠ΅ΡΠ΅ Π΄Π° ΠΏΠΎΡΡΠ°Π²ΠΈΡΠ΅ Π°Π²ΡΠΎΠΌΠ°ΡΡΠΊΠ° Π²Π°Π»ΠΈΠ΄Π°ΡΠΈΡΠ° ΡΠΎ ΠΏΠΎΠΌΠΎΡ Π½Π° MLflow API.
6. Π Π΅Π³ΠΈΡΡΡΠΈΡΠ°ΡΡΠ΅ Π³ΠΎ ΠΌΠΎΠ΄Π΅Π»ΠΎΡ
ΠΡΠΊΠ°ΠΊΠΎ Π³ΠΎ Π°Π½Π°Π»ΠΈΠ·ΠΈΡΠ°Π²ΠΌΠ΅ Π½Π°ΡΠΈΠΎΡ ΠΌΠΎΠ΄Π΅Π» ΠΈ ΠΎΠ΄Π»ΡΡΠΈΠ²ΠΌΠ΅ Π΄Π΅ΠΊΠ° Π΅ ΠΏΠΎΠ΄Π³ΠΎΡΠ²Π΅Π½ Π·Π° Π±ΠΈΡΠΊΠ°, ΠΏΡΠΎΠ΄ΠΎΠ»ΠΆΡΠ²Π°ΠΌΠ΅ Π΄Π° Π³ΠΎ ΡΠ΅Π³ΠΈΡΡΡΠΈΡΠ°ΠΌΠ΅, Π·Π° ΠΎΠ²Π° Π³ΠΎ ΠΈΠ·Π±ΠΈΡΠ°ΠΌΠ΅ Π»Π°Π½ΡΠΈΡΠ°ΡΠ΅ΡΠΎ ΡΡΠΎ Π½ΠΈ ΡΡΠ΅Π±Π° (ΠΊΠ°ΠΊΠΎ ΡΡΠΎ Π΅ ΠΏΡΠΈΠΊΠ°ΠΆΠ°Π½ΠΎ Π²ΠΎ ΠΏΡΠ΅ΡΡ ΠΎΠ΄Π½ΠΈΠΎΡ ΠΏΠ°ΡΡΡ) ΠΈ ΡΠ»Π΅Π·Π΅ΠΌΠ΅.
ΠΡΠΊΠ°ΠΊΠΎ ΡΠ΅ ΠΌΡ Π΄Π°Π΄Π΅ΠΌΠ΅ ΠΈΠΌΠ΅ Π½Π° Π½Π°ΡΠΈΠΎΡ ΠΌΠΎΠ΄Π΅Π», ΡΠΎΡ ΠΈΠΌΠ° Π²Π΅ΡΠ·ΠΈΡΠ°. ΠΠΊΠΎ Π·Π°ΡΡΠ²Π°ΡΠ΅ Π΄ΡΡΠ³ ΠΌΠΎΠ΄Π΅Π» ΡΠΎ ΠΈΡΡΠΎ ΠΈΠΌΠ΅, Π²Π΅ΡΠ·ΠΈΡΠ°ΡΠ° Π°Π²ΡΠΎΠΌΠ°ΡΡΠΊΠΈ ΡΠ΅ ΡΠ΅ Π½Π°Π΄Π³ΡΠ°Π΄ΠΈ.
ΠΠ° ΡΠ΅ΠΊΠΎΡ ΠΌΠΎΠ΄Π΅Π», ΠΌΠΎΠΆΠ΅ΠΌΠ΅ Π΄Π° Π΄ΠΎΠ΄Π°Π΄Π΅ΠΌΠ΅ ΠΎΠΏΠΈΡ ΠΈ Π΄Π° ΠΈΠ·Π±Π΅ΡΠ΅ΠΌΠ΅ Π΅Π΄Π½Π° ΠΎΠ΄ ΡΡΠΈΡΠ΅ ΡΠΎΡΡΠΎΡΠ±ΠΈ (Staging, Production, Archived); ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°ΡΠ΅Π»Π½ΠΎ, ΠΊΠΎΡΠΈΡΡΠ΅ΡΡΠΈ Π³ΠΎ API, ΠΌΠΎΠΆΠ΅ΠΌΠ΅ Π΄Π° ΠΏΡΠΈΡΡΠ°ΠΏΠΈΠΌΠ΅ Π΄ΠΎ ΠΎΠ²ΠΈΠ΅ ΡΠΎΡΡΠΎΡΠ±ΠΈ, ΡΡΠΎ, Π·Π°Π΅Π΄Π½ΠΎ ΡΠΎ Π²Π΅ΡΠ·ΠΈΠΈΡΠ°ΡΠ΅ΡΠΎ, ΠΎΠ±Π΅Π·Π±Π΅Π΄ΡΠ²Π° Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡΠ΅Π»Π½Π° ΡΠ»Π΅ΠΊΡΠΈΠ±ΠΈΠ»Π½ΠΎΡΡ.
ΠΠΌΠ°ΠΌΠ΅ ΠΈ Π»Π΅ΡΠ΅Π½ ΠΏΡΠΈΡΡΠ°ΠΏ Π΄ΠΎ ΡΠΈΡΠ΅ ΠΌΠΎΠ΄Π΅Π»ΠΈ
ΠΈ Π½ΠΈΠ²Π½ΠΈΡΠ΅ Π²Π΅ΡΠ·ΠΈΠΈ
ΠΠ°ΠΊΠΎ ΠΈ Π²ΠΎ ΠΏΡΠ΅ΡΡ ΠΎΠ΄Π½ΠΈΠΎΡ ΠΏΠ°ΡΡΡ, ΡΠΈΡΠ΅ ΠΎΠΏΠ΅ΡΠ°ΡΠΈΠΈ ΠΌΠΎΠΆΠ΅ Π΄Π° ΡΠ΅ Π½Π°ΠΏΡΠ°Π²Π°Ρ ΡΠΎ ΠΏΠΎΠΌΠΎΡ Π½Π° API.
7. Π Π°ΡΠΏΠΎΡΠ΅Π΄Π΅ΡΠ΅ Π³ΠΎ ΠΌΠΎΠ΄Π΅Π»ΠΎΡ
ΠΠΎ ΠΎΠ²Π°Π° ΡΠ°Π·Π° Π²Π΅ΡΠ΅ ΠΈΠΌΠ°ΠΌΠ΅ ΠΎΠ±ΡΡΠ΅Π½ (ΠΊΠ΅ΡΠ°Ρ) ΠΌΠΎΠ΄Π΅Π». ΠΡΠΈΠΌΠ΅Ρ Π·Π° ΡΠΎΠ° ΠΊΠ°ΠΊΠΎ ΠΌΠΎΠΆΠ΅ΡΠ΅ Π΄Π° Π³ΠΎ ΠΊΠΎΡΠΈΡΡΠΈΡΠ΅:
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, Π·Π° ΠΏΠΎΠ³ΠΎΠ΄Π½ΠΎΡΡ. ΠΠΎΠ΅Π½ΡΠ°ΡΠ° Π΅ ΡΡΠΎ ΠΏΡΠΈΡΡΠ°ΠΏΡΠ²Π°ΠΌ Π΄ΠΎ Π΄Π°Π»Π΅ΡΠΈΠ½ΡΠΊΠΈ ΡΠ΅ΡΠ²Π΅Ρ ΠΈ Π±Π°ΡΠ°ΠΌ ΠΌΠΎΠ΄Π΅Π» ΡΠ°ΠΌΡ ΡΠΎ Π½Π°Π²Π΅Π΄Π΅Π½ΠΎΡΠΎ ΠΈΠΌΠ΅, ΠΈ Π½Π°ΡΠ½ΠΎΠ²Π°ΡΠ° ΠΏΡΠΎΠ΄ΡΠΊΡΠΈΡΠΊΠ° Π²Π΅ΡΠ·ΠΈΡΠ°. Π‘Π»Π΅Π΄Π½ΠΎ, Π³ΠΎ ΠΏΡΠ΅Π·Π΅ΠΌΠ°ΠΌ Π°ΡΡΠ΅ΡΠ°ΠΊΡΠΎΡ Π»ΠΎΠΊΠ°Π»Π½ΠΎ Π²ΠΎ ΠΏΠ°ΠΏΠΊΠ°ΡΠ° ./model ΠΈ Π³ΠΎ Π³ΡΠ°Π΄Π°ΠΌ ΠΌΠΎΠ΄Π΅Π»ΠΎΡ ΠΎΠ΄ ΠΎΠ²ΠΎΡ Π΄ΠΈΡΠ΅ΠΊΡΠΎΡΠΈΡΠΌ mlflow.keras.load_model(local_path). Π‘Π΅Π³Π° ΠΌΠΎΠΆΠ΅ΠΌΠ΅ Π΄Π° Π³ΠΎ ΠΊΠΎΡΠΈΡΡΠΈΠΌΠ΅ Π½Π°ΡΠΈΠΎΡ ΠΌΠΎΠ΄Π΅Π». ΠΡΠΎΠ³ΡΠ°ΠΌΠ΅ΡΠΈΡΠ΅ Π½Π° CV (ML) Π»Π΅ΡΠ½ΠΎ ΠΌΠΎΠΆΠ°Ρ Π΄Π° Π³ΠΎ ΠΏΠΎΠ΄ΠΎΠ±ΡΠ°Ρ ΠΌΠΎΠ΄Π΅Π»ΠΎΡ ΠΈ Π΄Π° ΠΎΠ±ΡΠ°Π²ΡΠ²Π°Π°Ρ Π½ΠΎΠ²ΠΈ Π²Π΅ΡΠ·ΠΈΠΈ.
ΠΠΎ Π·Π°ΠΊΠ»ΡΡΠΎΠΊ
ΠΡΠ΅Π·Π΅Π½ΡΠΈΡΠ°Π² ΡΠΈΡΡΠ΅ΠΌ ΠΊΠΎΡ ΠΎΠ²ΠΎΠ·ΠΌΠΎΠΆΡΠ²Π°:
- ΡΠ΅Π½ΡΡΠ°Π»Π½ΠΎ ΡΠΊΠ»Π°Π΄ΠΈΡΠ°ΡΠ΅ Π½Π° ΠΈΠ½ΡΠΎΡΠΌΠ°ΡΠΈΠΈ Π·Π° ML ΠΌΠΎΠ΄Π΅Π»ΠΈΡΠ΅, Π½Π°ΠΏΡΠ΅Π΄ΠΎΠΊΠΎΡ Π²ΠΎ ΠΎΠ±ΡΠΊΠ°ΡΠ° ΠΈ ΡΠ΅Π·ΡΠ»ΡΠ°ΡΠΈΡΠ΅;
- Π±ΡΠ·ΠΎ ΡΠ°ΡΠΏΠΎΡΠ΅Π΄ΡΠ²Π°ΡΠ΅ Π½Π° ΡΠ°Π·Π²ΠΎΡΠ½Π° ΡΡΠ΅Π΄ΠΈΠ½Π°;
- Π³ΠΎ ΡΠ»Π΅Π΄ΠΈ ΠΈ Π°Π½Π°Π»ΠΈΠ·ΠΈΡΠ° Π½Π°ΠΏΡΠ΅Π΄ΠΎΠΊΠΎΡ Π½Π° ΡΠ°Π±ΠΎΡΠ°ΡΠ° Π½Π° ΠΌΠΎΠ΄Π΅Π»ΠΈΡΠ΅;
- ΠΏΠΎΠ³ΠΎΠ΄Π½ΠΎ Π΅ Π΄Π° ΡΠ΅ Π²Π΅ΡΠ·ΠΈΡΠ° ΠΈ Π΄Π° ΡΠ΅ ΡΠΏΡΠ°Π²ΡΠ²Π° ΡΠΎ ΡΠΎΡΡΠΎΡΠ±Π°ΡΠ° Π½Π° ΠΌΠΎΠ΄Π΅Π»ΠΈΡΠ΅;
- ΠΠ΅ΡΠ½ΠΎ Π΅ Π΄Π° ΡΠ΅ ΡΠ°ΡΠΏΠΎΡΠ΅Π΄Π°Ρ Π΄ΠΎΠ±ΠΈΠ΅Π½ΠΈΡΠ΅ ΠΌΠΎΠ΄Π΅Π»ΠΈ.
ΠΠ²ΠΎΡ ΠΏΡΠΈΠΌΠ΅Ρ Π΅ ΠΈΠ³ΡΠ°ΡΠΊΠ° ΠΈ ΡΠ»ΡΠΆΠΈ ΠΊΠ°ΠΊΠΎ ΠΏΠΎΡΠ΅ΡΠ½Π° ΡΠΎΡΠΊΠ° Π·Π° Π³ΡΠ°Π΄Π΅ΡΠ΅ ΡΠΎΠΏΡΡΠ²Π΅Π½ ΡΠΈΡΡΠ΅ΠΌ, ΠΊΠΎΡ ΠΌΠΎΠΆΠ΅ Π΄Π° Π²ΠΊΠ»ΡΡΡΠ²Π° Π°Π²ΡΠΎΠΌΠ°ΡΠΈΠ·Π°ΡΠΈΡΠ° Π½Π° Π΅Π²Π°Π»ΡΠ°ΡΠΈΡΠ° Π½Π° ΡΠ΅Π·ΡΠ»ΡΠ°ΡΠΈΡΠ΅ ΠΈ ΡΠ΅Π³ΠΈΡΡΡΠ°ΡΠΈΡΠ° Π½Π° ΠΌΠΎΠ΄Π΅Π»ΠΈ (ΡΠΎΡΠΊΠΈ 5 ΠΈ 6, ΡΠΎΠΎΠ΄Π²Π΅ΡΠ½ΠΎ) ΠΈΠ»ΠΈ ΡΠ΅ Π΄ΠΎΠ΄Π°Π΄Π΅ΡΠ΅ Π²Π΅ΡΠ·ΠΈΠΈ Π½Π° ΡΠ΅ΡΠΎΠ²ΠΈ Π½Π° ΠΏΠΎΠ΄Π°ΡΠΎΡΠΈ, ΠΈΠ»ΠΈ ΠΌΠΎΠΆΠ΅Π±ΠΈ Π½Π΅ΡΡΠΎ Π΄ΡΡΠ³ΠΎ? ΠΠΎΠ΅Π½ΡΠ°ΡΠ° ΡΡΠΎ ΡΠ΅ ΠΎΠ±ΠΈΠ΄ΠΎΠ² Π΄Π° ΡΠ° ΠΊΠ°ΠΆΠ°ΠΌ Π΅ Π΄Π΅ΠΊΠ° Π²ΠΈ ΡΡΠ΅Π±Π°Π°Ρ MLOps ΠΊΠ°ΠΊΠΎ ΡΠ΅Π»ΠΈΠ½Π°, MLflow Π΅ ΡΠ°ΠΌΠΎ ΡΡΠ΅Π΄ΡΡΠ²ΠΎ Π·Π° ΠΏΠΎΡΡΠΈΠ³Π½ΡΠ²Π°ΡΠ΅ ΡΠ΅Π».
ΠΠ°ΠΏΠΈΡΠΈ ΡΠΎ ΠΊΠ°ΠΊΠ²ΠΈ ΠΏΡΠΎΠ±Π»Π΅ΠΌΠΈ Π½Π°ΠΈΠ΄ΠΎΠ²ΡΠ΅ ΡΡΠΎ Π½Π΅ Π³ΠΈ ΠΏΡΠΈΠΊΠ°ΠΆΠ°Π²?
Π¨ΡΠΎ Π±ΠΈ Π΄ΠΎΠ΄Π°Π»Π΅ Π²ΠΎ ΡΠΈΡΡΠ΅ΠΌΠΎΡ Π·Π° Π΄Π° Π³ΠΈ Π·Π°Π΄ΠΎΠ²ΠΎΠ»ΠΈ Π²Π°ΡΠΈΡΠ΅ ΠΏΠΎΡΡΠ΅Π±ΠΈ?
ΠΠΎΠΈ Π°Π»Π°ΡΠΊΠΈ ΠΈ ΠΏΡΠΈΡΡΠ°ΠΏΠΈ Π³ΠΈ ΠΊΠΎΡΠΈΡΡΠΈΡΠ΅ Π·Π° Π΄Π° Π³ΠΈ ΡΠ΅ΡΠΈΡΠ΅ ΡΠΈΡΠ΅ ΠΈΠ»ΠΈ Π΄Π΅Π» ΠΎΠ΄ ΠΏΡΠΎΠ±Π»Π΅ΠΌΠΈΡΠ΅?
Π.Π‘ ΡΠ΅ ΠΎΡΡΠ°Π²Π°ΠΌ Π½Π΅ΠΊΠΎΠ»ΠΊΡ Π»ΠΈΠ½ΠΊΠΎΠ²ΠΈ:
ΠΏΡΠΎΠ΅ΠΊΡ github -
MLflow -
ΠΠΎΡΠ°ΡΠ° ΡΠ°Π±ΠΎΡΠ½Π° Π΅-ΠΏΠΎΡΡΠ° Π·Π° ΠΏΡΠ°ΡΠ°ΡΠ° - [Π·Π°ΡΡΠΈΡΠ΅Π½Π° ΠΏΠΎ Π΅-ΠΏΠΎΡΡΠ°]
ΠΠ°ΡΠ°ΡΠ° ΠΊΠΎΠΌΠΏΠ°Π½ΠΈΡΠ° ΠΏΠ΅ΡΠΈΠΎΠ΄ΠΈΡΠ½ΠΎ Π΅ Π΄ΠΎΠΌΠ°ΡΠΈΠ½ Π½Π° ΡΠ°Π·Π½ΠΈ Π½Π°ΡΡΠ°Π½ΠΈ Π·Π° ΠΠ’ ΡΠΏΠ΅ΡΠΈΡΠ°Π»ΠΈΡΡΠΈ, Π½Π° ΠΏΡΠΈΠΌΠ΅Ρ: Π½Π° 8 ΡΡΠ»ΠΈ Π²ΠΎ 19:00 ΡΠ°ΡΠΎΡ ΠΏΠΎ ΠΌΠΎΡΠΊΠΎΠ²ΡΠΊΠΎ Π²ΡΠ΅ΠΌΠ΅ ΡΠ΅ ΠΈΠΌΠ° ΡΠΎΡΡΠ°Π½ΠΎΠΊ Π·Π° CV Π²ΠΎ ΠΎΠ½Π»Π°ΡΠ½ ΡΠΎΡΠΌΠ°Ρ, Π΄ΠΎΠΊΠΎΠ»ΠΊΡ ΡΡΠ΅ Π·Π°ΠΈΠ½ΡΠ΅ΡΠ΅ΡΠΈΡΠ°Π½ΠΈ, ΠΌΠΎΠΆΠ΅ΡΠ΅ Π΄Π° ΡΡΠ΅ΡΡΠ²ΡΠ²Π°ΡΠ΅, ΡΠ΅Π³ΠΈΡΡΡΠ°ΡΠΈΡΠ°
ΠΠ·Π²ΠΎΡ: www.habr.com