Share via


DirectML 개요

요약

DirectML(Direct Machine Learning)은 ML(기계 학습)을 위한 하위 수준 API입니다. API에는 DirectX 12 스타일의 친숙한(네이티브 C++, nano-COM) 프로그래밍 인터페이스 및 워크플로가 있습니다. 기계 학습 추론 워크로드를 게임, 엔진, 미들웨어, 백 엔드 또는 기타 애플리케이션에 연결할 수 있습니다. DirectML은 모든 DirectX 12 호환 가능 하드웨어에서 지원됩니다.

하드웨어 가속 기계 학습 원리(연산자라고 함)는 DirectML의 구성 요소입니다. 이러한 구성 요소에서 업스케일링, 앤티앨리어싱, 스타일 전송과 같은 기계 학습 기술을 몇 가지만 개발하면 됩니다. 예를 들어, 디노이징 및 초해상도를 사용하면 픽셀당 더 적은 광선으로 인상적인 광선 추적 효과를 얻을 수 있습니다.

기계 학습 추론 워크로드를 게임, 엔진, 미들웨어, 백 엔드 또는 기타 애플리케이션에 연결할 수 있습니다. DirectML에는 친숙한(네이티브 C++, 나노-COM) DirectX 12 스타일 프로그래밍 인터페이스와 워크플로가 있으며, 모든 DirectX 12 호환 하드웨어에서 지원됩니다. 최소 DirectML 애플리케이션의 샘플을 포함한 DirectML 샘플 애플리케이션의 경우 DirectML 샘플 애플리케이션을 참조하세요.

DirectML은 Windows 10 버전 1903 및 해당 버전의 Windows SDK에서 도입되었습니다.

DirectML이 내 프로젝트에 적합한가요?

DirectML은 DirectX 12 호환 GPU에서 기계 학습 워크로드를 실행할 수 있는 하위 수준 하드웨어 추상화 계층입니다.

실시간, 고성능, 대기 시간이 짧거나 리소스가 제한된 시나리오에 대해 기계 학습 성능을 최적화해야 하는 경우 DirectML은 가장 제어 및 유연성을 제공합니다. DirectML을 사용하여 기계 학습을 기존 엔진 또는 렌더링 파이프라인에 직접 통합하거나 Windows에서 사용자 지정 기계 학습 프레임워크 및 미들웨어를 빌드할 수 있습니다.

기계 학습 모델에 대한 개방형 표준 ONNX 형식을 지원하는 플랫폼 간 라이브러리인 ONNX 런타임을 통해 DirectML을 간접적으로 사용할 수도 있습니다. ONNX 런타임은 CPU, CUDA 또는 TensorRT와 같은 다른 백 엔드와 함께 실행 공급자 중 하나로 DirectML을 사용할 수 있습니다. 이렇게 하면 DirectML 코드를 직접 작성하지 않고도 DirectML의 성능과 호환성을 활용할 수 있습니다.

또는 부하 바인딩-평가 패턴으로 기계 학습 워크플로를 간소화하는 더 높은 수준의 모델 중심 API인 WinML API를 사용할 수 있습니다. WinML은 모델에 ONNX 형식을 사용하며 DirectML을 백 엔드로 사용할 수 있습니다. WinML은 기본 하드웨어 또는 프레임워크의 세부 정보를 걱정하지 않고도 기계 학습을 Windows 애플리케이션에 빠르고 쉽게 통합해야 하는 시나리오를 위해 설계되었습니다.

DirectML은 어떤 작업을 수행하며, 개발자는 어떤 작업을 수행해야 하나요?

DirectML은 GPU(또는 있는 경우 AI 가속 코어)에서 사용자 추론 모델의 개별 계층을 효율적으로 실행합니다. 각 계층은 연산자이며, DirectML은 낮은 수준의 하드웨어 가속 기계 학습 기본 연산자의 라이브러리를 제공합니다. DirectML 작업을 격리 또는 그래프로 실행할 수 있습니다(DirectML의 레이어별 및 그래프 기반 워크플로 섹션 참조).

