← Wszystkie wpisy

MLX na Apple Silicon: kiedy potrzebny jest własny model, a nie ten od Apple

Framework Foundation Models firmy Apple oddaje do dyspozycji jeden model: systemowy, zamknięty, darmowy i aktualizowany w rytmie wyznaczanym przez Apple. Do większości zadań językowych wykonywanych na urządzeniu jest to narzędzie właściwe, a sięganie poza nie jest błędem. Bywają jednak zadania wymagające modelu wybranego samodzielnie: konkretnego LLM o otwartych wagach, wersji przypiętej na stałe, dostrojenia wytrenowanego na własnych danych albo możliwości, której model systemowy po prostu nie ma. Gdy potrzebny jest własny model działający lokalnie na urządzeniu, warstwą leżącą pod Foundation Models jest MLX1.

MLX to opracowany przez Apple framework do obliczeń na tablicach, przeznaczony do uczenia maszynowego na Apple Silicon, wraz z API dla Swifta (MLX Swift), które osadza się bezpośrednio w aplikacji2. To nie jest framework systemowy, który się wywołuje — to biblioteka, którą się dostarcza razem z wagami modelu. Na tej różnicy opiera się cały kompromis, a jego zrozumienie decyduje o tym, czy zejść warstwę niżej, czy zostać tam, gdzie postawiło nas Apple.

W skrócie

  • MLX to framework do obliczeń na tablicach w stylu NumPy, zbudowany pod Apple Silicon, z leniwą ewaluacją, składalnymi transformacjami funkcji i backendem opartym na Metal2.
  • Model pamięci zunifikowanej jest powodem, dla którego to działa na telefonie. Tablice żyją w jednej puli pamięci współdzielonej przez CPU i GPU, więc MLX pracuje na obu procesorach na tych samych buforach, bez podatku w postaci kopiowania host–urządzenie3.
  • Model o otwartych wagach (LLM) uruchamia się lokalnie przez LLMModelFactory, wskazując model skwantyzowany, na przykład mlx-community/Llama-3.2-3B-Instruct-4bit, a tekst generuje się przez ChatSession4.
  • Dostrajanie odbywa się za pomocą adapterów LoRA: trenuje się niewielki adapter, dostarcza plik adapters.safetensors, a load(into:) podmienia warstwy Linear modelu bazowego na LoRALinear w trakcie działania5.
  • Koszt własnego modelu: rozmiar aplikacji (wagi są duże), obciążenie pamięci, brak integracji systemowej i pełna odpowiedzialność za każdą aktualizację. Foundation Models nie niesie żadnego z tych kosztów, bo płaci je Apple.

Czym jest MLX i dlaczego Apple Silicon to umożliwia

MLX daje tablice i operacje wyglądające jak NumPy, a do tego transformacje, których wymaga uczenie maszynowe: automatyczne różniczkowanie, wektoryzację i leniwą ewaluację, która buduje graf obliczeń i wykonuje go dopiero przy odczycie wyniku2. Projekt rozwija się przy tym w tempie frameworka badawczego: MLX osiągnął wersję 0.32.0 w lipcu 2026, a MLX Swift 0.31.6 w tym samym tygodniu, przy rytmie wydań mniej więcej co kilka tygodni7. Wersje warto przypiąć i liczyć się z tym, że powierzchnia API będzie dalej rosła. Sam ten opis pasowałby do kilkunastu frameworków. To, co pozwala MLX uruchomić model o miliardach parametrów na urządzeniu mieszczącym się w kieszeni, to model pamięci.

