Sdílet prostřednictvím


Výkon a paměť Windows ML

V tomto článku se podíváme, jak spravovat výkon vaší aplikace při používání služby Windows Machine Learning.

Řetězení a souběžnost

Každý objekt vystavený z modulu runtime je agilní, což znamená, že k nim lze přistupovat z libovolného vlákna. Další informace o agilních objektech najdete v C++/WinRT .

Jedním z klíčových objektů, se kterými budete pracovat, je LearningModelSession. Tento objekt je vždy bezpečný pro volání z libovolného vlákna.

  • U relací GPU: Objekt zamkne a synchronizuje souběžná volání. Pokud potřebujete souběžnost, musíte vytvořit více relací, abyste toho dosáhli.

  • U relací procesoru: Objekt se nezamkne a povolí souběžná volání v jedné relaci. Musíte se postarat o správu svého stavu, bufferů a vazby objektů.

Měli byste se postarat a měřit svůj cíl pro váš scénář. Moderní architektury GPU fungují jinak než procesory. Pokud je vaším cílem například nízká latence, můžete chtít spravovat způsob plánování práce mezi procesory a moduly GPU pomocí pipeliningu, nikoli souběžnosti. Tento článek o synchronizaci s více moduly je skvělým místem, kde můžete začít. Pokud je propustnost vaším cílem (například zpracování co nejvíce obrázků najednou), často chcete použít více vláken a souběžnost, aby bylo možné procesor nasytit.

Pokud jde o řetězení a souběžnost, chcete spustit experimenty a měřit časování. Výkon se výrazně změní na základě vašich cílů a scénáře.

Využití paměti

Každá instance LearningModel a LearningModelSession má kopii modelu v paměti. Pokud pracujete s malými modely, možná vás to nezajímá, ale pokud pracujete s velmi velkými modely, stane se to důležité.

Pokud chcete uvolnit paměť, zavolejte Dispose v modelu nebo relaci. Neodstraňujte je, protože některé jazyky dělají opožděné uvolňování paměti.

LearningModel uchovává kopii v paměti, aby bylo možné vytvořit novou relaci. Když odstraníte model LearningModel, budou všechny existující relace nadále fungovat. Už ale nebudete moct vytvářet nové relace s danou instancí LearningModel . U velkých modelů můžete vytvořit model a relaci a pak model likvidovat. Použitím jediné relace pro všechna volání Evaluate budete mít v paměti jednu kopii velkého modelu.

Podpora float16

Pokud chcete dosáhnout lepšího výkonu a sníženého využití modelu, můžete model převést na float16 pomocí ONNXMLTools .

Po převodu jsou všechny váhy a vstupy float16. Tady je postup, jak pracovat se vstupy a výstupy float16:

  • ImageFeatureValue

    • Doporučené použití.
    • Převede barvy a převede je na formát float16.
    • Podporuje bgr8 a 8bitové formáty obrázků, které lze bezpečně převést na float16 bez ztráty dat.
  • TensorFloat – plovoucí funkce

    • Pokročilá cesta
    • Float32 je přetypováno na float16.
    • U obrázků je bezpečné provést přetypování, protože bgr8 je malý a vhodný.
    • Pro jiné než obrázky se Bind nezdaří a místo toho budete muset předat TensorFloat16Bit.
  • TensorFloat16Bit

    • Pokročilá cesta
    • Nejprve musíte převést na float16 a následně předat vstupy jako float32, které se pak převedou na float16.

Poznámka:

Ve většině případů operátor stále provádí 32bitovou matematiku. Existuje menší riziko přetečení a výsledek se převede na float16. Pokud ale hardware inzeruje podporu float16, modul runtime ho využije.

Předběžné zpracování vstupních dat

WinML provádí některé kroky předzpracování na pozadí, aby bylo zpracování vstupních dat snazší a efektivnější. Zadané vstupní obrázky můžou být například v různých barevných formátech a obrazcích a můžou se lišit od toho, co model očekává. WinML provádí převody obrázků tak, aby se s nimi shodovaly, což snižuje zatížení vývojáře.

WinML také využívá celý hardwarový zásobník (procesor, GPU atd.) k zajištění nejúčinnějších převodů pro konkrétní zařízení a scénář.

V některých případech ale můžete chtít ručně tensorizovat vstupní data kvůli určitým požadavkům, které máte. Například možná nechcete pro obrázky používat VideoFrame nebo chcete normalizovat hodnoty pixelů z rozsahu 0–255 do rozsahu 0–1. V těchto případech můžete na datech provádět vlastní tensorizaci. Příklad najdete v vlastní ukázce tensorizace.

Poznámka:

Pomoc s Windows ML vám poskytnou následující zdroje:

  • Pokud chcete pokládat nebo odpovídat na technické otázky týkající se Windows ML, použijte značku windows-machine-learning ve službě Stack Overflow.
  • Pokud chcete nahlásit chybu, zapište prosím problém na našem GitHubu .