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