02 дСкабря 2020

πŸ’½ Git для Data Science: ΠΊΠΎΠ½Ρ‚Ρ€ΠΎΠ»ΡŒ вСрсий ΠΌΠΎΠ΄Π΅Π»Π΅ΠΉ ΠΈ датасСтов с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ DVC

ΠŸΠΈΡˆΡƒ, ΠΏΠ΅Ρ€Π΅Π²ΠΎΠΆΡƒ ΠΈ ΠΈΠ»Π»ΡŽΡΡ‚Ρ€ΠΈΡ€ΡƒΡŽ IT-ΡΡ‚Π°Ρ‚ΡŒΠΈ. На proglib написал 140 ΠΌΠ°Ρ‚Π΅Ρ€ΠΈΠ°Π»ΠΎΠ². УвлСкаюсь Python, Π²Π΅Π±ΠΎΠΌ ΠΈ Data Science. ΠžΡ‚ΠΊΡ€Ρ‹Ρ‚ ΠΊ Π΄ΠΈΠ°Π»ΠΎΠ³Ρƒ – ссылки Π½Π° соцсСти ΠΈ мСссСндТСры: https://matyushkin.github.io/links/ Если понравился ΡΡ‚ΠΈΠ»ΡŒ излоТСния, упорядочСнный список ΠΏΡƒΠ±Π»ΠΈΠΊΠ°Ρ†ΠΈΠΉ β€” https://github.com/matyushkin/lessons
ΠŸΠΎΠ΄Ρ€ΠΎΠ±Π½Ρ‹ΠΉ Ρ‚ΡƒΡ‚ΠΎΡ€ΠΈΠ°Π» ΠΎ Ρ‚ΠΎΠΌ, ΠΊΠ°ΠΊ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ DVC ΠΈ Git эффСктивно Ρ…Ρ€Π°Π½ΠΈΡ‚ΡŒ датасСты ΠΈ ΠΌΠΎΠ΄Π΅Π»ΠΈ машинного обучСния, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Ρ‰Π°Ρ‚ΡŒΡΡ ΠΌΠ΅ΠΆΠ΄Ρƒ Ρ€Π°Π·Π½Ρ‹ΠΌΠΈ ΠΈΡ… вСрсиями посрСдством ΠΏΠ°Ρ€Ρ‹ ΠΊΠΎΠΌΠ°Π½Π΄.
πŸ’½ Git для Data Science: ΠΊΠΎΠ½Ρ‚Ρ€ΠΎΠ»ΡŒ вСрсий ΠΌΠΎΠ΄Π΅Π»Π΅ΠΉ ΠΈ датасСтов с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ DVC

ΠŸΡƒΠ±Π»ΠΈΠΊΠ°Ρ†ΠΈΡ прСдставляСт собой Π½Π΅Π·Π½Π°Ρ‡ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ сокращСнный ΠΏΠ΅Ρ€Π΅Π²ΠΎΠ΄ ΡΡ‚Π°Ρ‚ΡŒΠΈ ΠšΡ€ΠΈΡΡ‚ΠΈΠ°Π½Π° Π˜Π²Π°Π½Ρ‡ΠΈΡ‡Π° Data Version Control With Python and DVC.

***

МашинноС ΠΎΠ±ΡƒΡ‡Π΅Π½ΠΈΠ΅ ΠΈ Π½Π°ΡƒΠΊΠ° ΠΎ Π΄Π°Π½Π½Ρ‹Ρ… сопряТСны с рядом Π·Π°Π΄Π°Ρ‡, ΠΎΡ‚Π»ΠΈΡ‡Π°ΡŽΡ‰ΠΈΡ…ΡΡ ΠΎΡ‚ Ρ‚Ρ€Π°Π΄ΠΈΡ†ΠΈΠΎΠ½Π½ΠΎΠΉ Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ½ΠΎΠ³ΠΎ обСспСчСния. Π’Π°ΠΊ, систСмы управлСния вСрсиями ΠΏΠΎΠΌΠΎΠ³Π°ΡŽΡ‚ Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠ°ΠΌ ΠΊΠΎΠ½Ρ‚Ρ€ΠΎΠ»ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ измСнСния исходного ΠΊΠΎΠ΄Π°, ΠΎΠ΄Π½Π°ΠΊΠΎ ΡƒΠΏΡ€Π°Π²Π»Π΅Π½ΠΈΠ΅ вСрсиями датасСтов, измСнСния Π² модСлях ΠΈ Π½Π°Π±ΠΎΡ€Π°Ρ… Π΄Π°Π½Π½Ρ‹Ρ…, ΠΎΡ‚Π»Π°ΠΆΠ΅Π½ΠΎ Π½Π΅ ΡΡ‚ΠΎΠ»ΡŒ Ρ…ΠΎΡ€ΠΎΡˆΠΎ.

Π’ этом руководствС ΠΌΡ‹ рассмотрим ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠ΅ вопросы:

  • ΠΊΠ°ΠΊ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ инструмСнт ΠΏΠΎΠ΄ Π½Π°Π·Π²Π°Π½ΠΈΠ΅ΠΌ DVC для Ρ€Π΅ΡˆΠ΅Π½ΠΈΡ Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… ΠΈΠ· этих ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌ;
  • ΠΊΠ°ΠΊ ΠΊΠΎΡ€Ρ€Π΅ΠΊΡ‚Π½ΠΎ ΠΎΡ‚ΡΠ»Π΅ΠΆΠΈΠ²Π°Ρ‚ΡŒ ΠΈ Ρ€Π΅Π΄Π°ΠΊΡ‚ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ Π½Π°Π±ΠΎΡ€Ρ‹ Π΄Π°Π½Π½Ρ‹Ρ… ΠΈ ΠΌΠΎΠ΄Π΅Π»ΠΈ;
  • ΠΊΠ°ΠΊ совмСстно ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ ΠΎΠ΄Π½Ρƒ систСму с Ρ‚ΠΎΠ²Π°Ρ€ΠΈΡ‰Π°ΠΌΠΈ ΠΏΠΎ ΠΊΠΎΠΌΠ°Π½Π΄Π΅;
  • ΠΊΠ°ΠΊ Π΄Π΅Π»Π°Ρ‚ΡŒ воспроизводимыС экспСримСнты с Ρ€Π°Π·Π½Ρ‹ΠΌΠΈ модСлями ML.

Π§Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ систСма управлСния вСрсиями Π΄Π°Π½Π½Ρ‹Ρ…

Π’ Ρ‚Ρ€Π°Π΄ΠΈΡ†ΠΈΠΎΠ½Π½ΠΎΠΉ Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚ΠΊΠ΅ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ½ΠΎΠ³ΠΎ обСспСчСния Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠ°ΠΌ приходится Π²Π·Π°ΠΈΠΌΠΎΠ΄Π΅ΠΉΡΡ‚Π²ΠΎΠ²Π°Ρ‚ΡŒ с нСсколькими вСрсиями ΠΎΠ΄Π½ΠΎΠ³ΠΎ ΠΈ Ρ‚ΠΎΠ³ΠΎ ΠΆΠ΅ ΠΊΠΎΠ΄Π°. Π§Ρ‚ΠΎΠ±Ρ‹ ΠΏΡ€Π΅Π΄ΠΎΡ‚Π²Ρ€Π°Ρ‚ΠΈΡ‚ΡŒ ΠΏΡƒΡ‚Π°Π½ΠΈΡ†Ρƒ ΠΈ ошибки, Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠΈ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‚ систСмы управлСния вСрсиями, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, Git.

Π’ систСмС управлСния вСрсиями Π΅ΡΡ‚ΡŒ Ρ†Π΅Π½Ρ‚Ρ€Π°Π»ΡŒΠ½Ρ‹ΠΉ Ρ€Π΅ΠΏΠΎΠ·ΠΈΡ‚ΠΎΡ€ΠΈΠΉ ΠΊΠΎΠ΄Π°, ΠΏΡ€Π΅Π΄ΡΡ‚Π°Π²Π»ΡΡŽΡ‰ΠΈΠΉ Ρ‚Π΅ΠΊΡƒΡ‰Π΅Π΅ состояниС ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π°. МоТно ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ копию ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π°, внСсти измСнСния ΠΈ Π·Π°ΠΏΡ€ΠΎΡΠΈΡ‚ΡŒ ΠΈΡ… Π΄ΠΎΠ±Π°Π²Π»Π΅Π½ΠΈΠ΅ Π² ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅ΠΉ ΠΎΡ„ΠΈΡ†ΠΈΠ°Π»ΡŒΠ½ΠΎΠΉ вСрсии. Π’ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Π΅ запроса ΠΊΠΎΠ΄ провСряСтся ΠΈ тСстируСтся, ΠΏΠΎΠΊΠ° Π½Π΅ Π±ΡƒΠ΄Π΅Ρ‚ Π²Ρ‹ΠΏΡƒΡ‰Π΅Π½.

Π’ ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π°Ρ…, связанных с Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚ΠΊΠΎΠΉ, Ρ‚Π°ΠΊΠΈΠ΅ Ρ†ΠΈΠΊΠ»Ρ‹ ΠΏΠΎΠ²Ρ‚ΠΎΡ€ΡΡŽΡ‚ΡΡ ΠΏΠΎ ΠΌΠ½ΠΎΠ³Ρƒ Ρ€Π°Π· Π² дСнь. Но Π² ΠΌΠΈΡ€Π΅ Data Science ΠΏΠΎΠ΄ΠΎΠ±Π½Ρ‹Π΅ соглашСния ΠΈ стандарты ΠΏΠΎΠΊΠ° Π½Π΅ Π·Π°ΠΊΡ€Π΅ΠΏΠΈΠ»ΠΈΡΡŒ. НаличиС систСм, ΠΏΠΎΠ·Π²ΠΎΠ»ΡΡŽΡ‰ΠΈΡ… людям быстро ΠΏΡ€ΠΎΠ΄ΠΎΠ»ΠΆΠΈΡ‚ΡŒ с Ρ‚ΠΎΠ³ΠΎ мСста, Π½Π° ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΌ ΠΎΡΡ‚Π°Π½ΠΎΠ²ΠΈΠ»ΠΈΡΡŒ Π΄Ρ€ΡƒΠ³ΠΈΠ΅, повысило Π±Ρ‹ ΡΠΊΠΎΡ€ΠΎΡΡ‚ΡŒ ΠΈ качСство ΠΏΠΎΠ»ΡƒΡ‡Π°Π΅ΠΌΡ‹Ρ… Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ΠΎΠ². Π­Ρ‚ΠΎ ΠΏΠΎΠΌΠΎΠ³Π»ΠΎ Π±Ρ‹ ΠΏΡ€ΠΎΠ·Ρ€Π°Ρ‡Π½ΠΎ ΡƒΠΏΡ€Π°Π²Π»ΡΡ‚ΡŒ Π΄Π°Π½Π½Ρ‹ΠΌΠΈ, эффСктивно ΠΏΡ€ΠΎΠ²ΠΎΠ΄ΠΈΡ‚ΡŒ экспСримСнты ΠΈ ΡΠΎΡ‚Ρ€ΡƒΠ΄Π½ΠΈΡ‡Π°Ρ‚ΡŒ с Π΄Ρ€ΡƒΠ³ΠΈΠΌΠΈ людьми ΠΈ ΠΊΠΎΠΌΠ°Π½Π΄Π°ΠΌΠΈ.

Π˜Π½ΡΡ‚Ρ€ΡƒΠΌΠ΅Π½Ρ‚, ΠΏΠΎΠΌΠΎΠ³Π°ΡŽΡ‰ΠΈΠΉ исслСдоватСлям ΡƒΠΏΡ€Π°Π²Π»ΡΡ‚ΡŒ Π΄Π°Π½Π½Ρ‹ΠΌΠΈ ΠΈ ΠΎΡΡƒΡ‰Π΅ΡΡ‚Π²Π»ΡΡ‚ΡŒ воспроизводимыС экспСримСнты – DVC (сокр. ΠΎΡ‚ Data Version Control).

Π§Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ DVC

DVC – это написанный Π½Π° Python инструмСнт ΠΊΠΎΠΌΠ°Π½Π΄Π½ΠΎΠΉ строки, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚ совмСстно с Git, Π° Ρ‚Π°ΠΊΠΆΠ΅ ΠΈΠΌΠΈΡ‚ΠΈΡ€ΡƒΠ΅Ρ‚ ΠΊΠΎΠΌΠ°Π½Π΄Ρ‹ ΠΈ Ρ€Π°Π±ΠΎΡ‡ΠΈΠ΅ процСссы Git, пСрСнося Π°Π½Π°Π»ΠΎΠ³ΠΈΡ‡Π½Ρ‹Π΅ ΠΏΠΎΠ΄Ρ…ΠΎΠ΄Ρ‹ Π½Π° Ρ€Π°Π±ΠΎΡ‚Ρƒ с Π΄Π°Π½Π½Ρ‹ΠΌΠΈ. ЀактичСски ΠΊΠΎΠΌΠ°Π½Π΄Ρ‹ git ΠΈ dvc ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‚ΡΡ вмСстС – ΠΎΠ΄Π½Π° Π·Π° Π΄Ρ€ΡƒΠ³ΠΎΠΉ. Π’ Ρ‚ΠΎ врСмя ΠΊΠ°ΠΊ Git примСняСтся для хранСния вСрсий ΠΊΠΎΠ΄Π°, DVC ΠΏΡ€ΠΎΠ²ΠΎΠ΄ΠΈΡ‚ Π°Π½Π°Π»ΠΎΠ³ΠΈΡ‡Π½ΡƒΡŽ Ρ€Π°Π±ΠΎΡ‚Ρƒ с Ρ„Π°ΠΉΠ»Π°ΠΌΠΈ ΠΌΠΎΠ΄Π΅Π»Π΅ΠΉ ΠΈ датасСтов.

Git ΠΌΠΎΠΆΠ΅Ρ‚ Ρ…Ρ€Π°Π½ΠΈΡ‚ΡŒ ΠΊΠΎΠ΄ ΠΊΠ°ΠΊ локально, Ρ‚Π°ΠΊ ΠΈ Π½Π° Bitbucket, GitHub ΠΈΠ»ΠΈ GitLab. Аналогичным ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ DVC позволяСт ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ для хранСния Π΄Π°Π½Π½Ρ‹Ρ… ΠΈ ΠΌΠΎΠ΄Π΅Π»Π΅ΠΉ ΡƒΠ΄Π°Π»Π΅Π½Π½Ρ‹ΠΉ Ρ€Π΅ΠΏΠΎΠ·ΠΈΡ‚ΠΎΡ€ΠΈΠΉ. МоТно ΡΠΎΠ·Π΄Π°Ρ‚ΡŒ Π»ΠΎΠΊΠ°Π»ΡŒΠ½ΡƒΡŽ копию ΡƒΠ΄Π°Π»Π΅Π½Π½ΠΎΠ³ΠΎ рСпозитория, ΠΈΠ·ΠΌΠ΅Π½ΠΈΡ‚ΡŒ Ρ„Π°ΠΉΠ»Ρ‹, Π° Π·Π°Ρ‚Π΅ΠΌ Π·Π°Π³Ρ€ΡƒΠ·ΠΈΡ‚ΡŒ свои измСнСния, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΏΠΎΠ΄Π΅Π»ΠΈΡ‚ΡŒΡΡ ΠΈΠΌΠΈ с ΠΊΠΎΠΌΠ°Π½Π΄ΠΎΠΉ.

Π£Π΄Π°Π»Π΅Π½Π½Ρ‹ΠΉ Ρ€Π΅ΠΏΠΎΠ·ΠΈΡ‚ΠΎΡ€ΠΈΠΉ ΠΌΠΎΠΆΠ΅Ρ‚ Π½Π°Ρ…ΠΎΠ΄ΠΈΡ‚ΡŒΡΡ Π½Π° вашСм Ρ€Π°Π±ΠΎΡ‡Π΅ΠΌ ΠΊΠΎΠΌΠΏΡŒΡŽΡ‚Π΅Ρ€Π΅ ΠΈΠ»ΠΈ Π² ΠΎΠ±Π»Π°ΠΊΠ΅, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, Π² AWS, GCP ΠΈΠ»ΠΈ Azure.

Π’ процСссС Ρ€Π°Π±ΠΎΡ‚Ρ‹ Π² ΡƒΠ΄Π°Π»Π΅Π½Π½ΠΎΠΌ Ρ€Π΅ΠΏΠΎΠ·ΠΈΡ‚ΠΎΡ€ΠΈΠΈ создаСтся dvc-Ρ„Π°ΠΉΠ» – нСбольшой тСкстовый Ρ„Π°ΠΉΠ» с описаниСм Ρ‚Π΅ΠΊΡƒΡ‰Π΅Π³ΠΎ состояния Ρ„Π°ΠΉΠ»ΠΎΠ² Π΄Π°Π½Π½Ρ‹Ρ…. Благодаря Π½Π΅Π±ΠΎΠ»ΡŒΡˆΠΎΠΌΡƒ Ρ€Π°Π·ΠΌΠ΅Ρ€Ρƒ ΠΎΠ½ ΠΌΠΎΠΆΠ΅Ρ‚ Ρ…Ρ€Π°Π½ΠΈΡ‚ΡŒΡΡ вмСстС с ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ½Ρ‹ΠΌ ΠΊΠΎΠ΄ΠΎΠΌ, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, Π½Π° GitHub.

Π”Π°Π»Π΅Π΅ ΠΌΡ‹ Π½Π° ΠΏΡ€Π°ΠΊΡ‚ΠΈΠΊΠ΅ ΠΈΠ·ΡƒΡ‡ΠΈΠΌ Π½Π°ΠΈΠ±ΠΎΠ»Π΅Π΅ Π²Π°ΠΆΠ½Ρ‹Π΅ особСнности DVC.

НастраиваСм Ρ€Π°Π±ΠΎΡ‡ΡƒΡŽ срСду DVC

Π’ этом руководствС ΠΌΡ‹ рассмотрим, ΠΊΠ°ΠΊ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ DVC, ΠΏΠΎΠΏΡ€Π°ΠΊΡ‚ΠΈΠΊΠΎΠ²Π°Π²ΡˆΠΈΡΡŒ Π½Π° ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅ Ρ€Π°Π±ΠΎΡ‚Ρ‹ с датасСтом Ρ„ΠΎΡ‚ΠΎΠ³Ρ€Π°Ρ„ΠΈΠΉ. ΠœΡ‹ Π΄Π°ΠΆΠ΅ ΠΎΠ±ΡƒΡ‡ΠΈΠΌ ML-модСль распознавания ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ². Для Ρ€Π°Π±ΠΎΡ‚Ρ‹ с ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π°ΠΌΠΈ Π² систСмС Π΄ΠΎΠ»ΠΆΠ½Ρ‹ Π±Ρ‹Ρ‚ΡŒ установлСны Python 3 ΠΈ Git.

DVC – это инструмСнт ΠΊΠΎΠΌΠ°Π½Π΄Π½ΠΎΠΉ строки. Если Π²Ρ‹ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒ Windows, ΠΎΠ·Π½Π°ΠΊΠΎΠΌΡŒΡ‚Π΅ΡΡŒ с Ρ€Π°Π·Π΄Π΅Π»ΠΎΠΌ «Запуск DVC Π² WindowsΒ» (Π°Π½Π³Π».).

