Compartir a través de


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++, 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.

Las primitivas de aprendizaje automático acelerado por hardware (denominadas operadores) son los componentes básicos de DirectML. A partir de esos bloques de construcción, puede desarrollar técnicas de aprendizaje automático como el escalado, el suavizado y la transferencia de estilo, por nombrar solo algunas. La eliminación de ruido y la superresolución, por ejemplo, le permiten lograr impresionantes efectos de trazado de rayos 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 de estilo DirectX 12 conocidos (C++ nativo, nano-COM), y es compatible con todo el hardware compatible con DirectX 12. Para ver las aplicaciones de ejemplo de DirectML, incluida una muestra 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 de 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 necesitas optimizar el rendimiento de tu aprendizaje automático para escenarios en tiempo real, de alto rendimiento, de baja latencia o con recursos limitados, DirectML te ofrece el mayor control y flexibilidad. Puedes usar DirectML para integrar el aprendizaje automático directamente en el motor o la canalización de representación existentes, o para crear tus propios marcos de aprendizaje automático personalizados y middleware en Windows.

También puede usar DirectML indirectamente a través del entorno de ejecución de ONNX, que es una biblioteca multiplataforma que admite el formato ONNX de estándar abierto para modelos de aprendizaje automático. El tiempo de ejecución de ONNX puede usar DirectML como uno de sus proveedores de ejecución, junto con otros back-ends como CPU, CUDA o TensorRT. De este modo, puedes aprovechar el rendimiento y la compatibilidad de DirectML sin tener que escribir ningún código de DirectML tú mismo.

Como alternativa, puedes usar la API de WinML, que es una API de nivel superior centrada en el modelo que simplifica el flujo de trabajo de aprendizaje automático con su patrón de carga, enlace y evaluación. WinML también usa el formato ONNX para los modelos y puede usar DirectML como back-end. WinML está diseñado para escenarios en los que necesita integrar rápida y fácilmente el aprendizaje automático en sus aplicaciones de Windows, sin preocuparse por los detalles del hardware o el marco subyacente.

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

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

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

La biblioteca de operadores de DirectML proporciona todas las operaciones habituales que esperaría poder usar en una carga de trabajo de aprendizaje automático.

  • Operadores de activación, como lineal, ReLU,sigmoide, tanh y más.
  • Operadores de elementos por elementos, como add, exp, log, max, min, sub, etc.
  • Operadores de convolución, como convolución 2D y 3D, y más.
  • Operadores de reducción, como argmin, average, l2, sum, etc.
  • Los operadores de agrupación, como promedio, lp y máx.
  • Operadores de redes neuronales (NN), como gemm, gru, lstm y rnn.
  • Y muchos más.

Para obtener el máximo rendimiento y para que no pagues por lo que no usas, DirectML pone el control en tus manos como desarrollador sobre cómo se ejecuta tu carga de trabajo de aprendizaje automático en el hardware. Averiguar qué operadores ejecutar y cuándo es su responsabilidad como desarrollador. Las tareas que se dejan a su discreción incluyen: transcribir el modelo; simplificar y optimizar sus capas; pesos de carga; asignación de recursos, enlace, administración de memoria (al igual que con Direct3D 12); y ejecución del gráfico.

Conserva un conocimiento de alto nivel de sus gráficos (puede codificar su modelo directamente o puede escribir su propio cargador de modelos). Puede diseñar un modelo de escalado ascendente, por ejemplo, utilizando varias capas de operadores de muestreo ascendente, convolución, normalización y activación . Con esa familiaridad, programación cuidadosa y administración de barreras, puede extraer el mayor paralelismo y rendimiento del hardware. Si está desarrollando un juego, la administración cuidadosa de los recursos y el control de la programación le permiten intercalar las cargas de trabajo de aprendizaje automático y el trabajo de renderizado tradicional para saturar la GPU.

¿Cuál es el flujo de trabajo de DirectML de alto nivel?

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

