25.3 C
New York
Monday, June 24, 2024

Otimize a classificação de imagens no AWS IoT Greengrass usando o ONNX Runtime


Introdução

A realização de inferência de aprendizado de máquina em dispositivos de ponta usando modelos treinados na nuvem tornou-se um caso de uso widespread na Web das Coisas (IoT), pois traz os benefícios de baixa latência, escalabilidade e economia de custos. Ao implantar modelos em dispositivos de ponta com computação e memória limitadas, os desenvolvedores têm o desafio de ajustar manualmente o modelo para obter o desempenho desejado. Nesta postagem do weblog, discutirei um exemplo de como usar o ONNX Runtime no AWS IoT Greengrass para otimizar a classificação de imagens na borda.

ONNX é um formato aberto criado para representar qualquer tipo de aprendizado de máquina ou modelo de aprendizado profundo, facilitando o acesso a otimizações de {hardware}. Ele fornece um formato padrão para interoperabilidade entre diferentes estruturas de aprendizado de máquina. Você pode treinar um modelo de classificação de imagem usando uma de suas estruturas preferidas (TensorFlow, PyTorchName, MxNet, e mais) e, em seguida, exporte-o para o formato ONNX. Para maximizar o desempenho, você pode usar seus modelos ONNX com uma estrutura de inferência otimizada, como Tempo de execução ONNX. O ONNX Runtime é um projeto de código aberto projetado para acelerar a inferência de aprendizado de máquina em uma variedade de estruturas, sistemas operacionais e plataformas de {hardware} com um único conjunto de APIs. Embora esta postagem do weblog se concentre em um exemplo de classificação de imagens, você pode usar o ONNX para uma ampla variedade de casos de uso, como detecção de objetos, segmentação de imagens, processamento de voz e áudio, compreensão e tradução de máquinas e muito mais.

AWS IoT Greengrass é um serviço de nuvem e tempo de execução de ponta da Web das Coisas (IoT) de código aberto que ajuda você a criar, implantar e gerenciar aplicativos de IoT em seus dispositivos. Você pode usar o AWS IoT Greengrass para criar aplicativos de borda usando módulos de software program, chamados componentes, que pode conectar seus dispositivos de borda à AWS ou a serviços de terceiros. Existem vários Componentes de machine studying fornecidos pela AWS que podem ser usados ​​para realizar inferências em dispositivos remotos, com dados gerados localmente, usando modelos treinados na nuvem. Você também pode construir o seu componentes personalizados de aprendizado de máquina que podem ser divididos em duas categorias: componentes para implantar e atualizar seus modelos de aprendizado de máquina e tempos de execução na borda, bem como componentes que contêm a lógica de aplicativo necessária para executar a inferência de aprendizado de máquina.

Visão geral da solução

Neste exemplo, você aprenderá como criar e implantar um componente personalizado para classificação de imagens no AWS IoT Greengrass. A arquitetura e as etapas abaixo representam uma possível implementação para esta solução.

Diagrama de Arquitetura da Solução

1. Treine um modelo usando sua estrutura preferida e exporte-o para o formato ONNX ou use um modelo ONNX pré-treinado. Você pode usar Amazon SageMaker Studio e Pipelines do Amazon SageMaker para automatizar este processo.

Nesta postagem de weblog, você usará um modelo ResNet-50 pré-treinado no formato ONNX para classificação de imagem disponível no Zoológico Modelo ONNX. O ResNet-50 é uma rede neural convolucional com 50 camadas e a versão pré-treinada do modelo pode classificar imagens em mil categorias de objetos, como teclado, mouse, lápis e muitos animais.

2. Crie e publique os componentes necessários do AWS IoT Greengrass:

Continua após a publicidade..
  • Um componente ONNX Runtime que contém as bibliotecas necessárias para executar o modelo ONNX.
  • Um componente para inferência que contém o código necessário, o modelo ResNet-50 no formato ONNX, bem como algumas etiquetas e imagens de amostra que serão utilizadas para classificação. Este componente terá uma dependência do componente ONNX Runtime.

3. Implante o componente no dispositivo de destino. Depois que o componente estiver em execução, ele classificará as imagens de amostra e publicará os resultados de volta para AWS IoT Core para o tópico demo/onnx. O AWS IoT Core é um serviço gerenciado da AWS que permite conectar bilhões de dispositivos IoT e rotear trilhões de mensagens para serviços da AWS sem gerenciar a infraestrutura.

Pré-requisitos

Para poder executar as etapas nesta postagem do weblog, você precisará de:

Passo a passo de implementação

Configuração inicial

Como parte da configuração inicial do ambiente, há vários recursos que você precisa provisionar. Todos os recursos precisam ser provisionados na mesma região. Este guia está usando o eu-central-1 região. Siga os passos abaixo para começar:
1. Os artefatos do componente serão armazenados em um Serviço de armazenamento simples da Amazon (Amazon S3). Para criar um bucket do Amazon S3, siga as instruções do guia de usuario.
2. Para emular um dispositivo onde iremos implantar o componente, você usará um AWS Cloud9 ambiente e instale o software program cliente AWS IoT Greengrass. Para executar essas etapas, siga as instruções do Workshop AWS IoT Greengrass v2Seções 2 e 3.1.
3. No ambiente AWS Cloud9, certifique-se de ter instalado o python 3.6.9, bem como o pip 23.0 ou superior.

Crie e publique o ONNX Runtime e os componentes de inferência

Na próxima seção, você criará e publicará os componentes personalizados usando AWS CLIseja de um terminal na máquina native ou em um AWS Cloud9 ambiente.

Para fazer add dos artefatos para o bucket do Amazon S3 criado como parte da configuração inicial, siga as próximas etapas:
1. Clone o repositório git que contém os artefatos e a receita do componente:

git clone https://github.com/aws-samples/aws-iot-gg-onnx-runtime.git

2. Navegue até a pasta de artefatos e compacte os arquivos:

cd aws-iot-gg-onnx-runtime/artifacts/com.demo.onnx-imageclassification/1.0.0 
zip -r greengrass-onnx.zip .

3. Carregue o arquivo zip no bucket do Amazon S3 que você criou na configuração inicial:

Continua após a publicidade..
aws s3 cp greengrass-onnx.zip s3://{YOUR-S3-BUCKET}/greengrass-onnx.zip

Para publicar os componentes, execute as seguintes etapas:
1. Abra o arquivo de receita aws-iot-gg-onnx-runtime/recipes/com.demo.onnx-imageclassification-1.0.0.json em um editor de texto. Abaixo você tem o comando para navegar até o diretório de receitas:

cd aws-iot-gg-onnx-runtime/recipes/

2. Substitua o nome do bucket do Amazon S3 no URI de artefatos pelo seu próprio nome de bucket definido acima:

"Artifacts": (
    {
      "URI": "s3://{YOUR-S3-BUCKET}/greengrass-onnx.zip",
      "Unarchive": "ZIP"
    }
  )

3. Antes de publicar o componente, certifique-se de estar usando a mesma região onde criou os recursos na configuração inicial. Você pode definir sua região padrão usando o seguinte comando:

aws configure set default.area eu-central-1

4. Publique o componente ONNX Runtime:

aws greengrassv2 create-component-version --inline-recipe fileb://com.demo.onnxruntime-1.0.0.json

5. Publique o componente que fará a classificação da imagem e que possui dependência do ONNX Runtime:

aws greengrassv2 create-component-version --inline-recipe fileb://com.demo.onnx-imageclassification-1.0.0.json

6. Para verificar se os componentes foram publicados com sucesso, navegue até o Console IoT da AWSVá para Dispositivos Greengrass >> Componentes. No Meus componentes guia, você deve ver os dois componentes que acabou de publicar:
Captura de tela - guia Meus componentes

Implante o componente em um dispositivo de destino

1. Para implantar o componente em um dispositivo de destino, certifique-se de ter provisionado um ambiente AWS Cloud9 com o software program cliente AWS IoT Greengrass instalado.
2. Para configurar as permissões necessárias para o dispositivo Greengrass, certifique-se de que o função de serviço associado ao dispositivo Greengrass tem permissões para recuperar objetos do bucket Amazon S3 que você criou anteriormente, bem como permissões para publicar no tópico AWS IoT demo/onnx.
3. Para implantar o componente no dispositivo de destino, vá para o Console IoT da AWSnavegar para Dispositivos Greengrass >> Implantações e escolha Criar.
4. Preencha o nome da implantação, bem como o nome do dispositivo principal no qual deseja implantar.
Captura de tela - Informações de implantação
5. No Selecionar Componentes seção, selecione o componente com.demo.onnx-imageclassification.
6. Deixe todas as outras opções como padrão e escolha Próximo até chegar ao Análise seção de sua implantação e, em seguida, escolha Implantar.
7. Para monitorar os logs e o andamento da implantação dos componentes, você pode abrir o arquivo de log do dispositivo Greengrass core no ambiente AWS Cloud9 com o seguinte comando:

sudo tail -f /greengrass/v2/logs/greengrass.log

8. Observe que o componente ONNX Runtime, com.demo.onnxruntimeé instalado automaticamente, pois o componente de classificação de imagem que selecionamos para implementação tem uma dependência dele.

Continua após a publicidade..

Teste a implantação do componente de classificação de imagem ONNX

Quando o componente de classificação de imagens estiver em execução, ele percorrerá os arquivos na pasta de imagens e os classificará. Os resultados são publicados no AWS IoT Core no tópico demo/onnx.

Para entender esse processo, vamos dar uma olhada em alguns trechos de código do componente de classificação de imagens:
1. Para verificar as imagens de amostra para depois poder compará-las com os rótulos previstos, abra as imagens localizadas em aws-iot-gg-onnx-runtime/artifacts/com.demo.onnx-imageclassification/1.0.0/photos pasta.
2. O prever A função mostrada abaixo inicia uma sessão de inferência usando o ONNX Runtime e a rede neural ResNet-50 pré-treinada no formato ONNX.

def predict(modelPath, labelsPath, picture):
    labels = load_labels(labelsPath)
    # Run the mannequin on the backend
    session = onnxruntime.InferenceSession(modelPath, None)

3. A imagem é inicialmente pré-processada e então passada como um parâmetro de entrada para a sessão de inferência. Observe que o modelo ResNet-50 usa imagens de 224 x 224 pixels.

image_data = np.array(picture).transpose(2, 0, 1)
input_data = preprocess(image_data)
begin = time.time()
raw_result = session.run((), {input_name: input_data})
finish = time.time()

4. Do resultado da inferência, você extrai o rótulo da imagem e também calcula o tempo de inferência em milissegundos.

inference_time = np.spherical((finish - begin) * 1000, 2)
idx = np.argmax(postprocess(raw_result))
inferenceResult = {
	"label": labels(idx),
	"inference_time": inference_time
}

5. O componente de classificação de imagem percorre os arquivos presentes na pasta de imagens e invoca o prever função. Os resultados são publicados no AWS IoT Core para o demo/onnx tópico a cada 5 segundos.

for img in os.listdir(imagesPath):
        request = PublishToIoTCoreRequest()
        request.topic_name = subject
        picture = Picture.open(imagesPath + "/" + img)
        pred = predict(modelPath, labelsPath, picture)
        request.payload = pred.encode()
        request.qos = qos
        operation = ipc_client.new_publish_to_iot_core()
        operation.activate(request)
        future_response = operation.get_response().outcome(timeout=5)
        print("efficiently printed message: ", future_response)
        time.sleep(5)

Para testar se os resultados foram publicados com sucesso no tópico, acesse Console IoT da AWSnavegar para Cliente MQTT seção e subscrever o tópico demo/onnx. Você deve ver os resultados da inferência como na captura de tela abaixo:Captura de tela - Resultados de inferência do cliente MQTT

Limpando

É uma prática recomendada excluir os recursos que você não deseja mais usar. Para evitar custos adicionais em sua conta da AWS, execute as seguintes etapas:
1. Exclua o ambiente AWS Cloud9 onde o software program AWS IoT Greengrass foi instalado:

Continua após a publicidade..
aws cloud9 delete-environment --environment-id <your atmosphere id>

2. Exclua o dispositivo central do Greengrass:

aws greengrassv2 delete-core-device --core-device-thing-name <thing-name>

3. Exclua o bucket do Amazon S3 onde os artefatos são armazenados:

aws s3 rb s3://{YOUR-S3-BUCKET} --force

Conclusão

Nesta postagem do weblog, mostrei como você pode criar e implantar um componente personalizado no AWS IoT Greengrass que usa o ONNX Runtime para classificar imagens. Você pode personalizar esse componente adicionando imagens adicionais ou usando um modelo diferente no formato ONNX para fazer previsões.

Para se aprofundar no AWS IoT Greengrass, incluindo como criar componentes personalizados, verifique o AWS IoT Greengrass Workshop v2. Você também pode ler o guia do desenvolvedor para obter mais informações sobre como personalizar componentes de aprendizado de máquina.

Sobre o autor

Costin Badici.jpg

Costin Bădici é arquiteto de soluções da Amazon Internet Providers (AWS) com sede em Bucareste, Romênia, ajudando clientes corporativos a otimizar suas implantações da AWS, aderir às práticas recomendadas e inovar mais rapidamente com os serviços da AWS. Ele é apaixonado por Web das Coisas e aprendizado de máquina e projetou e implementou IoT altamente escalável e soluções de análise preditiva para clientes em vários setores.

Related Articles

LEAVE A REPLY

Please enter your comment!
Please enter your name here

Latest Articles