Π§Ρ‚ΠΎΠ±Ρ‹ ΠΏΠΎΠ΄Π³ΠΎΡ‚ΠΎΠ²ΠΈΡ‚ΡŒ Ρ€Π°Π±ΠΎΡ‡ΡƒΡŽ срСду, Π½Π°ΠΌ Π½ΡƒΠΆΠ½ΠΎ Π²Ρ‹ΠΏΠΎΠ»Π½ΠΈΡ‚ΡŒ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅Π΅:

  • Π‘ΠΎΠ·Π΄Π°Ρ‚ΡŒ ΠΈ Π°ΠΊΡ‚ΠΈΠ²ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ Π²ΠΈΡ€Ρ‚ΡƒΠ°Π»ΡŒΠ½ΠΎΠ΅ ΠΎΠΊΡ€ΡƒΠΆΠ΅Π½ΠΈΠ΅.
  • Π£ΡΡ‚Π°Π½ΠΎΠ²ΠΈΡ‚ΡŒ DVC ΠΈ Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΈ Python.
  • Π‘Π΄Π΅Π»Π°Ρ‚ΡŒ Ρ„ΠΎΡ€ΠΊ ΠΈ ΠΊΠ»ΠΎΠ½ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ GitHub-Ρ€Π΅ΠΏΠΎΠ·ΠΈΡ‚ΠΎΡ€ΠΈΠΉ с ΠΊΠΎΠ΄ΠΎΠΌ.
  • Π—Π°Π³Ρ€ΡƒΠ·ΠΈΡ‚ΡŒ Π½Π°Π±ΠΎΡ€ Π΄Π°Π½Π½Ρ‹Ρ… для использования Π² ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π°Ρ….

Π’Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ любой ΠΌΠ΅Π½Π΅Π΄ΠΆΠ΅Ρ€ ΠΏΠ°ΠΊΠ΅Ρ‚ΠΎΠ² ΠΈ ΠΎΠΊΡ€ΡƒΠΆΠ΅Π½ΠΈΠΉ. Π’ этом руководствС ΠΌΡ‹ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌ conda, ΠΏΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ ΠΎΠ½ ΠΎΡ‚Π»ΠΈΡ‡Π½ΠΎ ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°Π΅Ρ‚ инструмСнты для Π°Π½Π°Π»ΠΈΠ·Π° Π΄Π°Π½Π½Ρ‹Ρ… ΠΈ машинного обучСния. Π§Ρ‚ΠΎΠ±Ρ‹ ΡΠΎΠ·Π΄Π°Ρ‚ΡŒ ΠΈ Π°ΠΊΡ‚ΠΈΠ²ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ Π²ΠΈΡ€Ρ‚ΡƒΠ°Π»ΡŒΠ½ΡƒΡŽ срСду, ΠΎΡ‚ΠΊΡ€ΠΎΠΉΡ‚Π΅ интСрфСйс ΠΊΠΎΠΌΠ°Π½Π΄Π½ΠΎΠΉ строки ΠΈ Π²Π²Π΅Π΄ΠΈΡ‚Π΅ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΡƒΡŽ ΠΊΠΎΠΌΠ°Π½Π΄Ρƒ:

        conda create --name dvc python=3.8.2 -y

    

Команда create создаст Π²ΠΈΡ€Ρ‚ΡƒΠ°Π»ΡŒΠ½ΡƒΡŽ срСду. Π€Π»Π°Π³ --name Π΄Π°Π΅Ρ‚ имя срСдС – Π² ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½Π½ΠΎΠΌ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅ – dvc. АргумСнт python позволяСт Π²Ρ‹Π±Ρ€Π°Ρ‚ΡŒ Π²Π΅Ρ€ΡΠΈΡŽ Python, ΠΊΠΎΡ‚ΠΎΡ€ΡƒΡŽ ΠΌΡ‹ Ρ…ΠΎΡ‚ΠΈΠΌ ΡƒΡΡ‚Π°Π½ΠΎΠ²ΠΈΡ‚ΡŒ Π² срСдС. Π€Π»Π°Π³ -y автоматичСски ΠΎΡ‚Π²Π΅Ρ‚ΠΈΡ‚ Yes Π½Π° всС вопросы ΠΎΠ± установкС Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊ.

Как Ρ‚ΠΎΠ»ΡŒΠΊΠΎ всё установлСно, Π°ΠΊΡ‚ΠΈΠ²ΠΈΡ€ΡƒΠ΅ΠΌ срСду:

        conda activate dvc
    

Π’Π΅ΠΏΠ΅Ρ€ΡŒ Ρƒ нас Π΅ΡΡ‚ΡŒ срСда Python, нСзависимая ΠΎΡ‚ установлСнных Π² ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΎΠ½Π½ΠΎΠΉ систСмС Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊ Python. Π’ Π½Π΅Π΅ ΠΌΡ‹ установим внСшниС Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΈ:

  • dvc – Π³Π»Π°Π²Π½Ρ‹ΠΉ Π³Π΅Ρ€ΠΎΠΉ;
  • scikit-learn – Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ° для обучСния ΠΌΠΎΠ΄Π΅Π»Π΅ΠΉ;
  • scikit-image – Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ° ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ ΠΈΠ·ΠΎΠ±Ρ€Π°ΠΆΠ΅Π½ΠΈΠΉ, ΠΊΠΎΡ‚ΠΎΡ€ΡƒΡŽ ΠΌΡ‹ Π±ΡƒΠ΄Π΅ΠΌ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ для ΠΏΠΎΠ΄Π³ΠΎΡ‚ΠΎΠ²ΠΊΠΈ Π΄Π°Π½Π½Ρ‹Ρ…;
  • pandas – Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ° Π°Π½Π°Π»ΠΈΠ·Π° Π΄Π°Π½Π½Ρ‹Ρ…, ΠΏΡ€Π΅Π΄ΡΡ‚Π°Π²Π»ΡΡŽΡ‰Π°Ρ Π΄Π°Π½Π½Ρ‹Π΅ Π² Π²ΠΈΠ΄Π΅ Ρ‚Π°Π±Π»ΠΈΡ†;
  • numpy – Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ°, Π΄ΠΎΠ±Π°Π²Π»ΡΡŽΡ‰Π°Ρ ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΊΡƒ ΠΌΠ½ΠΎΠ³ΠΎΠΌΠ΅Ρ€Π½Ρ‹Ρ… Π΄Π°Π½Π½Ρ‹Ρ….

Π˜Ρ… Ρ‚ΠΎΠΆΠ΅ ΠΌΠΎΠΆΠ½ΠΎ ΡƒΡΡ‚Π°Π½ΠΎΠ²ΠΈΡ‚ΡŒ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ conda:

        conda config --add channels conda-forge
conda install dvc scikit-learn scikit-image pandas numpy
    

Π’ качСствС Π°Π»ΡŒΡ‚Π΅Ρ€Π½Π°Ρ‚ΠΈΠ²Ρ‹ ΠΌΠΎΠΆΠ½ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ установщик pip:

        python -m pip install dvc scikit-learn scikit-image pandas numpy
    

Π’Π΅ΠΏΠ΅Ρ€ΡŒ сдСлаСм Ρ„ΠΎΡ€ΠΊ рСпозитория Data Version Control Tutorial. На страницС рСпозитория Π½Π°ΠΆΠΌΠΈΡ‚Π΅ Fork Π² ΠΏΡ€Π°Π²ΠΎΠΌ Π²Π΅Ρ€Ρ…Π½Π΅ΠΌ ΡƒΠ³Π»Ρƒ экрана ΠΈ Π²Ρ‹Π±Π΅Ρ€ΠΈΡ‚Π΅ Π²ΠΎ Π²ΡΠΏΠ»Ρ‹Π²Π°ΡŽΡ‰Π΅ΠΌ ΠΎΠΊΠ½Π΅ Π²Π°ΡˆΡƒ ΡƒΡ‡Π΅Ρ‚Π½ΡƒΡŽ запись.

Π”Π°Π»Π΅Π΅ ΠΊΠ»ΠΎΠ½ΠΈΡ€ΡƒΠ΅ΠΌ Ρ„ΠΎΡ€ΠΊ Π½Π° ΠΊΠΎΠΌΠΏΡŒΡŽΡ‚Π΅Ρ€ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ git clone ΠΈ ΠΏΠ΅Ρ€Π΅Ρ…ΠΎΠ΄ΠΈΠΌ Π² ΠΏΠ°ΠΏΠΊΡƒ рСпозитория (Π½Π΅ Π·Π°Π±ΡƒΠ΄ΡŒΡ‚Π΅ ΠΏΠΎΠΌΠ΅Π½ΡΡ‚ΡŒ YourUsername Π½Π° имя вашСго Π°ΠΊΠΊΠ°ΡƒΠ½Ρ‚Π° Π½Π° GitHub):

        git clone https://github.com/YourUsername/data-version-control
cd data-version-control
    

Π‘Ρ‚Ρ€ΡƒΠΊΡ‚ΡƒΡ€Π° рСпозитория выглядит ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ:

        data-version-control/
|
β”œβ”€β”€ data/
β”‚   β”œβ”€β”€ prepared/
β”‚   └── raw/
|
β”œβ”€β”€ metrics/
β”œβ”€β”€ model/
└── src/
    β”œβ”€β”€ evaluate.py
    β”œβ”€β”€ prepare.py
    └── train.py
    

Π’ Ρ€Π΅ΠΏΠΎΠ·ΠΈΡ‚ΠΎΡ€ΠΈΠΈ ΡˆΠ΅ΡΡ‚ΡŒ ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³ΠΎΠ²:

  1. src/ – для исходного ΠΊΠΎΠ΄Π°;
  2. data/ – для всСх вСрсий датасСтов;
  3. data/raw/ – для Π΄Π°Π½Π½Ρ‹Ρ…, ΠΏΠΎΠ»ΡƒΡ‡Π΅Π½Π½Ρ‹Ρ… ΠΈΠ· внСшнСго источника;
  4. data/prepare/ – для Π΄Π°Π½Π½Ρ‹Ρ…, ΠΈΠ·ΠΌΠ΅Π½Π΅Π½Π½Ρ‹Ρ… Π²Π½ΡƒΡ‚Ρ€ΠΈ;
  5. model/ – для ΠΌΠΎΠ΄Π΅Π»Π΅ΠΉ машинного обучСния;
  6. data/metrics/ – для отслСТивания ΠΏΠΎΠΊΠ°Π·Π°Ρ‚Π΅Π»Π΅ΠΉ ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΠΈ ΠΌΠΎΠ΄Π΅Π»Π΅ΠΉ.

ΠšΠ°Ρ‚Π°Π»ΠΎΠ³ src/ ΡƒΠΆΠ΅ содСрТит Ρ‚Ρ€ΠΈ Ρ„Π°ΠΉΠ»Π° Python:

  1. prepare.py – ΠΊΠΎΠ΄ ΠΏΠΎΠ΄Π³ΠΎΡ‚ΠΎΠ²ΠΊΠΈ Π΄Π°Π½Π½Ρ‹Ρ… для обучСния;
  2. train.py – ΠΊΠΎΠ΄ обучСния ΠΌΠΎΠ΄Π΅Π»ΠΈ;
  3. evalueate.py – ΠΊΠΎΠ΄ ΠΎΡ†Π΅Π½ΠΊΠΈ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ΠΎΠ² обучСния ΠΌΠΎΠ΄Π΅Π»ΠΈ.

Набор Π΄Π°Π½Π½Ρ‹Ρ… для обучСния

ПослСдний шаг Π² ΠΏΠΎΠ΄Π³ΠΎΡ‚ΠΎΠ²ΠΊΠ΅ – ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ ΠΏΡ€ΠΈΠΌΠ΅Ρ€ Π½Π°Π±ΠΎΡ€Π° Π΄Π°Π½Π½Ρ‹Ρ…, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΌΡ‹ ΠΌΠΎΠΆΠ΅ΠΌ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ для ΠΏΡ€Π°ΠΊΡ‚ΠΈΠΊΠΈ DVC. ΠŸΡ€ΠΈΠΌΠ΅Ρ€ с изобраТСниями ΠΏΠΎΠ΄Ρ…ΠΎΠ΄ΠΈΡ‚ для этого Π»ΡƒΡ‡ΡˆΠ΅ всСго: ΡƒΠΏΡ€Π°Π²Π»Π΅Π½ΠΈΠ΅ мноТСством ΠΊΡ€ΡƒΠΏΠ½Ρ‹Ρ… Ρ„Π°ΠΉΠ»ΠΎΠ² – это Ρ‚ΠΎ, Ρ‡Π΅ΠΌ отличаСтся DVC. ΠœΡ‹ Π±ΡƒΠ΄Π΅ΠΌ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Π½Π°Π±ΠΎΡ€ Π΄Π°Π½Π½Ρ‹Ρ… Imagenette ΠΊΠΎΠΌΠΏΠ°Π½ΠΈΠΈ fastai.

Imagenette – это подмноТСство датасСта ImageNet, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌΠΎΠ³ΠΎ Π² качСствС эталонного Π½Π°Π±ΠΎΡ€Π° Π΄Π°Π½Π½Ρ‹Ρ… Π² ΡΡ‚Π°Ρ‚ΡŒΡΡ… ΠΏΠΎ ΠΌΠ°ΡˆΠΈΠ½Π½ΠΎΠΌΡƒ ΠΎΠ±ΡƒΡ‡Π΅Π½ΠΈΡŽ. ImageNet слишком Π²Π΅Π»ΠΈΠΊ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Π΅Π³ΠΎ Π² качСствС ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π°, поэтому ΠΌΡ‹ возьмСм Π΅Π³ΠΎ подмноТСство Imagenette. ΠŸΠ΅Ρ€Π΅ΠΉΠ΄ΠΈΡ‚Π΅ Π½Π° GitHub-страницу Imagenette ΠΈ Π½Π°ΠΆΠΌΠΈΡ‚Π΅ ссылку для Π·Π°Π³Ρ€ΡƒΠ·ΠΊΠΈ 160 px download.

Набор Π΄Π°Π½Π½Ρ‹Ρ… сохранСн Π² Π²ΠΈΠ΄Π΅ tar-Π°Ρ€Ρ…ΠΈΠ²Π°. Π Π°Π·ΠΌΠ΅Ρ€ Ρ„Π°ΠΉΠ»Π° – порядка 100 Мб. ΠŸΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΠΈ Mac ΠΌΠΎΠ³ΡƒΡ‚ ΠΈΠ·Π²Π»Π΅Ρ‡ΡŒ Ρ„Π°ΠΉΠ»Ρ‹, Π΄Π²Π°ΠΆΠ΄Ρ‹ Ρ‰Π΅Π»ΠΊΠ½ΡƒΠ² Π°Ρ€Ρ…ΠΈΠ² Π² Finder. Линуксоиды ΠΌΠΎΠ³ΡƒΡ‚ Ρ€Π°ΡΠΏΠ°ΠΊΠΎΠ²Π°Ρ‚ΡŒ Π΅Π³ΠΎ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ ΠΊΠΎΠΌΠ°Π½Π΄Ρ‹ tar. ΠŸΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡΠΌ Windows потрСбуСтся ΡƒΡΡ‚Π°Π½ΠΎΠ²ΠΈΡ‚ΡŒ инструмСнт для распаковки tar-Ρ„Π°ΠΉΠ»ΠΎΠ², Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, 7-zip.

Набор Π΄Π°Π½Π½Ρ‹Ρ… структурирован ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π½Ρ‹ΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ. Π’ Π½Π΅ΠΌ Π΅ΡΡ‚ΡŒ Π΄Π²Π΅ основныС ΠΏΠ°ΠΏΠΊΠΈ:

  1. train/ – изобраТСния для обучСния ΠΌΠΎΠ΄Π΅Π»ΠΈ.
  2. val/ – изобраТСния для Π²Π°Π»ΠΈΠ΄Π°Ρ†ΠΈΠΈ.
ΠŸΡ€ΠΈΠΌΠ΅Ρ‡Π°Π½ΠΈΠ΅
Валидация ΠΎΠ±Ρ‹Ρ‡Π½ΠΎ происходит Π²ΠΎ врСмя обучСния ΠΌΠΎΠ΄Π΅Π»ΠΈ – Ρ‚Π°ΠΊ Π°Π½Π°Π»ΠΈΡ‚ΠΈΠΊΠΈ ΠΏΠΎΠ½ΠΈΠΌΠ°ΡŽΡ‚, насколько Ρ…ΠΎΡ€ΠΎΡˆΠΎ модСль обучаСтся. ΠŸΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ это руководство Π½Π΅ ΠΎΡ€ΠΈΠ΅Π½Ρ‚ΠΈΡ€ΠΎΠ²Π°Π½ΠΎ Π½Π° ΠΏΠΎΠΊΠ°Π·Π°Ρ‚Π΅Π»ΠΈ ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΠΈ, ΠΌΡ‹ Π±ΡƒΠ΄Π΅ΠΌ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Π½Π°Π±ΠΎΡ€ для ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΠΈ ΠΌΠΎΠ΄Π΅Π»ΠΈ послС Π΅Π΅ обучСния.

КаТдоС ΠΈΠ·ΠΎΠ±Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅ ΠΈΠΌΠ΅Π΅Ρ‚ связанный с Π½ΠΈΠΌ класс, ΠΎΠΏΠΈΡΡ‹Π²Π°ΡŽΡ‰ΠΈΠΉ, Ρ‡Ρ‚ΠΎ Π½Π° Π½Π΅ΠΌ ΠΈΠ·ΠΎΠ±Ρ€Π°ΠΆΠ΅Π½ΠΎ. Π§Ρ‚ΠΎΠ±Ρ‹ Ρ€Π΅ΡˆΠΈΡ‚ΡŒ Π·Π°Π΄Π°Ρ‡Ρƒ классификации, Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ ΠΎΠ±ΡƒΡ‡ΠΈΡ‚ΡŒ модСль, которая смоТСт Ρ‚ΠΎΡ‡Π½ΠΎ ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΡΡ‚ΡŒ класс изобраТСния.

ΠšΠ°Ρ‚Π°Π»ΠΎΠ³ΠΈ train/ ΠΈ val/ содСрТат нСсколько ΠΏΠ°ΠΏΠΎΠΊ. КаТдая ΠΏΠ°ΠΏΠΊΠ° соотвСтствуСт ΠΎΠ΄Π½ΠΎΠΌΡƒ ΠΈΠ· 10 классов:

  1. Π›ΠΈΠ½ΡŒ (Π²ΠΈΠ΄ Π»ΡƒΡ‡Π΅ΠΏΠ΅Ρ€Ρ‹Ρ… Ρ€Ρ‹Π±)
  2. Английский спрингСр-спаниСль (ΠΏΠΎΡ€ΠΎΠ΄Π° собак)
  3. ΠšΠ°ΡΡΠ΅Ρ‚Π½Ρ‹ΠΉ ΠΏΡ€ΠΎΠΈΠ³Ρ€Ρ‹Π²Π°Ρ‚Π΅Π»ΡŒ
  4. ЦСпная пила
  5. Π¦Π΅Ρ€ΠΊΠΎΠ²ΡŒ
  6. Π’Π°Π»Ρ‚ΠΎΡ€Π½Π°
  7. ΠœΡƒΡΠΎΡ€ΠΎΠ²ΠΎΠ·
  8. Вопливораздаточная ΠΊΠΎΠ»ΠΎΠ½ΠΊΠ°
  9. ΠœΡΡ‡ΠΈΠΊ для Π³ΠΎΠ»ΡŒΡ„Π°
  10. ΠŸΠ°Ρ€Π°ΡˆΡŽΡ‚

Для простоты ΠΈ скорости Π² руководствС ΠΌΡ‹ Π±ΡƒΠ΄Π΅ΠΌ ΠΎΠ±ΡƒΡ‡Π°Ρ‚ΡŒ модСль, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡ лишь Π΄Π²Π° послСдних класса. ПослС обучСния модСль Π΄ΠΎΠ»ΠΆΠ½Π° ΡΠΎΠΎΠ±Ρ‰Π°Ρ‚ΡŒ, являСтся Π»ΠΈ Ρ‚ΠΎ ΠΈΠ»ΠΈ ΠΈΠ½ΠΎΠ΅ ΠΈΠ·ΠΎΠ±Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅ мячом для Π³ΠΎΠ»ΡŒΡ„Π° ΠΈΠ»ΠΈ Ρ„ΠΎΡ‚ΠΎΠ³Ρ€Π°Ρ„ΠΈΠ΅ΠΉ ΠΏΠ°Ρ€Π°ΡˆΡŽΡ‚Π°. Π’Π°ΠΊΡƒΡŽ Π·Π°Π΄Π°Ρ‡Ρƒ, ΠΊΠΎΠ³Π΄Π° модСль Π²Ρ‹Π±ΠΈΡ€Π°Π΅Ρ‚ ΠΌΠ΅ΠΆΠ΄Ρƒ двумя Ρ‚ΠΈΠΏΠ°ΠΌΠΈ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ², Π½Π°Π·Ρ‹Π²Π°ΡŽΡ‚ Π±ΠΈΠ½Π°Ρ€Π½ΠΎΠΉ (Π΄Π²ΠΎΠΈΡ‡Π½ΠΎΠΉ) классификациСй.

