Table of Contents
Veri versiyonlama, yazılım geliştirme süreçlerinden esinlenerek veri bilimi projelerinde veri setlerinin değişikliklerini izlemek ve yönetmek için kullanılan bir yöntemdir. Veri versiyonlama, bir veri setinin farklı zamanlarda veya farklı kullanıcılar arasında yaşadığı değişiklikleri izleme ve kaydetme sürecidir. Bu süreç, veri setinin farklı sürümlerini oluşturarak, her bir sürümde yapılan değişiklikleri ve güncellemeleri belgeleyerek gerçekleşir. Veri versiyonlama önemlidir çünkü;
- Geriye Dönük İzleme: Veri versiyonlama, veri setinin geçmiş durumlarını korur ve geriye dönük izleme sağlar. Bu, hataları tanımlamak, değişiklikleri geri almak ve projenin gelişimini anlamak için önemlidir.
- İşbirliği Kolaylığı: Birden fazla kişi veya ekip tarafından yapılan değişikliklerin koordine edilmesini kolaylaştırır.
- Denetleme ve Güvenlik: Veri versiyonlama, veri setinin değişikliklerini belgeleyerek denetleme ve güvenlik açısından önemli bir rol oynar.
- Model İyileştirme: Model geliştirirken veri setinin model performansı üzerindeki etkilerini analiz ederek modelin iyileştirilmesi için önemlidir. Farklı veri versiyonları arasındaki farkları analiz etmek, modelin güvenilirliğini artırabilir.
Veri versiyonlaması için birkaç farklı yaklaşım bulunmaktadır:
- Geleneksel Yöntemler: Birçok organizasyon, basit dosya adlandırma düzenlemeleri veya klasör yapıları kullanarak veri versiyonlaması yapar. Örneğin, “veri_2022-01-01.csv” gibi.
- Versiyon Kontrol Sistemleri (VCS): Yazılım geliştirme dünyasında olduğu gibi, veri versiyonlaması için de VCS araçları kullanılabilir.
DVC (Data Version Control)
Veri versiyon kontrolü (DVC), veri setlerinin yönetimini ve versiyon kontrolünü sağlamak için kullanılan bir araçtır. Veri setlerindeki değişiklikleri izler, versiyonları kaydeder ve farklı sürümler arasında geçiş yapmayı kolaylaştırır. DVC, veri setlerinin kendisini değil, veri setlerinin metadata ve versiyon kontrol bilgilerini yönetir. Veri setleri, uzaktaki depolama hizmetlerine saklanır ve DVC bu veri setlerinin referanslarını ve değişikliklerini izler. Bu, veri setlerinin boyutu farketmeksizin, hafif ve etkili bir şekilde yönetilmesini sağlar.
Şimdi DVC ile Veri Versiyonlama örneği yapalım.
İlk olarak DVC’yi kurmakla başlayalım. Kurulum adımlarını incelemek için bu linki kullanabilirsiniz.
# macOS
brew install dvc
# With pip
pip install dvc
# Windows
choco install dvc
# Linux
snap install --classic dvc
1 – ) İlk olarak boş bir klasör açıyorum. Bu klasörün içinde ‘images-old’ adında bir klasör oluşturuyorum. Bu klasör içerisinde 3 adet görüntü bulunuyor. Bu klasörün bizim veri setimiz olduğunu varsayalım.
alper@alper:/mnt/d/work2/data-versioning-dvc/cyberds/dvc-test$ ls -R
.:
images-old
./images-old:
gorsel1.png gorsel2.png gorsel3.png
2 – ) Bir projede DVC’yi kullanmak için ilk olarak o projenin ‘git’ kullanıyor olması lazım. Bunun sebebi DVC veri hakkında bilgi almak için ‘git’ kullanıyor olmasıdır.
alper@alper:/mnt/d/work2/data-versioning-dvc/cyberds/dvc-test$ git init
hint: Using 'master' as the name for the initial branch. This default branch name
hint: is subject to change. To configure the initial branch name to use in all
hint: of your new repositories, which will suppress this warning, call:
hint:
hint: git config --global init.defaultBranch <name>
hint:
hint: Names commonly chosen instead of 'master' are 'main', 'trunk' and
hint: 'development'. The just-created branch can be renamed via this command:
hint:
hint: git branch -m <name>
Initialized empty Git repository in /mnt/d/work2/data-versioning-dvc/cyberds/dvc-test/.git/
alper@alper:/mnt/d/work2/data-versioning-dvc/cyberds/dvc-test$ dvc init
Initialized DVC repository.
You can now commit the changes to git.
+---------------------------------------------------------------------+
| |
| DVC has enabled anonymous aggregate usage analytics. |
| Read the analytics documentation (and how to opt-out) here: |
| <https://dvc.org/doc/user-guide/analytics> |
| |
+---------------------------------------------------------------------+
What's next?
------------
- Check out the documentation: <https://dvc.org/doc>
- Get help and share ideas: <https://dvc.org/chat>
- Star us on GitHub: <https://github.com/iterative/dvc>
3 – ) ‘dvc add images-old’ komutu ile versiyonlamak istediğimiz veri setini DVC’ye ekledik. Kodu çalıştırdıktan sonra DVC, bu adımdan sonra yapmamız gerekenleri bize söylüyor. DVC, veri seti dizinini gitignore dosyası içerisine eklememizi söylüyor.
alper@alper:/mnt/d/work2/data-versioning-dvc/cyberds/dvc-test$ dvc add ./images-old
100% Adding...|████████████████████████████████████████████████████████████████|1/1 [00:00, 3.75file/s] To track the changes with git, run:
git add images-old.dvc .gitignore
To enable auto staging, run:
dvc config core.autostage true
alper@alper:/mnt/d/work2/data-versioning-dvc/cyberds/dvc-test$ ls
images-old images-old.dvc
alper@alper:/mnt/d/work2/data-versioning-dvc/cyberds/dvc-test$ git add images-old.dvc .gitignore
4 – ) Dizini incelediğimiz zaman bir ‘images-old.dvc’ isminde dosya görüyoruz. Dosyayı incelediğimiz zaman içerisinde veri seti hakkında çeşitli bilgilerin bulunduğunu görüyoruz. Daha sonra ilk commit’imizi oluşturuyoruz.
alper@alper:/mnt/d/work2/data-versioning-dvc/cyberds/dvc-test$ cat images-old.dvc
outs:
- md5: e4eefd5bc999cdc1b7b55bb53c83b8e5.dir
size: 3239
nfiles: 3
hash: md5
path: images-old
alper@alper:/mnt/d/work2/data-versioning-dvc/cyberds/dvc-test$ git commit -m 'Veri setinin ilk hali verisyonlandi.'
[master (root-commit) 7dcb97d] Veri setinin ilk hali verisyonlandi.
5 files changed, 13 insertions(+)
create mode 100755 .dvc/.gitignore
create mode 100755 .dvc/config
create mode 100755 .dvcignore
create mode 100644 .gitignore
create mode 100644 images-old.dvc
5 – ) Commit işleminden sonra proje dizinine baktığımızda ‘.dvc’ adında bir klasör görüyoruz. DVC, bu klasör içerisinde proje için oluşturulan versiyonlama sistemini barındırıyor. ‘cache’ dizini içerisinde ‘images-old’ klasöründeki 3 fotoğraf dosyasına ait hash bilgileri bulunuyor. Sonu ‘.dir’ ile biten dosya ise biraz önce incelediğimiz ‘images-old.dvc’ dosyası ile aynı hash değerine sahip yani o dosyanın bir kopyası da burada tutuluyor.
alper@alper:/mnt/d/work2/data-versioning-dvc/cyberds/dvc-test$ ls -R .dvc
.dvc:
cache config tmp
.dvc/cache:
files
.dvc/cache/files:
md5
.dvc/cache/files/md5:
0c bc ca e4
.dvc/cache/files/md5/0c:
6cb91ea3f3be0e3db71b02095e3e02
.dvc/cache/files/md5/bc:
56488bcf1ab4e72c79d43bc83b6bde
.dvc/cache/files/md5/ca:
2a0f1abff2385f84fe89c84d660ac5
.dvc/cache/files/md5/e4:
eefd5bc999cdc1b7b55bb53c83b8e5.dir
.dvc/tmp:
btime lock rwlock rwlock.lock
6 – ) Yukarıdaki çıktılardan da anlaşılacağı gibi DVC sadece veri setine ait bilgileri depoluyor. Fotoğrafları bir bulut diski üzerinde depolayabiliriz. DVC, Google Drive, Azure Blob Storage, AWS S3 gibi çeşitli bulut depolama uygulamaları ile uyumlu bir şekilde çalışabiliyor. Ben bu makalede ücretsiz olduğu için ‘Google Drive’ kullanacağım. Dosyaları uzak sunucuda depolamak için ‘dvc remote add’ komutunu kullanacağız.
İlk olarak Google Drive üzerinde ‘test-veri-seti’ isminde boş bir klasör oluşturuyorum. Oluşturduğum klasörün içinde girdikten sonra URL adresindeki ‘folders/’ kısmından sonra gelen adres değerini kopyalıyorum.
7 – ) ‘gdrive’ ile dosyalarımı Google Drive üzerine taşıyacağımı belirtiyorum. Sonrasında ise kopyaladığım Drive adresini veriyorum. Yükleme işlemi kodu çalıştırdıktan sonra hemen başlamıyor. Bu komutu çalıştırmak için ilk önce ‘pip install dvc[gdrive]’ yazarak kodu dvc için gereken gdrive paketlerini de kuruyoruz. Daha sonra kodu push ederek dosyalarımızı yüklemeye başlıyoruz. Verilen linke tıklayarak DVC’ye Google Drive’a erişebilme izni vermemiz gerekiyor. Gerekli izni verdiğimizde dosya yükleme işlemi gerçekleşiyor.
alper@alper:/mnt/d/work2/data-versioning-dvc/cyberds/dvc-test$ dvc remote add -d gdrive gdrive://19kPv-pLNWSMuMvxVT7PO0rHLMfHfT83v
Setting 'gdrive' as a default remote.
alper@alper:/mnt/d/work2/data-versioning-dvc/cyberds/dvc-test$ dvc push
Your browser has been opened to visit:
<LINK-SANSURLENDI>
Authentication successful.
Pushing
4 files pushed
8 – ) Google Drive üzerindeki klasörü incelediğimizde ‘.dvc’ klasörü içindeki ‘cache’ klasöründeki bilgiler yüklenmiş. Sadece farklı olarak burada dosya isimleri hash değerleri ile değişmiş ve fotoğraflar yüklenmiş.
Buraya kadarki kısımda DVC’deki temel işlevlerden bahsettik. Artık ilk versiyonlama işlemimize geçelim.
10 – ) Şimdi Google Drive üzerine yüklediğimiz veri setini projemizden kaldırıp tekrar uzak sunucudan indirmeye çalışalım. Projedeki ‘images-old’ klasörünü sildikten sonra ‘pull’ komutu ile tekrardan indiriyoruz. İçerisini kontrol ettiğimiz zaman dosyaların geldiğini görebiliyoruz. ‘status’ komutu ile son durumu da görüyoruz.
alper@alper:/mnt/d/work2/data-versioning-dvc/cyberds/dvc-test$ rm -r images-old
alper@alper:/mnt/d/work2/data-versioning-dvc/cyberds/dvc-test$ dvc pull
Collecting |4.00 [00:00, 50.4entry/s]
Fetching
Building workspace index |0.00 [00:00, ?entry/s]
Comparing indexes |5.00 [00:00, 2.85kentry/s]
Applying changes |3.00 [00:00, 50.8file/s]
A images-old/
1 file added
alper@alper:/mnt/d/work2/data-versioning-dvc/cyberds/dvc-test$ ls -R images-old
images-old:
gorsel1.png gorsel2.png gorsel3.png
alper@alper:/mnt/d/work2/data-versioning-dvc/cyberds/dvc-test$ dvc status
Data and pipelines are up to date.
11 – ) Şimdi veri setimize yeni görseller ekleyelim. Görselleri ekledikten sonra tekrar ‘status’ komutunu çalıştıralım.
alper@alper:/mnt/d/work2/data-versioning-dvc/cyberds/dvc-test$ ls -R images-old
images-old:
gorsel1.png gorsel2.png gorsel3.png gorsel4.jpg gorsel5.jpg
alper@alper:/mnt/d/work2/data-versioning-dvc/cyberds/dvc-test$ dvc status
images-old.dvc: changed outs:
modified: images-old
12 – ) Veri setine yeni görseller eklendiği zaman bunları da DVC içerisinde tanıtmamız gerekiyor. Tekrardan ‘add’ komutunu kullanarak yeni fotoğrafları DVC içerisine ekliyoruz. ‘images-old.dvc’ dosyasını kontrol ettiğimiz zaman veri setindeki fotoğraf sayısının 5’e çıktığını görebiliyoruz.
alper@alper:/mnt/d/work2/data-versioning-dvc/cyberds/dvc-test$ dvc add images-old
100% Adding...|████████████████████████████████████████████████████████████████|1/1 [00:00, 2.90file/s] To track the changes with git, run:
git add images-old.dvc
To enable auto staging, run:
dvc config core.autostage true
alper@alper:/mnt/d/work2/data-versioning-dvc/cyberds/dvc-test$ cat images-old.dvc
outs:
- md5: 0eb45a9fcec1be5c6c88673ea02abe80.dir
size: 2071714
nfiles: 5
hash: md5
path: images-old
13 – ) Değiştirilmiş ‘images-old.dvc’ dosyasını da git üzerine ekleyelim ve ikinci commit’imizi oluşturalım.
alper@alper:/mnt/d/work2/data-versioning-dvc/cyberds/dvc-test$ git commit -m '2 yeni veri eklendi.'
[master a1cf6f2] 2 yeni veri eklendi.
1 file changed, 3 insertions(+), 3 deletions(-)
14 – ) Yeni verileri DVC’ye eklediğimiz zaman buluttaki Drive klasörüne otomatik olarak yüklenmiyor. Bunun için tekrardan ‘push’ komutunu çalıştırmamız gerekiyor.
alper@alper:/mnt/d/work2/data-versioning-dvc/cyberds/dvc-test$ dvc push
Collecting |6.00 [00:00, 66.0entry/s]
Pushing
3 files pushed
15 – ) Şimdi veri setimizin ilk haline geri dönelim. Daha önceki versiyona dönmek için ‘git log’ ile commit’leri görüntülüyoruz. ‘git checkout’ komutu ile ilk commit’imize geri dönelim.
alper@alper:/mnt/d/work2/data-versioning-dvc/cyberds/dvc-test$ git log
commit a1cf6f2e27d01a8c32abf5fb72cfa664484b5b2f (HEAD -> master)
Author: Alper Karaca <SANSURLENDI>
Date: Thu Apr 4 16:34:32 2024 +0300
2 yeni veri eklendi.
commit 7dcb97d2e7b8f0c736d2f999ca06e16190e62d52
Author: Alper Karaca <SANSURLENDI>
Date: Thu Apr 4 15:33:57 2024 +0300
Veri setinin ilk hali verisyonlandi.
alper@alper:/mnt/d/work2/data-versioning-dvc/cyberds/dvc-test$ git checkout 7dcb97d2e7b8f0c736d2f999ca06e16190e62d52
M .dvc/config
Note: switching to '7dcb97d2e7b8f0c736d2f999ca06e16190e62d52'.
You are in 'detached HEAD' state. You can look around, make experimental
changes and commit them, and you can discard any commits you make in this
state without impacting any branches by switching back to a branch.
If you want to create a new branch to retain commits you create, you may
do so (now or later) by using -c with the switch command. Example:
git switch -c <new-branch-name>
Or undo this operation with:
git switch -
Turn off this advice by setting config variable advice.detachedHead to false
HEAD is now at 7dcb97d Veri setinin ilk hali verisyonlandi.
16 – ) ‘images-old.dvc’ dosyasını incelediğimizde veri setimizdeki dosya sayısı 3 olarak gözüküyor. Şimdi veri setimizi ve ‘.dvc/cache’ dizinini silelim. ‘pull’ komutu ile veri setimizin ilk versiyonunu çekelim. Veri setini tekrar incelediğimde 3 adet dosya görünüyor fakat Drive üzerinde daha önceden eklediğimiz yeni resimler de duruyor.
alper@alper:/mnt/d/work2/data-versioning-dvc/cyberds/dvc-test$ cat images-old.dvc
outs:
- md5: e4eefd5bc999cdc1b7b55bb53c83b8e5.dir
size: 3239
nfiles: 3
hash: md5
path: images-old
alper@alper:/mnt/d/work2/data-versioning-dvc/cyberds/dvc-test$ rm -rf .dvc/cache
alper@alper:/mnt/d/work2/data-versioning-dvc/cyberds/dvc-test$ rm -rf images-old
alper@alper:/mnt/d/work2/data-versioning-dvc/cyberds/dvc-test$ dvc pull
Collecting |4.00 [00:02, 1.40entry/s]
Fetching
Building workspace index |0.00 [00:00, ?entry/s]
Comparing indexes |5.00 [00:00, 150entry/s]
Applying changes |3.00 [00:00, 54.9file/s]
A images-old/
1 file added and 4 files fetched
alper@alper:/mnt/d/work2/data-versioning-dvc/cyberds/dvc-test$ ls images-old
gorsel1.png gorsel2.png gorsel3.png
DVC ile veri versiyonlama şekli bu şekildedir.