HPC使用uv管理Python环境
背景
当前数值预报模式业务系统中越来越多使用 Python 脚本,准备合适的 Python 环境成为部署业务系统必须要考虑的环节。 因 Anaconda 商用必须授权,CMA-HPC2023 不再提供官方支持的 conda 环境,导致缺少统一的自定义 Python 虚拟环境工具。 虽然可以自行安装没有合规风险的 miniforge 来创建 conda 环境,但因为 CMA-HPC2023 只能访问内网而没法直接利用 conda 来创建 env。 不过,CMA 内网提供 pypi 同步镜像,可以在 CMA-HPC2023 环境中访问,所以可以利用 uv 工具创建 python 虚拟环境。
CMA-HPC2023 在 sc1 通过 modulefile 提供 Python 3.10 环境 (业务脚本原因),在 sc3 则提供系统默认的 Python 3.6 环境。
本文介绍如何在 HPC 中使用 uv 管理 Python 环境。
安装
安装 uv
从 Github 下载 uv 安装包,网址 https://github.com/astral-sh/uv/releases
选择 uv-x86_64-unknown-linux-gnu.tar.gz 下载。
拷贝到 HPC 目录中,解压缩,将 uv 程序拷贝到 PATH 能识别的目录中,比如 ~/.local/bin
tar xf uv-x86_64-unknown-linux-gnu.tar.gz
cp uv*/uv ~/.local/bin/
运行 uv 命令,查看是否能正常输出。
准备 Python 安装包
uv 安装 Python 时使用了自己编译的 Python 版本,发布于项目 astral-sh/python-build-standalone 中,每个 release 有大量编译版本,可以选择需要的版本下载。
网址 https://github.com/astral-sh/python-build-standalone/releases
笔者采用另一种方案,即使用其他可以访问互联网的 Linux 环境下载 Python 安装包,然后拷贝到 HPC 相应目录里。
执行下面的命令下载多个 Python 版本。
uv python install 3.14
uv python install 3.13
uv python install 3.12
uv python install 3.11
uv python install 3.10
将 ~/.local/share/uv/python 打包
cd ~/.local/share/uv
tar czf uv-python.tar.gz python
拷贝到 HPC 中,创建 ~/.local/share/uv 目录,并解压
mkdir -p ~/.local/share/uv
tar xzf uv-python.tar.gz -C ~/.local/share/uv
因为该目录包含连接,所以需要使用 uv 安装 Python,重建连接,这次因为我们已经有了 Python 安装包,所以不用连接互联网了。
uv python install 3.14
uv python install 3.13
uv python install 3.12
uv python install 3.11
uv python install 3.10
至此,就可以在 HPC 上使用 uv 管理 Python 环境了。
使用
以 CMA-GFS 后处理系统运行流程项目为例说明如何使用 uv 部署 Python 项目。 项目目录大致如下所示:
workspace/
│
├── lib/
│ └── takflow/
│ └── pyproject.toml
│
├── cma-gfs-post-workflow/
│ └── pyproject.toml
│
├── cma-gfs-post-oper-workflow/
│ └── pyproject.toml
│
└── my-app/ # 当前项目
在 my-app 目录中创建一个 Python 项目,即生成一个 pyproject.toml。
uv init --app
使用 uv 自动创建 Python 虚拟环境并安装本地 Python 库,指定使用 CMA 的 pypi 镜像。
uv add \
../lib/takflow/ \
../cma-gfs-post-workflow/ \
../cma-gfs-post-oper-workflow/ \
--default-index http://pypi.mirrors.cma.cn:8080/root/pypi/+simple/ \
--allow-insecure-host pypi.mirrors.cma.cn
使用 uv 运行 Python 程序。
uv run python3 -m cma_gfs_post_oper.cli
部署之后的目录大致如下所示:
workspace/
│
├── lib/
│ └── takflow/
│ └── pyproject.toml
│
├── cma-gfs-post-workflow/
│ └── pyproject.toml
│
├── cma-gfs-post-oper-workflow/
│ └── pyproject.toml
│
└── my-app/ # 当前项目
├── .venv/ # uv 自动创建的虚拟环境
│
├── .python-version # Python 版本
├── pyproject.toml # 项目配置及依赖
├── uv.lock # uv 锁定的依赖版本
└── main.py # uv init --app 生成的入口文件
存在问题
uv 只能安装 pypi 上的软件包,无法管理 conda-forge 上的软件包,无法安装那些仅在 conda-forge 上分发的软件包,比如需要 C++ 库的 ecFlow。
一种方案是只使用 pypi 上有的软件包来开发。 比如上一节中 cma-gfs-post-workflow 是为 CMA-GFS 后处理系统创建 ecFlow 流程,因无法通过 pypi 安装 ecFlow 包,所以笔者在 takflow 库中实现模拟 ecFlow def 生成过程的功能,在没有安装 ecFlow Python 包的环境中也可以生成 def 文件。 但最后将 def 加载到 ecFlow 服务中就需要 ecFlow 软件包了,但这一步与 Python 无关。
另一种方案是考虑使用其他编译型编程语言实现这一功能,编译好的可执行程序非常适合直接部署。 虽然切换编程语言成本较高,但在当前大模型的支持下,也是有可能实现的。
笔者推荐业务系统中尽量使用可以通过 pip 安装的软件包,避免使用 conda 环境,降低 Python 部署的难度。
参考
cemc-oper/takflow 项目: https://github.com/cemc-oper/takflow
astral-sh/uv 项目: https://github.com/astral-sh/uv
CMA PyPI 镜像说明: http://mirrors.cma.cn/help/pypi.html
