Compartilhar via


Desempenho e memória do Windows ML

Neste artigo, abordaremos como gerenciar o desempenho do aplicativo ao usar o Windows Machine Learning.

Threading e simultaneidade

Cada objeto exposto do runtime é ágil, o que significa que eles podem ser acessados de qualquer thread. Consulte objetos Agile no C++/WinRT para obter mais informações sobre agile.

Um objeto chave com o qual você trabalhará é o LearningModelSession. Esse objeto é sempre seguro para chamar de qualquer thread.

  • Para sessões de GPU: o objeto bloqueará e sincronizará chamadas simultâneas. Se você precisar de simultaneidade, precisará criar várias sessões para obtê-la.

  • Para sessões de CPU: o objeto não será bloqueado e permitirá chamadas simultâneas em uma única sessão. Você deve gerenciar seus próprios estados, buffers e objetos de associação.

Você deve ter cuidado e medir sua meta para seu cenário. As arquiteturas de GPU modernas funcionam de forma diferente das CPUs. Por exemplo, se baixa latência for sua meta, você poderá desejar gerenciar o modo de agendamento do trabalho em seus mecanismos de CPU e GPU usando o pipeline, não a simultaneidade. Este artigo sobre a sincronização de vários mecanismos é um ótimo lugar para começar. Se a produtividade for sua meta (por exemplo, processar o máximo possível de imagens de cada vez), muitas vezes você desejará usar vários threads e simultaneidade para saturar a CPU.

Quando se trata de threading e de simultaneidade, deve-se executar experimentos e medir os tempos. Seu desempenho mudará significativamente com base em suas metas e cenários.

Utilização da memória

Cada instância de LearningModel e LearningModelSession tem uma cópia do modelo na memória. Se você estiver trabalhando com modelos pequenos, talvez não esteja preocupado, mas se você estiver trabalhando com modelos muito grandes, isso se tornará importante.

Para liberar a memória, chame Dispose no modelo ou sessão. Não exclua-os prontamente, pois algumas linguagens de programação realizam uma coleta de lixo lenta.

LearningModel mantém uma cópia na memória para habilitar a criação de nova sessão. Quando você descartar o LearningModel, todas as sessões existentes continuarão funcionando. No entanto, você não poderá mais criar novas sessões com essa instância do LearningModel . Para modelos grandes, você pode criar um modelo e uma sessão e, em seguida, descartar o modelo. Usando uma única sessão para todas as chamadas para Avaliar, você terá uma única cópia do modelo grande na memória.

Suporte ao Float16

Para melhorar o desempenho e reduzir o volume do modelo, você pode usar ONNXMLTools para converter seu modelo em float16.

Uma vez convertidos, todos os pesos e entradas são flutuantes16. Veja como você pode trabalhar com entradas e saídas float16:

  • ValorDaCaracterísticaDaImagem

    • Uso recomendado.
    • Converte cores e realiza a tensorização para float16.
    • Dá suporte a formatos de imagem bgr8 e de 8 bits, que podem ser convertidos com segurança em float16 sem perda de dados.
  • TensorFloat

    • Caminho avançado.
    • Float32 convertido em float16.
    • Para imagens, essa é uma conversão segura, pois o bgr8 é pequeno e se ajusta.
    • Para elementos que não sejam imagens, Bind falhará, e será necessário passar um TensorFloat16Bit em seu lugar.
  • TensorFloat16 bits

    • Caminho avançado.
    • Você precisa converter para float16 e passar as entradas como float32, que serão reduzidas para float16.

Observação

Na maioria das vezes, o operador ainda está executando matemática de 32 bits. Há menos risco de estouro, e o resultado é truncado para float16. No entanto, se o hardware anunciar suporte float16, o runtime tirará proveito dele.

Pré-processamento de dados de entrada

O WinML executa algumas etapas de pré-processamento nas capas para tornar o processamento de dados de entrada mais simples e eficiente. Por exemplo, determinadas imagens de entrada podem estar em vários formatos de cores e formas e podem ser diferentes do que o modelo espera. O WinML executa conversões nas imagens para corresponder a elas, reduzindo a carga no desenvolvedor.

O WinML também aproveita toda a pilha de hardware (CPU, GPU e assim por diante) para fornecer as conversões mais eficientes para um determinado dispositivo e cenário.

No entanto, em determinados casos, talvez você queira tensorizar manualmente seus dados de entrada devido a alguns requisitos específicos. Por exemplo, talvez você não queira usar o VideoFrame para suas imagens ou queira normalizar os valores de pixel do intervalo de 0 a 255 para o intervalo de 0 a 1. Nesses casos, você pode executar sua própria tensorização personalizada nos dados. Consulte o Exemplo de Tensorização Personalizada para obter um exemplo disso.

Observação

Use os seguintes recursos para obter ajuda com o Windows ML:

  • Para fazer perguntas ou responder a perguntas técnicas sobre o Windows ML, use a marca windows-machine-learning no Stack Overflow.
  • Para relatar um bug, registre um problema em nosso GitHub.