Información general de DirectML

Resumen

Direct Machine Learning (DirectML) es una API de bajo nivel para el aprendizaje automático (ML). La API tiene una interfaz de programación familiar (C++ nativo, nano-COM) y un flujo de trabajo al estilo de DirectX 12. Puede integrar las cargas de trabajo de inferencia del aprendizaje automático en su juego, motor, middleware, back-end u otra aplicación. DirectML admite todo el hardware compatible con DirectX 12.

Los primitivos de Machine Learning acelerados por hardware (denominados operadores) son los bloques de creación de DirectML. A partir de esos bloques de creación, puede desarrollar técnicas de Machine Learning como el escalado vertical, el efecto escalonado (aliasing) y la transferencia de estilos, entre otros. La eliminación de ruido y la superresolución, por ejemplo, permiten lograr impresionantes efectos rayados con menos rayos por píxel.

Puede integrar las cargas de trabajo de inferencia del aprendizaje automático en su juego, motor, middleware, back-end u otra aplicación. DirectML tiene una interfaz de programación y un flujo de trabajo conocidos (C++ y nano-COM nativos) de DirectX 12, y es compatible con todo el hardware compatible con DirectX 12. Para ver las aplicaciones de ejemplo de DirectML, incluido un ejemplo de una aplicación de DirectML mínima, consulte Aplicaciones de ejemplo de DirectML.

DirectML se introdujo en Windows 10, versión 1903, y en la versión correspondiente del Windows SDK.

¿DirectML es adecuado para mi proyecto?

DirectML es una capa de abstracción de hardware de bajo nivel que permite ejecutar cargas de trabajo de aprendizaje automático en cualquier GPU compatible con DirectX 12.

Si necesita optimizar el rendimiento de su aprendizaje automático para escenarios en tiempo real, de alto rendimiento, baja latencia o con recursos limitados, DirectML le ofrece el máximo control y flexibilidad. Puede usar DirectML para integrar el aprendizaje automático directamente en su motor o canalización de renderizado existente, o para crear sus propios marcos y middleware de aprendizaje automático personalizados en Windows.

También puede usar DirectML indirectamente a través de ONNX Runtime, que es una biblioteca multiplataforma compatible con el formato estándar abierto ONNX para modelo de Machine Learning. El Runtime de ONNX puede usar DirectML como uno de sus proveedores de ejecución, junto con otros backends como CPU, CUDA o TensorRT. De este modo, puede aprovechar el rendimiento y la compatibilidad de DirectML sin necesidad de escribir código DirectML.

Como alternativa, puede usar la API WinML, que es una API de alto nivel centrada en el modelo que simplifica el flujo de trabajo del aprendizaje automático con su patrón de carga-bin-evaluación. WinML también usa el formato ONNX para los modelos, y puede usar DirectML como backend. WinML está diseñado para situaciones en las que es necesario integrar de forma rápida y sencilla el aprendizaje automático en las aplicaciones de Windows, sin preocuparse por los detalles del hardware o el marco subyacentes.

¿Qué hace DirectML y qué trabajo debo hacer como desarrollador?

DirectML ejecuta eficazmente las capas individuales del modelo de inferencia en la GPU (o en núcleos de aceleración mediante IA, si están presentes). Cada capa es un operador y DirectML proporciona una biblioteca de operadores primitivos de Machine Learning acelerados por hardware de bajo nivel. Puede ejecutar operaciones de DirectML de forma aislada o en forma de gráfico (consulte la sección Flujos de trabajo basados en capas y gráficos en DirectML).

Los operadores y gráficos aplican optimizaciones específicas del hardware y específicas de la arquitectura. Al mismo tiempo, el desarrollador ve una única interfaz independiente de proveedores para ejecutar esos operadores.

La biblioteca de operadores de DirectML proporciona todas las operaciones habituales que espera poder usar en una carga de trabajo de Machine Learning.

  • Operadores de activación, como lineal, ReLU, sigmoid, tanh, etc.
  • Operadores a nivel de elemento, como add, exp, log, max, min, sub, etc.
  • Operadores de convolución, como convolution 2D y 3D, etc.
  • Operadores de reducción, como argmin, average, l2, sum, etc.
  • Operadores de agrupación, como average, lp y max.
  • Operadores de red neuronal (NN), como gemm, gru, lstm y rnn.
  • ¡Y mucho más!

Para obtener un rendimiento máximo y, por lo tanto, no pagar por lo que no se usa, DirectML coloca le permite controlar como desarrollador cómo se ejecuta la carga de trabajo de Machine Learning en el hardware. Averiguar qué operadores se van a ejecutar y cuándo es su responsabilidad como desarrollador. Las tareas que quedan a su cargo incluyen: transcribir el modelo; simplificación y optimización de las capas; carga de pesos; asignación de recursos, enlace, administración de memoria (igual que con Direct3D 12); y la ejecución del gráfico.

Conserva los conocimientos generales de los gráficos (puede codificar de forma rígida el modelo directamente o puede escribir su propio cargador de modelos). Puede diseñar un modelo de escalado ascendente, por ejemplo, usando varias capas de cada uno de los operadores upsample, convolution, normalization y activation. Con esa familiaridad, programación cuidadosa y administración de barreras, puede extraer el mayor paralelismo y rendimiento del hardware. Si va a desarrollar un juego, la administración cuidadosa de los recursos y el control sobre la programación le permiten intercalar cargas de trabajo de Machine Learning y trabajos de representación tradicionales para saturar la GPU.