연산자와 그래프는 하드웨어별 및 아키텍처별 최적화를 적용합니다. 동시에 개발자로서 해당 연산자를 실행하기 위한 공급 업체의 제약이 없는 단일 인터페이스를 볼 수 있습니다.

DirectML의 연산자 라이브러리는 기계 학습 워크로드에서 사용할 모든 일반적인 작업을 제공합니다.

  • linear, ReLU, sigmoid, tanh 등과 같은 활성화 연산자.
  • add, exp, log, max, min, sub 등과 같은 요소별(Element-wise) 연산자.
  • 2D 및 3D convolution 등과 같은 나선(Convolution) 연산자.
  • argmin, average, l2, sum 등과 같은 감소 연산자.
  • average, lpmax와 같은 풀링 연산자.
  • gemm, gru, lstmrnn과 같은 NN(신경망) 연산자.
  • 기타 등등

최대 성능을 발휘하고 사용자가 사용하지 않는 것에 대한 비용을 지불하지 않도록 하기 위해 DirectML에서는 하드웨어에서 기계 학습 워크로드가 실행되는 방법을 개발자가 제어할 수 있습니다. 어떤 연산자를 언제 실행할 것인지는 개발자인 사용자의 책임입니다. 사용자의 재량에 맡겨진 과제로는 모델 전송, 계층 간소화 및 최적화, 가중치 로드, 리소스 할당, 바인딩, 메모리 관리(Direct3D 12와 마찬가지로) 및 그래프 실행이 있습니다.

그래프에 대한 높은 수준의 지식을 보유하고 있는 경우(모델을 직접 하드 코딩하거나 자신의 모델 로더를 직접 작성할 수 있음) 예를 들어 upsample, convolution, normalizationactivation 연산자 각각 여러 레이어를 사용하여 업스케일링 모델을 디자인할 수도 있습니다. 이러한 친숙성, 신중한 일정 예약 및 장벽 관리를 통해 하드웨어에서 최상의 병렬 처리 및 성능을 추출할 수 있습니다. 게임을 개발 중인 경우, 세심한 리소스 관리 및 일정 예약 제어를 통해 GPU를 포화시키기 위해 기계 학습 워크로드와 기존 렌더링 작업을 인터리브할 수 있습니다.

고급 DirectML 워크플로란?

DirectML 사용을 예상하는 방법에 관한 고급 비법이 있습니다. 초기화 및 실행의 두 가지 주요 단계 내에서 작업을 명령 목록에 기록한 다음, 큐에서 실행합니다.

초기화

  1. Direct3D 12 디바이스, 명령 큐, 명령 목록 및 설명자 힙과 같은 리소스 등 Direct3D 12 리소스를 만듭니다.
  2. 렌더링 워크로드뿐만 아니라 기계 학습 추론을 수행하므로 DirectML 리소스(DirectML 디바이스 및 운영자 인스턴스)를 만듭니다. 특정 데이터 유형이 포함된 특정 크기의 필터 텐서를 사용하여 특정 유형의 나선을 수행해야 하는 기계 학습 모델이 있는 경우 이러한 매개 변수는 모두 DirectML의 convolution 연산자에 대한 매개 변수입니다.
  3. DirectML 레코드는 Direct3D 12 명령 목록에서 작동합니다. 따라서 초기화가 완료되면 예를 들어 convolution 연산자의 바인딩 및 초기화를 명령 목록에 기록합니다. 그런 다음, 평소와 같이 큐에서 명령 목록을 닫고 실행합니다.

실행

  1. 리소스에 가중치 텐서를 업로드합니다. DirectML의 텐서는 일반 Direct3D 12 리소스를 사용하여 표시됩니다. 예를 들어, 가중치 데이터를 GPU에 업로드하려면 다른 Direct3D 12 리소스(업로드 힙 또는 복사 큐 사용)와 동일한 방식으로 업로드를 수행합니다.
  2. 다음으로, 이러한 Direct3D 12 리소스를 입력 및 출력 텐서로 바인딩해야 합니다. 명령 목록에 연산자의 바인딩 및 실행을 기록합니다.
  3. 명령 목록을 닫고 실행합니다.

Direct3D 12와 마찬가지로 리소스 수명 및 동기화는 사용자의 책임입니다. 예를 들어 DirectML 개체가 적어도 GPU에서 실행을 완료할 때까지는 릴리스하지 마십시오.

