Nota
O acesso a esta página requer autorização. Podes tentar iniciar sessão ou mudar de diretório.
O acesso a esta página requer autorização. Podes tentar mudar de diretório.
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:
-
- 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.
-
- 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.
-
- 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.