¿Cuál es el flujo de trabajo general de DirectML?

Esta es la idea general de cómo esperamos que se use DirectML. Dentro de las dos fases principales de inicialización y ejecución, se registra el trabajo en listas de comandos y, a continuación, se ejecutan en una cola.

Inicialización

  1. Cree los recursos de Direct3D 12: el dispositivo Direct3D 12, la cola de comandos, la lista de comandos y los recursos, como los montones descriptores.
  2. Dado que va a realizar inferencias de aprendizaje automático, así como su carga de trabajo de renderizado, cree recursos DirectML: el dispositivo DirectML y las instancias de operador. Si tiene un modelo de Machine Learning en el que necesita realizar un tipo determinado de convolución con un tamaño determinado de tensor de filtro y un tipo de datos específico, entonces estos serán todos los parámetros del operador convolution de DirectML.
  3. Los registros de DirectML funcionan en una lista de comandos de Direct3D 12. Por lo tanto, una vez finalizada la inicialización, se registra el enlace y la inicialización de (por ejemplo) el operador convolution en la lista de comandos. A continuación, debe cerrar y ejecutar la lista de comandos en la cola como de costumbre.

Ejecución

  1. Cargue los tensores de peso en los recursos. En DirectML los tensores se representan mediante un recurso normal de Direct3D 12. Por ejemplo, si quiere cargar los datos de peso en la GPU, lo hace de la misma manera que lo haría con cualquier otro recurso de Direct3D 12 (use un montón de carga o la cola de copia).
  2. A continuación, debe enlazar esos recursos de Direct3D 12 como tensores de entrada y salida. Registre en la lista de comandos el enlace y la ejecución de los operadores.
  3. Cierre y ejecute la lista de comandos.

Al igual que con Direct3D 12, la duración de los recursos y la sincronización son su responsabilidad. Por ejemplo, no libere los objetos DirectML al menos hasta que se haya completado la ejecución en la GPU.

Flujos de trabajo basados en capas y gráficos en DirectML

DirectML admite enfoques basados en capas y en gráficos para la ejecución del modelo. Al ejecutar capa a capa, usted es el responsable de crear e inicializar cada operador directML y registrarlos individualmente para su ejecución en una lista de comandos. Por el contrario, al ejecutar un gráfico, se crea un conjunto de nodos y bordes, donde cada nodo representa un operador DirectML y los bordes representan los datos del tensor que fluyen entre los nodos. A continuación, se envía todo el gráfico para su inicialización o ejecución a la vez, y DirectML controla la programación y la grabación de los operadores individuales por usted.

Ambos patrones son útiles en situaciones diferentes. Un enfoque de capa a capa le proporciona un control máximo sobre el orden y la programación del trabajo de proceso. Por ejemplo, este nivel de control permite intercalar cargas de trabajo de representación de Direct3D 12 con las distribuciones de proceso de DirectML. Esto puede ser útil para aprovechar las ventajas de las unidades de proceso o sombreador asíncronas en la GPU que, de lo contrario, estarían inactivas. La ejecución manual capa a capa también proporciona un control explícito del desarrollador sobre los diseños del tensor y el uso de memoria.

Sin embargo, los modelos de Machine Learning suelen expresarse en términos de gráficos de capas. Como alternativa al enfoque de capa a capa, DirectML permite expresar el modelo como un grafo acíclico dirigido de nodos (operadores DirectML) y bordes entre ellos (descripciones de tensor). Después de compilar una descripción del gráfico, puede compilarlo y enviarlo todo a la vez a DirectML para su inicialización y ejecución. En este enfoque, DirectML decide un orden de recorrido y controla cada operador individual y el flujo de datos entre ellos por usted. Esto suele ser una manera más sencilla y natural de expresar un modelo Machine Learning, y permite que las optimizaciones específicas de la arquitectura se apliquen automáticamente. Además, la biblioteca auxiliar DirectMLX proporciona una sintaxis clara y práctica para crear gráficos complejos de operadores DirectML.

Sea cual sea el enfoque que prefiera, siempre tendrá acceso al mismo amplio conjunto de operadores de DirectML. Esto significa que nunca tendrá que sacrificar la funcionalidad si prefiere el control específico del enfoque capa a capa o la practicidad del enfoque de grafo.

En esta sección

Tema Descripción
Guía de inicio rápido Introducción a DirectML
Herramientas del desarrollador Herramientas para perfilar, optimizar y depurar DirectML.
Guía de programación Temas sobre enlaces de datos, barreras, deslizamientos, fusiones, control de errores, eliminación de dispositivos y funciones auxiliares.
Solución de problemas Control de las condiciones de error y uso de la capa de depuración.
Historial de versiones de DirectML DirectML es un componente del sistema de Windows 10 y también está disponible como un paquete redistribuible independiente.
Historial de nivel de característica de DirectML Manifiesto de los tipos introducidos en cada nivel de característica.
Aplicaciones de ejemplo de DirectML Vínculos a aplicaciones de ejemplo de DirectML, incluido un ejemplo de una aplicación DirectML mínima.
Entrenamiento de ML acelerado para GPU Trata lo que actualmente admite el entrenamiento de aprendizaje automático acelerado por GPU (ML) para el Subsistema de Windows para Linux (WSL) y Windows nativo.
Referencia de API de DirectML En esta sección se describen las API de Direct Machine Learning (DirectML) declaradas en DirectML.h.

Consulte también