Partilhar via


Tutorial: Aplicar modelos de aprendizado de máquina no Azure Functions com Python e TensorFlow

Neste artigo, você aprenderá a usar Python, TensorFlow e Azure Functions com um modelo de aprendizado de máquina para classificar uma imagem com base em seu conteúdo. Como você faz todo o trabalho localmente e não cria recursos do Azure na nuvem, não há custo para concluir este tutorial.

  • Inicialize um ambiente local para desenvolver o Azure Functions em Python.
  • Importe um modelo personalizado de aprendizado de máquina do TensorFlow para um aplicativo funcional.
  • 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. Em uma janela de terminal ou comando, execute func --version para verificar se as Ferramentas Principais do Azure Functions são a versão 2.7.1846 ou posterior.
  2. Execute python --version (Linux/macOS) ou py --version (Windows) para verificar seus relatórios de versão Python 3.7.x.

Clone o repositório do tutorial

  1. Em um terminal ou janela de comando, clone o seguinte repositório usando o Git:

    git clone https://github.com/Azure-Samples/functions-python-tensorflow-tutorial.git
    
  2. Navegue até a pasta e examine seu conteúdo.

    cd functions-python-tensorflow-tutorial
    
    • Iniciar é a sua pasta de trabalho para o tutorial.
    • final é o resultado final e implementação completa para sua referência.
    • Recursos contém o modelo de aprendizado de máquina e bibliotecas auxiliares.
    • Frontend é um site que chama o aplicativo de função.

Criar e ativar um ambiente virtual Python

Navegue até a pasta inicial e execute os seguintes comandos para criar e ativar um ambiente virtual chamado .venv. Certifique-se de usar o Python 3.7, que é suportado pelo Azure Functions.

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

Se o Python não instalou o pacote venv na sua distribuição Linux, execute o seguinte comando:

sudo apt-get install python3-venv

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

Criar um projeto de funções locais

No Azure Functions, um projeto de função é um contêiner para uma ou mais funções individuais que respondem a um gatilho específico. Todas as funções em um projeto compartilham as mesmas configurações locais e de hospedagem. Nesta seção, você cria um projeto de função que contém uma única função clichê chamada classify que fornece um ponto de extremidade HTTP. Você adiciona um código mais específico em uma seção posterior.

  1. Na pasta inicial, use as Ferramentas Principais do Azure Functions para inicializar um aplicativo de função Python:

    func init --worker-runtime python
    

    Após a inicialização, a pasta inicial contém vários arquivos para o projeto, incluindo arquivos de configuração chamados local.settings.json e host.json. Como local.settings.json pode conter segredos baixados do Azure, o arquivo é excluído do controle do código-fonte por padrão no arquivo .gitignore .

    Gorjeta

    Como um projeto de função está vinculado a um tempo de execução específico, todas as funções no projeto devem ser escritas com a mesma linguagem.

  2. Adicione uma função ao seu projeto usando o comando a seguir, onde o --name argumento é o nome exclusivo da sua função e o --template argumento especifica o gatilho da função. func new Crie uma subpasta correspondente ao nome da função que contenha um arquivo de código apropriado para o idioma escolhido pelo projeto e um arquivo de configuração chamado function.json.

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

    Este comando cria uma pasta correspondente ao nome da função, classify. Nessa pasta estão dois arquivos: __init__.py, que contém o código da função, e function.json, que descreve o gatilho da função e suas ligações de entrada e saída. Para obter detalhes sobre o conteúdo desses arquivos, consulte Modelo de programação no guia do desenvolvedor do Python.

Executar a função localmente

  1. Inicie a função iniciando o host de tempo de execução local do Azure Functions na pasta inicial :

    func start
    
  2. Depois de ver o classify ponto de extremidade aparecer na saída, navegue até o URL, http://localhost:7071/api/classify?name=Azure. A mensagem "Olá Azure!" deve aparecer na saída.

  3. Use Ctrl-C para parar o host.

Importe o modelo TensorFlow e adicione código auxiliar

Para modificar a classify função para classificar uma imagem com base em seu conteúdo, use um modelo TensorFlow pré-criado que foi treinado e exportado do Serviço de Visão Personalizada do Azure. O modelo, que está contido na pasta de recursos do exemplo clonado anteriormente, classifica uma imagem com base no fato de ela conter um cão ou um gato. Em seguida, você adiciona algum código auxiliar e dependências ao seu projeto.

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

Gorjeta

