. OTUS Machine Learning: . , -, : « ML» « ».Na primeira parte deste tutorial, salvamos com sucesso seu modelo de classificação em um diretório local e concluímos todo o trabalho de desenvolvimento do modelo do Notebook Jupyter. Deste ponto em diante, o foco será na implantação do nosso modelo. Para reutilizar o modelo para predição, você pode simplesmente carregá-lo e chamar o método
predict()como faria normalmente em um Notebook Jupyter.
Para testar o modelo, na mesma pasta do arquivo
model.pkl, crie um arquivo main.pycom este código:
import pickle
# ,
import numpy as np
from sklearn.neighbors import KNeighborsClassifier
#
with open('./model.pkl', 'rb') as model_pkl:
knn = pickle.load(model_pkl)
# ( )
unseen = np.array([[3.2, 1.1, 1.5, 2.1]])
result = knn.predict(unseen)
#
print('Predicted result for observation ' + str(unseen) + ' is: ' + str(result))
Reutilizando o modelo para previsão.
Você pode chamar o método preditor várias vezes em observações desconhecidas sem reiniciar o processo de treinamento. No entanto, ao executar este arquivo py no terminal, você pode encontrar um erro como este:
Traceback (most recent call last):
File "main.py", line 4, in <module>
from sklearn.neighbors import KNeighborsClassifier
ImportError: No module named sklearn.neighbors
Isso ocorre porque o pacote que estamos usando não está disponível no ambiente em que você executa o arquivo. Isso significa que o ambiente usado para desenvolver o modelo (conda) não é idêntico ao tempo de execução (ambiente python fora de conda) e isso pode ser visto como um problema potencial ao executar nosso código em outros ambientes. Eu queria especificamente que você visse esse erro para ajudá-lo a entender o problema e para enfatizar novamente a importância de usar contêineres para implantar nosso código para evitar tais problemas. Por enquanto, você pode simplesmente instalar manualmente todos os pacotes necessários usando o comando "pip install". Voltaremos aqui mais tarde para fazer isso automaticamente.
Depois de instalar todos os pacotes e executar o arquivo com sucesso, o modelo deve retornar rapidamente a seguinte mensagem:
Predicted result for observation [[3.2 1.1 1.5 2.1]] is: [1]
Como você pode ver aqui, usamos dados desconhecidos codificados para testar o modelo. Esses números representam o comprimento da sépala, sua largura, o comprimento da pétala e sua largura, respectivamente. No entanto, como queremos expor nosso modelo como um serviço, ele deve ser exposto como uma função que aceita solicitações contendo esses quatro parâmetros e retorna um resultado de predição. Essa função pode então ser usada para um servidor de API (back-end) ou implantada em um tempo de execução sem servidor, como o Google Cloud Functions . Neste tutorial, tentaremos construir um servidor de API juntos e colocá-lo em um contêiner do Docker.
Como funciona a API?
Vamos falar sobre como os aplicativos da web funcionam hoje. A maioria dos aplicativos da web tem dois componentes principais que cobrem quase todas as funcionalidades de que um aplicativo precisa: front-end e back-end. O front-end é focado em servir a interface (página da web) para o usuário, enquanto o servidor front-end geralmente armazena HTML, CSS, JS e outros arquivos estáticos, como imagens e sons. Por outro lado, o servidor de back-end tratará de toda a lógica de negócios que responde a todas as solicitações enviadas do front-end.
Ilustração da estrutura das aplicações web .
Isso é o que acontece quando você abre o Medium em seu navegador.
- HTTP-
medium.com. DNS-, , . ., . -
* .html,* .css,* .js, - . - Medium . , «clap» () .
- (javascript) HTTP- id . URL- , . id XXXXXXX.
- (, ) .
- .
- , .
Claro, este pode não ser exatamente o mesmo processo que acontece ao usar o aplicativo da web Medium e, na verdade, seria muito mais complicado do que isso, mas esse processo simplificado pode ajudar você a entender como um aplicativo da web funciona.
Agora eu quero que você se concentre nas setas azuis na imagem acima. Essas são solicitações HTTP (enviadas do navegador) e respostas HTTP (recebidas pelo navegador ou enviadas para o navegador). Os componentes que processam solicitações do navegador e retornam respostas ao servidor backend são chamados de “APIs”.
Abaixo está a definição da API:
(API — application program interface) — , . , API , .
API!
Há muitos frameworks que nos ajudam a construir APIs usando Python, incluindo Flask, Django, Pyramid, Falcon e Tornado. As vantagens e desvantagens, bem como uma comparação dessas estruturas, são listadas aqui . Usarei o Flask para este tutorial, mas a técnica e o fluxo de trabalho permanecem os mesmos dos outros e, como alternativa, você pode usar sua estrutura favorita neste momento.
A versão mais recente do Flask pode ser instalada via pip usando este comando:
pip install Flask
Tudo o que você precisa fazer agora é transformar o código da etapa anterior em uma função e registrar um endpoint de API para ele após inicializar seu aplicativo Flask. Por padrão, um aplicativo Flask é executado no host local (127.0.0.1) e ouvirá solicitações na porta 5000.
import pickle
# ,
import numpy as np
import sys
from sklearn.neighbors import KNeighborsClassifier
# Flask API
from flask import Flask, request
#
with open('./model.pkl', 'rb') as model_pkl:
knn = pickle.load(model_pkl)
# Flask
app = Flask(__name__)
# API
@app.route('/predict')
def predict_iris():
#
sl = request.args.get('sl')
sw = request.args.get('sw')
pl = request.args.get('pl')
pw = request.args.get('pw')
# predict
#
unseen = np.array([[sl, sw, pl, pw]])
result = knn.predict(unseen)
#
return 'Predicted result for observation ' + str(unseen) + ' is: ' + str(result)
if __name__ == '__main__':
app.run()
Representando seu modelo como uma API
No terminal, você deve ver o seguinte:
* Serving Flask app "main" (lazy loading)
* Environment: production
WARNING: This is a development server. Do not use it in a production deployment.
Use a production WSGI server instead.
* Debug mode: off
* Running on http://127.0.0.1:5000/ (Press CTRL+C to quit)
Abra seu navegador e digite a seguinte consulta na barra de endereço:
http://localhost:5000/predict?sl=3.2&sw=1.1&pl=1.5&pw=2.1
Se algo assim aparecer em seu navegador, parabéns! Agora você está expondo seu modelo de aprendizado de máquina como um serviço com um endpoint de API.
Predicted result for observation [['3.2' '1.1' '1.5' '2.1']] is: [1]
Teste de API com Postman
Recentemente, usamos nosso navegador para testes rápidos de API, mas essa não é uma maneira muito eficiente. Por exemplo, não poderíamos usar o método GET, mas em vez disso, usar o método POST com o token de autenticação no cabeçalho, e não é fácil fazer o navegador enviar tal solicitação. No desenvolvimento de software, o Postman é amplamente usado para testar APIs e é totalmente gratuito para uso básico.
Postman UI (da página de download do Postman )
Depois de baixar e instalar o Postman, abra a ferramenta e siga as instruções abaixo para enviar sua solicitação.
Enviando uma solicitação GET com Postman
- , GET , API GET . , POST .
- URL .
- . , .
- «», API.
- .
- HTTP-. .
Agora que você sabe como expor seu modelo de aprendizado de máquina como um serviço por meio de um endpoint de API e testar esse endpoint com Postma, a próxima etapa é contêinerizar seu aplicativo com Docker, onde veremos mais de perto como o Docker funciona e como ele pode nos ajudar. resolver todos os problemas de dependência que encontramos antes.
Leia a primeira parte.