在HPC不同账户之间迁移conda环境

目录

本文介绍在 HPC 上如何使用 conda-pack 工具将 conda 环境从一个账户迁移到另一个账户。

背景

HPC 上有业务账户和个人科研账户。对于科研账户,用户可以自行尝试各种软件,比如我在个人账户中安装了 Anaconda,通过各种方式安装了大量第三方包。 但对于业务账户,为了保证业务系统稳定运行,不能随意安装软件,以免破坏运行环境。

如果在业务系统中使用 Python 脚本,并且该脚本使用到了系统 Python 环境中没有的库,就会带来应用部署问题。 需要找到一种适合在业务账户中安装自定义 Python 环境的方法。

一种方案是将 Python 脚本通过工具打包为可执行程序,例如使用 Pyinstaller 包。

  • 优势:一次编译到处运行,不依赖开发账户的 Python 环境
  • 劣势:修改脚本需要重新编译

另一种方案是在业务系统中部署 Python 环境,比如使用同样的系统安装的 Python 包,在 Python 环境中运行 Python 脚本。

  • 优势:可以在业务环境中直接修改、调试 Python,无需进行额外编译
  • 劣势:需要在业务账户中部署 Python 环境。如果 Python 环境是用户自己安装的,则需要迁移到业务环境中,因为业务系统严禁依赖个人账户下的任务文件。

本文针对第二种方案,使用 conda-pack 工具将个人账户的 conda 环境迁移到业务账户。

以下代码均在 CMA-PI 超算上运行。

准备

已预先创建一个 Conda 环境 py311-data:

. /g1/u/wangdp/start_anaconda3.sh
conda activate py311-data
which python3
/g11/wangdp/lang/python/anaconda3/envs/py311-data/bin/python3

安装 conda-pack 包。

注:可以在 base 环境中安装

conda install -c conda-forge conda-pack

打包环境

将 py311-data 打包到 py311-data.tar.gz 压缩包中:

conda pack -n py311-data -o py311-data.tar.gz

经过“漫长”的等待,环境已被打包到压缩包中:

Collecting packages...
Packing environment at '/g11/wangdp/lang/python/anaconda3/envs/py311-data' to 'py311-data.tar.gz'
[########################################] | 100% Completed | 13min 58.9s

查看压缩包大小:

du -sh py311-data.tar.gz
240M    py311-data.tar.gz

迁移环境

将压缩包拷贝到业务账户目录下

cp /some/path/to/py311-data.tar.gz .

创建目录,解压缩

mkdir py311-data
tar -xzf py311-data.tar.gz -C py311-data

查看解压缩后的环境目录大小:

du -sh py311-data
734M    py311-data

激活环境,会将 py311-data/bin 目录添加到 PATH 环境变量中

$ source py311-data/bin/activate
(py311-data) $

解包环境

(py311-data) $ conda-unpack

至此可以使用迁移后的 Python 环境了。

测试环境

检查环境安装的包:

(py311-data) $ pip freeze
$pip freeze
attrs @ file:///home/conda/feedstock_root/build_artifacts/attrs_1671632566681/work
bokeh @ file:///home/conda/feedstock_root/build_artifacts/bokeh_1660586590972/work
brotlipy @ file:///home/conda/feedstock_root/build_artifacts/brotlipy_1666764686339/work
certifi==2022.12.7
cffi @ file:///home/conda/feedstock_root/build_artifacts/cffi_1671179355965/work
cfgrib @ file:///home/conda/feedstock_root/build_artifacts/cfgrib_1669296258093/work
charset-normalizer @ file:///home/conda/feedstock_root/build_artifacts/charset-normalizer_1661170624537/work
click @ file:///home/conda/feedstock_root/build_artifacts/click_1666798198223/work
...

可以看到环境已完成迁移。

退出环境:

(py311-data) $ source py311-data/bin/deactivate

注意事项

本节内容来自官方文档

该工具有一些注意事项。

  • PATH 中必须有 Conda
  • 构建环境的操作系统必须与目标操作系统相匹配。 这意味着基于 Windows 构建的环境无法迁移到 Linux。
  • 一旦环境被解包并且 conda-unpack 被执行,它就不能被重新定位。重新应用 conda-pack 不太可能奏效。
  • conda-pack 不太适合存档旧环境,因为它要求 conda 的包缓存具有所有环境的包。它旨在从积极维护的 conda 环境中构建档案。

参考

conda-pack 主页

相关博文

将 Anaconda 移动到新的文件夹