«
【教程】配置一个带有ROOT内核的Cocalc docker

时间:2022-3-15    作者:JourinTown    分类: 计算机技术


配置docker和cocalc镜像

cocalc是一个配置的很完整的科学计算平台(原来叫做sage notebook),其主页为https://cocalc.com/,任何设备只要通过网页即可访问,可以理解为一个配好了Python、R、Sagemath和Julia的jupyter notebook + 在线Sage worksheet + VScode + Overleaf + 在线的Linux X11环境。
cocalc支援的在线工具
尤其是官方的docker镜像,可以轻易的在本地和自己的服务器上部署cocalc的环境,同时这个镜像已经配好了大量的环境,最近在追加支援了Apple的M1处理器。
cocalc已经配置好的计算环境
作为一个做高能物理的搬砖工,本地的docker没有和官网一样配置好ROOT环境实在是有些可惜,在配置中发现因为这个镜像环境的特殊性其实并不好配置,且网上并没有相关教程,那在这个教程中,我将手把手教大家如何配置cocalc的docker镜像并且为其配上ROOT的后端。
首先需要安装docker,windows需要下载Docker Desktop,Linux直接通过打包管理器安装docker(docker.io)即可,windows上双击打开Docker Desktop就已经打开了docker服务,而Linux需要注意启动docker deamon。

docker pull sagemathinc/cocalc

等待docker慢慢把这个接近8个G的镜像pull下来,Windows用户千万不要着急直接点“▶”按键开始,没有做好硬盘的软链接是不会保存你修改的文件的,正确的启动方法为:

docker run --name=cocalc -d -v D:/cocalc:/projects -p 443:443 sagemathinc/cocalc

其中--name是这个本地容器的名称,D:/cocalc:/projects就是做软链接,把本地一个文件夹与容器中的projects文件夹链接在一起,就不会因为重启容器而丢失数据了,这里的D:/cocalc可以改为任何你放工程文件的地方。
现在来到浏览器,打开https://localhost,注意一定是https,因为这个容器不支援非ssl链接,你就可以成功打开和官网一样的cocalc登录和工作区了。之后每次启动只需要去容器页面点“▶”即可。

安装ROOT并在jupyter中启用

在cocalc中安装ROOT并不和普通的Linux一致,首先cocalc已经抛弃了python2,并且cocalc需要特殊的jupyter kernel配置地址,现在跟我做:

确定cocalc的python版本

我们现在进入cocalc中,新建一个jupyter notebook,选择Python3(SageMath)的后端,输入

import sys
sys.executable

这里的输出就是cocalc对应的python地址,请记下来在接下来编译ROOT时需要对这个版本的python编译。

为cocalc-python编译ROOT

首先进入容器的命令行界面,我们需要在windows powershell中输入

docker exec -it cocalc bash

然后我们到容器的用户目录(默认为sage)

cd /home/sage

我们现在需要下载最新版的root(未编译的版本),可以选择从root的git把最新的pull下来,或者去官网下载最新的未编译包,下面是一个例子:

wget https://root.cern/download/root_v6.26.00.source.tar.gz
tar -xzvf root_v6.26.00.source.tar.gz

现在进入已经解压的文件夹,应该和你下载的压缩包一个名字

cd root_v6.26.00

现在我们要新建一个编译的目录,这里就叫nbuild吧

mkdir nbuild
cd nbuild

然后我们需要用cmake的老两样来编译了

cmake ../ -DPython3_EXECUTABLE=/usr/local/sage/local/var/lib/sage/venv-python3.8/bin/python3 -Dfftw3=ON -Dminuit2=ON -Dbuiltin_fftw3=ON
make -j 8

这里要注意DPython3_EXECUTABLE指向的是在上一步中在cocalc的notebook中获取到的sage对应的python版本的地址,后面Dfftw3 Dbuiltin_fftw3是为了卷高斯等用的,不编译这个没法做卷积哦!在第一步中cmake提示缺少什么包就利用apt install补相关的依赖项即可。后面的make -j x中的x指的是worker的数量,一般你的处理器有多少个执行绪就写几吧!比如笔者的电脑有16个执行绪,我就采用了make -j 16
等待make完成[100%]并提示已经成功,那么我们为cocalc-python编译的ROOT已经编译成功了!
接下来我们

