Not
Åtkomst till den här sidan kräver auktorisering. Du kan prova att logga in eller ändra kataloger.
Åtkomst till den här sidan kräver auktorisering. Du kan prova att ändra kataloger.
Sammanfattning
Direct Machine Learning (DirectML) är ett lågnivå-API för maskininlärning (ML). API:et har ett välbekant (inbyggt C++, nano-COM) programmeringsgränssnitt och arbetsflöde i stil med DirectX 12. Du kan integrera maskininlärningsinförande i ditt spel, din spelmotor, ditt mellanprogram, ditt bakändssystem eller annan applikation. DirectML stöds av all DirectX 12-kompatibel maskinvara.
Maskinvaruaccelererade maskininlärningsprimitiver (kallas operatorer) är byggstenarna i DirectML. Från dessa byggstenar kan du utveckla maskininlärningstekniker som uppskalning, kantutjämning och stilöverföring, för att bara nämna några. Denoising och superupplösning, till exempel, gör att du kan uppnå imponerande raytraced-effekter med färre strålar per pixel.
Du kan integrera maskininlärningsinförande i ditt spel, din spelmotor, ditt mellanprogram, ditt bakändssystem eller annan applikation. DirectML har ett välbekant (inbyggt C++, nano-COM) programmeringsgränssnitt och arbetsflöde i DirectX 12-stil, och det stöds av all DirectX 12-kompatibel maskinvara. Information om DirectML-exempelprogram, inklusive ett exempel på ett minimalt DirectML-program, finns i DirectML-exempelprogram.
DirectML introducerades i Windows 10 version 1903 och i motsvarande version av Windows SDK.
Är DirectML lämpligt för mitt projekt?
DirectML är ett abstraktionslager för maskinvara på låg nivå som gör att du kan köra maskininlärningsarbetsbelastningar på valfri DirectX 12-kompatibel GPU.
Om du behöver optimera din maskininlärningsprestanda för scenarier i realtid, med höga prestanda, låg latens eller resursbegränsade scenarier ger DirectML dig mest kontroll och flexibilitet. Du kan använda DirectML för att integrera maskininlärning direkt i din befintliga motor eller renderingspipeline, eller för att skapa egna anpassade maskininlärningsramverk och mellanprogram i Windows.
Du kan också använda DirectML indirekt via ONNX Runtime, som är ett plattformsoberoende bibliotek som stöder det öppna standardformatet ONNX för maskininlärningsmodeller. ONNX Runtime kan använda DirectML som en av sina körningsproviders, tillsammans med andra serverdelar som CPU, CUDA eller TensorRT. På så sätt kan du utnyttja prestanda och kompatibilitet för DirectML utan att skriva någon DirectML-kod själv.
Du kan också använda WinML-API:et, som är ett modellfokuserat API på högre nivå som förenklar arbetsflödet för maskininlärning med dess load-bind-evaluate-mönster. WinML använder också ONNX-formatet för modeller och kan använda DirectML som serverdel. WinML är utformat för scenarier där du snabbt och enkelt behöver integrera maskininlärning i dina Windows-program, utan att behöva bekymra dig om detaljerna i den underliggande maskinvaran eller ramverket.
Vilket arbete gör DirectML; och vilket arbete måste jag göra som utvecklare?
DirectML kör effektivt de enskilda lagren i din slutsatsdragningsmodell på GPU:n (eller på AI-accelerationskärnor, om sådana finns). Varje lager är en operator och DirectML ger dig ett bibliotek med primitiva operatorer för maskininlärning på låg nivå. Du kan köra DirectML-åtgärder isolerat eller som ett diagram (se avsnittet Lager-för-lager- och diagrambaserade arbetsflöden i DirectML).
Operatorer och diagram tillämpar maskinvaruspecifika och arkitekturspecifika optimeringar. Samtidigt ser du som utvecklare ett enda, leverantörsoberoende gränssnitt för att köra dessa operatorer.
Biblioteket med operatorer i DirectML innehåller alla vanliga åtgärder som du förväntar dig att kunna använda i en maskininlärningsarbetsbelastning.
- Aktiveringsoperatorer, till exempel linear, ReLU,sigmoid, tanh med mera.
- Elementvisa operatorer, till exempel add, exp, log, max, min, sub med mera.
- Faltningsoperatorer, till exempel 2D- och 3D-faltning med mera.
- Reduktionsoperatorer, till exempel argmin, average, l2, sum med mera.
- Pooloperatorer, till exempel average, lp och max.
- Operatorer för neurala nätverk (NN), till exempel gemm, gru, lstm och rnn.
- Och många fler.
För maximal prestanda, och så att du inte betalar för det du inte använder, lägger DirectML kontrollen i dina händer som utvecklare över hur din maskininlärningsarbetsbelastning körs på maskinvaran. Att ta reda på vilka operatorer som ska köras och när är ditt ansvar som utvecklare. Uppgifter som lämnas till ditt gottfinnande inkluderar: transkribering av modellen; förenkla och optimera dina lager; lastning av vikter; resursallokering, bindning, minneshantering (precis som med Direct3D 12); och exekvering av grafen.
Du behåller kunskap på hög nivå om dina grafer (du kan hårdkoda din modell direkt, eller så kan du skriva en egen modellinläsare). Du kan utforma en uppskalningsmodell, till exempel med hjälp av flera lager vardera av operatorerna upsample, convolution, normalization och activation . Med den förtrogenheten, noggrann schemaläggning och barriärhantering kan du extrahera mest parallellitet och prestanda från hårdvaran. Om du utvecklar ett spel gör din noggranna resurshantering och kontroll över schemaläggningen att du kan interfoliera arbetsbelastningar för maskininlärning och traditionellt renderingsarbete för att mätta GPU:n.
Vad är DirectML-arbetsflödet på hög nivå?
Här är det övergripande receptet för hur vi förväntar oss att DirectML ska användas. Inom de två huvudfaserna initiering och körning registrerar du arbete i kommandolistor och sedan kör du dem i en kö.
Initialisering
- Skapa dina Direct3D 12-resurser – Direct3D 12-enheten, kommandokön, kommandolistan och resurser som beskrivningshögar.
- Eftersom du utför maskininlärningsinferens och din renderingsarbetsbelastning skapar du DirectML-resurser – DirectML-enheten och operatörsinstanserna. Om du har en maskininlärningsmodell där du behöver utföra en viss typ av faltning med en viss storlek på filtertensorn med en viss datatyp, är alla dessa parametrar i DirectML:s faltningsoperator .
- DirectML-poster fungerar i Direct3D 12-kommandolistor. Så när initieringen är klar registrerar du bindningen och initieringen av (till exempel) faltningsoperatorn i kommandolistan. Stäng sedan och kör din kommandolista på din kö som vanligt.
Avrättning
- Ladda upp dina vikttensorer till resurser. En tensor i DirectML representeras med hjälp av en vanlig Direct3D 12-resurs. Om du till exempel vill ladda upp dina viktdata till GPU:n gör du det på samma sätt som du skulle göra med alla andra Direct3D 12-resurser (använd en uppladdningshög eller kopieringskön).
- Därefter måste du binda dessa Direct3D 12-resurser som dina indata- och utdatatensorer. Anteckna bindningen och körningen av dina operatorer i din kommandolista.
- Stäng och kör kommandolistan.
Precis som med Direct3D 12 är resurslivslängd och synkronisering ditt ansvar. Släpp till exempel inte dina DirectML-objekt minst tills de har slutfört körningen på GPU:n.
Lager-för-lager och grafbaserade arbetsflöden i DirectML
DirectML stöder både lager-för-lager- och grafbaserade metoder för modellkörning. När du kör lager för lager ansvarar du för att skapa och initiera varje DirectML-operator och registrera dem individuellt för körning i en kommandolista. När du kör ett diagram skapar du däremot i stället en uppsättning noder och kanter – där varje nod representerar en DirectML-operator och kanter representerar tensordata som flödar mellan noder. Hela diagrammet skickas sedan för initiering eller körning på en gång, och DirectML hanterar schemaläggning och registrering av de enskilda operatörerna åt dig.
Båda mönstren är användbara i olika situationer. En lager-för-lager-metod ger dig maximal kontroll över ordningen och schemaläggningen av beräkningsarbete. Med den här kontrollnivån kan du till exempel interfoliera Direct3D 12-renderingsarbetsbelastningar med dina DirectML-beräkningsutskick. Detta kan vara användbart för att dra nytta av asynkrona beräknings- eller skuggningsenheter på GPU:n som annars skulle vara inaktiva. Manuell körning av lager för lager ger också explicit utvecklarkontroll över tensorlayouter och minnesanvändning.
Maskininlärningsmodeller uttrycks dock ofta i termer av grafer av lager. Som ett alternativ till lager-för-lager-metoden kan du med DirectML uttrycka din modell som en riktad acyklisk graf över noder (DirectML-operatorer) och kanter mellan dem (tensorbeskrivningar). När du har skapat en beskrivning av diagrammet kan du kompilera och skicka allt på en gång till DirectML för initiering och körning. Med den här metoden bestämmer DirectML en bläddringsordning och hanterar varje enskild operator och dataflödet mellan dem för din räkning. Detta är ofta ett enklare och mer naturligt sätt att uttrycka en maskininlärningsmodell och göra det möjligt att tillämpa achitecture-specifika optimeringar automatiskt. Dessutom ger DirectMLX-hjälpbiblioteket en ren och praktisk syntax för att bygga upp komplexa diagram över DirectML-operatorer.
Oavsett vilken metod du föredrar har du alltid tillgång till samma omfattande uppsättning DirectML-operatörer. Detta innebär att du aldrig behöver offra funktionalitet, oavsett om du föredrar den finkorniga kontrollen med lager-för-lager-metoden eller bekvämligheten med grafmetoden.
I det här avsnittet
| Ämne | Beskrivning |
|---|---|
| Snabbstartsguide | Kom igång med DirectML. |
| Utvecklarverktyg | Verktyg för att profilera, optimera och felsöka DirectML. |
| Programmeringsguide | Ämnen om databindning, barriärer, bilder, fusioner, felhantering, borttagning av enheter och hjälpfunktioner. |
| Felsökning | Hantera feltillstånd och använda felsökningslagret. |
| DirectML-versionshistorik | DirectML är en systemkomponent i Windows 10 och är även tillgänglig som ett fristående omdistribuerbart paket. |
| Historik för DirectML-funktionsnivå | Ett manifest för de typer som introduceras på varje funktionsnivå. |
| DirectML-exempelprogram | Länkar till DirectML-exempelprogram, inklusive ett exempel på ett minimalt DirectML-program. |
| GPU-accelererad ML-träning | Omfattar vad som för närvarande stöds av GPU-accelererad maskininlärning (ML) för Windows-undersystemet för Linux (WSL) och inbyggda Windows. |
| DirectML API-referens | Det här avsnittet beskriver Direct Machine Learning-API:er (DirectML) som deklarerats i DirectML.h. |