在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 环境中构建档案。
参考
相关博文