2025, Oct 03 11:16

Почему импорт TensorFlow падает на macOS ARM (Python 3.11) и как обойти проблему

На macOS ARM с Python 3.11 импорт TensorFlow может падать из‑за конфликта PyArrow/Protobuf: mutex lock failed. Объясняем причину и обход — переход на TF 2.19

Импорт TensorFlow на macOS ARM с Python 3.11 может привести к аварийному завершению интерпретатора из‑за ошибки блокировки потока или к зависанию ядра Jupyter. Симптом проявляется сразу при простом import, из‑за чего сбой выглядит неожиданным и его трудно диагностировать на уровне пользовательского кода. Ниже — краткое объяснение того, что происходит, почему это возникает и как действовать безопасно.

Минимальный пример воспроизведения

Сбой проявляется даже при самом простом импорте. Для наглядности — минимальный фрагмент, запускающий тот же кодовый путь через importlib.

import importlib as module_loader

pkg_tf = module_loader.import_module("tensorflow")

В обычном REPL это может завершить процесс с ошибкой времени выполнения C++.

libc++abi: terminating due to uncaught exception of type std::__1::system_error: mutex lock failed: Invalid argument

В Jupyter Notebook ядро может зависнуть на неопределённое время после выполнения ячейки с импортом.

Что на самом деле происходит

Во время импорта TensorFlow подтягивает PyArrow. PyArrow зависит от Protobuf. В затронутой конфигурации интеграция Protobuf на macOS приводит к конфликту, который вызывает низкоуровневую ошибку мьютекса. Сейчас идёт активное обсуждение этого взаимодействия, в том числе деталей о том, что TensorFlow 2.20 и PyArrow используют Protobuf без должного сокрытия символов, а TensorFlow обновил версию Protobuf настолько, что конфликт символов стал критичным. Итог — падение во время импорта.

Две публичные ветки отслеживают первопричины и возможные решения: apache/arrow#40088 и tensorflow/tensorflow#98563. Смежное обсуждение также есть здесь: UKPLab/sentence-transformers#34919.

Подтверждённый обходной путь

На практике сейчас помогает переход на TensorFlow 2.19.x. С этой версией импорт завершается без падения на мьютексе в среде macOS ARM и Python 3.11.

import importlib as module_loader

pkg_tf = module_loader.import_module("tensorflow")
print(getattr(pkg_tf, "__version__", "unknown"))

Это сохраняет стабильность рантайма, пока упомянутые выше upstream‑проблемы не будут исправлены.

Почему это важно

Сбои во время импорта — серьёзный сигнал в продакшене: их не перехватить стандартными исключениями Python, они обходят обычную обработку ошибок. Здесь проблема выходит за рамки одного проекта: TensorFlow, PyArrow и Protobuf взаимодействуют на нативном уровне, и видимость символов между этими бинарями напрямую влияет на стабильность интерпретатора. Для тех, кто поддерживает воспроизводимые окружения, это напоминание: согласованность версий транзитивных C/C++‑зависимостей не менее важна, чем версии верхнеуровневых Python‑пакетов.

Выводы

Если при импорте TensorFlow 2.20.0 на macOS ARM с Python 3.11 вы получаете падение mutex lock failed: Invalid argument, причина — сочетание TensorFlow, PyArrow и Protobuf. Переход на TensorFlow 2.19.x возвращает рабочую конфигурацию. Следите за обсуждениями в apache/arrow#40088 и tensorflow/tensorflow#98563 — там появятся исправления upstream; фиксируйте версии, чтобы не вернуть конфликт, пока идёт его устранение.

Статья основана на вопросе со StackOverflow от Mikko Ohtamaa и ответе от Mikko Ohtamaa.