Liderzy opinii
Unikanie ukrytych niebezpieczeństw: Nawigacja po nieoczywistych pułapkach w ML na iOS

Czy potrzebujesz ML?
Machine learning jest doskonały w wykrywaniu wzorców. Jeśli uda Ci się zebrać czysty zestaw danych dla Twojego zadania, zwykle jest to tylko kwestia czasu, zanim będziesz w stanie zbudować model ML z nadludzkimi możliwościami. Jest to szczególnie prawdziwe w klasycznych zadaniach, takich jak klasyfikacja, regresja i wykrywanie anomalii.
Kiedy jesteś gotowy rozwiązać niektóre z Twoich problemów biznesowych za pomocą ML, musisz rozważyć, gdzie będą uruchamiane Twoje modele ML. Dla niektórych ma to sens uruchamiać infrastrukturę serwerową. Ma to zalety, takie jak utrzymanie prywatności Twoich modeli ML, co utrudnia konkurentom dogonienie. Ponadto serwery mogą uruchamiać szerszy zakres modeli. Na przykład, modele GPT (opracowane przez ChatGPT) wymagają obecnie nowoczesnych kart graficznych, więc urządzenia konsumentów są wykluczone. Z drugiej strony, utrzymanie infrastruktury jest dość kosztowne, a jeśli urządzenie konsumenta może uruchomić Twój model, po co płacić więcej? Dodatkowo, mogą również wystąpić problemy z prywatnością, w których nie można wysyłać danych użytkowników do zdalnego serwera do przetwarzania.
Jednakże, załóżmy, że ma to sens używać urządzeń iOS Twoich klientów do uruchamiania modelu ML. Co mogłoby pójść nie tak?
Ograniczenia platformy
Ograniczenia pamięci
Urządzenia iOS mają znacznie mniej dostępnej pamięci wideo niż ich odpowiedniki komputerowe. Na przykład, niedawny Nvidia RTX 4080 Ti ma 20 GB dostępnej pamięci. Z drugiej strony, iPhone ma pamięć wideo udostępnioną z resztą pamięci RAM w tym, co nazywają „zjednoczoną pamięcią”. Dla odniesienia, iPhone 14 Pro ma 6 GB pamięci RAM. Ponadto, jeśli przydzieli się więcej niż połowę pamięci, iOS jest bardzo prawdopodobne, że zakończy działanie aplikacji, aby upewnić się, że system operacyjny pozostaje responsywny. Oznacza to, że możesz liczyć tylko na posiadanie 2-3 GB dostępnej pamięci dla wnioskowania sieci neuronowej.
Badacze zwykle trenują swoje modele, aby zoptymalizować dokładność nad użyciem pamięci. Jednakże, istnieje również badanie dostępne na temat sposobów optymalizacji dla szybkości i śladu pamięci, więc możesz albo szukać mniej wymagających modeli, albo przeszkolić jeden sam.
Warstwy sieciowe (operacje) obsługa
Większość ML i sieci neuronowych pochodzi z well-known frameworków głębokiego uczenia i są następnie przekonwertowane na CoreML modelem z Core ML Tools. CoreML jest silnikiem wnioskowania napisanym przez Apple, który może uruchamiać różne modele na urządzeniach Apple. Warstwy są dobrze zoptymalizowane dla sprzętu, a lista obsługiwanych warstw jest dość długa, więc jest to doskonały punkt wyjścia. Jednak inne opcje, takie jak Tensorflow Lite są również dostępne.
Najlepszym sposobem, aby zobaczyć, co jest możliwe z CoreML, jest spojrzenie na niektóre już przekonwertowane modele przy użyciu narzędzi takich jak Netron. Apple wymienia niektóre oficjalnie obsługiwane modele, ale istnieją również zoologie modeli napędzane przez społeczność. Pełna lista obsługiwanych operacji jest stale zmieniana, więc spojrzenie na kod źródłowy Core ML Tools może być pomocne jako punkt wyjścia. Na przykład, jeśli chcesz przekonwertować model PyTorch, możesz spróbować znaleźć niezbędną warstwę tutaj.
Ponadto, pewne nowe architektury mogą zawierać ręcznie napisany kod CUDA dla niektórych warstw. W takich sytuacjach nie można oczekiwać, że CoreML zapewni predefiniowaną warstwę. Niemniej jednak, możesz dostarczyć własną implementację, jeśli masz doświadczonego inżyniera znanego z pisania kodu GPU.
Ogólnie, najlepsza rada tutaj jest spróbować przekonwertować swój model na CoreML wcześnie, nawet przed treningiem. Jeśli masz model, który nie został przekonwertowany od razu, jest możliwe modyfikowanie definicji sieci neuronowej w Twoim frameworku DL lub kodzie źródłowym konwertera Core ML Tools, aby wygenerować ważny model CoreML bez potrzeby pisania warstwy niestandardowej dla wnioskowania CoreML.
Weryfikacja
Błędy silnika wnioskowania
Nie ma możliwości przetestowania każdej możliwej kombinacji warstw, więc silnik wnioskowania zawsze będzie miał pewne błędy. Na przykład, często można zobaczyć, jak sploty rozcieńczone używają zbyt dużej ilości pamięci z CoreML, co prawdopodobnie wskazuje na źle napisaną implementację z dużym jądrem wypełnionym zerami. Inny powszechny błąd to niepoprawny wynik modelu dla niektórych architektur modeli.
W tym przypadku kolejność operacji może mieć wpływ. Możliwe jest uzyskanie niepoprawnych wyników w zależności od tego, czy aktywacja z konwolucją czy połączenie resztkowe przychodzi pierwsze. Jedynym prawdziwym sposobem, aby zagwarantować, że wszystko działa poprawnie, jest wziąć swój model, uruchomić go na zamierzonym urządzeniu i porównać wynik z wersją komputerową. Dla tego testu jest pomocne, aby mieć co najmniej pół-wytrenowany model, w przeciwnym razie błąd numeryczny może się kumulować dla źle zainicjowanych modeli. Chociaż ostatecznie wytrenowany model będzie działał dobrze, wyniki mogą być dość różne między urządzeniem a komputerem dla losowo zainicjowanego modelu.
Utrata precyzji
iPhone używa półprecyzyjnej precyzji rozlegle do wnioskowania. Podczas gdy niektóre modele nie mają żadnego zauważalnego pogorszenia dokładności z powodu mniejszej liczby bitów w reprezentacji zmiennoprzecinkowej, inne modele mogą cierpieć. Można oszacować utratę precyzji, oceniając swój model na komputerze z półprecyzyjną precyzją i obliczając testowy wskaźnik modelu. Jeszcze lepszą metodą jest uruchomienie go na rzeczywistym urządzeniu, aby dowiedzieć się, czy model jest tak dokładny, jak zamierzony.
Profiling
Różne modele iPhone mają różne możliwości sprzętowe. Najnowsze mają ulepszone jednostki przetwarzania Neural Engine, które mogą podnieść ogólną wydajność znacznie. Są one zoptymalizowane dla pewnych operacji, a CoreML jest w stanie inteligentnie rozdzielić pracę między CPU, GPU i Neural Engine. Apple GPU również uległy poprawie w czasie, więc jest normalne, aby zobaczyć wahania wydajności w różnych modelach iPhone. Jest to dobry pomysł, aby przetestować swoje modele na minimalnie obsługiwanych urządzeniach, aby zapewnić maksymalną kompatybilność i akceptowalną wydajność dla starszych urządzeń.
Warto również wspomnieć, że CoreML może zoptymalizować niektóre z pośrednich warstw i obliczeń w miejscu, co może znacznie poprawić wydajność. Innym czynnikiem, który należy wziąć pod uwagę, jest to, że czasem model, który działa gorzej na komputerze, może tak naprawdę wykonywać wnioskowanie szybciej na iOS. Oznacza to, że warto poświęcić trochę czasu na eksperymentowanie z różnymi architekturami.
Dla jeszcze większej optymalizacji, Xcode ma ładne narzędzie Instruments z szablonem specjalnie dla modeli CoreML, które mogą dać bardziej szczegółowy wgląd w to, co spowalnia Twoje wnioskowanie modelu.
Podsumowanie
Nikt nie może przewidzieć wszystkich możliwych pułapek przy tworzeniu modeli ML dla iOS. Jednakże, istnieją pewne błędy, które można uniknąć, jeśli wiesz, na co zwrócić uwagę. Zacznij od konwersji, weryfikacji i profilowania swoich modeli ML wcześnie, aby upewnić się, że Twój model będzie działał poprawnie i spełniać Twoje wymagania biznesowe, i postępuj zgodnie z wskazówkami przedstawionymi powyżej, aby zapewnić sukces jak najszybciej.












