Os 3 passos para publicar seu modelo de Machine Learning na Web

Cínthia Pessanha
cinthiabpessanha
Published in
5 min readOct 20, 2019

A disciplina de inteligência artificial já existe há muitos anos nas grades curriculares de cursos de ciência da computação mundo afora. O poder e a matemática que há por trás de uma rede neural, por exemplo, já é conhecido há pelo menos uma década. A diferença é que, há uma década atrás, para você utilizar seu modelo de machine learning na web, por exemplo, era necessário implementar todo o algoritmo do zero em uma linguagem como javascript, java, entre outras.

Sem dúvida a popularização de bibliotecas Python e o surgimentos de frameworks javascript que dão suporte ao desenvolvimento de modelos de inteligência artificial foram os principais responsáveis pela crescente adoção de soluções de IA no mercado. E é essa a razão de ser deste artigo: como Python pode te ajudar a publicar seu modelo de machine learning na web seguindo apenas 3 passos!

Passo 1: Salvando um modelo de ML

O primeiro passo para disponibilizarmos nosso modelo em algum lugar é achar uma forma de salvá-lo e recuperá-lo. Atualmente existem 2 bibliotecas do Python que viabilizam isso: Pickle e Joblib, esta última, disponível no SciKit Learn. A diferença entre elas está basicamente no desempenho de cada uma com grandes arrays NumPy, por exemplo. De acordo com a documentação, a Joblib tem um desempenho melhor com grande volume de dados (big data). Porém, para o nosso propósito, elas não apresentam diferenças relevantes.

As duas possuem sintaxe semelhante:

import pickle#save the model to disk
filename = ‘finalized_model.sav’
pickle.dump(model, open(filename, ‘wb’))
#loading model from disk
loaded_model = pickle.load(open(filename, ‘rb’))

Os parâmetros wb (write binary)e rb (read binary) são referentes ao open e podem ser entendidos com mais detalhes aqui.

from sklearn.externals import joblib# save the model to disk
filename = 'finalized_model.sav'
joblib.dump(model, filename)
# get model from disk
loaded_model = joblib.load(filename)

É importante ressaltar que o resultado retornado por um modelo de ML fica dentro de um array. E será necessário fazer esse tratamento de obtenção do retorno da ML em sua API.

Passo 2: Criando uma API

Já sabemos como salvar e como recuperar um modelo de ML. O próximo passo é fazer isso em um ambiente acessível por uma requisição web. O framework Flask é perfeito para isso, pois além de ser um ambiente Python (podemos usar o pickle e o joblib para recuperar nosso modelo de ML), ele provê diversos mecanismos que auxiliam no desenvolvimento de uma API:

Configurando CORS

CORS (Cross-origin resource sharing) é um mecanismo que usa cabeçalhos adicionais HTTP para informar a um navegador que permita que um aplicativo Web seja executado em uma origem (domínio) com permissão para acessar recursos selecionados de um servidor em uma origem distinta. Ou seja: sua API precisa permitir ser acessado a partir de domínios diferentes (cross-domain). Neste sentido, é necessário habilitar o CORS e definir quais verbos HTTP são permitidos. POST, por exemplo, é um verbo HTTP para disparar uma chamada a um serviço enviando dados no corpo da requisição.

Abaixo seguem exemplos de erros retornados no console do navegador quando ou o CORS ou os verbos HTTP não estão configurados:

Erro retornado pelo console do navegador quando a especificação do API não menciona os verbos HTTP permitidos
Erro retornado pelo console do navegador quando o CORS não está habilitado

Para habilitar o CORS na sua aplicação FLASK:

É possível que em algum momento o erro de CORS seja retornado devido a algum outro problema, em especial por conta de erro de sintaxe ou de lógica na API. Neste contexto, o erro não aparecerá no console do navegador, mas sim no próprio ambiente onde a API se encontra.

Um outro fator importante é a forma como uma requisição é disparada por alguns browsers. Se analisarmos o que trafega no momento que o POST é disparado, por exemplo, é possível visualizar 2 chamadas a nossa API. Isso não significa que a API está sendo chamada 2 vezes, mas sim que a primeira chamada verifica se o método que está sendo chamado existe e está autorizado; caso positivo, a segunda chamada é feita por completo.

Recebendo a requisição

O Flask provê a biblioteca request para que seja possível acessar os dados de entrada trafegados via request.

Suporte a JSON

JSON (JavaScript Object Notation — Notação de Objetos JavaScript) é uma notação amplamente difundida e utilizada no desenvolvimento de APIs e aplicações web em geral. Na construção da API, ele ficará com a responsabilidade de retornar o resultado obtido pelo modelo de machine learning. Para isso, podemos utilizar a biblioteca jsonify do Flask:

Passo 3: Disparando POST (testando nossa API)

Último passo! Testando nossa API! Neste exemplo, vamos acionar a API via uma aplicação Angular. Cada linguagem de programação tem seu “jeitinho” de disparar uma requisição.

O trecho de código acima representa uma forma de disparar um post utilizando Angular/Typescript. O pacote HttpClient, nativo do angular, permite que se dispare um POST com parâmetros, que são os dados de entrada da nossa ML. Note que a variável cmd é que armazena esses dados de entrada.

A partir do momento que sua API estiver disponível em um container ou em algum servidor, basta substituir o conteúdo da variável URL para o endereço onde a API se encontra. No exemplo acima, o endereço fornecido é o endereço padrão (localhost — http://127.0.0.1/5000) do Flask.

Portanto, é possível concluir que o Python fornece um conjunto completo de ferramentas para que o desenvolvimento de modelos de machine learning possa ir muito além de análises exploratórias de dados. Além disso, apesar deste artigo não ter utilizado o próprio Flask para criar uma aplicação web para disparar o POST para a API, o framework permite que isso seja feito. No entanto, é bom lembrar que existem diversas linguagens muito mais adequadas para o desenvolvimento de aplicações web robustas e manuteníveis.

Para ver um exemplo completo desta API, acesse https://github.com/cinthiabpessanha/macae-tech-meetup-machine-learning/tree/master/API%20Flask

--

--