Way to the science

使用Apptainer创建基于Jupyter的数据分析及可视化平台

使用Apptainer创建基于Jupyter的数据分析及可视化平台

本教程将带您一步步学习如何利用Apptainer (Singularity)容器和Miniconda3,构建一个便于跨环境部署和分享的数据分析与可视化包。我们将重点介绍容器的设置,以及在容器中运行Jupyter Lab实例的方法。通过本教程,您将快速掌握如何搭建数据分析和可视化环境。

1. 准备工作

在开始之前,请确保您已经了解了singularity的基本使用方法

2. 编写Singularity文件

首先,我们需要创建一个Singularity文件来定义我们的容器。在本例中,我们将使用一个基于Miniconda3的Singularity文件。这个文件将定义容器的环境以及如何运行其中的应用程序。请将以下内容保存为miniconda_mda.def文件。

Bootstrap: docker
# From: continuumio/miniconda3:latest
From: continuumio/miniconda3:24.1.2-0
# 指定基础镜像为 Docker Hub 上的 continuumio/miniconda3,版本为 24.1.2-0
# 使用特定版本而非 latest,可以确保构建的可重复性

%files
    # Copy revised yml file
    MDa.yml /opt/conda/environments/MDa.yml
    # 将名为 MDa.yml 的文件复制到容器内的 /opt/conda/environments/ 目录下
    # 该文件定义了要在容器内创建的 conda 环境及其依赖包
    # copy fonts
    /usr/share/fonts/winfonts /usr/share/fonts
    # 将宿主机上的 /usr/share/fonts/winfonts 目录复制到容器内的 /usr/share/fonts 目录下
    # 这一步是为了让容器能访问宿主机上的字体文件

%help
    This is a Singularity container for Miniconda3.
    Use this container to run Python applications with Miniconda.

    To run the container and start Jupyter Lab, use the following command:

    apptainer run --cleanenv  \
    -B /path/to/host/directory:/home/$USER/.local \
    -B /path/to/host/directory:/home/$USER/.conda \
    -B /path/to/host/directory:/home/$USER/.config  \
    -B /path/to/host/directory:/home/$USER/.ipython \
    -B /path/to/host/directory:/home/$USER/.cache \
    -B /path/to/host/directory:/home/$USER/.jupyter \
    miniconda_mda.sif <port_number>

    Replace the following:
    - "/path/to/host/directory" with the actual path on the host system where you want to store the container's data.
    - "<port_number>" with the port number you want to use for accessing Jupyter Lab (e.g., 7777).

    The "--cleanenv" option ensures a clean environment when running the container.
    The "-B" options bind directories from the host system to the container, allowing data to persist across container runs.
    The "$USER" variable automatically expands to the current user's username.

    After running the container, open a web browser and navigate to "http://localhost:<port_number>" to access Jupyter Lab.

%environment
    # 设置容器内的环境变量
    # 将 /opt/conda/bin 添加到 PATH,确保可以找到 conda 相关的命令
    # 设置 LANG 和 LC_ALL 变量,指定容器内使用的语言编码
    export PATH=/opt/conda/bin:$PATH
    export LANG=C.UTF-8
    export LC_ALL=C.UTF-8