ΠŸΠ΅Ρ€Π΅ΠΌΠ΅ΡΡ‚ΠΈΠΌ ΠΏΠ°ΠΏΠΊΠΈ train/ ΠΈ val/ Π² Ρ€Π΅ΠΏΠΎΠ·ΠΈΡ‚ΠΎΡ€ΠΈΠΉ data-version-control Π² ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³ data/raw/. Π‘Ρ‚Ρ€ΡƒΠΊΡ‚ΡƒΡ€Π° рСпозитория Π±ΡƒΠ΄Π΅Ρ‚ Π²Ρ‹Π³Π»ΡΠ΄Π΅Ρ‚ΡŒ Ρ‚Π°ΠΊ:

        data-version-control/
|
β”œβ”€β”€ data/
β”‚   β”œβ”€β”€ prepared/
β”‚   └── raw/
β”‚       β”œβ”€β”€ train/
β”‚       β”‚   β”œβ”€β”€ n01440764/
β”‚       β”‚   β”œβ”€β”€ n02102040/
β”‚       β”‚   β”œβ”€β”€ n02979186/
β”‚       β”‚   β”œβ”€β”€ n03000684/
β”‚       β”‚   β”œβ”€β”€ n03028079/
β”‚       β”‚   β”œβ”€β”€ n03394916/
β”‚       β”‚   β”œβ”€β”€ n03417042/
β”‚       β”‚   β”œβ”€β”€ n03425413/
β”‚       β”‚   β”œβ”€β”€ n03445777/
β”‚       β”‚   └── n03888257/
|       |
β”‚       └── val/
β”‚           β”œβ”€β”€ n01440764/
β”‚           β”œβ”€β”€ n02102040/
β”‚           β”œβ”€β”€ n02979186/
β”‚           β”œβ”€β”€ n03000684/
β”‚           β”œβ”€β”€ n03028079/
β”‚           β”œβ”€β”€ n03394916/
β”‚           β”œβ”€β”€ n03417042/
β”‚           β”œβ”€β”€ n03425413/
β”‚           β”œβ”€β”€ n03445777/
β”‚           └── n03888257/
|
β”œβ”€β”€ metrics/
β”œβ”€β”€ model/
└── src/
    β”œβ”€β”€ evaluate.py
    β”œβ”€β”€ prepare.py
    └── train.py
    

ΠœΡ‹ Π·Π°Π²Π΅Ρ€ΡˆΠΈΠ»ΠΈ настройку ΠΈ Π³ΠΎΡ‚ΠΎΠ²Ρ‹ ΡΠΊΡΠΏΠ΅Ρ€ΠΈΠΌΠ΅Π½Ρ‚ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ с DVC.

Π‘Π°Π·ΠΎΠ²Ρ‹ΠΉ Ρ€Π°Π±ΠΎΡ‡ΠΈΠΉ процСсс DVC

Π’ этом Ρ€Π°Π·Π΄Π΅Π»Π΅ ΠΌΡ‹ ΡƒΠ²ΠΈΠ΄ΠΈΠΌ, ΠΊΠ°ΠΊ DVC Π² Ρ‚Π°Π½Π΄Π΅ΠΌΠ΅ с Git позволяСт ΡƒΠΏΡ€Π°Π²Π»ΡΡ‚ΡŒ ΠΈ ΠΊΠΎΠ΄ΠΎΠΌ, ΠΈ Π΄Π°Π½Π½Ρ‹ΠΌΠΈ.

Для Π½Π°Ρ‡Π°Π»Π° ΠΏΠ΅Ρ€Π΅ΠΊΠ»ΡŽΡ‡ΠΈΠΌΡΡ Π½Π° Π²Π΅Ρ‚ΠΊΡƒ нашСго ΠΏΠ΅Ρ€Π²ΠΎΠ³ΠΎ экспСримСнта:

        git checkout -b "first_experiment"

    

git checkout измСняСт Ρ‚Π΅ΠΊΡƒΡ‰ΡƒΡŽ Π²Π΅Ρ‚ΠΊΡƒ, Π° ΠΏΠ΅Ρ€Π΅ΠΊΠ»ΡŽΡ‡Π°Ρ‚Π΅Π»ΡŒ -b сообщаСт Git, Ρ‡Ρ‚ΠΎ этой Π²Π΅Ρ‚ΠΊΠΈ Π½Π΅ сущСствовало Ρ€Π°Π½Π΅Π΅ ΠΈ Π΅Π΅ слСдуСт ΡΠΎΠ·Π΄Π°Ρ‚ΡŒ.

Π”Π°Π»Π΅Π΅ Π½ΡƒΠΆΠ½ΠΎ ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ DVC. ΠŸΡ€Π΅Π΄Π²Π°Ρ€ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ Π½ΡƒΠΆΠ½ΠΎ ΡƒΠ±Π΅Π΄ΠΈΡ‚ΡŒΡΡ, Ρ‡Ρ‚ΠΎ ΠΌΡ‹ находимся Π² ΠΏΠ°ΠΏΠΊΠ΅ Π²Π΅Ρ€Ρ…Π½Π΅Π³ΠΎ уровня рСпозитория. Π”Π°Π»Π΅Π΅ запускаСм ΠΊΠΎΠΌΠ°Π½Π΄Ρƒ dvc init:

        dvc init
    

Π­Ρ‚Π° ΠΊΠΎΠΌΠ°Π½Π΄Π° ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Ρ‚ ΠΊ созданию ΠΏΠ°ΠΏΠΊΠΈ .dvc, Π² ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΉ хранится информация ΠΎ ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΠΈ – Π°Π½Π°Π»ΠΎΠ³ΠΈΡ‡Π½ΠΎ Ρ‚ΠΎΠΌΡƒ, ΠΊΠ°ΠΊ ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³ .git содСрТит Π΄Π°Π½Π½Ρ‹Π΅ Git.

ΠŸΡ€ΠΈΠΌΠ΅Ρ‡Π°Π½ΠΈΠ΅
ΠŸΡ€ΠΈ запускС DVC выдаст ΠΏΡ€Π΅Π΄ΡƒΠΏΡ€Π΅ΠΆΠ΄Π΅Π½ΠΈΠ΅, Ρ‡Ρ‚ΠΎ собираСт Π°Π½ΠΎΠ½ΠΈΠΌΠ½ΡƒΡŽ статистику использования (это ΠΏΠΎΠΌΠΎΠ³Π°Π΅Ρ‚ Π°Π²Ρ‚ΠΎΡ€Π°ΠΌ ΡƒΠ»ΡƒΡ‡ΡˆΠΈΡ‚ΡŒ инструмСнт). Π’Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ ΠΎΡ‚ΠΊΠ»ΡŽΡ‡ΠΈΡ‚ΡŒ эту Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ, запустив ΠΊΠΎΠΌΠ°Π½Π΄Ρƒ dvc config core.analytics false

Π’Π΅ΠΏΠ΅Ρ€ΡŒ Π½Π°ΠΌ Π½ΡƒΠΆΠ½ΠΎ ΡΠΎΠ·Π΄Π°Ρ‚ΡŒ ΡƒΠ΄Π°Π»Π΅Π½Π½ΠΎΠ΅ Ρ…Ρ€Π°Π½ΠΈΠ»ΠΈΡ‰Π΅ Ρ„Π°ΠΉΠ»ΠΎΠ² Π΄Π°Π½Π½Ρ‹Ρ… ΠΈ ΠΌΠΎΠ΄Π΅Π»Π΅ΠΉ, ΠΊΠΎΠ½Ρ‚Ρ€ΠΎΠ»ΠΈΡ€ΡƒΠ΅ΠΌΡ‹Ρ… DVC. Пока Ρ‡Ρ‚ΠΎ для обучСния это ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ просто другая ΠΏΠ°ΠΏΠΊΠ° Π² вашСй систСмС. Π‘ΠΎΠ·Π΄Π°Π΄ΠΈΠΌ ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³ Π·Π° ΠΏΡ€Π΅Π΄Π΅Π»Π°ΠΌΠΈ рСпозитория data-version-control/ ΠΈ Π½Π°Π·ΠΎΠ²Π΅ΠΌ Π΅Π³ΠΎ dvc_remote.

ВСрнСмся Π² Ρ€Π΅ΠΏΠΎΠ·ΠΈΡ‚ΠΎΡ€ΠΈΠΉ data-version-control/ ΠΈ ΡƒΠΊΠ°ΠΆΠ΅ΠΌ DVC, Π³Π΄Π΅ находится ΡƒΠ΄Π°Π»Π΅Π½Π½ΠΎΠ΅ Ρ…Ρ€Π°Π½ΠΈΠ»ΠΈΡ‰Π΅:

        dvc remote add -d remote_storage ΠΏΡƒΡ‚ΡŒ_ΠΊ_dvc_remote

    

Π’Π΅ΠΏΠ΅Ρ€ΡŒ DVC Π·Π½Π°Π΅Ρ‚, Π³Π΄Π΅ Ρ…Ρ€Π°Π½ΠΈΡ‚ΡŒ Ρ€Π΅Π·Π΅Ρ€Π²Π½ΡƒΡŽ копию Π΄Π°Π½Π½Ρ‹Ρ… ΠΈ ΠΌΠΎΠ΄Π΅Π»Π΅ΠΉ. Команда dvc remote add сохраняСт мСстополоТСниС ΡƒΠ΄Π°Π»Π΅Π½Π½ΠΎΠ³ΠΎ Ρ…Ρ€Π°Π½ΠΈΠ»ΠΈΡ‰Π° ΠΈ Π½Π°Π·Ρ‹Π²Π°Π΅Ρ‚ Π΅Π³ΠΎ remote_storage. ΠšΠ»ΡŽΡ‡ -d сообщаСт DVC, Ρ‡Ρ‚ΠΎ это ΡƒΠ΄Π°Π»Π΅Π½Π½ΠΎΠ΅ Ρ…Ρ€Π°Π½ΠΈΠ»ΠΈΡ‰Π΅ ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ (default). ΠŸΠΎΡ‚ΠΎΠΌ ΠΌΠΎΠΆΠ½ΠΎ Π΄ΠΎΠ±Π°Π²ΠΈΡ‚ΡŒ Π΄Ρ€ΡƒΠ³ΠΈΠ΅ ΡƒΠ΄Π°Π»Π΅Π½Π½Ρ‹Π΅ Ρ…Ρ€Π°Π½ΠΈΠ»ΠΈΡ‰Π° ΠΈ ΠΏΠ΅Ρ€Π΅ΠΊΠ»ΡŽΡ‡Π°Ρ‚ΡŒΡΡ ΠΌΠ΅ΠΆΠ΄Ρƒ Π½ΠΈΠΌΠΈ.

Π’Π½ΡƒΡ‚Ρ€ΠΈ ΠΏΠ°ΠΏΠΊΠΈ .dvc находится Ρ„Π°ΠΉΠ» config, Π² ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΌ хранится информация ΠΎ ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΠΈ рСпозитория:

        [core]
    analytics = false
    remote = remote_storage
['remote "remote_storage"']
    url = /path/to/your/remote_storage
    

ОсновноС практичСскоС ΠΏΡ€Π°Π²ΠΈΠ»ΠΎ, ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΌΡƒ ΠΌΡ‹ Π΄ΠΎΠ»ΠΆΠ½Ρ‹ ΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚ΡŒ, Π·Π°ΠΊΠ»ΡŽΡ‡Π°Π΅Ρ‚ΡΡ Π² Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎ нСбольшиС Ρ„Π°ΠΉΠ»Ρ‹ ΠΎΡ‚ΠΏΡ€Π°Π²Π»ΡΡŽΡ‚ΡΡ Π½Π° GitHub, Π° большиС – Π² ΡƒΠ΄Π°Π»Π΅Π½Π½ΠΎΠ΅ Ρ…Ρ€Π°Π½ΠΈΠ»ΠΈΡ‰Π΅ DVC.

ΠžΡ‚ΡΠ»Π΅ΠΆΠΈΠ²Π°Π½ΠΈΠ΅ Ρ„Π°ΠΉΠ»ΠΎΠ² с DVC ΠΈ Git

Для запуска отслСТивания Ρ„Π°ΠΉΠ»ΠΎΠ² Git ΠΈ DVC ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‚ ΠΊΠΎΠΌΠ°Π½Π΄Ρƒ add. Π”ΠΎΠ±Π°Π²ΠΈΠΌ ΠΏΠ°ΠΏΠΊΠΈ train/ ΠΈ val/ ΠΏΠΎΠ΄ ΡƒΠΏΡ€Π°Π²Π»Π΅Π½ΠΈΠ΅ DVC:

        dvc add data/raw/train
dvc add data/raw/val
    

Π’ΠΎΡ‚ Ρ‡Ρ‚ΠΎ ΠΏΡ€ΠΈ этом Π΄Π΅Π»Π°Π΅Ρ‚ DVC:

  1. ДобавляСт ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³ΠΈ train/ ΠΈ val/ Π² .gitignore.
  2. Π‘ΠΎΠ·Π΄Π°Π΅Ρ‚ Π΄Π²Π° dvc-Ρ„Π°ΠΉΠ»Π°: train.dvc ΠΈ val.dvc.
  3. ΠšΠΎΠΏΠΈΡ€ΡƒΠ΅Ρ‚ ΠΏΠ°ΠΏΠΊΠΈ train/ ΠΈ val/ Π² ΠΏΡ€ΠΎΠΌΠ΅ΠΆΡƒΡ‚ΠΎΡ‡Π½ΡƒΡŽ ΠΎΠ±Π»Π°ΡΡ‚ΡŒ (staging).

.gitignore – это тСкстовый Ρ„Π°ΠΉΠ» со списком Ρ„Π°ΠΉΠ»ΠΎΠ², ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Git Π½Π΅ Π΄ΠΎΠ»ΠΆΠ΅Π½ ΠΎΡ‚ΡΠ»Π΅ΠΆΠΈΠ²Π°Ρ‚ΡŒ. Добавляя ΠΏΠ°ΠΏΠΊΠΈ train/ ΠΈ val/ Π² .gitignore, DVC Π³Π°Ρ€Π°Π½Ρ‚ΠΈΡ€ΡƒΠ΅Ρ‚, Ρ‡Ρ‚ΠΎ ΠΌΡ‹ случайно Π½Π΅ Π·Π°Π³Ρ€ΡƒΠ·ΠΈΠΌ большиС Ρ„Π°ΠΉΠ»Ρ‹ Π΄Π°Π½Π½Ρ‹Ρ… Π½Π° GitHub.

На ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅ΠΌ ΠΈΠ·ΠΎΠ±Ρ€Π°ΠΆΠ΅Π½ΠΈΠΈ ΠΏΠΎΠΊΠ°Π·Π°Π½ΠΎ, ΠΊΠ°ΠΊ выглядСл Ρ€Π΅ΠΏΠΎΠ·ΠΈΡ‚ΠΎΡ€ΠΈΠΉ Π΄ΠΎ выполнСния ΠΊΠ°ΠΊΠΈΡ…-Π»ΠΈΠ±ΠΎ ΠΊΠΎΠΌΠ°Π½Π΄.

Π Π΅ΠΏΠΎΠ·ΠΈΡ‚ΠΎΡ€ΠΈΠΉ Π΄ΠΎ выполнСния ΠΊΠ°ΠΊΠΈΡ…-Π»ΠΈΠ±ΠΎ ΠΊΠΎΠΌΠ°Π½Π΄. Всё, Ρ‡Ρ‚ΠΎ ΠΊΠΎΠ½Ρ‚Ρ€ΠΎΠ»ΠΈΡ€ΡƒΠ΅Ρ‚ DVC, находится слСва (Π·Π΅Π»Π΅Π½Ρ‹ΠΉ Ρ†Π²Π΅Ρ‚), Git – справа (синий). Π£ΠΏΡ€ΠΎΡ‰Π΅Π½Π½ΠΎ Π±ΡƒΠ΄Π΅ΠΌ ΠΎΡ‚ΠΎΠ±Ρ€Π°ΠΆΠ°Ρ‚ΡŒ Π² Ρ€Π΅ΠΏΠΎΠ·ΠΈΡ‚ΠΎΡ€ΠΈΠΈ Ρ„Π°ΠΉΠ» с ΠΊΠΎΠ΄ΠΎΠΌ <code>code.py </code>ΠΈ ΠΏΠ°ΠΏΠΊΡƒ <code>train/</code>.
Π Π΅ΠΏΠΎΠ·ΠΈΡ‚ΠΎΡ€ΠΈΠΉ Π΄ΠΎ выполнСния ΠΊΠ°ΠΊΠΈΡ…-Π»ΠΈΠ±ΠΎ ΠΊΠΎΠΌΠ°Π½Π΄. Всё, Ρ‡Ρ‚ΠΎ ΠΊΠΎΠ½Ρ‚Ρ€ΠΎΠ»ΠΈΡ€ΡƒΠ΅Ρ‚ DVC, находится слСва (Π·Π΅Π»Π΅Π½Ρ‹ΠΉ Ρ†Π²Π΅Ρ‚), Git – справа (синий). Π£ΠΏΡ€ΠΎΡ‰Π΅Π½Π½ΠΎ Π±ΡƒΠ΄Π΅ΠΌ ΠΎΡ‚ΠΎΠ±Ρ€Π°ΠΆΠ°Ρ‚ΡŒ Π² Ρ€Π΅ΠΏΠΎΠ·ΠΈΡ‚ΠΎΡ€ΠΈΠΈ Ρ„Π°ΠΉΠ» с ΠΊΠΎΠ΄ΠΎΠΌ code.py ΠΈ ΠΏΠ°ΠΏΠΊΡƒ train/.

Когда ΠΌΡ‹ запускаСм dvc add train/, ΠΏΠ°ΠΏΠΊΠ° с большими Ρ„Π°ΠΉΠ»Π°ΠΌΠΈ ΠΏΠ΅Ρ€Π΅Ρ…ΠΎΠ΄ΠΈΡ‚ ΠΏΠΎΠ΄ ΠΊΠΎΠ½Ρ‚Ρ€ΠΎΠ»ΡŒ DVC, Π° малСнькиС dvc-Ρ„Π°ΠΉΠ»Ρ‹ ΠΈ Ρ„Π°ΠΉΠ» .gitignore пСрСходят ΠΏΠΎΠ΄ ΠΊΠΎΠ½Ρ‚Ρ€ΠΎΠ»ΡŒ Git. Папка train/ ΠΏΠΎΠΏΠ°Π΄Π°Π΅Ρ‚ Π² staging-ΠΎΠ±Π»Π°ΡΡ‚ΡŒ DVC.

πŸ’½ Git для Data Science: ΠΊΠΎΠ½Ρ‚Ρ€ΠΎΠ»ΡŒ вСрсий ΠΌΠΎΠ΄Π΅Π»Π΅ΠΉ ΠΈ датасСтов с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ DVC

ПослС Ρ‚ΠΎΠ³ΠΎ ΠΊΠ°ΠΊ большиС Ρ„Π°ΠΉΠ»Ρ‹ ΠΈΠ·ΠΎΠ±Ρ€Π°ΠΆΠ΅Π½ΠΈΠΉ ΠΏΠΎΠΌΠ΅Ρ‰Π΅Π½Ρ‹ ΠΏΠΎΠ΄ ΡƒΠΏΡ€Π°Π²Π»Π΅Π½ΠΈΠ΅ DVC, Π΄ΠΎΠ±Π°Π²ΠΈΠΌ вСсь ΠΊΠΎΠ΄ ΠΈ нСбольшиС Ρ„Π°ΠΉΠ»Ρ‹ Π² staging-ΠΎΠ±Π»Π°ΡΡ‚ΡŒ Git с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ git add:

        git add --all
    
Π’Π΅ΠΏΠ΅Ρ€ΡŒ всС Ρ„Π°ΠΉΠ»Ρ‹ находятся ΠΏΠΎΠ΄ ΡƒΠΏΡ€Π°Π²Π»Π΅Π½ΠΈΠ΅ΠΌ ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΡ… систСм контроля вСрсий.
Π’Π΅ΠΏΠ΅Ρ€ΡŒ всС Ρ„Π°ΠΉΠ»Ρ‹ находятся ΠΏΠΎΠ΄ ΡƒΠΏΡ€Π°Π²Π»Π΅Π½ΠΈΠ΅ΠΌ ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΡ… систСм контроля вСрсий.

Если ΠΊΡ‚ΠΎ-Ρ‚ΠΎ Ρ…ΠΎΡ‡Π΅Ρ‚ Ρ€Π°Π±ΠΎΡ‚Π°Ρ‚ΡŒ Π½Π°Π΄ ΠΏΡ€ΠΎΠ΅ΠΊΡ‚ΠΎΠΌ ΠΈ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Π΄Π°Π½Π½Ρ‹Π΅ train/ ΠΈ val/, ΠΈΠΌ сначала Π½ΡƒΠΆΠ½ΠΎ Π·Π°Π³Ρ€ΡƒΠ·ΠΈΡ‚ΡŒ Ρ€Π΅ΠΏΠΎΠ·ΠΈΡ‚ΠΎΡ€ΠΈΠΉ Git, Π·Π°Ρ‚Π΅ΠΌ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ dvc-Ρ„Π°ΠΉΠ»Ρ‹ для получСния Ρ‚Π΅ΠΊΡƒΡ‰Π΅ΠΉ вСрсии Π΄Π°Π½Π½Ρ‹Ρ….

Но сначала Π½Π°ΠΌ Π½ΡƒΠΆΠ½ΠΎ Π·Π°Π³Ρ€ΡƒΠ·ΠΈΡ‚ΡŒ Ρ„Π°ΠΉΠ»Ρ‹ Π² ΡƒΠ΄Π°Π»Π΅Π½Π½ΠΎΠ΅ Ρ…Ρ€Π°Π½ΠΈΠ»ΠΈΡ‰Π΅.

ΠŸΠ΅Ρ€Π΅Π½ΠΎΡ Ρ„Π°ΠΉΠ»ΠΎΠ² Π½Π° ΡƒΠ΄Π°Π»Π΅Π½Π½Ρ‹ΠΉ Ρ€Π΅ΠΏΠΎΠ·ΠΈΡ‚ΠΎΡ€ΠΈΠΉ

Π§Ρ‚ΠΎΠ±Ρ‹ Π·Π°Π³Ρ€ΡƒΠ·ΠΈΡ‚ΡŒ Ρ„Π°ΠΉΠ»Ρ‹ Π½Π° GitHub, Π½ΡƒΠΆΠ½ΠΎ сначала ΡΠΎΠ·Π΄Π°Ρ‚ΡŒ «снимок» Ρ‚Π΅ΠΊΡƒΡ‰Π΅Π³ΠΎ состояния рСпозитория:

        git commit -m "Начало Ρ€Π°Π±ΠΎΡ‚Ρ‹ с DVC: настройка ΠΈ Π·Π°Π³Ρ€ΡƒΠ·ΠΊΠ° DVC-Ρ„Π°ΠΉΠ»ΠΎΠ²"
    

ΠšΠ»ΡŽΡ‡ -m ΠΎΠ·Π½Π°Ρ‡Π°Π΅Ρ‚, Ρ‡Ρ‚ΠΎ ΠΏΠΎΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΉ тСкст Π² ΠΊΠ°Π²Ρ‹Ρ‡ΠΊΠ°Ρ… прСдставляСт собой сообщСниС, ΠΎΠ±ΡŠΡΡΠ½ΡΡŽΡ‰Π΅Π΅, Ρ‡Ρ‚ΠΎ Π±Ρ‹Π»ΠΎ сдСлано.

Π’ DVC Ρ‚ΠΎΠΆΠ΅ Π΅ΡΡ‚ΡŒ ΠΊΠΎΠΌΠ°Π½Π΄Π° commit, Π½ΠΎ ΠΎΠ½Π° Π΄Π΅Π»Π°Π΅Ρ‚ Π½Π΅ Ρ‚ΠΎ ΠΆΠ΅ самоС, Ρ‡Ρ‚ΠΎ git commit. DVC Π½Π΅ Π½ΡƒΠΆΠ΅Π½ снимок всСго рСпозитория. Π˜Π½ΡΡ‚Ρ€ΡƒΠΌΠ΅Π½Ρ‚ позволяСт Π·Π°Π³Ρ€ΡƒΠΆΠ°Ρ‚ΡŒ Ρ„Π°ΠΉΠ»Ρ‹, ΠΊΠ°ΠΊ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΎΠ½ΠΈ Π½Π°Ρ‡ΠΈΠ½Π°ΡŽΡ‚ ΠΎΡ‚ΡΠ»Π΅ΠΆΠΈΠ²Π°Ρ‚ΡŒΡΡ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ dvc add. Команда dvc commit ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ ΠΏΡ€ΠΈ ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠΈ ΡƒΠΆΠ΅ отслСТиваСмого Ρ„Π°ΠΉΠ»Π°. Внося локальноС ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠ΅ Π² Π΄Π°Π½Π½Ρ‹Π΅, ΠΌΡ‹ Π΄ΠΎΠ»ΠΆΠ½Ρ‹ Π·Π°Ρ„ΠΈΠΊΡΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠ΅ Π² кэшС ΠΏΠ΅Ρ€Π΅Π΄ Π·Π°Π³Ρ€ΡƒΠ·ΠΊΠΎΠΉ Π½Π° ΡƒΠ΄Π°Π»Π΅Π½Π½Ρ‹ΠΉ ΠΊΠΎΠΌΠΏΡŒΡŽΡ‚Π΅Ρ€. Π’Π°ΠΊ ΠΊΠ°ΠΊ ΠΌΡ‹ ΠΏΠΎΠΊΠ° Π½Π΅ мСняли Π΄Π°Π½Π½Ρ‹Π΅ с ΠΌΠΎΠΌΠ΅Π½Ρ‚Π° ΠΈΡ… добавлСния, commit для dvc Π΄Π΅Π»Π°Ρ‚ΡŒ Π½Π΅ Π½ΡƒΠΆΠ½ΠΎ.

ΠŸΡ€ΠΈΠΌΠ΅Ρ‡Π°Π½ΠΈΠ΅
ΠŸΠΎΠ΄Ρ€ΠΎΠ±Π½Π΅Π΅ ΠΎΠ± отличиях add ΠΈ commit Π² DVC ΠΈ Git рассказываСт докумСнтация DVC.

Π§Ρ‚ΠΎΠ±Ρ‹ Π·Π°Π³Ρ€ΡƒΠ·ΠΈΡ‚ΡŒ Ρ„Π°ΠΉΠ»Ρ‹ ΠΈΠ· кэша Π² ΡƒΠ΄Π°Π»Π΅Π½Π½ΠΎΠ΅ Ρ…Ρ€Π°Π½ΠΈΠ»ΠΈΡ‰Π΅, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌ ΠΊΠΎΠΌΠ°Π½Π΄Ρƒ push:

        dvc push
    

DVC просмотрит всС ΠΏΠ°ΠΏΠΊΠΈ локального рСпозитория Π² поисках dvc-Ρ„Π°ΠΉΠ»ΠΎΠ². Как ΡƒΠΆΠ΅ ΡƒΠΏΠΎΠΌΠΈΠ½Π°Π»ΠΎΡΡŒ, эти Ρ„Π°ΠΉΠ»Ρ‹ ΡΠΎΠΎΠ±Ρ‰Π°ΡŽΡ‚ DVC, ΠΊΠ°ΠΊΠΈΠ΅ Π΄Π°Π½Π½Ρ‹Π΅ Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ ΡΠΊΠΎΠΏΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ, ΠΈ DVC ΠΊΠΎΠΏΠΈΡ€ΡƒΠ΅Ρ‚ ΠΈΡ… ΠΈΠ· кэша Π² ΡƒΠ΄Π°Π»Π΅Π½Π½ΠΎΠ΅ Ρ…Ρ€Π°Π½ΠΈΠ»ΠΈΡ‰Π΅.

Π’Π΅ΠΏΠ΅Ρ€ΡŒ Π΄Π°Π½Π½Ρ‹Π΅ бСзопасно хранятся Π² ΡƒΠ΄Π°Π»Π΅Π½Π½ΠΎΠΌ Ρ€Π΅ΠΏΠΎΠ·ΠΈΡ‚ΠΎΡ€ΠΈΠΈ.
Π’Π΅ΠΏΠ΅Ρ€ΡŒ Π΄Π°Π½Π½Ρ‹Π΅ бСзопасно хранятся Π² ΡƒΠ΄Π°Π»Π΅Π½Π½ΠΎΠΌ Ρ€Π΅ΠΏΠΎΠ·ΠΈΡ‚ΠΎΡ€ΠΈΠΈ.

ΠžΡΡ‚Π°Π»ΠΎΡΡŒ ΠΎΡ‚ΠΏΡ€Π°Π²ΠΈΡ‚ΡŒ Ρ„Π°ΠΉΠ»Ρ‹ ΠΏΠΎΠ΄ ΡƒΠΏΡ€Π°Π²Π»Π΅Π½ΠΈΠ΅ΠΌ Git Π½Π° GitHub:

        git push --set-upstream origin first_experiment
    

GitHub Π½Π΅ Π·Π½Π°Π΅Ρ‚ ΠΎ Π½ΠΎΠ²ΠΎΠΉ Π²Π΅Ρ‚ΠΊΠ΅, ΠΊΠΎΡ‚ΠΎΡ€ΡƒΡŽ ΠΌΡ‹ создали локально, поэтому ΠΏΡ€ΠΈ ΠΏΠ΅Ρ€Π²ΠΎΠΌ push Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ --set-upstream.

Π’Π΅ΠΏΠ΅Ρ€ΡŒ ΠΈ ΠΊΠΎΠ΄, ΠΈ Π΄Π°Π½Π½Ρ‹Π΅ доступны ΡƒΠ΄Π°Π»Π΅Π½Π½ΠΎ.
Π’Π΅ΠΏΠ΅Ρ€ΡŒ ΠΈ ΠΊΠΎΠ΄, ΠΈ Π΄Π°Π½Π½Ρ‹Π΅ доступны ΡƒΠ΄Π°Π»Π΅Π½Π½ΠΎ.

Π‘ΠΊΠ°Ρ‡ΠΈΠ²Π°Π½ΠΈΠ΅ Ρ„Π°ΠΉΠ»ΠΎΠ² с DVC

Π§Ρ‚ΠΎΠ±Ρ‹ ΠΏΠΎΠ½ΡΡ‚ΡŒ, ΠΊΠ°ΠΊ Π·Π°Π³Ρ€ΡƒΠΆΠ°Ρ‚ΡŒ Ρ„Π°ΠΉΠ»Ρ‹, ΡƒΠ΄Π°Π»ΠΈΠΌ рСпозитория Ρ‡Π°ΡΡ‚ΡŒ Ρ„Π°ΠΉΠ»ΠΎΠ² с Π΄Π°Π½Π½Ρ‹ΠΌΠΈ.

Как Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΌΡ‹ Π΄ΠΎΠ±Π°Π²ΠΈΠ»ΠΈ Π΄Π°Π½Π½Ρ‹Π΅ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ dvc add ΠΈ ΠΎΡ‚ΠΏΡ€Π°Π²ΠΈΠ»ΠΈ ΠΈΡ… с dvc push, ΠΎΠ½ΠΈ ΡΠΎΡ…Ρ€Π°Π½ΡΡŽΡ‚ΡΡ Π² Ρ€Π΅Π·Π΅Ρ€Π²Π½ΠΎΠΉ ΠΊΠΎΠΏΠΈΠΈ. Для экономии мСста ΠΌΠΎΠΆΠ½ΠΎ ΡƒΠ΄Π°Π»ΠΈΡ‚ΡŒ фактичСскиС Π΄Π°Π½Π½Ρ‹Π΅. Пока Ρ„Π°ΠΉΠ»Ρ‹ ΠΎΡ‚ΡΠ»Π΅ΠΆΠΈΠ²Π°ΡŽΡ‚ΡΡ DVC ΠΈ dvc-Ρ„Π°ΠΉΠ»Ρ‹ находятся Π² Ρ€Π΅ΠΏΠΎΠ·ΠΈΡ‚ΠΎΡ€ΠΈΠΈ, ΠΌΡ‹ ΠΌΠΎΠΆΠ΅ΠΌ быстро Π²Π΅Ρ€Π½ΡƒΡ‚ΡŒ Π΄Π°Π½Π½Ρ‹Π΅.

НапримСр, ΡƒΠ΄Π°Π»ΠΈΠΌ Ρ†Π΅Π»ΠΈΠΊΠΎΠΌ ΠΏΠ°ΠΏΠΊΡƒ val/:

        rm -rf data/raw/val
    

Папка Π±ΡƒΠ΄Π΅Ρ‚ ΡƒΠ΄Π°Π»Π΅Π½Π° ΠΈΠ· рСпозитория, Π½ΠΎ ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³ ΠΏΠΎ-ΠΏΡ€Π΅ΠΆΠ½Π΅ΠΌΡƒ бСзопасно хранится Π² кэшС ΠΈ ΡƒΠ΄Π°Π»Π΅Π½Π½ΠΎΠΌ Ρ…Ρ€Π°Π½ΠΈΠ»ΠΈΡ‰Π΅. Π§Ρ‚ΠΎΠ±Ρ‹ Π²Π΅Ρ€Π½ΡƒΡ‚ΡŒ Π΄Π°Π½Π½Ρ‹Π΅ ΠΈΠ· кэша, Π²ΠΎΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌΡΡ ΠΊΠΎΠΌΠ°Π½Π΄ΠΎΠΉ dvc checkout:

        dvc checkout data/raw/val.dvc
    

Папка data/raw/val/ восстановлСна. Если Ρ…ΠΎΡ‚ΠΈΡ‚Π΅, Ρ‡Ρ‚ΠΎΠ±Ρ‹ DVC Π²Ρ‹ΠΏΠΎΠ»Π½ΠΈΠ» поиск ΠΏΠΎ всСму Ρ€Π΅ΠΏΠΎΠ·ΠΈΡ‚ΠΎΡ€ΠΈΡŽ ΠΈ ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΈΠ», Ρ‡Π΅Π³ΠΎ Π½Π΅ Ρ…Π²Π°Ρ‚Π°Π΅Ρ‚, достаточно Π·Π°ΠΏΡƒΡΡ‚ΠΈΡ‚ΡŒ dvc checkout Π±Π΅Π· Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹Ρ… Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ΠΎΠ².

Команда fetch Π·Π°Π³Ρ€ΡƒΠΆΠ°Π΅Ρ‚ содСрТимоС ΡƒΠ΄Π°Π»Π΅Π½Π½ΠΎΠ³ΠΎ Ρ…Ρ€Π°Π½ΠΈΠ»ΠΈΡ‰Π° Π² кэш:

        dvc fetch data/raw/val.dvc
    

Как Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Π΄Π°Π½Π½Ρ‹Π΅ окаТутся Π² кэшС, ΠΏΡ€ΠΎΠ²Π΅Ρ€ΡŒΡ‚Π΅ ΠΈΡ… Π² Ρ€Π΅ΠΏΠΎΠ·ΠΈΡ‚ΠΎΡ€ΠΈΠΈ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ dvc checkout. Π•Ρ‰Π΅ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ ΠΎΠ΄Π½ΠΎΠΉ ΠΊΠΎΠΌΠ°Π½Π΄Ρ‹ dvc pull ΠΌΠΎΠΆΠ½ΠΎ Π²Ρ‹ΠΏΠΎΠ»Π½ΠΈΡ‚ΡŒ вмСстС fetch ΠΈ checkout. Π­Ρ‚Π° ΠΊΠΎΠΌΠ°Π½Π΄Π° ΠΊΠΎΠΏΠΈΡ€ΡƒΠ΅Ρ‚ Π΄Π°Π½Π½Ρ‹Π΅ с ΡƒΠ΄Π°Π»Π΅Π½Π½ΠΎΠ³ΠΎ Ρ…Ρ€Π°Π½ΠΈΠ»ΠΈΡ‰Π° Π² кэш ΠΈ Π² Ρ€Π΅ΠΏΠΎΠ·ΠΈΡ‚ΠΎΡ€ΠΈΠΉ Π·Π° ΠΎΠ΄ΠΈΠ½ ΠΏΡ€ΠΎΡ…ΠΎΠ΄. ДСйствия ΠΊΠΎΠΌΠ°Π½Π΄ Π°Π½Π°Π»ΠΎΠ³ΠΈΡ‡Π½Ρ‹ ΠΎΠ΄Π½ΠΎΠΈΠΌΠ΅Π½Π½Ρ‹ΠΌ ΠΊΠΎΠΌΠ°Π½Π΄Π°ΠΌ Git.

πŸ’½ Git для Data Science: ΠΊΠΎΠ½Ρ‚Ρ€ΠΎΠ»ΡŒ вСрсий ΠΌΠΎΠ΄Π΅Π»Π΅ΠΉ ΠΈ датасСтов с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ DVC

Π˜ΠΌΠ΅ΠΉΡ‚Π΅ Π² Π²ΠΈΠ΄Ρƒ, Ρ‡Ρ‚ΠΎ сначала Π½ΡƒΠΆΠ½ΠΎ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ dvc-Ρ„Π°ΠΉΠ»Ρ‹ ΠΈΠ· Git, ΠΈ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΏΠΎΡ‚ΠΎΠΌ Π²Ρ‹Π·Ρ‹Π²Π°Ρ‚ΡŒ ΠΊΠΎΠΌΠ°Π½Π΄Ρ‹ DVC. Если dvc-Ρ„Π°ΠΉΠ»ΠΎΠ² Π½Π΅Ρ‚ Π² Ρ€Π΅ΠΏΠΎΠ·ΠΈΡ‚ΠΎΡ€ΠΈΠΈ, DVC просто Π½Π΅ Π·Π½Π°Π΅Ρ‚, ΠΊΠ°ΠΊΠΈΠ΅ Π΄Π°Π½Π½Ρ‹Π΅ Π½ΡƒΠΆΠ½ΠΎ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ.

Π˜Ρ‚Π°ΠΊ, ΠΌΡ‹ рассмотрСли Π±Π°Π·ΠΎΠ²Ρ‹ΠΉ Ρ€Π°Π±ΠΎΡ‡ΠΈΠΉ процСсс взаимодСйствия DVC ΠΈ Git. Всякий Ρ€Π°Π·, ΠΊΠΎΠ³Π΄Π° ΠΌΡ‹ добавляСм Π΄Π°Π½Π½Ρ‹Π΅ ΠΈΠ»ΠΈ измСняСм ΠΊΠΎΠ΄, Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ Π·Π°ΠΏΡƒΡΠΊΠ°Ρ‚ΡŒ ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΠ΅ ΠΊΠΎΠΌΠ°Π½Π΄Ρ‹ add, commit, push, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΡΠΎΡ…Ρ€Π°Π½ΠΈΡ‚ΡŒ Ρ‚Π΅ΠΊΡƒΡ‰ΡƒΡŽ Π²Π΅Ρ€ΡΠΈΡŽ.

ΠžΡΡ‚Π°Π»ΡŒΠ½Π°Ρ Ρ‡Π°ΡΡ‚ΡŒ этого руководства посвящСна ΠΊΠΎΠ½ΠΊΡ€Π΅Ρ‚Π½Ρ‹ΠΌ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π°ΠΌ использования DVC для машинного обучСния ΠΈ Data Science.

