Udostępnij przez


Wydajność i pamięć uczenia maszynowego systemu Windows

W tym artykule omówimy sposób zarządzania wydajnością aplikacji podczas korzystania z usługi Windows Machine Learning.

Wątkowość i współbieżność

Każdy obiekt uwidoczniony ze środowiska uruchomieniowego jest zwinny, co oznacza, że można uzyskać do nich dostęp z dowolnego wątku. Zobacz Agile objects in C++/WinRT (Obiekty Agile w języku C++/WinRT ), aby uzyskać więcej informacji na temat metody agile.

Jednym z kluczowych obiektów, z którym będziesz pracować, jest LearningModelSession. Ten obiekt jest zawsze bezpieczny do wywołania z dowolnego wątku.

  • W przypadku sesji procesora GPU: obiekt będzie blokować i synchronizować współbieżne wywołania. Jeśli potrzebujesz współbieżności, musisz utworzyć wiele sesji w celu jej osiągnięcia.

  • W przypadku sesji procesora CPU: obiekt nie zostanie zablokowany i zezwoli na współbieżne wywołania w jednej sesji. Należy zadbać o zarządzanie własnym stanem, buforami i obiektami powiązania.

Należy zachować ostrożność i zmierzyć swój cel dla danego scenariusza. Nowoczesne architektury procesora GPU działają inaczej niż procesory CPU. Jeśli na przykład Twoim celem jest małe opóźnienie, możesz zarządzać harmonogramem pracy w silnikach CPU i GPU, korzystając z potokowania zamiast współbieżności. Ten artykuł dotyczący synchronizacji wielosilnikowej to doskonałe miejsce do rozpoczęcia. Jeśli celem jest maksymalna przepływność (na przykład przetwarzanie jak największej liczby obrazów jednocześnie, jak to tylko możliwe), często warto użyć wielu wątków i współbieżności w celu maksymalnego wykorzystania CPU.

Jeśli chodzi o programowanie wielowątkowe i współbieżność, chcesz uruchamiać eksperymenty i mierzyć czasy. Wydajność zmieni się znacząco w zależności od celów i scenariusza.

Wykorzystanie pamięci

Każde wystąpienie modelu LearningModel i LearningModelSession ma kopię modelu w pamięci. Jeśli pracujesz z małymi modelami, możesz nie być zaniepokojony, ale jeśli pracujesz z bardzo dużymi modelami, staje się to ważne.

Aby zwolnić pamięć, wywołaj metodę Dispose w modelu lub sesji. Nie usuwaj ich, tylko niektóre języki wykonują leniwą zbiórkę śmieci.

Model uczenia przechowuje kopię w pamięci, aby umożliwić utworzenie nowej sesji. Po zlikwidowaniu LearningModel wszystkie istniejące sesje będą nadal działać. Jednak nie będziesz już mógł tworzyć nowych sesji z tym wystąpieniem LearningModel. W przypadku dużych modeli można utworzyć model i sesję, a następnie usunąć model. Używając jednej sesji dla wszystkich wywołań funkcji Evaluate, będziesz mieć pojedynczą kopię dużego modelu w pamięci.

Obsługa float16

Aby uzyskać lepszą wydajność i zmniejszyć zużycie modelu, możesz użyć narzędzia ONNXMLTools , aby przekonwertować model na float16.

Po przekonwertowaniu wszystkie wagi i dane wejściowe są liczbami zmiennoprzecinkowymi 16-bitowymi. Oto jak można pracować z danymi wejściowymi i wyjściowymi float16:

  • ImageFeatureValue (Wartość obrazu)

    • Zalecane użycie.
    • Konwertuje kolory i przekształca w tensory typu float16.
    • Obsługuje formaty obrazów bgr8 i 8-bitowych, które można bezpiecznie przekonwertować na float16 bez utraty danych.
  • TensorFloat powiedział:

    • Ścieżka zaawansowana.
    • Rzutowanie float32 na float16.
    • W przypadku obrazów jest to bezpieczne rzutowanie, ponieważ bgr8 jest mały i pasuje.
    • W przypadku elementów innych niż obrazy, Powiązanie zakończy się niepowodzeniem, i zamiast tego należy przekazać TensorFloat16Bit.
  • TensorFloat16Bit (Język angielski)

    • Ścieżka zaawansowana.
    • Musisz przekonwertować na float16 i przekazać dane wejściowe jako float32, które zostaną przekonwertowane na float16.

Uwaga / Notatka

W większości przypadków operator nadal wykonuje 32-bitową matematykę. Istnieje mniejsze ryzyko przepełnienia, a wynik jest przekonwertowany do float16. Jeśli jednak sprzęt anonsuje obsługę float16, środowisko uruchomieniowe skorzysta z niego.

Wstępne przetwarzanie danych wejściowych

WinML wykonuje pewne kroki przetwarzania wstępnego w tle, aby przetwarzanie danych wejściowych było prostsze i bardziej wydajne. Na przykład obrazy wejściowe mogą być w różnych formatach kolorów i kształtach i mogą różnić się od tego, czego model oczekuje. WinML wykonuje konwersje na obrazach, aby dopasować je do siebie, zmniejszając obciążenie dewelopera.

WinML wykorzystuje również cały stos sprzętowy (procesor CPU, procesor GPU itd.), aby zapewnić najbardziej wydajne konwersje dla określonego urządzenia i scenariusza.

Jednak w niektórych przypadkach możesz ręcznie przekształcić dane wejściowe w tensor ze względu na określone wymagania. Na przykład może nie chcesz używać elementu VideoFrame dla obrazów lub chcesz znormalizować wartości pikseli z zakresu od 0 do 255 do zakresu od 0 do 1. W takich przypadkach możesz wykonać niestandardową tensoryzację na danych. Zobacz przykład niestandardowej tensoryzacji .

Uwaga / Notatka

Skorzystaj z następujących zasobów, aby uzyskać pomoc dotyczącą uczenia maszynowego z systemem Windows:

  • Aby zadać lub odpowiedzieć na pytania techniczne dotyczące uczenia maszynowego z systemem Windows, użyj tagu windows-machine-learning w witrynie Stack Overflow.
  • Aby zgłosić usterkę, popełnij zgłoszenie na GitHubie .