다음을 통해 공유


DirectML 개요

요약

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

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

기계 학습 추론 워크로드를 게임, 엔진, 미들웨어, 백 엔드 또는 기타 애플리케이션에 통합할 수 있습니다. DirectML에는 친숙한(네이티브 C++, nano-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의 연산자 라이브러리는 기계 학습 워크로드에서 사용할 수 있을 것으로 예상되는 모든 일반적인 작업을 제공합니다.

  • 활성화 함수, 선형, ReLU, 시그모이드, tanh 등.
  • 요소별 연산자(예: add, exp, log, max, min, sub 등)
  • 2D 및 3D 컨볼루션 등과 같은 컨볼루션 연산자입니다.
  • argmin, average, l2, sum 등과 같은 감소 연산자입니다.
  • 평균, lpmax와 같은 풀링 연산자입니다.
  • gemm, gru, lstmrnn과 같은 NN(신경망) 연산자입니다.
  • 그리고 더 많은.

최대 성능을 위해 사용하지 않는 것에 대한 비용을 지불하지 않도록 DirectML은 기계 학습 워크로드가 하드웨어에서 실행되는 방식에 대해 개발자로서 컨트롤을 손에 넣습니다. 어떤 연산자를 언제 실행할지 결정하는 책임은 개발자에게 있습니다. 재량에 따라 남은 작업은 다음과 같습니다: 모델을 정확하게 전사하기; 레이어를 간소화하고 최적화하기; 가중치 로드하기; 리소스 할당, 바인딩, 메모리 관리(Direct3D 12와 마찬가지로); 및 그래프 실행하기.

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

상위 수준 DirectML 워크플로는 무엇인가요?

DirectML을 사용하는 방법에 대한 대략적인 레시피는 다음과 같습니다. 초기화 및 실행의 두 가지 주요 단계 내에서 작업을 명령 목록에 기록한 다음 큐에서 실행합니다.

초기화

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

실행

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

Direct3D 12와 마찬가지로 리소스 수명 및 동기화는 사용자의 책임입니다. 예를 들어 최소한 GPU에서 실행을 완료할 때까지 DirectML 개체를 해제하지 마세요.

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.

참고하십시오