Compartilhar via


Visão geral do DirectML

Resumo

Direct Machine Learning (DirectML) é uma API de baixo nível para ML (machine learning). A API tem uma interface de programação nativa (C++ nativo, nano-COM) e um fluxo de trabalho familiar no estilo do DirectX 12. Você pode integrar cargas de trabalho de inferência de aprendizado de máquina ao seu jogo, mecanismo, middleware, back-end ou outro aplicativo. O DirectML é compatível com todo o hardware compatível com DirectX 12.

Primitivos de aprendizado de máquina acelerados por hardware (chamados operadores) são os blocos de construção do DirectML. A partir desses blocos de construção, você pode desenvolver técnicas de aprendizado de máquina como upscaling, anti-aliasing e transferência de estilo, para citar apenas alguns. O denoising e a super-resolução, por exemplo, permitem que você obtenha efeitos raytraced impressionantes com menos raios por pixel.

Você pode integrar cargas de trabalho de inferência de aprendizado de máquina ao seu jogo, mecanismo, middleware, back-end ou outro aplicativo. O DirectML tem uma interface de programação de estilo DirectX 12 (nativa C++, nano-COM) e é compatível com todo o hardware compatível com DirectX 12. Para aplicativos de exemplo directml, incluindo um exemplo de um aplicativo DirectML mínimo, consulte aplicativos de exemplo DirectML.

O DirectML foi introduzido no Windows 10, versão 1903 e na versão correspondente do SDK do Windows.

O DirectML é apropriado para o meu projeto?

O DirectML é uma camada de abstração de hardware de baixo nível que permite executar cargas de trabalho de aprendizado de máquina em qualquer GPU compatível com DirectX 12.

Se você precisar otimizar o desempenho do aprendizado de máquina para cenários em tempo real, de alto desempenho, de baixa latência ou restritos a recursos, o DirectML oferecerá mais controle e flexibilidade. Você pode usar o DirectML para integrar o aprendizado de máquina diretamente ao seu mecanismo ou pipeline de renderização existente, ou para criar suas próprias estruturas de aprendizado de máquina personalizadas e middleware no Windows.

Você também pode usar o DirectML indiretamente por meio do ONNX Runtime, que é uma biblioteca multiplataforma que dá suporte ao formato ONNX padrão aberto para modelos de machine learning. O OnNX Runtime pode usar o DirectML como um de seus provedores de execução, juntamente com outros back-ends, como CPU, CUDA ou TensorRT. Dessa forma, você pode aproveitar o desempenho e a compatibilidade do DirectML sem escrever nenhum código DirectML por conta própria.

Como alternativa, você pode usar a API WinML, que é uma API de nível superior, focada em modelo, que simplifica o fluxo de trabalho de machine learning com seu padrão de avaliação de associação de carga. O WinML também usa o formato ONNX para modelos e pode usar DirectML como seu back-end. O WinML foi projetado para cenários em que você precisa integrar o aprendizado de máquina de forma rápida e fácil em seus aplicativos do Windows, sem se preocupar com os detalhes do hardware ou da estrutura subjacentes.

O que o DirectML faz; e que trabalho devo fazer como desenvolvedor?

O DirectML executa com eficiência as camadas individuais do seu modelo de inferência na GPU (ou em núcleos de aceleração de IA, se houver). Cada camada é um operador e o DirectML fornece uma biblioteca de operadores primitivos de aprendizado de máquina acelerados por hardware de baixo nível. Você pode executar operações DirectML isoladamente ou como um grafo (consulte a seção Camada por camada e fluxos de trabalho baseados em grafo no DirectML).

Operadores e grafos aplicam otimizações específicas de hardware e específicas da arquitetura. Ao mesmo tempo, você, como desenvolvedor, vê uma única interface independente do fornecedor para executar esses operadores.

A biblioteca de operadores no DirectML fornece todas as operações usuais que você esperaria poder usar em uma carga de trabalho de aprendizado de máquina.

  • Operadores de ativação, como linear, ReLU, sigmoid, tanh e muito mais.
  • Operadores em termos de elemento, como adicionar, exp, log, max, min, sub e muito mais.
  • Operadores de convolução, como convolução 2D e 3D e muito mais.
  • Operadores de redução, como argmin, média, l2, soma e muito mais.
  • Operadores de agrupamento, como média, lp e máximo.
  • Operadores de rede neural (NN), como gemm, gru, lstm e rnn.
  • E muito mais.

Para obter um desempenho máximo e para que você não pague pelo que não usa, o DirectML coloca o controle em suas mãos como um desenvolvedor sobre como sua carga de trabalho de machine learning é executada no hardware. Descobrir quais operadores executar e quando é sua responsabilidade como desenvolvedor. As tarefas que são deixadas a seu critério incluem: transcrever o modelo; simplificando e otimizando suas camadas; carregando pesos; alocação de recursos, associação, gerenciamento de memória (assim como com o Direct3D 12); e a execução do grafo.

Você mantém o conhecimento de alto nível de seus grafos (você pode codificar seu modelo diretamente ou pode escrever seu próprio carregador de modelo). Você pode projetar um modelo de upscaling, por exemplo, usando várias camadas, cada uma com operações de upsample, convolução, normalização e ativação. Com essa familiaridade, agendamento cuidadoso e gerenciamento de barreiras, você pode extrair o maior paralelismo e desempenho do hardware. Se você estiver desenvolvendo um jogo, o gerenciamento de recursos cuidadoso e o controle sobre o agendamento permitem que você intercale cargas de trabalho de machine learning e o trabalho de renderização tradicional para saturar a GPU.

