python Tensorflow metal插件已注册错误

e5nqia27  于 2023-06-28  发布在  Python
关注(0)|答案(5)|浏览(107)

我已经在Mac Mini 2020 M1上使用pip安装了Tensorflow和Metal插件,

$ pip3 install tensorflow-macos tensorflow-metal
$ pip3 uninstall numpy # related to https://stackoverflow.com/q/66060487/2395656 
$ pip3 install numpy==1.20.3

然后我尝试列出设备来查看Mac GPU,

import tensorflow

d = tensorflow.config.list_physical_devices()

print(d)

它会产生错误,

Init Plugin
Init Graph Optimizer
Init Kernel
Init Plugin
2021-06-10 02:20:21.128021: F tensorflow/c/experimental/stream_executor/stream_executor.cc:823] Non-OK-status: stream_executor::MultiPlatformManager::RegisterPlatform( std::move(cplatform)) status: Internal: platform is already registered with name: "METAL"

我认为Metal插件试图多次注册自己。
请帮帮忙,谢谢!

v1uwarro

v1uwarro1#

在我的MacBook Air M1上,Monterey 12.3和brew安装的Python python@3.8和python@3.9在它们的标准位置/opt/homebrew,以及Xcode 13.3在其标准位置,在寻找 * 小时 * 之后,我终于注意到以下内容并有了这个理论:
首先,我不喜欢使用conda或miniconda等。(我似乎唯一缺乏的非python依赖是hdf 5)。此外,我确认通过tensorflow支持创建上面提到的venv工作正常。但是如果我 * 只是 * 想在系统位置pip安装tensorflow-macos和tensorflow-metal,用于酿造Python:

brew install hdf5
HDF5_DIR=/opt/homeware python3 -m pip install tensorflow-macos

如果在最后一个阶段,插件 tensorflow-metal 安装了:

python3 -m pip install tensorflow-metal

在brew系统默认目录下使用/opt/homebrew/bin/python3中的brew-ed python@3.9:/opt/homebrew/lib/python3.9/site-packages/tensorflow-plugins
然后我得到关于金属插件已经注册的错误。
但是,如果我在我的用户目录中安装库,而不是~/Library/Python/3.9/lib/python/site-packages通过

python3 -m pip install --user tensorflow-metal

那就一切正常了注意,这仅涉及插件,即TensorFlow-MacOS包仍然可以在BREW系统位置。
我注意到了这一切,因为从过去的Xcode Python(3.8)使用中,我有一个用户包目录(Python库)在~/Library/Python/3.8/lib/Python/site-packages(只有在使用系统Python时才能添加包),并且因为它存在,酝酿的python@3.8在没有我提供--user to pip的情况下安装了所有东西。
所以我把头撞到墙上,为什么酿造python@3.8工作,而python@3.9不工作。我通过pip卸载从python@3.9系统目录中清除了所有的包,甚至清除了整个系统的site-packages目录,并且仍然使用两个简单的pip步骤进行了干净的安装,它一直失败。这是因为3.9没有用户包目录,所有内容都返回到brew系统目录。
我很确信这不是一个情况下,一些配置或包混合冲突之间的各种Python,因为我一直非常小心,以清洁一切之前,我重现。此外,将python@3.8下的tensorflow-metal的安装从我的用户包目录移动到brew系统目录,会重现以前在python@3.8下工作的错误。
长话短说:tensorflow插件初始化有一个bug,当tensorflow-metal插件安装在/opt/homebrew下时会触发,导致其注册被调用两次。当安装在本地--用户目录中时,可以避免这种情况。
我已经浪费了足够多的时间来做这个工作,我对我的理论很满意,所以现在将进一步研究它。我只是想我可能会为其他人提供一些线索,以防他们遇到这个。

yruzcnhs

yruzcnhs2#

经过一番努力,我已经解决了这个问题。

export OPENBLAS=$(/opt/homebrew/bin/brew --prefix openblas)
export CFLAGS="-falign-functions=8 ${CFLAGS}"

python3 -m venv ~/tensorflow-metal
source ~/tensorflow-metal/bin/activate

python -m pip install -U pip
pip install Cython
pip install --no-use-pep517 numpy==1.19.3

python -m pip install tensorflow-macos
python -m pip install tensorflow-metal

我相信Tensorflow现在可以同时使用CPU和GPU。

import tensorflow
tensorflow.config.list_physical_devices()
>>> [PhysicalDevice(name='/physical_device:CPU:0', device_type='CPU'), PhysicalDevice(name='/physical_device:GPU:0', device_type='GPU')]
vddsk6oq