Se você quiser hospedar seu modelo TensorFlow independentemente do aplicativo de função, você pode, em vez disso, montar um compartilhamento de arquivos contendo seu modelo para seu aplicativo de função Linux. Para saber mais, consulte Montar um compartilhamento de arquivos em um aplicativo de função Python usando a CLI do Azure.

  1. Na pasta iniciar, execute o seguinte comando para copiar os arquivos de modelo para a pasta classificar. Certifique-se de incluir \* no comando.

    cp ../resources/model/* classify
    
  2. Verifique se a pasta classify contém arquivos chamados model.pb e labels.txt. Se não, verifique se você executou o comando na pasta iniciar .

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

    cp ../resources/predict.py classify
    
  4. Verifique se a pasta classify agora contém um arquivo chamado predict.py.

  5. Abra o início/requirements.txt em um editor de texto e adicione as seguintes dependências exigidas pelo código auxiliar:

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

  7. Instale as dependências executando o seguinte comando na pasta iniciar . A instalação pode levar alguns minutos, durante os quais você pode continuar com a modificação da função na próxima seção.

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

    No Windows, você pode encontrar o erro, "Não foi possível instalar pacotes devido a um EnvironmentError: [Errno 2] No such file or directory:" seguido por um nome de caminho longo para um arquivo como sharded_mutable_dense_hashtable.cpython-37.pyc. Normalmente, esse erro acontece porque a profundidade do caminho da pasta se torna muito longa. Nesse caso, defina a chave HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\FileSystem@LongPathsEnabled do Registro para 1 habilitar caminhos longos. Como alternativa, verifique onde seu interpretador Python está instalado. Se esse local tiver um caminho longo, tente reinstalar em uma pasta com um caminho mais curto.

Gorjeta

Ao chamar predict.py para fazer sua primeira previsão, uma função chamada _initialize carrega o modelo TensorFlow do disco e o armazena em cache em variáveis globais. Esse cache acelera as previsões subsequentes. Para obter mais informações sobre como usar variáveis globais, consulte o Guia do desenvolvedor Python do Azure Functions.

Atualizar a função para executar previsões

  1. Abra classificar/__init__.py em um 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 main conteúdo da 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 em um parâmetro de cadeia de caracteres de consulta chamado img. Em seguida, ele chama predict_image_from_url a partir da biblioteca auxiliar para baixar e classificar a imagem usando o modelo TensorFlow. Em seguida, a função retorna uma resposta HTTP com os resultados.

    Importante

    Como esse ponto de extremidade HTTP é chamado por uma página da Web hospedada em outro domínio, a resposta inclui um Access-Control-Allow-Origin cabeçalho para satisfazer os requisitos de compartilhamento de recursos entre origens (CORS) do navegador.

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

  3. Salve as alterações e, supondo que as dependências tenham terminado de instalar, inicie o host da função local novamente com func start. Certifique-se de executar o host na pasta inicial com o ambiente virtual ativado. Caso contrário, o host será iniciado, mas você verá erros ao invocar a função.

    func start
    
  4. Em um navegador, abra a seguinte URL para invocar a função com a URL de uma imagem cat e confirme se o JSON retornado 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 host em execução porque você o usa na próxima etapa.

Execute o front-end do aplicativo Web local para testar a função

Para testar a invocação do ponto de extremidade da função a partir de outro aplicativo Web, há um aplicativo simples na pasta frontend do repositório.

  1. Abra um novo terminal ou prompt de comando e ative o ambiente virtual (conforme descrito anteriormente em Criar e ativar um ambiente virtual Python).

  2. Navegue até a pasta frontend do repositório.

  3. Inicie um servidor HTTP com Python:

    python -m http.server
    
  4. Em um navegador, navegue até localhost:8000, insira um dos seguintes URLs de foto na caixa de texto ou use 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 Enviar para invocar o ponto de extremidade da função para classificar a imagem.

    Captura de ecrã do projeto concluído

    Se o navegador relatar um erro ao enviar o URL da imagem, verifique o terminal no qual você está executando o aplicativo de função. Se você vir um erro como "Nenhum módulo encontrado 'PIL'", você pode ter iniciado o aplicativo de função na pasta inicial sem primeiro ativar o ambiente virtual que você criou anteriormente. Se ainda vir erros, execute pip install -r requirements.txt novamente com o ambiente virtual ativado e procure erros.

Nota

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

Clean up resources (Limpar recursos)

Como a totalidade deste tutorial é executada localmente em sua máquina, não há recursos ou serviços do Azure para limpar.

Próximos passos

Neste tutorial, você aprendeu como criar e personalizar um ponto de extremidade de API HTTP com o Azure Functions para classificar imagens usando um modelo TensorFlow. Você também aprendeu como chamar a API de um aplicativo Web. Você pode usar as técnicas neste tutorial para criar APIs de qualquer complexidade, tudo enquanto executa no modelo de computação sem servidor fornecido pelo Azure Functions.

Consulte também: