Tutorial: Aplicar modelos de machine learning em Funções do Azure com Python e TensorFlow

Neste artigo, vai aprender a utilizar Python, TensorFlow e Funções do Azure com um modelo de machine learning para classificar uma imagem com base nos respetivos conteúdos. Uma vez que trabalha localmente e não cria recursos do Azure na cloud, não há custos para concluir este tutorial.

  • Inicialize um ambiente local para desenvolver Funções do Azure em Python.
  • Importe um modelo de machine learning do TensorFlow personalizado para uma aplicação de funções.
  • Crie uma API HTTP sem servidor para classificar uma imagem como contendo um cão ou um gato.
  • Consumir a API numa aplicação Web.

Pré-requisitos

Verificação de pré-requisitos

  1. Numa janela de terminal ou comando, execute func --version para verificar se o Funções do Azure Core Tools é a versão 2.7.1846 ou posterior.
  2. Execute python --version (Linux/MacOS) ou py --version (Windows) para verificar os relatórios de versão do Python 3.7.x.

Clonar o repositório do tutorial

  1. Numa janela de terminal ou comando, clone o seguinte repositório com o Git:

    git clone https://github.com/Azure-Samples/functions-python-tensorflow-tutorial.git
    
  2. Navegue para a pasta e examine os respetivos conteúdos.

    cd functions-python-tensorflow-tutorial
    
    • start é a sua pasta de trabalho para o tutorial.
    • o fim é o resultado final e a implementação completa da referência.
    • os recursos contêm o modelo de machine learning e as bibliotecas auxiliares.
    • o front-end é um site que chama a aplicação de funções.

Criar e ativar um ambiente virtual do Python

Navegue para a pasta iniciar e execute os seguintes comandos para criar e ativar um ambiente virtual com o nome .venv. Certifique-se de que utiliza o Python 3.7, que é suportado por Funções do Azure.

cd start
python -m venv .venv
source .venv/bin/activate

Se o Python não tiver instalado o pacote venv na distribuição do Linux, execute o seguinte comando:

sudo apt-get install python3-venv

Executa todos os comandos subsequentes neste ambiente virtual ativado. (Para sair do ambiente virtual, execute deactivate.)

Criar um projeto de funções locais

No Funções do Azure, um projeto de função é um contentor para uma ou mais funções individuais que cada uma responde a um acionador específico. Todas as funções num projeto partilham as mesmas configurações locais e de alojamento. Nesta secção, vai criar um projeto de função que contém uma única função boilerplate com o nome classify que fornece um ponto final HTTP. Pode adicionar código mais específico numa secção posterior.

  1. Na pasta iniciar, utilize o Funções do Azure Core Tools para inicializar uma aplicação de funções Python:

    func init --worker-runtime python
    

    Após a inicialização, a pasta iniciar contém vários ficheiros para o projeto, incluindo ficheiros de configurações denominados local.settings.json e host.json. Uma vez que local.settings.json pode conter segredos transferidos do Azure, o ficheiro é excluído do controlo de origem por predefinição no ficheiro .gitignore .

    Dica

    Uma vez que um projeto de função está associado a um runtime específico, todas as funções no projeto têm de ser escritas com o mesmo idioma.

  2. Adicione uma função ao projeto com o seguinte comando, em que o --name argumento é o nome exclusivo da função e o --template argumento especifica o acionador da função. func new crie uma subpasta que corresponda ao nome da função que contém um ficheiro de código adequado ao idioma escolhido do projeto e a um ficheiro de configuração com o nome function.json.

    func new --name classify --template "HTTP trigger"
    

    Este comando cria uma pasta que corresponde ao nome da função, classificar. Nessa pasta encontram-se dois ficheiros: __init__.py, que contém o código da função, e function.json, que descreve o acionador da função e os enlaces de entrada e saída. Para obter detalhes sobre o conteúdo destes ficheiros, veja Modelo de programação no guia para programadores do Python.

