
ΠΠ΄ΡΠ°Π²Π΅ΠΉΡΠ΅ Π½Π° Π²ΡΠΈΡΠΊΠΈ! ΠΠ· ΡΡΠΌ CV-ΡΠ°Π·ΡΠ°Π±ΠΎΡΡΠΈΠΊ Π² ΠΠ ΠΠ. ΠΠ΅ΡΠ΅ ΡΡΠΈ Π³ΠΎΠ΄ΠΈΠ½ΠΈ ΡΠ΅Π°Π»ΠΈΠ·ΠΈΡΠ°ΠΌΠ΅ ΠΏΡΠΎΠ΅ΠΊΡΠΈ Π² ΠΎΠ±Π»Π°ΡΡΡΠ° Π½Π° CV. ΠΡΠ΅Π· ΡΠΎΠ²Π° Π²ΡΠ΅ΠΌΠ΅ ΡΠΌΠ΅ Π½Π°ΠΏΡΠ°Π²ΠΈΠ»ΠΈ ΠΊΠ°ΠΊΠ²ΠΎ Π»ΠΈ Π½Π΅, Π½Π°ΠΏΡΠΈΠΌΠ΅Ρ: Π½Π°Π±Π»ΡΠ΄Π°Π²Π°Π»ΠΈ ΡΠΎΡΡΠΎΡΠΈ, Π·Π° Π΄Π° ΡΠ΅ ΡΠ²Π΅ΡΠΈΠΌ, ΡΠ΅ ΠΏΠΎ Π²ΡΠ΅ΠΌΠ΅ Π½Π° ΡΠΎΡΠΈΡΠ°Π½Π΅ Π½Π΅ ΠΏΠΈΡΡ, Π½Π΅ ΠΏΡΡΠ°Ρ, Π½Π΅ Π³ΠΎΠ²ΠΎΡΡΡ ΠΏΠΎ ΡΠ΅Π»Π΅ΡΠΎΠ½Π°, Π° Π³Π»Π΅Π΄Π°Ρ Π½Π° ΠΏΡΡΡ, Π° Π½Π΅ Π½Π° ΡΡΠ½ΠΈΡΠ°ΡΠ° ΠΈΠ»ΠΈ ΠΎΠ±Π»Π°ΡΠΈΡΠ΅; ΡΠΈΠΊΡΠΈΡΠ°Π»ΠΈ ΡΠΌΠ΅ Π»ΡΠ±ΠΈΡΠ΅Π»ΠΈ Π½Π° ΡΠΎΡΠΈΡΠ°Π½Π΅ΡΠΎ ΠΏΠΎ ΡΠΏΠ΅ΡΠΈΠ°Π»ΠΈΠ·ΠΈΡΠ°Π½ΠΈ Π»Π΅Π½ΡΠΈ ΠΈ Π·Π°Π΅ΠΌΠ°ΡΠΈ Π½ΡΠΊΠΎΠ»ΠΊΠΎ ΠΌΠ΅ΡΡΠ° Π½Π° ΠΏΠ°ΡΠΊΠΈΠ½Π³Π°; ΡΠ»Π΅Π΄Π΅Π»ΠΈ ΡΠΌΠ΅ Π·Π° ΡΠΎΠ²Π° ΡΠ°Π±ΠΎΡΠ½ΠΈΡΠΈΡΠ΅ Π΄Π° Π½ΠΎΡΡΡ ΠΊΠ°ΡΠΊΠΈ, ΡΡΠΊΠ°Π²ΠΈΡΠΈ ΠΈ Ρ.Π½.; ΠΈΠ΄Π΅Π½ΡΠΈΡΠΈΡΠΈΡΠ°Π»ΠΈ ΡΠΌΠ΅ ΡΠ»ΡΠΆΠΈΡΠ΅Π», ΠΊΠΎΠΉΡΠΎ ΠΈΡΠΊΠ° Π΄Π° Π²Π»Π΅Π·Π΅ Π² ΠΎΠ±Π΅ΠΊΡΠ°; ΠΏΡΠ΅Π±ΡΠΎΠΈΠ»ΠΈ ΡΠΌΠ΅ Π²ΡΠΈΡΠΊΠΎ, ΠΊΠΎΠ΅ΡΠΎ Π΅ Π²ΡΠ·ΠΌΠΎΠΆΠ½ΠΎ.
Π Π·Π°ΡΠΎ ΡΠΎΠ²Π° ΠΊΠ°Π·Π²Π°ΠΌ?
Π ΠΏΡΠΎΡΠ΅ΡΠ° Π½Π° ΡΠ΅Π°Π»ΠΈΠ·Π°ΡΠΈΡ Π½Π° ΠΏΡΠΎΠ΅ΠΊΡΠΈΡΠ΅ Π½Π°ΡΡΡΠΏΠ°Ρ ΠΌΠ΅ ΠΎΠΏΠΈΡ, ΠΌΠ½ΠΎΠ³ΠΎ ΠΎΠΏΠΈΡ, Ρ ΡΠ°ΡΡ ΠΎΡ ΠΏΡΠΎΠ±Π»Π΅ΠΌΠΈΡΠ΅ Π²ΠΈΠ΅ ΠΈΠ»ΠΈ ΡΡΠ΅ Π·Π°ΠΏΠΎΠ·Π½Π°ΡΠΈ, ΠΈΠ»ΠΈ ΡΠ΅ ΡΠ΅ Π·Π°ΠΏΠΎΠ·Π½Π°Π΅ΡΠ΅ Π² Π±ΡΠ΄Π΅ΡΠ΅.
ΠΠΎΠ΄Π΅Π»ΠΈΡΠ°ΠΌΠ΅ ΡΠΈΡΡΠ°ΡΠΈΡ
ΠΡΠ΅Π΄ΡΡΠ°Π²Π΅ΡΠ΅ ΡΠΈ, ΡΠ΅ ΡΠΌΠ΅ Π² ΠΌΠ»Π°Π΄Π° ΠΊΠΎΠΌΠΏΠ°Π½ΠΈΡ "N", ΡΠΈΡΡΠΎ Π΄Π΅ΠΉΠ½ΠΎΡΡ Π΅ ΡΠ²ΡΡΠ·Π°Π½Π° Ρ ML. Π Π°Π±ΠΎΡΠΈΠΌ ΠΏΠΎ ΠΏΡΠΎΠ΅ΠΊΡ Π² ΡΡΠ΅ΡΠ°ΡΠ° Π½Π° ML (DL, CV) ΠΈ ΠΏΠΎΡΠ°Π΄ΠΈ Π½ΡΠΊΠ°ΠΊΠ²ΠΈ ΠΏΡΠΈΡΠΈΠ½ΠΈ ΡΠ΅ ΠΏΡΠ΅Ρ Π²ΡΡΠ»ΡΠΌΠ΅ Π½Π° Π΄ΡΡΠ³Π° ΡΠ°Π±ΠΎΡΠ°, ΠΈΠ·ΠΎΠ±ΡΠΎ ΠΏΡΠ°Π²ΠΈΠΌ ΠΏΠ°ΡΠ·Π° ΠΈ ΠΏΠΎΡΠ»Π΅ ΡΠ΅ Π²ΡΡΡΠ°ΠΌΠ΅ ΠΊΡΠΌ Π½Π°ΡΠ°ΡΠ° ΠΈΠ»ΠΈ ΡΡΠΆΠ΄Π° Π½Π΅Π²ΡΠΎΠ½Π½Π° ΠΌΡΠ΅ΠΆΠ°.
- ΠΠ°ΡΡΡΠΏΠ²Π° ΠΌΠΎΠΌΠ΅Π½ΡΡΡ Π½Π° ΠΈΡΡΠΈΠ½Π°ΡΠ°, ΡΡΡΠ±Π²Π° Π΄Π° ΡΠΈ ΡΠΏΠΎΠΌΠ½ΠΈΠΌ Π½Π° ΠΊΠ°ΠΊΠ²ΠΎ ΡΠΌΠ΅ ΡΠΏΠΈΡΠ°Π»ΠΈ, ΠΊΠ°ΠΊΠ²ΠΈ Ρ ΠΈΠΏΠ΅ΡΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡΠΈ ΡΠΌΠ΅ ΠΎΠΏΠΈΡΠ²Π°Π»ΠΈ ΠΈ Π½Π°ΠΉ-Π²Π΅ΡΠ΅, Π΄ΠΎ ΠΊΠ°ΠΊΠ²ΠΈ ΡΠ΅Π·ΡΠ»ΡΠ°ΡΠΈ ΡΠ΅ ΡΠ° Π΄ΠΎΠ²Π΅Π»ΠΈ. ΠΠΎΠΆΠ΅ Π΄Π° ΠΈΠΌΠ° Π±Π΅Π·Π±ΡΠΎΠΉ Π²Π°ΡΠΈΠ°Π½ΡΠΈ Π·Π° ΡΠΎΠ²Π° ΠΊΠ°ΠΊ Π²ΡΠ΅ΠΊΠΈ Π΅ ΡΡΡ ΡΠ°Π½ΡΠ²Π°Π» ΠΈΠ½ΡΠΎΡΠΌΠ°ΡΠΈΡΡΠ° Π·Π° Π²ΡΠΈΡΠΊΠΈ ΠΏΡΡΠΊΠ°Π½ΠΈΡ: Π² Π³Π»Π°Π²Π°ΡΠ°, Π² ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΠΈ, Π² Π±Π΅Π»Π΅ΠΆΠ½ΠΈΠΊ, Π² ΡΠ°Π±ΠΎΡΠ½Π° ΡΡΠ΅Π΄Π° Π² ΠΎΠ±Π»Π°ΠΊΠ°. ΠΠ· ΡΡΠΌ Π²ΠΈΠΆΠ΄Π°Π» Π²Π°ΡΠΈΠ°Π½Ρ, ΠΏΡΠΈ ΠΊΠΎΠΉΡΠΎ Ρ ΠΈΠΏΠ΅ΡΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡΠΈΡΠ΅ ΡΠ° Π±ΠΈΠ»ΠΈ ΡΡΡ ΡΠ°Π½ΡΠ²Π°Π½ΠΈ ΠΏΠΎΠ΄ ΡΠΎΡΠΌΠ°ΡΠ° Π½Π° ΠΊΠΎΠΌΠ΅Π½ΡΠΈΡΠ°Π½ΠΈ ΡΠ΅Π΄ΠΎΠ²Π΅ Π² ΠΊΠΎΠ΄Π°, ΠΎΠ±ΡΠΎ Π²Π·Π΅ΡΠΎ ΠΏΠΎΠ»Π΅Ρ Π½Π° ΡΠ°Π½ΡΠ°Π·ΠΈΡ. Π ΡΠ΅Π³Π° ΡΠΈ ΠΏΡΠ΅Π΄ΡΡΠ°Π²Π΅ΡΠ΅, ΡΠ΅ ΡΠ΅ Π²ΡΡΡΠ°ΡΠ΅ Π½Π΅ ΠΊΡΠΌ Π²Π°ΡΠΈΡ ΠΏΡΠΎΠ΅ΠΊΡ, Π° ΠΊΡΠΌ ΠΏΡΠΎΠ΅ΠΊΡΠ° Π½Π° ΡΠΎΠ²Π΅ΠΊ, ΠΊΠΎΠΉΡΠΎ Π΅ Π½Π°ΠΏΡΡΠ½Π°Π» ΠΊΠΎΠΌΠΏΠ°Π½ΠΈΡΡΠ° ΠΈ Π² Π½Π°ΡΠ»Π΅Π΄ΡΡΠ²ΠΎ Π²ΠΈ Π΅ ΠΎΡΡΠ°Π½Π°Π» ΠΊΠΎΠ΄ ΠΈ ΠΌΠΎΠ΄Π΅Π» Ρ ΠΈΠΌΠ΅ model_1.pb. ΠΠ° Π΄Π° Π·Π°Π²ΡΡΡΠΈΠΌ ΠΊΠ°ΡΡΠΈΠ½Π°ΡΠ° ΠΈ Π΄Π° ΠΏΡΠ΅Π΄Π°Π΄Π΅ΠΌ ΡΡΠ»Π°ΡΠ° Π±ΠΎΠ»ΠΊΠ°, Π΄Π° ΡΠΈ ΠΏΡΠ΅Π΄ΡΡΠ°Π²ΠΈΠΌ, ΡΠ΅ Π²ΠΈΠ΅ ΡΡΠ΅ ΠΈ Π½Π°ΡΠΈΠ½Π°Π΅Ρ ΡΠΏΠ΅ΡΠΈΠ°Π»ΠΈΡΡ.
- ΠΡΠΎΠ΄ΡΠ»ΠΆΠ°Π²Π°ΠΌΠ΅ Π½Π°ΠΏΡΠ΅Π΄. ΠΠ° Π΄Π° ΡΡΠ°ΡΡΠΈΡΠ°ΠΌΠ΅ ΠΊΠΎΠ΄Π°, Π΅ Π½Π΅ΠΎΠ±Ρ ΠΎΠ΄ΠΈΠΌΠΎ Π΄Π° ΡΡΠ·Π΄Π°Π΄Π΅ΠΌ ΡΡΠ΅Π΄Π° Π·Π° ΡΠ°Π±ΠΎΡΠ°, Π½Π΅ΠΎΠ±Ρ ΠΎΠ΄ΠΈΠΌΠ° ΠΈ Π½Π° Π²ΡΠΈΡΠΊΠΈ, ΠΊΠΎΠΈΡΠΎ ΡΠ΅ ΡΠ°Π±ΠΎΡΡΡ Ρ Π½Π΅Π³ΠΎ. Π§Π΅ΡΡΠΎ ΡΠ΅ ΡΠ»ΡΡΠ²Π° ΡΠ°ΠΊΠ°, ΡΠ΅ ΠΈ ΡΡΠ΅Π΄Π°ΡΠ° Π½Π΅ Π΅ ΠΎΡΡΠ°Π²Π΅Π½Π° Π² Π½Π°ΡΠ»Π΅Π΄ΡΡΠ²ΠΎ ΠΏΠΎ Π½ΡΠΊΠ°ΠΊΠ²ΠΈ ΠΏΡΠΈΡΠΈΠ½ΠΈ. Π’ΠΎΠ²Π° ΡΡΡΠΎ ΠΌΠΎΠΆΠ΅ Π΄Π° ΡΠ΅ ΠΎΠΊΠ°ΠΆΠ΅ Π½Π΅ΡΡΠΈΠ²ΠΈΠ°Π»Π½Π° Π·Π°Π΄Π°ΡΠ°. ΠΠ΅ Π΅ Π»ΠΈ ΠΆΠ°Π»ΠΊΠΎ Π΄Π° Π³ΡΠ±ΠΈΠΌ Π²ΡΠ΅ΠΌΠ΅ Π·Π° ΡΠΎΠ·ΠΈ Π΅ΡΠ°ΠΏ?
- ΠΠ±ΡΡΠ°Π²Π°ΠΌΠ΅ ΠΌΠΎΠ΄Π΅Π» (Π½Π°ΠΏΡΠΈΠΌΠ΅Ρ, Π΄Π΅ΡΠ΅ΠΊΡΠΎΡ Π½Π° Π°Π²ΡΠΎΠΌΠΎΠ±ΠΈΠ»ΠΈ). ΠΠΎΡΡΠΈΠ³Π°ΠΌΠ΅ ΠΌΠΎΠΌΠ΅Π½ΡΠ°, Π² ΠΊΠΎΠΉΡΠΎ ΡΠΎΠΉ ΡΡΠ°Π²Π° ΠΌΠ½ΠΎΠ³ΠΎ Π΄ΠΎΠ±ΡΡ β Π²ΡΠ΅ΠΌΠ΅ Π΅ Π΄Π° Π·Π°ΠΏΠ°Π·ΠΈΠΌ ΡΠ΅Π·ΡΠ»ΡΠ°ΡΠ°. ΠΠ΅ΠΊΠ° Π³ΠΎ Π½Π°ΡΠ΅ΡΠ΅ΠΌ car_detection_v1.pb. Π‘Π»Π΅Π΄ ΡΠΎΠ²Π° ΠΎΠ±ΡΡΠ°Π²Π°ΠΌΠ΅ ΠΎΡΠ΅ Π΅Π΄ΠΈΠ½ β car_detection_v2.pb. ΠΡΠΊΠΎΠ»ΠΊΠΎ Π²ΡΠ΅ΠΌΠ΅ ΠΏΠΎ-ΠΊΡΡΠ½ΠΎ Π½Π°ΡΠΈΡΠ΅ ΠΊΠΎΠ»Π΅Π³ΠΈ ΠΈΠ»ΠΈ Π½ΠΈΠ΅ ΡΠ°ΠΌΠΈΡΠ΅ ΠΎΠ±ΡΡΠ°Π²Π°ΠΌΠ΅ ΠΎΡΠ½ΠΎΠ²ΠΎ ΠΈ ΠΎΡΠ½ΠΎΠ²ΠΎ, ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°ΠΉΠΊΠΈ ΡΠ°Π·Π»ΠΈΡΠ½ΠΈ Π°ΡΡ ΠΈΡΠ΅ΠΊΡΡΡΠΈ. Π ΠΊΡΠ°ΠΉΠ½Π° ΡΠΌΠ΅ΡΠΊΠ° ΡΠ΅ ΡΠΎΡΠΌΠΈΡΠ° ΠΊΡΠΏ Π°ΡΡΠ΅ΡΠ°ΠΊΡΠΈ, ΠΈΠ½ΡΠΎΡΠΌΠ°ΡΠΈΡ Π·Π° ΠΊΠΎΠΈΡΠΎ ΡΡΡΠ±Π²Π° Π²Π½ΠΈΠΌΠ°ΡΠ΅Π»Π½ΠΎ Π΄Π° ΡΠ΅ ΡΡΠ±ΠΈΡΠ° (Π½ΠΎ, ΡΠ΅ Π³ΠΎ Π½Π°ΠΏΡΠ°Π²ΠΈΠΌ ΠΏΠΎ-ΠΊΡΡΠ½ΠΎ, Π·Π°ΡΠΎΡΠΎ ΠΈΠΌΠ°ΠΌΠ΅ ΠΏΠΎ-ΠΏΡΠΈΠΎΡΠΈΡΠ΅ΡΠ½ΠΈ Π·Π°Π΄Π°ΡΠΈ).
- Π, ΡΠΎΠ²Π° Π΅ Π²ΡΠΈΡΠΊΠΎ! ΠΠΌΠ°ΠΌΠ΅ ΠΌΠΎΠ΄Π΅Π»! ΠΠΎΠΆΠ΅ΠΌ Π΄Π° Π·Π°ΠΏΠΎΡΠ²Π°ΠΌΠ΅ ΠΎΠ±ΡΡΠ΅Π½ΠΈΠ΅ΡΠΎ Π½Π° ΡΠ»Π΅Π΄Π²Π°ΡΠΈΡ ΠΌΠΎΠ΄Π΅Π», Π΄Π° ΡΠ°Π·ΡΠ°Π±ΠΎΡΠ²Π°ΠΌΠ΅ Π°ΡΡ ΠΈΡΠ΅ΠΊΡΡΡΠ° Π·Π° ΡΠ΅ΡΠ΅Π½ΠΈΠ΅ Π½Π° Π½ΠΎΠ²Π° Π·Π°Π΄Π°ΡΠ° ΠΈΠ»ΠΈ ΠΌΠΎΠΆΠ΅ΠΌ Π΄Π° ΠΎΡΠΈΠ΄Π΅ΠΌ Π΄Π° ΠΏΠΈΠ΅ΠΌ ΡΠ°ΠΉ? Π ΠΊΠΎΠΉ ΡΠ΅ Π½Π°ΠΏΡΠ°Π²ΠΈ Π΄Π΅ΠΏΠ»ΠΎΠΉΠ²Π°Π½Π΅ΡΠΎ?
ΠΠ΄Π΅Π½ΡΠΈΡΠΈΡΠΈΡΠ°ΠΌΠ΅ ΠΏΡΠΎΠ±Π»Π΅ΠΌΠΈΡΠ΅
Π Π°Π±ΠΎΡΠ°ΡΠ° ΠΏΠΎ ΠΏΡΠΎΠ΅ΠΊΡ ΠΈΠ»ΠΈ ΠΏΡΠΎΠ΄ΡΠΊΡ Π΅ ΡΡΡΠ΄ Π½Π° ΠΌΠ½ΠΎΠ³ΠΎ Ρ ΠΎΡΠ°. Π‘ Π²ΡΠ΅ΠΌΠ΅ΡΠΎ Ρ ΠΎΡΠ°ΡΠ° Π½Π°ΠΏΡΡΠΊΠ°Ρ ΠΈ ΠΈΠ΄Π²Π°Ρ, ΠΏΡΠΎΠ΅ΠΊΡΠΈΡΠ΅ ΡΡΠ°Π²Π°Ρ Π²ΡΠ΅ ΠΏΠΎΠ²Π΅ΡΠ΅, Π° ΡΠ°ΠΌΠΈΡΠ΅ ΠΏΡΠΎΠ΅ΠΊΡΠΈ ΡΡΠ°Π²Π°Ρ ΠΏΠΎ-ΡΠ»ΠΎΠΆΠ½ΠΈ. Π’Π°ΠΊΠ° ΠΈΠ»ΠΈ ΠΈΠ½Π°ΡΠ΅, ΡΠΈΡΡΠ°ΡΠΈΠΈΡΠ΅ ΠΎΡ ΠΎΠΏΠΈΡΠ°Π½ΠΈΡ ΡΠΈΠΊΡΠ» (ΠΈ Π½Π΅ ΡΠ°ΠΌΠΎ) Π² ΡΠ°Π·Π»ΠΈΡΠ½ΠΈ ΠΊΠΎΠΌΠ±ΠΈΠ½Π°ΡΠΈΠΈ ΡΠ΅ ΡΠ΅ ΡΡΠ΅ΡΠ°Ρ ΠΎΡ ΠΈΡΠ΅ΡΠ°ΡΠΈΡ Π½Π° ΠΈΡΠ΅ΡΠ°ΡΠΈΡ. ΠΡΠΈΡΠΊΠΎ ΡΠΎΠ²Π° Π²ΠΎΠ΄ΠΈ Π΄ΠΎ Π·Π°Π³ΡΠ±Π° Π½Π° Π²ΡΠ΅ΠΌΠ΅, ΠΎΠ±ΡΡΠΊΠ²Π°Π½Π΅, Π½Π΅ΡΠ²ΠΈ, Π° Π²ΡΠ·ΠΌΠΎΠΆΠ½ΠΎ β Π½Π΅Π΄ΠΎΠ²ΠΎΠ»ΡΡΠ²ΠΎ ΠΎΡ ΡΡΡΠ°Π½Π° Π½Π° ΠΊΠ»ΠΈΠ΅Π½ΡΠ° ΠΈ Π² ΠΊΡΠ°ΠΉΠ½Π° ΡΠΌΠ΅ΡΠΊΠ° β Π΄ΠΎ ΠΏΡΠΎΠΏΡΡΠ½Π°ΡΠΈ ΠΏΠ°ΡΠΈ. ΠΠ°ΠΊΠ°Ρ ΡΠ΅ ΠΎΠ±ΠΈΠΊΠ½ΠΎΠ²Π΅Π½ΠΎ ΡΡΡΠΏΠ²Π°ΠΌΠ΅ ΠΏΠΎ ΡΡΠ°ΡΠΈ Π³ΡΠ°Π±Π»ΠΈ, ΠΌΠΈΡΠ»Ρ, ΡΠ΅ Π½ΠΈΠΊΠΎΠΉ Π½Π΅ ΠΈΡΠΊΠ° Π΄Π° ΠΈΠ·ΠΏΠΈΡΠ²Π° ΡΠ΅Π·ΠΈ ΠΌΠΎΠΌΠ΅Π½ΡΠΈ ΠΎΡΠ½ΠΎΠ²ΠΎ ΠΈ ΠΎΡΠ½ΠΎΠ²ΠΎ.

Π ΡΠ°ΠΊΠ°, ΠΏΡΠ΅ΠΌΠΈΠ½Π°Ρ ΠΌΠ΅ ΠΏΡΠ΅Π· Π΅Π΄ΠΈΠ½ ΡΠΈΠΊΡΠ» Π½Π° ΡΠ°Π·ΡΠ°Π±ΠΎΡΠΊΠ° ΠΈ Π²ΠΈΠΆΠ΄Π°ΠΌΠ΅, ΡΠ΅ ΠΈΠΌΠ° ΠΏΡΠΎΠ±Π»Π΅ΠΌΠΈ, ΠΊΠΎΠΈΡΠΎ ΡΡΡΠ±Π²Π° Π΄Π° Π±ΡΠ΄Π°Ρ ΡΠ΅ΡΠ΅Π½ΠΈ. ΠΠ° ΡΠΎΠ²Π° Π΅ Π½Π΅ΠΎΠ±Ρ ΠΎΠ΄ΠΈΠΌΠΎ:
- ΡΠ΄ΠΎΠ±Π½ΠΎ Π΄Π° ΡΠ΅ ΡΡΡ ΡΠ°Π½ΡΠ²Π°Ρ ΡΠ΅Π·ΡΠ»ΡΠ°ΡΠΈΡΠ΅ ΠΎΡ ΡΠ°Π±ΠΎΡΠ°ΡΠ°;
- Π΄Π° Π½Π°ΠΏΡΠ°Π²ΠΈΠΌ ΠΏΡΠΎΡΠ΅ΡΠ° Π½Π° ΠΏΡΠΈΠ²Π»ΠΈΡΠ°Π½Π΅ Π½Π° Π½ΠΎΠ²ΠΈ ΡΠ»ΡΠΆΠΈΡΠ΅Π»ΠΈ ΠΏΡΠΎΡΡ;
- Π΄Π° ΡΠ»Π΅ΡΠ½ΠΈΠΌ ΠΏΡΠΎΡΠ΅ΡΠ° Π½Π° ΡΠ°Π·Π³ΡΡΡΠ°Π½Π΅ Π½Π° ΡΡΠ΅Π΄Π°ΡΠ° Π·Π° ΡΠ°Π·ΡΠ°Π±ΠΎΡΠΊΠ°;
- Π΄Π° Π½Π°ΡΡΡΠΎΠΈΠΌ ΠΏΡΠΎΡΠ΅ΡΠ° Π½Π° Π²Π΅ΡΡΠΈΠΎΠ½ΠΈΡΠ°Π½Π΅ Π½Π° ΠΌΠΎΠ΄Π΅Π»ΠΈΡΠ΅;
- Π΄Π° ΠΈΠΌΠ°ΠΌΠ΅ ΡΠ΄ΠΎΠ±Π΅Π½ Π½Π°ΡΠΈΠ½ Π·Π° Π²Π°Π»ΠΈΠ΄ΠΈΡΠ°Π½Π΅ Π½Π° ΠΌΠΎΠ΄Π΅Π»ΠΈΡΠ΅;
- Π΄Π° Π½Π°ΠΌΠ΅ΡΠΈΠΌ ΠΈΠ½ΡΡΡΡΠΌΠ΅Π½Ρ Π·Π° ΡΠΏΡΠ°Π²Π»Π΅Π½ΠΈΠ΅ Π½Π° ΡΡΡΡΠΎΡΠ½ΠΈΠ΅ΡΠΎ Π½Π° ΠΌΠΎΠ΄Π΅Π»ΠΈΡΠ΅;
- Π΄Π° Π½Π°ΠΌΠ΅ΡΠΈΠΌ Π½Π°ΡΠΈΠ½ Π·Π° Π΄ΠΎΡΡΠ°Π²ΠΊΠ° Π½Π° ΠΌΠΎΠ΄Π΅Π»ΠΈΡΠ΅ Π² ΠΏΡΠΎΠ΄ΡΠΊΡΠΈΡ.
Π―Π²Π½ΠΎ Π΅ Π½Π΅ΠΎΠ±Ρ ΠΎΠ΄ΠΈΠΌΠΎ Π΄Π° ΠΈΠ·ΠΌΠΈΡΠ»ΠΈΠΌ ΡΠ°Π±ΠΎΡΠ΅Π½ ΠΏΡΠΎΡΠ΅Ρ, ΠΊΠΎΠΉΡΠΎ Π΄Π° ΠΏΠΎΠ·Π²ΠΎΠ»ΡΠ²Π° Π»Π΅ΡΠ½ΠΎ ΠΈ ΡΠ΄ΠΎΠ±Π½ΠΎ ΡΠΏΡΠ°Π²Π»Π΅Π½ΠΈΠ΅ Π½Π° ΡΠΎΠ·ΠΈ ΠΆΠΈΠ·Π½Π΅Π½ ΡΠΈΠΊΡΠ»? Π’Π°Π·ΠΈ ΠΏΡΠ°ΠΊΡΠΈΠΊΠ° ΠΈΠΌΠ° ΠΈΠΌΠ΅ MLOps
MLOps, ΠΈΠ»ΠΈ DevOps Π·Π° ΠΌΠ°ΡΠΈΠ½Π½ΠΎ ΠΎΠ±ΡΡΠ΅Π½ΠΈΠ΅, ΠΏΠΎΠ·Π²ΠΎΠ»ΡΠ²Π° Π½Π° Π΅ΠΊΠΈΠΏΠΈΡΠ΅ ΠΎΡ ΡΠΏΠ΅ΡΠΈΠ°Π»ΠΈΡΡΠΈ ΠΏΠΎ ΠΎΠ±ΡΠ°Π±ΠΎΡΠΊΠ° ΠΈ Π°Π½Π°Π»ΠΈΠ· Π½Π° Π΄Π°Π½Π½ΠΈ ΠΈ ΠΠ’ ΡΠΏΠ΅ΡΠΈΠ°Π»ΠΈΡΡΠΈ Π΄Π° ΡΠΈ ΡΡΡΡΡΠ΄Π½ΠΈΡΠ°Ρ, ΠΊΠ°ΠΊΡΠΎ ΠΈ Π΄Π° ΡΠ²Π΅Π»ΠΈΡΠ°Π²Π°Ρ ΡΠ΅ΠΌΠΏΠΎΠ²Π΅ΡΠ΅ Π½Π° ΡΠ°Π·ΡΠ°Π±ΠΎΡΠΊΠ° ΠΈ ΡΠ°Π·Π³ΡΡΡΠ°Π½Π΅ Π½Π° ΠΌΠΎΠ΄Π΅Π»ΠΈ ΡΡΠ΅Π· ΠΌΠΎΠ½ΠΈΡΠΎΡΠΈΠ½Π³, ΠΏΡΠΎΠ²Π΅ΡΠΊΠ° ΠΈ ΡΠΈΡΡΠ΅ΠΌΠ° Π·Π° ΡΠΏΡΠ°Π²Π»Π΅Π½ΠΈΠ΅ Π½Π° ΠΌΠΎΠ΄Π΅Π»ΠΈΡΠ΅ Π½Π° ΠΌΠ°ΡΠΈΠ½Π½ΠΎ ΠΎΠ±ΡΡΠ΅Π½ΠΈΠ΅.
ΠΠΎΠΆΠ΅ΡΠ΅ , ΠΊΠ°ΠΊΠ²ΠΎ ΠΌΠΈΡΠ»ΡΡ ΠΏΠΎ Π²ΡΠΈΡΠΊΠΎ ΡΠΎΠ²Π° Ρ ΠΎΡΠ°ΡΠ° ΠΎΡ Google. ΠΡ ΡΡΠ°ΡΠΈΡΡΠ° Π΅ ΡΡΠ½ΠΎ, ΡΠ΅ MLOps Π΅ Π΄ΠΎΡΡΠ° ΠΎΠ±Π΅ΠΌΠ½Π° ΡΠ΅ΠΌΠ°.

Π ΡΠ»Π΅Π΄Π²Π°ΡΠ°ΡΠ° ΡΠΈ ΡΡΠ°ΡΠΈΡ ΡΠ΅ ΠΎΠΏΠΈΡΠ° ΡΠ°ΠΌΠΎ ΡΠ°ΡΡ ΠΎΡ ΠΏΡΠΎΡΠ΅ΡΠ°. ΠΠ° ΡΠ΅Π°Π»ΠΈΠ·Π°ΡΠΈΡΡΠ° ΡΠ΅ ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°ΠΌ ΠΈΠ½ΡΡΡΡΠΌΠ΅Π½ΡΠ° MLflow, ΡΡΠΉ ΠΊΠ°ΡΠΎ Π΅ open-source ΠΏΡΠΎΠ΅ΠΊΡ, Π·Π° ΡΠ²ΡΡΠ·Π²Π°Π½Π΅ΡΠΎ Π΅ Π½Π΅ΠΎΠ±Ρ ΠΎΠ΄ΠΈΠΌΠΎ ΠΌΠ°Π»ΠΊΠΎ ΠΊΠΎΠ»ΠΈΡΠ΅ΡΡΠ²ΠΎ ΠΊΠΎΠ΄ ΠΈ ΠΈΠΌΠ° ΠΈΠ½ΡΠ΅Π³ΡΠ°ΡΠΈΡ Ρ ΠΏΠΎΠΏΡΠ»ΡΡΠ½ΠΈ ml-ΡΡΠ΅ΠΉΠΌΠ²ΠΎΡΠΊΠΎΠ²Π΅. ΠΠΎΠΆΠ΅ΡΠ΅ Π΄Π° ΠΏΠΎΡΡΡΡΠΈΡΠ΅ Π² ΠΈΠ½ΡΠ΅ΡΠ½Π΅Ρ ΠΈ Π΄ΡΡΠ³ΠΈ ΠΈΠ½ΡΡΡΡΠΌΠ΅Π½ΡΠΈ, ΠΊΠ°ΡΠΎ Kubeflow, SageMaker, Trains ΠΈ Ρ.Π½., ΠΈ Π΅Π²Π΅Π½ΡΡΠ°Π»Π½ΠΎ Π΄Π° ΠΏΠΎΠ΄Π±Π΅ΡΠ΅ΡΠ΅ ΡΠΎΠ·ΠΈ, ΠΊΠΎΠΉΡΠΎ Π½Π°ΠΉ-Π΄ΠΎΠ±ΡΠ΅ ΠΎΡΠ³ΠΎΠ²Π°ΡΡ Π½Π° Π²Π°ΡΠΈΡΠ΅ Π½ΡΠΆΠ΄ΠΈ.
"ΠΠ·Π³ΡΠ°ΠΆΠ΄Π°ΠΌΠ΅" MLOps Π½Π° ΠΏΡΠΈΠΌΠ΅ΡΠ° Ρ ΠΈΠ½ΡΡΡΡΠΌΠ΅Π½ΡΠ° MLFlow
MLFlow Π΅ ΠΏΠ»Π°ΡΡΠΎΡΠΌΠ° Ρ ΠΎΡΠ²ΠΎΡΠ΅Π½ ΠΊΠΎΠ΄ Π·Π° ΡΠΏΡΠ°Π²Π»Π΅Π½ΠΈΠ΅ Π½Π° ΠΆΠΈΠ·Π½Π΅Π½ΠΈΡ ΡΠΈΠΊΡΠ» Π½Π° ml ΠΌΠΎΠ΄Π΅Π»ΠΈ ().
MLflow Π²ΠΊΠ»ΡΡΠ²Π° ΡΠ΅ΡΠΈΡΠΈ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½ΡΠ°:
- MLflow Tracking β ΡΠ΅ΡΠ°Π²Π° Π²ΡΠΏΡΠΎΡΠΈΡΠ΅ Π·Π° Π·Π°ΠΏΠΈΡΠ²Π°Π½Π΅ Π½Π° ΡΠ΅Π·ΡΠ»ΡΠ°ΡΠΈ ΠΈ ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡΠΈ, ΠΊΠΎΠΈΡΠΎ Π²ΠΎΠ΄ΡΡ Π΄ΠΎ ΡΠΎΠ·ΠΈ ΡΠ΅Π·ΡΠ»ΡΠ°Ρ;
- MLflow Project β ΠΏΠΎΠ·Π²ΠΎΠ»ΡΠ²Π° ΠΎΠΏΠ°ΠΊΠΎΠ²Π°Π½Π΅ Π½Π° ΠΊΠΎΠ΄ ΠΈ Π½Π΅Π³ΠΎΠ²ΠΎΡΠΎ Π²ΡΠ·ΠΏΡΠΎΠΈΠ·Π²Π΅ΠΆΠ΄Π°Π½Π΅ Π½Π° Π²ΡΡΠΊΠ° ΠΏΠ»Π°ΡΡΠΎΡΠΌΠ°;
- MLflow Models β ΠΎΡΠ³ΠΎΠ²Π°ΡΡ Π·Π° ΡΠ°Π·ΠΏΠΎΠ»Π°Π³Π°Π½Π΅ Π½Π° ΠΌΠΎΠ΄Π΅Π»ΠΈ Π² ΠΏΡΠΎΠ΄ΡΠΊΡΠΈΡ;
- MLflow Registry β ΠΏΠΎΠ·Π²ΠΎΠ»ΡΠ²Π° ΡΡΡ ΡΠ°Π½Π΅Π½ΠΈΠ΅ Π½Π° ΠΌΠΎΠ΄Π΅Π»ΠΈ ΠΈ ΡΠΏΡΠ°Π²Π»Π΅Π½ΠΈΠ΅ Π½Π° ΡΡΡΡΠΎΡΠ½ΠΈΠ΅ΡΠΎ ΠΈΠΌ Π² ΡΠ΅Π½ΡΡΠ°Π»ΠΈΠ·ΠΈΡΠ°Π½ΠΎ Ρ ΡΠ°Π½ΠΈΠ»ΠΈΡΠ΅.
MLflow ΠΎΠΏΠ΅ΡΠΈΡΠ° Ρ Π΄Π²Π΅ ΡΡΡΠ½ΠΎΡΡΠΈ:
- ΠΈΠ·ΠΏΡΠ»Π½Π΅Π½ΠΈΠ΅ β ΡΠΎΠ²Π° Π΅ ΠΏΡΠ»Π΅Π½ ΡΠΈΠΊΡΠ» Π½Π° ΠΎΠ±ΡΡΠ΅Π½ΠΈΠ΅, ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡΠΈ ΠΈ ΠΌΠ΅ΡΡΠΈΠΊΠΈ, ΠΏΠΎ ΠΊΠΎΠΈΡΠΎ ΠΈΡΠΊΠ°ΠΌΠ΅ Π΄Π° ΡΠ΅Π³ΠΈΡΡΡΠΈΡΠ°ΠΌΠ΅;
- Π΅ΠΊΡΠΏΠ΅ΡΠΈΠΌΠ΅Π½Ρ β ΡΠΎΠ²Π° Π΅ "ΡΠ΅ΠΌΠ°", Ρ ΠΊΠΎΡΡΠΎ ΡΠ° ΠΎΠ±Π΅Π΄ΠΈΠ½Π΅Π½ΠΈ ΠΈΠ·ΠΏΡΠ»Π½Π΅Π½ΠΈΡ.
ΠΡΠΈΡΠΊΠΈ ΡΡΡΠΏΠΊΠΈ ΠΎΡ ΠΏΡΠΈΠΌΠ΅ΡΠ° ΡΠ° ΡΠ΅Π°Π»ΠΈΠ·ΠΈΡΠ°Π½ΠΈ Π½Π° ΠΎΠΏΠ΅ΡΠ°ΡΠΈΠΎΠ½Π½Π°ΡΠ° ΡΠΈΡΡΠ΅ΠΌΠ° Ubuntu 18.04.
1. Π Π°Π·Π³ΡΡΡΠ°Π½Π΅ Π½Π° ΡΡΡΠ²ΡΡ
ΠΠ° Π΄Π° ΠΌΠΎΠΆΠ΅ΠΌ Π»Π΅ΡΠ½ΠΎ Π΄Π° ΡΠΏΡΠ°Π²Π»ΡΠ²Π°ΠΌΠ΅ ΠΏΡΠΎΠ΅ΠΊΡΠ° ΡΠΈ ΠΈ Π΄Π° ΠΏΠΎΠ»ΡΡΠ°Π²Π°ΠΌΠ΅ ΡΡΠ»Π°ΡΠ° Π½Π΅ΠΎΠ±Ρ ΠΎΠ΄ΠΈΠΌΠ° ΠΈΠ½ΡΠΎΡΠΌΠ°ΡΠΈΡ, ΡΠ΅ ΡΠ°Π·Π³ΡΡΠ½Π΅ΠΌ ΡΡΡΠ²ΡΡ. MLflow tracking server ΠΈΠΌΠ° Π΄Π²Π° ΠΎΡΠ½ΠΎΠ²Π½ΠΈ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½ΡΠ°:
- backend store β ΠΎΡΠ³ΠΎΠ²Π°ΡΡ Π·Π° ΡΡΡ ΡΠ°Π½Π΅Π½ΠΈΠ΅ Π½Π° ΠΈΠ½ΡΠΎΡΠΌΠ°ΡΠΈΡΡΠ° Π·Π° ΡΠ΅Π³ΠΈΡΡΡΠΈΡΠ°Π½ΠΈΡΠ΅ ΠΌΠΎΠ΄Π΅Π»ΠΈ (ΠΏΠΎΠ΄Π΄ΡΡΠΆΠ° 4 Π‘Π£ΠΠ: mysql, mssql, sqlite ΠΈ postgresql);
- artifact store β ΠΎΡΠ³ΠΎΠ²Π°ΡΡ Π·Π° ΡΡΡ ΡΠ°Π½Π΅Π½ΠΈΠ΅ Π½Π° Π°ΡΡΠ΅ΡΠ°ΠΊΡΠΈ (ΠΏΠΎΠ΄Π΄ΡΡΠΆΠ° 7 Π²Π°ΡΠΈΠ°Π½ΡΠ° Π·Π° ΡΡΡ ΡΠ°Π½Π΅Π½ΠΈΠ΅: Amazon S3, Azure Blob Storage, Google Cloud Storage, FTP ΡΡΡΠ²ΡΡ, SFTP ΡΡΡΠ²ΡΡ, 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
# Π‘ΡΠ·Π΄Π°ΠΉΡΠ΅ Π½ΠΎΠ² ΠΏΠΎΡΡΠ΅Π±ΠΈΡΠ΅Π»: mlflow_user
[postgres@user_name~]$ createuser --interactive -P
ΠΡΠ²Π΅Π΄Π΅ΡΠ΅ ΠΈΠΌΠ΅ΡΠΎ Π½Π° ΡΠΎΠ»ΡΡΠ°, ΠΊΠΎΡΡΠΎ ΠΈΡΠΊΠ°ΡΠ΅ Π΄Π° Π΄ΠΎΠ±Π°Π²ΠΈΡΠ΅: mlflow_user
ΠΡΠ²Π΅Π΄Π΅ΡΠ΅ ΠΏΠ°ΡΠΎΠ»Π°ΡΠ° Π·Π° Π½ΠΎΠ²Π°ΡΠ° ΡΠΎΠ»Ρ: mlflow
ΠΡΠ²Π΅Π΄Π΅ΡΠ΅ Ρ ΠΎΡΠ½ΠΎΠ²ΠΎ: mlflow
Π’ΡΡΠ±Π²Π° Π»ΠΈ Π½ΠΎΠ²Π°ΡΠ° ΡΠΎΠ»Ρ Π΄Π° Π±ΡΠ΄Π΅ ΡΡΠΏΠ΅ΡΠΏΠΎΡΡΠ΅Π±ΠΈΡΠ΅Π»? (y/n) n
Π’ΡΡΠ±Π²Π° Π»ΠΈ Π½ΠΎΠ²Π°ΡΠ° ΡΠΎΠ»Ρ Π΄Π° ΠΌΠΎΠΆΠ΅ Π΄Π° ΡΡΠ·Π΄Π°Π²Π° Π±Π°Π·ΠΈ Π΄Π°Π½Π½ΠΈ? (y/n) n
Π’ΡΡΠ±Π²Π° Π»ΠΈ Π½ΠΎΠ²Π°ΡΠ° ΡΠΎΠ»Ρ Π΄Π° ΠΌΠΎΠΆΠ΅ Π΄Π° ΡΡΠ·Π΄Π°Π²Π° Π½ΠΎΠ²ΠΈ ΡΠΎΠ»ΠΈ? (y/n) n
# Π‘ΡΠ·Π΄Π°ΠΉΡΠ΅ Π±Π°Π·Π° Π΄Π°Π½Π½ΠΈ mlflow_bd, ΠΏΡΠΈΡΠ΅ΠΆΠ°Π²Π°Π½Π° ΠΎΡ 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_port2. ΠΠΎΠ±Π°Π²ΡΠΌΠ΅ ΡΠ»Π΅Π΄Π΅Π½Π΅ΡΠΎ
ΠΠ° Π΄Π° Π½Π΅ Π·Π°Π³ΡΠ±ΠΈΠΌ ΡΠ΅Π·ΡΠ»ΡΠ°ΡΠΈΡΠ΅ ΠΎΡ Π½Π°ΡΠΈΡΠ΅ ΡΡΠ΅Π½ΠΈΡΠΎΠ²ΠΊΠΈ, Π±ΡΠ΄Π΅ΡΠΈΡΠ΅ ΠΏΠΎΠΊΠΎΠ»Π΅Π½ΠΈΡ ΡΠ°Π·ΡΠ°Π±ΠΎΡΡΠΈΡΠΈ Π΄Π° ΡΠ°Π·Π±Π΅ΡΠ°Ρ ΠΊΠ°ΠΊΠ²ΠΎ Π²ΡΡΡΠ½ΠΎΡΡ ΡΠ΅ Π΅ ΡΠ»ΡΡΠΈΠ»ΠΎ, Π° ΠΏΠΎ-ΡΡΠ°ΡΡΠΈΡΠ΅ ΠΊΠΎΠ»Π΅Π³ΠΈ ΠΈ Π²ΠΈΠ΅ Π΄Π° ΠΌΠΎΠΆΠ΅ΡΠ΅ ΡΠΏΠΎΠΊΠΎΠΉΠ½ΠΎ Π΄Π° Π°Π½Π°Π»ΠΈΠ·ΠΈΡΠ°ΡΠ΅ ΠΏΡΠΎΡΠ΅ΡΠ° Π½Π° ΠΎΠ±ΡΡΠ΅Π½ΠΈΠ΅, Π΅ Π½Π΅ΠΎΠ±Ρ ΠΎΠ΄ΠΈΠΌΠΎ Π΄Π° Π΄ΠΎΠ±Π°Π²ΠΈΠΌ ΡΠ»Π΅Π΄Π΅Π½Π΅. ΠΠΎΠ΄ ΡΠ»Π΅Π΄Π΅Π½Π΅ΡΠΎ ΡΠ΅ ΡΠ°Π·Π±ΠΈΡΠ° Π·Π°ΠΏΠ°Π·Π²Π°Π½Π΅ΡΠΎ Π½Π° ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡΠΈ, ΠΌΠ΅ΡΡΠΈΠΊΠΈ, Π°ΡΡΠ΅ΡΠ°ΠΊΡΠΈ ΠΈ Π²ΡΡΠΊΠ°ΠΊΠ²Π° Π΄ΠΎΠΏΡΠ»Π½ΠΈΡΠ΅Π»Π½Π° ΠΈΠ½ΡΠΎΡΠΌΠ°ΡΠΈΡ Π·Π° ΡΡΠ°ΡΡΠΈΡΠ°Π½Π΅ΡΠΎ Π½Π° ΠΎΠ±ΡΡΠ΅Π½ΠΈΠ΅ΡΠΎ, Π² Π½Π°ΡΠΈΡ ΡΠ»ΡΡΠ°ΠΉ, Π½Π° ΡΡΡΠ²ΡΡΠ°.
ΠΠ° ΠΏΡΠΈΠΌΠ΅Ρ, ΡΡΠ·Π΄Π°Π΄ΠΎΡ ΠΌΠ°Π»ΡΠΊ Π½Π° Keras Π·Π° ΡΠ΅Π³ΠΌΠ΅Π½ΡΠ°ΡΠΈΡ Π½Π° Π²ΡΠΈΡΠΊΠΎ Π² . ΠΠ° Π΄ΠΎΠ±Π°Π²ΡΠ½Π΅ Π½Π° ΡΠ»Π΅Π΄Π΅Π½Π΅ΡΠΎ, ΡΡΠ·Π΄Π°Π΄ΠΎΡ ΡΠ°ΠΉΠ» mlflow_training.py.
ΠΡΠΎ ΡΠ΅Π΄ΠΎΠ²Π΅ΡΠ΅, Π² ΠΊΠΎΠΈΡΠΎ ΡΠ΅ ΡΠ»ΡΡΠ²Π° Π½Π°ΠΉ-ΠΈΠ½ΡΠ΅ΡΠ΅ΡΠ½ΠΎΡΠΎ:
def run(self, epochs, lr, experiment_name):
# ΠΏΠΎΠ»ΡΡΠ°Π²Π°Π½Π΅ Π½Π° id Π½Π° Π΅ΠΊΡΠΏΠ΅ΡΠΈΠΌΠ΅Π½ΡΠ°, ΡΡΠ·Π΄Π°Π²Π°Π½Π΅ Π½Π° Π΅ΠΊΡΠΏΠ΅ΡΠΈΠΌΠ΅Π½Ρ Π² Π½Π΅Π³ΠΎΠ²ΠΎ ΠΎΡΡΡΡΡΠ²ΠΈΠ΅
remote_experiment_id = self.remote_server.get_experiment_id(name=experiment_name)
# ΡΡΠ·Π΄Π°Π²Π°Π½Π΅ Π½Π° "run" ΠΈ ΠΏΠΎΠ»ΡΡΠ°Π²Π°Π½Π΅ Π½Π° Π½Π΅Π³ΠΎΠ²ΠΎΡΠΎ id
remote_run_id = self.remote_server.get_run_id(remote_experiment_id)
# ΡΠΊΠ°Π·Π²Π°ΠΌΠ΅, ΡΠ΅ ΠΈΡΠΊΠ°ΠΌΠ΅ Π΄Π° Π·Π°ΠΏΠ°Π·ΠΈΠΌ ΡΠ΅Π·ΡΠ»ΡΠ°ΡΠΈΡΠ΅ Π½Π° ΠΎΡΠ΄Π°Π»Π΅ΡΠ΅Π½ ΡΡΡΠ²ΡΡ
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: 'ΡΠΏΠΈΡΡΠΊ Ρ ΠΊΠ°ΡΠ΅Π³ΠΎΡΠΈΠΈ ΠΎΡ coco dataset'}
epochs: {type: int, help: 'Π±ΡΠΎΠΉ Π΅ΠΏΠΎΡ
ΠΈ Π² ΠΎΠ±ΡΡΠ΅Π½ΠΈΠ΅ΡΠΎ'}
lr: {type: float, default: 0.001, help: 'ΡΠΊΠΎΡΠΎΡΡ Π½Π° ΠΎΠ±ΡΡΠ΅Π½ΠΈΠ΅'}
batch_size: {type: int, default: 8}
model_name: {type: str, default: 'Unet', help: 'Unet, PSPNet, Linknet, FPN'}
backbone_name: {type: str, default: 'resnet18', help: 'Π½Π°ΠΏΡ. resnet18, resnet50, mobilenetv2 ...'}
tracking_uri: {type: str, help: 'Π°Π΄ΡΠ΅ΡΠ° Π½Π° ΡΡΡΠ²ΡΡΠ°'}
experiment_name: {type: str, default: 'My_experiment', help: 'ΠΈΠΌΠ΅ Π½Π° ΠΎΡΠ΄Π°Π»Π΅ΡΠ΅Π½ ΠΈ Π»ΠΎΠΊΠ°Π»Π΅Π½ Π΅ΠΊΡΠΏΠ΅ΡΠΈΠΌΠ΅Π½Ρ'}
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. ΠΡΠ΅Π½ΡΠ²Π°ΠΌΠ΅ ΡΠ΅Π·ΡΠ»ΡΠ°ΡΠΈΡΠ΅ ΠΎΡ ΠΎΠ±ΡΡΠ΅Π½ΠΈΠ΅ΡΠΎ
Π‘Π»Π΅Π΄ ΠΏΡΠΈΠΊΠ»ΡΡΠ²Π°Π½Π΅ Π½Π° ΠΎΠ±ΡΡΠ΅Π½ΠΈΠ΅ΡΠΎ ΠΌΠΎΠΆΠ΅ΠΌ Π΄Π° ΠΎΡΠΈΠ΄Π΅ΠΌ Π² Π±ΡΠ°ΡΠ·ΡΡΠ° Π½Π° Π°Π΄ΡΠ΅ΡΠ° Π½Π° Π½Π°ΡΠΈΡ ΡΡΡΠ²ΡΡ

Π’ΡΠΊ Π²ΠΈΠΆΠ΄Π°ΠΌΠ΅ ΡΠΏΠΈΡΡΠΊ Π½Π° Π²ΡΠΈΡΠΊΠΈ Π΅ΠΊΡΠΏΠ΅ΡΠΈΠΌΠ΅Π½ΡΠΈ (Π²Π»ΡΠ²ΠΎ Π³ΠΎΡΠ΅), Π° ΡΡΡΠΎ ΠΈ ΠΈΠ½ΡΠΎΡΠΌΠ°ΡΠΈΡ Π·Π° ΡΡΠ°ΡΡΠ° (Π² ΡΡΠ΅Π΄Π°ΡΠ°). ΠΠΎΠΆΠ΅ΠΌ Π΄Π° Π²ΠΈΠ΄ΠΈΠΌ ΠΏΠΎ-ΠΏΠΎΠ΄ΡΠΎΠ±Π½Π° ΠΈΠ½ΡΠΎΡΠΌΠ°ΡΠΈΡ (ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡΠΈ, ΠΌΠ΅ΡΡΠΈΠΊΠΈ, Π°ΡΡΠ΅ΡΠ°ΠΊΡΠΈ ΠΈ Π΄ΠΎΠΏΡΠ»Π½ΠΈΡΠ΅Π»Π½Π° ΠΈΠ½ΡΠΎΡΠΌΠ°ΡΠΈΡ) Π·Π° Π²ΡΠ΅ΠΊΠΈ ΡΡΠ°ΡΡ.

ΠΠΎ Π²ΡΡΠΊΠ° ΠΌΠ΅ΡΡΠΈΠΊΠ° ΠΌΠΎΠΆΠ΅ΠΌ Π΄Π° Π½Π°Π±Π»ΡΠ΄Π°Π²Π°ΠΌΠ΅ ΠΈΡΡΠΎΡΠΈΡΡΠ° Π½Π° ΠΏΡΠΎΠΌΠ΅Π½ΠΈΡΠ΅.

Π’.Π΅. Π² ΠΌΠΎΠΌΠ΅Π½ΡΠ° ΠΌΠΎΠΆΠ΅ΠΌ Π΄Π° Π°Π½Π°Π»ΠΈΠ·ΠΈΡΠ°ΠΌΠ΅ ΡΠ΅Π·ΡΠ»ΡΠ°ΡΠΈΡΠ΅ Π² "ΡΡΡΠ΅Π½" ΡΠ΅ΠΆΠΈΠΌ, ΡΡΡΠΎ ΡΠ°ΠΊΠ° ΠΌΠΎΠΆΠ΅ΡΠ΅ Π΄Π° Π½Π°ΡΡΡΠΎΠΈΡΠ΅ ΠΈ Π°Π²ΡΠΎΠΌΠ°ΡΠΈΡΠ½Π° Π²Π°Π»ΠΈΠ΄Π°ΡΠΈΡ Ρ ΠΏΠΎΠΌΠΎΡΡΠ° Π½Π° MLflow API.
6. Π Π΅Π³ΠΈΡΡΡΠΈΡΠ°ΠΌΠ΅ ΠΌΠΎΠ΄Π΅Π»Π°
Π‘Π»Π΅Π΄ ΠΊΠ°ΡΠΎ Π°Π½Π°Π»ΠΈΠ·ΠΈΡΠ°Ρ ΠΌΠ΅ Π½Π°ΡΠΈΡ ΠΌΠΎΠ΄Π΅Π» ΠΈ ΡΠ΅ΡΠΈΡ ΠΌΠ΅, ΡΠ΅ Π΅ Π³ΠΎΡΠΎΠ² Π·Π° ΡΠΏΠΎΡΡΠ΅Π±Π°, Π·Π°ΠΏΠΎΡΠ²Π°ΠΌΠ΅ Ρ ΡΠ΅Π³ΠΈΡΡΡΠ°ΡΠΈΡΡΠ° ΠΌΡ, Π·Π° ΠΊΠΎΠ΅ΡΠΎ ΠΈΠ·Π±ΠΈΡΠ°ΠΌΠ΅ Π½ΡΠΆΠ½ΠΈΡ Π½ΠΈ ΡΡΠ°ΡΡ (ΠΊΠ°ΠΊΡΠΎ Π΅ ΠΏΠΎΠΊΠ°Π·Π°Π½ΠΎ Π² ΠΏΡΠ΅Π΄ΠΈΡΠ½Π°ΡΠ° ΡΠΎΡΠΊΠ°) ΠΈ ΠΎΡΠΈΠ²Π°ΠΌΠ΅ Π½Π° Π΄ΠΎΠ»Ρ.

Π‘Π»Π΅Π΄ ΠΊΠ°ΡΠΎ Π΄Π°Π΄Π΅ΠΌ ΠΈΠΌΠ΅ Π½Π° Π½Π°ΡΠΈΡ ΠΌΠΎΠ΄Π΅Π», ΡΠΎΠΉ ΠΏΠΎΠ»ΡΡΠ°Π²Π° Π²Π΅ΡΡΠΈΡ. ΠΡΠΈ Π·Π°ΠΏΠ°Π·Π²Π°Π½Π΅ Π½Π° Π΄ΡΡΠ³Π° ΠΌΠΎΠ΄Π΅Π» Ρ ΡΠΎΠ²Π° ΠΈΠΌΠ΅, Π²Π΅ΡΡΠΈΡΡΠ° Π°Π²ΡΠΎΠΌΠ°ΡΠΈΡΠ½ΠΎ ΡΠ΅ ΡΠ΅ ΡΠ²Π΅Π»ΠΈΡΠΈ.

ΠΠ° Π²ΡΠ΅ΠΊΠΈ ΠΌΠΎΠ΄Π΅Π» ΠΌΠΎΠΆΠ΅ΠΌ Π΄Π° Π΄ΠΎΠ±Π°Π²ΠΈΠΌ ΠΎΠΏΠΈΡΠ°Π½ΠΈΠ΅ ΠΈ Π΄Π° ΠΈΠ·Π±Π΅ΡΠ΅ΠΌ Π΅Π΄Π½ΠΎ ΠΎΡ ΡΡΠΈΡΠ΅ ΡΡΡΡΠΎΡΠ½ΠΈΡ (Staging, Production, Archived), Π²ΠΏΠΎΡΠ»Π΅Π΄ΡΡΠ²ΠΈΠ΅ ΠΌΠΎΠΆΠ΅ΠΌ ΡΡΠ΅Π· api Π΄Π° ΡΠ΅ ΠΎΠ±ΡΡΠ½Π΅ΠΌ ΠΊΡΠΌ ΡΠ΅Π·ΠΈ ΡΡΡΡΠΎΡΠ½ΠΈΡ, ΠΊΠΎΠ΅ΡΠΎ Π² ΡΡΡΠ΅ΡΠ°Π½ΠΈΠ΅ Ρ Π²Π΅ΡΡΠΈΠΎΠ½ΠΈΡΠ°Π½Π΅ΡΠΎ Π΄Π°Π²Π° Π΄ΠΎΠΏΡΠ»Π½ΠΈΡΠ΅Π»Π½Π° Π³ΡΠ²ΠΊΠ°Π²ΠΎΡΡ.

Π Π°Π·ΠΏΠΎΠ»Π°Π³Π°ΠΌΠ΅ ΠΈ Ρ ΡΠ΄ΠΎΠ±Π΅Π½ Π΄ΠΎΡΡΡΠΏ Π΄ΠΎ Π²ΡΠΈΡΠΊΠΈ ΠΌΠΎΠ΄Π΅Π»ΠΈ

ΠΈ ΡΠ΅Ρ Π½ΠΈΡΠ΅ Π²Π΅ΡΡΠΈΠΈ.

ΠΠ°ΠΊΡΠΎ Π² ΠΏΡΠ΅Π΄ΠΈΡΠ½Π°ΡΠ° ΡΠΎΡΠΊΠ°, Π²ΡΠΈΡΠΊΠΈ ΠΎΠΏΠ΅ΡΠ°ΡΠΈΠΈ ΠΌΠΎΠ³Π°Ρ Π΄Π° ΡΠ΅ ΠΈΠ·Π²ΡΡΡΠ°Ρ Ρ ΠΏΠΎΠΌΠΎΡΡΠ° Π½Π° 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 Π·Π° ΡΠ΄ΠΎΠ±ΡΡΠ²ΠΎ. Π‘ΡΡΠ½ΠΎΡΡΡΠ° Π΅, ΡΠ΅ ΡΠ΅ ΡΠ²ΡΡΠ·Π²Π°ΠΌ Ρ ΠΎΡΠ΄Π°Π»Π΅ΡΠ΅Π½ ΡΡΡΠ²ΡΡ ΠΈ ΡΡΡΡΡ ΡΠ°ΠΌ ΠΌΠΎΠ΄Π΅Π» Ρ ΡΠΊΠ°Π·Π°Π½ΠΎΡΠΎ ΠΈΠΌΠ΅, ΠΏΡΠΈ ΡΠΎΠ²Π°, Π½Π°ΠΉ-Π½ΠΎΠ²Π°ΡΠ° Π²Π΅ΡΡΠΈΡ Π² ΠΏΡΠΎΠ΄ΡΠΊΡΠΈΡ. Π‘Π»Π΅Π΄ ΡΠΎΠ²Π° ΠΈΠ·ΡΠ΅Π³Π»ΡΠΌ Π°ΡΡΠ΅ΡΠ°ΠΊΡΠ° Π»ΠΎΠΊΠ°Π»Π½ΠΎ Π² ΠΏΠ°ΠΏΠΊΠ° .\/model ΠΈ ΠΈΠ·Π³ΡΠ°ΠΆΠ΄Π°ΠΌ ΠΌΠΎΠ΄Π΅Π»Π° ΠΎΡ ΡΠ°Π·ΠΈ Π΄ΠΈΡΠ΅ΠΊΡΠΎΡΠΈΡ mlflow.keras.load_model(local_path). Π‘Π΅Π³Π° ΠΌΠΎΠΆΠ΅ΠΌ Π΄Π° ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°ΠΌΠ΅ ΠΌΠΎΠ΄Π΅Π»Π° ΡΠΈ. Π Π°Π·ΡΠ°Π±ΠΎΡΡΠΈΡΠΈΡΠ΅ Π½Π° CV (ML) ΠΌΠΎΠ³Π°Ρ ΡΠΏΠΎΠΊΠΎΠΉΠ½ΠΎ Π΄Π° ΡΠ΅ Π·Π°Π½ΠΈΠΌΠ°Π²Π°Ρ Ρ ΠΏΠΎΠ΄ΠΎΠ±ΡΡΠ²Π°Π½Π΅ Π½Π° ΠΌΠΎΠ΄Π΅Π»Π° ΠΈ ΠΏΡΠ±Π»ΠΈΠΊΡΠ²Π°Π½Π΅ Π½Π° Π½ΠΎΠ²ΠΈ Π²Π΅ΡΡΠΈΠΈ.
Π Π·Π°ΠΊΠ»ΡΡΠ΅Π½ΠΈΠ΅
ΠΡΠ΅Π΄ΡΡΠ°Π²ΠΈΡ ΡΠΈΡΡΠ΅ΠΌΠ°, ΠΊΠΎΡΡΠΎ ΠΏΠΎΠ·Π²ΠΎΠ»ΡΠ²Π°:
- ΡΠ΅Π½ΡΡΠ°Π»ΠΈΠ·ΠΈΡΠ°Π½ΠΎ ΡΡΡ ΡΠ°Π½Π΅Π½ΠΈΠ΅ Π½Π° ΠΈΠ½ΡΠΎΡΠΌΠ°ΡΠΈΡ Π·Π° ML ΠΌΠΎΠ΄Π΅Π»ΠΈ, Π½Π°ΠΏΡΠ΅Π΄ΡΠΊ ΠΈ ΡΠ΅Π·ΡΠ»ΡΠ°ΡΠΈ ΠΎΡ ΠΎΠ±ΡΡΠ΅Π½ΠΈΠ΅ΡΠΎ;
- Π±ΡΡΠ·ΠΎ ΡΠ°Π·Π³ΡΡΡΠ°Π½Π΅ Π½Π° ΡΡΠ΅Π΄Π° Π·Π° ΡΠ°Π·ΡΠ°Π±ΠΎΡΠΊΠ°;
- ΡΠ»Π΅Π΄Π΅Π½Π΅ ΠΈ Π°Π½Π°Π»ΠΈΠ· Π½Π° Π½Π°ΠΏΡΠ΅Π΄ΡΠΊΠ° ΠΏΠΎ ΠΌΠΎΠ΄Π΅Π»ΠΈΡΠ΅;
- ΡΠ΄ΠΎΠ±Π½ΠΎ ΡΠΏΡΠ°Π²Π»Π΅Π½ΠΈΠ΅ Π½Π° Π²Π΅ΡΡΠΈΠΈΡΠ΅ ΠΈ ΡΡΡΡΠΎΡΠ½ΠΈΠ΅ΡΠΎ Π½Π° ΠΌΠΎΠ΄Π΅Π»ΠΈΡΠ΅;
- Π»Π΅ΡΠ½ΠΎ Π΄Π΅ΠΏΠ»ΠΎΠΉΠ²Π°Π½Π΅ Π½Π° ΠΏΠΎΠ»ΡΡΠ΅Π½ΠΈΡΠ΅ ΠΌΠΎΠ΄Π΅Π»ΠΈ.
Π’ΠΎΠ·ΠΈ ΠΏΡΠΈΠΌΠ΅Ρ Π΅ ΡΡΠ΅Π±Π΅Π½ ΠΈ ΡΠ»ΡΠΆΠΈ ΠΊΠ°ΡΠΎ ΠΎΡΠΏΡΠ°Π²Π½Π° ΡΠΎΡΠΊΠ° Π·Π° ΠΈΠ·Π³ΡΠ°ΠΆΠ΄Π°Π½Π΅ Π½Π° ΡΠΎΠ±ΡΡΠ²Π΅Π½Π°ΡΠ° Π²ΠΈ ΡΠΈΡΡΠ΅ΠΌΠ°, ΠΊΠΎΡΡΠΎ, Π²ΡΠ·ΠΌΠΎΠΆΠ½ΠΎ Π΅, Π΄Π° Π²ΠΊΠ»ΡΡΠ²Π° Π°Π²ΡΠΎΠΌΠ°ΡΠΈΠ·Π°ΡΠΈΡ Π½Π° ΠΎΡΠ΅Π½ΠΊΠ°ΡΠ° Π½Π° ΡΠ΅Π·ΡΠ»ΡΠ°ΡΠΈΡΠ΅ ΠΈ ΡΠ΅Π³ΠΈΡΡΡΠ°ΡΠΈΡΡΠ° Π½Π° ΠΌΠΎΠ΄Π΅Π»ΠΈ (ΠΏ.5 ΠΈ ΠΏ.6 ΡΡΠΎΡΠ²Π΅ΡΠ½ΠΎ) ΠΈΠ»ΠΈ ΠΌΠΎΠΆΠ΅ Π΄Π° Π΄ΠΎΠ±Π°Π²ΠΈΡΠ΅ Π²Π΅ΡΡΠΈΠΎΠ½ΠΈΡΠ°Π½Π΅ Π½Π° Π½Π°Π±ΠΎΡΠΈΡΠ΅ ΠΎΡ Π΄Π°Π½Π½ΠΈ, ΠΈΠ»ΠΈ Π½Π΅ΡΠΎ Π΄ΡΡΠ³ΠΎ? ΠΠΏΠΈΡΠ²Π°Ρ ΡΠ΅ Π΄Π° ΠΏΡΠ΅Π΄Π°ΠΌ ΠΈΠ΄Π΅ΡΡΠ°, ΡΠ΅ Π²ΠΈ Π΅ Π½Π΅ΠΎΠ±Ρ ΠΎΠ΄ΠΈΠΌ MLOps ΠΊΠ°ΡΠΎ ΡΡΠ»ΠΎ, MLflow Π΅ ΠΏΡΠΎΡΡΠΎ ΡΡΠ΅Π΄ΡΡΠ²ΠΎ Π·Π° ΠΏΠΎΡΡΠΈΠ³Π°Π½Π΅ Π½Π° ΡΠ΅Π»ΡΠ°.
ΠΠ°ΠΏΠΈΡΠ΅ΡΠ΅ ΠΊΠ°ΠΊΠ²ΠΈ ΠΏΡΠΎΠ±Π»Π΅ΠΌΠΈ, Ρ ΠΊΠΎΠΈΡΠΎ ΡΡΠ΅ ΡΠ΅ ΡΠ±Π»ΡΡΠΊΠ²Π°Π»ΠΈ, Π½Π΅ ΡΡΠΌ ΠΎΡΡΠ°Π·ΠΈΠ»?
ΠΠ°ΠΊΠ²ΠΎ Π±ΠΈΡ
ΡΠ΅ Π΄ΠΎΠ±Π°Π²ΠΈΠ»ΠΈ Π² ΡΠΈΡΡΠ΅ΠΌΠ°ΡΠ°, Π·Π° Π΄Π° ΠΏΠΎΠΊΡΠΈΠ²Π°ΡΠ΅ Π²Π°ΡΠΈΡΠ΅ Π½ΡΠΆΠ΄ΠΈ?
ΠΠ°ΠΊΠ²ΠΈ ΠΈΠ½ΡΡΡΡΠΌΠ΅Π½ΡΠΈ ΠΈ ΠΏΠΎΠ΄Ρ
ΠΎΠ΄ΠΈ ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°ΡΠ΅, Π·Π° Π΄Π° ΡΠ΅ΡΠΈΡΠ΅ Π²ΡΠΈΡΠΊΠΈ ΠΈΠ»ΠΈ ΡΠ°ΡΡ ΠΎΡ ΠΏΡΠΎΠ±Π»Π΅ΠΌΠΈΡΠ΅?
P.S. ΠΡΡΠ°Π²ΡΠΌ Π½ΡΠΊΠΎΠ»ΠΊΠΎ Π»ΠΈΠ½ΠΊΠ°:
github ΠΏΡΠΎΠ΅ΠΊΡ β
MLflow β
ΠΠΎΡ ΡΠ°Π±ΠΎΡΠ½Π° ΠΏΠΎΡΠ° Π·Π° Π²ΡΠΏΡΠΎΡΠΈ β ikryakin@croc.ru
Π Π½Π°ΡΠ°ΡΠ° ΠΊΠΎΠΌΠΏΠ°Π½ΠΈΡ ΠΏΠ΅ΡΠΈΠΎΠ΄ΠΈΡΠ½ΠΎ ΡΠ΅ ΠΏΡΠΎΠ²Π΅ΠΆΠ΄Π°Ρ ΡΠ°Π·Π»ΠΈΡΠ½ΠΈ ΡΡΠ±ΠΈΡΠΈΡ Π·Π° ΠΠ’ ΡΠΏΠ΅ΡΠΈΠ°Π»ΠΈΡΠ΅ΡΠΈ, Π½Π°ΠΏΡΠΈΠΌΠ΅Ρ: Π½Π° 8 ΡΠ»ΠΈ Π² 19:00 ΠΏΠΎ ΠΌΠΎΡΠΊΠΎΠ²ΡΠΊΠΎ Π²ΡΠ΅ΠΌΠ΅ ΡΠ΅ ΡΠ΅ ΠΏΡΠΎΠ²Π΅Π΄Π΅ ΠΎΠ½Π»Π°ΠΉΠ½ ΠΌΠΈΡΠ°ΠΏ ΠΎΡΠ½ΠΎΡΠ½ΠΎ CV, Π°ΠΊΠΎ ΡΡΠ΅ Π·Π°ΠΈΠ½ΡΠ΅ΡΠ΅ΡΡΠ²Π°Π½ΠΈ, ΠΌΠΎΠΆΠ΅ΡΠ΅ Π΄Π° ΡΡΠ°ΡΡΠ²Π°ΡΠ΅, ΡΠ΅Π³ΠΈΡΡΡΠ°ΡΠΈΡΡΠ° Π΅ ΠΎΡΠ²ΠΎΡΠ΅Π½Π°. .
ΠΠ·ΡΠΎΡΠ½ΠΈΠΊ: habr.com