Na klasycznym, desktopowym GPU dane leżą w pamięci RAM systemu, kopiuje się je przez magistralę do osobnej pamięci GPU, żeby wykonać obliczenia, po czym kopiuje wyniki z powrotem. To kopiowanie jest podatkiem, a przy dużym modelu podatkiem brutalnym. Apple Silicon ma pamięć zunifikowaną: jedną pulę, którą CPU, GPU i Neural Engine adresują bezpośrednio. MLX zbudowano wokół tego faktu3. Tablica nie jest „na CPU” ani „na GPU” — jest w pamięci, a każdy procesor operuje na niej w miejscu. Żadnych kopii, żadnego podatku od magistrali. Model o 3 miliardach parametrów skwantyzowany do 4 bitów mieści się w kilku gigabajtach i działa bez przerzucania danych tam i z powrotem, przez które ta sama praca byłaby niepraktyczna na maszynie z osobną kartą GPU i podobną ilością pamięci. Decyzja sprzętowa podjęta przez Apple lata temu jest powodem, dla którego lokalne wnioskowanie z prawdziwego modelu w ogóle ma sens, a kafelkowa architektura z pamięcią zunifikowaną stanowi podłoże, na którym stoi MLX.

Uruchamianie LLM na urządzeniu

Droga od „chcę konkretny model” do tekstu na ekranie jest krótka. Warstwa LLM w MLX Swift wczytuje skwantyzowany model z Hugging Face Hub i go uruchamia4:

let container = try await LLMModelFactory.shared.loadContainer(
    from: HubClient.default,
    using: TokenizersLoader(),
    configuration: .init(id: "mlx-community/Llama-3.2-3B-Instruct-4bit")
)

let session = ChatSession(container)
let response = try await session.respond(to: "Summarize this in one line: \(text)")

Aby budować UI z generowaniem token po tokenie, zamiast pojedynczej odpowiedzi tworzy się strumień i renderuje fragmenty w miarę ich napływania4:

let input = try await container.prepare(input: UserInput(prompt: prompt))
let stream = try await container.generate(input: input, parameters: GenerateParameters())
for await event in stream {
    if case let .chunk(text) = event { /* append to UI */ }
}

Praktyczny ciężar spoczywa głównie na dwóch szczegółach. Po pierwsze, 4bit w identyfikatorze modelu nie jest opcjonalnym dodatkiem: to właśnie kwantyzacja sprawia, że model mieści się w pamięci i działa z użyteczną szybkością na urządzeniu. Dostarcza się wagi 4-bitowe (albo niższe), nie pełną precyzję. Po drugie, wagi są duże nawet po kwantyzacji, więc trzeba świadomie zdecydować, czy dołączyć je do aplikacji (natychmiastowa gotowość, ale opasłe pobieranie), czy pobrać przy pierwszym uruchomieniu (szczupły plik binarny, ale oczekiwanie i ścieżka błędu do obsłużenia). Foundation Models nigdy nie stawia tego pytania, bo model już jest na urządzeniu. Przy MLX wagi to nasz problem.

Dostrajanie: adapter LoRA, a nie nowy model

Powodem, dla którego sięga się po własny model, rzadko jest sam model bazowy — chodzi o nauczenie go naszej domeny. Pełne dostrojenie modelu o miliardach parametrów na urządzeniu nie wchodzi w grę. LoRA (low-rank adaptation) już tak: trenuje się niewielki zestaw wag adaptera, które modyfikują zachowanie modelu bazowego, zostawiając bazę nietkniętą. Adapter waży megabajty, nie gigabajty5.

MLX Swift wczytuje wytrenowany adapter z katalogu zawierającego adapter_config.json oraz adapters.safetensors, a następnie stosuje go do modelu już załadowanego w kontenerze5:

let adapter = try LoRAContainer.from(directory: adapterURL)
await container.update { context in
    try? adapter.load(into: context.model)   // swaps Linear layers for LoRALinear
}

load(into:) zastępuje standardowe warstwy Linear modelu warstwami LoRALinear, które wplatają pochodzące z adaptera delty niskiego rzędu, dzięki czemu wnioskowanie odzwierciedla nasze dostrojenie. Ponieważ model żyje wewnątrz kontenera, adapter stosuje się przez container.update, a adaptery można podmieniać w locie (unload(from:) jednego, load(into:) drugiego), nadając jednemu modelowi bazowemu odmienne zachowanie w zależności od funkcji. Wzorzec odzwierciedla to, co Apple oferuje dla modelu systemowego przez własne adaptery Foundation Models — różnica polega na tym, że tutaj do nas należy model bazowy, potok treningowy i wynik, zamiast adaptowania modelu, którego nie widzimy.