Executar a função localmente

  1. Inicie a função ao iniciar o anfitrião de runtime Funções do Azure local na pasta iniciar:

    func start
    
  2. Assim que vir o classify ponto final a aparecer na saída, navegue para o URL, http://localhost:7071/api/classify?name=Azure. A mensagem "Olá Azure!" deve aparecer na saída.

  3. Utilize Ctrl-C para parar o anfitrião.

Importar o modelo tensorFlow e adicionar código auxiliar

Para modificar a classify função para classificar uma imagem com base nos respetivos conteúdos, utilize um modelo do TensorFlow pré-criado com o qual foi preparado e exportado do Azure Visão Personalizada Service. O modelo, que está contido na pasta de recursos do exemplo que clonou anteriormente, classifica uma imagem com base no facto de conter um cão ou um gato. Em seguida, adicione alguns códigos auxiliares e dependências ao seu projeto.

Para criar o seu próprio modelo com a camada gratuita do Serviço Visão Personalizada, siga as instruções no repositório de projetos de exemplo.

Dica

Se quiser alojar o modelo TensorFlow independentemente da aplicação de funções, pode montar uma partilha de ficheiros que contenha o seu modelo na sua aplicação de funções do Linux. Para saber mais, veja Montar uma partilha de ficheiros numa aplicação de funções python com a CLI do Azure.

  1. Na pasta Iniciar , execute o seguinte comando para copiar os ficheiros de modelo para a pasta classificar . Certifique-se de que inclui \* no comando.

    cp ../resources/model/* classify
    
  2. Verifique se a pasta classify contém ficheiros denominados model.pb e labels.txt. Caso contrário, verifique se executou o comando na pasta Iniciar .

  3. Na pasta Iniciar , execute o seguinte comando para copiar um ficheiro com código auxiliar para a pasta classificar :

    cp ../resources/predict.py classify
    
  4. Verifique se a pasta classify contém agora um ficheiro com o nome predict.py.

  5. Abra start/requirements.txt num editor de texto e adicione as seguintes dependências necessárias pelo código auxiliar:

    tensorflow==1.14
    Pillow
    requests
    
  6. Guarde requirements.txt.

  7. Instale as dependências ao executar o seguinte comando na pasta Iniciar . A instalação pode demorar alguns minutos, período durante o qual pode continuar a modificar a função na secção seguinte.

    pip install --no-cache-dir -r requirements.txt
    

    No Windows, poderá encontrar o erro "Não foi possível instalar pacotes devido a um EnvironmentError: [Errno 2] Não existe tal ficheiro ou diretório:" seguido de um nome de caminho longo para um ficheiro como sharded_mutable_dense_hashtable.cpython-37.pyc. Normalmente, este erro ocorre porque a profundidade do caminho da pasta torna-se demasiado longa. Neste caso, defina a chave HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\FileSystem@LongPathsEnabled de registo para 1 ativar caminhos longos. Em alternativa, verifique onde está instalado o seu interpretador python. Se essa localização tiver um caminho longo, tente reinstalar numa pasta com um caminho mais curto.

Dica

Ao chamar predict.py para fazer a sua primeira predição, uma função com o nome _initialize carrega o modelo TensorFlow do disco e coloca-o em cache em variáveis globais. Esta colocação em cache acelera as predições subsequentes. Para obter mais informações sobre como utilizar variáveis globais, veja o guia para programadores do Funções do Azure Python.

Atualizar a função para executar predições

  1. Abra classify/__init__.py num editor de texto e adicione as seguintes linhas após as instruções existentes import para importar a biblioteca JSON padrão e os auxiliares de previsão :

    import logging
    import azure.functions as func
    import json
    
    # Import helper script
    from .predict import predict_image_from_url
    
  2. Substitua todo o conteúdo da main função pelo seguinte código:

    def main(req: func.HttpRequest) -> func.HttpResponse:
        image_url = req.params.get('img')
        logging.info('Image URL received: ' + image_url)
    
        results = predict_image_from_url(image_url)
    
        headers = {
            "Content-type": "application/json",
            "Access-Control-Allow-Origin": "*"
        }
    
        return func.HttpResponse(json.dumps(results), headers = headers)
    

    Esta função recebe um URL de imagem num parâmetro de cadeia de consulta com o nome img. Em seguida, chama predict_image_from_url a partir da biblioteca auxiliar para transferir e classificar a imagem com o modelo TensorFlow. Em seguida, a função devolve uma resposta HTTP com os resultados.

    Importante

    Uma vez que este ponto final HTTP é chamado por uma página Web alojada noutro domínio, a resposta inclui um Access-Control-Allow-Origin cabeçalho para satisfazer os requisitos de Partilha de Recursos De Várias Origens (CORS) do browser.

    Numa aplicação de produção, altere * para a origem específica da página Web para maior segurança.

  3. Guarde as alterações e, em seguida, partindo do princípio de que as dependências terminaram de instalar, inicie novamente o anfitrião da função local com func start. Certifique-se de que executa o anfitrião na pasta iniciar com o ambiente virtual ativado. Caso contrário, o anfitrião será iniciado, mas verá erros ao invocar a função.

    func start
    
  4. Num browser, abra o seguinte URL para invocar a função com o URL de uma imagem de gato e confirme que o JSON devolvido classifica a imagem como um gato.

    http://localhost:7071/api/classify?img=https://raw.githubusercontent.com/Azure-Samples/functions-python-tensorflow-tutorial/master/resources/assets/samples/cat1.png
    
  5. Mantenha o anfitrião em execução porque o utilizará no próximo passo.

Executar o front-end da aplicação Web local para testar a função

Para testar a invocação do ponto final de função de outra aplicação Web, existe uma aplicação simples na pasta de front-end do repositório.

  1. Abra um novo terminal ou linha de comandos e ative o ambiente virtual (conforme descrito anteriormente em Criar e ativar um ambiente virtual python).

  2. Navegue para a pasta de front-end do repositório.

  3. Iniciar um servidor HTTP com Python:

    python -m http.server
    
  4. Num browser, navegue para localhost:8000e, em seguida, introduza um dos seguintes URLs de fotografia na caixa de texto ou utilize o URL de qualquer imagem acessível publicamente.

    • https://raw.githubusercontent.com/Azure-Samples/functions-python-tensorflow-tutorial/master/resources/assets/samples/cat1.png
    • https://raw.githubusercontent.com/Azure-Samples/functions-python-tensorflow-tutorial/master/resources/assets/samples/cat2.png
    • https://raw.githubusercontent.com/Azure-Samples/functions-python-tensorflow-tutorial/master/resources/assets/samples/dog1.png
    • https://raw.githubusercontent.com/Azure-Samples/functions-python-tensorflow-tutorial/master/resources/assets/samples/dog2.png
  5. Selecione Submeter para invocar o ponto final da função para classificar a imagem.

    Captura de ecrã do projeto concluído

    Se o browser relatar um erro ao submeter o URL da imagem, verifique o terminal no qual está a executar a aplicação de funções. Se vir um erro como "Nenhum módulo encontrado 'PIL'", poderá ter iniciado a aplicação de funções na pasta iniciar sem ativar primeiro o ambiente virtual que criou anteriormente. Se continuar a ver erros, execute pip install -r requirements.txt novamente com o ambiente virtual ativado e procure erros.

Nota

O modelo classifica sempre o conteúdo da imagem como um gato ou um cão, independentemente de a imagem conter qualquer um deles, predefinindo para cão. Imagens de tigres e panteras, por exemplo, tipicamente classificam-se como gatos, mas imagens de elefantes, cenouras ou aviões classificam-se como cães.

Limpar os recursos

Uma vez que todo este tutorial é executado localmente no seu computador, não existem recursos ou serviços do Azure para limpar.

Passos seguintes

Neste tutorial, aprendeu a criar e personalizar um ponto final da API HTTP com Funções do Azure para classificar imagens com um modelo tensorFlow. Também aprendeu a chamar a API a partir de uma aplicação Web. Pode utilizar as técnicas neste tutorial para criar APIs de qualquer complexidade, todas em execução no modelo de computação sem servidor fornecido pelo Funções do Azure.

Veja também: