事情起因
从 A13 开始 Apple 的 A 系列芯片中就搭载了 AMX 单元(Apple Matrix Coprocessor 苹果矩阵运算协处理器),通过专门设计的硬件单元来加速矩阵运算的速度,过去 AMX 基本只服务于苹果内部生态的应用,常见的应用如 benchmark 等都无法调用之,而现在 BLAS 库(Basic Linear Algebra Subprograms 基础线性代数子程序库)适配了 AMX,里面拥有大量关于线性代数运算方法的工具函数。而我们熟悉的 Numpy 就调用了 BLAS,因此,如今可以将 Numpy 背后的 BLAS 换成经过 AMX 加速后的版本,以在 MacBook 上加速 Numpy 的运算。
通过以下命令即可:
conda install -c conda-forge numpy "libblas=*=*accelerate"
但是在我输入后,终端却提示我的 conda 版本过低,需要先升级 conda 到最新的版本。
问题出现
终端提示需要先升级 conda ,那么我输入了 update 命令,想着升级完应该即可继续执行上面的代码了,但是终端却报错了:
❯ conda update conda
# ------------------------------------------
# 省略部分信息(许多包名的下载过程
Proceed ([y]/n)? y
Downloading and Extracting Packages
Preparing transaction: done
Verifying transaction: failed
# 报错了
RemoveError: 'jsonpatch' is a dependency of conda and cannot be removed from
conda's operating environment.
RemoveError: 'requests' is a dependency of conda and cannot be removed from
conda's operating environment.
我首先尝试向 GPT-4o 提问找到解决方案:
GPT 告诉我上面的包是 conda 自身的核心包,导致更新失败了,他建议我在新的环境中操作。
我试着 create 了新的 env,但是同样的问题仍然显示在终端上报错了。
GPT 果然还是不太靠谱哇
尝试解决
在 stackoverflow 查阅到有人直接强制更新解决了这个问题,力大砖飞
conda update --force conda
我试着输入但是还是报了同样的错误。
虽然GPT 给出的解决方案(新建新的环境)以及强制更新都经过尝试失败了,我转头回去继续对话 GPT:
Conda 检测到它的核心依赖包(如 jsonpatch 和 requests)可能会被移除或替换,这会导致 Conda 无法正常工作。因此,Conda 会阻止这个操作并提示 RemoveError。
GPT 说的这句话是很有道理的,显然报错是因为我现在所在的虚拟环境(如 base 或其他虚拟环境)本身所需要这些核心包,我不能在使用它们的情况下强行更新它们,这会导致我的虚拟环境崩溃。
所以我尝试先退出子环境:
#deactivate the sub env
conda deactivate
然后再执行更新操作:
#update base if needed
conda update conda
conda update anaconda
conda update --all
最后再更新子环境中的包:
#update environment from base
conda update -n yourEnvHere [-c ARepository] --all
#reactivate the env
conda activate yourEnvHere
显然,退出了子环境后的更新操作,不需要 force 也正常执行了。
最后进入子环境,执行:
❯ conda activate
❯ conda install -c conda-forge numpy "libblas=*=*accelerate"
# ------------------------------------------
/opt/homebrew/Caskroom/miniconda/base/lib/python3.11/site-packages/conda/base/context.py:198: FutureWarning: Adding 'defaults' to channel list implicitly is deprecated and will be removed in 25.3.
To remove this warning, please choose a default channel explicitly with conda's regular configuration system, e.g. by adding 'defaults' to the list of channels:
conda config --add channels defaults
For more information see https://docs.conda.io/projects/conda/en/stable/user-guide/configuration/use-condarc.html
deprecated.topic(
Channels:
- conda-forge
- defaults
Platform: osx-arm64
Collecting package metadata (repodata.json): done
Solving environment: | warning libmamba Added empty dependency for problem type SOLVER_RULE_UPDATE
done
## Package Plan ##
environment location: /opt/homebrew/Caskroom/miniconda/base
added / updated specs:
- libblas[build=*accelerate]
- numpy
# 省略部分信息(许多包名的下载过程
The following packages will be downloaded:
The following NEW packages will be INSTALLED:
The following packages will be REMOVED:
The following packages will be UPDATED:
Proceed ([y]/n)? y
Downloading and Extracting Packages:
Preparing transaction: done
Verifying transaction: done
Executing transaction: done
然后就可以愉快的使用加速过的Numpy啦。