Decyzja: Foundation Models, MLX czy chmura

Trzy warstwy, a zły wybór kosztuje albo utratę możliwości, albo stos pracy, której dało się uniknąć.

  • Foundation Models, gdy model systemowy poradzi sobie z zadaniem. Za darmo, prywatnie, bez żadnych wag do dostarczenia, bez pamięci do zarządzania i z integracją systemową otrzymywaną za nic. To domyślny wybór. Zadania językowe na urządzeniu, pod które Apple to zbudowało (streszczanie, klasyfikacja, ekstrakcja, przeredagowanie, wyjście strukturalne), należą tutaj — kropka.
  • MLX, gdy potrzebny jest model, którego system nie daje: konkretny LLM o otwartych wagach, przypięta wersja, która nie zmieni się pod nami przy aktualizacji systemu, dostrojenie domenowe albo architektura (model wizyjno-językowy, model nietekstowy) wykraczająca poza zakres Foundation Models. Płaci się rozmiarem aplikacji, pamięcią i odpowiedzialnością, a kupuje kontrolę.
  • Chmura, gdy model naprawdę musi być duży: rozumowanie na poziomie czołowych modeli (frontier), analiza długiego kontekstu, wszystko to, co potrafią największe modele, a czego kilkumiliardowy model lokalny nie udźwignie. Praca na urządzeniu nie zastępuje czołowego modelu — to inny punkt na krzywej.

Uczciwy odczyt: MLX to świadome zejście o poziom niżej z konkretnego powodu, a nie lepszy domyślny wybór. Jeśli nie potrafimy nazwać możliwości, której Foundation Models brakuje dla naszej funkcji, MLX nie jest potrzebny, a jego dostarczenie oznacza dźwiganie gigabajtów wag i budżetu pamięci, którego nie trzeba było brać na siebie.

iOS 27 dokłada do tej mapy czwartą warstwę. Core AI to systemowy framework Apple do uruchamiania modelu dostarczonego przez nas, z jawną kontrolą nad specjalizacją, pamięcią podręczną i harmonogramowaniem pracy jednostek obliczeniowych. Nakłada się na MLX na poziomie „własny model, na urządzeniu”, ale nadchodzi z przeciwnej strony: Core AI to zarządzana przez system powierzchnia wykonawcza dla przygotowanego pliku .aimodel, podczas gdy MLX jest biblioteką osadzaną razem z własną pętlą treningową, kwantyzacją i iteracją w środku. Jeśli potrzebą jest szybkie uruchomienie przekonwertowanego modelu pod zarządem systemu, Core AI staje do rywalizacji o to zadanie; jeśli potrzebą jest eksperymentowanie, dostrajanie albo odpowiedzialność za cały potok, narzędziem pozostaje MLX.6

Kiedy po MLX nie sięgać

  • Model systemowy już to potrafi. Warto ponownie przejrzeć listę zadań Foundation Models. Jeśli nasze jest na liście, na tym koniec.
  • Nie stać nas na wagi. Skwantyzowany mały model to wciąż duży zasób. Jeśli rozmiar aplikacji albo pobieranie przy pierwszym uruchomieniu są dla naszych użytkowników realnym ograniczeniem, samo to ograniczenie może przesądzić sprawę.
  • Potrzebna jest ścieżka Neural Engine o najniższym poborze mocy dla stałego modelu. Dla znanego, dostarczonego modelu, który się nie zmienia, Core ML i jego konwerter celują w Neural Engine przy najniższym poborze mocy i najmniejszych opóźnieniach, a na iOS 27 Core AI to deklarowany przez Apple kierunek dla nowych prac nad sieciami neuronowymi, z jawną kontrolą specjalizacji. MLX błyszczy elastycznością i iteracją na poziomie badawczym; frameworki systemowe błyszczą przy zamkniętym modelu produkcyjnym. To różne narzędzia, a „ML na urządzeniu” nie jest jedną decyzją.
  • Nie będziemy tego utrzymywać. Własny model oznacza odpowiedzialność za jego aktualizacje, bezpieczeństwo i dryf. Model systemowy Apple aktualizuje za nas. Jeśli nie mamy obsady, która zajmie się modelem, nie należy go przyjmować.

