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 usando o runtime são ágeis, o que significa que eles podem ser acessados de qualquer thread. Confira Objetos ágeis no C++/WinRT para obter mais informações sobre agilidade.
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 vai bloquear e sincronizar as chamadas simultâneas. Se você precisar de simultaneidade, será necessário criar várias sessões para obtê-la.
Para sessões de CPU: o objeto não será bloqueado e vai 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 maneira 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 será alterado significativamente com base em suas metas e cenário.
Utilização da memória
Cada instância do LearningModel e do LearningModelSession tem uma cópia do modelo na memória. Se você estiver trabalhando com modelos pequenos, isso talvez não seja motivo de preocupação, mas se estiver trabalhando com modelos muito grandes, isso se torna importante.
Para liberar a memória, chame Dispose no modelo ou na 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 uma nova sessão. Quando você descartar o LearningModel, todas as sessões existentes continuarão a funcionar. No entanto, você não poderá mais criar sessões com essa instância de 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 a Evaluate, você terá uma única cópia do modelo grande na memória.
Suporte a float16
Para melhorar o desempenho e reduzir o volume do modelo, você pode usar ONNXMLTools para converter seu modelo em float16.
Depois de convertido, todos os pesos e as entradas são float16. Veja como você pode trabalhar com entradas e saídas float16:
-
- Uso recomendado.
- Converte cores e realiza a tensorização para float16.
- Dá suporte aos formatos de imagem de 8 bits e bgr8, que podem ser convertidos com segurança em float16, sem perda de dados.
-
- Caminho avançado.
- Float32 convertido em float16.
- Para imagens, essa é uma conversão segura, pois o bgr8 é pequeno e se ajusta.
- Para não imagens, Bind falhará e você precisará passar um TensorFloat16Bit em seu lugar.
-
- Caminho avançado.
- Você precisará converter para float16 e passar as entradas como float32, que serão convertidas em 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 o suporte a float16, o runtime aproveitará isso.
Pré-processando dados de entrada
O WinML executa algumas etapas de pré-processamento nos bastidores para tornar os dados de entrada de processamento mais simples e eficientes. Por exemplo, as imagens de entrada fornecidas podem estar em várias formas e formatos de cor, e podem ser diferentes do que o modelo espera. O WinML executa conversões nas imagens para fazer a correspondência entre elas, reduzindo a carga de trabalho do 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 alguns casos, talvez você queira tensorizar manualmente os dados de entrada, devido a alguns requisitos específicos que você tem. Por exemplo, talvez você não queira usar VideoFrame para suas imagens ou deseje normalizar os valores de pixel do intervalo 0-255 para o intervalo 0-1. Nesses casos, você pode executar a sua própria tensorização personalizada nos dados. Veja o Exemplo de tensorização personalizado para obter um exemplo disso.
Observação
Use os recursos a seguir 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 no nosso GitHub.