Neste artigo, veremos como utilizar o Data Version Control (DVC) para versionamento de datasets e modelos de IA. Serão abordados tópicos como caso de uso, vantagens e desvantagens, como funciona, como usar e como aumentar a eficiência do DVC.
Caso de Uso: armazenamento de arquivos e diretórios grandes em um repositório de arquivos separado
Em desenvolvimento de software é comum o uso da ferramenta Git para versionamento de código, porém, em projetos de Aprendizado de Máquina, para reproduzir a execução de um experimento é necessário, além da versão correta do código, a versão correta dos conjuntos de dados utilizados para o treinamento do modelo de predição ou classificação.
O Git não foi feito para guardar arquivos binários grandes ou em grande quantidade, como é o caso de datasets e modelos. Além de não ser eficiente para isso, repositórios Git remotos tem limite de tamanho que podem ser insuficientes.
O DVC permite continuar utilizando o Git para fazer versionamento de controle, porém armazenando arquivos e diretórios grandes, como datasets e modelos, em um repositório de arquivos separado do repositório Git.
Quais são as vantagens de utilizar o DVC?
- Permite controlar versões de datasets e modelos juntamente com código;
- É possível renomear e modificar arquivos sem nenhum problema, diferente do que ocorre quando o controle de versão é feito manualmente (ex: guardando os caminhos para arquivos usados em um arquivo de texto);
- Além de versionamento, permite construir pipelines de transformação de dados na forma de Grafos Acíclicos Direcionados;
- É simples e não requer servidor centralizado.
Quais as desvantagens e limitações de usar o DVC?
- O recomendado é evitar o uso no Windows, dando preferência para o Linux;
- Não possui interface gráfica, sendo inconveniente para comparar resultados e gerenciar modelos armazenados;
- Serve apenas para fazer o controle de versões de arquivos, não ajuda em dados armazenados em Bancos de Dados.
Como o DVC funciona?
Geralmente, ao se utilizar o Git, o comando “git add” é aplicado para começar a fazer o controle de versão de um arquivo. O comando “dvc add” pode ser utilizado dentro de um repositório git para arquivos ou diretórios grandes, ao invés de “git add”.
Nesse caso, os arquivos serão ignorados pelo git, ou seja, quando se fizer “git push” para enviar o código para o repositório git remoto, os arquivos controlados pelo DVC não serão enviados juntos. Ao invés disso, todas as versões de todos os arquivos controlados pelo DVC, mesmo aqueles que foram apagados em versões mais recentes, ficam guardados em um cache local.
O cache do DVC pode ser sincronizado com um cache remoto, utilizando serviços próprios para dados binários. A única coisa que não é ignorada pelo git é um arquivo de metadados simples e pequeno, que o DVC mantém para saber quais arquivos do cache correspondem a versão atual do código.
Como usar o DVC?
Após instalar o git e o DVC, use o comando “dvc init” em um terminal para adicionar o DVC ao repositório git. Serão criados alguns arquivos que deverão ser adicionados ao controle de versão com “git add” e “git commit”.
git clone URL_my_git_repo
cd my_git_repo
dvc init
git add .
git commit -m “Initialize DVC”
Nesse exemplo, vamos imaginar o caso em que criamos uma pasta dataset no repositório, para a qual vamos copiar milhares de arquivos.
mkdir ./dataset
cp path_of_files ./dataset
Para adicionar essa pasta ao controle de versão do DVC ao invés do git, podemos utilizar “dvc add”. Será gerado um arquivo de metadata que deve ser adicionado ao controle de versão do git com “git add” e “git commit”.
dvc add dataset
git add .
git commit -m “Added first dataset files”
Após alterar o dataset (copiando novos arquivos, por exemplo), é possível usar o comando “dvc status” para verificar quais pastas/arquivos foram alterados.
cp path_of_files ./dataset
dvc status
Para atualizar a versão do dataset, basta repetir o procedimento feito anteriormente.
dvc add dataset
git add .
git commit -m “Added more files”
O comando “dvc remote add” pode ser utilizado para configurar o repositório remoto (ex: um cloud storage). O comando “dvc push” envia mudanças para o cache remote e o comando “dvc pull” recebe mudanças.
Utilizando o comando “git log” é possível ver o histórico e o hash que identifica cada versão. Para voltar a uma versão anterior, basta utilizar “git checkout” seguido de “DVC checkout”.
Como aumentar a eficiência?
É possível utilizar capacidades do sistema operacional para evitar ter que copiar arquivos do cache local para a pasta do repositório git, evitando arquivos duplicados. Para isso, habilite a utilização de “hardlinks” e “symlinks”.
Nesse caso, o DVC irá gerar links para os arquivos originais no lugar de copiá-los.
Para editar arquivos, será necessário usar “dvc unprotect” antes.
dvc config cache.type hardlink,symlink
dvc checkout –relink
Caso o dataset não caiba no PC que estiver usando, é possível utilizar o parâmetro “–external” para fazer controle de versão de arquivos que se encontram fora da pasta do repositório git. Imagine, por exemplo, que foi feito mount de um storage externo em “/storage” e que foi feito o download do dataset em “/storage/dataset”.
Nesse caso, poderíamos utilizar a opção “–external” como mostrado abaixo, mantendo o cache remoto (no storage externo) em vez de local (no seu PC).
dvc config cache.dir /storage/dvc_cache
dvc add –external /storage/dataset
git add .; git commit; git push
Como vimos, o DVC pode ser conveniente para controlar a versão de datasets, atrelando o código de treinamento aos dados utilizados. No entanto, para controle de artefatos como modelos e resultados, pode ser mais conveniente utilizar outras ferramentas com GUI para ajudar na comparação e gerenciamento, como o ML Flow, por exemplo.