%post
    # Install fonts and essential utilities
    apt-get update
    apt-get install -y fontconfig ssh openssh-client
    fc-cache -fv
    # 在容器内安装字体相关的包fontconfig、ssh和openssh-client
    # 使用 fc-cache 命令更新字体缓存

    # Check installed fonts
    echo "Installed fonts:"
    fc-list
    # 输出容器内已安装的字体列表,用于检查字体是否正确安装

    # Clean up apt-get caches
    apt-get clean
    rm -rf /var/lib/apt/lists/*
    # 清理 apt-get 的缓存文件,释放容器空间

    # Update conda itself
    # 更新 conda 本身到最新版本
    conda update -n base conda

    # Install mamba and other specific packages
    conda config --add channels conda-forge
    conda config --set remote_connect_timeout_secs 600
    conda config --set remote_read_timeout_secs 600
    conda config --set remote_max_retries 3
    conda install mamba -y
    # 配置 conda,添加 conda-forge 频道,设置超时和重试次数等参数 
    # 使用 conda 安装 mamba 包管理器,加速后续安装过程

    # Use mamba to create environment from the copied MDa.yml file
    mamba env create -f /opt/conda/environments/MDa.yml
    # 使用 mamba 基于 %files 部分复制的 MDa.yml 文件创建名为 MDa 的 conda 环境

    # Clean up
    conda clean -t -i -p -y
    mamba clean -t -i -p -y
    # 使用 conda 和 mamba 清理临时文件、索引、未使用的包等,释放容器空间

%runscript
    exec /opt/conda/envs/MDa/bin/jupyter lab --allow-root --ip=0.0.0.0 --port="$1" --NotebookApp.token=""
    # 容器的运行脚本,启动 Jupyter Lab 服务
    # --allow-root 允许以 root 权限运行
    # --ip=0.0.0.0 监听所有网络接口
    # --port="$1" 使用通过命令行参数传入的端口号
    # --NotebookApp.token="" 禁用 Jupyter Lab 的访问令牌,方便本地使用

%labels
    Author YiMing Lu
    Version v1.0
    # 为容器添加标签,记录作者和版本号等元数据

3. 构建Singularity容器

在拥有上述miniconda_mda.def文件后,我们可以使用以下命令构建Singularity容器:

singularity --fakeroot build miniconda_mda.sif miniconda_mda.def (非root用户)

这将使用Singularity文件构建一个名为miniconda_mda.sif的容器。一旦构建完成,我们就可以开始使用这个容器了。

4. 运行容器

现在我们已经有了我们的容器,接下来让我们看看如何在其中运行Jupyter Lab。为了在容器中启动Jupyter Lab,您可以使用以下命令,请确保将/home/$USER/tmp替换为您希望在个人用户目录下中存储数据的实际路径,替换为您要用于访问Jupyter Lab的端口号(例如,1998)。:

mkdir -p /home/$USER/tmp && \
singularity run --cleanenv  \
    -B /home/$USER/tmp:/home/$USER/.local \
    -B /home/$USER/tmp:/home/$USER/.conda \
    -B /home/$USER/tmp:/home/$USER/.config  \
    -B /home/$USER/tmp:/home/$USER/.ipython \
    -B /home/$USER/tmp:/home/$USER/.cache \
    -B /home/$USER/tmp:/home/$USER/.jupyter \
    /mnt/softs/singularity_sifs/jupyter_MDa.sif 1998

另带有ghostscript的版本(lmm)

mkdir -p /home/$USER/tmp && \
singularity run --cleanenv  \
    -B /home/$USER/tmp:/home/$USER/.local \
    -B /home/$USER/tmp:/home/$USER/.conda \
    -B /home/$USER/tmp:/home/$USER/.config  \
    -B /home/$USER/tmp:/home/$USER/.ipython \
    -B /home/$USER/tmp:/home/$USER/.cache \
    -B /home/$USER/tmp:/home/$USER/.jupyter \
    /mnt/softs/singularity_sifs/jupyter_MDa+gs.sif 1998

5. 访问Jupyter Lab

一旦容器在您的系统上运行,并且Jupyter Lab在容器中启动,您可以打开一个Web浏览器,并在地址栏中输入http://ip:来访问Jupyter Lab。如使用slurm提交,则须使用承担作业节点的ip,如对于node2,则ip=192.168.33.102

结论

通过这个教程,我们学习了如何创建一个用于数据分析和可视化的Singularity容器,并在其中运行Jupyter Lab。这使得我们可以轻松地在不同的环境中分享和部署我们的数据分析和可视化环境。希望这个教程能够帮助您快速开始构建自己的数据分析和可视化包。

附: 教程使用的Mda.yml文件:

文件可通过如conda env export --name myENV > conda_envs/myENV.yml的命令导出,需删除prefix及无效的包 (依据报错删减即可)

name: MDa
channels:
  - conda-forge
  - defaults
dependencies:
  - aiofiles=22.1.0=pyhd8ed1ab_0
  - aiohttp=3.8.4=py310h1fa729e_0
  - aiosignal=1.3.1=pyhd8ed1ab_0
  - aiosqlite=0.19.0=pyhd8ed1ab_0
  - alabaster=0.7.13=pyhd8ed1ab_0
  - alphashape=1.3.1=pyh44b312d_0
  - alsa-lib=1.2.8=h166bdaf_0
  - anyio=3.6.2=pyhd8ed1ab_0
  - aom=3.5.0=h27087fc_0
  - appdirs=1.4.4=pyh9f0ad1d_0
  - argon2-cffi=21.3.0=pyhd8ed1ab_0
  - argon2-cffi-bindings=21.2.0=py310h5764c6d_3
  - asttokens=2.2.1=pyhd8ed1ab_0
  - astunparse=1.6.3=pyhd8ed1ab_0
  - async-lru=2.0.2=pyhd8ed1ab_0
  - async-timeout=4.0.2=pyhd8ed1ab_0
  - attr=2.5.1=h166bdaf_1
  - attrs=22.2.0=pyh71513ae_0
  - babel=2.11.0=pyhd8ed1ab_0
  - backcall=0.2.0=pyh9f0ad1d_0
  - backports=1.0=pyhd8ed1ab_3
  - backports.functools_lru_cache=1.6.4=pyhd8ed1ab_0
  - backports.zoneinfo=0.2.1=py310hff52083_7
  - backrefs=5.2=pyhd8ed1ab_2
  - bcrypt=3.2.2=py310h5764c6d_1
  - beautifulsoup4=4.11.2=pyha770c72_0
  - biopython=1.80=py310h5764c6d_0
  - bleach=6.0.0=pyhd8ed1ab_0
  - blosc=1.21.3=hafa529b_0
  - boost=1.78.0=py310hc4a4660_4
  - boost-cpp=1.78.0=h75c5d50_1
  - boto3=1.26.126=pyhd8ed1ab_0
  - botocore=1.29.126=pyhd8ed1ab_0
  - bracex=2.2.1=pyhd8ed1ab_0
  - branca=0.6.0=pyhd8ed1ab_0
  - brotli=1.0.9=h166bdaf_8
  - brotli-bin=1.0.9=h166bdaf_8
  - brotlipy=0.7.0=py310h5764c6d_1005
  - brunsli=0.1=h9c3ff4c_0
  - bzip2=1.0.8=h7f98852_4
  - c-ares=1.18.1=h7f98852_0
  - c-blosc2=2.6.1=hf91038e_0
  - ca-certificates=2023.11.17=hbcca054_0
  - cached-property=1.5.2=hd8ed1ab_1
  - cached_property=1.5.2=pyha770c72_1
  - cairo=1.16.0=ha61ee94_1014
  - certifi=2023.11.17=pyhd8ed1ab_0
  - cffi=1.15.1=py310h255011f_3
  - cfitsio=4.2.0=hd9d235c_0
  - cftime=1.6.2=py310hde88566_1
  - charls=2.4.1=hcb278e6_0
  - charset-normalizer=2.1.1=pyhd8ed1ab_0
  - chart-studio=1.1.0=pyh9f0ad1d_0
  - click=8.1.3=unix_pyhd8ed1ab_2
  - click-log=0.4.0=pyhd8ed1ab_0
  - click-plugins=1.1.1=py_0
  - cligj=0.7.2=pyhd8ed1ab_1
  - cloudpickle=2.2.1=pyhd8ed1ab_0
  - colorama=0.4.6=pyhd8ed1ab_0
  - coloredlogs=15.0.1=pyhd8ed1ab_3
  - comm=0.1.2=pyhd8ed1ab_0
  - conda=23.1.0=py310hff52083_0
  - conda-package-handling=2.0.2=pyh38be061_0
  - conda-package-streaming=0.7.0=pyhd8ed1ab_1
  - contourpy=1.2.0=py310hd41b1e2_0
  - cryptography=39.0.1=py310h34c0648_0
  - curl=8.2.1=hdbd6064_0
  - cycler=0.11.0=pyhd8ed1ab_0
  - cytoolz=0.12.0=py310h5764c6d_1
  - dask-core=2023.2.0=pyhd8ed1ab_0
  - dav1d=1.0.0=h166bdaf_1
  - dbus=1.13.6=h5008d03_3
  - debugpy=1.6.6=py310heca2aa9_0
  - decorator=5.1.1=pyhd8ed1ab_0
  - defusedxml=0.7.1=pyhd8ed1ab_0
  - descartes=1.1.0=py_4
  - dill=0.3.6=pyhd8ed1ab_1
  - docker-pycreds=0.4.0=py_0
  - docutils=0.20.1=py310hff52083_3
  - double-conversion=3.2.0=h27087fc_1
  - dpdata=0.2.15=pyhd8ed1ab_0
  - eigen=3.4.0=h4bd325d_0
  - emmet-core=0.50.0=pyhd8ed1ab_0
  - entrypoints=0.4=pyhd8ed1ab_0
  - et_xmlfile=1.1.0=pyhd8ed1ab_0
  - exceptiongroup=1.1.0=pyhd8ed1ab_0
  - executing=1.2.0=pyhd8ed1ab_0
  - expat=2.5.0=h27087fc_0
  - fasteners=0.17.3=pyhd8ed1ab_0
  - ffmpeg=5.1.2=gpl_h8dda1f0_106
  - fftw=3.3.10=nompi_hf0379b8_106
  - fiona=1.9.1=py310ha325b7b_0
  - flask=2.2.2=pyhd8ed1ab_0
  - flit-core=3.8.0=pyhd8ed1ab_0
  - fmt=10.1.1=h00ab1b0_0
  - folium=0.14.0=pyhd8ed1ab_0
  - font-ttf-dejavu-sans-mono=2.37=hab24e00_0
  - font-ttf-inconsolata=3.000=h77eed37_0
  - font-ttf-source-code-pro=2.038=h77eed37_0
  - font-ttf-ubuntu=0.83=hab24e00_0
  - fontconfig=2.14.2=h14ed4e7_0
  - fonts-conda-ecosystem=1=0
  - fonts-conda-forge=1=0
  - fonttools=4.38.0=py310h5764c6d_1
  - freetype=2.12.1=hca18f0e_1
  - freexl=1.0.6=h166bdaf_1
  - freud=2.10.0=py310hb92f2fe_0
  - frozenlist=1.3.3=py310h5764c6d_0
  - fsspec=2023.1.0=pyhd8ed1ab_0
  - future=0.18.3=pyhd8ed1ab_0
  - gdal=3.6.2=py310hc1b7723_7
  - geopandas=0.12.2=pyhd8ed1ab_0
  - geopandas-base=0.12.2=pyha770c72_0
  - geos=3.11.1=h27087fc_0
  - geotiff=1.7.1=h7a142b4_6
  - gettext=0.21.1=h27087fc_0
  - giflib=5.2.1=h36c2ea0_2
  - gitdb=4.0.10=pyhd8ed1ab_0
  - gitpython=3.1.30=pyhd8ed1ab_0
  - gl2ps=1.4.2=h0708190_0
  - glew=2.1.0=h9c3ff4c_2
  - glib=2.74.1=h6239696_1
  - glib-tools=2.74.1=h6239696_1
  - gmp=6.2.1=h58526e2_0
  - gmpy2=2.1.2=py310h3ec546c_1
  - gnutls=3.7.8=hf3e180e_0
  - graphite2=1.3.13=h58526e2_1001
  - greenlet=2.0.2=py310hc6cd4ac_1
  - griddataformats=1.0.1=pyhd8ed1ab_0
  - gsd=2.7.0=py310h0a54255_1
  - gst-plugins-base=1.22.0=h4243ec0_0
  - gstreamer=1.22.0=h25f0c4b_0
  - gstreamer-orc=0.4.33=h166bdaf_0
  - h5py=3.8.0=nompi_py310h0311031_100
  - harfbuzz=6.0.0=h8e241bc_0
  - hdf4=4.2.15=h9772cbc_5
  - hdf5=1.12.2=nompi_h4df4325_101
  - hmmlearn=0.2.8=py310h769672d_1
  - humanfriendly=10.0=py310hff52083_4
  - hypothesis=6.68.1=pyha770c72_0
  - icu=70.1=h27087fc_0
  - idna=3.4=pyhd8ed1ab_0
  - imagecodecs=2023.1.23=py310ha3ed6a1_0
  - imageio=2.25.1=pyh24c5eb1_0
  - imageio-ffmpeg=0.4.8=pyhd8ed1ab_0
  - imagesize=1.4.1=pyhd8ed1ab_0
  - importlib-metadata=6.0.0=pyha770c72_0
  - importlib_metadata=6.0.0=hd8ed1ab_0
  - importlib_resources=5.10.2=pyhd8ed1ab_0
  - iniconfig=2.0.0=pyhd8ed1ab_0
  - ipydatawidgets=4.3.2=pyhc268e32_0
  - ipykernel=6.21.2=pyh210e3f2_0
  - ipylab=0.7.1=pyhd8ed1ab_1
  - ipynbname=2021.3.2=pyhd8ed1ab_0
  - ipython=8.10.0=pyh41d4057_0
  - ipython_genutils=0.2.0=py_1
  - ipywidgets=7.7.5=pyhd8ed1ab_0
  - itsdangerous=2.1.2=pyhd8ed1ab_0
  - jack=1.9.22=h11f4161_0
  - jedi=0.18.2=pyhd8ed1ab_0
  - jinja2=3.1.2=pyhd8ed1ab_1
  - jmespath=1.0.1=pyhd8ed1ab_0
  - joblib=1.2.0=pyhd8ed1ab_0
  - jpeg=9e=h0b41bf4_3
  - json-c=0.16=hc379101_0
  - json5=0.9.5=pyh9f0ad1d_0
  - jsoncpp=1.9.5=h4bd325d_1
  - jsonschema=4.17.3=pyhd8ed1ab_0
  - jupyter-lsp=2.2.0=pyhd8ed1ab_0
  - jupyter-server-proxy=4.0.0=pyhd8ed1ab_0
  - jupyter_client=8.0.2=pyhd8ed1ab_0
  - jupyter_core=5.2.0=py310hff52083_0
  - jupyter_events=0.6.3=pyhd8ed1ab_0
  - jupyter_server=2.6.0=pyhd8ed1ab_0
  - jupyter_server_fileid=0.9.0=pyhd8ed1ab_0
  - jupyter_server_terminals=0.4.4=pyhd8ed1ab_1
  - jupyter_server_ydoc=0.8.0=pyhd8ed1ab_0
  - jupyter_ydoc=0.2.4=pyhd8ed1ab_0
  - jupyterlab=3.6.4=pyhd8ed1ab_0
  - jupyterlab_pygments=0.2.2=pyhd8ed1ab_0
  - jupyterlab_server=2.19.0=pyhd8ed1ab_0
  - jupyterlab_widgets=1.1.4=pyhd8ed1ab_0
  - jxrlib=1.1=h7f98852_2
  - kaleido-core=0.2.1=h3644ca4_0
  - kealib=1.5.0=ha7026e8_0
  - keyutils=1.6.1=h166bdaf_0
  - kiwisolver=1.4.4=py310hbf28c38_1
  - krb5=1.20.1=h81ceb04_0
  - lame=3.100=h166bdaf_1003
  - latexcodec=2.0.1=pyh9f0ad1d_0
  - lcms2=2.14=hfd0df8a_1
  - ld_impl_linux-64=2.40=h41732ed_0
  - lerc=4.0.0=h27087fc_0
  - libaec=1.0.6=hcb278e6_1
  - libarchive=3.6.2=h3d51595_0
  - libavif=0.11.1=h5cdd6b5_0
  - libblas=3.9.0=16_linux64_openblas
  - libbrotlicommon=1.0.9=h166bdaf_8
  - libbrotlidec=1.0.9=h166bdaf_8
  - libbrotlienc=1.0.9=h166bdaf_8
  - libcap=2.66=ha37c62d_0
  - libcblas=3.9.0=16_linux64_openblas
  - libclang=15.0.7=default_had23c3d_1
  - libclang13=15.0.7=default_h3e3d535_1
  - libcups=2.3.3=h36d4200_3
  - libcurl=8.2.1=h251f7ec_0
  - libdb=6.2.32=h9c3ff4c_0
  - libdeflate=1.17=h0b41bf4_0
  - libdrm=2.4.114=h166bdaf_0
  - libedit=3.1.20191231=he28a2e2_2
  - libev=4.33=h516909a_1
  - libevent=2.1.10=h28343ad_4
  - libffi=3.4.2=h7f98852_5
  - libflac=1.4.2=h27087fc_0
  - libgcc-ng=12.2.0=h65d4601_19
  - libgcrypt=1.10.1=h166bdaf_0
  - libgdal=3.6.2=hea5766e_7
  - libgfortran-ng=12.2.0=h69a702a_19
  - libgfortran5=12.2.0=h337968e_19
  - libglib=2.74.1=h606061b_1
  - libglu=9.0.0=he1b5a44_1001
  - libgomp=12.2.0=h65d4601_19
  - libgpg-error=1.46=h620e276_0
  - libhwloc=2.8.0=h32351e8_1
  - libiconv=1.17=h166bdaf_0
  - libidn2=2.3.4=h166bdaf_0
  - libkml=1.3.0=h37653c0_1015
  - liblapack=3.9.0=16_linux64_openblas
  - libllvm15=15.0.7=hadd5161_0
  - libmamba=1.5.1=h744094f_0
  - libmambapy=1.5.1=py310h39ff949_0
  - libnetcdf=4.9.1=nompi_h34a3ff0_100
  - libnghttp2=1.52.0=h61bc06f_0
  - libnsl=2.0.0=h7f98852_0
  - libogg=1.3.4=h7f98852_1
  - libopenblas=0.3.21=pthreads_h78a6416_3
  - libopus=1.3.1=h7f98852_1
  - libpciaccess=0.17=h166bdaf_0
  - libpng=1.6.39=h753d276_0
  - libpq=15.2=hb675445_0
  - libprotobuf=3.21.12=h3eb15da_0
  - librttopo=1.1.0=ha49c73b_12
  - libsndfile=1.2.0=hb75c966_0
  - libsodium=1.0.18=h36c2ea0_1
  - libsolv=0.7.25=hfc55251_0
  - libspatialindex=1.9.3=h9c3ff4c_4
  - libspatialite=5.0.1=h221c8f1_23
  - libsqlite=3.40.0=h753d276_0
  - libssh2=1.10.0=hf14f497_3
  - libstdcxx-ng=12.2.0=h46fd767_19
  - libsystemd0=252=h2a991cd_0
  - libtasn1=4.19.0=h166bdaf_0
  - libtheora=1.1.1=h7f98852_1005
  - libtiff=4.5.0=h6adf6a1_2
  - libtool=2.4.7=h27087fc_0
  - libudev1=252=h166bdaf_0
  - libunistring=0.9.10=h7f98852_0
  - libuuid=2.32.1=h7f98852_1000
  - libva=2.17.0=h0b41bf4_0
  - libvorbis=1.3.7=h9c3ff4c_0
  - libvpx=1.11.0=h9c3ff4c_3
  - libwebp-base=1.2.4=h166bdaf_0
  - libxcb=1.13=h7f98852_1004
  - libxkbcommon=1.5.0=h79f4944_0
  - libxml2=2.10.3=h7463322_0
  - libzip=1.9.2=hc929e4a_1
  - libzlib=1.2.13=h166bdaf_4
  - libzopfli=1.0.3=h9c3ff4c_0
  - locket=1.0.0=pyhd8ed1ab_0
  - loguru=0.6.0=py310hff52083_2
  - lz4=4.0.2=py310h5d5e884_0
  - lz4-c=1.9.4=hcb278e6_0
  - lzo=2.10=h516909a_1000
  - mamba=1.5.1=py310h51d5547_0
  - mapclassify=2.5.0=pyhd8ed1ab_1
  - markupsafe=2.1.2=py310h1fa729e_0
  - mathjax=2.7.7=ha770c72_3
  - matplotlib=3.8.1=py310hff52083_0
  - matplotlib-base=3.8.1=py310h62c0568_0
  - matplotlib-inline=0.1.6=pyhd8ed1ab_0
  - mdanalysis=2.5.0=py310hff15622_1
  - mdanalysistests=2.5.0=pyhd8ed1ab_0
  - mdtraj=1.9.7=py310h902c554_4
  - mistune=2.0.5=pyhd8ed1ab_0
  - mmtf-python=1.1.3=pyhd8ed1ab_0
  - monty=2023.4.10=pyhd8ed1ab_0
  - moviepy=1.0.3=pyhd8ed1ab_1
  - mp-api=0.32.1=pyhd8ed1ab_0
  - mpc=1.3.1=hfe3b2da_0
  - mpfr=4.1.0=h9202a9a_1
  - mpg123=1.31.2=hcb278e6_0
  - mpmath=1.2.1=pyhd8ed1ab_0
  - mrcfile=1.4.3=pyhd8ed1ab_0
  - msgpack-python=1.0.4=py310hbf28c38_1
  - multidict=6.0.4=py310h1fa729e_0
  - multiprocess=0.70.14=py310h5764c6d_3
  - munch=2.5.0=py_0
  - munkres=1.1.4=pyh9f0ad1d_0
  - mysql-common=8.0.32=ha901b37_0
  - mysql-libs=8.0.32=hd7da12d_0
  - natsort=8.1.0=pyhd8ed1ab_0
  - nbclassic=0.5.1=pyhd8ed1ab_0
  - nbclient=0.7.2=pyhd8ed1ab_0
  - nbconvert=7.2.9=pyhd8ed1ab_0
  - nbconvert-core=7.2.9=pyhd8ed1ab_0
  - nbconvert-pandoc=7.2.9=pyhd8ed1ab_0
  - ncurses=6.3=h27087fc_1
  - nest-asyncio=1.5.6=pyhd8ed1ab_0
  - netcdf4=1.6.2=nompi_py310h0feb132_101
  - nettle=3.8.1=hc379101_1
  - networkx=3.0=pyhd8ed1ab_0
  - nglview=3.0.5=pyhe68d6a8_0
  - nlohmann_json=3.11.2=h27087fc_0
  - nomkl=1.0=h5ca1d4c_0
  - notebook=6.5.2=pyha770c72_1
  - notebook-shim=0.2.2=pyhd8ed1ab_0
  - nspr=4.35=h27087fc_0
  - nss=3.88=he45b914_0
  - numexpr=2.8.3=py310hf05e7a9_101
  - openai=0.26.5=pyhd8ed1ab_0
  - openbabel=3.1.1=py310heaf86c6_5
  - openh264=2.3.1=hcb278e6_2
  - openjpeg=2.5.0=hfec8fc6_2
  - openpyxl=3.1.1=py310h1fa729e_0
  - openssl
  - orca=1.8=pyhd8ed1ab_0
  - overrides=7.3.1=pyhd8ed1ab_0
  - p11-kit=0.24.1=hc5aa10d_0
  - packaging=23.0=pyhd8ed1ab_0
  - palettable=3.3.3=pyhd8ed1ab_0
  - pandas=1.5.3=py310h9b08913_0
  - pandas-stubs=1.5.3.230214=pyhd8ed1ab_0
  - pandoc=2.19.2=h32600fe_1
  - pandocfilters=1.5.0=pyhd8ed1ab_0
  - paramiko=2.11.0=pyhd8ed1ab_0
  - parso=0.8.3=pyhd8ed1ab_0
  - partd=1.3.0=pyhd8ed1ab_0
  - pathtools=0.1.2=py_1
  - patsy=0.5.3=pyhd8ed1ab_0
  - pbr=5.11.1=pyhd8ed1ab_0
  - pcre2=10.40=hc3806b6_0
  - pexpect=4.8.0=pyh1a96a4e_2
  - pickleshare=0.7.5=py_1003
  - pillow=9.4.0=py310h023d228_1
  - pip=23.0=pyhd8ed1ab_0
  - pixman=0.40.0=h36c2ea0_0
  - pkgutil-resolve-name=1.3.10=pyhd8ed1ab_0
  - platformdirs=3.0.0=pyhd8ed1ab_0
  - plotly=5.14.1=pyhd8ed1ab_0
  - pluggy=1.0.0=pyhd8ed1ab_5
  - ply=3.11=py_1
  - pooch=1.6.0=pyhd8ed1ab_0
  - poppler=23.01.0=h091648b_0
  - poppler-data=0.4.12=hd8ed1ab_0
  - postgresql=15.2=h3248436_0
  - proglog=0.1.9=py_0
  - proj=9.1.1=h8ffa02c_2
  - prometheus_client=0.16.0=pyhd8ed1ab_0
  - prompt-toolkit=3.0.36=pyha770c72_0
  - protobuf=4.21.12=py310heca2aa9_0
  - psutil=5.9.4=py310h5764c6d_0
  - pthread-stubs=0.4=h36c2ea0_1001
  - ptyprocess=0.7.0=pyhd3deb0d_0
  - pugixml=1.11.4=h9c3ff4c_0
  - pulseaudio=16.1=ha8d29e2_1
  - pure_eval=0.2.2=pyhd8ed1ab_0
  - pybase64=1.2.3=py310h5764c6d_1
  - pybind11-abi=4=hd8ed1ab_3
  - pybtex=0.24.0=pyhd8ed1ab_2
  - pycairo=1.23.0=py310hb8a676c_0
  - pycosat=0.6.4=py310h5764c6d_1
  - pycparser=2.21=pyhd8ed1ab_0
  - pydantic=1.10.7=py310h1fa729e_0
  - pyedr=0.7.1=pyhd8ed1ab_0
  - pygments=2.14.0=pyhd8ed1ab_0
  - pymatgen=2023.3.23=py310h5a539fb_0
  - pynacl=1.5.0=py310h5764c6d_2
  - pyopenssl=23.0.0=pyhd8ed1ab_0
  - pyparsing=3.0.9=pyhd8ed1ab_0
  - pypdf2=2.2.0=pyhd8ed1ab_0
  - pyproj=3.4.1=py310h15e2413_1
  - pyqt=5.15.7=py310hab646b1_3
  - pyqt5-sip=12.11.0=py310heca2aa9_3
  - pyrsistent=0.19.3=py310h1fa729e_0
  - pyscal=2.10.18=py310h5a539fb_2
  - pysocks=1.7.1=pyha2e5f31_6
  - pytables=3.7.0=py310hb60b9b2_3
  - pytest=7.2.1=pyhd8ed1ab_0
  - python=3.10.9=he550d4f_0_cpython
  - python-dateutil=2.8.2=pyhd8ed1ab_0
  - python-fastjsonschema=2.16.2=pyhd8ed1ab_0
  - python-json-logger=2.0.6=pyhd8ed1ab_0
  - python_abi=3.10=3_cp310
  - pythreejs=2.4.2=pyh1d7be83_0
  - pytng=0.3.0=py310hc908c09_0
  - pytz=2022.7.1=pyhd8ed1ab_0
  - pyvista=0.38.4=pyhd8ed1ab_0
  - pywavelets=1.4.1=py310h0a54255_0
  - pyyaml=6.0=py310h5764c6d_5
  - pyzmq=25.0.0=py310h059b190_0
  - qt-main=5.15.8=h5d23da1_6
  - rdkit=2023.03.1=py310h399bcf7_0
  - readline=8.1.2=h0f457ee_0
  - reportlab=3.6.13=py310h1a56a1c_0
  - reproc=14.2.4=h0b41bf4_0
  - reproc-cpp=14.2.4=hcb278e6_0
  - requests=2.28.2=pyhd8ed1ab_0
  - retrying=1.3.3=py_2
  - rfc3339-validator=0.1.4=pyhd8ed1ab_0
  - rfc3986-validator=0.1.1=pyh9f0ad1d_0
  - rowan=1.3.0.post1=pyh9f0ad1d_0
  - rtree=1.0.1=py310hbdcdc62_1
  - ruamel.yaml=0.17.21=py310h1fa729e_3
  - ruamel.yaml.clib=0.2.7=py310h1fa729e_1
  - s3transfer=0.6.0=pyhd8ed1ab_0
  - scienceplots=2.1.0=pyhd8ed1ab_0
  - scikit-image=0.19.3=py310h769672d_2
  - scikit-learn=1.2.1=py310h209a8ca_0
  - scipy=1.10.0=py310h8deb116_2
  - scooby=0.7.1=pyhd8ed1ab_0
  - scour=0.38.2=pyhd8ed1ab_0
  - seaborn=0.12.2=hd8ed1ab_0
  - seaborn-base=0.12.2=pyhd8ed1ab_0
  - send2trash=1.8.0=pyhd8ed1ab_0
  - sentry-sdk=1.15.0=pyhd8ed1ab_0
  - setproctitle=1.3.2=py310h5764c6d_1
  - setuptools=67.3.1=pyhd8ed1ab_0
  - shapely=2.0.1=py310h8b84c32_0
  - simpervisor=1.0.0=pyhd8ed1ab_0
  - sip=6.7.7=py310heca2aa9_0
  - six=1.16.0=pyh6c4a22f_0
  - smmap=3.0.5=pyh44b312d_0
  - snappy=1.1.9=hbd366e4_2
  - sniffio=1.3.0=pyhd8ed1ab_0
  - snowballstemmer=2.2.0=pyhd8ed1ab_0
  - sortedcontainers=2.4.0=pyhd8ed1ab_0
  - soupsieve=2.3.2.post1=pyhd8ed1ab_0
  - spglib=2.0.2=py310h0a54255_0
  - sphinx=7.2.6=pyhd8ed1ab_0
  - sphinxcontrib-applehelp=1.0.7=pyhd8ed1ab_0
  - sphinxcontrib-devhelp=1.0.5=pyhd8ed1ab_0
  - sphinxcontrib-htmlhelp=2.0.4=pyhd8ed1ab_0
  - sphinxcontrib-jsmath=1.0.1=pyhd8ed1ab_0
  - sphinxcontrib-qthelp=1.0.6=pyhd8ed1ab_0
  - sphinxcontrib-serializinghtml=1.1.9=pyhd8ed1ab_0
  - sqlalchemy=2.0.15=py310h2372a71_0
  - sqlite=3.40.0=h4ff8645_0
  - squarify=0.4.3=py_0
  - stack_data=0.6.2=pyhd8ed1ab_0
  - statsmodels=0.13.5=py310hde88566_2
  - svt-av1=1.4.1=hcb278e6_0
  - sympy=1.10.1=py310hff52083_1
  - tabulate=0.9.0=pyhd8ed1ab_1
  - tbb=2021.7.0=h924138e_1
  - tbb-devel=2021.7.0=h924138e_1
  - tenacity=8.2.1=pyhd8ed1ab_0
  - terminado=0.17.1=pyh41d4057_0
  - threadpoolctl=3.1.0=pyh8a188c0_0
  - tidynamics=1.0.0=py_0
  - tifffile=2023.2.3=pyhd8ed1ab_0
  - tiledb=2.13.2=hd532e3d_0
  - time=1.8=h516909a_0
  - tinycss2=1.2.1=pyhd8ed1ab_0
  - tk=8.6.13=noxft_h4845f30_101
  - toml=0.10.2=pyhd8ed1ab_0
  - tomli=2.0.1=pyhd8ed1ab_0
  - toolz=0.12.0=pyhd8ed1ab_0
  - tornado=6.2=py310h5764c6d_1
  - tqdm=4.64.1=pyhd8ed1ab_0
  - traitlets=5.9.0=pyhd8ed1ab_0
  - traittypes=0.2.1=pyh9f0ad1d_2
  - trimesh=3.20.0=pyhd8ed1ab_0
  - types-pytz=2022.7.1.0=pyhd8ed1ab_0
  - typing-extensions=4.4.0=hd8ed1ab_0
  - typing_extensions=4.4.0=pyha770c72_0
  - typing_utils=0.1.0=pyhd8ed1ab_0
  - tzcode=2022g=h166bdaf_0
  - tzdata=2022g=h191b570_0
  - uncertainties=3.1.7=pyhd8ed1ab_0
  - unicodedata2=15.0.0=py310h5764c6d_0
  - urllib3=1.26.14=pyhd8ed1ab_0
  - utfcpp=3.2.3=ha770c72_0
  - vtk=9.2.6=qt_py310h8908f42_200
  - wandb=0.13.10=pyhd8ed1ab_0
  - wcmatch=8.3=pyhd8ed1ab_0
  - wcwidth=0.2.6=pyhd8ed1ab_0
  - webencodings=0.5.1=py_1
  - websocket-client=1.5.1=pyhd8ed1ab_0
  - werkzeug=2.2.3=pyhd8ed1ab_0
  - wheel=0.38.4=pyhd8ed1ab_0
  - widgetsnbextension=3.6.4=pyhd8ed1ab_0
  - wslink=1.10.1=pyhd8ed1ab_0
  - x264=1!164.3095=h166bdaf_2
  - x265=3.5=h924138e_3
  - xcb-util=0.4.0=h166bdaf_0
  - xcb-util-image=0.4.0=h166bdaf_0
  - xcb-util-keysyms=0.4.0=h166bdaf_0
  - xcb-util-renderutil=0.3.9=h166bdaf_0
  - xcb-util-wm=0.4.1=h166bdaf_0
  - xerces-c=3.2.4=h55805fa_1
  - xorg-fixesproto=5.0=h7f98852_1002
  - xorg-kbproto=1.0.7=h7f98852_1002
  - xorg-libice=1.0.10=h7f98852_0
  - xorg-libsm=1.2.3=hd9c2040_1000
  - xorg-libx11=1.7.2=h7f98852_0
  - xorg-libxau=1.0.9=h7f98852_0
  - xorg-libxdmcp=1.1.3=h7f98852_0
  - xorg-libxext=1.3.4=h7f98852_1
  - xorg-libxfixes=5.0.3=h7f98852_1004
  - xorg-libxrender=0.9.10=h7f98852_1003
  - xorg-libxt=1.2.1=h7f98852_2
  - xorg-renderproto=0.11.1=h7f98852_1002
  - xorg-xextproto=7.3.0=h7f98852_1002
  - xorg-xproto=7.0.31=h7f98852_1007
  - xyzservices=2022.9.0=pyhd8ed1ab_0
  - xz=5.2.6=h166bdaf_0
  - y-py=0.5.9=py310h4426083_0
  - yaml=0.2.5=h7f98852_2
  - yaml-cpp=0.7.0=h27087fc_2
  - yarl=1.8.2=py310h5764c6d_0
  - ypy-websocket=0.8.2=pyhd8ed1ab_0
  - zeromq=4.3.4=h9c3ff4c_1
  - zfp=1.0.0=h27087fc_3
  - zipp=3.13.0=pyhd8ed1ab_0
  - zlib=1.2.13=h166bdaf_4
  - zlib-ng=2.0.6=h166bdaf_0
  - zstandard=0.19.0=py310hdeb6495_1
  - zstd=1.5.2=h3eb15da_6
  - pip:
      - addict==2.4.0
      - arrow==1.2.3
      - asciichartpy==1.5.25
      - ase==3.22.1
      - boltons==23.0.0
      - bravado==11.0.3
      - bravado-core==5.17.1
      - commonmark==0.9.1
      - configargparse==1.5.3
      - cp2kdata==0.6.2
      - css-html-js-minify==2.5.5
      - dash==2.8.1
      - dash-core-components==2.0.0
      - dash-html-components==2.0.0
      - dash-table==5.0.0
      - dnspython==2.3.0
      - filetype==1.2.0
      - flatten-dict==0.4.2
      - fqdn==1.5.1
      - isoduration==20.11.0
      - json2html==1.3.0
      - jsonpointer==2.3
      - jsonref==1.1.0
      - libsass==0.22.0
      - lxml==5.0.0
      - mdanalysis-sphinx-theme==1.3.1
      - mdapackmol==0.1.0
      - monotonic==1.6
      - mpcontribs-client==5.3.0
      - nbformat==5.5.0
      - numpy==1.26.2
      - open3d==0.16.0
      - pint==0.19.2
      - pybtex-docutils==1.0.3
      - pyisemail==2.0.1
      - pymongo==4.3.3
      - pyquaternion==0.9.9
      - python-slugify==8.0.1
      - regex==2023.10.3
      - requests-futures==1.0.0
      - rfc3987==1.3.8
      - semantic-version==2.10.0
      - simplejson==3.19.1
      - sphinx-rtd-theme==2.0.0
      - sphinx-sitemap==2.5.1
      - sphinxcontrib-bibtex==2.6.1
      - sphinxcontrib-jquery==4.1
      - swagger-spec-validator==3.0.3
      - text-unidecode==1.3
      - ujson==5.7.0
      - unidecode==1.3.7
      - uri-template==1.2.0
      - webcolors==1.12

Leave a comment

Your email address will not be published. Required fields are marked *