Apple Silicon: model nie chce korzystać z GPU / Metal nieaktywny
Mój Mac z serii M liczy model na procesorze
Autor Jakub Rusinowski
Błąd
ggml_metal_init: failed to allocate buffer
Kiedy się pojawia
Na Macu z M1, M2, M3 albo M4 model albo działa wolno i Monitor aktywności nie pokazuje żadnej pracy GPU, albo kończy się błędem alokacji bufora Metala. Spodziewałeś się, że robotę weźmie na siebie układ graficzny Apple — a on jej nie bierze albo spróbował i zabrakło mu miejsca.
Co się właściwie dzieje
Apple Silicon dzieli jedną pulę pamięci zunifikowanej między CPU i GPU, a llama.cpp i Ollama korzystają z backendu Metal, żeby liczyć na układzie graficznym. Zawodzą dwie rzeczy. Albo Metal w ogóle nie jest aktywny — bo build x86 działa pod Rosettą albo ustawiono zero warstw na GPU — i wtedy wszystko spada na procesor. Albo Metal *jest* aktywny, ale model razem z kontekstem przekracza tę część pamięci zunifikowanej, którą macOS zechce oddać układowi graficznemu, i alokacja bufora się nie udaje. Tak czy inaczej sprowadza się to do rozmiaru: duże modele tłoczą się we wspólnej puli pamięci.
Jak to naprawić
- 1
Dobierz model do swojej pamięci zunifikowanejNajczęstsze rozwiązanie
Na Macu twój „VRAM” to część całkowitej pamięci zunifikowanej, a macOS nie odda GPU wszystkiego. Mac z 8 GB wygodnie uciągnie modele 3B–7B w Q4; 16 GB otwiera drogę do większych; 32 GB i więcej radzi sobie z tymi naprawdę dużymi. Dopasowanie modelu do pamięci to właśnie to, co powstrzymuje alokacje Metala przed niepowodzeniem. Sprawdź, co udźwignie twój konkretny Mac, zanim cokolwiek pobierzesz.
Sprawdź, co pasuje do Twojego sprzętusprawdź, które modele zmieszczą się w pamięci zunifikowanej twojego MacaOtwórz kalkulator VRAM → - 2
Upewnij się, że masz natywny build arm64
Intelowy build llama.cpp działający pod Rosettą nie użyje Metala — policzy wszystko na CPU. Sprawdź, czy twój plik wykonywalny jest natywnym arm64. Jeśli kompilowałeś ze źródeł, zbuduj go z włączonym Metalem.
# should print "arm64", not "x86_64" file $(which ollama) uname -m - 3
Przerzuć warstwy na GPU (llama.cpp)
Mając build z Metalem, zrzuć na układ graficzny wszystkie warstwy. W llama.cpp służy do tego
-nglustawione wysoko (albo na-1). Ollama włącza Metal automatycznie, więc jeśli mimo to liczy na CPU, podejrzewaj instalację x86 pod Rosettą../llama-cli -m model.gguf -ngl 999 - 4
Zmniejsz kontekst, jeśli bufor Metala zawodzi
Jeśli Metal jest aktywny, a mimo to dostajesz błąd alokacji, przeważa szalę najprawdopodobniej cache KV dla długiego kontekstu. Zmniejsz długość kontekstu i spróbuj ponownie.
Powiązane
Najczęściej zadawane pytania
Czy GPU w moim Macu ma osobny VRAM?
Nie. Apple Silicon korzysta z pamięci zunifikowanej, wspólnej dla CPU i GPU. Twój faktyczny „VRAM” to część całego RAM-u, a macOS część rezerwuje dla systemu — Mac z 16 GB nie odda modelowi wszystkich 16 GB.
Jak sprawdzić na Macu, że model faktycznie korzysta z GPU?
W trakcie generowania otwórz Monitor aktywności → Okno → Historia GPU (albo uruchom sudo powermetrics --samplers gpu_power). Realna aktywność układu graficznego oznacza, że Metal jest aktywny; płaska linia — że wszystko liczy się na CPU.
Dlaczego ten sam model działa na Macu kolegi, a u mnie nie?
Prawie zawsze chodzi o wielkość pamięci zunifikowanej. Mac z 32 albo 64 GB pomieści modele, które po prostu nie wchodzą na maszynę z 8 czy 16 GB. Dobieraj model do swojej pamięci, nie do cudzej.