source /home/sage/root_v6.26.00/nbuild/bin/thisroot.sh

就已经在系统中利用root或是在命令行的python中用import ROOT来使用ROOT了。
接下来把这句话加载在/root/.bash_profile/home/sage/.bash_profile最后就可以在启动容器时自动加载ROOT了。
如果你还想为这个容器中的其他python编译的话,只需要用类似的方法修改DPython3后的路径,利用whereis python即可来找到系统中所有python的位置,一般都是xxx/bin/python3.x。

挂载和修改kernel

照理来说,以往我们完成到这一步,ROOT就应该已经可以在jupyter中找到了,但是即使source thisroot.sh后cocalc中却还是找不到,直接开jupyter虽然能找到但是ROOT的后端一直无法连接成功,在python直接import也提示找不到,因为cocalc中加载自定义的kernel方法并不一样。
首先,我们来把ROOT的kernel挂载在cocalc的kernel库底下

 ln -s /home/sage/root-6.26.00/nbuild/etc/notebook/kernels/root /usr/local/share/jupyter/kernels/root

然后我们需要给我们编译的成果777的权限(否则jupyter无法调用运行权限)

cd /home/sage/root-6.26.00/
chmod 777 nbuild -R

注意一定要带-R,否则子目录并没有授予权限
接下来我们要进入/usr/local/share/jupyter/kernels/root

cd /usr/local/share/jupyter/kernels/root

修改kernel.json为

{
 "language": "c++",
 "display_name": "ROOT C++",
 "env":{
   "PYTHONPATH":"/home/sage/root-6.26.00/nbuild/lib"
 },
 "argv": [
  "/usr/local/sage/local/var/lib/sage/venv-python3.8/bin/python3",
  "-m",
  "JupyROOT.kernel.rootkernel",
  "-f",
  "{connection_file}"
 ]
}

其实您前后对比可以发现只是增加了一个我们编译的ROOT文件库的地址在PYTHONPATH的环境变量中(上文"env:{}"中),这样就可以让python找到JupyROOT.kernel的地址。
此时您上cocalc刷新一下kernel列表应该就可以看到ROOT了!
刷新kernel

让python可以import ROOT

在编译我们先进入命令行的python(可以import ROOT的版本),输入

import sys
print(sys.path)

请保存好这里输出的array结果,应该类似是

['', '/home/sage/root-6.26.06=0/nbuild/lib', '/usr/lib/python38.zip', '/usr/lib/python3.8', '/usr/lib/python3.8/lib-dynload', '/usr/local/sage/local/var/lib/sage/venv-python3.8/lib/python3.8/site-packages']

这里root的lib路径被放在了第二位,这就是能够正确import ROOT的重点,而cocalc中第二位不是这个,因此导入才提示找不到ROOT。

此时root kernel进入上级目录中cocalc原本的python3和python3-sage的目录,这里以python3-sage为例

cd /usr/local/share/jupyter/kernels/python3-sage

这里需要把kernel.json文件中-cconfig的这个entry改为

    "-c",
    "%config InlineBackend.figure_formats = set(['retina'])\nimport matplotlib; matplotlib.rcParams['figure.figsize'] = (12, 7)\nimport sys;sys.path=['', '/home/sage/root-6.26.06=0/nbuild/lib', '/usr/lib/python38.zip', '/usr/lib/python3.8', '/usr/lib/python3.8/lib-dynload', '/usr/local/sage/local/var/lib/sage/venv-python3.8/lib/python3.8/site-packages']\n",

注意到这里需要把里面sys.path等号后面的array改为这一节开头让您在python中得到的结果。
当您在这里修改完俩个kernel后,您再回到cocalc中看一下,现在是不是已经可以import ROOT了?

恭喜你!当你走到这一步的时候说明您已经成功的配置好了cocalc中的ROOT后端!
这一次的尝试中,笔者也增加了对于jupyter kernel环境的认识,相信在帮助您解决配置的同时也给您添加其他kernel的灵感。

标签: ROOT CoCalc

版权所有:《豪言亂語
文章标题:《【教程】配置一个带有ROOT内核的Cocalc docker
除非注明,文章均为 《豪言亂語》 原创
转载请注明本文短网址:https://article.benhaotang.cn/pc/28.html  [生成短网址]