Арендаторы вычислений, которые гоняют Stable Diffusion в режиме img2img через Core ML на Mac mini M4 в Гонконге, Сингапуре, Японии, Корее или на западе США, упираются в один потолок: unified memory одновременно держит веса UNet/VAE, планы графа, очередь оркестратора и горячие каталоги mlmodelc. Ниже — матрица решений, раздельные таймауты Wq/Wc, блок исполняемых параметров и внутренние ссылки на батч-компиляцию Core ML, ORT Core ML EP, разводку очереди и таймаутов и TCO по регионам. Публичные тарифы и оформление заказа по метро читаются без входа до оплаты.
Три типичных узких места на удалённом M4
- Пики компиляции выглядят как «медленный батч». Первый прогон Core ML и запись mlmodelc делят unified memory с тензорами; вторая сессия до прогрева часто сильнее бьёт по p95, чем средняя скорость кадра.
- Один таймаут на всё. Если смешать ожидание в очереди и длительность шагов диффузии, ретраи бьют по дисковому кэшу и маскируют сетевое стадирование как ошибку модели.
- Объектное хранилище как scratch. Потоковая подгрузка кадров по TLS на каждый элемент грузит CPU криптографией, пока пакетный инференс кажется простаивающим — сначала выровняйте префиксы на NVMe, затем масштабируйте хосты.
Матрица решений
Строки — профили эксплуатации; подстраивайте размер батча, число сессий, политику дискового кэша и пару Wq/Wc по разделам ниже. После обновления macOS или Xcode перепрофилируйте ту же строку таблицы.
| Профиль | Пакетный инференс | Параллельные сессии | Дисковый кэш | Wq / Wc |
|---|---|---|---|---|
| Ночной массовый img2img | Рост батча до излома резидентной памяти; фиксированные лестницы разрешения | 16 ГБ: одна дорожка; 24 ГБ: две, если swap плоский | Локальные mlmodelc и префикс тайлов; холодные бандлы вне хоста | Широкий Wq; Wc покрывает компиляцию плюс p95 диффузии |
| Низколатентный API | Батч 1–2; фиксированное число шагов | Семафор на вторую дорожку; 24 ГБ, если совмещаете компиляцию и отдачу | Тёплый деплой-кэш; вытесняйте холод на вторичный диск | Узкий Wq; умеренный Wc; компиляцию метьте отдельно от serve |
| Срез общей аренды | Потолок батча и разрешения на арендатора | Глобальный лимит concurrency; экспорт глубины очереди | Отдельный TMPDIR на APFS на арендатора |
Сначала уменьшайте батч, не раздувая слепо Wc |
Без универсальных кадров в секунду. Маршрут ANE/GPU и покрытие операторов зависят от чекпойнта и сборки — таблица это ограждения, а не SLA.
Конвертация модели и размер батча
Конвертируйте UNet и VAE в поддерживаемый mlprogram или mlpackage; закрепите версию конвертера к хэшу чекпойнта. Наращивайте пакетный инференс, пока не появится излом по резидентной памяти или предупреждениям планировщика; при росте хвоста сначала режьте число шагов, а не только батч.
Смежные материалы: батч и компиляция Core ML, смешанный стек ORT+CoreML.
Потолок параллельных сессий
Каждый воркер очереди держит граф декодера и состояние img2img вместе. Вторую дорожку включайте только когда vm.swapusage не ползёт и индикаторы давления памяти очищаются на двух проходах подряд. Разводку Wq (ожидание слота) и Wc (сама диффузия) копируйте по духу из заметки про WhisperKit: иначе алерты смешают бэклог и вычисление.
Выбор узла (Гонконг, Сингапур, Япония, Корея, запад США)
Совместите метро с корзиной весов: Токио и Сеул — северо-восточная Азия; Сингапур и Гонконг — SEA и Большой залив; запад США — артефакты и egress Северной Америки. Перед боевым батчем сделайте один контрольный TLS-pull и сверьте дефолтные таймауты очереди.
Страницы заказа по регионам: Гонконг, Сингапур, Япония, Корея, США (запад); общий каталог — заказ, пакеты — тарифы.
Стоимость
В полную стоимость входят почасовая аренда M4, исходящий трафик, время «холодной» компиляции и ретраи от схлопнутых таймаутов. Не поднимайте пакетный инференс, пока не зафиксированы правила дискового кэша и соседство с хранилищем весов. После смены региона перечитайте матрицу TCO и задержек и строки на tseny.
Исполняемые параметры
Вставьте в bootstrap воркера или launchd; диапазоны — ориентиры для триажа, не жёсткий SLA.
# Якоря unified memory и swap (только чтение)
sysctl -n hw.memsize
sysctl -n hw.perflevel0.physicalcpu
sysctl vm.swapusage
# Scratch Core ML и декод вне перегруженного home
export TMPDIR="/Users/shared/scratch/coreml-sd/$JOB_ID"
mkdir -p "$TMPDIR"
# Пример ограничителей — подгонка по строке матрицы
export SD_MAX_BATCH=2
export SD_MAX_CONCURRENT_SESSIONS=1
export SD_WQ_SEC=120
export SD_WC_SEC=900
Пять шагов до добавления хостов
- Зафиксируйте чекпойнт, конвертер и digest образа в журнале узла.
- Один прогрев компиляции; холодный старт вынесите в отдельную метку на дашборде.
- Двоичный поиск батча при фиксированном разрешении до роста p95 или swap.
- Разведите метрики ожидания очереди и диффузии; алертируйте раздельно.
- Повторите профиль после переноса региона — меньший RTT не добавляет DRAM.
Сигналы, которые стоит выгрузить в метрики
- Резидентные байты на дорожку относительно
hw.memsizeдля SKU 16 и 24 ГБ. - Доля заданий у границы Wc за скользящее окно — дрейф квантизации или IO.
- МБ/с чтения NVMe против загрузки GPU — ранний признак промахов дискового кэша до роста параллелизма.
FAQ
Внешний SSD? Под архивы и холод; горячие артефакты Core ML держите на встроенном NVMe.
Меньший RTT лечит OOM? Нет — размещение влияет на стадирование, не на объём unified memory.
Итог
Stable Diffusion img2img на арендованном M4 требует дисциплины конвертации и батча, жёсткого потолка сессий, согласованного метро с весами и учёта стоимости, где дисковый кэш и WAN не менее важны, чем «голая» параллельность. Slug: 2026-rent-remote-mac-m4-stable-diffusion-coreml-batch-unified-memory.html.
Готовы перенести ночные волны с ноутбуков на выделенный Apple Silicon: откройте пакеты и цены, выберите метро на странице заказа или сразу по ссылкам регионов выше, уточните сеть в справке — просмотр по-прежнему без обязательного входа.