На удалённом Mac с Apple Silicon научные и ML-пайплайны часто опираются на conda-forge и соседние каналы. При «длинном» сетевом пути переменными становятся задержка, лимиты запросов и свежесть repodata. Даже неизменный на вид environment.yml может дать разный граф пакетов, если отличаются порядок каналов, зеркало или версия solver. В эксплуатации безопаснее опираться на сухой прогон (dry-run) и платформенный lockfile, чем на «вчера сборка прошла». Этот материал намеренно не повторяет разборы ускорения Git, npm или Homebrew — только фронтенды conda, libmamba и политика согласования YAML. Внутренние ссылки без входа: главная MacPull, каталог блога, смежная матрица по другому менеджеру окружений — Nix Flake и substituter на Mac CI.

Матрица решений: conda, mamba и micromamba

Все три инструмента читают одни и те же метаданные репозитория, но различаются единицей развёртывания, значениями solver по умолчанию и путями кеша. На общем пуле раннеров важнее не «самый быстрый install», а воспроизводимый lock и предсказуемые логи.

Зафиксируйте для команды три проверки: (1) CI и ноутбук читают один и тот же .condarc; (2) вывод conda info согласован по активным каналам, прокси и SSL; (3) в артефакте сборки записаны строки версий mamba/micromamba. Тогда при инциденте проще ответить, кто видел другой repodata.json, а не гадать про «случайный» апдейт индекса.

ИнструментКогда уместенПлюсыРиски в CI
conda (classic)Легаси-рецепты, conda-buildБольше примеров в документацииРазличия solver; фиксируйте lock и версию conda-libmamba-solver
mambaКрупные среды, частые installБыстрый resolve, читаемые логи libmambaОдинаковый CONDA_SOLVER=libmamba и .condarc для всех
micromambaОдин бинарник, эфемерные агентыПростой префикс, мало зависимостей ОСОбязательно разносите MAMBA_ROOT_PREFIX по job; не смешивайте с чужим Miniconda

Зеркальные конечные точки и каналы: channel_alias и .condarc

Порядок в environment.yml в секции channels: напрямую влияет на выбор билдов. Если корпоративное зеркало ближе к площадке, чем публичный CDN, задайте channel_alias или явные HTTPS-URL каналов и раздавайте один и тот же .condarc разработчикам, CI и удалённому Mac. Перед спором о «скорости канала» проверьте цепочку доверия TLS: переменная SSL_CERT_FILE должна указывать на согласованный пакет корней.

# Пример: только для текущего workspace (подставьте реальный хост зеркала)
export SSL_CERT_FILE="${SSL_CERT_FILE:-/etc/ssl/cert.pem}"
cat > ./ci.condarc <<'EOF'
channels:
  - conda-forge
channel_priority: strict
# channel_alias: https://mirror.internal.example.invalid/conda
EOF
export CONDARC="${PWD}/ci.condarc"
export CONDA_CHANNEL_PRIORITY=strict

Строгий приоритет каналов уменьшает сюрпризы при смешении defaults и conda-forge, но не заменяет аудит одобренных URL и политики TLS-инспекции на периметре.

Параметры параллельной установки и загрузки

mamba и micromamba позволяют настраивать параллелизм загрузки и распаковки. На общем удалённом Mac произведение «число job × потоки загрузки» быстро упирается в исходящий лимит регистра или в диск. Начинайте с консервативных значений и поднимайте их только по метрикам p95, а не «на глаз».

Переменная / флагНазначениеСтартовое значениеЗаметка
MAMBA_ROOT_PREFIXКорень micromamba${CI_WORKSPACE}/.mambaИзолирует соседние job
CONDA_PKGS_DIRSКеш .conda/pkgs${CI_WORKSPACE}/.conda/pkgsОбщий кеш — только с политикой блокировок и уборки
MAMBA_DOWNLOAD_THREADS / -jПараллель загрузок4, затем 8 при стабильной сетиПри росте 429 — снижать
CONDA_SOLVERДвижок resolvelibmambaСогласуйте с тем, что использовали при генерации lock
CONDA_HTTP_TIMEOUTТаймаут HTTP90–120 сУвеличивайте на нестабильных линках до появления очереди

Ошибки и повторы: HTTP 429, repodata и 5xx

Трансграничный маршрут часто сочетает 429 Too Many Requests, задержки при скачивании repodata.json и краткие 5xx на зеркале. Если заголовок Retry-After присутствует, соблюдайте его; иначе используйте лестницу пауз 2·4·8·16 секунд с небольшим случайным сдвигом. Не запускайте одинаковый шаг восстановления одновременно десятками job без верхней границы — вы сами создадите шторм на зеркало.

Политику исходящих запросов к артефактным registry (Helm OCI, контейнеры) лучше согласовать с соседними гайдами по пайплайну, чтобы единый белый список и лимиты не противоречили друг другу.

export CONDA_HTTP_TIMEOUT="${CONDA_HTTP_TIMEOUT:-120}"
# Пример: оболочка повторов для install (bash/zsh)
for i in 1 2 3 4 5; do
  micromamba install -y -p ./.venv -c conda-forge numpy && break
  sleep $((4 * i))
done

Согласованность lockfile, export и environment.yml

Пример критериев приёмки: (1) из одного environment.yml генерируется conda-lock для osx-arm64 и коммитится; (2) CI создаёт среду только из lock на релизных ветках; (3) после установки сравниваются micromamba export или conda list --explicit с эталонным снимком; (4) версии инструментов фиксируются в логе. Для релиза ценнее пустой diff, чем комментарий «всё последнее подтянулось».

conda env export --from-history полезен как человекочитаемый контроль намерений, но не заменяет полностью зафиксированный граф в lock. Держите в репозитории и YAML-намерение, и lock — с ясными правилами, какой файл главный на какой ветке.

export MAMBA_ROOT_PREFIX="${CI_WORKSPACE:-$PWD}/.mamba-root"
export CONDA_PKGS_DIRS="${CI_WORKSPACE:-$PWD}/.conda/pkgs"
export CONDA_CHANNEL_PRIORITY=strict

micromamba create -y -p ./.venv -f environment.yml --dry-run
conda-lock lock -f environment.yml -p osx-arm64 -o conda-lock.yml
micromamba create -y -p ./.venv -f conda-lock.yml
micromamba export -p ./.venv > export-after-ci.yml
diff -u baseline-export.yml export-after-ci.yml || true

FAQ (согласовано с JSON-LD)

В: Почему mamba и conda дают разные версии пакета?
О: Сравните каналы, channel_priority и solver. Остаточный разброс закрывайте lockfile, а не «ручным» pin в YAML без обоснования.

В: Повреждённый pkgs на общей машине — что делать?
О: Разделите CONDA_PKGS_DIRS по job или введите сериализацию записи; точечно удаляйте поддерево проблемного пакета перед повтором, а не весь кеш без причины.

В: Нужен ли отдельный раздел про контейнеры?
О: Для OCI-слоёв и чартов используйте специализированные матрицы в блоге; здесь — только conda-артефакты и YAML.

Итог и тарифы удалённого Mac

Трансграничные pull из экосистемы conda становятся управляемыми, когда зафиксированы зеркало и каналы, параллелизм, политика повторов и авторитетный lockfile относительно environment.yml. Если на Apple Silicon нужны выделенный диск под кеш, предсказуемый egress и одновременные сборки без лишних столкновений по pkgs, имеет смысл рассмотреть выделенный узел MacPull.

Без обязательного входа доступны: тарифы, покупка и аренда, центр помощи, технический блог и главная страница. Сопоставьте число параллельных job, объём SSD под .conda и требования к исходящим адресам с выбранным планом.

Удалённый Mac для conda и CI

Тарифы, оформление, помощь и материалы блога открываются без регистрации.