Partilhar via


Desempenho e memória do Windows ML

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

Threading e simultaneidade

Todos os objetos expostos a partir do tempo de execução são ágeis, o que significa que podem ser acessados de qualquer thread. Consulte Objetos ágeis em C++/WinRT para obter mais informações sobre agile.

Um objeto-chave com o qual você trabalhará é o LearningModelSession. Este objeto é sempre seguro para chamar a partir 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 alcançá-la.

  • Para sessões de CPU: O objeto não será bloqueado e permitirá chamadas simultâneas em uma única sessão. Você deve tomar cuidado para gerenciar seu próprio estado, buffers e objetos de ligação.

Você deve tomar cuidado e medir o seu objetivo para o seu cenário. As arquiteturas de GPU modernas funcionam de forma diferente das CPUs. Por exemplo, se o seu objetivo for baixa latência, você pode querer gerenciar como agenda o trabalho em seus mecanismos de CPU e GPU usando pipelining, não simultaneidade. Este artigo sobre sincronização de vários mecanismos é um ótimo lugar para começar. Se a taxa de transferência é o seu objetivo (como processar o maior número possível de imagens ao mesmo tempo), você geralmente deseja usar vários threads e simultaneidade para saturar a CPU.

Quando se trata de threading e simultaneidade, você quer executar experimentos e medir tempos. Seu desempenho mudará significativamente com base em seus objetivos e cenário.

Utilização da memória

Cada instância de LearningModel e LearningModelSession tem uma cópia do modelo na memória. Se estiver a trabalhar com modelos pequenos, pode não estar preocupado, mas se estiver a trabalhar com modelos muito grandes, isto torna-se importante.

Para liberar a memória, chame Dispose no modelo ou na sessão. Não se limite a apagá-los, pois alguns idiomas realizam a coleta de lixo preguiçosa.

LearningModel mantém uma cópia na memória para permitir a criação de novas sessões. Quando você descarta o Modelo de Aprendizagem, todas as sessões existentes continuarão a funcionar. 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 Float16

Para um melhor desempenho e uma pegada de modelo reduzida, 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:

  • ImageFeatureValue

    • Uso recomendado.
    • Converte cores e tensorizes em float16.
    • Suporta formatos de imagem bgr8 e 8-bit, que podem ser convertidos com segurança em float16 sem perda de dados.
  • TensorFloat

    • Caminho avançado.
    • Float32 convertido em float16.
    • Para imagens, isso é seguro para transmitir, pois o bgr8 é pequeno e se encaixa.
    • No caso de dados que não sejam imagens, Bind falhará, e precisarás usar um TensorFloat16Bit em vez disso.
  • TensorFloat16Bit

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

Observação

Na maioria das vezes, o operador ainda está executando matemática de 32 bits. O risco de transbordamento é menor, e o resultado é truncado para float16. No entanto, se o hardware anunciar o suporte a float16, o tempo de execução aproveitará isso.

Pré-processamento de dados de entrada

O WinML executa algumas etapas de pré-processamento 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 realiza conversões nas imagens para combiná-las, reduzindo a carga sobre o 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 certos casos, você pode querer tensorizar manualmente seus dados de entrada devido a alguns requisitos específicos que você tem. Por exemplo, talvez você não queira usar o VideoFrame para suas imagens ou normalize os valores de pixel do intervalo 0-255 ao intervalo 0-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 ou responder a perguntas técnicas sobre o Windows ML, use a tag windows-machine-learning no Stack Overflow.
  • Para relatar um bug, registre um problema em nosso GitHub.