基于 Docker 容器于 Ubuntu (v22.04) 手动编译支持第 4,5 阶泛函导数的 PySCF (v2.5.0)
在 Docker 容器手动编译支持第 4,5 阶泛函导数的 PySCF。
Install PySCF with the forth and the fifth order derivatives of xc (exchange-correlation) functionals using docker containers without network.
Docker 容器准备
关于 Linux 系统下 Docker 的下载和安装,本文不做介绍,仅在下文介绍简单的使用命令,同时介绍 docker 拉取 Ubuntu 22.04 后的基本配置。
Docker 基本使用命令
docker images : 查看当前 user 已经拉取的镜像 (images),如下图
docker ps -a : 查看当前 user 已经创建的 docker containers,如下图
docker run -it -d –name {xxx} ubuntu:22.04 /bin/bash : 基于 image ubuntu:22.04 新建名为 “xxx” 的 container,xxx 可以给定,如不设定,则随机生成一个名字,本文档将容器命名为 “pyscf_wdoxc_45”,如下图
此时查看已经建立的容器,就可以找到新容器 (pyscf_wdoxc_45),其 ID 号为 79233806c48,之后可以通过容器名称或者此 ID 号来指定容器。
docker attach xxx : 连接并进入容器
exit : 退出当前容器。
(*关于 docker 的基本使用命令,还有很多,需要读者自行学习,本文档后续不会涉及)
Ubuntu 基本配置
apt-get update : 更新可用软件包信息
apt-get install vim : 下载文本编辑器 vim
cd /etc/apt
cp sources.list sources.list.bak : 备份源准备换源vim sources.list -> 按 “i” 进入 Insert 模式 -> 复制国内源 -> 按 “ESC” 退出编辑模式 -> 按 “shift+;” 并输入 wq 保存源文件
本文使用的国内源:
deb https://mirrors.tuna.tsinghua.edu.cn/debian/ bullseye main contrib non-free
deb-src https://mirrors.tuna.tsinghua.edu.cn/debian/ bullseye main contrib non-free
deb https://mirrors.tuna.tsinghua.edu.cn/debian/ bullseye-updates main contrib non-free
deb-src https://mirrors.tuna.tsinghua.edu.cn/debian/ bullseye-updates main contrib non-free
deb https://mirrors.tuna.tsinghua.edu.cn/debian/ bullseye-backports main contrib non-free
deb-src https://mirrors.tuna.tsinghua.edu.cn/debian/ bullseye-backports main contrib non-free
deb https://mirrors.tuna.tsinghua.edu.cn/debian-security bullseye-security main contrib non-free
deb-src https://mirrors.tuna.tsinghua.edu.cn/debian-security bullseye-security main contrib non-free
换源前
换源后apt-get update : 更新可用软件包信息
apt-get install : 下载基于 PyPI 平台的软件包下载工具 pip
编译 PySCF(v2.5.0)
首先看一下 install PySCF 的官方介绍,在此我们主要获取三个信息:
a. install PySCF 需要的第三方 tools
b. 无网络激活 (手动激活) PySCF 需要的 libcint 积分库,libxc 和 xcfun 泛函库下载及编译
c. 无网络激活 (手动激活) PySCF 的下载及编译
install PySCF 需要的第三方 tools
上述 a 中展示了需要的 7 个 tools,可以现在 install,或者在之后 install PySCF 的环节中以及使用 PySCF 的环节中,陆续激活,激活方式可以选择 pip install 或者 apt-get install
笔者先在此激活了 numpy, scipy,同时我们可以定位到这些包的安装位置,后续我们也将在该目录 (文件夹) 下激活 PySCF
后来,在编译过程中笔者陆续激活了 cmake, blas, h5py 软件包,建议读者在此全部激活
libcint 积分库,libxc 和 xcfun 泛函库下载及编译
根据官网提示,明确了需要下载以下三个 packages,分别为 libcint 积分库,libxc 和 xcfun 泛函库。
cd /usr/local/lib/python3.10/dist-packages
mkdir opt
cd opt : 建立并切换至编译上述三包的 opt 目录apt-get install git
apt-get install wget : 准备从远程仓库下载 packages 的 git 和 wget 工具依照官网命令 (install PySCF 的 Installation without network 介绍第 1 代码块部分) 下载包:
其中对于 libcint 和 libxc 直接按照命令下载即可
git clone https://github.com/sunqm/libcint.git
wget https://gitlab.com/libxc/libxc/-/archive/6.0.0/libxc-6.0.0.tar.gz
!!!格外注意 xcfun 的下载 !!!因为 xcfun 不支持高阶 (>3) 的泛函导数的使用,因此孙启明博士在 github 上 fork 了 xcfun 仓库并建立了新分支 cmake-3.5,于上开发使 xcfun 具备了调用交换关联泛函导数至 5 阶的能力,下载命令为
git clone -b cmake-3.5 https://github.com/sunqm/xcfun.git
在 PySCF 2.5.0 版本,已经将 4,5 阶泛函导数推上去了
git clone https://github.com/libdfts/xcfun.gitlibcint 积分库解压缩及编译 : 按照官网命令(install PySCF 的 Installation without network 介绍第 2 代码块部分)编译,前三条命令直接按顺序执行,第 4 条 cmake 命令需要修改为
cmake -DWITH_F12=1 -DWITH_RANGE_COULOMB=1 -DWITH_COULOMB_ERF=1
-DCMAKE_INSTALL_PREFIX:PATH=/usr/local/lib/python3.10/dist-packages/opt -DCMAKE_INSTALL_LIBDIR:PATH=lib ..
【核心修改点】 : “-DCMAKE_INSTALL_PREFIX:PATH=/opt” 改为 “-DCMAKE_INSTALL_PREFIX:PATH=/usr/local/lib/python3.10/dist-packages/opt”,指定动态链接的编译位置为此小节步骤 1 中建立的 /opt 目录;
之后执行第 5 条命令即可,对于第 5 条命令,可尝试 “make -j30 && make install”, 通过 -j30 指定多 (30) 核并行编译,即使不使用速度也还行libxc 泛函库解压缩及编译 : cmake 命令 (第 4 条命令) 之前相同,第 4 条命令修改为
cmake -DCMAKE_BUILD_TYPE=RELEASE -DBUILD_SHARED_LIBS=1
-DENABLE_FORTRAN=0 -DDISABLE_KXC=0 -DDISABLE_LXC=0
-DCMAKE_INSTALL_PREFIX:PATH=/usr/local/lib/python3.10/dist-packages/opt -DCMAKE_INSTALL_LIBDIR:PATH=lib ..
【核心修改点-1】 : “-DDISABLE_LXC=1” 改为 “-DDISABLE_LXC=0”,放开 libxc 的第四阶导数 (libxc 最高支持第 4 阶)
【核心修改点-2】 : “-DCMAKE_INSTALL_PREFIX:PATH=/opt” 改为 “-DCMAKE_INSTALL_PREFIX:PATH=/usr/local/lib/python3.10/dist-packages/opt”,指定动态链接的编译位置为此小节步骤 1 中建立的 /opt 目录;
之后执行第 5 条命令即可,对于第 5 条命令,可尝试 “make -j30 && make install”, 通过 -j30 指定多 (30) 核并行编译
(Note : 可能是由于新增编译第 4 阶导数,编译过程有时会很慢,依照笔者经验,如果不 make -j30, 第 5 条命令执行完成需要 1-5h 均属正常现象;
即使中断,可重复执行第 5 条命令于中断处继续编译)xcfun 泛函库解压缩及编译 : cmake 命令 (第 4 条命令)之前相同,第 4 条命令修改为
cmake -DCMAKE_BUILD_TYPE=RELEASE -DBUILD_SHARED_LIBS=1 -DXCFUN_MAX_ORDER=5 -DXCFUN_ENABLE_TESTS=0
-DCMAKE_INSTALL_PREFIX:PATH=/usr/local/lib/python3.10/dist-packages/opt -DCMAKE_INSTALL_LIBDIR:PATH=lib ..
【核心修改点-1】 : “-DXCFUN_MAX_ORDER=3” 改为 “-DXCFUN_MAX_ORDER=5”,放开 xcfun 的导数至第 5 阶 (xcfun 支持任意阶)
【核心修改点-2】 : “-DCMAKE_INSTALL_PREFIX:PATH=/opt” 改为 “-DCMAKE_INSTALL_PREFIX:PATH=/usr/local/lib/python3.10/dist-packages/opt”,指定动态链接的编译位置为此小节步骤 1 中建立的 /opt 目录;
之后执行第 5 条命令即可,同样可采用 -j 参数加速编译过程
PySCF 下载及编译
cd /usr/local/lib/python3.10/dist-packages : 切换至后续执行命令所在目录 /usr/local/lib/python3.10/dist-packages
依照官网命令 (install PySCF 的 Build from source 第 1 代码块部分) git clone PySCF
依照官网命令 (install PySCF 的 Installation without network 介绍第 3 代码块部分) 编译 PySCF,cmake 命令 (第 3 条命令) 之前相同,在执行 cmake 之前,需要返回上级目录 /usr/local/lib/python3.10/dist-packages/pyscf/pyscf/lib,修改 CMakeLists.txt 文件,
【核心修改点】 : 添加语句 “set(XCFUN_MAX_ORDER 5)\n if(NOT XCFUN_MAX_ORDER)\n set(XCFUN_MAX_ORDER 3)”,并修改另一处,如下图
之后切换回 /usr/local/lib/python3.10/dist-packages/pyscf/pyscf/lib/build 目录,执行后续也需要修改的 cmake 命令
cmake -DBUILD_LIBCINT=0 -DBUILD_LIBXC=0 -DBUILD_XCFUN=0 -DCMAKE_INSTALL_PREFIX:PATH=/usr/local/lib/python3.10/dist-packages/opt ..
【核心修改点】”cmake -DBUILD_LIBCINT=0 -DBUILD_LIBXC=0 -DBUILD_XCFUN=0 -DCMAKE_INSTALL_PREFIX:PATH=/opt ..” 改为 “cmake -DBUILD_LIBCINT=0 -DBUILD_LIBXC=0 -DBUILD_XCFUN=0 -DCMAKE_INSTALL_PREFIX:PATH=/usr/local/lib/python3.10/dist-packages/opt ..”
以及 make 命令最后加入 PySCF 的环境变量,具体执行命令如下
vim ~/.bashrc 后按 “i” 进入 Insert 模式
加入环境变量语句:
export PYTHONPATH=/usr/local/lib/python3.10/dist-packages/pyscf:\$PYTHONPATH
export LD_LIBRARY_PATH=\$LD_LIBRARY_PATH:/usr/local/lib/python3.10/dist-packages/opt/lib
保存并退出 vim : ESC + : + wq
PySCF 调用 4,5 阶泛函导数测试
由于测试涉及十分专业的知识,测试通过与否暂时由笔者判断
测试1-调用 libxc 的第 4 阶泛函导数
测试2-调用 xcfun 的第 4,5 阶泛函导数
写在最后,编译 PySCF 与是否使用 Docker 容器是解耦合的两件事情,使用 Docker 的原因是
- 对于不同版本的软件,可以在各自的环境中开发、测试,互不影响,所以 Docker 是开发、测试友好的
- docker 可以制作镜像,方便其他人直接拉取一套你关注软件所在的相同环境,直接使用你的环境或者重复你遇到的问题并尝试解决
- 你也可以拉取别人做好的镜像,省去像本文档这样从头配 Ubuntu 所需的时间和步骤
欢迎各位反馈文档中的错误和可改进的地方,以邮件的方式最好。