Qual é o fluxo de trabalho do DirectML de alto nível?

Aqui está a receita de alto nível de como esperamos que o DirectML seja usado. Nas duas fases principais de inicialização e execução, você registra o trabalho em listas de comandos e, em seguida, executa-os em uma fila.

Inicialização

  1. Crie seus recursos do Direct3D 12 – o dispositivo Direct3D 12, a fila de comandos, a lista de comandos e os recursos, como heaps de descritor.
  2. Como você está realizando inferência de aprendizado de máquina e também sua carga de trabalho de renderização, crie recursos DirectML: o dispositivo DirectML e as instâncias de operador. Se você tiver um modelo de machine learning em que precise executar um tipo específico de convolução com um tamanho específico de tensor de filtro com um tipo de dados específico, todos esses serão parâmetros no operador de convolução do DirectML.
  3. Os registros DirectML funcionam em listas de comandos do Direct3D 12. Portanto, depois que a inicialização for concluída, você registrará a associação e a inicialização de (por exemplo) seu operador de convolução em sua lista de comandos. Em seguida, feche e execute sua lista de comandos na fila como de costume.

Execução

  1. Carregue seus tensores de peso em recursos. Um tensor no DirectML é representado usando um recurso regular do Direct3D 12. Por exemplo, se você quiser carregar seus dados de peso para a GPU, faça isso da mesma maneira que faria com qualquer outro recurso do Direct3D 12 (use um heap de upload ou a fila de cópia).
  2. Em seguida, você precisa associar esses recursos do Direct3D 12 como tensores de entrada e saída. Registre em sua lista de comandos a associação e a execução de seus operadores.
  3. Feche e execute sua lista de comandos.

Assim como acontece com o Direct3D 12, o tempo de vida do recurso e a sincronização são de sua responsabilidade. Por exemplo, não libere seus objetos DirectML pelo menos até que eles tenham concluído a execução na GPU.

Fluxos de trabalho camada a camada e baseados em grafos no DirectML

O DirectML dá suporte a abordagens baseadas em camada por camada e grafo para execução de modelo. Ao executar camada por camada, você é responsável por criar e inicializar cada operador DirectML e gravá-los individualmente para execução em uma lista de comandos. Por outro lado, ao executar um grafo, você cria um conjunto de nós e bordas, em que cada nó representa um operador DirectML, e as bordas representam dados tensores fluindo entre nós. O grafo inteiro é enviado para inicialização ou execução de uma só vez e o DirectML manipula o agendamento e a gravação dos operadores individuais em seu nome.

Ambos os padrões são úteis em situações diferentes. Uma abordagem camada por camada oferece controle máximo sobre a ordenação e o agendamento do trabalho de computação. Por exemplo, esse nível de controle permite que você intercale cargas de trabalho de renderização do Direct3D 12 com seus dispatches de computação DirectML. Isso pode ser útil para aproveitar as unidades de computação ou sombreador assíncronas em sua GPU que, de outra forma, estariam ociosas. Executar manualmente camada por camada também fornece controle explícito do desenvolvedor sobre layouts de tensores e uso da memória.

No entanto, os modelos de machine learning geralmente são expressos em termos de grafos de camadas. Como alternativa à abordagem camada por camada, o DirectML permite que você expresse seu modelo como um grafo acíclico direcionado de nós (operadores DirectML) e arestas entre eles (descrições de tensores). Depois de compilar uma descrição do grafo, você pode compilar e enviar tudo de uma vez ao DirectML para inicialização e execução. Nessa abordagem, o DirectML decide em uma ordem de passagem e manipula cada operador individual e o fluxo de dados entre eles em seu nome. Geralmente, essa é uma maneira mais simples e natural de representar um modelo de aprendizado de máquina e permitir que otimizações específicas da arquitetura sejam aplicadas automaticamente. Além disso, a biblioteca auxiliar DirectMLX fornece uma sintaxe limpa e conveniente para criar grafos complexos de operadores DirectML.

Seja qual for a abordagem que você preferir, você sempre terá acesso ao mesmo extenso conjunto de operadores DirectML. Isso significa que você nunca precisa sacrificar a funcionalidade se preferir o controle refinado da abordagem camada por camada ou a conveniência da abordagem de grafo.

Nesta seção

Tópico Descrição
Guia de Início Rápido Introdução ao uso do DirectML.
Ferramentas para Desenvolvedores Ferramentas para criar perfil, otimizar e depurar o DirectML.
Guia de programação Tópicos sobre associação de dados, barreiras, slides, fusões, tratamento de erros, remoção de dispositivo e funções auxiliares.
Resolução de problemas Manipulando condições de erro e usando a camada de depuração.
Histórico de versão do DirectML O DirectML é um componente do sistema do Windows 10 e também está disponível como um pacote redistribuível autônomo.
Histórico de nível de funcionalidade do DirectML Um manifesto dos tipos introduzidos em cada nível de funcionalidade.
Aplicativos de exemplo do DirectML Links para aplicativos de exemplo DirectML, incluindo um exemplo de um aplicativo DirectML mínimo.
Treinamento de ML acelerado de GPU Aborda o que atualmente é compatível com o treinamento de ML (aprendizado de máquina) acelerado de GPU para o Subsistema do Windows para Linux (WSL) e o Windows nativo.
Referência da API do DirectML Esta seção aborda as APIs de aprendizado de máquina direto (DirectML) declaradas em DirectML.h.

Consulte também