Разработка, сборка и инференс на одном облачном Mac
VMKeep предоставляет постоянно работающие выделенные физические машины Apple Silicon, а не виртуальные машины. Команды могут зафиксировать чип, объём памяти и набор инструментов, превратив инференс MLX, мобильную сборку и удалённую совместную работу из временной среды в воспроизводимый рабочий процесс.
- 3
- пути разработки, сборки и инференса
- 3
- фиксированные конфигурации Apple Silicon
- 5
- доступных узлов или площадок
Сначала определите требования задачи, затем решайте, нужен ли узел на постоянной основе
Задачи, которые стоит перенести на облачный Mac, обычно имеют три признака: зависимость от macOS или Apple Silicon, выполнение за пределами локального рабочего времени и необходимость воспроизводить результат в фиксированной среде. Если задача требует лишь краткой локальной проверки, существующего устройства может быть достаточно.
Оставьте рабочее пространство на удалённой машине
Используйте SSH для разработки в командной строке и автоматизации, а VNC — для работы с графическим интерфейсом macOS. Код, зависимости и локальные сервисы сохраняются, поэтому не нужно каждый день заново настраивать среду.
- Входные данные
- Репозиторий, lock-файлы зависимостей, инструменты разработки
- Выполнение
- Интерактивная разработка, отладка, краткосрочная совместная работа
- Результат
- История коммитов, результаты тестов, воспроизводимое рабочее пространство
Передайте конвейер фиксированной машине
Разместите runner, Xcode, CocoaPods, Node.js и кеш зависимостей на одном физическом узле, чтобы каждая сборка выполнялась в одинаковых пределах каталогов, версий и прав доступа.
- Входные данные
- Исходный код, параметры сборки, авторизованные материалы подписи
- Выполнение
- Тестирование, упаковка, архивация, повтор после сбоя
- Результат
- Логи, отчёты о тестах, отслеживаемые артефакты сборки
Фиксированная аппаратная база для оценки моделей
Запускайте MLX на чётко заданной конфигурации чипа и памяти, фиксируйте версию квантования модели, пиковое потребление памяти, задержку до первого токена и устойчивую пропускную способность, чтобы устройства разных участников не искажали результаты.
- Входные данные
- Веса модели, параметры квантования, набор для оценки
- Выполнение
- Сервис инференса, пакетная оценка, сбор логов
- Результат
- API, эталонные данные, основание для выбора конфигурации
От файла модели к вызываемому API: сначала пройдите самый короткий путь проверки
При первом развёртывании не обязательно сразу создавать сложную оркестрацию. Сначала на самом узле убедитесь, что модель загружается, запросы возвращают ответ, а потребление памяти не растёт постоянно, и только затем откройте доступ контролируемым клиентам. Так проще отдельно найти проблемы совместимости модели и сети.
-
01
Подготовьте модель и данные для проверки
Зафиксируйте источник и версию модели, способ квантования, длину контекста и контрольную сумму файла. Храните каталог модели отдельно от кода сервиса, чтобы менять версию квантования без изменения логики запуска.
-
02
Создайте изолированную среду выполнения
Зафиксируйте версии Python и зависимостей MLX, а список установки сохраните в репозитории. Сначала выполните одиночный инференс из командной строки и проверьте токенизатор, формат весов и требования к памяти.
-
03
Запустите сервис на локальном адресе
Сначала слушайте локальный адрес, добавьте проверку работоспособности, тайм-аут запроса и структурированные логи. Проверьте структуру ответа фиксированными промптами, затем наблюдайте задержку до первого токена и пиковое потребление памяти.
-
04
Подключите вызовы приложения
После подтверждения стабильности локальных запросов откройте доступ в соответствии с сетевой политикой команды. Клиент должен сохранять тайм-ауты, повторы и идентификаторы запросов, а сервер — версию модели и параметры инференса.
curl -X POST http://127.0.0.1:8080/infer \
-H "Content-Type: application/json" \
-d '{
"prompt": "Summarize build log",
"max_tokens": 128
}'
- Сначала проверьте
- завершена ли загрузка модели и стабильно ли потребление памяти процессом
- Затем зафиксируйте
- задержку до первого токена, общее время и число выходных токенов
- И только потом откройте доступ
- область прослушивания, контроль доступа и тайм-аут клиента
Только при фиксированных аппаратных и входных условиях данные оценки можно сравнивать
Не фиксируйте только одно значение пропускной способности. Версия модели, способ квантования, длина контекста, число параллельных запросов и число прогревов меняют результат. Сначала закрепите условия теста, а затем решайте, менять ли модель или обновлять конфигурацию.
Что следует сохранять для воспроизводимой оценки
- Аппаратная база:чип, память, версия системы и доступное дисковое пространство.
- База модели:версия модели, формат квантования, длина контекста и размер пакета.
- База выполнения:число прогревов, параллелизм, набор промптов и условия остановки.
- База результатов:пиковая память, задержка до первого токена, устойчивая пропускная способность, ошибки и причины завершения.
| Параметр | Фиксированные условия | Назначение |
|---|---|---|
| Версия квантования | Одна и та же модель и длина контекста | Сравнение компромиссов между точностью, памятью и скоростью |
| Пиковая память | Одинаковые входные данные и число параллельных запросов | Проверка запаса конфигурации для стабильной работы |
| Задержка до первого токена | Одинаковое состояние прогрева | Оценка времени ожидания интерактивного запроса |
| Устойчивая пропускная способность | Одинаковая длина вывода | Оценка работы с длинными ответами и пакетными задачами |
| Запись сбоя | Сохраняйте идентификатор запроса и логи | Разделение проблем модели, памяти, сервиса и клиента |
Разделите непрерывную сборку на шесть проверяемых этапов поставки
Ценность фиксированного физического узла не только в возможности запускать Xcode, но и в чётких границах для исходного кода, зависимостей, тестов, операций подписи и расположения архивов. При сбое можно пройти по порядку выполнения, а не заново искать различия среды.
-
01
Получите исходный код
Используйте ограниченные учётные данные для чтения нужного репозитория, зафиксируйте ветку, коммит и состояние подмодулей.
-
02
Восстановите зависимости
Установите зависимости по lock-файлу, изолируя кеши по проекту и версии, чтобы старый кеш не влиял на сборку.
-
03
Выполните сборку
Явно укажите workspace, scheme, configuration и destination, сохраните полную команду.
-
04
Запустите тесты
Ведите отдельные записи модульных тестов, UI-тестов и неудачных сценариев, сохраняя машиночитаемый отчёт.
-
05
Обработайте подпись
Ограничьте доступ к материалам подписи и не записывайте содержимое сертификатов и конфиденциальные учётные данные в логи сборки.
-
06
Сохраните архивные артефакты
Сохраняйте архивы, логи и отчёты о тестах по номеру коммита и задания, задав политику очистки.
Сначала определите этап сбоя, затем решайте, повторно запускать тесты, пересобирать зависимости или заново создавать архив. Для проблем кеша, сети и кода используйте разные стратегии повторного запуска.
Зависимости JavaScript и нативный проект должны иметь единую историю версий
Сборка React Native охватывает Node.js, менеджер пакетов, CocoaPods и Xcode. Недостаточно зафиксировать версии только JavaScript-пакетов: Ruby, Pods, настройки проекта Xcode и команду сборки также следует включить в воспроизводимый список.
От установки зависимостей до автоматизированной публикации — в одном рабочем каталоге
Фиксируйте версии среды выполнения и менеджера пакетов, разделяя кеш по отпечатку lock-файла.
Фиксируйте состояние Pods, scheme, конфигурацию сборки и целевое устройство.
Свяжите номер коммита, задание сборки и каталог артефактов.
Границы кеширования
Управляйте кешами JavaScript-пакетов, Pods и производных данных Xcode отдельно. Попадание в кеш ускоряет работу, но не должно скрывать несоответствие версий.
Рекомендуется фиксировать: сводку lock-файла, состояние Pods, версию XcodeГраницы публикации
Скрипты автоматизации должны читать только необходимые для выполнения учётные данные. Скрывайте конфиденциальные данные в логах и очищайте временные файлы после сборки в соответствии с политикой команды.
Рекомендуется сохранять: номер коммита, номер задания, контрольную сумму артефактаSSH — для автоматизации, VNC — для операций с графическим интерфейсом
Оба способа подключения могут использовать одну выделенную физическую машину, но предназначены для разных задач. После первого подключения обновите пароль, настройте ключи SSH и ограничьте распространение учётных данных. Актуальные данные подключения и состояние доступности отображаются в консоли.
Для командной строки и автоматических задач
- Работа с репозиторием, установка зависимостей и запуск сервисов
- Управление runner, просмотр логов и проверка процессов
- Перенаправление портов и контролируемая проверка API
Для графического интерфейса macOS
- Настройка проектов Xcode и работа с симулятором
- Отладка и проверка, требующие работы с окнами
- Удалённые демонстрации и краткосрочная командная работа
Для распределённой работы и временного масштабирования
- Выдавайте минимально необходимые права с учётом обязанностей участника
- Своевременно отзывайте ключи после выхода участника из проекта
- До окончания аренды экспортируйте данные и удалите учётные данные
Распределяйте задачи между узлами по очереди, а не размещайте всё на одной машине
Команда может назначить разные физические узлы для runner, экспериментов с моделями или очередей сборки. Каждый узел отдельно фиксирует область задач, версии среды и каталог артефактов, поэтому поиск неисправностей и планирование ёмкости проще, чем в общей смешанной среде.
Восстановление зависимостей, тесты и архивация выполняются в фиксированном каталоге сборки.
Кеши JavaScript, Pods и производных данных Xcode изолированы.
Фиксируются чип, память, версия модели и входные условия.
Выбирайте конфигурацию по запасу памяти и продолжительности задач
Все три варианта — выделенные физические машины Apple Silicon, а не виртуальные. Для лёгкой проверки контролируйте затраты, для непрерывного конвейера учитывайте кеширование и параллелизм, а для инференса с большим объёмом памяти сначала проверьте пиковое потребление после загрузки модели.
VMKeep M4 Core
M4 · 16GB · 256GB
Подходит для разработки одного проекта, лёгких сборок iOS, проверки среды MLX и небольших тестов совместимости моделей. При ограниченном хранилище заранее спланируйте кеширование и очистку артефактов.
VMKeep M4 Plus
M4 · 24GB · 512GB
Подходит для постоянно работающего runner, кеша зависимостей средних проектов, непрерывной сборки React Native и экспериментов с MLX-инференсом, которым нужен больший запас памяти.
VMKeep M4 Pro
M4 Pro · 64GB · 2TB
Подходит для MLX-инференса с большим объёмом памяти, сравнения квантования крупных моделей, параллельных экспериментов и высоконагруженных очередей сборки. Сначала проверьте конфигурацию на реальной модели и параметрах параллелизма.
Все три конфигурации доступны для заказа на указанных пяти площадках; актуальный статус доступности отображается в консоли.
Сопоставьте реальную задачу с фиксированным облачным Mac
Сначала выберите конфигурацию, затем узел в Сингапуре, Японии (Токио), Южной Корее (Сеуле), Гонконге или на востоке США и срок аренды — день, неделю, месяц или квартал. Заказом и управлением машиной можно заниматься в консоли.