Umiejętnością, którą MLX nagradza, jest powściągliwość w decyzji o jego użyciu. Framework jest naprawdę niezwykły: prawdziwy model językowy, dostrojony do naszej domeny, działający w całości na urządzeniu, bez serwera i bez kosztu za token, na sprzęcie, którego architektura pamięci powstała dokładnie pod to. Po taką możliwość warto sięgnąć, gdy potrafimy nazwać powód. Sięgnięcie po nią bez powodu oznacza wymianę darmowego, utrzymywanego i zintegrowanego modelu Apple na cięższą, nieutrzymywaną kopię, za którą teraz odpowiadamy. Cała praca polega na trafnej ocenie.

FAQ

Czym jest framework MLX firmy Apple?

MLX to framework do obliczeń na tablicach, przeznaczony do uczenia maszynowego na Apple Silicon, z API w stylu NumPy, składalnymi transformacjami funkcji (automatyczne różniczkowanie, wektoryzacja), leniwymi obliczeniami i backendem opartym na Metal2. MLX Swift to API dla Swifta, pozwalające osadzić go w aplikacji, dzięki czemu własne modele można uruchamiać i dostrajać lokalnie na urządzeniu.

Jak MLX wykorzystuje pamięć zunifikowaną Apple Silicon?

Tablice MLX żyją we współdzielonej pamięci, więc operacje wykonują się na CPU lub GPU bez kopiowania danych między osobnymi pulami pamięci3. Właśnie ta właściwość — zerowy transfer — sprawia, że architektura pamięci zunifikowanej Apple Silicon jest wydajna przy uruchamianiu modeli na urządzeniu.

Czy mogę uruchomić LLM o otwartych wagach na urządzeniu przy użyciu MLX?

Tak. LLMModelFactory.shared.loadContainer(from:using:configuration:) wczytuje skwantyzowany model, na przykład mlx-community/Llama-3.2-3B-Instruct-4bit, z Hugging Face Hub; ChatSession udostępnia respond(to:) dla pojedynczych wywołań, a container.generate(input:parameters:) przesyła strumieniowo zdarzenia .chunk(text) dla wyjścia przyrostowego4.

Jak dostroić model przy użyciu MLX?

Za pomocą adaptera LoRA, a nie nowego modelu. LoRAContainer.from(directory:) wczytuje adapter z katalogu zawierającego adapter_config.json i adapters.safetensors; zastosowany przez container.update podmienia warstwy Linear modelu na warstwy LoRALinear i pozwala wymieniać adaptery w locie5.

MLX, Foundation Models czy Core ML — czego użyć?

Domyślnie Foundation Models, gdy systemowy model Apple poradzi sobie z zadaniem (za darmo, prywatnie, bez wag do dostarczenia)1. Po MLX warto sięgnąć tylko wtedy, gdy potrzebny jest model, którego system nie daje: konkretny LLM o otwartych wagach, przypięta wersja, dostrojenie domenowe albo architektura wykraczająca poza zakres Foundation Models. Core ML sprawdzi się przy zamkniętym modelu produkcyjnym, który potrzebuje ścieżki Neural Engine o najniższym poborze mocy, Core AI na iOS 27 — gdy chodzi o zarządzane przez system wykonanie własnego modelu z jawną kontrolą specjalizacji i harmonogramowania, a chmura — gdy model naprawdę musi mieć skalę czołowych modeli.

Kiedy nie sięgać po MLX?