vddsk6oq3#

请在创建虚拟环境后尝试相同操作。

python3 -m venv ~/tensorflow-metal
source ~/tensorflow-metal/bin/activate
python -m pip install -U pip
python -m pip install tensorflow-macos
python -m pip install tensorflow-metal

参考-https://developer.apple.com/forums/thread/684889

91zkwejq

91zkwejq4#

我遇到的Apple M1错误是:

import tensorflow as tf
2023-06-25 13:36:32.780749:F tensorflow/c/experimental/stream_executor/stream_executor.cc:808]非正常状态:streamexecutor::MultiPlatformManager::RegisterPlatform(std::move(cplatform))status:内部:平台已注册,名称为:“金属”
我尝试了conda / pip / poetry和上面的每一个固定包的组合,但都无济于事。
ChatGPT + Bing解释[https://stackoverflow.com/questions/67912944/tensorflow-metal-plugin-already-registered-error/70966904#70966904]为
TensorFlow metal插件在/opt/homebrew下安装时似乎注册了两次。
我手动验证了以下修复:
如果您在系统位置使用pip安装tensorflow-metal,您可能会收到关于METAL插件已经注册的错误。为了避免这种情况,请在用户目录库中安装tensorflow-metal:
此解决方案建议,当插件安装在本地用户目录而不是系统目录时,可以避免TensorFlow插件初始化的错误。

conda deactivate
pip uninstall      tensorflow-macos tensorflow-metal tensorflow 
pip install --user tensorflow-macos tensorflow-metal

Tensorflow测试脚本

#!/usr/bin/env python3
import os
os.environ['TF_CPP_MIN_LOG_LEVEL'] = '0'  # or any number from 0-3

import sys
import tensorflow as tf
import tensorflow.keras
import platform

if __name__ == '__main__':
    print(f"Python               {sys.version}")
    print(f"Python Platform:     {platform.platform()}")
    print(f"Tensor Flow Version: {tf.__version__}")
    print(f"Keras Version:       {tensorflow.keras.__version__}")
    print("len(tf.config.list_physical_devices('GPU')) ", len(tf.config.list_physical_devices('GPU')))
    print("tf.config.list_physical_devices('GPU')      ", tf.config.list_physical_devices('GPU'))

    # Create some tensors
    print("\nExample:")
    tf.debugging.set_log_device_placement(True)
    a = tf.constant([[1.0, 2.0, 3.0], [4.0, 5.0, 6.0]])
    b = tf.constant([[1.0, 2.0], [3.0, 4.0], [5.0, 6.0]])
    c = tf.matmul(a, b)
    print(f"{a} * {b} == {c}")
Python               3.11.4 (main, Jun 15 2023, 07:55:38) [Clang 14.0.3 (clang-1403.0.22.14.1)]
Python Platform:     macOS-13.4.1-arm64-arm-64bit
Tensor Flow Version: 2.12.0
Keras Version:       2.12.0
len(tf.config.list_physical_devices('GPU'))  1
tf.config.list_physical_devices('GPU')       [PhysicalDevice(name='/physical_device:GPU:0', device_type='GPU')]

Example:
input: (_Arg): /job:localhost/replica:0/task:0/device:GPU:0
_EagerConst: (_EagerConst): /job:localhost/replica:0/task:0/device:GPU:0
output_RetVal: (_Retval): /job:localhost/replica:0/task:0/device:GPU:0
a: (_Arg): /job:localhost/replica:0/task:0/device:GPU:0
b: (_Arg): /job:localhost/replica:0/task:0/device:GPU:0
MatMul: (MatMul): /job:localhost/replica:0/task:0/device:GPU:0
product_RetVal: (_Retval): /job:localhost/replica:0/task:0/device:GPU:0
[[1. 2. 3.]
 [4. 5. 6.]] * [[1. 2.]
 [3. 4.]
 [5. 6.]] == [[22. 28.]
 [49. 64.]]
lsmd5eda

lsmd5eda5#

我采取了更直接的方法。问题是tensorflow-plugins使用site_packages,它可以有重复的符号链接。所以我替换了tensorflow/__init__.py的第419行:

_site_packages_dirs = list(set(_site_packages_dirs))

from pathlib import Path
_site_packages_dirs = [Path(p).resolve() for p in _site_packages_dirs]
_site_packages_dirs = [str(p) for p in set(_site_packages_dirs)]

相关问题