DirectML의 계층별 및 그래프 기반 워크플로

DirectML은 모델 실행에 대한 계층별 및 그래프 기반 접근 방식을 모두 지원합니다. 계층별로 실행할 때는 각 DirectML 연산자를 만들고 초기화하고 명령 목록에서 실행할 수 있도록 개별적으로 기록해야 합니다. 반면, 그래프를 실행할 때 각 노드가 DirectML 연산자를 나타내고 에지가 노드 간에 흐르는 텐서 데이터를 나타내는 노드 및 에지 집합을 대신 빌드합니다. 그런 다음 전체 그래프가 초기화 또는 실행을 위해 한 번에 제출되고 DirectML은 사용자 대신 개별 연산자의 예약 및 기록을 처리합니다.

두 패턴은 서로 다른 상황에서 유용합니다. 계층별 접근 방식을 사용하면 컴퓨팅 작업의 순서 지정 및 예약을 최대한 제어할 수 있습니다. 예를 들어 이 수준의 제어를 통해 Direct3D 12 렌더링 워크로드를 DirectML 컴퓨팅 디스패치와 인터리브할 수 있습니다. 이 기능은 GPU에서 유휴 상태인 비동기 컴퓨팅 또는 셰이더 단위를 활용하는 데 유용할 수 있습니다. 계층별로 계층을 수동으로 실행하면 텐서 레이아웃 및 메모리 사용량을 명시적으로 개발자가 제어할 수 있습니다.

그러나 기계 학습 모델은 계층 그래프 측면에서 표현되는 경우가 많습니다. 계층별 접근 방식 대신 DirectML을 사용하면 모델을 노드(DirectML 연산자)와 둘 사이의 가장자리(텐서 설명)의 방향성 순환 그래프로 표현할 수 있습니다. 그래프에 대한 설명을 작성한 후 초기화 및 실행을 위해 한 번에 모두 컴파일하고 DirectML에 제출할 수 있습니다. 이 방법에서 DirectML은 순회 순서를 결정하고 각 개별 연산자와 사용자 대신 각 연산자 간의 데이터 흐름을 처리합니다. 이는 기계 학습 모델을 표현하는 더 간단하고 자연스러운 방법이며, achitecture별 최적화를 자동으로 적용할 수 있도록 하는 경우가 많습니다. 또한 DirectMLX 도우미 라이브러리는 DirectML 연산자의 복잡한 그래프를 작성하기 위한 클린 편리한 구문을 제공합니다.

어떤 방법을 선호하든 항상 동일한 광범위한 DirectML 연산자 제품군에 액세스할 수 있습니다. 즉, 계층별 접근 방식의 세분화된 제어를 선호하든 그래프 접근 방식의 편리성을 선호하든 기능을 희생할 필요가 없습니다.

섹션 내용

항목 설명
빠른 시작 가이드 DirectML 사용을 시작합니다.
개발자 도구 DirectML을 프로파일 및 최적화하고 디버그하는 도구입니다.
프로그래밍 가이드 데이터 바인딩, 장벽, 슬라이드, 융합, 오류 처리, 디바이스 제거 및 도우미 함수에 대한 항목입니다.
문제 해결 오류 조건 처리 및 디버그 계층 사용
DirectML 버전 기록 DirectML은 Windows 10의 시스템 구성 요소이며 독립 실행형 재배포 가능 패키지로도 사용할 수 있습니다.
DirectML 기능 수준 기록 각 기능 수준에서 도입된 형식의 매니페스트입니다.
DirectML 샘플 애플리케이션 최소 DirectML 애플리케이션 샘플을 포함한 DirectML 애플리케이션 예제의 링크입니다.
GPU 가속 ML 학습 현재 WSL(Linux용 Windows 하위 시스템) 및 네이티브 Windows에 대한 GPU ML(가속 기계 학습) 교육에서 지원되는 내용을 다룹니다.
DirectML API 참조 이 섹션에서는 에 선언된 DirectML(Direct Machine Learning) API에 대해 설명합니다 DirectML.h.

참고 항목