M1芯片MacBook通过pip安装keras_ocr时出现numpy编译错误
问题背景
使用搭载M1芯片的MacBook,执行pip install keras-ocr安装时失败,报错核心为numpy编译阶段触发AssertionError,且已尝试社区中修复numpy、scikit-image和scipy的常规方案但无效。
报错详情
核心错误栈
writing manifest file 'numpy.egg-info/SOURCES.txt'
Copying numpy.egg-info to build/bdist.macosx-11-arm64/wheel/numpy-1.20.0-py3.9.egg-info
running install_scripts
Traceback (most recent call last):
File "/var/folders/xl/bj72r_d95rd13lh4blhmjbm5pdf4wb/T/tmp477g6zd0_in_process.py", line 363, in
main()
File "/var/folders/xl/bj72r_d95rd13lh4blhmjbm5pdf4wb/T/tmp477g6zd0_in_process.py", line 345, in main
json_out['return_val'] = hook(**hook_input['kwargs'])
File "/var/folders/xl/bj72r_d95rd13lh4blhmjbm5pdf4wb/T/tmp477g6zd0_in_process.py", line 261, in build_wheel
return _build_backend().build_wheel(wheel_directory, config_settings,
File "/private/var/folders/xl/bj72r_d95rd13lh4blhmjbm5pdf4wb/T/pip-build-env-0xvtwy70/overlay/lib/python3.9/site-packages/setuptools/build_meta.py", line 211, in build_wheel
return self._build_with_temp_dir(['bdist_wheel'], '.whl',
File "/private/var/folders/xl/bj72r_d95rd13lh4blhmjbm5pdf4wb/T/pip-build-env-0xvtwy70/overlay/lib/python3.9/site-packages/setuptools/build_meta.py", line 197, in _build_with_temp_dir
self.run_setup()
File "/private/var/folders/xl/bj72r_d95rd13lh4blhmjbm5pdf4wb/T/pip-build-env-0xvtwy70/overlay/lib/python3.9/site-packages/setuptools/build_meta.py", line 248, in run_setup
super(_BuildMetaLegacyBackend,
File "/private/var/folders/xl/bj72r_d95rd13lh4blhmjbm5pdf4wb/T/pip-build-env-0xvtwy70/overlay/lib/python3.9/site-packages/setuptools/build_meta.py", line 142, in run_setup
exec(compile(code, file, 'exec'), locals())
File "setup.py", line 513, in
setup_package()
File "setup.py", line 505, in setup_package
setup(**metadata)
File "/private/var/folders/xl/bj72r_d95rd13lh4blhmjbm5pdf4wb/T/pip-install-pt17o4qn/numpy_75c19d1baee74ce88c2532a40c962c58/numpy/distutils/core.py", line 169, in setup
return old_setup(**new_attr)
File "/private/var/folders/xl/bj72r_d95rd13lh4blhmjbm5pdf4wb/T/pip-build-env-0xvtwy70/overlay/lib/python3.9/site-packages/setuptools/init.py", line 165, in setup
return distutils.core.setup(**attrs)
File "/private/var/folders/xl/bj72r_d95rd13lh4blhmjbm5pdf4wb/T/pip-build-env-0xvtwy70/overlay/lib/python3.9/site-packages/setuptools/_distutils/core.py", line 148, in setup
dist.run_commands()
File "/private/var/folders/xl/bj72r_d95rd13lh4blhmjbm5pdf4wb/T/pip-build-env-0xvtwy70/overlay/lib/python3.9/site-packages/setuptools/_distutils/dist.py", line 967, in run_commands
self.run_command(cmd)
File "/private/var/folders/xl/bj72r_d95rd13lh4blhmjbm5pdf4wb/T/pip-build-env-0xvtwy70/overlay/lib/python3.9/site-packages/setuptools/_distutils/dist.py", line 986, in run_command
cmd_obj.run()
File "/private/var/folders/xl/bj72r_d95rd13lh4blhmjbm5pdf4wb/T/pip-build-env-0xvtwy70/overlay/lib/python3.9/site-packages/wheel/bdist_wheel.py", line 328, in run
impl_tag, abi_tag, plat_tag = self.get_tag()
File "/private/var/folders/xl/bj72r_d95rd13lh4blhmjbm5pdf4wb/T/pip-build-env-0xvtwy70/overlay/lib/python3.9/site-packages/wheel/bdist_wheel.py", line 252, in get_tag
plat_name = get_platform(self.bdist_dir)
File "/private/var/folders/xl/bj72r_d95rd13lh4blhmjbm5pdf4wb/T/pip-build-env-0xvtwy70/overlay/lib/python3.9/site-packages/wheel/bdist_wheel.py", line 48, in get_platform
result = calculate_macosx_platform_tag(archive_root, result)
File "/private/var/folders/xl/bj72r_d95rd13lh4blhmjbm5pdf4wb/T/pip-build-env-0xvtwy70/overlay/lib/python3.9/site-packages/wheel/macosx_libfile.py", line 356, in calculate_macosx_platform_tag
assert len(base_version) == 2
AssertionError
编译优化日志
########### EXT COMPILER OPTIMIZATION ########### Platform : Architecture: aarch64 Compiler : clang CPU baseline : Requested : 'min' Enabled : NEON NEON_FP16 NEON_VFPV4 ASIMD Flags : none Extra checks: none CPU dispatch : Requested : 'max -xop -fma4' Enabled : ASIMDHP ASIMDDP Generated : : ASIMDHP : NEON NEON_FP16 NEON_VFPV4 ASIMD Flags : -march=armv8.2-a+fp16 Extra checks: none Detect : ASIMD ASIMDHP : numpy/core/src/umath/_umath_tests.dispatch.c CCompilerOpt._cache_write[796] : write cache to path -> /private/var/folders/xl/bj72r_d95rd13lh4blhmjbm5pdf4wb/T/pip-install-pt17o4qn/numpy_75c19d1baee74ce88c2532a40c962c58/build/temp.macosx-11-arm64-3.9/ccompiler_opt_cache_ext.py ########### CLIB COMPILER OPTIMIZATION ########### Platform : Architecture: aarch64 Compiler : clang CPU baseline : Requested : 'min' Enabled : NEON NEON_FP16 NEON_VFPV4 ASIMD Flags : none Extra checks: none CPU dispatch : Requested : 'max -xop -fma4' Enabled : ASIMDHP ASIMDDP Generated : none CCompilerOpt._cache_write[796] : write cache to path -> /private/var/folders/xl/bj72r_d95rd13lh4blhmjbm5pdf4wb/T/pip-install-pt17o4qn/numpy_75c19d1baee74ce88c2532a40c962c58/build/temp.macosx-11-arm64-3.9/ccompiler_opt_cache_clib.py [end of output] note: This error originates from a subprocess, and is likely not a problem with pip. ERROR: Failed building wheel for numpy Failed to build numpy ERROR: Could not build wheels for numpy, which is required to install pyproject.toml-based projects [end of output]
最终错误提示
note: This error originates from a subprocess, and is likely not a problem with pip.
error: subprocess-exited-with-error
× pip subprocess to install build dependencies did not run successfully.
│ exit code: 1
╰─> See above for output.
note: This error originates from a subprocess, and is likely not a problem with pip.
解决方案
方案1:使用conda安装(推荐)
M1芯片下conda对ARM架构的依赖适配更完善,先安装Anaconda或Miniconda,再执行以下命令:
conda create -n keras-ocr-env python=3.9 conda activate keras-ocr-env conda install keras-ocr -c conda-forge
conda会自动处理所有依赖的兼容版本,避免本地编译错误。
方案2:升级工具并指定兼容numpy版本
先升级pip相关工具,再安装对M1有预编译支持的numpy版本,最后安装keras-ocr:
pip install --upgrade wheel setuptools pip install numpy==1.23.5 pip install keras-ocr
方案3:通过Rosetta 2模拟x86架构安装
右键终端图标选择「使用Rosetta打开」,再执行常规安装命令:
pip install keras-ocr
该方式通过模拟x86架构绕过ARM编译问题,但性能会略有下降。
方案4:手动安装苹果适配版依赖
先安装苹果官方适配M1的TensorFlow及其他依赖,再安装keras-ocr:
pip install numpy scipy scikit-image tensorflow-macos tensorflow-metal pip install keras-ocr
内容的提问来源于stack exchange,提问作者saroj kulkarni

