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.
Resumo
Direct Machine Learning (DirectML) é uma API de baixo nível para aprendizado de máquina (ML). A API tem uma interface de programação familiar (C++ nativo, nano-COM) e fluxo de trabalho no estilo do DirectX 12. Você pode integrar tarefas de inferência de aprendizagem automática no seu jogo, motor, middleware, backend ou outra aplicação. O DirectML é suportado por 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. Denoising e super-resolução, por exemplo, permitem obter efeitos de ray tracing impressionantes com menos raios por pixel.
Você pode integrar tarefas de inferência de aprendizagem automática no seu jogo, motor, middleware, backend ou outra aplicação. O DirectML tem uma interface de programação e fluxo de trabalho familiar (C++ nativo, nano-COM) no estilo DirectX 12 e é suportado por todo o hardware compatível com DirectX 12. Para aplicativos de exemplo DirectML, incluindo uma amostra 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 seu desempenho de aprendizado de máquina para cenários em tempo real, de alto desempenho, baixa latência ou com restrição de recursos, o DirectML oferece mais controle e flexibilidade. Você pode usar o DirectML para integrar o aprendizado de máquina diretamente em seu mecanismo existente ou pipeline de renderização, ou para criar suas próprias estruturas personalizadas de aprendizado de máquina e middleware no Windows.
Você também pode usar o DirectML indiretamente por meio do ONNX Runtime, que é uma biblioteca multiplataforma que suporta o formato ONNX padrão aberto para modelos de aprendizado de máquina. 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 do WinML, que é uma API de nível mais alto, focada no modelo, que simplifica o fluxo de trabalho de aprendizado de máquina com seu padrão load-bind-evaluation. WinML também usa o formato ONNX para modelos e pode usar DirectML como seu back-end. O WinML foi projetado para cenários onde você precisa integrar rápida e facilmente o aprendizado de máquina em seus aplicativos do Windows, sem se preocupar com os detalhes do hardware ou estrutura subjacente.
Que trabalho faz o DirectML; e que trabalho devo fazer como desenvolvedor?
O DirectML executa eficientemente as camadas individuais do seu modelo de inferência na GPU (ou em núcleos de aceleração de IA, se presentes). 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 gráfico (consulte a seção Fluxos de trabalho camada por camada e baseados em gráficos em DirectML).
Os operadores e gráficos aplicam otimizações específicas de hardware e arquitetura. Ao mesmo tempo, você, como desenvolvedor, vê uma interface única e 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, ReLUsigmoid, tanh e muito mais.
- Operadores baseados em elementos, como add, 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 pooling, como média, lp e máx.
- Operadores de redes neurais (NN), como gemm, gru, lstm e rnn.
- E muito mais.
Para obter o máximo desempenho e para que você não pague pelo que não usa, o DirectML coloca o controle em suas mãos como desenvolvedor sobre como sua carga de trabalho de aprendizado de máquina é executada no hardware. Descobrir quais operadores executar, e quando, é sua responsabilidade como desenvolvedor. As tarefas que são deixadas ao seu critério incluem: transcrever o modelo; simplificar e otimizar as suas camadas; pesos de carga; alocação de recursos, vinculação, gerenciamento de memória (assim como no Direct3D 12); e execução do gráfico.
Você mantém um conhecimento de alto nível de seus gráficos (você pode codificar seu modelo diretamente ou pode escrever seu próprio carregador de modelos). Você pode projetar um modelo de upscaling, por exemplo, usando várias camadas, cada uma delas com os operadores upsample, convolution, normalização e ativação. Com essa familiaridade, agendamento cuidadoso e gerenciamento de barreiras, você pode extrair o máximo de paralelismo e desempenho do hardware. Se você estiver desenvolvendo um jogo, seu gerenciamento cuidadoso de recursos e controle sobre o agendamento permite que você intercale cargas de trabalho de aprendizado de máquina e trabalho de renderização tradicional para saturar a GPU.
O que é o fluxo de trabalho DirectML de alto nível?
Aqui está a receita de alto nível de como esperamos que o DirectML seja usado. Dentro das 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
- Crie os seus recursos do Direct3D 12, incluindo o dispositivo Direct3D 12, a fila de comandos, a lista de comandos e recursos, como pilhas de descritores.
- Como você está fazendo inferência de aprendizado de máquina, bem como sua carga de trabalho de renderização, crie recursos DirectML — o dispositivo DirectML e as instâncias do operador. Se você tiver um modelo de aprendizado de máquina 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, esses são todos os parâmetros no operador de convolução do DirectML.
- Os registros DirectML funcionam em listas de comandos do Direct3D 12. Assim, uma vez que a inicialização é feita, você registra a ligação e 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
- Carregue os seus tensores de peso em recursos. Um tensor no DirectML é representado usando um recurso Direct3D 12 regular. Por exemplo, se você quiser carregar seus dados de peso para a GPU, faça isso da mesma forma que faria com qualquer outro recurso do Direct3D 12 (use uma pilha de carregamento ou a fila de cópia).
- Em seguida, você precisa vincular esses recursos do Direct3D 12 como tensores de entrada e saída. Registre em sua lista de comandos a vinculação e a execução de seus operadores.
- Feche e execute sua lista de comandos.
Tal como acontece com o Direct3D 12, o tempo de vida dos recursos e a sincronização são da 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 gráficos no DirectML
O DirectML suporta abordagens camada por camada e baseadas em gráficos para a execução do 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 gráfico, constrói-se um conjunto de nós e arestas — onde cada nó representa um operador DirectML e as arestas representam os dados tensores fluindo entre os nós. O gráfico inteiro é então enviado para inicialização ou execução de uma só vez, e o DirectML lida com o agendamento e a gravação dos operadores individuais em seu nome.
Ambos os padrões são úteis em diferentes situações. Uma abordagem camada a camada oferece controle máximo sobre o ordenamento e o agendamento do trabalho computacional. Por exemplo, esse nível de controle permite que você intercale cargas de trabalho de renderização do Direct3D 12 com seus despachos de computação DirectML. Isso pode ser útil para tirar proveito de unidades de computação assíncronas ou sombreador em sua GPU que, de outra forma, estariam ociosas. A execução manual camada por camada também dá ao desenvolvedor controle explícito sobre layouts tensores e uso de memória.
No entanto, os modelos de aprendizagem automática são frequentemente expressos em termos de gráficos de camadas. Como alternativa à abordagem camada por camada, o DirectML permite que você expresse seu modelo como um gráfico acíclico direcionado de nós (operadores DirectML) e arestas entre eles (descrições tensoras). Depois de criar uma descrição do gráfico, você pode compilá-lo e enviá-lo de uma só vez para o DirectML para inicialização e execução. Nessa abordagem, o DirectML decide sobre uma ordem transversal e lida com cada operador individual e o fluxo de dados entre eles em seu nome. Esta é muitas vezes uma maneira mais simples e natural de expressar um modelo de aprendizado de máquina e permitir que otimizações específicas de arquitetura sejam aplicadas automaticamente. Além disso, a biblioteca auxiliar do DirectMLX fornece uma sintaxe limpa e conveniente para criar gráficos complexos de operadores DirectML.
Seja qual for a abordagem que preferir, terá sempre acesso ao mesmo conjunto extensivo de operadores DirectML. Isso significa que você nunca precisa sacrificar a funcionalidade, quer prefira o controle refinado da abordagem camada por camada ou a conveniência da abordagem gráfica.
Nesta secção
| Tópico | Descrição |
|---|---|
| Guia de início rápido | Comece a usar o DirectML. |
| Ferramentas de Programação | Ferramentas para criar perfil, otimizar e depurar DirectML. |
| Guia de programação | Tópicos sobre vinculação de dados, barreiras, slides, fusões, tratamento de erros, remoção de dispositivos e funções auxiliares. |
| Solução de problemas | Manipulando condições de erro e usando a camada de depuração. |
| Histórico de versões 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 DirectML | Links para aplicativos de exemplo DirectML, incluindo uma amostra de um aplicativo DirectML mínimo. |
| Treinamento de ML acelerado por GPU | Abrange o que é atualmente suportado pelo treinamento de aprendizado de máquina acelerado (ML) por GPU para o Subsistema Windows para Linux (WSL) e Windows nativo. |
| Referência da API DirectML | Esta seção aborda as APIs do Direct Machine Learning (DirectML) declaradas em DirectML.h. |
Ver também
- Repositório DirectML GitHub
- de IA do Windows
- Guia de programação do Direct3D 12