ΠŸΠΎΡΡ‚Ρ€ΠΎΠ΅Π½ΠΈΠ΅ ΠΌΠΎΠ΄Π΅Π»ΠΈ машинного обучСния

Π˜ΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡ Π½Π°Π±ΠΎΡ€ Π΄Π°Π½Π½Ρ‹Ρ… Imagenette, ΠΌΡ‹ Π½Π°ΡƒΡ‡ΠΈΠΌ модСль Ρ€Π°Π·Π»ΠΈΡ‡Π°Ρ‚ΡŒ изобраТСния мячСй для Π³ΠΎΠ»ΡŒΡ„Π° ΠΈ ΠΏΠ°Ρ€Π°ΡˆΡŽΡ‚ΠΎΠ². Для этого ΠΌΡ‹ Π²Ρ‹ΠΏΠΎΠ»Π½ΠΈΠΌ Ρ‚Ρ€ΠΈ шага:

  1. ΠŸΠΎΠ΄Π³ΠΎΡ‚ΠΎΠ²ΠΈΠΌ Π΄Π°Π½Π½Ρ‹Π΅ для обучСния.
  2. ΠžΠ±ΡƒΡ‡ΠΈΠΌ модСль машинного обучСния.
  3. ΠžΡ†Π΅Π½ΠΈΠΌ качСство ΠΌΠΎΠ΄Π΅Π»ΠΈ.

Π­Ρ‚ΠΈ шаги ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‚ Ρ‚Ρ€Π΅ΠΌ Ρ„Π°ΠΉΠ»Π°ΠΌ Python Π² ΠΏΠ°ΠΏΠΊΠ΅ src/:

  1. prepare.py
  2. train.py
  3. evaluate.py

Π’ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΡ… ΠΏΠΎΠ΄Ρ€Π°Π·Π΄Π΅Π»Π°Ρ… ΠΌΡ‹ рассмотрим, Ρ‡Ρ‚ΠΎ Π΄Π΅Π»Π°Π΅Ρ‚ ΠΊΠ°ΠΆΠ΄Ρ‹ΠΉ ΠΈΠ· Ρ„Π°ΠΉΠ»ΠΎΠ².

ΠŸΠΎΠ΄Π³ΠΎΡ‚ΠΎΠ²ΠΊΠ° Π΄Π°Π½Π½Ρ‹Ρ…

Π”Π°Π½Π½Ρ‹Π΅ хранятся Π² Π½Π΅ΡΠΊΠΎΠ»ΡŒΠΊΠΈΡ… ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³Π°Ρ…. Π§Ρ‚ΠΎΠ±Ρ‹ ΡƒΠΏΡ€ΠΎΡΡ‚ΠΈΡ‚ΡŒ использованиС Π΄Π°Π½Π½Ρ‹Ρ…, ΠΌΡ‹ создадим csv-Ρ„Π°ΠΉΠ», содСрТащий список ΠΈΠ·ΠΎΠ±Ρ€Π°ΠΆΠ΅Π½ΠΈΠΉ ΠΈ ΠΈΡ… ΠΌΠ΅Ρ‚ΠΎΠΊ. CSV-Ρ„Π°ΠΉΠ» Π±ΡƒΠ΄Π΅Ρ‚ ΡΠΎΠ΄Π΅Ρ€ΠΆΠ°Ρ‚ΡŒ Π΄Π²Π° столбца: столбСц filename, содСрТащий ΠΏΠΎΠ»Π½Ρ‹ΠΉ ΠΏΡƒΡ‚ΡŒ Ρ„Π°ΠΉΠ»Π° ΠΊΠΎΠ½ΠΊΡ€Π΅Ρ‚Π½ΠΎΠ³ΠΎ изобраТСния, ΠΈ столбСц label, содСрТащий строку ΠΌΠ΅Ρ‚ΠΊΠΈ, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€ "golf ball" ΠΈΠ»ΠΈ "parachute". КаТдая строка Π² csv Ρ„Π°ΠΉΠ»Π΅ соотвСтствуСт ΠΎΠ΄Π½ΠΎΠΌΡƒ ΠΈΠ·ΠΎΠ±Ρ€Π°ΠΆΠ΅Π½ΠΈΡŽ.

        filename, label
full/path/to/data-version-control/raw/n03445777/n03445777_5768.JPEG,golf ball
full/path/to/data-version-control/raw/n03445777/n03445777_5768,golf ball
full/path/to/data-version-control/raw/n03445777/n03445777_11967.JPEG,golf ball
...
    

Π”Π°Π»Π΅Π΅ понадобится Π΄Π²Π° CSV-Ρ„Π°ΠΉΠ»Π°:

  1. train.csv со списком ΠΈΠ·ΠΎΠ±Ρ€Π°ΠΆΠ΅Π½ΠΈΠΉ для обучСния.
  2. test.csv со списком ΠΈΠ·ΠΎΠ±Ρ€Π°ΠΆΠ΅Π½ΠΈΠΉ для тСстирования.

ΠœΡ‹ ΠΌΠΎΠΆΠ΅ΠΌ ΡΠΎΠ·Π΄Π°Ρ‚ΡŒ CSV-Ρ„Π°ΠΉΠ»Ρ‹, запустив ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡƒ prepare.py, которая сопоставляСт ΠΈΠΌΠ΅Π½Π° ΠΏΠ°ΠΏΠΎΠΊ ΠΈ ΠΌΠ΅Ρ‚ΠΊΠΈ ΠΈ сохраняСт ΠΏΠ°Ρ€Ρ‹ список-ΠΌΠ΅Ρ‚ΠΊΠ° Π² Π²ΠΈΠ΄Π΅ CSV-Ρ„Π°ΠΉΠ»Π°. Π’ΠΎΡ‚ исходный ΠΊΠΎΠ΄ этой ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹:

prepare.py
        from pathlib import Path

import pandas as pd

# ΠΈΠΌΠ΅Π½Π° ΠΏΠ°ΠΏΠΎΠΊ, содСрТащиС изобраТСния мячСй для Π³ΠΎΠ»ΡŒΡ„Π° ΠΈ ΠΏΠ°Ρ€Π°ΡˆΡŽΡ‚ΠΎΠ²,
# сопоставлСны с ΠΌΠ΅Ρ‚ΠΊΠ°ΠΌΠΈ "golf ball" ΠΈ "parachute"
FOLDERS_TO_LABELS = {
    "n03445777": "golf ball",
    "n03888257": "parachute"
    }

def get_files_and_labels(source_path):
    """ΠŸΡ€ΠΈΠ½ΠΈΠΌΠ°Π΅Ρ‚ ΠΏΡƒΡ‚ΡŒ, ΡƒΠΊΠ°Π·Ρ‹Π²Π°ΡŽΡ‰ΠΈΠΉ Π½Π° ΠΏΠ°ΠΏΠΊΡƒ `data/raw/`.
    Ѐункция ΠΏΠ΅Ρ€Π΅Π±ΠΈΡ€Π°Π΅Ρ‚ всС ΠΏΠ°ΠΏΠΊΠΈ ΠΈ ΠΏΠΎΠ΄ΠΏΠ°ΠΏΠΊΠΈ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ Π½Π°ΠΉΡ‚ΠΈ Ρ„Π°ΠΉΠ»Ρ‹
    с Ρ€Π°ΡΡˆΠΈΡ€Π΅Π½ΠΈΠ΅ΠΌ jpeg. ΠœΠ΅Ρ‚ΠΊΠΈ ΠΏΡ€ΠΈΡΠ²Π°ΠΈΠ²Π°ΡŽΡ‚ΡΡ Ρ‚Π΅ΠΌ Ρ„Π°ΠΉΠ»Π°ΠΌ, ΠΏΠ°ΠΏΠΊΠΈ
    ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… прСдставлСны Π² Π²ΠΈΠ΄Π΅ ΠΊΠ»ΡŽΡ‡Π΅ΠΉ Π² FOLDERS_TO_LABELS.
    ИмСна Ρ„Π°ΠΉΠ»ΠΎΠ² ΠΈ ΠΌΠ΅Ρ‚ΠΊΠΈ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°ΡŽΡ‚ΡΡ Π² Π²ΠΈΠ΄Π΅ списков."""
    images = []
    labels = []
    for image_path in source_path.rglob("*/*.JPEG"):
        filename = image_path.absolute()
        folder = image_path.parent.name
        if folder in FOLDERS_TO_LABELS:
            images.append(filename)
            label = FOLDERS_TO_LABELS[folder]
            labels.append(label)
    return images, labels

def save_as_csv(filenames, labels, destination):
    """ΠŸΡ€ΠΈΠ½ΠΈΠΌΠ°Π΅Ρ‚ список Ρ„Π°ΠΉΠ»ΠΎΠ², список ΠΌΠ΅Ρ‚ΠΎΠΊ ΠΈ ΠΏΡƒΡ‚ΡŒ назначСния.
    ИмСна Ρ„Π°ΠΉΠ»ΠΎΠ² ΠΈ ΠΌΠ΅Ρ‚ΠΊΠΈ Ρ„ΠΎΡ€ΠΌΠ°Ρ‚ΠΈΡ€ΡƒΡŽΡ‚ΡΡ ΠΊΠ°ΠΊ Π΄Π°Ρ‚Π°Ρ„Ρ€Π΅ΠΉΠΌ pandas
    ΠΈ ΡΠΎΡ…Ρ€Π°Π½ΡΡŽΡ‚ΡΡ Π² Π²ΠΈΠ΄Π΅ csv-Ρ„Π°ΠΉΠ»Π°."""
    data_dictionary = {"filename": filenames, "label": labels}
    data_frame = pd.DataFrame(data_dictionary)
    data_frame.to_csv(destination)

def main(repo_path):
    """ЗапускаСт get_files_and_labels(), Ρ‡Ρ‚ΠΎΠ±Ρ‹ Π½Π°ΠΉΡ‚ΠΈ
    всС изобраТСния Π² ΠΏΠ°ΠΏΠΊΠ°Ρ… data/raw/train/ ΠΈ data/raw/val/.
    ИмСна Ρ„Π°ΠΉΠ»ΠΎΠ² ΠΈ ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΠ΅ ΠΈΠΌ ΠΌΠ΅Ρ‚ΠΊΠΈ ΡΠΎΡ…Ρ€Π°Π½ΡΡŽΡ‚ΡΡ
    ΠΊΠ°ΠΊ Π΄Π²Π° csv-Ρ„Π°ΠΉΠ»Π° Π² ΠΏΠ°ΠΏΠΊΠ΅ data/prepare/: train.csv
    ΠΈ test.csv."""
    data_path = repo_path / "data"
    train_path = data_path / "raw/train"
    test_path = data_path / "raw/val"
    train_files, train_labels = get_files_and_labels(train_path)
    test_files, test_labels = get_files_and_labels(test_path)
    prepared = data_path / "prepared"
    save_as_csv(train_files, train_labels, prepared / "train.csv")
    save_as_csv(test_files, test_labels, prepared / "test.csv")

if __name__ == "__main__":
    repo_path = Path(__file__).parent.parent
    main(repo_path)
    

Запустим скрипт prepare.py Π² ΠΊΠΎΠΌΠ°Π½Π΄Π½ΠΎΠΉ строкС:

        python src/prepare.py
    

Когда скрипт Π·Π°ΠΊΠΎΠ½Ρ‡ΠΈΡ‚ Ρ€Π°Π±ΠΎΡ‚Ρƒ, Π² ΠΏΠ°ΠΏΠΊΠ΅ data/prepare/ появятся Ρ„Π°ΠΉΠ»Ρ‹ train.csv ΠΈ test.csv. НуТно Π΄ΠΎΠ±Π°Π²ΠΈΡ‚ΡŒ ΠΈΡ… Π² DVC, Π° ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΠ΅ dvc-Ρ„Π°ΠΉΠ»Ρ‹ Π² GitHub:

        dvc add data/prepared/train.csv data/prepared/test.csv
git add --all
git commit -m "Created train and test CSV files"
    

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

ΠžΠ±ΡƒΡ‡Π΅Π½ΠΈΠ΅ ΠΌΠΎΠ΄Π΅Π»ΠΈ машинного обучСния

Для обучСния ΠΌΠΎΠ΄Π΅Π»ΠΈ ΠΌΡ‹ Π±ΡƒΠ΄Π΅ΠΌ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ ΠΎΠ΄ΠΈΠ½ ΠΈΠ· ΠΏΡ€ΠΎΡΡ‚Π΅ΠΉΡˆΠΈΡ… Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌΠΎΠ² обучСния с ΡƒΡ‡ΠΈΡ‚Π΅Π»Π΅ΠΌ – стохастичСский Π³Ρ€Π°Π΄ΠΈΠ΅Π½Ρ‚Π½Ρ‹ΠΉ спуск. Π˜ΡΡ…ΠΎΠ΄Π½Ρ‹ΠΉ ΠΊΠΎΠ΄, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΌΡ‹ Π±ΡƒΠ΄Π΅ΠΌ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Π½Π° этапС обучСния:

train.py
        from joblib import dump
from pathlib import Path

import numpy as np
import pandas as pd
from skimage.io import imread_collection
from skimage.transform import resize
from sklearn.linear_model import SGDClassifier

def load_images(data_frame, column_name):
    filelist = data_frame[column_name].to_list()
    image_list = imread_collection(filelist)
    return image_list

def load_labels(data_frame, column_name):
    label_list = data_frame[column_name].to_list()
    return label_list

def preprocess(image):
    resized = resize(image, (100, 100, 3))
    reshaped = resized.reshape((1, 30000))
    return reshape

def load_data(data_path):
    df = pd.read_csv(data_path)
    labels = load_labels(data_frame=df, column_name="label")
    raw_images = load_images(data_frame=df, column_name="filename")
    processed_images = [preprocess(image) for image in raw_images]
    data = np.concatenate(processed_images, axis=0)
    return data, labels

def main(repo_path):
    train_csv_path = repo_path / "data/prepared/train.csv"
    train_data, labels = load_data(train_csv_path)
    sgd = SGDClassifier(max_iter=10)
    trained_model = sgd.fit(train_data, labels)
    dump(trained_model, repo_path / "model/model.joblib")

if __name__ == "__main__":
    repo_path = Path(__file__).parent.parent
    main(repo_path)
    

Запустим скрипт train.py:

        python src/train.py
    

Π’Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ ΠΊΠΎΠ΄Π° ΠΌΠΎΠΆΠ΅Ρ‚ Π·Π°Π½ΡΡ‚ΡŒ нСсколько ΠΌΠΈΠ½ΡƒΡ‚, Π² зависимости ΠΎΡ‚ мощности вашСго ΠΊΠΎΠΌΠΏΡŒΡŽΡ‚Π΅Ρ€Π°. ΠŸΡ€ΠΈ Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠΈ ΠΊΠΎΠ΄Π° Π²Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ ΠΏΡ€Π΅Π΄ΡƒΠΏΡ€Π΅ΠΆΠ΄Π΅Π½ΠΈΠ΅ :

ConvergenceWarning: Maximum number of iteration reached before convergence. Consider increasing max_iter to improve the fit.

Π’ этом ΠΏΡ€Π΅Π΄ΡƒΠΏΡ€Π΅ΠΆΠ΄Π΅Π½ΠΈΠΈ scikit-learn ΡƒΠΊΠ°Π·Ρ‹Π²Π°Π΅Ρ‚, Ρ‡Ρ‚ΠΎ ΠΌΡ‹ ΠΌΠΎΠΆΠ΅ΠΌ ΡƒΠ²Π΅Π»ΠΈΡ‡ΠΈΡ‚ΡŒ max_iter ΠΈ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ Π»ΡƒΡ‡ΡˆΠΈΠ΅ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Ρ‹. ΠœΡ‹ Ρ‚Π°ΠΊ ΠΈ сдСлаСм Π² ΠΎΠ΄Π½ΠΎΠΌ ΠΈΠ· ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΡ… Ρ€Π°Π·Π΄Π΅Π»ΠΎΠ².

Когда скрипт Π·Π°Π²Π΅Ρ€ΡˆΠΈΡ‚ΡΡ, Ρƒ нас Π±ΡƒΠ΄Π΅Ρ‚ обучСнная модСль машинного обучСния, сохранСнная Π² ΠΏΠ°ΠΏΠΊΠ΅ model/ с ΠΈΠΌΠ΅Π½Π΅ΠΌ model.joblib. Π­Ρ‚ΠΎ самый Π²Π°ΠΆΠ½Ρ‹ΠΉ Ρ„Π°ΠΉΠ» экспСримСнта. Π•Π³ΠΎ Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ Π΄ΠΎΠ±Π°Π²ΠΈΡ‚ΡŒ Π² DVC с привязкой ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰Π΅Π³ΠΎ Ρ„Π°ΠΉΠ»Π° dvc ΠΊ GitHub:

        dvc add model/model.joblib
git add --all
git commit -m "Trained an SGD classifier"
    

ΠœΡ‹ ΠΎΠ±ΡƒΡ‡ΠΈΠ»ΠΈ модСль машинного обучСния Ρ€Π°Π·Π»ΠΈΡ‡Π°Ρ‚ΡŒ Π΄Π²Π° класса ΠΈΠ·ΠΎΠ±Ρ€Π°ΠΆΠ΅Π½ΠΈΠΉ. Π‘Π»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΉ шаг – ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΠΈΡ‚ΡŒ, насколько Ρ‚ΠΎΡ‡Π½ΠΎ модСль Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚ Π½Π° тСстовых изобраТСниях, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ модСль Π½Π΅ Π²ΠΈΠ΄Π΅Π»Π° Π²ΠΎ врСмя обучСния.

ΠžΡ†Π΅Π½ΠΊΠ° ΠΌΠΎΠ΄Π΅Π»ΠΈ машинного обучСния

ΠŸΡ€ΠΎΠ²Π΅Ρ€ΠΊΠ° Ρ€Π°Π±ΠΎΡ‚Ρ‹ ΠΌΠΎΠ΄Π΅Π»ΠΈ слуТит своСго Ρ€ΠΎΠ΄Π° Π½Π°Π³Ρ€Π°Π΄ΠΎΠΉ – ΠΌΡ‹ Π²ΠΈΠ΄ΠΈΠΌ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ усилий. Π’ΠΎΡ‚ исходный ΠΊΠΎΠ΄, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ Π½Π° этапС ΠΎΡ†Π΅Π½ΠΊΠΈ:

evaluate.py
        from joblib import load
import json
from pathlib import Path

from sklearn.metrics import accuracy_score

from train import load_data

def main(repo_path):
    test_csv_path = repo_path / "data/prepared/test.csv"
    test_data, labels = load_data(test_csv_path)
    model = load(repo_path / "model/model.joblib")
    predictions = model.predict(test_data)
    accuracy = accuracy_score(labels, predictions)
    metrics = {"accuracy": accuracy}
    accuracy_path = repo_path / "metrics/accuracy.json"
    accuracy_path.write_text(json.dumps(metrics))

if __name__ == "__main__":
    repo_path = Path(__file__).parent.parent
    main(repo_path)
    

Запустиим evaluate.py:

        python src/evaluate.py
    

ΠžΡ†Π΅Π½ΠΊΠ° Π±ΡƒΠ΄Π΅Ρ‚ сохранСна Π² Ρ„Π°ΠΉΠ»Π΅ metics/accuracy.json. Π€Π°ΠΉΠ» сСйчас содСрТит Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΎΠ΄ΠΈΠ½ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚, Ρ‚ΠΎΡ‡Π½ΠΎΡΡ‚ΡŒ (accuracy) ΠΌΠΎΠ΄Π΅Π»ΠΈ, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€:

        {"accuracy": 0.7186311787072244}
    

Π€Π°ΠΉΠ» нСбольшой, ΠΈ Π΅Π³ΠΎ ΠΏΠΎΠ»Π΅Π·Π½ΠΎ Ρ…Ρ€Π°Π½ΠΈΡ‚ΡŒ Π½Π° GitHub, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΌΠΎΠΆΠ½ΠΎ Π±Ρ‹Π»ΠΎ быстро ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΈΡ‚ΡŒ, насколько Ρ…ΠΎΡ€ΠΎΡˆΠΎ выполняСтся ΠΊΠ°ΠΆΠ΄Ρ‹ΠΉ экспСримСнт:

        git add --all
git commit -m "Evaluate the SGD model accuracy"
    

ВСрсии датасСтов ΠΈ ΠΌΠΎΠ΄Π΅Π»Π΅ΠΉ Π² DVC

ΠšΠ°ΠΆΠ΄Ρ‹ΠΉ Ρ€Π°Π·, ΠΊΠΎΠ³Π΄Π° ΠΌΡ‹ запускаСм экспСримСнт, ΠΌΡ‹ Ρ…ΠΎΡ‚ΠΈΠΌ Ρ‚ΠΎΡ‡Π½ΠΎ Π·Π½Π°Ρ‚ΡŒ, Ρ‡Ρ‚ΠΎ Π±Ρ‹Π»ΠΎ Π½Π° Π²Ρ…ΠΎΠ΄Π΅, ΠΈ Ρ‡Ρ‚ΠΎ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΠ»ΠΎΡΡŒ Π½Π° Π²Ρ‹Ρ…ΠΎΠ΄Π΅. Π’ этом Ρ€Π°Π·Π΄Π΅Π»Π΅ ΠΌΡ‹ познакомимся с ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΠΌ Ρ€Π°Π±ΠΎΡ‡ΠΈΠΌ процСссом для контроля вСрсий Π² Π½Π°ΡˆΠΈΡ… экспСримСнтах.

Π‘Π½Π°Ρ‡Π°Π»Π° ΠΎΡ‚ΠΏΡ€Π°Π²ΠΈΠΌ всС измСнСния, внСсСнныС Π² Π²Π΅Ρ‚ΠΊΡƒ first_experiment, Π² ΡƒΠ΄Π°Π»Π΅Π½Π½Ρ‹Π΅ Ρ…Ρ€Π°Π½ΠΈΠ»ΠΈΡ‰Π° GitHub ΠΈ DVC:

        git push
dvc push
    

ΠžΠ±ΡƒΡ‡Π΅Π½ΠΈΠ΅ ΠΌΠΎΠ΄Π΅Π»ΠΈ ΠΈ Π·Π°Π²Π΅Ρ€ΡˆΠ΅Π½ΠΈΠ΅ экспСримСнта – Π²Π΅Ρ…Π° для ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π°. ΠœΡ‹ Π΄ΠΎΠ»ΠΆΠ½Ρ‹ Π½Π°ΡƒΡ‡ΠΈΡ‚ΡŒΡΡ ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΈΠ²Π½ΠΎ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Ρ‚ΡŒΡΡ ΠΊ Ρ‚Π°ΠΊΠΈΠΌ Ρ‚ΠΎΡ‡ΠΊΠ°ΠΌ.

Π”ΠΎΠ±Π°Π²Π»Π΅Π½ΠΈΠ΅ Ρ‚Π΅Π³ΠΎΠ² ΠΊ ΠΊΠΎΠΌΠΌΠΈΡ‚Π°ΠΌ

ΠŸΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ ΠΌΡ‹ Π·Π°Π²Π΅Ρ€ΡˆΠΈΠ»ΠΈ экспСримСнт ΠΈ создали Π½ΠΎΠ²ΡƒΡŽ модСль, создадим Ρ‚Π΅Π³, ΠΎΠΏΠΈΡΡ‹Π²Π°ΡŽΡ‰ΠΈΠΉ Π³ΠΎΡ‚ΠΎΠ²ΡƒΡŽ модСль:

        git tag -a sgd-classifier -m "SGDClassifier with accuracy 71.86%"
    

ΠšΠ»ΡŽΡ‡ -a ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ для аннотирования Ρ‚Π΅Π³Π°. НСкоторыС ΠΊΠΎΠΌΠ°Π½Π΄Ρ‹ вводят Π½ΠΎΠΌΠ΅Ρ€Π° вСрсий, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, v1.0, v1.3. Π”Ρ€ΡƒΠ³ΠΈΠ΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‚ Π΄Π°Ρ‚Ρ‹ ΠΈ ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»Ρ‹ Ρ‡Π»Π΅Π½Π° ΠΊΠΎΠΌΠ°Π½Π΄Ρ‹, ΠΎΠ±ΡƒΡ‡Π°Π²ΡˆΠ΅Π³ΠΎ модСль. ΠšΠ»ΡŽΡ‡ -m позволяСт Π΄ΠΎΠ±Π°Π²ΠΈΡ‚ΡŒ Π² Ρ‚Π΅Π³ строку сообщСния.

Π˜ΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌ ΠΏΠ΅Ρ€Π΅ΠΊΠ»ΡŽΡ‡Π°Ρ‚Π΅Π»ΡŒ --tags, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‚ΡŒ Ρ‚Π΅Π³ΠΈ ΠΈΠ· локального рСпозитория Π² ΡƒΠ΄Π°Π»Π΅Π½Π½Ρ‹ΠΉ:

        git push origin --tags
    

Π’ GitHub Ρ‚Π΅Π³ΠΈ доступны Π½Π° Π²ΠΊΠ»Π°Π΄ΠΊΠ΅ рСпозитория Releases.

Π’Π΅Π³ΠΈ Ρ‚Π΅ΠΊΡƒΡ‰Π΅Π³ΠΎ рСпозитория ΠΌΠΎΠΆΠ½ΠΎ ΠΏΠΎΡΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ Ρ‚Π°ΠΊ:

        git tag
    

Π Π°Π±ΠΎΡ‡ΠΈΠ΅ процСссы DVC Π² Π·Π½Π°Ρ‡ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΠΉ стСпСни зависят ΠΎΡ‚ эффСктивных ΠΏΡ€Π°ΠΊΡ‚ΠΈΠΊ Git. Π•Ρ‰Π΅ ΠΎΠ΄ΠΈΠ½ способ ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ Ρ€Π°Π±ΠΎΡ‡ΠΈΠΉ процСсс Π±ΠΎΠ»Π΅Π΅ упорядочСнным ΠΈ ΠΏΡ€ΠΎΠ·Ρ€Π°Ρ‡Π½Ρ‹ΠΌ – ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Π²Π΅Ρ‚Π²Π»Π΅Π½ΠΈΠ΅.

Π‘ΠΎΠ·Π΄Π°Π½ΠΈΠ΅ ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½Ρ‹Ρ… Π²Π΅Ρ‚ΠΎΠΊ Git для ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ экспСримСнта

Пока Ρ‡Ρ‚ΠΎ ΠΌΡ‹ Π΄Π΅Π»Π°Π»ΠΈ всю Ρ€Π°Π±ΠΎΡ‚Ρƒ Π² Π²Π΅Ρ‚ΠΊΠ΅ first_experiment. Π‘Π»ΠΎΠΆΠ½Ρ‹Π΅ Π·Π°Π΄Π°Ρ‡ΠΈ ΠΈ долгосрочныС ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Ρ‹ Ρ‚Ρ€Π΅Π±ΡƒΡŽΡ‚ провСдСния мноТСства экспСримСнтов. Π₯ΠΎΡ€ΠΎΡˆΠ°Ρ ΠΏΡ€Π°ΠΊΡ‚ΠΈΠΊΠ° – ΡΠΎΠ·Π΄Π°Π²Π°Ρ‚ΡŒ для ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ экспСримСнта ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½ΡƒΡŽ Π²Π΅Ρ‚ΠΊΡƒ.

Π’ ΠΏΠ΅Ρ€Π²ΠΎΠΌ экспСримСнтС ΠΌΡ‹ установили максимальноС количСство ΠΈΡ‚Π΅Ρ€Π°Ρ†ΠΈΠΉ ΠΌΠΎΠ΄Π΅Π»ΠΈ Ρ€Π°Π²Π½Ρ‹ΠΌ 10. ΠœΡ‹ ΠΌΠΎΠΆΠ΅ΠΌ ΠΏΠΎΠΏΡ€ΠΎΠ±ΠΎΠ²Π°Ρ‚ΡŒ ΡƒΠ²Π΅Π»ΠΈΡ‡ΠΈΡ‚ΡŒ это число, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΡƒΠ²ΠΈΠ΄Π΅Ρ‚ΡŒ, ΡƒΠ»ΡƒΡ‡ΡˆΠΈΡ‚ Π»ΠΈ это Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚.

        git checkout -b "sgd-100-iterations"
    

Когда ΠΌΡ‹ создаСм Π½ΠΎΠ²ΡƒΡŽ Π²Π΅Ρ‚ΠΊΡƒ, всС dvc-Ρ„Π°ΠΉΠ»Ρ‹, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π±Ρ‹Π»ΠΈ Π² ΠΏΡ€Π΅Π΄Ρ‹Π΄ΡƒΡ‰Π΅ΠΉ Π²Π΅Ρ‚ΠΊΠ΅, Π±ΡƒΠ΄ΡƒΡ‚ ΠΏΡ€ΠΈΡΡƒΡ‚ΡΡ‚Π²ΠΎΠ²Π°Ρ‚ΡŒ Π² Π½ΠΎΠ²ΠΎΠΉ Π²Π΅Ρ‚ΠΊΠ΅, ΠΊΠ°ΠΊ ΠΈ Π΄Ρ€ΡƒΠ³ΠΈΠ΅ Ρ„Π°ΠΉΠ»Ρ‹ ΠΈ ΠΏΠ°ΠΏΠΊΠΈ.

Обновим ΠΊΠΎΠ΄ Π² train.py Ρ‚Π°ΠΊ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ модСль SGDClassifier Π·Π°ΠΏΡƒΡΠΊΠ°Π»Π°ΡΡŒ с ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΎΠΌ max_iter = 100.

train.py
        def main(repo_path):
    train_csv_path = repo_path / "data/prepared/train.csv"
    train_data, labels = load_data(train_csv_path)
    sgd = SGDClassifier(max_iter=100) # <-- ΠΎΠ±Π½ΠΎΠ²ΠΈΠΌ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅
    trained_model = sgd.fit(train_data, labels)
    dump(trained_model, repo_path / "model/model.joblib")
    

Π­Ρ‚ΠΎ СдинствСнноС ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠ΅, ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ΅ Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ. ΠŸΠΎΠ²Ρ‚ΠΎΡ€ΠΈΠΌ ΠΎΠ±ΡƒΡ‡Π΅Π½ΠΈΠ΅ ΠΈ ΠΎΡ†Π΅Π½ΠΊΡƒ, запустив train.py ΠΈ evaluate.py:

        python src/train.py
python src/evaluate.py
    

ΠŸΡ€ΠΈ этом обновятся Ρ„Π°ΠΉΠ»Ρ‹ model.joblib ΠΈ precision.json. Π—Π°Ρ„ΠΈΠΊΡΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Ρ‹ Π² кэшС DVC:

        dvc commit
    

DVC Π²Ρ‹Π²Π΅Π΄Π΅Ρ‚ вопрос, Π΄Π΅ΠΉΡΡ‚Π²ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ Π»ΠΈ ΠΌΡ‹ Ρ…ΠΎΡ‚ΠΈΠΌ внСсти измСнСния, ΠΎΡ‚Π²Π΅Ρ‡Π°Π΅ΠΌ y.

Помним, Ρ‡Ρ‚ΠΎ dvc commit Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚ ΠΈΠ½Π°Ρ‡Π΅, Ρ‡Π΅ΠΌ git commit, ΠΈ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ для обновлСния ΡƒΠΆΠ΅ отслСТиваСмого Ρ„Π°ΠΉΠ»Π°. Π­Ρ‚ΠΎ Π½Π΅ ΡƒΠ΄Π°Π»ΠΈΡ‚ ΠΏΡ€Π΅Π΄Ρ‹Π΄ΡƒΡ‰ΡƒΡŽ модСль, Π° создаст Π½ΠΎΠ²ΡƒΡŽ.

Π”ΠΎΠ±Π°Π²ΠΈΠΌ ΠΈ зафиксируСм внСсСнныС измСнСния Π² Git:

        git add --all
git commit -m "Change SGD max_iter to 100"
    

Π”ΠΎΠ±Π°Π²ΠΈΠΌ Ρ‚Π΅Π³:

        git tag -a sgd-100-iter -m "Trained an SGD Classifier for 100 iterations"
git push origin --tags

    

ΠžΡ‚ΠΏΡ€Π°Π²ΠΈΠΌ измСнСния Π½Π° GitHub ΠΈ Π² ΡƒΠ΄Π°Π»Π΅Π½Π½ΠΎΠ΅ Ρ…Ρ€Π°Π½ΠΈΠ»ΠΈΡ‰Π΅ DVC:

        git push --set-upstream origin sgd-100-iter
dvc push
    

Π’Π΅ΠΏΠ΅Ρ€ΡŒ ΠΌΠΎΠΆΠ½ΠΎ ΠΏΠ΅Ρ€Π΅ΠΊΠ»ΡŽΡ‡Π°Ρ‚ΡŒΡΡ ΠΌΠ΅ΠΆΠ΄Ρƒ Π²Π΅Ρ‚ΠΊΠ°ΠΌΠΈ Git ΠΈ DVC.

        git checkout first_experiment
dvc checkout
    

Π Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Ρ‹ Π½Π°ΡˆΠΈΡ… экспСримСнтов прСдставлСны Π² Π²ΠΈΠ΄Π΅ Ρ€Π°Π·Π½Ρ‹Ρ… вСрсий ΠΊΠΎΠ΄Π° ΠΈ ΠΌΠΎΠ΄Π΅Π»Π΅ΠΉ, ΠΊ ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΌ ΠΌΡ‹ быстро ΠΌΠΎΠΆΠ΅ΠΌ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ доступ.

Π§Ρ‚ΠΎ скрываСтся Π²Π½ΡƒΡ‚Ρ€ΠΈ DVC-Ρ„Π°ΠΉΠ»ΠΎΠ²

ΠžΡ‚ΠΊΡ€ΠΎΠ΅ΠΌ Ρ‚Π΅ΠΊΡƒΡ‰ΠΈΠΉ dvc-Ρ„Π°ΠΉΠ» ΠΌΠΎΠ΄Π΅Π»ΠΈ: data-version-control/model/model.joblib.dvc. Π‘ΠΎΠ΄Π΅Ρ€ΠΆΠΈΠΌΠΎΠ΅ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π½ΠΎ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅Π΅:

        md5: 62bdac455a6574ed68a1744da1505745
outs:
  - md5: 96652bd680f9b8bd7c223488ac97f151
    path: model.joblib
    cache: true
    metric: false
    persist: false
    

Π€Π°ΠΉΠ»Ρ‹ DVC – это Ρ„Π°ΠΉΠ»Ρ‹ c YAML-Ρ€Π°Π·ΠΌΠ΅Ρ‚ΠΊΠΎΠΉ. Π˜Π½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΡ хранится Π² ΠΏΠ°Ρ€Π°Ρ… ΠΊΠ»ΡŽΡ‡-Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ ΠΈ списках. ΠŸΠ΅Ρ€Π²Ρ‹ΠΉ ΠΊΠ»ΡŽΡ‡ – md5, Π·Π° ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΌ слСдуСт строка, казалось Π±Ρ‹, случайных символов.

MD5 – популярный Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌ Ρ…Π΅ΡˆΠΈΡ€ΠΎΠ²Π°Π½ΠΈΡ. Π₯Π΅ΡˆΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ содСрТимоС Ρ„Π°ΠΉΠ»Π°, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΡΠΎΠ·Π΄Π°Ρ‚ΡŒ строку символов фиксированной Π΄Π»ΠΈΠ½Ρ‹. Вакая строка называСтся Ρ…Π΅ΡˆΠ΅ΠΌ ΠΈΠ»ΠΈ ΠΊΠΎΠ½Ρ‚Ρ€ΠΎΠ»ΡŒΠ½ΠΎΠΉ суммой. Π”Π»ΠΈΠ½Π° строки – нСзависимо ΠΎΡ‚ Ρ€Π°Π·ΠΌΠ΅Ρ€Π° исходного Ρ„Π°ΠΉΠ»Π° – составляСт 32 символа.

Π”Π²Π° ΠΎΠ΄ΠΈΠ½Π°ΠΊΠΎΠ²Ρ‹Ρ… Ρ„Π°ΠΉΠ»Π° ΠΈΠΌΠ΅ΡŽΡ‚ ΠΎΠ΄ΠΈΠ½Π°ΠΊΠΎΠ²Ρ‹ΠΉ Ρ…Π΅Ρˆ. Если Π² ΠΎΠ΄Π½ΠΎΠΌ ΠΈΠ· Ρ„Π°ΠΉΠ»ΠΎΠ² измСнится хотя Π±Ρ‹ ΠΎΠ΄ΠΈΠ½ Π±ΠΈΡ‚, Ρ…Π΅ΡˆΠΈ пСрСстанут ΡΠΎΠ²ΠΏΠ°Π΄Π°Ρ‚ΡŒ. DVC ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ свойства MD5 для достиТСния Π΄Π²ΡƒΡ… Π²Π°ΠΆΠ½Ρ‹Ρ… Ρ†Π΅Π»Π΅ΠΉ:

  • Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΎΡ‚ΡΠ»Π΅ΠΆΠΈΠ²Π°Ρ‚ΡŒ, ΠΊΠ°ΠΊΠΈΠ΅ Ρ„Π°ΠΉΠ»Ρ‹ Π±Ρ‹Π»ΠΈ ΠΈΠ·ΠΌΠ΅Π½Π΅Π½Ρ‹, просто взглянув Π½Π° ΠΈΡ… Ρ…Π΅Ρˆ-значСния;
  • ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΡΡ‚ΡŒ, ΠΊΠΎΠ³Π΄Π° Π΄Π²Π° Π±ΠΎΠ»ΡŒΡˆΠΈΡ… Ρ„Π°ΠΉΠ»Π° ΡΠΎΠ²ΠΏΠ°Π΄Π°ΡŽΡ‚ – достаточно Ρ…Ρ€Π°Π½ΠΈΡ‚ΡŒ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΎΠ΄Π½Ρƒ копию.

Π’ рассматриваСмом ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅ Π΅ΡΡ‚ΡŒ Π΄Π²Π° значСния md5. ΠŸΠ΅Ρ€Π²Ρ‹ΠΉ описываСт сам dvc-Ρ„Π°ΠΉΠ», Π° Π²Ρ‚ΠΎΡ€ΠΎΠΉ – Ρ„Π°ΠΉΠ» model.joblib.path – ΠΏΡƒΡ‚ΡŒ ΠΊ Ρ„Π°ΠΉΠ»Ρƒ ΠΌΠΎΠ΄Π΅Π»ΠΈ ΠΎΡ‚Π½ΠΎΡΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ Ρ€Π°Π±ΠΎΡ‡Π΅Π³ΠΎ ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³Π°. ЛогичСскоС Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ cache опрСдСляСт, Π΄ΠΎΠ»ΠΆΠ΅Π½ Π»ΠΈ DVC ΠΊΡΡˆΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ модСль.

ΠŸΡ€ΠΈΠΌΠ΅Ρ‡Π°Π½ΠΈΠ΅
Π”ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹Π΅ свСдСния ΠΎ dvc-Ρ„Π°ΠΉΠ»Π°Ρ… ΠΌΠΎΠΆΠ½ΠΎ ΠΏΠΎΡ‡Π΅Ρ€ΠΏΠ½ΡƒΡ‚ΡŒ Π²ΠΎΡ„ΠΈΡ†ΠΈΠ°Π»ΡŒΠ½ΠΎΠΉ Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚Π°Ρ†ΠΈΠΈ.

БовмСстная Ρ€Π°Π±ΠΎΡ‚Π°

ОсвоСнного Ρ€Π°Π±ΠΎΡ‡Π΅Π³ΠΎ процСсса достаточно, Ссли Π²Ρ‹ СдинствСнный, ΠΊΡ‚ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ ΠΎΠ±ΠΎΡ€ΡƒΠ΄ΠΎΠ²Π°Π½ΠΈΠ΅, Π½Π° ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΌ проводятся экспСримСнты. Однако ΠΌΠ½ΠΎΠ³ΠΈΠΌ ΠΊΠΎΠΌΠ°Π½Π΄Π°ΠΌ для Ρ€Π°Π±ΠΎΡ‚Ρ‹ приходится совмСстно ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ ΠΌΠΎΡ‰Π½Ρ‹Π΅ ΠΌΠ°ΡˆΠΈΠ½Ρ‹.

Когда с Π΄Π°Π½Π½Ρ‹ΠΌΠΈ Ρ€Π°Π±ΠΎΡ‚Π°ΡŽΡ‚ нСсколько ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Π΅ΠΉ, Π½Π΅ хочСтся ΠΏΠ»ΠΎΠ΄ΠΈΡ‚ΡŒ мноТСство ΠΊΠΎΠΏΠΈΠΉ ΠΎΠ΄Π½ΠΈΡ… ΠΈ Ρ‚Π΅Ρ… ΠΆΠ΅ датасСтов. Для экономии мСста DVC позволяСт Π½Π°ΡΡ‚Ρ€ΠΎΠΈΡ‚ΡŒ ΠΎΠ±Ρ‰ΠΈΠΉ кэш. Когда ΠΌΡ‹ ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·ΠΈΡ€ΡƒΠ΅ΠΌ Ρ€Π΅ΠΏΠΎΠ·ΠΈΡ‚ΠΎΡ€ΠΈΠΉ DVC с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ dvc init, DVC ΠΏΠΎΠΌΠ΅Ρ‰Π°Π΅Ρ‚ кэш Π² ΠΏΠ°ΠΏΠΊΡƒ .dvc/cache. Π­Ρ‚ΠΎΡ‚ ΠΏΡƒΡ‚ΡŒ ΠΌΠΎΠΆΠ½ΠΎ ΠΈΠ·ΠΌΠ΅Π½ΠΈΡ‚ΡŒ – для наглядности создадим Π½ΠΎΠ²ΡƒΡŽ ΠΏΠ°ΠΏΠΊΡƒ shared_cache Π³Π΄Π΅-Π½ΠΈΠ±ΡƒΠ΄ΡŒ Π·Π° ΠΏΡ€Π΅Π΄Π΅Π»Π°ΠΌΠΈ ΠΏΠ°ΠΏΠΊΠΈ рСпозитория. Π£ΠΊΠ°ΠΆΠ΅ΠΌ DVC ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ эту ΠΏΠ°ΠΏΠΊΡƒ Π² качСствС кэша:

        dvc cache dir ΠΏΡƒΡ‚ΡŒ_ΠΊ_shared_cache
    

ΠšΠ°ΠΆΠ΄Ρ‹ΠΉ Ρ€Π°Π·, ΠΊΠΎΠ³Π΄Π° ΠΌΡ‹ запускаСм dvc add ΠΈΠ»ΠΈ dvc commit, Π΄Π°Π½Π½Ρ‹Π΅ Π±ΡƒΠ΄ΡƒΡ‚ ΠΊΠΎΠΏΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒΡΡ Π² эту ΠΏΠ°ΠΏΠΊΡƒ. Когда ΠΌΡ‹ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌ dvc fetch для получСния Π΄Π°Π½Π½Ρ‹Ρ… ΠΈΠ· ΡƒΠ΄Π°Π»Π΅Π½Π½ΠΎΠ³ΠΎ Ρ…Ρ€Π°Π½ΠΈΠ»ΠΈΡ‰Π°, ΠΎΠ½ΠΈ ΠΏΠΎΠΏΠ°Π΄Π°ΡŽΡ‚ Π² ΠΎΠ±Ρ‰ΠΈΠΉ кэш, Π° dvc checkout пСрСнСсСт ΠΈΡ… Π² Ρ€Π°Π±ΠΎΡ‡ΠΈΠΉ Ρ€Π΅ΠΏΠΎΠ·ΠΈΡ‚ΠΎΡ€ΠΈΠΉ.

