Tutorial: Implementar um modelo de classificação de imagens pré-preparado para Funções do Azure com o PyTorch

Neste artigo, vai aprender a utilizar Python, PyTorch e Funções do Azure para carregar um modelo pré-preparado 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 PyTorch pré-preparado para uma aplicação de funções.
  • Crie uma API HTTP sem servidor para classificar uma imagem como uma das 1000 classes ImageNet.
  • 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-pytorch-tutorial.git
    
  2. Navegue para a pasta e examine os respetivos conteúdos.

    cd functions-python-pytorch-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.

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 do PyTorch e adicionar código auxiliar

Para modificar a classify função para classificar uma imagem com base nos respetivos conteúdos, utilize um modelo de ResNet pré-preparado. O modelo pré-preparado, proveniente do PyTorch, classifica uma imagem em 1 de 1000 classes ImageNet. Em seguida, adicione alguns códigos auxiliares e dependências ao seu projeto.

  1. Na pasta Iniciar , execute o seguinte comando para copiar o código de predição e as etiquetas para a pasta classificar .

    cp ../resources/predict.py classify
    cp ../resources/labels.txt classify
    
  2. Verifique se a pasta classify contém ficheiros com o nome predict.py e labels.txt. Caso contrário, verifique se executou o comando na pasta Iniciar .

  3. Abra start/requirements.txt num editor de texto e adicione as dependências necessárias pelo código auxiliar, que deverá ter o seguinte aspeto:

    azure-functions
    requests
    -f https://download.pytorch.org/whl/torch_stable.html
    torch==1.13.0+cpu
    torchvision==0.14.0+cpu
    

    Dica

    As versões da tocha e do torchvision têm de corresponder aos valores listados na tabela de versões do repositório de visão PyTorch.

  4. Guarde requirements.txte, em seguida, execute o seguinte comando a partir da pasta iniciar para instalar as dependências.

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

A instalação pode demorar alguns minutos, período durante o qual pode continuar a modificar a função na secção seguinte.

Dica

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.

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 PyTorch. 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 bernese mountain dog e confirme que o JSON devolvido classifica a imagem como um Cão de Montanha Bernese.

    http://localhost:7071/api/classify?img=https://raw.githubusercontent.com/Azure-Samples/functions-python-pytorch-tutorial/master/resources/assets/Bernese-Mountain-Dog-Temperament-long.jpg
    
  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-pytorch-tutorial/master/resources/assets/Bernese-Mountain-Dog-Temperament-long.jpg
    • https://github.com/Azure-Samples/functions-python-pytorch-tutorial/blob/master/resources/assets/bald-eagle.jpg?raw=true
    • https://raw.githubusercontent.com/Azure-Samples/functions-python-pytorch-tutorial/master/resources/assets/penguin.jpg
  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.

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 PyTorch. 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: