ΠΡΠ΅ΠΌ ΠΏΡΠΈΠ²Π΅Ρ! Π― CV-ΡΠ°Π·ΡΠ°Π±ΠΎΡΡΠΈΠΊ Π² ΠΠ ΠΠ. Π£ΠΆΠ΅ 3 Π³ΠΎΠ΄Π° ΠΌΡ ΡΠ΅Π°Π»ΠΈΠ·ΡΠ΅ΠΌ ΠΏΡΠΎΠ΅ΠΊΡΡ Π² ΠΎΠ±Π»Π°ΡΡΠΈ CV. ΠΠ° ΡΡΠΎ Π²ΡΠ΅ΠΌΡ ΡΠ΅Π³ΠΎ ΠΌΡ ΡΠΎΠ»ΡΠΊΠΎ Π½Π΅ Π΄Π΅Π»Π°Π»ΠΈ, Π½Π°ΠΏΡΠΈΠΌΠ΅Ρ: ΠΌΠΎΠ½ΠΈΡΠΎΡΠΈΠ»ΠΈ Π²ΠΎΠ΄ΠΈΡΠ΅Π»Π΅ΠΉ, ΡΡΠΎΠ±Ρ Π²ΠΎ Π²ΡΠ΅ΠΌΡ Π΄Π²ΠΈΠΆΠ΅Π½ΠΈΡ ΠΎΠ½ΠΈ Π½Π΅ ΠΏΠΈΠ»ΠΈ, Π½Π΅ ΠΊΡΡΠΈΠ»ΠΈ, ΠΏΠΎ ΡΠ΅Π»Π΅ΡΠΎΠ½Ρ Π½Π΅ ΡΠ°Π·Π³ΠΎΠ²Π°ΡΠΈΠ²Π°Π»ΠΈ, ΡΠΌΠΎΡΡΠ΅Π»ΠΈ Π½Π° Π΄ΠΎΡΠΎΠ³Ρ, Π° Π½Π΅ ΡΠ½Ρ ΠΈΠ»ΠΈ Π² ΠΎΠ±Π»Π°ΠΊΠ°; ΡΠΈΠΊΡΠΈΡΠΎΠ²Π°Π»ΠΈ Π»ΡΠ±ΠΈΡΠ΅Π»Π΅ΠΉ Π΅Π·Π΄ΠΈΡΡ ΠΏΠΎ Π²ΡΠ΄Π΅Π»Π΅Π½Π½ΡΠΌ ΠΏΠΎΠ»ΠΎΡΠ°ΠΌ ΠΈ Π·Π°Π½ΠΈΠΌΠ°ΡΡ Π½Π΅ΡΠΊΠΎΠ»ΡΠΊΠΎ ΠΌΠ΅ΡΡ Π½Π° ΠΏΠ°ΡΠΊΠΎΠ²ΠΊΠ΅; ΡΠ»Π΅Π΄ΠΈΠ»ΠΈ Π·Π° ΡΠ΅ΠΌ, ΡΡΠΎΠ±Ρ ΡΠ°Π±ΠΎΡΠ½ΠΈΠΊΠΈ Π½ΠΎΡΠΈΠ»ΠΈ ΠΊΠ°ΡΠΊΠΈ, ΠΏΠ΅ΡΡΠ°ΡΠΊΠΈ ΠΈ Ρ.ΠΏ.; ΠΈΠ΄Π΅Π½ΡΠΈΡΠΈΡΠΈΡΠΎΠ²Π°Π»ΠΈ ΡΠΎΡΡΡΠ΄Π½ΠΈΠΊΠ°, ΠΊΠΎΡΠΎΡΡΠΉ Ρ ΠΎΡΠ΅Ρ ΠΏΡΠΎΠΉΡΠΈ Π½Π° ΠΎΠ±ΡΠ΅ΠΊΡ; ΠΏΠΎΠ΄ΡΡΠΈΡΡΠ²Π°Π»ΠΈ Π²ΡΡ, ΡΡΠΎ ΡΠΎΠ»ΡΠΊΠΎ ΠΌΠΎΠΆΠ½ΠΎ.
Π― Π²ΡΠ΅ ΡΡΠΎ ΠΊ ΡΠ΅ΠΌΡ?
Π ΠΏΡΠΎΡΠ΅ΡΡΠ΅ ΡΠ΅Π°Π»ΠΈΠ·Π°ΡΠΈΠΈ ΠΏΡΠΎΠ΅ΠΊΡΠΎΠ² ΠΌΡ Π½Π°Π±ΠΈΠ»ΠΈ ΡΠΈΡΠΊΠΈ, ΠΌΠ½ΠΎΠ³ΠΎ ΡΠΈΡΠ΅ΠΊ, Ρ ΡΠ°ΡΡΡΡ ΠΏΡΠΎΠ±Π»Π΅ΠΌ Π²Ρ ΠΈΠ»ΠΈ Π·Π½Π°ΠΊΠΎΠΌΡ, ΠΈΠ»ΠΈ ΠΏΠΎΠ·Π½Π°ΠΊΠΎΠΌΠΈΡΠ΅ΡΡ Π² Π±ΡΠ΄ΡΡΠ΅ΠΌ.
ΠΠΎΠ΄Π΅Π»ΠΈΡΡΠ΅ΠΌ ΡΠΈΡΡΠ°ΡΠΈΡ
ΠΡΠ΅Π΄ΡΡΠ°Π²ΠΈΠΌ, ΡΡΠΎ ΠΌΡ ΡΡΡΡΠΎΠΈΠ»ΠΈΡΡ Π² ΠΌΠΎΠ»ΠΎΠ΄ΡΡ ΠΊΠΎΠΌΠΏΠ°Π½ΠΈΡ βNβ, Π΄Π΅ΡΡΠ΅Π»ΡΠ½ΠΎΡΡΡ ΠΊΠΎΡΠΎΡΠΎΠΉ ΡΠ²ΡΠ·Π°Π½Π° Ρ ML. Π Π°Π±ΠΎΡΠ°Π΅ΠΌ ΠΌΡ Π½Π°Π΄ ML (DL, CV) ΠΏΡΠΎΠ΅ΠΊΡΠΎΠΌ, ΠΏΠΎΡΠΎΠΌ ΠΏΠΎ ΠΊΠ°ΠΊΠΈΠΌ-Π»ΠΈΠ±ΠΎ ΠΏΡΠΈΡΠΈΠ½Π°ΠΌ ΠΏΠ΅ΡΠ΅ΠΊΠ»ΡΡΠ°Π΅ΠΌΡΡ Π½Π° Π΄ΡΡΠ³ΡΡ ΡΠ°Π±ΠΎΡΡ, Π² ΠΎΠ±ΡΠ΅ΠΌ Π΄Π΅Π»Π°Π΅ΠΌ ΠΏΠ΅ΡΠ΅ΡΡΠ², ΠΈ Π²ΠΎΠ·Π²ΡΠ°ΡΠ°Π΅ΠΌΡΡ ΠΊ ΡΠ²ΠΎΠ΅ΠΉ ΠΈΠ»ΠΈ ΡΡΠΆΠΎΠΉ Π½Π΅ΠΉΡΠΎΠ½ΠΎΡΠΊΠ΅.
- ΠΠ°ΡΡΡΠΏΠ°Π΅Ρ ΠΌΠΎΠΌΠ΅Π½Ρ ΠΈΡΡΠΈΠ½Ρ, Π½ΡΠΆΠ½ΠΎ ΠΊΠ°ΠΊ-ΡΠΎ Π²ΡΠΏΠΎΠΌΠ½ΠΈΡΡ Π½Π° ΡΠ΅ΠΌ ΡΡ ΠΎΡΡΠ°Π½ΠΎΠ²ΠΈΠ»ΡΡ, ΠΊΠ°ΠΊΠΈΠ΅ Π³ΠΈΠΏΠ΅ΡΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡΡ ΠΏΡΠΎΠ±ΠΎΠ²Π°Π» ΠΈ, ΡΠ°ΠΌΠΎΠ΅ Π³Π»Π°Π²Π½ΠΎΠ΅, ΠΊ ΠΊΠ°ΠΊΠΈΠΌ ΡΠ΅Π·ΡΠ»ΡΡΠ°ΡΠ°ΠΌ ΠΎΠ½ΠΈ ΠΏΡΠΈΠ²Π΅Π»ΠΈ.
ΠΠΎΠΆΠ΅Ρ Π±ΡΡΡ ΠΌΠ½ΠΎΠΆΠ΅ΡΡΠ²ΠΎ Π²Π°ΡΠΈΠ°Π½ΡΠΎΠ², ΠΊΡΠΎ ΠΊΠ°ΠΊ Ρ ΡΠ°Π½ΠΈΠ» ΠΈΠ½ΡΠΎΡΠΌΠ°ΡΠΈΡ ΠΏΠΎ Π²ΡΠ΅ΠΌ Π·Π°ΠΏΡΡΠΊΠ°ΠΌ: Π² Π³ΠΎΠ»ΠΎΠ²Π΅, ΠΊΠΎΠ½ΡΠΈΠ³Π°Ρ , Π±Π»ΠΎΠΊΠ½ΠΎΡΠ΅, Π² ΡΠ°Π±ΠΎΡΠ΅ΠΉ ΡΡΠ΅Π΄Π΅ Π² ΠΎΠ±Π»Π°ΠΊΠ΅. ΠΠ½Π΅ Π΄ΠΎΠ²Π΅Π»ΠΎΡΡ Π²ΠΈΠ΄Π΅ΡΡ Π²Π°ΡΠΈΠ°Π½Ρ, ΠΊΠΎΠ³Π΄Π° Π³ΠΈΠΏΠ΅ΡΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡΡ Ρ ΡΠ°Π½ΠΈΠ»ΠΈΡΡ Π² Π²ΠΈΠ΄Π΅ Π·Π°ΠΊΠΎΠΌΠΌΠ΅Π½ΡΠΈΡΠΎΠ²Π°Π½Π½ΡΡ ΡΡΡΠΎΠΊ Π² ΠΊΠΎΠ΄Π΅, Π² ΠΎΠ±ΡΠ΅ΠΌ ΠΏΠΎΠ»Π΅Ρ ΡΠ°Π½ΡΠ°Π·ΠΈΠΈ. Π ΡΠ΅ΠΏΠ΅ΡΡ ΠΏΡΠ΅Π΄ΡΡΠ°Π²ΡΡΠ΅, ΡΡΠΎ Π²Ρ Π²Π΅ΡΠ½ΡΠ»ΠΈΡΡ Π½Π΅ ΠΊ ΡΠ²ΠΎΠ΅ΠΌΡ ΠΏΡΠΎΠ΅ΠΊΡΡ, Π° ΠΊ ΠΏΡΠΎΠ΅ΠΊΡΡ ΡΠ΅Π»ΠΎΠ²Π΅ΠΊΠ°, ΠΊΠΎΡΠΎΡΡΠΉ ΠΏΠΎΠΊΠΈΠ½ΡΠ» ΠΊΠΎΠΌΠΏΠ°Π½ΠΈΡ ΠΈ Π² Π½Π°ΡΠ»Π΅Π΄ΡΡΠ²ΠΎ Π²Π°ΠΌ Π΄ΠΎΡΡΠ°Π»ΡΡ ΠΊΠΎΠ΄ ΠΈ ΠΌΠΎΠ΄Π΅Π»Ρ ΠΏΠΎΠ΄ Π½Π°Π·Π²Π°Π½ΠΈΠ΅ΠΌ model_1.pb. ΠΠ»Ρ ΠΏΠΎΠ»Π½ΠΎΡΡ ΠΊΠ°ΡΡΠΈΠ½Ρ ΠΈ ΠΏΠ΅ΡΠ΅Π΄Π°ΡΠΈ Π²ΡΠ΅ΠΉ Π±ΠΎΠ»ΠΈ, ΠΏΡΠ΅Π΄ΡΡΠ°Π²ΠΈΠΌ, ΡΡΠΎ Π²Ρ Π΅ΡΠ΅ ΠΈ Π½Π°ΡΠΈΠ½Π°ΡΡΠΈΠΉ ΡΠΏΠ΅ΡΠΈΠ°Π»ΠΈΡΡ. - ΠΠ΄Π΅ΠΌ Π΄Π°Π»ΡΡΠ΅. ΠΠ»Ρ Π·Π°ΠΏΡΡΠΊΠ° ΠΊΠΎΠ΄Π° Π½Π°ΠΌ ΠΈ Π²ΡΠ΅ΠΌ ΠΊΡΠΎ Π±ΡΠ΄Π΅Ρ Ρ Π½ΠΈΠΌ ΡΠ°Π±ΠΎΡΠ°ΡΡ Π½Π΅ΠΎΠ±Ρ ΠΎΠ΄ΠΈΠΌΠΎ ΡΠΎΠ·Π΄Π°ΡΡ ΠΎΠΊΡΡΠΆΠ΅Π½ΠΈΠ΅. Π§Π°ΡΡΠΎ Π±ΡΠ²Π°Π΅Ρ, ΡΡΠΎ ΠΈ Π΅Π³ΠΎ Π½Π°ΠΌ Π² Π½Π°ΡΠ»Π΅Π΄ΡΡΠ²ΠΎ ΡΠ°ΠΊΠΆΠ΅ ΠΏΠΎ ΠΊΠ°ΠΊΠΈΠΌ-ΡΠΎ ΠΏΡΠΈΡΠΈΠ½Π°ΠΌ Π½Π΅ ΠΎΡΡΠ°Π²ΠΈΠ»ΠΈ. ΠΡΠΎ ΡΠΎΠΆΠ΅ ΠΌΠΎΠΆΠ΅Ρ ΡΡΠ°ΡΡ Π½Π΅ΡΡΠΈΠ²ΠΈΠ°Π»ΡΠ½ΠΎΠΉ Π·Π°Π΄Π°ΡΠ΅ΠΉ. ΠΠ° ΡΡΠΎΡ ΡΠ°Π³ Π½Π΅ Ρ ΠΎΡΠ΅ΡΡΡ ΡΡΠ°ΡΠΈΡΡ Π²ΡΠ΅ΠΌΡ, Π½Π΅ ΡΠ°ΠΊ Π»ΠΈ?
- Π’ΡΠ΅Π½ΠΈΡΡΠ΅ΠΌ ΠΌΠΎΠ΄Π΅Π»Ρ (Π½Π°ΠΏΡΠΈΠΌΠ΅Ρ, Π΄Π΅ΡΠ΅ΠΊΡΠΎΡ Π°Π²ΡΠΎΠΌΠΎΠ±ΠΈΠ»Π΅ΠΉ). ΠΠΎΡ ΠΎΠ΄ΠΈΠΌ Π΄ΠΎ ΠΌΠΎΠΌΠ΅Π½ΡΠ°, ΠΊΠΎΠ³Π΄Π° ΠΎΠ½Π° ΡΡΠ°Π½ΠΎΠ²ΠΈΡΡΡ ΠΎΡΠ΅Π½Ρ Π΄Π°ΠΆΠ΅ Π½ΠΈΡΠ΅Π³ΠΎ β ΡΠ°ΠΌΠΎΠ΅ Π²ΡΠ΅ΠΌΡ ΡΠΎΡ ΡΠ°Π½ΠΈΡΡ ΡΠ΅Π·ΡΠ»ΡΡΠ°Ρ. ΠΠ°Π·ΠΎΠ²Π΅ΠΌ Π΅Π΅ car_detection_v1.pb. ΠΠΎΡΠΎΠΌ ΡΡΠ΅Π½ΠΈΡΡΠ΅ΠΌ Π΅ΡΠ΅ ΠΎΠ΄Π½Ρ β car_detection_v2.pb. ΠΠ΅ΠΊΠΎΡΠΎΡΠΎΠ΅ Π²ΡΠ΅ΠΌΡ ΡΠΏΡΡΡΡ Π½Π°ΡΠΈ ΠΊΠΎΠ»Π»Π΅Π³ΠΈ ΠΈΠ»ΠΈ ΠΌΡ ΡΠ°ΠΌΠΈ ΠΎΠ±ΡΡΠ°Π΅ΠΌ Π΅ΡΡ ΠΈ Π΅ΡΡ, ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΡ ΡΠ°Π·Π»ΠΈΡΠ½ΡΠ΅ Π°ΡΡ ΠΈΡΠ΅ΠΊΡΡΡΡ. Π ΠΈΡΠΎΠ³Π΅ ΡΠΎΡΠΌΠΈΡΡΠ΅ΡΡΡ ΠΊΡΡΠ° Π°ΡΡΠ΅ΡΠ°ΠΊΡΠΎΠ², ΠΈΠ½ΡΠΎΡΠΌΠ°ΡΠΈΡ ΠΎ ΠΊΠΎΡΠΎΡΡΡ Π½ΡΠΆΠ½ΠΎ ΠΊΡΠΎΠΏΠΎΡΠ»ΠΈΠ²ΠΎ ΡΠΎΠ±ΠΈΡΠ°ΡΡ (Π½ΠΎ, Π΄Π΅Π»Π°ΡΡ ΠΌΡ ΡΡΠΎ Π±ΡΠ΄Π΅ΠΌ ΠΏΠΎΠ·ΠΆΠ΅, Ρ Π½Π°Ρ Π²Π΅Π΄Ρ ΠΏΠΎΠΊΠ° Π΅ΡΡΡ Π±ΠΎΠ»Π΅Π΅ ΠΏΡΠΈΠΎΡΠΈΡΠ΅ΡΠ½ΡΠ΅ Π΄Π΅Π»Π°).
- ΠΡ Π²ΠΎΡ ΠΈ Π²ΡΡ! Π£ Π½Π°Ρ Π΅ΡΡΡ ΠΌΠΎΠ΄Π΅Π»Ρ! ΠΡ ΠΌΠΎΠΆΠ΅ΠΌ ΠΏΡΠΈΡΡΡΠΏΠ°ΡΡ ΠΊ ΠΎΠ±ΡΡΠ΅Π½ΠΈΡ ΡΠ»Π΅Π΄ΡΡΡΠ΅ΠΉ ΠΌΠΎΠ΄Π΅Π»ΠΈ, ΠΊ ΡΠ°Π·ΡΠ°Π±ΠΎΡΠΊΠ΅ Π°ΡΡ ΠΈΡΠ΅ΠΊΡΡΡΡ Π΄Π»Ρ ΡΠ΅ΡΠ΅Π½ΠΈΡ Π½ΠΎΠ²ΠΎΠΉ Π·Π°Π΄Π°ΡΠΈ ΠΈΠ»ΠΈ ΠΌΠΎΠΆΠ΅ΠΌ ΠΏΠΎΠΉΡΠΈ ΠΏΠΎΠΏΠΈΡΡ ΡΠ°ΠΉ? Π Π΄Π΅ΠΏΠ»ΠΎΠΈΡΡ ΠΊΡΠΎ Π±ΡΠ΄Π΅Ρ?
ΠΡΡΠ²Π»ΡΠ΅ΠΌ ΠΏΡΠΎΠ±Π»Π΅ΠΌΡ
Π Π°Π±ΠΎΡΠ° Π½Π°Π΄ ΠΏΡΠΎΠ΅ΠΊΡΠΎΠΌ ΠΈΠ»ΠΈ ΠΏΡΠΎΠ΄ΡΠΊΡΠΎΠΌ β ΡΡΠΎ ΡΡΡΠ΄ ΠΌΠ½ΠΎΠ³ΠΈΡ ΡΠ΅Π»ΠΎΠ²Π΅ΠΊ. Π Ρ ΡΠ΅ΡΠ΅Π½ΠΈΠ΅ΠΌ Π²ΡΠ΅ΠΌΠ΅Π½ΠΈ Π»ΡΠ΄ΠΈ ΡΡ ΠΎΠ΄ΡΡ ΠΈ ΠΏΡΠΈΡ ΠΎΠ΄ΡΡ, ΠΏΡΠΎΠ΅ΠΊΡΠΎΠ² ΡΡΠ°Π½ΠΎΠ²ΠΈΡΡΡ Π±ΠΎΠ»ΡΡΠ΅, ΡΠ°ΠΌΠΈ ΠΏΡΠΎΠ΅ΠΊΡΡ ΡΡΠ°Π½ΠΎΠ²ΡΡΡΡ ΡΠ»ΠΎΠΆΠ½Π΅Π΅. Π’Π°ΠΊ ΠΈΠ»ΠΈ ΠΈΠ½Π°ΡΠ΅, ΡΠΈΡΡΠ°ΡΠΈΠΈ ΠΈΠ· ΠΎΠΏΠΈΡΠ°Π½Π½ΠΎΠ³ΠΎ Π²ΡΡΠ΅ ΡΠΈΠΊΠ»Π° (ΠΈ Π½Π΅ ΡΠΎΠ»ΡΠΊΠΎ) Π² ΡΠ΅Ρ ΠΈΠ»ΠΈ ΠΈΠ½ΡΡ ΠΊΠΎΠΌΠ±ΠΈΠ½Π°ΡΠΈΡΡ Π±ΡΠ΄ΡΡ Π²ΡΡΡΠ΅ΡΠ°ΡΡΡΡ ΠΎΡ ΠΈΡΠ΅ΡΠ°ΡΠΈΠΈ ΠΊ ΠΈΡΠ΅ΡΠ°ΡΠΈΠΈ. ΠΡΠ΅ ΡΡΠΎ Π²ΡΠ»ΠΈΠ²Π°Π΅ΡΡΡ Π² ΡΡΠ°ΡΡ Π²ΡΠ΅ΠΌΠ΅Π½ΠΈ, ΠΏΡΡΠ°Π½ΠΈΡΡ, Π½Π΅ΡΠ²Ρ, Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ β Π² Π½Π΅Π΄ΠΎΠ²ΠΎΠ»ΡΡΡΠ²ΠΎ Π·Π°ΠΊΠ°Π·ΡΠΈΠΊΠ°, ΠΈ Π² ΠΊΠΎΠ½Π΅ΡΠ½ΠΎΠΌ ΡΡΠ΅ΡΠ΅ β Π² ΡΠΏΡΡΠ΅Π½Π½ΡΠ΅ Π΄Π΅Π½ΡΠ³ΠΈ. Π₯ΠΎΡΡ Π²ΡΠ΅ ΠΌΡ ΠΎΠ±ΡΡΠ½ΠΎ Ρ ΠΎΠ΄ΠΈΠΌ ΠΏΠΎ ΡΡΠ°ΡΡΠΌ Π³ΡΠ°Π±Π»ΡΠΌ, Π½ΠΎ ΠΏΠΎΠ»Π°Π³Π°Ρ, ΡΡΠΎ Π½ΠΈΠΊΡΠΎ ΠΏΡΠΈ ΡΡΠΎΠΌ Π½Π΅ Ρ ΠΎΡΠ΅Ρ ΡΠ°Π· Π·Π° ΡΠ°Π·ΠΎΠΌ ΠΏΠ΅ΡΠ΅ΠΆΠΈΠ²Π°ΡΡ ΡΡΠΈ ΠΌΠΎΠΌΠ΅Π½ΡΡ.
ΠΡΠ°ΠΊ, ΠΌΡ ΠΏΡΠΎΡΠ»ΠΈ ΠΏΠΎ ΠΎΠ΄Π½ΠΎΠΌΡ ΡΠΈΠΊΠ»Ρ ΡΠ°Π·ΡΠ°Π±ΠΎΡΠΊΠΈ ΠΈ Π²ΠΈΠ΄ΠΈΠΌ, ΡΡΠΎ Π΅ΡΡΡ ΠΏΡΠΎΠ±Π»Π΅ΠΌΡ, ΠΊΠΎΡΠΎΡΡΠ΅ Π½Π΅ΠΎΠ±Ρ ΠΎΠ΄ΠΈΠΌΠΎ ΡΠ΅ΡΠΈΡΡ. ΠΠ»Ρ ΡΡΠΎΠ³ΠΎ Π½ΡΠΆΠ½ΠΎ:
- ΡΠ΄ΠΎΠ±Π½ΠΎ Ρ ΡΠ°Π½ΠΈΡΡ ΡΠ΅Π·ΡΠ»ΡΡΠ°ΡΡ ΡΠ°Π±ΠΎΡΡ;
- ΡΠ΄Π΅Π»Π°ΡΡ ΠΏΡΠΎΡΡΡΠΌ ΠΏΡΠΎΡΠ΅ΡΡ Π²ΠΎΠ²Π»Π΅ΡΠ΅Π½ΠΈΡ Π½ΠΎΠ²ΡΡ ΡΠΎΡΡΡΠ΄Π½ΠΈΠΊΠΎΠ²;
- ΡΠΏΡΠΎΡΡΠΈΡΡ ΠΏΡΠΎΡΠ΅ΡΡ ΡΠ°Π·Π²Π΅ΡΡΡΠ²Π°Π½ΠΈΡ ΡΡΠ΅Π΄Ρ ΡΠ°Π·ΡΠ°Π±ΠΎΡΠΊΠΈ;
- Π½Π°ΡΡΡΠΎΠΈΡΡ ΠΏΡΠΎΡΠ΅ΡΡ Π²Π΅ΡΡΠΈΠΎΠ½ΠΈΡΠΎΠ²Π°Π½ΠΈΡ ΠΌΠΎΠ΄Π΅Π»Π΅ΠΉ;
- ΠΈΠΌΠ΅ΡΡ ΡΠ΄ΠΎΠ±Π½ΡΠΉ ΡΠΏΠΎΡΠΎΠ± Π²Π°Π»ΠΈΠ΄Π°ΡΠΈΠΈ ΠΌΠΎΠ΄Π΅Π»Π΅ΠΉ;
- Π½Π°ΠΉΡΠΈ ΠΈΠ½ΡΡΡΡΠΌΠ΅Π½Ρ ΡΠΏΡΠ°Π²Π»Π΅Π½ΠΈΡ ΡΠΎΡΡΠΎΡΠ½ΠΈΠ΅ΠΌ ΠΌΠΎΠ΄Π΅Π»Π΅ΠΉ;
- Π½Π°ΠΉΡΠΈ ΡΠΏΠΎΡΠΎΠ± Π΄ΠΎΡΡΠ°Π²ΠΊΠΈ ΠΌΠΎΠ΄Π΅Π»Π΅ΠΉ Π² production.
ΠΠΈΠ΄ΠΈΠΌΠΎ Π½Π΅ΠΎΠ±Ρ ΠΎΠ΄ΠΈΠΌΠΎ ΠΏΡΠΈΠ΄ΡΠΌΠ°ΡΡ workflow, ΠΊΠΎΡΠΎΡΡΠΉ Π±Ρ ΠΏΠΎΠ·Π²ΠΎΠ»ΡΠ» Π»Π΅Π³ΠΊΠΎ ΠΈ ΡΠ΄ΠΎΠ±Π½ΠΎ ΡΠΏΡΠ°Π²Π»ΡΡΡ ΡΡΠΈΠΌ ΠΆΠΈΠ·Π½Π΅Π½Π½ΡΠΌ ΡΠΈΠΊΠ»ΠΎΠΌ? Π£ ΡΠ°ΠΊΠΎΠΉ ΠΏΡΠ°ΠΊΡΠΈΠΊΠΈ Π΅ΡΡΡ Π½Π°Π·Π²Π°Π½ΠΈΠ΅ MLOps
MLOps, ΠΈΠ»ΠΈ DevOps Π΄Π»Ρ ΠΌΠ°ΡΠΈΠ½Π½ΠΎΠ³ΠΎ ΠΎΠ±ΡΡΠ΅Π½ΠΈΡ, ΠΏΠΎΠ·Π²ΠΎΠ»ΡΠ΅Ρ ΠΊΠΎΠΌΠ°Π½Π΄Π°ΠΌ ΡΠΏΠ΅ΡΠΈΠ°Π»ΠΈΡΡΠΎΠ² ΠΏΠΎ ΠΎΠ±ΡΠ°Π±ΠΎΡΠΊΠ΅ ΠΈ Π°Π½Π°Π»ΠΈΠ·Ρ Π΄Π°Π½Π½ΡΡ ΠΈ ΠΠ’-ΡΠΏΠ΅ΡΠΈΠ°Π»ΠΈΡΡΠΎΠ² ΡΠΎΡΡΡΠ΄Π½ΠΈΡΠ°ΡΡ, Π° ΡΠ°ΠΊΠΆΠ΅ ΡΠ²Π΅Π»ΠΈΡΠΈΠ²Π°ΡΡ ΡΠ΅ΠΌΠΏΡ ΡΠ°Π·ΡΠ°Π±ΠΎΡΠΊΠΈ ΠΈ ΡΠ°Π·Π²Π΅ΡΡΡΠ²Π°Π½ΠΈΡ ΠΌΠΎΠ΄Π΅Π»Π΅ΠΉ Ρ ΠΏΠΎΠΌΠΎΡΡΡ ΠΌΠΎΠ½ΠΈΡΠΎΡΠΈΠ½Π³Π°, ΠΏΡΠΎΠ²Π΅ΡΠΊΠΈ ΠΈ ΡΠΈΡΡΠ΅ΠΌΡ ΡΠΏΡΠ°Π²Π»Π΅Π½ΠΈΡ Π΄Π»Ρ ΠΌΠΎΠ΄Π΅Π»Π΅ΠΉ ΠΌΠ°ΡΠΈΠ½Π½ΠΎΠ³ΠΎ ΠΎΠ±ΡΡΠ΅Π½ΠΈΡ.
ΠΠΎΠΆΠ΅ΡΠ΅
ΠΠ°Π»Π΅Π΅ Π² ΡΠ²ΠΎΠ΅ΠΉ ΡΡΠ°ΡΡΠ΅ Ρ ΠΎΠΏΠΈΡΡ Π»ΠΈΡΡ ΡΠ°ΡΡΡ ΠΏΡΠΎΡΠ΅ΡΡΠ°. ΠΠ»Ρ ΡΠ΅Π°Π»ΠΈΠ·Π°ΡΠΈΠΈ Ρ Π²ΠΎΡΠΏΠΎΠ»ΡΠ·ΡΡΡΡ ΠΈΠ½ΡΡΡΡΠΌΠ΅Π½ΡΠΎΠΌ MLflow, Ρ.ΠΊ. ΡΡΠΎ open-source ΠΏΡΠΎΠ΅ΠΊΡ, Π΄Π»Ρ ΠΏΠΎΠ΄ΠΊΠ»ΡΡΠ΅Π½ΠΈΡ Π½Π΅ΠΎΠ±Ρ ΠΎΠ΄ΠΈΠΌΠΎ Π½Π΅Π±ΠΎΠ»ΡΡΠΎΠ΅ ΠΊΠΎΠ»ΠΈΡΠ΅ΡΡΠ²ΠΎ ΠΊΠΎΠ΄Π° ΠΈ Π΅ΡΡΡ ΠΈΠ½ΡΠ΅Π³ΡΠ°ΡΠΈΡ Ρ ΠΏΠΎΠΏΡΠ»ΡΡΠ½ΡΠΌΠΈ ml-ΡΡΠ΅ΠΉΠΌΠ²ΠΎΡΠΊΠ°ΠΌΠΈ. ΠΡ ΠΌΠΎΠΆΠ΅ΡΠ΅ ΠΏΠΎΠΈΡΠΊΠ°ΡΡ Π½Π° ΠΏΡΠΎΡΡΠΎΡΠ°Ρ ΠΈΠ½ΡΠ΅ΡΠ½Π΅ΡΠ° Π΄ΡΡΠ³ΠΈΠ΅ ΠΈΠ½ΡΡΡΡΠΌΠ΅Π½ΡΡ, Π½Π°ΠΏΡΠΈΠΌΠ΅Ρ Kubeflow, SageMaker, Trains ΠΈ Ρ.Π΄., ΠΈ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ, ΠΏΠΎΠ΄ΠΎΠ±ΡΠ°ΡΡ ΡΠΎΡ, ΠΊΠΎΡΠΎΡΡΠΉ Π»ΡΡΡΠ΅ ΠΏΠΎΠ΄Ρ ΠΎΠ΄ΠΈΡ ΠΏΠΎΠ΄ Π²Π°ΡΠΈ Π½ΡΠΆΠ΄Ρ.
"CΡΡΠΎΠΈΠΌ" 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, 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. ΠΠΎΠ±Π°Π²Π»ΡΠ΅ΠΌ ΡΡΠ΅ΠΊΠΈΠ½Π³
ΠΠ»Ρ ΡΠΎΠ³ΠΎ, ΡΡΠΎΠ±Ρ ΡΠ΅Π·ΡΠ»ΡΡΠ°ΡΡ Π½Π°ΡΠΈΡ ΡΡΠ΅Π½ΠΈΡΠΎΠ²ΠΎΠΊ Π½Π΅ ΠΏΡΠΎΠΏΠ°Π»ΠΈ, Π±ΡΠ΄ΡΡΠΈΠ΅ ΠΏΠΎΠΊΠΎΠ»Π΅Π½ΠΈΡ ΡΠ°Π·ΡΠ°Π±ΠΎΡΡΠΈΠΊΠΎΠ² ΠΏΠΎΠ½ΠΈΠΌΠ°Π»ΠΈ, ΡΡΠΎ Π²ΠΎΠΎΠ±ΡΠ΅ ΠΏΡΠΎΠΈΡΡ ΠΎΠ΄ΠΈΠ»ΠΎ, Π° ΡΡΠ°ΡΡΠΈΠ΅ ΡΠΎΠ²Π°ΡΠΈΡΠΈ ΠΈ Π²Ρ ΠΌΠΎΠ³Π»ΠΈ ΡΠΏΠΎΠΊΠΎΠΉΠ½ΠΎ Π°Π½Π°Π»ΠΈΠ·ΠΈΡΠΎΠ²Π°ΡΡ ΠΏΡΠΎΡΠ΅ΡΡ ΠΎΠ±ΡΡΠ΅Π½ΠΈΡ, Π½Π°ΠΌ Π½Π΅ΠΎΠ±Ρ ΠΎΠ΄ΠΈΠΌΠΎ Π΄ΠΎΠ±Π°Π²ΠΈΡΡ ΡΡΠ΅ΠΊΠΈΠ½Π³. ΠΠΎΠ΄ ΡΡΠ΅ΠΊΠΈΠ½Π³ΠΎΠΌ ΠΏΠΎΠ΄ΡΠ°Π·ΡΠΌΠ΅Π²Π°Π΅ΡΡΡ ΡΠΎΡ ΡΠ°Π½Π΅Π½ΠΈΠ΅ ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡΠΎΠ², ΠΌΠ΅ΡΡΠΈΠΊ, Π°ΡΡΠ΅ΡΠ°ΠΊΡΠΎΠ² ΠΈ Π»ΡΠ±ΠΎΠΉ Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡΠ΅Π»ΡΠ½ΠΎΠΉ ΠΈΠ½ΡΠΎΡΠΌΠ°ΡΠΈΠΈ ΠΎ Π·Π°ΠΏΡΡΠΊΠ΅ ΠΎΠ±ΡΡΠ΅Π½ΠΈΡ, Π² Π½Π°ΡΠ΅ΠΌ ΡΠ»ΡΡΠ°Π΅, Π½Π° ΡΠ΅ΡΠ²Π΅ΡΠ΅.
ΠΠ»Ρ ΠΏΡΠΈΠΌΠ΅ΡΠ° Ρ ΡΠΎΠ·Π΄Π°Π» Π½Π΅Π±ΠΎΠ»ΡΡΠΎΠΉ
ΠΠΎΡ ΡΡΡΠΎΠΊΠΈ, Π² ΠΊΠΎΡΠΎΡΡΡ ΠΏΡΠΎΠΈΡΡ ΠΎΠ΄ΠΈΡ ΡΠ°ΠΌΠΎΠ΅ ΠΈΠ½ΡΠ΅ΡΠ΅ΡΠ½ΠΎΠ΅:
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. ΠΡΠ΅Π½ΠΈΠ²Π°Π΅ΠΌ ΡΠ΅Π·ΡΠ»ΡΡΠ°ΡΡ ΠΎΠ±ΡΡΠ΅Π½ΠΈΡ
ΠΠΎΡΠ»Π΅ ΠΎΠΊΠΎΠ½ΡΠ°Π½ΠΈΡ ΠΎΠ±ΡΡΠ΅Π½ΠΈΡ ΠΌΡ ΠΌΠΎΠΆΠ΅ΠΌ ΠΏΠ΅ΡΠ΅ΠΉΡΠΈ Π² Π±ΡΠ°ΡΠ·Π΅ΡΠ΅ ΠΏΠΎ Π°Π΄ΡΠ΅ΡΡ Π½Π°ΡΠ΅Π³ΠΎ ΡΠ΅ΡΠ²Π΅ΡΠ°
ΠΠ΄Π΅ΡΡ ΠΌΡ Π²ΠΈΠ΄ΠΈΠΌ ΡΠΏΠΈΡΠΎΠΊ Π²ΡΠ΅Ρ ΡΠΊΡΠΏΠ΅ΡΠΈΠΌΠ΅Π½ΡΠΎΠ² (ΡΠ»Π΅Π²Π° Π²Π²Π΅ΡΡ Ρ), Π° ΡΠ°ΠΊΠΆΠ΅ ΠΈΠ½ΡΠΎΡΠΌΠ°ΡΠΈΡ ΠΏΠΎ Π·Π°ΠΏΡΡΠΊΠ°ΠΌ (ΠΏΠΎΡΠ΅ΡΠ΅Π΄ΠΈΠ½Π΅). ΠΡ ΠΌΠΎΠΆΠ΅ΠΌ ΠΏΠΎΡΠΌΠΎΡΡΠ΅ΡΡ Π±ΠΎΠ»Π΅Π΅ ΠΏΠΎΠ΄ΡΠΎΠ±Π½ΡΡ ΠΈΠ½ΡΠΎΡΠΌΠ°ΡΠΈΡ (ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡΡ, ΠΌΠ΅ΡΡΠΈΠΊΠΈ, Π°ΡΡΠ΅ΡΠ°ΠΊΡΡ ΠΈ ΠΊΠ°ΠΊΡΡ-ΡΠΎ Π΄ΠΎΠΏ. ΠΈΠ½ΡΠΎΡΠΌΠ°ΡΠΈΡ) ΠΏΠΎ ΠΊΠ°ΠΆΠ΄ΠΎΠΌΡ Π·Π°ΠΏΡΡΠΊΡ.
ΠΠΎ ΠΊΠ°ΠΆΠ΄ΠΎΠΉ ΠΌΠ΅ΡΡΠΈΠΊΠ΅ ΠΌΡ ΠΌΠΎΠΆΠ΅ΠΌ Π½Π°Π±Π»ΡΠ΄Π°ΡΡ ΠΈΡΡΠΎΡΠΈΡ ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΡ
Π’.Π΅. Π½Π° Π΄Π°Π½Π½ΡΠΉ ΠΌΠΎΠΌΠ΅Π½Ρ ΠΌΡ ΠΌΠΎΠΆΠ΅ΠΌ Π°Π½Π°Π»ΠΈΠ·ΠΈΡΠΎΠ²Π°ΡΡ ΡΠ΅Π·ΡΠ»ΡΡΠ°ΡΡ Π² "ΡΡΡΠ½ΠΎΠΌ" ΡΠ΅ΠΆΠΈΠΌΠ΅, ΡΠ°ΠΊΠΆΠ΅ Π²Ρ ΠΌΠΎΠΆΠ΅ΡΠ΅ Π½Π°ΡΡΡΠΎΠΈΡΡ ΠΈ Π°Π²ΡΠΎΠΌΠ°ΡΠΈΡΠ΅ΡΠΊΡΡ Π²Π°Π»ΠΈΠ΄Π°ΡΠΈΡ ΠΏΡΠΈ ΠΏΠΎΠΌΠΎΡΠΈ 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, Π΄Π»Ρ ΡΠ΄ΠΎΠ±ΡΡΠ²Π°. Π‘ΡΡΡ Π² ΡΠΎΠΌ, ΡΡΠΎ Ρ ΠΎΠ±ΡΠ°ΡΠ°ΡΡΡ ΠΊ ΡΠ΄Π°Π»Π΅Π½Π½ΠΎΠΌΡ ΡΠ΅ΡΠ²Π΅ΡΡ ΠΈ ΠΈΡΡ ΡΠ°ΠΌ ΠΌΠΎΠ΄Π΅Π»Ρ Ρ ΡΠΊΠ°Π·Π°Π½Π½ΡΠΌ ΠΈΠΌΠ΅Π½Π΅ΠΌ, ΠΏΡΠΈΡΠ΅ΠΌ, ΡΠ°ΠΌΡΡ ΠΏΠΎΡΠ»Π΅Π΄Π½ΡΡ production Π²Π΅ΡΡΠΈΡ. ΠΠ°Π»Π΅Π΅ ΡΠΊΠ°ΡΠΈΠ²Π°Ρ Π°ΡΡΠ΅ΡΠ°ΠΊΡ Π»ΠΎΠΊΠ°Π»ΡΠ½ΠΎ Π² ΠΏΠ°ΠΏΠΊΡ ./model ΠΈ ΡΠΎΠ±ΠΈΡΠ°Ρ ΠΌΠΎΠ΄Π΅Π»Ρ ΠΈΠ· ΡΡΠΎΠΉ Π΄ΠΈΡΠ΅ΠΊΡΠΎΡΠΈΠΈ mlflow.keras.load_model(local_path). ΠΡΡ ΡΠ΅ΠΏΠ΅ΡΡ ΠΌΡ ΠΌΠΎΠΆΠ΅ΠΌ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ Π½Π°ΡΡ ΠΌΠΎΠ΄Π΅Π»Ρ. CV (ML) ΡΠ°Π·ΡΠ°Π±ΠΎΡΡΠΈΠΊΠΈ ΠΌΠΎΠ³ΡΡ ΡΠΏΠΎΠΊΠΎΠΉΠ½ΠΎ Π·Π°Π½ΠΈΠΌΠ°ΡΡΡΡ ΡΠ»ΡΡΡΠ΅Π½ΠΈΠ΅ΠΌ ΠΌΠΎΠ΄Π΅Π»ΠΈ ΠΈ ΠΏΡΠ±Π»ΠΈΠΊΠΎΠ²Π°ΡΡ Π½ΠΎΠ²ΡΠ΅ Π²Π΅ΡΡΠΈΠΈ.
Π Π·Π°ΠΊΠ»ΡΡΠ΅Π½ΠΈΠ΅
Π― ΠΏΡΠ΅Π΄ΡΡΠ°Π²ΠΈΠ» ΡΠΈΡΡΠ΅ΠΌΡ ΠΊΠΎΡΠΎΡΠ°Ρ ΠΏΠΎΠ·Π²ΠΎΠ»ΡΠ΅Ρ:
- ΡΠ΅Π½ΡΡΠ°Π»ΠΈΠ·ΠΎΠ²Π°Π½Π½ΠΎ Ρ ΡΠ°Π½ΠΈΡΡ ΠΈΠ½ΡΠΎΡΠΌΠ°ΡΠΈΡ ΠΎ ML ΠΌΠΎΠ΄Π΅Π»ΡΡ , Ρ ΠΎΠ΄Π΅ ΠΈ ΡΠ΅Π·ΡΠ»ΡΡΠ°ΡΠ°Ρ ΠΎΠ±ΡΡΠ΅Π½ΠΈΡ;
- Π±ΡΡΡΡΠΎ ΡΠ°Π·Π²Π΅ΡΡΡΠ²Π°ΡΡ ΡΡΠ΅Π΄Ρ ΡΠ°Π·ΡΠ°Π±ΠΎΡΠΊΠΈ;
- ΡΠ»Π΅Π΄ΠΈΡΡ ΠΈ Π°Π½Π°Π»ΠΈΠ·ΠΈΡΠΎΠ²Π°ΡΡ Ρ ΠΎΠ΄ ΡΠ°Π±ΠΎΡΡ Π½Π°Π΄ ΠΌΠΎΠ΄Π΅Π»ΡΠΌΠΈ;
- ΡΠ΄ΠΎΠ±Π½ΠΎ Π²Π΅ΡΡΠΈ Π²Π΅ΡΡΠΈΠΎΠ½ΠΈΡΠΎΠ²Π°Π½ΠΈΠ΅ ΠΈ ΡΠΏΡΠ°Π²Π»ΡΡΡ ΡΠΎΡΡΠΎΡΠ½ΠΈΠ΅ΠΌ ΠΌΠΎΠ΄Π΅Π»Π΅ΠΉ;
- Π»Π΅Π³ΠΊΠΎ Π΄Π΅ΠΏΠ»ΠΎΠΈΡΡ ΠΏΠΎΠ»ΡΡΠ΅Π½Π½ΡΠ΅ ΠΌΠΎΠ΄Π΅Π»ΠΈ.
ΠΠ°Π½Π½ΡΠΉ ΠΏΡΠΈΠΌΠ΅Ρ ΡΠ²Π»ΡΠ΅ΡΡΡ ΠΈΠ³ΡΡΡΠ΅ΡΠ½ΡΠΌ ΠΈ ΡΠ»ΡΠΆΠΈΡ ΡΠΎΡΠΊΠΎΠΉ ΡΡΠ°ΡΡΠ° Π΄Π»Ρ Π²ΡΡΡΡΠ°ΠΈΠ²Π°Π½ΠΈΡ Π²Π°ΡΠ΅ΠΉ ΡΠΎΠ±ΡΡΠ²Π΅Π½Π½ΠΎΠΉ ΡΠΈΡΡΠ΅ΠΌΡ, ΠΊΠΎΡΠΎΡΠ°Ρ, Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ, Π±ΡΠ΄Π΅Ρ Π²ΠΊΠ»ΡΡΠ°ΡΡ Π² ΡΠ΅Π±Ρ Π°Π²ΡΠΎΠΌΠ°ΡΠΈΠ·Π°ΡΠΈΡ ΠΎΡΠ΅Π½ΠΊΠΈ ΡΠ΅Π·ΡΠ»ΡΡΠ°ΡΠΎΠ² ΠΈ ΡΠ΅Π³ΠΈΡΡΡΠ°ΡΠΈΠΈ ΠΌΠΎΠ΄Π΅Π»Π΅ΠΉ (ΠΏ.5 ΠΈ ΠΏ.6 ΡΠΎΠΎΡΠ²Π΅ΡΡΡΠ²Π΅Π½Π½ΠΎ) ΠΈΠ»ΠΈ Π²Ρ Π΄ΠΎΠ±Π°Π²ΠΈΡΠ΅ Π²Π΅ΡΡΠΈΠΎΠ½ΠΈΡΠΎΠ²Π°Π½ΠΈΠ΅ Π΄Π°ΡΠ°ΡΠ΅ΡΠΎΠ², ΠΈΠ»ΠΈ ΠΌΠΎΠΆΠ΅Ρ Π΅ΡΡ ΡΡΠΎ-ΡΠΎ? Π― ΠΏΡΡΠ°Π»ΡΡ Π΄ΠΎΠ½Π΅ΡΡΠΈ ΠΌΡΡΠ»Ρ, ΡΡΠΎ Π²Π°ΠΌ Π½ΡΠΆΠ΅Π½ MLOps Π² ΡΠ΅Π»ΠΎΠΌ, MLflow Π»ΠΈΡΡ ΡΡΠ΅Π΄ΡΡΠ²ΠΎ Π΄ΠΎΡΡΠΈΠΆΠ΅Π½ΠΈΡ ΡΠ΅Π»ΠΈ.
ΠΠ°ΠΏΠΈΡΠΈΡΠ΅ ΠΊΠ°ΠΊΠΈΠ΅ ΠΏΡΠΎΠ±Π»Π΅ΠΌΡ, Ρ ΠΊΠΎΡΠΎΡΡΠΌΠΈ Π²Ρ ΡΡΠ°Π»ΠΊΠΈΠ²Π°Π»ΠΈΡΡ, Ρ Π½Π΅ ΠΎΡΠΎΠ±ΡΠ°Π·ΠΈΠ»?
Π§ΡΠΎ Π±Ρ Π²Ρ Π΄ΠΎΠ±Π°Π²ΠΈΠ»ΠΈ Π² ΡΠΈΡΡΠ΅ΠΌΡ, ΡΡΠΎΠ±Ρ ΠΎΠ½Π° Π·Π°ΠΊΡΡΠ²Π°Π»Π° Π²Π°ΡΠΈ ΠΏΠΎΡΡΠ΅Π±Π½ΠΎΡΡΠΈ?
ΠΠ°ΠΊΠΈΠ΅ ΠΈΠ½ΡΡΡΡΠΌΠ΅Π½ΡΡ ΠΈ ΠΏΠΎΠ΄Ρ
ΠΎΠ΄Ρ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΡΠ΅ Π²Ρ, ΡΡΠΎΠ±Ρ Π·Π°ΠΊΡΡΡΡ Π²ΡΠ΅ ΠΈΠ»ΠΈ ΡΠ°ΡΡΡ ΠΏΡΠΎΠ±Π»Π΅ΠΌ?
P.S. ΠΡΡΠ°Π²Π»Ρ ΠΏΠ°ΡΡ ΡΡΡΠ»ΠΎΠΊ:
github ΠΏΡΠΎΠ΅ΠΊΡ β
MLflow β
ΠΠΎΡ ΡΠ°Π±ΠΎΡΠ°Ρ ΠΏΠΎΡΡΠ°, Π΄Π»Ρ Π²ΠΎΠΏΡΠΎΡΠΎΠ² β [email protected]
Π£ Π½Π°Ρ Π² ΠΊΠΎΠΌΠΏΠ°Π½ΠΈΠΈ ΠΏΠ΅ΡΠΈΠΎΠ΄ΠΈΡΠ΅ΡΠΊΠΈ ΠΏΡΠΎΠ²ΠΎΠ΄ΡΡΡΡ ΡΠ°Π·Π»ΠΈΡΠ½ΡΠ΅ ΠΌΠ΅ΡΠΎΠΏΡΠΈΡΡΠΈΡ Π΄Π»Ρ ΠΠ’-ΡΠΏΠ΅ΡΠΈΠ°Π»ΠΈΡΡΠΎΠ², Π½Π°ΠΏΡΠΈΠΌΠ΅Ρ: 8-Π³ΠΎ ΠΈΡΠ»Ρ Π² 19:00 ΠΏΠΎ ΠΠ‘Π Π±ΡΠ΄Π΅Ρ ΠΏΡΠΎΡ
ΠΎΠ΄ΠΈΡΡ ΠΌΠΈΡΠ°ΠΏ ΠΏΠΎ CV Π² ΠΎΠ½Π»Π°ΠΉΠ½-ΡΠΎΡΠΌΠ°ΡΠ΅, Π΅ΡΠ»ΠΈ ΠΈΠ½ΡΠ΅ΡΠ΅ΡΠ½ΠΎ, ΡΠΎ ΠΌΠΎΠΆΠ΅ΡΠ΅ ΠΏΡΠΈΠ½ΡΡΡ ΡΡΠ°ΡΡΠΈΠ΅, ΡΠ΅Π³ΠΈΡΡΡΠ°ΡΠΈΡ
ΠΡΡΠΎΡΠ½ΠΈΠΊ: habr.com