Если Π²Ρ‹ слСдовали ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π°ΠΌ руководства, Ρ‚ΠΎ всС Ρ„Π°ΠΉΠ»Ρ‹ сСйчас находятся Π² ΠΏΠ°ΠΏΠΊΠ΅ .dvc/cache. БСйчас Π»ΠΎΠ³ΠΈΡ‡Π½ΠΎ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅ΡΡ‚ΠΈΡ‚ΡŒ Π΄Π°Π½Π½Ρ‹Π΅ ΠΈΠ· кэша ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ Π² Π½ΠΎΠ²Ρ‹ΠΉ ΠΎΠ±Ρ‰ΠΈΠΉ кэш:

        mv .dvc/cache/* ΠΏΡƒΡ‚ΡŒ_ΠΊ_shared_cache
    

Π’Π΅ΠΏΠ΅Ρ€ΡŒ всС ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΠΈ Π½Π° ΠΊΠΎΠΌΠΏΡŒΡŽΡ‚Π΅Ρ€Π΅ ΠΌΠΎΠ³ΡƒΡ‚ ΡƒΠΊΠ°Π·Π°Ρ‚ΡŒ Π² качСствС кэша рСпозитория ΠΎΠ±Ρ‰ΠΈΠΉ кэш.

πŸ’½ Git для Data Science: ΠΊΠΎΠ½Ρ‚Ρ€ΠΎΠ»ΡŒ вСрсий ΠΌΠΎΠ΄Π΅Π»Π΅ΠΉ ΠΈ датасСтов с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ DVC

ΠŸΡ€ΠΎΠ²Π΅Ρ€ΠΈΠ² Ρ„Π°ΠΉΠ» рСпозитория .dvc/config, ΠΌΡ‹ ΡƒΠ²ΠΈΠ΄ΠΈΠΌ, Ρ‡Ρ‚ΠΎ появился Π½ΠΎΠ²Ρ‹ΠΉ Ρ€Π°Π·Π΄Π΅Π»:

        [cache]
    dir = ΠΏΡƒΡ‚ΡŒ_ΠΊ_shared_cache
    

Но ΠΊΠ°ΠΊ это ΠΏΠΎΠΌΠΎΠ³Π°Π΅Ρ‚ ΡΡΠΊΠΎΠ½ΠΎΠΌΠΈΡ‚ΡŒ мСсто? ВмСсто Ρ‚ΠΎΠ³ΠΎ Ρ‡Ρ‚ΠΎΠ±Ρ‹ Ρ…Ρ€Π°Π½ΠΈΡ‚ΡŒ ΠΊΠΎΠΏΠΈΠΈ ΠΎΠ΄Π½ΠΈΡ… ΠΈ Ρ‚Π΅Ρ… ΠΆΠ΅ Π΄Π°Π½Π½Ρ‹Ρ… Π² локальном Ρ€Π΅ΠΏΠΎΠ·ΠΈΡ‚ΠΎΡ€ΠΈΠΈ, ΠΎΠ±Ρ‰Π΅ΠΌ кэшС ΠΈ Π΄Ρ€ΡƒΠ³ΠΈΡ… рСпозиториях Π½Π° машинС, DVC позволяСт ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ ссылки – Ρ‚ΠΈΠΏΠ° reflink, symlink (символичСскиС) ΠΈΠ»ΠΈ hardlink (ТСсткиС ссылки). DVC Π±ΡƒΠ΄Π΅Ρ‚ ΠΏΡ‹Ρ‚Π°Ρ‚ΡŒΡΡ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ reflink, ΠΎΠ΄Π½Π°ΠΊΠΎ Ссли ОБ Π½Π΅ ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°Π΅Ρ‚ рСфссылки, DVC Π±ΡƒΠ΄Π΅Ρ‚ ΡΠΎΠ·Π΄Π°Π²Π°Ρ‚ΡŒ ΠΊΠΎΠΏΠΈΠΈ. Π‘ΠΎΠ»ΡŒΡˆΠ΅ ΠΎ Ρ‚ΠΈΠΏΠ°Ρ… Ρ„Π°ΠΉΠ»ΠΎΠ²Ρ‹Ρ… ссылок ΠΌΠΎΠΆΠ½ΠΎ ΡƒΠ·Π½Π°Ρ‚ΡŒ Π² Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚Π°Ρ†ΠΈΠΈ DVC.

Если ΠΊΡ€Π°Ρ‚ΠΊΠΎ, Ρ‚ΠΎ ΠΏΠΎΠ²Π΅Π΄Π΅Π½ΠΈΠ΅ кСша ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ ΠΌΠΎΠΆΠ½ΠΎ ΠΈΠ·ΠΌΠ΅Π½ΠΈΡ‚ΡŒ, ΡƒΠΊΠ°Π·Π°Π² ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΠΈ cache.type, подставив вмСсто Ρ‚ΠΈΠΏ_ссылки Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ symlink, reflink, hardlink ΠΈΠ»ΠΈ copies:

        dvc config cache.type Ρ‚ΠΈΠΏ_ссылки
dvc checkout --relink
    
Π”ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΠ΅ пространство
Если Π² Ρ€Π΅ΠΏΠΎΠ·ΠΈΡ‚ΠΎΡ€ΠΈΠΈ ΠΈΠ»ΠΈ кэшС Π΅ΡΡ‚ΡŒ Π½Π΅ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌΡ‹Π΅ ΠΌΠΎΠ΄Π΅Π»ΠΈ ΠΈΠ»ΠΈ Ρ„Π°ΠΉΠ»Ρ‹ Π΄Π°Π½Π½Ρ‹Ρ…, ΠΌΠΎΠΆΠ½ΠΎ ΡΡΠΊΠΎΠ½ΠΎΠΌΠΈΡ‚ΡŒ пространство, очистив Ρ€Π΅ΠΏΠΎΠ·ΠΈΡ‚ΠΎΡ€ΠΈΠΉ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ сборщика мусора dvc gc.

Π‘ΠΎΠ·Π΄Π°Π΅ΠΌ воспроизводимый ΠΊΠΎΠ½Π²Π΅ΠΉΠ΅Ρ€ Data Science

Π’ΠΎΡ‚ ΠΊΡ€Π°Ρ‚ΠΊΠΈΠΉ ΠΎΠ±Π·ΠΎΡ€ шагов, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΌΡ‹ сдСлали ΠΊ настоящСму Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ для обучСния ΠΌΠΎΠ΄Π΅Π»ΠΈ машинного обучСния:

  1. ΠŸΠΎΠ»ΡƒΡ‡Π΅Π½ΠΈΠ΅ Π΄Π°Π½Π½Ρ‹Ρ….
  2. ΠŸΠΎΠ΄Π³ΠΎΡ‚ΠΎΠ²ΠΊΠ° Π΄Π°Π½Π½Ρ‹Ρ….
  3. ΠžΠ±ΡƒΡ‡Π΅Π½ΠΈΠ΅ ΠΌΠΎΠ΄Π΅Π»ΠΈ.
  4. ΠžΡ†Π΅Π½ΠΊΠ° Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ΠΎΠ² обучСния.

Π’Ρ‹ ΠΌΠΎΠ³Π»ΠΈ Π·Π°ΠΌΠ΅Ρ‚ΠΈΡ‚ΡŒ, Ρ‡Ρ‚ΠΎ ΠΏΡ€ΠΈ ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠΈ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΎΠ² Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ шаги ΠΌΡ‹ повторяли Π²Ρ€ΡƒΡ‡Π½ΡƒΡŽ. ΠŸΡ€ΠΎΡ†Π΅ΡΡ ΠΌΠΎΠΆΠ½ΠΎ Π°Π²Ρ‚ΠΎΠΌΠ°Ρ‚ΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ, объСдинив ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΡŒ дСйствий Π² ΠΊΠΎΠ½Π²Π΅ΠΉΠ΅Ρ€ DVC, запускаСмый СдинствСнной ΠΊΠΎΠΌΠ°Π½Π΄ΠΎΠΉ.

Π‘ΠΎΠ·Π΄Π°Π΄ΠΈΠΌ Π½ΠΎΠ²ΡƒΡŽ Π²Π΅Ρ‚ΠΊΡƒ ΠΈ Π½Π°Π·ΠΎΠ²Π΅ΠΌ Π΅Π΅ sgd-pipeline:

        git checkout -b sgd-pipeline
    

Π˜ΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌ эту Π²Π΅Ρ‚ΠΊΡƒ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΏΠΎΠ²Ρ‚ΠΎΡ€Π½ΠΎ Π·Π°ΠΏΡƒΡΡ‚ΠΈΡ‚ΡŒ экспСримСнт Π² Π²ΠΈΠ΄Π΅ ΠΊΠΎΠ½Π²Π΅ΠΉΠ΅Ρ€Π° DVC. ΠšΠΎΠ½Π²Π΅ΠΉΠ΅Ρ€ состоит ΠΈΠ· Π½Π΅ΡΠΊΠΎΠ»ΡŒΠΊΠΈΡ… этапов ΠΈ выполняСтся с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ ΠΊΠΎΠΌΠ°Π½Π΄Ρ‹ dvc run. ΠšΠ°ΠΆΠ΄Ρ‹ΠΉ этап состоит ΠΈΠ· Ρ‚Ρ€Π΅Ρ… ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚ΠΎΠ²:

  1. Π’Ρ…ΠΎΠ΄Π½Ρ‹Π΅ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Ρ‹, dependencies
  2. Π’Ρ‹Ρ…ΠΎΠ΄Π½Ρ‹Π΅ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Ρ‹, outs
  3. ВыполняСмая ΠΊΠΎΠΌΠ°Π½Π΄Π°, command

Командой ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ всС, Ρ‡Ρ‚ΠΎ ΠΌΡ‹ ΠΎΠ±Ρ‹Ρ‡Π½ΠΎ запускаСм Π² ΠΊΠΎΠΌΠ°Π½Π΄Π½ΠΎΠΉ строкС, Π² Ρ‚ΠΎΠΌ числС Ρ„Π°ΠΉΠ»Ρ‹ Python.

ΠŸΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ ΠΌΡ‹ успСли ΡƒΠΆΠ΅ Π²Ρ€ΡƒΡ‡Π½ΡƒΡŽ Π΄ΠΎΠ±Π°Π²ΠΈΡ‚ΡŒ ΠΏΠΎΠ΄ ΡƒΠΏΡ€Π°Π²Π»Π΅Π½ΠΈΠ΅ DVC ΠΌΠ½ΠΎΠ³ΠΎ Ρ„Π°ΠΉΠ»ΠΎΠ², DVC запутаСтся, Ссли ΠΌΡ‹ попытаСмся ΡΠΎΠ·Π΄Π°Ρ‚ΡŒ Ρ‚Π΅ ΠΆΠ΅ Ρ„Π°ΠΉΠ»Ρ‹ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ ΠΊΠΎΠ½Π²Π΅ΠΉΠ΅Ρ€Π°. Π§Ρ‚ΠΎΠ±Ρ‹ этого ΠΈΠ·Π±Π΅ΠΆΠ°Ρ‚ΡŒ, сначала ΡƒΠ΄Π°Π»ΠΈΠΌ CSV-Ρ„Π°ΠΉΠ»Ρ‹, ΠΌΠΎΠ΄Π΅Π»ΠΈ ΠΈ ΠΏΠΎΠΊΠ°Π·Π°Ρ‚Π΅Π»ΠΈ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ dvc remove:

        dvc remove data/prepared/train.csv.dvc \
             data/prepared/test.csv.dvc \
             model/model.joblib.dvc --outs
    

Π˜Ρ‚Π°ΠΊ, ΠΌΡ‹ Π½Π°Ρ‡ΠΈΠ½Π°Π΅ΠΌ ΠΊΠΎΠ½Π²Π΅ΠΉΠ΅Ρ€ с запуска prepare.py. ΠŸΠ΅Ρ€Π΅Π΄Π°Π΅ΠΌ ΠΊΠΎΠΌΠ°Π½Π΄Π΅ dvc run Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΡ‹Π΅ Π΄Π°Π½Π½Ρ‹Π΅:

  1. Dependencies (ΠΊΠ»ΡŽΡ‡ -d): prepare.py ΠΈ Π΄Π°Π½Π½Ρ‹Π΅ Π² data/raw
  2. Outs (ΠΊΠ»ΡŽΡ‡ -o): train.csv ΠΈ test.csv
  3. Command: python prepare.py

ΠšΠ»ΡŽΡ‡ -n ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌ для создания ΠΈΠΌΠ΅Π½ΠΈ этапа:

        dvc run -n prepare \
        -d src/prepare.py -d data/raw \
        -o data/prepared/train.csv -o data/prepared/test.csv \
        python src/prepare.py
    

DVC создаст Π΄Π²Π° Ρ„Π°ΠΉΠ»Π°: dvc.yaml ΠΈ dvc.lock. Π§Ρ‚ΠΎ ΠΌΠΎΠΆΠ½ΠΎ ΡƒΠ²ΠΈΠ΄Π΅Ρ‚ΡŒ Π² dvc.yaml:

        stages:
  prepare:
    cmd: python src/prepare.py
    deps:
      - data/raw
      - src/prepare.py
    outs:
      - data/prepared/test.csv
      - data/prepared/train.csv
    

Π­Π»Π΅ΠΌΠ΅Π½Ρ‚ Π²Π΅Ρ€Ρ…Π½Π΅Π³ΠΎ уровня stages ΠΈΠΌΠ΅Π΅Ρ‚ Π²Π»ΠΎΠΆΠ΅Π½Π½Ρ‹Π΅ элСмСнты, ΠΏΠΎ ΠΎΠ΄Π½ΠΎΠΌΡƒ для ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ этапа. Пока Ρƒ нас Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΎΠ΄ΠΈΠ½ этап prepare. По ΠΌΠ΅Ρ€Π΅ Ρ‚ΠΎΠ³ΠΎ ΠΊΠ°ΠΊ ΠΌΡ‹ Π±ΡƒΠ΄Π΅ΠΌ Π½Π°Ρ€Π°Ρ‰ΠΈΠ²Π°Ρ‚ΡŒ ΠΊΠΎΠ½Π²Π΅ΠΉΠ΅Ρ€, Π² Ρ„Π°ΠΉΠ»Π΅ Π±ΡƒΠ΄ΡƒΡ‚ Π΄ΠΎΠ±Π°Π²Π»ΡΡ‚ΡŒΡΡ элСмСнты. ВСхничСски ΠΌΠΎΠΆΠ½ΠΎ Π½Π΅ Π²Π²ΠΎΠ΄ΠΈΡ‚ΡŒ ΠΊΠΎΠΌΠ°Π½Π΄Ρ‹ dvc run Π² ΠΊΠΎΠΌΠ°Π½Π΄Π½ΠΎΠΉ строкС, Π° ΡΠΎΠ·Π΄Π°Π²Π°Ρ‚ΡŒ ΠΈΠ»ΠΈ Π²Π°Ρ€ΡŒΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ этапы Π² этом Ρ„Π°ΠΉΠ»Π΅.

Π£ ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ dvc.yaml Π΅ΡΡ‚ΡŒ ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΠΉ Ρ„Π°ΠΉΠ» dvc.lock, Ρ‚Π°ΠΊΠΆΠ΅ Π² Ρ„ΠΎΡ€ΠΌΠ°Ρ‚Π΅ YAML:

        prepare:
  cmd: python src/prepare.py
  deps:
    - path: data/raw
      md5: a8a5252d9b14ab2c1be283822a86981a.dir
    - path: src/prepare.py
      md5: 0e29f075d51efc6d280851d66f8943fe
  outs:
    - path: data/prepared/test.csv
      md5: d4a8cdf527c2c58d8cc4464c48f2b5c5
    - path: data/prepared/train.csv
      md5: 50cbdb38dbf0121a6314c4ad9ff786fe
    

Π”ΠΎΠ±Π°Π²Π»Π΅Π½ΠΈΠ΅ Ρ…ΡΡˆΠ΅ΠΉ MD5 позволяСт DVC ΠΎΡ‚ΡΠ»Π΅ΠΆΠΈΠ²Π°Ρ‚ΡŒ Π²Ρ…ΠΎΠ΄Π½Ρ‹Π΅ ΠΈ Π²Ρ‹Ρ…ΠΎΠ΄Π½Ρ‹Π΅ Π΄Π°Π½Π½Ρ‹Π΅ ΠΈ ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΡΡ‚ΡŒ, измСняСтся Π»ΠΈ ΠΊΠ°ΠΊΠΎΠΉ-Π»ΠΈΠ±ΠΎ ΠΈΠ· этих Ρ„Π°ΠΉΠ»ΠΎΠ². Π’Π°ΠΊΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ, вмСсто ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½Ρ‹Ρ… Ρ„Π°ΠΉΠ»ΠΎΠ² dvc для train.csv, test.csv ΠΈ model.joblib, всС отслСТиваСтся Π² Ρ„Π°ΠΉΠ»Π΅ .lock.

ΠœΡ‹ Π°Π²Ρ‚ΠΎΠΌΠ°Ρ‚ΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Π»ΠΈ ΠΏΠ΅Ρ€Π²Ρ‹ΠΉ этап ΠΊΠΎΠ½Π²Π΅ΠΉΠ΅Ρ€Π°. ΠŸΡ€Π΅Π΄ΡΡ‚Π°Π²ΠΈΠΌ Π΅Π³ΠΎ Π² Π²ΠΈΠ΄Π΅ Π±Π»ΠΎΠΊ-схСмы.

Начало Ρ€Π°Π±ΠΎΡ‚Ρ‹ Π½Π°Π΄ созданиСм ΠΊΠΎΠ½Π²Π΅ΠΉΠ΅Ρ€Π° DVC
Начало Ρ€Π°Π±ΠΎΡ‚Ρ‹ Π½Π°Π΄ созданиСм ΠΊΠΎΠ½Π²Π΅ΠΉΠ΅Ρ€Π° DVC

Π‘Π»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΉ этап – ΠΎΠ±ΡƒΡ‡Π΅Π½ΠΈΠ΅:

        dvc run -n train \
        -d src/train.py -d data/prepared/train.csv \
        -o model/model.joblib \
        python src/train.py
    
Π”Π²Π° этапа, записанных Π² ΠΏΠ°ΠΉΠΏΠ»Π°ΠΉΠ½ (ΠΊΠΎΠ½Π²Π΅ΠΉΠ΅Ρ€)
Π”Π²Π° этапа, записанных Π² ΠΏΠ°ΠΉΠΏΠ»Π°ΠΉΠ½ (ΠΊΠΎΠ½Π²Π΅ΠΉΠ΅Ρ€)

Π€ΠΈΠ½Π°Π»ΡŒΠ½Ρ‹ΠΉ этап – ΠΎΡ†Π΅Π½ΠΊΠ° ΠΌΠΎΠ΄Π΅Π»ΠΈ:

        dvc run -n evaluate \
        -d src/evaluate.py -d model/model.joblib \
        -M metrics/accuracy.json \
        python src/evaluate.py
    

ΠžΠ±Ρ€Π°Ρ‚ΠΈΡ‚Π΅ Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅, Ρ‡Ρ‚ΠΎ вмСсто ΠΊΠ»ΡŽΡ‡Π° -o ΠΌΡ‹ использовали ΠΊΠ»ΡŽΡ‡ -M. DVC ΠΎΠ±Ρ€Π°Π±Π°Ρ‚Ρ‹Π²Π°Π΅Ρ‚ ΠΌΠ΅Ρ‚Ρ€ΠΈΠΊΠΈ ΠΈΠ½Π°Ρ‡Π΅, Ρ‡Π΅ΠΌ Π΄Ρ€ΡƒΠ³ΠΈΠ΅ Π²Ρ‹Ρ…ΠΎΠ΄Π½Ρ‹Π΅ Π΄Π°Π½Π½Ρ‹Π΅. DVC Π±ΡƒΠ΄Π΅Ρ‚ Π·Π½Π°Ρ‚ΡŒ, Ρ‡Ρ‚ΠΎ Π² accuracy.json хранится ΠΏΠΎΠΊΠ°Π·Π°Ρ‚Π΅Π»ΡŒ ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΠΈ ΠΌΠΎΠ΄Π΅Π»ΠΈ:

        dvc metrics show
    metrics/accuracy.json:
        accuracy: 0.6996197718631179
    
ΠŸΠΎΠ»Π½Ρ‹ΠΉ ΠΊΠΎΠ½Π²Π΅ΠΉΠ΅Ρ€ Π² DVC
ΠŸΠΎΠ»Π½Ρ‹ΠΉ ΠΊΠΎΠ½Π²Π΅ΠΉΠ΅Ρ€ Π² DVC

Π’Π΅ΠΏΠ΅Ρ€ΡŒ вСсь Ρ€Π°Π±ΠΎΡ‡ΠΈΠΉ процСсс прСдставлСн Π½Π° ΠΎΠ΄Π½ΠΎΠΌ ΠΈΠ·ΠΎΠ±Ρ€Π°ΠΆΠ΅Π½ΠΈΠΈ. НС Π·Π°Π±ΡƒΠ΄Π΅ΠΌ ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ Ρ‚Π΅Π³ для Π½ΠΎΠ²ΠΎΠΉ Π²Π΅Ρ‚ΠΊΠΈ ΠΈ ΠΎΡ‚ΠΏΡ€Π°Π²ΠΈΡ‚ΡŒ измСнСния Π½Π° GitHub ΠΈ DVC:

        git commit -m "Rerun SGD as pipeline"
dvc commit
git push --set-upstream origin sgd-pipeline
git tag -a sgd-pipeline -m "Trained SGD as DVC pipeline."
git push origin --tags
dvc push
    

Π’Π΅ΠΏΠ΅Ρ€ΡŒ самоС интСрСсноС! Π’ΠΎΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌΡΡ для обучСния классификатором random forest. ΠžΠ±Ρ‹Ρ‡Π½ΠΎ ΠΎΠ½ Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚ эффСктивнСС, Ρ‡Π΅ΠΌ SGDClassifier, ΠΈ ΠΏΠΎΡ‚Π΅Π½Ρ†ΠΈΠ°Π»ΡŒΠ½ΠΎ ΠΌΠΎΠΆΠ΅Ρ‚ Π΄Π°Ρ‚ΡŒ Π»ΡƒΡ‡ΡˆΠΈΠ΅ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Ρ‹. НачнСм с создания ΠΈ ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΠΈ Π½ΠΎΠ²ΠΎΠΉ Π²Π΅Ρ‚ΠΊΠΈ, ΠΊΠΎΡ‚ΠΎΡ€ΡƒΡŽ Π½Π°Π·ΠΎΠ²Π΅ΠΌ random_forest:

        git checkout -b "random_forest"
    

ИзмСним src/train.py, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ RandomForestClassifier вмСсто SGDClassifier:

train.py
        from joblib import dump
from pathlib import Path

import numpy as np
import pandas as pd
from skimage.io import imread_collection
from skimage.transform import resize
from sklearn.ensemble import RandomForestClassifier  # <- 
# ...

def main(path_to_repo):
    train_csv_path = repo_path / "data/prepared/train.csv"
    train_data, labels = load_data(train_csv_path)
    rf = RandomForestClassifier()                  # <- 
    trained_model = rf.fit(train_data, labels)     # <- 
    dump(trained_model, repo_path / "model/model.joblib")
    

ΠŸΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ Ρ„Π°ΠΉΠ» train.py измСнился, стал Π΄Ρ€ΡƒΠ³ΠΈΠΌ ΠΈ Π΅Π³ΠΎ Ρ…Π΅Ρˆ MD5. DVC ΠΏΠΎΠΉΠΌΠ΅Ρ‚, Ρ‡Ρ‚ΠΎ Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ воспроизвСсти ΠΎΠ΄Π½Ρƒ ΠΈΠ· стадий ΠΊΠΎΠ½Π²Π΅ΠΉΠ΅Ρ€Π°. ΠŸΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠ΅ ΠΌΠΎΠ΄Π΅Π»ΠΈ повлияСт ΠΈ Π½Π° ΠΌΠ΅Ρ‚Ρ€ΠΈΠΊΡƒ, ΠΌΡ‹ Ρ…ΠΎΡ‚ΠΈΠΌ воспроизвСсти всю Ρ†Π΅ΠΏΠΎΡ‡ΠΊΡƒ. Π›ΡŽΠ±ΠΎΠΉ этап ΠΊΠΎΠ½Π²Π΅ΠΉΠ΅Ρ€Π° DVC ΠΌΠΎΠΆΠ½ΠΎ воспроизвСсти с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ ΠΊΠΎΠΌΠ°Π½Π΄Ρ‹ dvc repro:

        dvc repro evaluate
    

И всё! Когда ΠΌΡ‹ запускаСм ΠΊΠΎΠΌΠ°Π½Π΄Ρƒ repro, DVC провСряСт всС зависимости всСго ΠΊΠΎΠ½Π²Π΅ΠΉΠ΅Ρ€Π°, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΠΈΡ‚ΡŒ, Ρ‡Ρ‚ΠΎ измСнилось ΠΈ ΠΊΠ°ΠΊΠΈΠ΅ ΠΊΠΎΠΌΠ°Π½Π΄Ρ‹ Π½ΡƒΠΆΠ½ΠΎ Π²Ρ‹ΠΏΠΎΠ»Π½ΠΈΡ‚ΡŒ снова. МоТно ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Ρ‰Π°Ρ‚ΡŒΡΡ ΠΌΠ΅ΠΆΠ΄Ρƒ Π²Π΅Ρ‚ΠΊΠ°ΠΌΠΈ ΠΈ Π²ΠΎΡΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚ΡŒ любой экспСримСнт с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ ΠΎΠ΄Π½ΠΎΠΉ лишь ΠΊΠΎΠΌΠ°Π½Π΄Ρ‹.

ΠšΡ€ΠΎΠΌΠ΅ Ρ‚ΠΎΠ³ΠΎ, Ρ‚Π΅ΠΏΠ΅Ρ€ΡŒ ΠΏΡ€ΠΎΡ‰Π΅ простого ΡΡ€Π°Π²Π½ΠΈΠ²Π°Ρ‚ΡŒ ΠΌΠ΅Ρ‚Ρ€ΠΈΠΊΠΈ. Если Π·Π°ΠΏΡƒΡΡ‚ΠΈΡ‚ΡŒ dvc metrics show с ΠΊΠ»ΡŽΡ‡ΠΎΠΌ -T, Π±ΡƒΠ΄ΡƒΡ‚ ΠΎΡ‚ΠΎΠ±Ρ€Π°ΠΆΠ°Ρ‚ΡŒΡΡ ΠΌΠ΅Ρ‚Ρ€ΠΈΠΊΠΈ для всСх Ρ‚Π΅Π³ΠΎΠ².

        dvc metrics show -T
forest:
    metrics/accuracy.json:
        accuracy: 0.8098859315589354
sgd-pipeline:
    metrics/accuracy.json:
        accuracy: 0.6996197718631179

    

Π­Ρ‚ΠΎ позволяСт быстро ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΠΈΡ‚ΡŒ, ΠΊΠ°ΠΊΠΎΠΉ экспСримСнт Π² Ρ€Π΅ΠΏΠΎΠ·ΠΈΡ‚ΠΎΡ€ΠΈΠΈ Π΄Π°Π» Π½Π°ΠΈΠ»ΡƒΡ‡ΡˆΠΈΠΉ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚. ΠŸΡ€Π΅Π΄ΡΡ‚Π°Π²ΠΈΠΌ, Ρ‡Ρ‚ΠΎ Π²Ρ‹ Π²Π΅Ρ€Π½ΡƒΠ»ΠΈΡΡŒ ΠΊ ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Ρƒ спустя ΠΏΠΎΠ»Π³ΠΎΠ΄Π° ΠΈ Π·Π°Π±Ρ‹Π»ΠΈ ΠΎΠ±ΠΎ всСх подробностях. Как ΠΈ Π»ΡŽΠ±ΠΎΠΌΡƒ Π΄Ρ€ΡƒΠ³ΠΎΠΌΡƒ Ρ‡Π΅Π»ΠΎΠ²Π΅ΠΊΡƒ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Ρ…ΠΎΡ‡Π΅Ρ‚ воспроизвСсти Π²Π°ΡˆΡƒ Ρ€Π°Π±ΠΎΡ‚Ρƒ, Π±ΡƒΠ΄Π΅Ρ‚ достаточно Π²Ρ‹ΠΏΠΎΠ»Π½ΠΈΡ‚ΡŒ Ρ‚Ρ€ΠΈ шага:

  1. Π—Π°ΠΏΡƒΡΡ‚ΠΈΡ‚ΡŒ git clone ΠΈΠ»ΠΈ git checkout, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ½Ρ‹ΠΉ ΠΊΠΎΠ΄ ΠΈ dvc-Ρ„Π°ΠΉΠ»Ρ‹.
  2. ΠŸΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ Π΄Π°Π½Π½Ρ‹Π΅ обучСния с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ dvc checkout.
  3. ВоспроизвСдитС Ρ€Π°Π±ΠΎΡ‡ΠΈΠΉ процСсс с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ ΠΊΠΎΠΌΠ°Π½Π΄Ρ‹ dvc repro evaluate.

Π—Π°ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅

ΠŸΠΎΠ·Π΄Ρ€Π°Π²Π»ΡΠ΅ΠΌ с ΠΏΡ€ΠΎΡ…ΠΎΠΆΠ΄Π΅Π½ΠΈΠ΅ΠΌ Ρ‚ΡƒΡ‚ΠΎΡ€ΠΈΠ°Π»Π°!

Π˜Ρ‚Π°ΠΊ, ΠΌΡ‹ ΠΏΡ€ΠΎΠ²Π΅Π»ΠΈ нСсколько экспСримСнтов, обСспСчили бСзопасноС созданиС вСрсий, Ρ€Π΅Π·Π΅Ρ€Π²Π½ΠΎΠ΅ ΠΊΠΎΠΏΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ Π΄Π°Π½Π½Ρ‹Ρ… ΠΈ ΠΌΠΎΠ΄Π΅Π»Π΅ΠΉ. Π‘ΠΎΠ»Π΅Π΅ Ρ‚ΠΎΠ³ΠΎ, ΠΌΡ‹ ΠΌΠΎΠΆΠ΅ΠΌ быстро воспроизвСсти ΠΊΠ°ΠΆΠ΄Ρ‹ΠΉ экспСримСнт, Π²Ρ‹ΠΏΠΎΠ»Π½ΠΈΠ² ΠΎΠ΄Π½Ρƒ ΠΊΠΎΠΌΠ°Π½Π΄Ρƒ dvc repro.

ΠŸΠΎΠ½Π°Ρ‡Π°Π»Ρƒ ΠΌΠΎΠΆΠ΅Ρ‚ ΠΏΠΎΠΊΠ°Π·Π°Ρ‚ΡŒΡΡ нСсколько слоТным Π·Π°ΠΏΡƒΡΠΊΠ°Ρ‚ΡŒ Π² Π½ΡƒΠΆΠ½Ρ‹Π΅ ΠΌΠΎΠΌΠ΅Π½Ρ‚Ρ‹ всС ΠΊΠΎΠΌΠ°Π½Π΄Ρ‹ DVC ΠΈ Git. ПолоТСниС ΠΎΠ±Π»Π΅Π³Ρ‡Π°Ρ‚ Ρ…ΡƒΠΊΠΈ Git – ΠΏΡ€ΠΈ запускС ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π½Ρ‹Ρ… ΠΊΠΎΠΌΠ°Π½Π΄ Git автоматичСски выполнятся ΠΊΠΎΠΌΠ°Π½Π΄Ρ‹ DVC. К Ρ‚ΠΎΠΌΡƒ ΠΆΠ΅ DVC ΠΈΠΌΠ΅Π΅Ρ‚ Python API, Ρ‚ΠΎ Π΅ΡΡ‚ΡŒ ΠΌΠΎΠΆΠ½ΠΎ Π½Π°ΡΡ‚Ρ€ΠΎΠΈΡ‚ΡŒ Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΡƒΡŽ Π°Π²Ρ‚ΠΎΠΌΠ°Ρ‚ΠΈΠ·Π°Ρ†ΠΈΡŽ Π½Π° ΡƒΡ€ΠΎΠ²Π½Π΅ ΠΊΠΎΠ΄Π°.

Π₯отя это руководство прСдставляСт собой достаточно ΠΏΠΎΠ΄Ρ€ΠΎΠ±Π½Ρ‹ΠΉ ΠΎΠ±Π·ΠΎΡ€ возмоТностСй DVC, Π½Π΅Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ ΠΎΡ…Π²Π°Ρ‚ΠΈΡ‚ΡŒ всё Π² ΠΎΠ΄Π½ΠΎΠΉ ΠΏΡƒΠ±Π»ΠΈΠΊΠ°Ρ†ΠΈΠΈ. Для дальнСйшСго ознакомлСния с DVC ΠΌΡ‹ Ρ€Π΅ΠΊΠΎΠΌΠ΅Π½Π΄ΡƒΠ΅ΠΌ ΠΎΠ±Ρ€Π°Ρ‚ΠΈΡ‚ΡŒΡΡ ΠΊ ΠΎΡ„ΠΈΡ†ΠΈΠ°Π»ΡŒΠ½ΠΎΠΌΡƒ руководству ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Ρ, справочнику ΠΊΠΎΠΌΠ°Π½Π΄ ΠΈ ΠΈΠ½Ρ‚Π΅Ρ€Π°ΠΊΡ‚ΠΈΠ²Π½ΠΎΠΌΡƒ ΡƒΡ‡Π΅Π±Π½ΠΈΠΊΡƒ.

Π‘ΠΎΠ»ΡŒΡˆΠ΅ ΠΏΠΎΠ»Π΅Π·Π½ΠΎΠΉ ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΠΈ Π²Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ Π½Π° нашСм Ρ‚Π΅Π»Π΅Π³Ρ€Π°ΠΌ-ΠΊΠ°Π½Π°Π»Π΅ Β«Π‘ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ° data scientist’а». Π Π΅ΠΊΠΎΠΌΠ΅Π½Π΄ΡƒΠ΅ΠΌ Ρ‚Π°ΠΊΠΆΠ΅ ΠΎΠ±Ρ€Π°Ρ‚ΠΈΡ‚ΡŒ Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅ Π½Π° наш ΡƒΡ‡Π΅Π±Π½Ρ‹ΠΉ курс ΠΏΠΎ ΠΌΠ°Ρ‚Π΅ΠΌΠ°Ρ‚ΠΈΠΊΠ΅ для Data Science.

Π˜ΡΡ‚ΠΎΡ‡Π½ΠΈΠΊΠΈ

ΠœΠ•Π ΠžΠŸΠ Π˜Π―Π’Π˜Π―

Π˜ΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚Π΅ Π»ΠΈ Π²Ρ‹ ΡƒΠΆΠ΅ ΠΊΠΎΠ½Ρ‚Ρ€ΠΎΠ»ΡŒ вСрсий для своих Π΄Π°Π½Π½Ρ‹Ρ…?

Π’ΠΠšΠΠΠ‘Π˜Π˜

Π”ΠΎΠ±Π°Π²ΠΈΡ‚ΡŒ вакансию
Аналитик Π΄Π°Π½Π½Ρ‹Ρ…
Π•ΠΊΠ°Ρ‚Π΅Ρ€ΠΈΠ½Π±ΡƒΡ€Π³, ΠΏΠΎ ΠΈΡ‚ΠΎΠ³Π°ΠΌ собСсСдования
ΠŸΡ€ΠΎΠ΄ΡƒΠΊΡ‚ΠΎΠ²Ρ‹ΠΉ Π°Π½Π°Π»ΠΈΡ‚ΠΈΠΊ
Π•ΠΊΠ°Ρ‚Π΅Ρ€ΠΈΠ½Π±ΡƒΡ€Π³, ΠΏΠΎ ΠΈΡ‚ΠΎΠ³Π°ΠΌ собСсСдования

Π›Π£Π§Π¨Π˜Π• БВАВЬИ ПО Π’Π•ΠœΠ•