Inicialización

  1. Cree los recursos de Direct3D 12: el dispositivo de Direct3D 12, la cola de comandos, la lista de comandos y recursos como montones de descriptores.
  2. Dado que está realizando la inferencia de aprendizaje automático, así como la carga de trabajo de representación, cree recursos de DirectML: el dispositivo de DirectML y las instancias del operador. Si tienes un modelo de aprendizaje automático en el que necesitas realizar un tipo determinado de convolución con un tamaño determinado de tensor de filtro con un tipo de datos determinado, todos esos son parámetros en el operador de convolución de DirectML.
  3. Los registros de DirectML funcionan en listas 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 de convolución en la lista de comandos. A continuación, cierre y ejecute la lista de comandos en la cola como de costumbre.

Ejecución

  1. Cargue sus tensores de peso en los recursos. Un tensor en DirectML se representa mediante un recurso normal de Direct3D 12. Por ejemplo, si desea cargar los datos de peso en la GPU, hágalo 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 su lista de comandos el enlace y la ejecución de sus 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 liberes los objetos de DirectML al menos hasta que hayan completado la ejecución en la GPU.

Flujos de trabajo capa por capa y basados en gráficos en DirectML

DirectML admite enfoques capa por capa y basados en gráficos para la ejecución de modelos. Al ejecutar capa por capa, es responsable de crear e inicializar cada operador de 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 de DirectML y los bordes representan datos tensoriales que fluyen entre nodos. A continuación, todo el gráfico se envía para su inicialización o ejecución de una sola vez, y DirectML se encarga de la programación y el registro de los operadores individuales en su nombre.

Ambos patrones son útiles en diferentes situaciones. Un enfoque capa por capa le proporciona el máximo control sobre el orden y la programación del trabajo informático. Por ejemplo, este nivel de control permite intercalar cargas de trabajo de representación de Direct3D 12 con los envíos de proceso de DirectML. Esto puede ser útil para aprovechar las unidades de proceso asincrónicas o de sombreado de la GPU que, de otro modo, estarían inactivas. La ejecución manual capa por capa también proporciona al desarrollador un control explícito sobre los diseños de tensores y el uso de la memoria.

Sin embargo, los modelos de aprendizaje automático a menudo se expresan en términos de gráficos de capas. Como alternativa al enfoque capa por capa, DirectML te permite expresar tu modelo como un grafo acíclico dirigido de nodos (operadores DirectML) y bordes entre ellos (descripciones de tensores). Después de crear 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 transversal y controla cada operador individual y el flujo de datos entre ellos en su nombre. Esta suele ser una forma más sencilla y natural de expresar un modelo de aprendizaje automático y permite que las optimizaciones específicas de la arquitectura se apliquen automáticamente. Además, la biblioteca auxiliar de DirectMLX proporciona una sintaxis limpia y cómoda para crear gráficos complejos de operadores de DirectML.

Sea cual sea el enfoque que prefieras, siempre tendrás acceso al mismo conjunto de operadores de DirectML. Esto significa que nunca tendrá que sacrificar la funcionalidad, ya sea que prefiera el control detallado del enfoque capa por capa o la conveniencia del enfoque de gráficos.

En esta sección

Tema Descripción
Guía de inicio rápido Empieza a usar DirectML.
Herramientas del desarrollador Herramientas para generar perfiles, optimizar y depurar DirectML.
Guía de programación Temas sobre enlace de datos, barreras, diapositivas, fusiones, control de errores, eliminación de dispositivos y funciones auxiliares.
Solución de problemas Manejo de 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ísticas 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 por GPU Cubre lo que actualmente admite el entrenamiento de aprendizaje automático (ML) acelerado por GPU para el Subsistema de Windows para Linux (WSL) y Windows nativo.
Referencia de la API de DirectML En esta sección se tratan las API de Direct Machine Learning (DirectML) declaradas en DirectML.h.

Consulte también