Liderzy opinii

Unikanie Ukrytych Pułapek: Nawigacja po Nieoczywistych Pułapkach w ML na iOS

mm
Dodaj Unite.AI do preferowanych źródeł w Google

Czy potrzebujesz ML?

Uczenie maszynowe jest doskonałe 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 wynikami. Jest to szczególnie prawdziwe w klasycznych zadaniach, takich jak klasyfikacja, regresja i wykrywanie anomalii.

Kiedy jesteś gotowy rozwiązać niektóre ze swoich problemów biznesowych za pomocą ML, musisz rozważyć, gdzie będą uruchamiane Twoje modele ML. Dla niektórych ma sens uruchamianie infrastruktury serwerowej. 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 konsumenckie są wykluczone. Z drugiej strony, utrzymanie infrastruktury jest dość kosztowne, a jeśli urządzenie konsumenckie może uruchamiać Twój model, dlaczego płacić więcej? Ponadto, mogą również wystąpić problemy z prywatnością, w których nie możesz wysyłać danych użytkowników do zdalnego serwera do przetwarzania.

Jednakże, zakładając, że ma sens używanie urządzeń iOS Twoich klientów do uruchamiania modelu ML. Co może 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’y mają 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 zabije aplikację, aby upewnić się, że system operacyjny pozostaje responsywny. Oznacza to, że możesz liczyć tylko na 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 prędkości i śladu pamięci, więc możesz albo szukać mniej wymagających modeli, albo samodzielnie je trenować.

Warstwy sieci (operacje) obsługa

Większość ML i sieci neuronowych pochodzi z dobrze znanych frameworków głębokiego uczenia się, a następnie są przekonwertowane na CoreML z Core ML Tools. CoreML jest silnikiem wnioskowania napisanym przez Apple (AAPL ), 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ż społecznościowe zoo modeli. 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, niektóre nowe architektury mogą zawierać ręcznie napisany kod CUDA dla niektórych warstw. W takich sytuacjach, nie możesz oczekiwać, że CoreML zapewni predefiniowaną warstwę. Niemniej jednak, możesz zapewnić 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 do CoreML wcześnie, nawet przed treningiem. Jeśli masz model, który nie został przekonwertowany od razu, jest możliwe, aby zmodyfikować definicję sieci neuronowej w swoim frameworku DL lub kodzie źródłowym Core ML Tools, aby wygenerować ważny model CoreML bez potrzeby pisania niestandardowej warstwy dla wnioskowania CoreML.

Walidacja

Błędy silnika wnioskowania

Nie ma sposobu, aby przetestować każdą możliwą kombinację warstw, więc silnik wnioskowania zawsze będzie miał pewne błędy. Na przykład, jest powszechne, aby zobaczyć, że dilated convolutions używają zbyt dużej ilości pamięci z CoreML, co wskazuje na źle napisaną implementację z dużym jądrem wypełnionym zerami. Innym powszechnym błędem jest niepoprawny wynik modelu dla niektórych architektur modeli.

W tym przypadku, kolejność operacji może mieć wpływ. Jest możliwe, aby uzyskać niepoprawne wyniki 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ą. Do tego testu, jest pomocne, aby mieć co najmniej pół-wytrenowany model dostępny, w przeciwnym razie błąd numeryczny może się kumulować dla źle zainicjowanych modeli. Nawet jeśli 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 dla wnioskowania. Podczas gdy niektóre modele nie mają żadnego zauważalnego obniżenia dokładności z powodu mniejszej ilości bitów w reprezentacji zmiennoprzecinkowej, inne modele mogą cierpieć. Możesz przybliżyć utratę precyzji, oceniając swój model na komputerze z półprecyzyjną precyzją i obliczając testowy wskaźnik dla Twojego modelu. Jeszcze lepszym sposobem jest uruchomienie go na rzeczywistym urządzeniu, aby dowiedzieć się, czy model jest tak dokładny, jak zamierzony.

Profiling

Różne modele iPhone’a mają różne możliwości sprzętowe. Najnowsze mają ulepszone jednostki 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 na różnych modelach iPhone’a. Jest to dobry pomysł, aby przetestować swoje modele na minimalnie obsługiwanych urządzeniach, aby zapewnić maksymalną zgodność i akceptowalną wydajność dla starszych urządzeń.

Warto również wspomnieć, że CoreML może zoptymalizować niektóre z pośrednich warstw i obliczeń na miejscu, co może znacznie poprawić wydajność. Innym czynnikiem, który należy wziąć pod uwagę, jest to, że czasami model, który działa gorzej na komputerze, może tak naprawdę wykonywać wnioskowanie szybciej na iOS. Oznacza to, że jest warte poświęcenia czasu na eksperymentowanie z różnymi architekturami.

Do dalszej optymalizacji, Xcode ma ładne narzędzie Instruments z szablonem specjalnie dla modeli CoreML, które może dać bardziej szczegółowy wgląd w to, co spowalnia Twoje wnioskowanie modelu.

Podsumowanie

Nikt nie może przewidzieć wszystkich możliwych pułapek podczas tworzenia modeli ML dla iOS. Jednakże, istnieją pewne błędy, które można uniknąć, jeśli wie się, na co zwrócić uwagę. Zacznij konwertować, walidować i profilować swoje modele ML wcześnie, aby upewnić się, że Twój model będzie działał poprawnie i spełniać Twoje wymagania biznesowe, a następnie postępuj zgodnie z wskazówkami, aby zapewnić sukces jak najszybciej.

Konstantin Semianov, jest CTO Neatsy.AI, pierwszą na świecie aplikacją, która wykrywa problemy ze zdrowiem ortopedycznym i podologicznym, wykorzystując AI & AR, przy użyciu tylko aparatu iPhone. Przed Neatsy.AI, pracował jako inżynier R&D w Prisma Labs, twórcy aplikacji Lensa.