我在x64_64环境下使用TensorFlow,但处理器是Intel Atom处理器。该处理器缺少AVX处理器扩展,由于TensorFlow的预构建轮盘符合AVX扩展,TensorFlow无法工作并退出。因此我必须构建自己的轮盘,并将其作为发布文件托管在GitHub上。
我遇到的问题是只能在基于Atom的处理器上下载这个预构建的wheel。我以前可以使用setup.py
文件来实现这一点,在那里可以很容易地检测到这一点,但我已经迁移到pyproject.toml
,这在定制和脚本安装支持方面非常糟糕。
除了检查处理器类型的platform_machine=='x86_64'
之外,还有什么类似的东西吗?或者迁移到pyproject.toml
是否扼杀了我的灵活性?
当前requirements.txt
为:
confluent-kafka @ https://github.com/HandsFreeGadgets/python-wheels/releases/download/v0.1/confluent_kafka-1.9.2-cp38-cp38-linux_aarch64.whl ; platform_machine=='aarch64'
tensorflow @ https://github.com/HandsFreeGadgets/python-wheels/releases/download/v0.1/tensorflow-2.8.4-cp38-cp38-linux_aarch64.whl ; platform_machine=='aarch64'
tensorflow-addons @ https://github.com/HandsFreeGadgets/python-wheels/releases/download/v0.1/tensorflow_addons-0.17.1-cp38-cp38-linux_aarch64.whl ; platform_machine=='aarch64'
tensorflow-text @ https://github.com/HandsFreeGadgets/python-wheels/releases/download/v0.1/tensorflow_text-2.8.2-cp38-cp38-linux_aarch64.whl ; platform_machine=='aarch64'
rasa==3.4.2
SQLAlchemy==1.4.45
phonetics==1.0.5
de-core-news-md @ https://github.com/explosion/spacy-models/releases/download/de_core_news_md-3.4.0/de_core_news_md-3.4.0-py3-none-any.whl
对于platform_machine=='aarch64'
,我需要类似于x86_64的东西,但只在Atom处理器环境中执行。
旧的setup.py
是:
import platform
import subprocess
import os
from setuptools import setup
def get_requirements():
requirements = []
if platform.machine() == 'x86_64':
command = "cat /proc/cpuinfo"
all_info = subprocess.check_output(command, shell=True).strip()
# AVX extension is the missing important information
if b'avx' not in all_info or ("NO_AVX" in os.environ and os.environ['NO_AVX']):
requirements.append(f'tensorflow @ file://localhost/'+os.getcwd()+'/pip-wheels/amd64/tensorflow-2.3.2-cp38-cp38-linux_x86_64.whl')
elif platform.machine() == 'aarch64':
...
requirements.append('rasa==3.3.3')
requirements.append('SQLAlchemy==1.4.45')
requirements.append('phonetics==1.0.5')
requirements.append('de-core-news-md @ https://github.com/explosion/spacy-models/releases/download/de_core_news_md-3.4.0/de_core_news_md-3.4.0-py3-none-any.whl')
return requirements
setup(
...
install_requires=get_requirements(),
...
)
直线if b'avx' not in all_info or ("NO_AVX" in os.environ and os.environ['NO_AVX'])
做了必要的微分。
如果pyproject.toml
方法不符合我的需求,那么对于安装能力更强且未标记为遗留的Python,建议使用什么方法?对于Python,可能有类似的方法Gradle用于在Java世界中构建项目,引入Gradle是为了克服XML
限制,并提供我不知道的完整脚本语言?
1条答案
按热度按时间8ehkhllq1#
我的建议是按照预期迁移
pyproject.toml
,我会根据依赖项的标准规范声明依赖项,如tensorflow
,但我根本不会使用任何 * 直接引用 *。然后我会创建一些
requirements.txt
文件,其中我会列出需要特殊处理的依赖项(不需要列出所有依赖项),例如那些需要 * 直接引用 *(和/或固定版本)的依赖项。我可能会为每个平台创建一个 requirements 文件,例如我会创建一个requirements-atom.txt
。据我所知,应该可以通过URL指示 pip 从远程 requirements 文件进行安装。
如果您需要创建多个包含公共部分的
requirements.txt
文件,那么pip-tools
之类的工具可能会有所帮助。可能类似于以下内容(未经测试):
requirements-common.in
requirements-atom.in
:一个二个一个一个