Verificar código localmente
Sempre que altera qualquer código em seu projeto de machine learning, você deseja verificar a qualidade do código e do modelo.
Durante a integração contínua, você cria e verifica ativos de seu aplicativo. Como cientista de dados, você provavelmente se concentrará na criação de scripts usados para preparação de dados e treinamento de modelo. O engenheiro de machine learning usa os scripts posteriormente em pipelines para automatizar esses processos.
Para verificar scripts, há duas tarefas comuns:
- Linting: verifique se há erros programáticos ou estilísticos em scripts de Python ou R.
- Teste de unidade: verifique o desempenho do conteúdo dos scripts.
Verificando o código, você evita bugs ou problemas quando o modelo é implantado. Você pode verificar o código localmente executando linters e testes de unidade localmente em um IDE como o Visual Studio Code.
Você também pode executar linters e testes de unidade em um fluxo de trabalho automatizado com o Azure Pipelines ou o GitHub Actions.
Você aprenderá a executar testes de unidade e linting no Visual Studio Code.
Executar lint no código
A qualidade do código depende dos padrões com que você e sua equipe concordam. Para garantir que a qualidade acordada seja atendida, você pode executar linters que verificarão se o código está em conformidade com os padrões da equipe.
Dependendo da linguagem de código utilizada, há várias opções para executar lint no código. Por exemplo, se você trabalha com Python, pode usar Flake8 ou Pylint.
Usar Flake8 para executar lint no código
Para usar o Flake8 localmente com o Visual Studio Code:
- Instale o Flake8 com
pip install flake8
. - Crie um arquivo de configuração
.flake8
e armazene-o em seu repositório. - Configure o Visual Studio Code para usar o Flake8 como linter acessando suas configurações (
Ctrl+,
). - Pesquise por
flake8
. - Defina Python > Linting > Flake8 Habilitado.
- Defina o caminho do Flake8 como o local no repositório em que você armazenou o arquivo
.flake8
.
Para especificar os padrões de sua equipe para a qualidade do código, você pode configurar o linter Flake8. Um método comum para definir os padrões é criar um arquivo .flake8
que é armazenado com seu código.
O arquivo .flake8
deve começar com [flake8]
, seguido por qualquer uma das configurações que você deseja usar.
Dica
Uma lista completa de possíveis parâmetros de configuração pode ser encontrada na Documentação do Flake8.
Por exemplo, se quiser especificar que o comprimento máximo de qualquer linha não pode ultrapassar 80 caracteres, você adicionará a seguinte linha ao arquivo .flake8
:
[flake8]
max-line-length = 80
O Flake8 tem uma lista predefinida de erros que pode retornar. Além disso, você pode usar códigos de erro baseados no Guia de estilo do PEP 8. Por exemplo, você pode incluir códigos de erro que se referem ao uso adequado de recuos ou espaços em branco.
Você pode optar por selecionar (select
) um conjunto de códigos de erro que farão parte do linter ou selecionar quais códigos de erro ignorar (ignore
) na lista padrão de opções.
Como resultado, seu arquivo de configuração .flake8
pode se parecer com o seguinte exemplo:
[flake8]
ignore =
W504,
C901,
E41
max-line-length = 79
exclude =
.git,
.cache,
per-file-ignores =
code/__init__.py:D104
max-complexity = 10
import-order-style = pep8
Dica
Para ter uma visão geral dos códigos de erro a que pode fazer referência, confira a Lista de erros do Flake8
Quando tiver configurado o Visual Studio Code para executar lint de seu código, você pode abrir qualquer arquivo de código para examinar os resultados do lint. Avisos e erros estarão sublinhados. Selecione Exibir problema para inspecionar o problema e entender o erro.
Lint com Azure Pipelines ou GitHub Actions
Você também pode executar o linter automaticamente com o Azure Pipelines ou o GitHub Actions. O agente fornecido por qualquer uma das plataformas executará o linter quando você:
- Criar um arquivo de configuração
.flake8
e armazená-lo em seu repositório. - Definir o pipeline de integração contínua ou o fluxo de trabalho no YAML.
- Como uma tarefa ou etapa, instale o Flake8 com
python -m pip install flake8
. - Como uma tarefa ou etapa, execute o comando
flake8
para executar lint de seu código.
Testes de unidade
Enquanto o linting verifica como você escreveu o código, os testes de unidade verificam como ele funciona. Unidades se referem ao código que você cria. Senso assim, os testes de unidade também são conhecidos como testes de código.
Como melhor prática, seu código deve existir principalmente fora das funções. Isso se aplica quer você tenha criado funções para preparar dados ou para treinar um modelo. Você pode aplicar testes de unidade, por exemplo, para:
- Verificar se os nomes de coluna estão corretos.
- Verificar o nível de previsão do modelo em novos conjuntos de dados.
- Verificar a distribuição dos níveis de previsão.
Ao trabalhar com Python, você pode usar Pytest e Numpy (que usa a estrutura Pytest) para testar seu código. Para saber mais sobre como trabalhar com Pytest, Saiba como escrever testes com Pytest.
Dica
Examine um passo a passo mais detalhado dos Testes de Python no Visual Studio Code.
Imagine você criou um script de treinamento train.py
que contém a seguinte função:
# Train the model, return the model
def train_model(data, ridge_args):
reg_model = Ridge(**ridge_args)
reg_model.fit(data["train"]["X"], data["train"]["y"])
return reg_model
Suponha que você tenha armazenado o script de treinamento no diretório src/model/train.py
em seu repositório. Para testar a função train_model
, você precisa importar a função de src.model.train
.
Você cria o arquivo test_train.py
na pasta tests
. Uma maneira de testar o código Python é usar numpy
. O Numpy oferece várias funções assert
para comparar matrizes, cadeias de caracteres, objetos ou itens.
Dica
Saiba mais sobre as diretrizes de teste ao usar testes Numpy e sobre o suporte paras teste do Numpy.
Por exemplo, para testar a função train_model
, você pode usar um pequeno conjunto de dados de treinamento e usar assert
para verificar se as previsões são quase iguais às métricas de desempenho predefinidas.
import numpy as np
from src.model.train import train_model
def test_train_model():
X_train = np.array([1, 2, 3, 4, 5, 6]).reshape(-1, 1)
y_train = np.array([10, 9, 8, 8, 6, 5])
data = {"train": {"X": X_train, "y": y_train}}
reg_model = train_model(data, {"alpha": 1.2})
preds = reg_model.predict([[1], [2]])
np.testing.assert_almost_equal(preds, [9.93939393939394, 9.03030303030303])
Para testar o código no Visual Studio Code usando a interface do usuário:
- Instale todas as bibliotecas necessárias para executar o script de treinamento.
- Verifique se
pytest
está instalado e habilitado no Visual Studio Code. - Instale a extensão do Python para o Visual Studio Code.
- Selecione o script
train.py
que deseja testar. - Selecione a guia Testes no menu esquerdo.
- Configure os testes de Python selecionando pytest e definindo o diretório de teste para sua pasta
tests/
. - Execute todos os testes selecionando o botão Executar e examine os resultados.
Para executar testes em um Pipeline do Azure DevOps ou no GitHub Action:
- Verifique se todas as bibliotecas necessárias estão instaladas para executar o script de treinamento. O ideal é usar uma listagem
requirements.txt
de todas as bibliotecas compip install -r requirements.txt
- Instalar
pytest
compip install pytest
- Executar os testes com
pytest tests/
Os resultados dos testes serão mostrados na saída do pipeline ou do fluxo de trabalho executado.
Observação
Se durante o linting ou os testes de unidade um erro for retornado, o pipeline de CI poderá falhar. Portanto, é melhor verificar seu código localmente primeiro antes de disparar o pipeline de CI.