Gdy model systemowy już to potrafi, gdy nie stać nas na dostarczanie gigabajtów wag, gdy stałemu modelowi lepiej posłuży ścieżka Neural Engine o najniższym poborze mocy w Core ML albo gdy nie mamy obsady, by odpowiadać za aktualizacje, bezpieczeństwo i dryf modelu. MLX to świadome zejście o poziom niżej z nazwanego powodu, a nie lepszy wybór domyślny.



  1. Umiejscowienie MLX względem frameworka Foundation Models: Foundation Models udostępnia stały, systemowy model Apple działający na urządzeniu (zob. Apple Foundation Models: framework LLM działającego na urządzeniu); MLX uruchamia modele wybrane i dostrojone przez nas. Oba odpowiadają na różne potrzeby, na różnych warstwach stosu działającego na urządzeniu. 

  2. Apple Machine Learning Research, MLX i MLX Swift. MLX to framework do obliczeń na tablicach, przeznaczony do uczenia maszynowego na Apple Silicon, z API w stylu NumPy, składalnymi transformacjami funkcji (automatyczne różniczkowanie, wektoryzacja), leniwymi obliczeniami i backendem opartym na Metal. MLX Swift to API dla Swifta pozwalające osadzić go w aplikacjach. 

  3. Dokumentacja MLX, pamięć zunifikowana. Tablice MLX żyją we współdzielonej pamięci; operacje mogą wykonywać się na CPU lub GPU bez przenoszenia danych między osobnymi pulami pamięci, i to właśnie ta właściwość czyni architekturę pamięci zunifikowanej Apple Silicon wydajną przy uruchamianiu modeli na urządzeniu. Tło sprzętowe: TBDR i pamięć zunifikowana w Apple Silicon

  4. Apple Machine Learning Research, MLX Swift Examples / MLX Swift LM. LLMModelFactory.shared.loadContainer(from:using:configuration:) wczytuje skwantyzowany model (na przykład mlx-community/Llama-3.2-3B-Instruct-4bit) z Hugging Face Hub; ChatSession udostępnia respond(to:) dla pojedynczych wywołań, a container.generate(input:parameters:) zwraca strumień zdarzeń .chunk(text) dla wyjścia przyrostowego, poprzez GenerateParameters i UserInput

  5. Apple Machine Learning Research, dokumentacja adapterów LoRA w MLX Swift LM. LoRAContainer.from(directory:) wczytuje adapter z katalogu zawierającego adapter_config.json i adapters.safetensors; zastosowane przez container.update wywołanie adapter.load(into: context.model) zastępuje warstwy Linear modelu warstwami LoRALinear, a unload(from:) usuwa adapter, dzięki czemu adaptery można wymieniać w locie. Dla porównania ścieżka Apple dla modelu systemowego: własne adaptery Foundation Models

  6. Praktyczna praca autora z MLX: autonomiczna pętla badawcza ML prowadząca eksperymenty treningowe o stałym budżecie na Apple Silicon poprzez MLX, samodzielnie modyfikująca architekturę i hiperparametry tak, by minimalizować walidacyjną miarę bits-per-byte, i zachowująca wyłącznie ulepszenia. Opisane tutaj zachowanie pamięci zunifikowanej i kwantyzacji wynika z tych eksperymentów. 

  7. Wydania MLX (v0.32.0, 7 lipca 2026; potwierdzone względem PyPI) oraz wydania MLX Swift (0.31.6, 2 lipca 2026). Od premiery projekt wydał dziesiątki wersji, w rytmie mniej więcej jednej co kilka tygodni. 

Powiązane artykuły

Apple Foundation Models: framework LLM na urządzeniu — wyjaśnienie

Framework Foundation Models od Apple: LanguageModelSession, generowanie z @Generable, wywoływanie narzędzi oraz to, kied…

14 min czytania

Core ML – inferencja na urządzeniu: wzorce, które naprawdę trafiają do produkcji

Core ML uruchamia modele na Neural Engine, GPU lub CPU. Wzorce produkcyjne: konwersja modelu, sterowanie dyspozycją, bud…

10 min czytania

Budowanie systemów AI: od RAG do agentów

Zbudowałem system agentowy o 3500 liniach kodu z 86 hookami i walidacją konsensusu. Oto czego nauczyłem się o RAG, fine-…

8 min czytania