Prestanda och minne för Windows ML

I den här artikeln går vi igenom hur du hanterar programmets prestanda när du använder Windows Machine Learning.

Trådning och samtidighet

Varje objekt som exponeras från runtime-miljön är agil, vilket innebär att de kan nås från valfri tråd. Mer information om agil finns i Agile-objekt i C++/WinRT .

Ett viktigt objekt som du kommer att arbeta med är LearningModelSession. Det här objektet är alltid säkert att anropa från valfri tråd.

  • För GPU-sessioner: Objektet låser och synkroniserar samtidiga anrop. Om du behöver samtidighet måste du skapa flera sessioner för att uppnå det.

  • För CPU-sessioner: Objektet låses inte och tillåter samtidiga anrop i en enda session. Du måste vara noga med att hantera ditt eget tillstånd, buffertar och bindningsobjekt.

Du bör vara försiktig och mäta ditt mål för ditt scenario. Moderna GPU-arkitekturer fungerar annorlunda än processorer. Om till exempel låg svarstid är ditt mål kanske du vill hantera hur du schemalägger arbete i cpu- och GPU-motorer med pipelining, inte samtidighet. Den här artikeln om synkronisering av flera motorer är ett bra ställe att komma igång på. Om dataflödet är ditt mål (som att bearbeta så många bilder i taget som möjligt) vill du ofta använda flera trådar och samtidighet för att mätta processorn.

När det gäller trådning och samtidighet vill du köra experiment och mäta tidsinställningar. Prestandan ändras avsevärt baserat på dina mål och scenarion.

Minnesanvändning

Varje instans av LearningModel och LearningModelSession har en kopia av modellen i minnet. Om du arbetar med små modeller kanske du inte bryr dig, men om du arbetar med mycket stora modeller blir det viktigt.

Om du vill frigöra minnet anropar du Dispose på antingen modellen eller sessionen. Ta inte bara bort dem eftersom vissa språk utför lat skräpinsamling.

LearningModel behåller en kopia i minnet för att möjliggöra skapandet av nya sessioner. När du tar bort LearningModel fortsätter alla befintliga sessioner att fungera. Du kommer dock inte längre att kunna skapa nya sessioner med den LearningModel-instansen . För stora modeller kan du skapa en modell och session och sedan ta bort modellen. Genom att använda en enda session för alla anrop till Utvärdera har du en enda kopia av den stora modellen i minnet.

Stöd för Float16

För bättre prestanda och minskat modellavtryck kan du använda ONNXMLTools för att konvertera din modell till float16.

När de har konverterats är alla vikter och indata float16. Så här kan du arbeta med float16-indata och utdata:

  • ImageFeatureValue (ImageFeatureVärde)

    • Rekommenderad användning.
    • Konverterar färger och tensoriserar till float16.
    • Stöder bgr8- och 8-bitars bildformat, som kan konverteras på ett säkert sätt till float16 utan dataförlust.
  • TensorFloat (på engelska)

    • Avancerad sökväg.
    • Float32 konverteras till float16.
    • För bilder är detta säkert att kasta, eftersom bgr8 är liten och passar.
    • För andra typer än bilder kommer Bind att misslyckas, och du måste skicka in en TensorFloat16Bit i stället.
  • TensorFloat16Bit

    • Avancerad sökväg.
    • Du måste konvertera till float16 och skicka indata som float32, som kommer att kastas ner till float16.

Anmärkning

För det mesta utför operatorn fortfarande 32-bitars matematik. Det finns mindre risk för spill och resultatet trunkeras till float16. Däremot, om maskinvaran annonserar stöd för float16, kommer körningen att utnyttja det.

Förbearbetning av indata

WinML utför vissa förbearbetningssteg under täcket för att göra bearbetningen av indata enklare och effektivare. Till exempel kan givna indatabilder vara i olika färgformat och former och kan skilja sig från vad modellen förväntar sig. WinML utför konverteringar på bilderna för att matcha dem, vilket minskar belastningen på utvecklaren.

WinML utnyttjar också hela maskinvarustacken (CPU, GPU och så vidare) för att tillhandahålla de mest effektiva konverteringarna för en viss enhet och ett visst scenario.

Men i vissa fall kanske du vill tensorisera dina indata manuellt på grund av vissa specifika krav som du har. Du kanske till exempel inte vill använda VideoFrame för dina bilder, eller så vill du normalisera pixelvärdena från intervallet 0–255 till intervallet 0–1. I dessa fall kan du utföra din egen anpassade tensorisering på data. Ett exempel på detta finns i Exempel på anpassad tensorisering .

Anmärkning

Använd följande resurser för hjälp med Windows ML:

  • Om du vill ställa eller besvara tekniska frågor om Windows ML använder du taggen windows-machine-learningStack Overflow.
  • Om du vill rapportera en bugg, skicka in en felrapport på vår GitHub-sida .