window.lintrk('track', { conversion_id: 13086145 }); Forum posts
top of page

Posts do fórum

Marcos A. H. Boriola
27 de mar de 2023
In A.I. e Machine Learning
Neste artigo vamos mostrar como colocar seu modelo de Machine Learning em um container Docker para ser utilizado através de uma API desenvolvida com o framework Flask. O objetivo é mostrar um breve exemplo de uma aplicação dockerizada, que nada mais é do que garantir que a aplicação vai rodar da mesma forma em qualquer ambiente, seja local, em um servidor on-premises ou em um servidor na cloud. Para conseguir realizar esse pequeno exemplo será necessário ter instalado em seu computador o Docker e o Python. Para fins de exemplo, um modelo de classificação foi treinado utilizando o dataset Iris, disponível no Scikit-Learn. Foi utilizado o algoritmo Logistic Regression e foi aplicado o pré-processamento StandardScaler. Esta pode não ser a melhor abordagem para esse tipo de dado e problema, porém o objetivo é mostrar como colocar o seu modelo em um container Docker e usá-lo para fazer predições através de uma API. O modelo e o pré-processamento foram salvos em arquivos .pkl, que são arquivos binários que podem ser carregados no Python utilizando a biblioteca pickle. O projeto foi estruturado da seguinte forma, cada arquivo será explicado mais a frente: . ├── Dockerfile ├── requirements.txt └── src ├── inference.py ├── model │   ├── model.pkl │   └── scaler.pkl ├── prediction.py └── preprocessing.py O arquivo requirements.txt contém as dependências do projeto, neste caso, apenas o Flask e o Scikit-Learn. Pré-processamento No arquivo preprocessing.py é onde todo o pré-processamento dos dados acontece. No cenário montado para esse exemplo, foi criada uma classe onde carrega o arquivo com o algoritmo de pré-processamento já configurado. Este arquivo nada mais é do que um objeto do tipo StandardScaler, que foi treinado com os dados de treino do dataset Iris. Vale lembrar que outras abordagens podem ser tomadas para esse cenário. import pickle class PreProcessor: def __init__(self): self.scaler = pickle.load(open('./model/scaler.pkl', 'rb')) def preprocess(self, data): data = self.scaler.transform(data) return data Modelo No arquivo prediction.py é onde o modelo é carregado e utilizado para fazer predições. Nesta etapa é criada a classe responsável pela inferência, onde é carregado o modelo e criado uma instância da classe do pré-processamento. Por fim, é criado o método predict que recebe os dados, aplica o pré-processamento e retorna a predição. from preprocessing import PreProcessor import pickle class Prediction: def __init__(self): self.preprocessor = PreProcessor() self.model = pickle.load(open('./model/model.pkl', 'rb')) def predict(self, data): data = self.preprocessor.preprocess(data) return self.model.predict(data) Inferência No arquivo inference.py é onde a API é criada e o modelo é carregado. Aqui é criado uma instância da classe Prediction e a rota de predição da API é criada com o Flask. A rota de predição basicamente recebe os dados em formato JSON, faz a predição em cima dos dados e retorna a predição em formato JSON. Uma etapa importante quando estamos utilizando o Flask é executar o comando app.run(). Neste comando podemos configurar a porta que a API vai rodar, no caso foi configurado a porta 5000, e também o IP do host, que foi configurado como 0.0.0.0 para que seja acessível fora do container Docker. from prediction import Prediction from flask import Flask, request, jsonify app = Flask(__name__) model = Prediction() @app.route('/predict', methods=['POST']) def predict(): data = request.get_json(force=True) data = data['data'] prediction = model.predict([data]).tolist() return jsonify(prediction=prediction) if __name__ == '__main__': app.run(host='0.0.0.0', port=5000) Container Docker No arquivo Dockerfile é onde o container Docker é configurado. Nele configuramos todos os detalhes para que o container execute nossa API. Primeiro é definido a imagem base, no caso foi utilizado a imagem python:3.9-slim, que é uma imagem oficial do Python com o Python 3.9 e o gerenciador de pacotes pip. Em seguida é instalado as dependências do projeto, que estão definidas no arquivo requirements.txt. Após isso, todo o código do projeto é copiado para a pasta /app dentro do container. Em seguida é definido o diretório padrão para /app e exposto a porta 5000, que é a porta utilizada pelo Flask. Por fim, é definido o comando que será executado quando o container for iniciado, no caso é o arquivo inference.py. FROM python:3.9-slim # Instala as dependências do projeto COPY requirements.txt ./requirements.txt RUN pip install --no-cache-dir -r requirements.txt # Copia todo o código para a pasta /app COPY ./src /app # Configura o diretório padrão para /app WORKDIR /app # Expõe a porta 5000, porta utilizada pelo Flask EXPOSE 5000 # Executa o arquivo inference.py quando o container for iniciado CMD ["python", "inference.py"] Executando o container Antes de executar o container, é necessário criar a imagem do container. Para isso, basta executar o comando abaixo na pasta raiz do projeto: docker build -t minha-api . O argumento -t é utilizado para definir o nome da imagem, no caso foi utilizado minha-api. E o argumento . é utilizado para definir o diretório onde o Dockerfile está localizado. Após a criação da imagem, basta executar o comando abaixo para iniciar o container: docker run -d -p 5000:5000 minha-api O argumento -d é utilizado para executar o container em modo detached, ou seja, o container vai rodar em background e o argumento -p é utilizado para fazer o mapeamento da porta do host para a porta do container. Testando a API Para testar a API, basta executar o comando abaixo: curl -X POST -H "Content-Type: application/json" -d '{"data": [5.1, 3.5, 1.4, 0.2]}' http://localhost:5000/predict
Colocando seu modelo de Machine Learning em um container Docker content media
0
0
88
Marcos A. H. Boriola
22 de mar de 2023
In A.I. e Machine Learning
Uma pipeline de machine learning nada mais é que uma sequência de etapas que devem ser executadas para treinar um modelo de machine learning e poder utilizá-lo para fazer previsões. Neste artigo mostrarei as etapas principais para desenvolver sua pipeline. Análise exploratória A análise exploratória consiste em investigar os dados para entender melhor o problema que estamos tentando resolver. É importante entender como os dados estão estruturados, quais são as variáveis, quais são as relações entre elas, quais são as variáveis mais importantes, etc. Esta etapa não faz parte da pipeline de machine learning, mas é importante para que possamos entender melhor o problema e seus dados para conseguir encontrar as melhores abordagens para desenvolvimento do modelo. Pré-processamento A etapa de pré-processamento tem como função preparar os dados para as etapas de treinamento e/ou inferência. É nesta etapa que são corrigidos e ajustados os dados com base no que foi encontrado na análise exploratória. Os algoritmos utilizados nesta etapa vão depender do tipo de problema que estamos tentando resolver. Por exemplo, se o problema for de classificação, podemos utilizar algoritmos de redução de dimensionalidade, como o PCA, para reduzir a dimensionalidade dos dados e facilitar o treinamento do modelo. Se o problema for de regressão, podemos utilizar algoritmos de normalização, como o MinMaxScaler, para normalizar os dados e facilitar o treinamento do modelo. Além disso, nesta etapa é importante definir estratégias para lidar com dados faltantes, pois eles podem ocorrer no ambiente de produção e podem causar problemas no modelo. Validação de dados A validação de dados é uma etapa importante para garantir que os dados estejam corretos e que não haja nenhum problema que possa causar problemas no modelo. Esta etapa é importante para garantir que o modelo não seja treinado com dados incorretos e que o modelo não seja utilizado para fazer previsões com dados incorretos. Nesta etapa testes são aplicados nos dados para garantir que eles estão da forma esperada pelo modelo. Por exemplo, se o modelo espera receber dados numéricos, podemos testar se os dados recebidos são numéricos. Se o modelo espera receber dados categóricos, podemos testar se os dados recebidos são categóricos. Se o modelo espera receber dados com uma determinada quantidade de colunas, podemos testar se os dados recebidos possuem a quantidade de colunas esperada. Testes unitários podem ser utilizados para certificar que os dados estão como esperado e outros tipos de testes podem ser aplicados até para detecção de data drift. Separação de dados A separação dos dados é uma etapa crucial no desenvolvimento de modelos de machine learning, essa etapa envolve a divisão dos dados disponíveis em dois ou três conjuntos distintos. Os dados podem ser divididos em um conjunto de treinamento e um conjunto de testes, porém muitas vezes o conjunto de treinamento é dividido em um conjunto de treinamento e um conjunto de validação. O conjunto de treinamento é usado para ajustar os parâmetros do modelo, ou seja, é com esse conjunto que o modelo aprende a relação entre as variáveis de entrada e saída. Já o conjunto de teste é usado para avaliar o desempenho do modelo em dados não vistos durante o treinamento. Quando o conjunto de treinamento é dividido em um conjunto de treinamento e um conjunto de validação, o conjunto de validação é usado para avaliar o desempenho do modelo durante o treinamento, permitindo que o modelo seja ajustado para melhorar o seu desempenho. A separação dos dados deve ser feita de forma aleatória e estratificada, de modo a evitar vieses na seleção dos dados. Isso significa que a proporção de cada classe presente nos dados deve ser mantida nos conjuntos de treinamento e teste. Além disso, é importante que a quantidade de dados em cada conjunto seja suficiente para representar adequadamente o problema em questão. Uma prática comum é usar uma proporção de 70%-30% ou 80%-20% para a divisão dos dados entre treinamento e teste, respectivamente. No entanto, dependendo do tamanho do conjunto de dados disponível e da complexidade do modelo, outras proporções podem ser mais adequadas. Em resumo, a etapa de separação dos dados é fundamental para garantir a qualidade e a generalização do modelo de machine learning, permitindo avaliar a capacidade de generalização do modelo em novos dados. Treinamento e validação A etapa de treino e validação do modelo é onde o modelo é treinado com o conjunto de treinamento e validado com o conjunto de validação para avaliar o seu desempenho. O processo de treinamento envolve a apresentação do conjunto de dados de treinamento ao modelo, que vai ajustando seus parâmetros para minimizar a diferença entre as previsões e os valores reais dos dados. Esse ajuste é feito por meio da minimização de uma função de perda, que é uma medida da diferença entre as previsões do modelo e os valores reais dos dados. Após o treinamento, o modelo é avaliado com o conjunto de validação para verificar se ele é capaz de generalizar adequadamente para novos dados que não foram vistos durante o treinamento. É importante ressaltar que a avaliação deve ser realizada de forma objetiva e sem viés, utilizando métricas de desempenho apropriadas para o problema em questão. Se o desempenho do modelo no conjunto de dados de validação não for satisfatório, pode ser necessário ajustar os hiperparâmetros do modelo, que são os parâmetros que controlam o processo de treinamento. A etapa de treino e validação é um processo iterativo que pode ser repetido várias vezes até que se alcance um modelo satisfatório. É importante lembrar que o objetivo final do modelo de machine learning é ser capaz de generalizar para novos dados e, portanto, a avaliação do seu desempenho em um conjunto de dados de validação é fundamental para verificar se o modelo atende a esse objetivo. Teste A etapa de teste é uma das etapas finais do processo de treinamento de um modelo. Nessa etapa, o modelo treinado é avaliado em um conjunto de dados de teste que não foi usado durante o treinamento. O objetivo principal dessa etapa é avaliar a capacidade do modelo de generalizar para novos dados que não foram vistos durante o treinamento. Isso é importante porque o objetivo final do modelo é ser capaz de fazer previsões precisas em dados que nunca viu antes. Durante a etapa de teste, o conjunto de dados de teste é passado pelo modelo treinado e as previsões do modelo são comparadas com as respostas verdadeiras do conjunto de dados de teste. As métricas de desempenho, como a precisão, o recall, a F1-score, a acurácia e a curva ROC, são calculadas com base nessas comparações. Se o desempenho do modelo na etapa de teste for satisfatório, ele pode ser considerado para uso em produção. Caso contrário, pode ser necessário ajustar os hiperparâmetros do modelo ou revisar o conjunto de dados de treinamento. É importante destacar que a etapa de teste deve ser realizada em um conjunto de dados completamente separado do conjunto de dados de treinamento e validação, para evitar o overfitting e avaliar de forma justa o desempenho do modelo. Inferência A etapa de inferência é basicamente a etapa de teste, porém em produção. Nesta etapa, o modelo treinado é utilizado para fazer previsões em novos dados e como os dados são novos, os dados devem passar pela etapa de pré-processamento e, se necessário, pela etapa de validação de dados. Essas etapas são necessárias para garantir que os dados estejam na forma esperada pelo modelo. Com os dados formatados de acordo com o modelo, o modelo é utilizado para fazer previsões e as previsões são enviadas para o usuário final, para um banco de dados ou algum outro local para ser armazenado.
Pipeline de Machine Learning content media
0
0
145

Marcos A. H. Boriola

Mais ações
bottom of page