如何在同一个Pipfile中使用tensorflow-macos和tensorflow,并保持锁定所有操作系统和架构的可能性?

6rvt4ljy  于 2023-01-09  发布在  Mac
关注(0)|答案(1)|浏览(128)

M1架构使得一些软件包很难使用,但到目前为止,除了TensorFlow之外,所有软件包都已经解决了这个问题。
为了能够在M1(或M2)芯片上使用tensorflow,您需要使用tensorflow-macos而不是tensorflow。
在我的例子中,我有一个使用pipenv进行依赖管理的工作流。这样,无论系统如何,一切都可以正常工作。然而,对于tensorflow来说,这是一个问题,因为它不能安装在M1上,而tensorflow-macOS不能安装在其他架构上。
因此,当我锁定我的Pipfile,并试图运行一个CI作业,它崩溃,因为我使用的mac版本,这是现在锁定,但不工作在CI。
现在,如果一些需要tensorflow的包不是其他包的依赖项,这就不是什么大问题了,这意味着tensorflow不再位于这些包的Pipfile中。
有人知道该怎么处理吗?
理想情况下,如果tensorflow在某个地方被使用,你会希望在m1上做一些别名来使用tensorflow-macos,但是我不认为这是可能的。
Docker在某些情况下是一个解决方案(但在m1和tensorflow上工作得不是很好),但如果repo与其他本地进程(如kubernetes、环境变量等)交互太多,则会再次出现问题。
假设您有以下Pipfile

[[source]]
url = "https://pypi.org/simple"
verify_ssl = true
name = "pypi"

[packages]
tensorflow = "==2.7.*"

[requires]
python_version = "3.9"

在M1上锁定/安装这个将不起作用,所以你必须将它更改为tensorflow-macos。但是,这在其他机器上不起作用...

ogq8wdun

ogq8wdun1#

下面的设置对我很有效。我保存了两个不同的Pipfile
Pipfile_x86具有

...
[packages]
tensorflow = "==2.11.0"
...

Pipfile_Mac_ARM具有

...
[packages]
tensorflow-macos = "==2.11.0"
tensorflow-metal = "==0.7.0"
...

以及同样两个Pipfile_x86.lockPipfile_Mac_ARM.lock
然后创建指向x86版本的符号链接:

ln -s Pipfile_x86 Pipfile
ln -s Pipfile_x86.lock Pipfile.lock

并将其提交到存储库,因为大多数人(和CI)都使用x86
在Mac上,我将符号链接到ARM版本,并忽略Git中的更改,这样不同的符号链接就不会被暂存:

git update-index --skip-worktree Pipfile Pipfile.lock

只需记住向两个Pipfile添加额外的包,并让.lock文件在通过pipenv update对两个版本进行更改时生成。

相关问题