我在我的工作站上使用 Python (Anaconda + Flask) 开发了一个机器学习模型,一切顺利。后来,我尝试将这个程序发送到另一台机器上,当然我尝试设置相同的环境,但程序无法运行。我将该程序复制到其他运行平稳的机器上。
我无法弄清楚失败案例中的问题是什么(程序代码和错误消息都很丰富,所以我无法在这里展示它们)但我几乎可以肯定它与依赖项的不同版本有关.
所以,我的问题是,给定某个程序运行良好的环境,我如何将它克隆到另一个它也应该运行良好的环境?当然,无需克隆整个系统;)
我在我的工作站上使用 Python (Anaconda + Flask) 开发了一个机器学习模型,一切顺利。后来,我尝试将这个程序发送到另一台机器上,当然我尝试设置相同的环境,但程序无法运行。我将该程序复制到其他运行平稳的机器上。
我无法弄清楚失败案例中的问题是什么(程序代码和错误消息都很丰富,所以我无法在这里展示它们)但我几乎可以肯定它与依赖项的不同版本有关.
所以,我的问题是,给定某个程序运行良好的环境,我如何将它克隆到另一个它也应该运行良好的环境?当然,无需克隆整个系统;)
首先,这是一个 Python/Anaconda 问题,可能应该在不同的堆栈交换子站点中提出。
至于问题本身 - 您可以使用以下方法导出您的 Anaconda 环境:
conda env export > environment.yml
并使用以下方法重新创建它:
conda env create -f environment.yml
请注意,正如其他人所建议的那样 - 您应该使用虚拟环境,它允许您创建与您的机器分开的特定环境并更轻松地管理它。
要在 Anaconda 中创建虚拟环境,您可以使用:
conda create -n yourenvname python=x.x anaconda
您使用以下方式激活:
source activate yourenvname
TLDR
使用 conda 包
安装使用 conda 或 pip:
康达锻造:
conda install -c conda-forge conda-pack
派皮:
pip install conda-pack
那么对于:
备份:
# Pack environment my_env into my_env.tar.gz
$ conda pack -n my_env
# Pack environment my_env into out_name.tar.gz
$ conda pack -n my_env -o out_name.tar.gz
# Pack environment located at an explicit path into my_env.tar.gz
$ conda pack -p /explicit/path/to/my_env
恢复:
并在其他机器上恢复它:
# Unpack environment into directory `my_env`
$ mkdir -p my_env
$ tar -xzf my_env.tar.gz -C my_env
# Use Python without activating or fixing the prefixes. Most Python
# libraries will work fine, but things that require prefix cleanups
# will fail.
$ ./my_env/bin/python
# Activate the environment. This adds `my_env/bin` to your path
$ source my_env/bin/activate
# Run Python from in the environment
(my_env) $ python
# Cleanup prefixes from in the active environment.
# Note that this command can also be run without activating the environment
# as long as some version of Python is already installed on the machine.
(my_env) $ conda-unpack
一点解释:
如果您计划获取当前环境的精确副本,然后将其移动到具有相同平台和操作系统的另一台机器上,而无需再次从 Internet 重新下载所有软件包(适用于离线机器/防火墙后面)。所有其他以前的方法都需要互联网连接。因此,如果您无法访问互联网,则可以使用conda pack
.
康达包
conda-pack 是一个命令行工具,用于归档 conda 环境,其中包括安装在环境中的包的所有二进制文件。当您想要重现互联网访问受限或没有互联网访问的环境时,这很有用。之前的所有方法都从各自的存储库下载包以创建环境。请记住,conda-pack 是特定于平台和操作系统的,并且目标计算机必须具有与源计算机相同的平台和操作系统。
要安装 conda-pack,请确保您位于根环境或基础环境中,以便它在子环境中可用。Conda-pack 在 conda-forge 或 PyPI 上可用。
对于未来的更新检查参考
首先使用以下命令导出当前 conda 环境的环境配置:
conda-env export -n your_env_name > your_env_name.yml
例子:
conda-env export -n base> base.yml
运行上述命令后,它们应该是您当前目录中的 yml 配置文件,其中包含您的 conda 环境信息
要使用 yml 配置文件创建新环境,请运行:
conda-env create -n new_env -f=\path\to\base.yml
例子:
conda-env create -n venv -f=base.yml
如果上述方法不起作用(由于 conda 本身的各种问题),总是值得尝试以下变体:
conda-env create --name new_env --file \path\to\base.yml
如果你的程序主要是 Python,你可以完全依赖虚拟环境。
创建虚拟环境以隔离您的依赖项,而不是使用系统库。然后使用虚拟环境工具复制您的环境。
在工作的 virtualenv 中,使用每个已安装的 Python 库的版本创建一个文件:
pip freeze > requirements.txt
在新的 virtualenv 中,要求pip
安装具有相同版本的那些库:
pip install -r requirements.txt
这可确保您在两台机器上获得相同的 lib 版本。由于您的 VCS 会跟踪 requirements.txt,因此您始终可以重新创建旧版本代码的环境。
当然,如果你需要一个数据库、一个生产网络服务器等,你最终会多走几步,你不能依赖 virtualenv 来确保两个环境匹配。这就是 Docker 介入的地方(参见Pieter21 的回答)。