diff --git a/.build/10activate-conda-env.sh b/.build/10activate-conda-env.sh new file mode 100755 index 0000000..ed7347f --- /dev/null +++ b/.build/10activate-conda-env.sh @@ -0,0 +1,8 @@ +#!/bin/bash +# Copyright (c) Jupyter Development Team. +# Distributed under the terms of the Modified BSD License. + +# This registers the initialization code for the conda shell code +# It also activates default environment in the end, so we don't need to activate it manually +# Documentation: https://docs.conda.io/projects/conda/en/latest/dev-guide/deep-dives/activation.html +eval "$(conda shell.bash hook)" diff --git a/.build/Dockerfile b/.build/Dockerfile index e86e299..6f137e7 100755 --- a/.build/Dockerfile +++ b/.build/Dockerfile @@ -1,13 +1,13 @@ -# This Dockerfile is generated by 'generate-Dockerfile.sh' from elements within 'src/' +# This Dockerfile is generated by 'generate-Dockerfile.sh' from elements within 'custom/' # **Please do not change this file directly!** -# To adapt this Dockerfile, adapt 'generate-Dockerfile.sh' or 'src/Dockerfile.usefulpackages'. +# To adapt this Dockerfile, adapt 'generate-Dockerfile.sh' or 'custom/usefulpackages.Dockerfile'. # More information can be found in the README under configuration. # Use NVIDIA CUDA as base image and run the same installation as in the other packages. # The version of cuda must match those of the packages installed in src/Dockerfile.gpulibs -FROM nvidia/cuda:11.6.2-cudnn8-runtime-ubuntu20.04 +FROM nvidia/cuda:12.0.1-cudnn8-runtime-ubuntu22.04 LABEL authors="Christoph Schranz , Mathematical Michael " # This is a concatenated Dockerfile, the maintainers of subsequent sections may vary. RUN chmod 1777 /tmp && chmod 1777 /var/tmp @@ -17,15 +17,15 @@ RUN apt-get update && \ apt-get -y install apt-utils ############################################################################ -#################### Dependency: jupyter/base-image ######################## +#################### Dependency: jupyter/docker-stacks-foundation ########## ############################################################################ # Copyright (c) Jupyter Development Team. # Distributed under the terms of the Modified BSD License. -# Ubuntu 20.04 (focal) -# https://hub.docker.com/_/ubuntu/?tab=tags&name=focal -ARG ROOT_CONTAINER=ubuntu:focal +# Ubuntu 22.04 (jammy) +# https://hub.docker.com/_/ubuntu/tags?page=1&name=jammy +ARG ROOT_CONTAINER=ubuntu:22.04 LABEL maintainer="Jupyter Project " @@ -39,26 +39,18 @@ SHELL ["/bin/bash", "-o", "pipefail", "-c"] USER root -# Install all OS dependencies for notebook server that starts but lacks all -# features (e.g., download as all possible file formats) +# Install all OS dependencies for the Server that starts +# but lacks all features (e.g., download as all possible file formats) ENV DEBIAN_FRONTEND noninteractive RUN apt-get update --yes && \ - # - apt-get upgrade is run to patch known vulnerabilities in apt-get packages as - # the ubuntu base image is rebuilt too seldom sometimes (less than once a month) + # - `apt-get upgrade` is run to patch known vulnerabilities in apt-get packages as + # the Ubuntu base image is rebuilt too seldom sometimes (less than once a month) apt-get upgrade --yes && \ apt-get install --yes --no-install-recommends \ # - bzip2 is necessary to extract the micromamba executable. bzip2 \ ca-certificates \ - fonts-liberation \ locales \ - # - pandoc is used to convert notebooks to html files - # it's not present in arm64 ubuntu image, so we install it here - pandoc \ - # - run-one - a wrapper script that runs no more - # than one unique instance of some command with a unique set of arguments, - # we use `run-one-constantly` to support `RESTARTABLE` option - run-one \ sudo \ # - tini is installed as a helpful container entrypoint that reaps zombie # processes and such of the actual executable we want to start, see @@ -88,37 +80,37 @@ RUN chmod a+rx /usr/local/bin/fix-permissions # Enable prompt color in the skeleton .bashrc before creating the default NB_USER # hadolint ignore=SC2016 RUN sed -i 's/^#force_color_prompt=yes/force_color_prompt=yes/' /etc/skel/.bashrc && \ - # Add call to conda init script see https://stackoverflow.com/a/58081608/4413446 - echo 'eval "$(command conda shell.bash hook 2> /dev/null)"' >> /etc/skel/.bashrc + # More information in: https://github.com/jupyter/docker-stacks/pull/2047 + # and docs: https://docs.conda.io/projects/conda/en/latest/dev-guide/deep-dives/activation.html + echo 'eval "$(conda shell.bash hook)"' >> /etc/skel/.bashrc # Create NB_USER with name jovyan user with UID=1000 and in the 'users' group # and make sure these dirs are writable by the `users` group. RUN echo "auth requisite pam_deny.so" >> /etc/pam.d/su && \ sed -i.bak -e 's/^%admin/#%admin/' /etc/sudoers && \ sed -i.bak -e 's/^%sudo/#%sudo/' /etc/sudoers && \ - useradd -l -m -s /bin/bash -N -u "${NB_UID}" "${NB_USER}" && \ + useradd --no-log-init --create-home --shell /bin/bash --uid "${NB_UID}" --no-user-group "${NB_USER}" && \ mkdir -p "${CONDA_DIR}" && \ chown "${NB_USER}:${NB_GID}" "${CONDA_DIR}" && \ chmod g+w /etc/passwd && \ - fix-permissions "${HOME}" && \ - fix-permissions "${CONDA_DIR}" + fix-permissions "${CONDA_DIR}" && \ + fix-permissions "/home/${NB_USER}" USER ${NB_UID} -# Pin python version here, or set it to "default" -ARG PYTHON_VERSION=3.10 +# Pin the Python version here, or set it to "default" +ARG PYTHON_VERSION=3.11 # Setup work directory for backward-compatibility RUN mkdir "/home/${NB_USER}/work" && \ fix-permissions "/home/${NB_USER}" -# Download and install Micromamba, and initialize Conda prefix. +# Download and install Micromamba, and initialize the Conda prefix. # # Similar projects using Micromamba: # - Micromamba-Docker: # - repo2docker: -# Install Python, Mamba, Jupyter Notebook, Lab, and Hub -# Generate a notebook server config +# Install Python, Mamba, and jupyter_core # Cleanup temporary files and remove Micromamba # Correct permissions # Do all this in a single RUN command to avoid duplicating all of the @@ -131,7 +123,7 @@ RUN set -x && \ # Should be simpler, see arch="64"; \ fi && \ - wget -qO /tmp/micromamba.tar.bz2 \ + wget --progress=dot:giga -O /tmp/micromamba.tar.bz2 \ "https://micromamba.snakepit.net/api/micromamba/linux-${arch}/latest" && \ tar -xvjf /tmp/micromamba.tar.bz2 --strip-components=1 bin/micromamba && \ rm /tmp/micromamba.tar.bz2 && \ @@ -144,13 +136,80 @@ RUN set -x && \ --yes \ "${PYTHON_SPECIFIER}" \ 'mamba' \ - 'notebook' \ - 'jupyterhub' \ - 'jupyterlab' && \ + 'jupyter_core' && \ rm micromamba && \ # Pin major.minor version of python mamba list python | grep '^python ' | tr -s ' ' | cut -d ' ' -f 1,2 >> "${CONDA_DIR}/conda-meta/pinned" && \ - jupyter notebook --generate-config && \ + mamba clean --all -f -y && \ + fix-permissions "${CONDA_DIR}" && \ + fix-permissions "/home/${NB_USER}" + +# Configure container startup +ENTRYPOINT ["tini", "-g", "--"] +CMD ["start.sh"] + +# Copy local files as late as possible to avoid cache busting +COPY run-hooks.sh start.sh /usr/local/bin/ + +USER root + +# Create dirs for startup hooks +RUN mkdir /usr/local/bin/start-notebook.d && \ + mkdir /usr/local/bin/before-notebook.d + +COPY 10activate-conda-env.sh /usr/local/bin/before-notebook.d/ + +# Switch back to jovyan to avoid accidental container runs as root +USER ${NB_UID} + +WORKDIR "${HOME}" + +############################################################################ +#################### Dependency: jupyter/base-notebook ##################### +############################################################################ + +# Copyright (c) Jupyter Development Team. +# Distributed under the terms of the Modified BSD License. +ARG REGISTRY=quay.io +ARG OWNER=jupyter + +LABEL maintainer="Jupyter Project " + +# Fix: https://github.com/hadolint/hadolint/wiki/DL4006 +# Fix: https://github.com/koalaman/shellcheck/wiki/SC3014 +SHELL ["/bin/bash", "-o", "pipefail", "-c"] + +USER root + +# Install all OS dependencies for the Server that starts but lacks all +# features (e.g., download as all possible file formats) +RUN apt-get update --yes && \ + apt-get install --yes --no-install-recommends \ + fonts-liberation \ + # - pandoc is used to convert notebooks to html files + # it's not present in the aarch64 Ubuntu image, so we install it here + pandoc \ + # - run-one - a wrapper script that runs no more + # than one unique instance of some command with a unique set of arguments, + # we use `run-one-constantly` to support the `RESTARTABLE` option + run-one && \ + apt-get clean && rm -rf /var/lib/apt/lists/* + +USER ${NB_UID} + +# Install JupyterLab, Jupyter Notebook, JupyterHub and NBClassic +# Generate a Jupyter Server config +# Cleanup temporary files +# Correct permissions +# Do all this in a single RUN command to avoid duplicating all of the +# files across image layers when the permissions change +WORKDIR /tmp +RUN mamba install --yes \ + 'jupyterlab' \ + 'notebook' \ + 'jupyterhub' \ + 'nbclassic' && \ + jupyter server --generate-config && \ mamba clean --all -f -y && \ npm cache clean --force && \ jupyter lab clean && \ @@ -158,31 +217,25 @@ RUN set -x && \ fix-permissions "${CONDA_DIR}" && \ fix-permissions "/home/${NB_USER}" -EXPOSE 8888 +ENV JUPYTER_PORT=8888 +EXPOSE $JUPYTER_PORT # Configure container startup -ENTRYPOINT ["tini", "-g", "--"] -CMD ["start-notebook.sh"] +CMD ["start-notebook.py"] # Copy local files as late as possible to avoid cache busting -COPY start.sh start-notebook.sh start-singleuser.sh /usr/local/bin/ -# Currently need to have both jupyter_notebook_config and jupyter_server_config to support classic and lab -COPY jupyter_server_config.py /etc/jupyter/ +COPY start-notebook.py start-notebook.sh start-singleuser.py start-singleuser.sh /usr/local/bin/ +COPY jupyter_server_config.py docker_healthcheck.py /etc/jupyter/ # Fix permissions on /etc/jupyter as root USER root - -# Legacy for Jupyter Notebook Server, see: [#1205](https://github.com/jupyter/docker-stacks/issues/1205) -RUN sed -re "s/c.ServerApp/c.NotebookApp/g" \ - /etc/jupyter/jupyter_server_config.py > /etc/jupyter/jupyter_notebook_config.py && \ - fix-permissions /etc/jupyter/ +RUN fix-permissions /etc/jupyter/ # HEALTHCHECK documentation: https://docs.docker.com/engine/reference/builder/#healthcheck -# This healtcheck works well for `lab`, `notebook`, `nbclassic`, `server` and `retro` jupyter commands +# This healtcheck works well for `lab`, `notebook`, `nbclassic`, `server`, and `retro` jupyter commands # https://github.com/jupyter/docker-stacks/issues/915#issuecomment-1068528799 -HEALTHCHECK --interval=15s --timeout=3s --start-period=5s --retries=3 \ - CMD wget -O- --no-verbose --tries=1 --no-check-certificate \ - http${GEN_CERT:+s}://localhost:8888${JUPYTERHUB_SERVICE_PREFIX:-/}api || exit 1 +HEALTHCHECK --interval=5s --timeout=3s --start-period=5s --retries=3 \ + CMD /etc/jupyter/docker_healthcheck.py || exit 1 # Switch back to jovyan to avoid accidental container runs as root USER ${NB_UID} @@ -195,6 +248,7 @@ WORKDIR "${HOME}" # Copyright (c) Jupyter Development Team. # Distributed under the terms of the Modified BSD License. +ARG REGISTRY=quay.io ARG OWNER=jupyter LABEL maintainer="Jupyter Project " @@ -205,17 +259,16 @@ SHELL ["/bin/bash", "-o", "pipefail", "-c"] USER root -# Install all OS dependencies for fully functional notebook server +# Install all OS dependencies for a fully functional Server RUN apt-get update --yes && \ apt-get install --yes --no-install-recommends \ # Common useful utilities + curl \ git \ nano-tiny \ tzdata \ unzip \ vim-tiny \ - # Inkscape is installed to be able to convert SVG files - inkscape \ # git-over-ssh openssh-client \ # less is needed to run help in R @@ -225,7 +278,9 @@ RUN apt-get update --yes && \ # https://nbconvert.readthedocs.io/en/latest/install.html#installing-tex texlive-xetex \ texlive-fonts-recommended \ - texlive-plain-generic && \ + texlive-plain-generic \ + # Enable clipboard on Linux host systems + xclip && \ apt-get clean && rm -rf /var/lib/apt/lists/* # Create alternative for nano -> nano-tiny @@ -234,12 +289,19 @@ RUN update-alternatives --install /usr/bin/nano nano /bin/nano-tiny 10 # Switch back to jovyan to avoid accidental container runs as root USER ${NB_UID} +# Add an R mimetype option to specify how the plot returns from R to the browser +COPY --chown=${NB_UID}:${NB_GID} Rprofile.site /opt/conda/lib/R/etc/ + +# Add setup scripts that may be used by downstream images or inherited images +COPY setup-scripts/ /opt/setup-scripts/ + ############################################################################ ################# Dependency: jupyter/scipy-notebook ####################### ############################################################################ # Copyright (c) Jupyter Development Team. # Distributed under the terms of the Modified BSD License. +ARG REGISTRY=quay.io ARG OWNER=jupyter LABEL maintainer="Jupyter Project " @@ -264,7 +326,7 @@ RUN apt-get update --yes && \ USER ${NB_UID} # Install Python 3 packages -RUN mamba install --quiet --yes \ +RUN mamba install --yes \ 'altair' \ 'beautifulsoup4' \ 'bokeh' \ @@ -277,9 +339,11 @@ RUN mamba install --quiet --yes \ 'h5py' \ 'ipympl'\ 'ipywidgets' \ + 'jupyterlab-git' \ 'matplotlib-base' \ 'numba' \ 'numexpr' \ + 'openpyxl' \ 'pandas' \ 'patsy' \ 'protobuf' \ @@ -297,17 +361,15 @@ RUN mamba install --quiet --yes \ fix-permissions "${CONDA_DIR}" && \ fix-permissions "/home/${NB_USER}" -# Install facets which does not have a pip or conda package at the moment +# Install facets package which does not have a `pip` or `conda-forge` package at the moment WORKDIR /tmp -RUN git clone https://github.com/PAIR-code/facets.git && \ - jupyter nbextension install facets/facets-dist/ --sys-prefix && \ +RUN git clone https://github.com/PAIR-code/facets && \ + jupyter nbclassic-extension install facets/facets-dist/ --sys-prefix && \ rm -rf /tmp/facets && \ fix-permissions "${CONDA_DIR}" && \ fix-permissions "/home/${NB_USER}" -# Import matplotlib the first time to build the font cache. -ENV XDG_CACHE_HOME="/home/${NB_USER}/.cache/" - +# Import matplotlib the first time to build the font cache RUN MPLBACKEND=Agg python -c "import matplotlib.pyplot" && \ fix-permissions "/home/${NB_USER}" @@ -324,32 +386,33 @@ LABEL maintainer="Christoph Schranz , Mat # Install Tensorflow, check compatibility here: # https://www.tensorflow.org/install/source#gpu # installation via conda leads to errors in version 4.8.2 +# Install CUDA-specific nvidia libraries and update libcudnn8 before that +# using device_lib.list_local_devices() the cudNN version is shown, adapt version to tested compat USER ${NB_UID} RUN pip install --upgrade pip && \ - pip install --no-cache-dir tensorflow==2.10.1 keras==2.10 && \ + pip install --no-cache-dir tensorflow==2.15.0 keras==2.15.0 && \ fix-permissions "${CONDA_DIR}" && \ fix-permissions "/home/${NB_USER}" # Install PyTorch with dependencies -RUN conda install --quiet --yes \ - pyyaml mkl mkl-include setuptools cmake cffi typing && \ - conda clean --all -f -y && \ +RUN mamba install --quiet --yes \ + pyyaml setuptools cmake cffi typing && \ + mamba clean --all -f -y && \ fix-permissions "${CONDA_DIR}" && \ fix-permissions "/home/${NB_USER}" # Check compatibility here: # https://pytorch.org/get-started/locally/ # Installation via conda leads to errors installing cudatoolkit=11.1 -# RUN pip install --no-cache-dir torch==1.13.1 torchvision==0.14.1 torchaudio==0.13.1 && \ -# torchviz==0.0.2 --extra-index-url https://download.pytorch.org/whl/cu116 +# RUN pip install --no-cache-dir torch==2.1.0 torchvision==0.16.0 torchaudio==2.1.0 && \ +# torchviz==0.0.2 --extra-index-url https://download.pytorch.org/whl/cu118 RUN set -ex \ && buildDeps=' \ - torch==1.13.1 \ - torchvision==0.14.1 \ - torchaudio==0.13.1 \ - torchviz==0.0.2 \ + torch==2.1.2 \ + torchvision==0.16.2 \ + torchaudio==2.1.2 \ ' \ - && pip install --no-cache-dir $buildDeps --extra-index-url https://download.pytorch.org/whl/cu116 \ + && pip install --no-cache-dir $buildDeps \ && fix-permissions "${CONDA_DIR}" \ && fix-permissions "/home/${NB_USER}" @@ -361,15 +424,30 @@ RUN apt-get update && \ apt-get install -y --no-install-recommends cmake libncurses5-dev libncursesw5-dev git && \ apt-get clean && rm -rf /var/lib/apt/lists/* +USER $NB_UID +# These need to be two separate pip install commands, otherwise it will throw an error +# attempting to resolve the nvidia-cuda-nvcc package at the same time as nvidia-pyindex +RUN pip install --no-cache-dir nvidia-pyindex && \ + pip install --no-cache-dir nvidia-cuda-nvcc && \ + fix-permissions "${CONDA_DIR}" && \ + fix-permissions "/home/${NB_USER}" + # reinstall nvcc with cuda-nvcc to install ptax USER $NB_UID -RUN conda install -c nvidia cuda-nvcc -y && \ - conda clean --all -f -y && \ +# These need to be two separate pip install commands, otherwise it will throw an error +# attempting to resolve the nvidia-cuda-nvcc package at the same time as nvidia-pyindex +RUN pip install --no-cache-dir nvidia-pyindex && \ + pip install --no-cache-dir nvidia-cuda-nvcc && \ + fix-permissions "${CONDA_DIR}" && \ + fix-permissions "/home/${NB_USER}" + +RUN mamba install -c nvidia cuda-nvcc=12.0.140 -y && \ + mamba clean --all -f -y && \ fix-permissions $CONDA_DIR && \ fix-permissions /home/$NB_USER USER root -RUN ln -s /opt/conda/bin/ptxas /usr/bin/ptxas +RUN ln -s $CONDA_DIR/bin/ptxas /usr/bin/ptxas USER $NB_UID @@ -425,3 +503,9 @@ RUN pip install --no-cache-dir \ # Switch back to jovyan to avoid accidental container runs as root USER $NB_UID + +# Set env-var JUPYTER_TOKEN as static token +ARG JUPYTER_TOKEN +ENV JUPYTER_TOKEN=$JUPYTER_TOKEN +COPY jupyter_server_config_token_addendum.py /etc/jupyter/ +RUN cat /etc/jupyter/jupyter_server_config_token_addendum.py >> /etc/jupyter/jupyter_server_config.py diff --git a/.build/Rprofile.site b/.build/Rprofile.site new file mode 100755 index 0000000..3d6a93c --- /dev/null +++ b/.build/Rprofile.site @@ -0,0 +1,4 @@ +# Add R mimetype to specify how the plot returns from R to the browser. +# https://notebook.community/andrie/jupyter-notebook-samples/Changing%20R%20plot%20options%20in%20Jupyter + +options(jupyter.plot_mimetypes = c('text/plain', 'image/png', 'image/jpeg', 'image/svg+xml', 'application/pdf')) diff --git a/.build/docker-stacks b/.build/docker-stacks index efa95c2..1494233 160000 --- a/.build/docker-stacks +++ b/.build/docker-stacks @@ -1 +1 @@ -Subproject commit efa95c2c5b9b095247cd2f5e55bc3b38c85da335 +Subproject commit 1494233e27cdc70e3766ea2518e7153ee425fc4f diff --git a/.build/docker_healthcheck.py b/.build/docker_healthcheck.py new file mode 100755 index 0000000..8f3338e --- /dev/null +++ b/.build/docker_healthcheck.py @@ -0,0 +1,26 @@ +#!/usr/bin/env python3 +# Copyright (c) Jupyter Development Team. +# Distributed under the terms of the Modified BSD License. +import json +import os +from pathlib import Path + +import requests + +# Several operations below deliberately don't check for possible errors +# As this is a healthcheck, it should succeed or raise an exception on error + +runtime_dir = Path("/home/") / os.environ["NB_USER"] / ".local/share/jupyter/runtime/" +json_file = next(runtime_dir.glob("*server-*.json")) + +url = json.loads(json_file.read_bytes())["url"] +url = url + "api" + +proxies = { + "http": "", + "https": "", +} + +r = requests.get(url, proxies=proxies, verify=False) # request without SSL verification +r.raise_for_status() +print(r.content) diff --git a/.build/fix-permissions b/.build/fix-permissions index 5e6425d..47b6d0e 100755 --- a/.build/fix-permissions +++ b/.build/fix-permissions @@ -1,16 +1,14 @@ #!/bin/bash -# set permissions on a directory -# after any installation, if a directory needs to be (human) user-writable, -# run this script on it. -# It will make everything in the directory owned by the group ${NB_GID} -# and writable by that group. +# Set permissions on a directory +# After any installation, if a directory needs to be (human) user-writable, run this script on it. +# It will make everything in the directory owned by the group ${NB_GID} and writable by that group. # Deployments that want to set a specific user id can preserve permissions # by adding the `--group-add users` line to `docker run`. -# uses find to avoid touching files that already have the right permissions, -# which would cause massive image explosion +# Uses find to avoid touching files that already have the right permissions, +# which would cause a massive image explosion -# right permissions are: +# Right permissions are: # group=${NB_GID} # AND permissions include group rwX (directory-execute) # AND directories have setuid,setgid bits set @@ -23,13 +21,13 @@ for d in "$@"; do -group "${NB_GID}" \ -a -perm -g+rwX \ \) \ - -exec chgrp "${NB_GID}" {} \; \ - -exec chmod g+rwX {} \; + -exec chgrp "${NB_GID}" -- {} \+ \ + -exec chmod g+rwX -- {} \+ # setuid, setgid *on directories only* find "${d}" \ \( \ -type d \ -a ! -perm -6000 \ \) \ - -exec chmod +6000 {} \; + -exec chmod +6000 -- {} \+ done diff --git a/.build/jupyter_server_config.py b/.build/jupyter_server_config.py index ef0380b..c0cca3a 100755 --- a/.build/jupyter_server_config.py +++ b/.build/jupyter_server_config.py @@ -4,14 +4,17 @@ import os import stat import subprocess +from pathlib import Path from jupyter_core.paths import jupyter_data_dir c = get_config() # noqa: F821 c.ServerApp.ip = "0.0.0.0" -c.ServerApp.port = 8888 c.ServerApp.open_browser = False +# to output both image/svg+xml and application/pdf plot formats in the notebook file +c.InlineBackend.figure_formats = {"png", "jpeg", "svg", "pdf"} + # https://github.com/jupyter/notebook/issues/3130 c.FileContentsManager.delete_to_trash = False @@ -22,17 +25,16 @@ [req_distinguished_name] """ if "GEN_CERT" in os.environ: - dir_name = jupyter_data_dir() - pem_file = os.path.join(dir_name, "notebook.pem") - os.makedirs(dir_name, exist_ok=True) + dir_name = Path(jupyter_data_dir()) + dir_name.mkdir(parents=True, exist_ok=True) + pem_file = dir_name / "notebook.pem" # Generate an openssl.cnf file to set the distinguished name - cnf_file = os.path.join(os.getenv("CONDA_DIR", "/usr/lib"), "ssl", "openssl.cnf") - if not os.path.isfile(cnf_file): - with open(cnf_file, "w") as fh: - fh.write(OPENSSL_CONFIG) + cnf_file = Path(os.getenv("CONDA_DIR", "/usr/lib")) / "ssl/openssl.cnf" + if not cnf_file.exists(): + cnf_file.write_text(OPENSSL_CONFIG) - # Generate a certificate if one doesn't exist on disk + # Generate a certificate if one doesn't exist on a disk subprocess.check_call( [ "openssl", @@ -48,10 +50,9 @@ ] ) # Restrict access to the file - os.chmod(pem_file, stat.S_IRUSR | stat.S_IWUSR) - c.ServerApp.certfile = pem_file + pem_file.chmod(stat.S_IRUSR | stat.S_IWUSR) + c.ServerApp.certfile = str(pem_file) -# Change default umask for all subprocesses of the notebook server if set in -# the environment +# Change default umask for all subprocesses of the Server if set in the environment if "NB_UMASK" in os.environ: os.umask(int(os.environ["NB_UMASK"], 8)) diff --git a/.build/jupyter_server_config_token_addendum.py b/.build/jupyter_server_config_token_addendum.py new file mode 100644 index 0000000..fd91b6b --- /dev/null +++ b/.build/jupyter_server_config_token_addendum.py @@ -0,0 +1,5 @@ + +# Set static token +import os +if os.getenv("JUPYTER_TOKEN"): + c.ServerApp.token = os.getenv("JUPYTER_TOKEN") diff --git a/.build/run-hooks.sh b/.build/run-hooks.sh new file mode 100755 index 0000000..15df23c --- /dev/null +++ b/.build/run-hooks.sh @@ -0,0 +1,46 @@ +#!/bin/bash +# Copyright (c) Jupyter Development Team. +# Distributed under the terms of the Modified BSD License. + +# The run-hooks.sh script looks for *.sh scripts to source +# and executable files to run within a passed directory + +if [ "$#" -ne 1 ]; then + echo "Should pass exactly one directory" + return 1 +fi + +if [[ ! -d "${1}" ]]; then + echo "Directory ${1} doesn't exist or is not a directory" + return 1 +fi + +echo "Running hooks in: ${1} as uid: $(id -u) gid: $(id -g)" +for f in "${1}/"*; do + # Handling a case when the directory is empty + [ -e "${f}" ] || continue + case "${f}" in + *.sh) + echo "Sourcing shell script: ${f}" + # shellcheck disable=SC1090 + source "${f}" + # shellcheck disable=SC2181 + if [ $? -ne 0 ]; then + echo "${f} has failed, continuing execution" + fi + ;; + *) + if [ -x "${f}" ]; then + echo "Running executable: ${f}" + "${f}" + # shellcheck disable=SC2181 + if [ $? -ne 0 ]; then + echo "${f} has failed, continuing execution" + fi + else + echo "Ignoring non-executable: ${f}" + fi + ;; + esac +done +echo "Done running hooks in: ${1}" diff --git a/.build/setup-scripts/activate_notebook_custom_env.py b/.build/setup-scripts/activate_notebook_custom_env.py new file mode 100755 index 0000000..4d5da9b --- /dev/null +++ b/.build/setup-scripts/activate_notebook_custom_env.py @@ -0,0 +1,24 @@ +#!/usr/bin/env python3 +# Copyright (c) Jupyter Development Team. +# Distributed under the terms of the Modified BSD License. +import json +import os +import sys +from pathlib import Path + +env_name = sys.argv[1] +CONDA_DIR = os.environ["CONDA_DIR"] + +file = Path.home() / f".local/share/jupyter/kernels/{env_name}/kernel.json" +content = json.loads(file.read_text()) +content["env"] = { + "XML_CATALOG_FILES": "", + "PATH": f"{CONDA_DIR}/envs/{env_name}/bin:$PATH", + "CONDA_PREFIX": f"{CONDA_DIR}/envs/{env_name}", + "CONDA_PROMPT_MODIFIER": f"({env_name}) ", + "CONDA_SHLVL": "2", + "CONDA_DEFAULT_ENV": env_name, + "CONDA_PREFIX_1": CONDA_DIR, +} + +file.write_text(json.dumps(content, indent=1)) diff --git a/.build/setup-scripts/setup-julia-packages.bash b/.build/setup-scripts/setup-julia-packages.bash new file mode 100755 index 0000000..fa1421e --- /dev/null +++ b/.build/setup-scripts/setup-julia-packages.bash @@ -0,0 +1,55 @@ +#!/bin/bash +set -exuo pipefail +# Requirements: +# - Run as a non-root user +# - The JULIA_PKGDIR environment variable is set +# - Julia is already set up, with the setup-julia.bash command + + +# If we don't specify what CPUs the precompilation should be done for, it's +# *only* done for the target of the host doing the compilation. When the +# container runs on a host that's the same architecture, but a *different* +# generation of CPU than what the build host was, the precompilation is useless +# and Julia takes a long long time to start up. This specific multitarget comes +# from https://github.com/JuliaCI/julia-buildkite/blob/70bde73f6cb17d4381b62236fc2d96b1c7acbba7/utilities/build_envs.sh#L20-L76, +# and may need to be updated as new CPU generations come out. +# If the architecture the container runs on is different, +# precompilation may still have to be re-done on first startup - but this +# *should* catch most of the issues. See +# https://github.com/jupyter/docker-stacks/issues/2015 for more information +if [ "$(uname -m)" == "x86_64" ]; then + # See https://github.com/JuliaCI/julia-buildkite/blob/70bde73f6cb17d4381b62236fc2d96b1c7acbba7/utilities/build_envs.sh#L24 + # for an explanation of these options + export JULIA_CPU_TARGET="generic;sandybridge,-xsaveopt,clone_all;haswell,-rdrnd,base(1)" +elif [ "$(uname -m)" == "aarch64" ]; then + # See https://github.com/JuliaCI/julia-buildkite/blob/70bde73f6cb17d4381b62236fc2d96b1c7acbba7/utilities/build_envs.sh#L54 + # for an explanation of these options + export JULIA_CPU_TARGET="generic;cortex-a57;thunderx2t99;carmel" +fi + +# Install base Julia packages +julia -e ' +import Pkg; +Pkg.update(); +Pkg.add([ + "HDF5", + "IJulia", + "Pluto" +]); +Pkg.precompile(); +' + +# Move the kernelspec out of ${HOME} to the system share location. +# Avoids problems with runtime UID change not taking effect properly +# on the .local folder in the jovyan home dir. +mv "${HOME}/.local/share/jupyter/kernels/julia"* "${CONDA_DIR}/share/jupyter/kernels/" +chmod -R go+rx "${CONDA_DIR}/share/jupyter" +rm -rf "${HOME}/.local" +fix-permissions "${JULIA_PKGDIR}" "${CONDA_DIR}/share/jupyter" + +# Install jupyter-pluto-proxy to get Pluto to work on JupyterHub +mamba install --yes \ + 'jupyter-pluto-proxy' && \ + mamba clean --all -f -y && \ + fix-permissions "${CONDA_DIR}" && \ + fix-permissions "/home/${NB_USER}" diff --git a/.build/setup-scripts/setup-julia.bash b/.build/setup-scripts/setup-julia.bash new file mode 100755 index 0000000..3aab076 --- /dev/null +++ b/.build/setup-scripts/setup-julia.bash @@ -0,0 +1,39 @@ +#!/bin/bash +set -exuo pipefail +# Requirements: +# - Run as the root user +# - The JULIA_PKGDIR environment variable is set + +# Default julia version to install if env var is not set +# Check https://julialang.org/downloads/ +JULIA_VERSION="${JULIA_VERSION:-1.9.1}" + +# Figure out what architecture we are installing in +JULIA_ARCH=$(uname -m) +JULIA_SHORT_ARCH="${JULIA_ARCH}" +if [ "${JULIA_SHORT_ARCH}" == "x86_64" ]; then + JULIA_SHORT_ARCH="x64" +fi + +# Figure out Julia Installer URL +JULIA_INSTALLER="julia-${JULIA_VERSION}-linux-${JULIA_ARCH}.tar.gz" +JULIA_MAJOR_MINOR=$(echo "${JULIA_VERSION}" | cut -d. -f 1,2) + +# Download and install Julia +cd /tmp +mkdir "/opt/julia-${JULIA_VERSION}" +wget --progress=dot:giga "https://julialang-s3.julialang.org/bin/linux/${JULIA_SHORT_ARCH}/${JULIA_MAJOR_MINOR}/${JULIA_INSTALLER}" +tar xzf "${JULIA_INSTALLER}" -C "/opt/julia-${JULIA_VERSION}" --strip-components=1 +rm "${JULIA_INSTALLER}" + +# Link Julia installed version to /usr/local/bin, so julia launches it +ln -fs /opt/julia-*/bin/julia /usr/local/bin/julia + +# Tell Julia where conda libraries are +mkdir -p /etc/julia +echo "push!(Libdl.DL_LOAD_PATH, \"${CONDA_DIR}/lib\")" >> /etc/julia/juliarc.jl + +# Create JULIA_PKGDIR, where user libraries are installed +mkdir "${JULIA_PKGDIR}" +chown "${NB_USER}" "${JULIA_PKGDIR}" +fix-permissions "${JULIA_PKGDIR}" diff --git a/.build/setup-scripts/setup_julia.py b/.build/setup-scripts/setup_julia.py new file mode 100755 index 0000000..0cdbe0c --- /dev/null +++ b/.build/setup-scripts/setup_julia.py @@ -0,0 +1,85 @@ +#!/usr/bin/env python3 +# Copyright (c) Jupyter Development Team. +# Distributed under the terms of the Modified BSD License. + +# Requirements: +# - Run as the root user +# - The JULIA_PKGDIR environment variable is set + +import os +import platform +import shutil +import subprocess +from pathlib import Path + +import requests + + +def unify_aarch64(platform: str) -> str: + """ + Renames arm64->aarch64 to support local builds on on aarch64 Macs + """ + return { + "aarch64": "aarch64", + "arm64": "aarch64", + "x86_64": "x86_64", + }[platform] + + +def get_latest_julia_url() -> tuple[str, str]: + """ + Get the last stable version of Julia + Based on: https://github.com/JuliaLang/www.julialang.org/issues/878#issuecomment-749234813 + """ + + versions = requests.get( + "https://julialang-s3.julialang.org/bin/versions.json" + ).json() + stable_versions = {k: v for k, v in versions.items() if v["stable"]} + latest_version_files = stable_versions[max(stable_versions)]["files"] + triplet = unify_aarch64(platform.machine()) + "-linux-gnu" + file_info = [vf for vf in latest_version_files if vf["triplet"] == triplet][0] + return file_info["url"], file_info["version"] + + +def download_julia(julia_url: str) -> None: + """ + Downloads and unpacks julia + The resulting julia directory is "/opt/julia-VERSION/" + """ + tmp_file = Path("/tmp/julia.tar.gz") + subprocess.check_call( + ["curl", "--progress-bar", "--location", "--output", tmp_file, julia_url] + ) + shutil.unpack_archive(tmp_file, "/opt/") + tmp_file.unlink() + + +def prepare_julia(julia_version: str) -> None: + """ + Creates /usr/local/bin/julia symlink + Make Julia aware of conda libraries + Creates a directory for Julia user libraries + """ + # Link Julia installed version to /usr/local/bin, so julia launches it + subprocess.check_call( + ["ln", "-fs", f"/opt/julia-{julia_version}/bin/julia", "/usr/local/bin/julia"] + ) + + # Tell Julia where conda libraries are + Path("/etc/julia").mkdir() + Path("/etc/julia/juliarc.jl").write_text( + f'push!(Libdl.DL_LOAD_PATH, "{os.environ["CONDA_DIR"]}/lib")\n' + ) + + # Create JULIA_PKGDIR, where user libraries are installed + JULIA_PKGDIR = Path(os.environ["JULIA_PKGDIR"]) + JULIA_PKGDIR.mkdir() + subprocess.check_call(["chown", os.environ["NB_USER"], JULIA_PKGDIR]) + subprocess.check_call(["fix-permissions", JULIA_PKGDIR]) + + +if __name__ == "__main__": + julia_url, julia_version = get_latest_julia_url() + download_julia(julia_url=julia_url) + prepare_julia(julia_version=julia_version) diff --git a/.build/start-notebook.py b/.build/start-notebook.py new file mode 100755 index 0000000..b99ff31 --- /dev/null +++ b/.build/start-notebook.py @@ -0,0 +1,41 @@ +#!/usr/bin/env python +# Copyright (c) Jupyter Development Team. +# Distributed under the terms of the Modified BSD License. +import os +import shlex +import sys + +# If we are in a JupyterHub, we pass on to `start-singleuser.py` instead so it does the right thing +if "JUPYTERHUB_API_TOKEN" in os.environ: + print( + "WARNING: using start-singleuser.py instead of start-notebook.py to start a server associated with JupyterHub." + ) + command = ["/usr/local/bin/start-singleuser.py"] + sys.argv[1:] + os.execvp(command[0], command) + + +# Wrap everything in start.sh, no matter what +command = ["/usr/local/bin/start.sh"] + +# If we want to survive restarts, tell that to start.sh +if os.environ.get("RESTARTABLE") == "yes": + command.append("run-one-constantly") + +# We always launch a jupyter subcommand from this script +command.append("jupyter") + +# Launch the configured subcommand. Note that this should be a single string, so we don't split it +# We default to lab +jupyter_command = os.environ.get("DOCKER_STACKS_JUPYTER_CMD", "lab") +command.append(jupyter_command) + +# Append any optional NOTEBOOK_ARGS we were passed in. This is supposed to be multiple args passed +# on to the notebook command, so we split it correctly with shlex +if "NOTEBOOK_ARGS" in os.environ: + command += shlex.split(os.environ["NOTEBOOK_ARGS"]) + +# Pass through any other args we were passed on the command line +command += sys.argv[1:] + +# Execute the command! +os.execvp(command[0], command) diff --git a/.build/start-notebook.sh b/.build/start-notebook.sh index 4f673d2..c47ebba 100755 --- a/.build/start-notebook.sh +++ b/.build/start-notebook.sh @@ -1,22 +1,5 @@ #!/bin/bash -# Copyright (c) Jupyter Development Team. -# Distributed under the terms of the Modified BSD License. +# Shim to emit warning and call start-notebook.py +echo "WARNING: Use start-notebook.py instead" -set -e - -# The Jupyter command to launch -# JupyterLab by default -DOCKER_STACKS_JUPYTER_CMD="${DOCKER_STACKS_JUPYTER_CMD:=lab}" - -if [[ -n "${JUPYTERHUB_API_TOKEN}" ]]; then - echo "WARNING: using start-singleuser.sh instead of start-notebook.sh to start a server associated with JupyterHub." - exec /usr/local/bin/start-singleuser.sh "$@" -fi - -wrapper="" -if [[ "${RESTARTABLE}" == "yes" ]]; then - wrapper="run-one-constantly" -fi - -# shellcheck disable=SC1091,SC2086 -exec /usr/local/bin/start.sh ${wrapper} jupyter ${DOCKER_STACKS_JUPYTER_CMD} ${NOTEBOOK_ARGS} "$@" +exec /usr/local/bin/start-notebook.py "$@" diff --git a/.build/start-singleuser.py b/.build/start-singleuser.py new file mode 100755 index 0000000..2dcf6c0 --- /dev/null +++ b/.build/start-singleuser.py @@ -0,0 +1,23 @@ +#!/usr/bin/env python +# Copyright (c) Jupyter Development Team. +# Distributed under the terms of the Modified BSD License. +import os +import shlex +import sys + +command = ["/usr/local/bin/start.sh", "jupyterhub-singleuser"] + +# set default ip to 0.0.0.0 +if "--ip=" not in os.environ.get("NOTEBOOK_ARGS", ""): + command.append("--ip=0.0.0.0") + +# Append any optional NOTEBOOK_ARGS we were passed in. This is supposed to be multiple args passed +# on to the notebook command, so we split it correctly with shlex +if "NOTEBOOK_ARGS" in os.environ: + command += shlex.split(os.environ["NOTEBOOK_ARGS"]) + +# Pass any other args we have been passed through +command += sys.argv[1:] + +# Execute the command! +os.execvp(command[0], command) diff --git a/.build/start-singleuser.sh b/.build/start-singleuser.sh index a2166e2..ecf0e06 100755 --- a/.build/start-singleuser.sh +++ b/.build/start-singleuser.sh @@ -1,13 +1,5 @@ #!/bin/bash -# Copyright (c) Jupyter Development Team. -# Distributed under the terms of the Modified BSD License. +# Shim to emit warning and call start-singleuser.py +echo "WARNING: Use start-singleuser.py instead" -set -e - -# set default ip to 0.0.0.0 -if [[ "${NOTEBOOK_ARGS} $*" != *"--ip="* ]]; then - NOTEBOOK_ARGS="--ip=0.0.0.0 ${NOTEBOOK_ARGS}" -fi - -# shellcheck disable=SC1091,SC2086 -. /usr/local/bin/start.sh jupyterhub-singleuser ${NOTEBOOK_ARGS} "$@" +exec /usr/local/bin/start-singleuser.py "$@" diff --git a/.build/start.sh b/.build/start.sh index 7c5859e..76419b6 100755 --- a/.build/start.sh +++ b/.build/start.sh @@ -4,9 +4,9 @@ set -e -# The _log function is used for everything this script wants to log. It will -# always log errors and warnings, but can be silenced for other messages -# by setting JUPYTER_DOCKER_STACKS_QUIET environment variable. +# The _log function is used for everything this script wants to log. +# It will always log errors and warnings but can be silenced for other messages +# by setting the JUPYTER_DOCKER_STACKS_QUIET environment variable. _log () { if [[ "$*" == "ERROR:"* ]] || [[ "$*" == "WARNING:"* ]] || [[ "${JUPYTER_DOCKER_STACKS_QUIET}" == "" ]]; then echo "$@" @@ -14,39 +14,12 @@ _log () { } _log "Entered start.sh with args:" "$@" -# The run-hooks function looks for .sh scripts to source and executable files to -# run within a passed directory. -run-hooks () { - if [[ ! -d "${1}" ]] ; then - return - fi - _log "${0}: running hooks in ${1} as uid / gid: $(id -u) / $(id -g)" - for f in "${1}/"*; do - case "${f}" in - *.sh) - _log "${0}: running script ${f}" - # shellcheck disable=SC1090 - source "${f}" - ;; - *) - if [[ -x "${f}" ]] ; then - _log "${0}: running executable ${f}" - "${f}" - else - _log "${0}: ignoring non-executable ${f}" - fi - ;; - esac - done - _log "${0}: done running hooks in ${1}" -} - # A helper function to unset env vars listed in the value of the env var # JUPYTER_ENV_VARS_TO_UNSET. unset_explicit_env_vars () { if [ -n "${JUPYTER_ENV_VARS_TO_UNSET}" ]; then for env_var_to_unset in $(echo "${JUPYTER_ENV_VARS_TO_UNSET}" | tr ',' ' '); do - echo "Unset ${env_var_to_unset} due to JUPYTER_ENV_VARS_TO_UNSET" + _log "Unset ${env_var_to_unset} due to JUPYTER_ENV_VARS_TO_UNSET" unset "${env_var_to_unset}" done unset JUPYTER_ENV_VARS_TO_UNSET @@ -62,14 +35,15 @@ else fi # NOTE: This hook will run as the user the container was started with! -run-hooks /usr/local/bin/start-notebook.d +# shellcheck disable=SC1091 +source /usr/local/bin/run-hooks.sh /usr/local/bin/start-notebook.d # If the container started as the root user, then we have permission to refit # the jovyan user, and ensure file permissions, grant sudo rights, and such # things before we run the command passed to start.sh as the desired user # (NB_USER). # -if [ "$(id -u)" == 0 ] ; then +if [ "$(id -u)" == 0 ]; then # Environment variables: # - NB_USER: the desired username and associated home folder # - NB_UID: the desired user id @@ -77,18 +51,18 @@ if [ "$(id -u)" == 0 ] ; then # - NB_GROUP: a group name we want for the group # - GRANT_SUDO: a boolean ("1" or "yes") to grant the user sudo rights # - CHOWN_HOME: a boolean ("1" or "yes") to chown the user's home folder - # - CHOWN_EXTRA: a comma separated list of paths to chown + # - CHOWN_EXTRA: a comma-separated list of paths to chown # - CHOWN_HOME_OPTS / CHOWN_EXTRA_OPTS: arguments to the chown commands - # Refit the jovyan user to the desired the user (NB_USER) - if id jovyan &> /dev/null ; then + # Refit the jovyan user to the desired user (NB_USER) + if id jovyan &> /dev/null; then if ! usermod --home "/home/${NB_USER}" --login "${NB_USER}" jovyan 2>&1 | grep "no changes" > /dev/null; then _log "Updated the jovyan user:" _log "- username: jovyan -> ${NB_USER}" _log "- home dir: /home/jovyan -> /home/${NB_USER}" fi elif ! id -u "${NB_USER}" &> /dev/null; then - _log "ERROR: Neither the jovyan user or '${NB_USER}' exists. This could be the result of stopping and starting, the container with a different NB_USER environment variable." + _log "ERROR: Neither the jovyan user nor '${NB_USER}' exists. This could be the result of stopping and starting, the container with a different NB_USER environment variable." exit 1 fi # Ensure the desired user (NB_USER) gets its desired user id (NB_UID) and is @@ -101,10 +75,10 @@ if [ "$(id -u)" == 0 ] ; then fi # Recreate the desired user as we want it userdel "${NB_USER}" - useradd --home "/home/${NB_USER}" --uid "${NB_UID}" --gid "${NB_GID}" --groups 100 --no-log-init "${NB_USER}" + useradd --no-log-init --home "/home/${NB_USER}" --shell /bin/bash --uid "${NB_UID}" --gid "${NB_GID}" --groups 100 "${NB_USER}" fi - # Move or symlink the jovyan home directory to the desired users home + # Move or symlink the jovyan home directory to the desired user's home # directory if it doesn't already exist, and update the current working # directory to the new location if needed. if [[ "${NB_USER}" != "jovyan" ]]; then @@ -132,7 +106,7 @@ if [ "$(id -u)" == 0 ] ; then fi fi - # Optionally ensure the desired user get filesystem ownership of it's home + # Optionally ensure the desired user gets filesystem ownership of its home # folder and/or additional folders if [[ "${CHOWN_HOME}" == "1" || "${CHOWN_HOME}" == "yes" ]]; then _log "Ensuring /home/${NB_USER} is owned by ${NB_UID}:${NB_GID} ${CHOWN_HOME_OPTS:+(chown options: ${CHOWN_HOME_OPTS})}" @@ -147,9 +121,6 @@ if [ "$(id -u)" == 0 ] ; then done fi - # Update potentially outdated environment variables since image build - export XDG_CACHE_HOME="/home/${NB_USER}/.cache" - # Prepend ${CONDA_DIR}/bin to sudo secure_path sed -r "s#Defaults\s+secure_path\s*=\s*\"?([^\"]+)\"?#Defaults secure_path=\"${CONDA_DIR}/bin:\1\"#" /etc/sudoers | grep secure_path > /etc/sudoers.d/path @@ -160,11 +131,13 @@ if [ "$(id -u)" == 0 ] ; then fi # NOTE: This hook is run as the root user! - run-hooks /usr/local/bin/before-notebook.d - + # shellcheck disable=SC1091 + source /usr/local/bin/run-hooks.sh /usr/local/bin/before-notebook.d unset_explicit_env_vars + _log "Running as ${NB_USER}:" "${cmd[@]}" exec sudo --preserve-env --set-home --user "${NB_USER}" \ + LD_LIBRARY_PATH="${LD_LIBRARY_PATH}" \ PATH="${PATH}" \ PYTHONPATH="${PYTHONPATH:-}" \ "${cmd[@]}" @@ -178,7 +151,7 @@ if [ "$(id -u)" == 0 ] ; then # command. The behavior can be inspected with `sudo -V` run as root. # # ref: `man sudo` https://linux.die.net/man/8/sudo - # ref: `man sudoers` https://www.sudo.ws/man/1.8.15/sudoers.man.html + # ref: `man sudoers` https://www.sudo.ws/docs/man/sudoers.man/ # # - We use the `--preserve-env` flag to pass through most environment # variables, but understand that exceptions are caused by the sudoers @@ -187,10 +160,10 @@ if [ "$(id -u)" == 0 ] ; then # - We use the `--set-home` flag to set the HOME variable appropriately. # # - To reduce the default list of variables deleted by sudo, we could have - # used `env_delete` from /etc/sudoers. It has higher priority than the + # used `env_delete` from /etc/sudoers. It has a higher priority than the # `--preserve-env` flag and the `env_keep` configuration. # - # - We preserve PATH and PYTHONPATH explicitly. Note however that sudo + # - We preserve LD_LIBRARY_PATH, PATH and PYTHONPATH explicitly. Note however that sudo # resolves `${cmd[@]}` using the "secure_path" variable we modified # above in /etc/sudoers.d/path. Thus PATH is irrelevant to how the above # sudo command resolves the path of `${cmd[@]}`. The PATH will be relevant @@ -210,7 +183,7 @@ else # Attempt to ensure the user uid we currently run as has a named entry in # the /etc/passwd file, as it avoids software crashing on hard assumptions # on such entry. Writing to the /etc/passwd was allowed for the root group - # from the Dockerfile during build. + # from the Dockerfile during the build. # # ref: https://github.com/jupyter/docker-stacks/issues/552 if ! whoami &> /dev/null; then @@ -255,8 +228,10 @@ else fi # NOTE: This hook is run as the user we started the container as! - run-hooks /usr/local/bin/before-notebook.d + # shellcheck disable=SC1091 + source /usr/local/bin/run-hooks.sh /usr/local/bin/before-notebook.d unset_explicit_env_vars + _log "Executing the command:" "${cmd[@]}" exec "${cmd[@]}" fi diff --git a/.github/ISSUE_TEMPLATE/feature_request.md b/.github/ISSUE_TEMPLATE/feature_request.md new file mode 100644 index 0000000..d0798bd --- /dev/null +++ b/.github/ISSUE_TEMPLATE/feature_request.md @@ -0,0 +1,38 @@ +--- +name: Feature request +about: Suggest an idea for this project +title: '' +labels: '' +assignees: '' + +--- + +# GPU-Jupyter Feature Request + +Thank you for your interest in enhancing GPU-Jupyter. We appreciate your ideas and feedback. Please fill out this brief form to help us understand your feature request. + +## Feature Description + +**Title** +A concise title that summarizes the feature request. + +**Detailed Description** +Provide a detailed description of the feature you're proposing. Explain how it would function and its intended use case. + +**Benefits** +Describe the benefits this feature would bring to GPU-Jupyter users. + +**Possible Implementation** +(Optional) If you have ideas about how this feature could be implemented, please share them here. + +## Additional Information + +**Screenshots/Illustrations** +(Optional) If you have any visual representations of your feature, please include them. + +**References** +(Optional) Include any references to similar features in other projects or documentation that might be helpful. + +--- + +*We value your contribution and look forward to exploring new features for GPU-Jupyter. Thank you for your support!* diff --git a/.github/ISSUE_TEMPLATE/issue-report.md b/.github/ISSUE_TEMPLATE/issue-report.md new file mode 100644 index 0000000..518ffe3 --- /dev/null +++ b/.github/ISSUE_TEMPLATE/issue-report.md @@ -0,0 +1,51 @@ +--- +name: Issue report +about: Create a report to help us improve +title: '' +labels: '' +assignees: '' + +--- + +# GPU-Jupyter Issue Report + +Thank you for taking the time to report a bug for the GPU-Jupyter project. Your feedback is valuable in helping us maintain and improve the project. Please fill out this report with as much detail as possible. + +## Issue Description + +**Describe the issue** +A clear and concise description of the issue. + +**To Reproduce** +Steps to reproduce the behavior: + +**Expected Behavior** +A clear and concise description of what you expected to happen. + +**Screenshots** +If applicable, add screenshots to help explain your problem. + +## Environment + +**Operating System:** +Provide details about the operating system you are using (e.g., Windows, macOS, Linux distribution). + +**NVIDIA GPU and CUDA version Details:** +Provide details about the NVIDIA GPU, driver versions and CUDA version you are using (e.g., model, driver version `nvidia-smi` and `nvcc --version`). + +**GPU-Jupyter Version:** +Specify the version of GPU-Jupyter you are using. + +**Docker command and parameters:** +Specify the Docker command you are running. + +**Browser (if applicable):** +Specify the browser and version (e.g., Chrome, Firefox). + +## Additional Context + +Add any other context about the problem here, such as specific configurations or circumstances under which the bug occurs. + +--- + +*Please ensure that you have checked the existing issues to avoid duplicates. Thank you for contributing to making GPU-Jupyter better!* diff --git a/.gitignore b/.gitignore index 779fb23..12787d9 100644 --- a/.gitignore +++ b/.gitignore @@ -121,3 +121,4 @@ src/jupyter_notebook_config.json /build_push_python-only.sh /build_push_slim.sh extra/Getting_Started/tensorboard/runs +*copy.sh \ No newline at end of file diff --git a/CODE_OF_CONDUCT.md b/CODE_OF_CONDUCT.md new file mode 100644 index 0000000..d173d8a --- /dev/null +++ b/CODE_OF_CONDUCT.md @@ -0,0 +1,33 @@ +# Code of Conduct for GPU-Jupyter + +## Our Commitment + +In the interest of fostering an open and welcoming environment, we as contributors and maintainers of GPU-Jupyter, commit to making participation in our project and our community a harassment-free experience for everyone. This is in line with our goal of providing a robust platform for data science and machine learning workflows, leveraging the power of NVIDIA GPUs and JupyterLab. + +## Standards + +We aim to create a positive environment. Therefore, we encourage the following behavior: + +- **Inclusive Language**: Use welcoming and inclusive language. +- **Respect Different Viewpoints**: Respect differing viewpoints and experiences. +- **Graceful Acceptance of Constructive Criticism**: Accept and offer constructive criticism. +- **Focus on Community Well-being**: Prioritize the well-being and advancement of the community. +- **Empathy and Kindness**: Show empathy and kindness towards other community members. + +Examples of unacceptable behavior include: + +- **Harassment in Any Form**: Posting trolling, insulting, derogatory comments, or personal or political attacks. +- **Publishing Others' Private Information**: Publishing others' private information without explicit permission. +- **Other Unprofessional Conduct**: Conduct which could reasonably be considered inappropriate in a professional setting. + +## Our Responsibilities + +Project maintainers are responsible for clarifying the standards of acceptable behavior and are expected to take appropriate and fair corrective action in response to any instances of unacceptable behavior. + +## Scope + +This Code of Conduct applies both within project spaces and in public spaces when an individual is representing the project or its community. + +## Attribution + +This Code of Conduct is adapted from the [Contributor Covenant](https://www.contributor-covenant.org/), version 1.4, and is tailored to meet the specific needs of the GPU-Jupyter project. diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md new file mode 100644 index 0000000..a678268 --- /dev/null +++ b/CONTRIBUTING.md @@ -0,0 +1,48 @@ +# Contributing to GPU-Jupyter + +Thank you for your interest in contributing to GPU-Jupyter, a project by [iot-salzburg](https://github.com/iot-salzburg) that leverages the flexibility of JupyterLab with the power of NVIDIA GPUs. This guide will help you get started with contributing to this project. + +## Getting Started + +1. **Familiarize Yourself with the Project**: Visit the [GPU-Jupyter GitHub repository](https://github.com/iot-salzburg/gpu-jupyter) to understand the project's scope and existing codebase. + +2. **Set Up Your Environment**: Ensure you have a working setup with JupyterLab and NVIDIA GPU capabilities to test your contributions effectively. + +## How to Contribute + +1. **Fork the Repository**: Start by forking the [GPU-Jupyter repository](https://github.com/iot-salzburg/gpu-jupyter). + +2. **Create a Branch**: Create a branch in your fork for each new feature or improvement. + +3. **Commit Your Changes**: Make your changes in your branch and commit them with clear, descriptive commit messages. + +4. **Write or Update Tests**: If you add new features or fix bugs, write new tests or update existing ones to reflect your changes. + +5. **Follow Code Standards**: Ensure your code adheres to the coding standards used in GPU-Jupyter (e.g., PEP 8 for Python, adapt no files in `.build`). + +6. **Document Your Changes**: Update the README or documentation if necessary, especially if you're adding new features or changing how the project is used. + +7. **Submit a Pull Request**: Once your changes are ready, submit a pull request to the main GPU-Jupyter repository. + +## Reporting Issues + +- **Use GitHub Issues**: Report bugs or suggest features by creating an issue in the GPU-Jupyter repository. +- **Provide Detailed Information**: Include as much detail as possible in your issue reports, such as steps to reproduce the bug or detailed descriptions of the proposed feature. + +## Community Guidelines + +- **Respectful Communication**: Always communicate respectfully with other contributors and maintainers. +- **Collaborative Mindset**: Be open to feedback and willing to collaborate with others on solutions. +- **Inclusive Environment**: Strive to foster an inclusive environment where contributors of all backgrounds feel welcome. + +## Questions? + +If you have any questions or need further guidance, feel free to reach out to the maintainers or the community on the project's GitHub page. + +--- + +We look forward to your contributions to GPU-Jupyter and thank you for supporting this project! + +--- + +*This CONTRIBUTING.md is tailored specifically for the iot-salzburg/GPU-Jupyter project. For more information, visit the [GPU-Jupyter GitHub repository](https://github.com/iot-salzburg/gpu-jupyter).* diff --git a/README.md b/README.md index 609c39f..752fc9e 100644 --- a/README.md +++ b/README.md @@ -1,15 +1,27 @@ -# GPU-Jupyter -#### Leverage Jupyter Notebooks with the power of your NVIDIA GPU and perform GPU calculations using Tensorflow and Pytorch in collaborative notebooks. +GPU-Jupyter + +#### GPU-Jupyter: Leverage Jupyter Notebooks with the power of your NVIDIA GPU and perform GPU calculations using Tensorflow and Pytorch in collaborative notebooks. + +![Github Workflow](https://github.com/iot-salzburg/gpu-jupyter/actions/workflows/default.yml/badge.svg) +[![Docker Pulls](https://badgen.net/docker/pulls/cschranz/gpu-jupyter?icon=docker&label=Pulls)](https://hub.docker.com/r/cschranz/gpu-jupyter) +[![Docker Stars](https://badgen.net/docker/stars/cschranz/gpu-jupyter?icon=docker&label=Stars)](https://hub.docker.com/r/cschranz/gpu-jupyter) +[![GitHub stars](https://badgen.net/github/stars/iot-salzburg/gpu-jupyter/)](https://GitHub.com/iot-salzburg/gpu-jupyter/network/) +[![GitHub forks](https://badgen.net/github/forks/iot-salzburg/gpu-jupyter/)](https://GitHub.com/iot-salzburg/gpu-jupyter/stargazers/) +[![GitHub pull-requests closed](https://badgen.net/github/closed-prs/iot-salzburg/gpu-jupyter)](https://github.com/iot-salzburg/gpu-jupyter/pulls?q=is%3Aclosed) +[![GitHub commits](https://badgen.net/github/commits/iot-salzburg/gpu-jupyter)](https://GitHub.com/iot-salzburg/gpu-jupyter/commit/) +[![Maintenance](https://img.shields.io/badge/Maintained%3F-yes-green.svg)](https://github.com/iot-salzburg/gpu-jupyter/graphs/commit-activity) ![Jupyterlab Overview](https://raw.githubusercontent.com/iot-salzburg/gpu-jupyter/master/extra/jupyterlab-overview.png) -Welcome to this project, which provides a **GPU-capable environment** based on NVIDIA's CUDA Docker image and the popular [docker-stacks](https://github.com/jupyter/docker-stacks). +Welcome to this project, which provides a **GPU-capable environment** based on NVIDIA's CUDA Docker image and the popular [docker-stacks](https://github.com/jupyter/docker-stacks). Our toolstack enables GPU calculations in Jupyter notebooks, while the use of containers and versioned tags ensures the reproducibility of experiments. By utilizing version control for the source code, tagged data spaces, seeds for the random functions, and tagged environments as provided here, our solution **empowers researchers to conduct highly complex big data experiments that are fully reproducible**. The images of this repository are available on [Dockerhub](https://hub.docker.com/r/cschranz/gpu-jupyter). -A big thank you to [docker-stacks](https://github.com/jupyter/docker-stacks) -for creating and maintaining a robust Python, R, and Julia toolstack for Data Science. +A big thank you to [docker-stacks](https://github.com/jupyter/docker-stacks) +for creating and maintaining a robust Python, R, and Julia toolstack for Data Science. ## Contents @@ -20,17 +32,18 @@ for creating and maintaining a robust Python, R, and Julia toolstack for Data Sc 4. [Configuration](#configuration) 5. [Deployment](#deployment-in-the-docker-swarm) 6. [Issues and Contributing](#issues-and-contributing) +7. [Support](#support) ## Quickstart -1. Ensure that you have access to a computer with an NVIDIA GPU. If you don’t have your own setup, you can try [Saturn Cloud](https://saturncloud.io/?utm_source=Medium+&utm_medium=TDS&utm_campaign=ChristophSchranz&utm_term=GPUJupyter) for a free GPU-powered Jupyter solution. +1. Ensure that you have access to a computer with an NVIDIA GPU. If you don’t have your own setup, you can try [Saturn Cloud](https://saturncloud.io/?utm_source=Github+&utm_Github=TDS&utm_campaign=ChristophSchranz&utm_term=GPUJupyter) for a free GPU-powered Jupyter solution. 2. Install [Docker](https://www.docker.com/community-edition#/download) version **1.10.0+** and [Docker Compose](https://docs.docker.com/compose/install/) version **1.28.0+**. -3. Get access to your GPU via CUDA drivers within Docker containers. For this, follow the installation steps in this +3. Get access to your GPU via CUDA drivers within Docker containers. For this, follow the installation steps in this [Medium article](https://medium.com/@christoph.schranz/set-up-your-own-gpu-based-jupyterlab-e0d45fcacf43). You can confirm that you can access your GPU within Docker if the command below returns a result similar to this one: ```bash - docker run --gpus all nvidia/cuda:11.6.2-cudnn8-runtime-ubuntu20.04 nvidia-smi + docker run --gpus all nvidia/cuda:12.0.1-cudnn8-runtime-ubuntu22.04 nvidia-smi ``` ```bash Fri Mar 24 09:17:19 2023 @@ -52,76 +65,93 @@ for creating and maintaining a robust Python, R, and Julia toolstack for Data Sc | ID ID Usage | |=======================================================================================| +---------------------------------------------------------------------------------------+ - ``` - **It is important to keep your installed CUDA version in mind when you pull images. + ``` + **It is important to keep your installed CUDA version in mind when you pull images. Note that you can't run images based on `nvidia/cuda:11.2` if you have only CUDA version 10.1 installed, use `nvcc --version` to get the correct cuda version. Additionally, a NVIDIA driver version of at least 520 is suggested, as the images are built and tested using this and later versions.** - + 4. Pull and run the GPU-Jupyter image. This may take some time as the whole environment for data science will be downloaded: ```bash - cd your-working-directory + cd your-working-directory ll data # this path will be mounted by default - docker run --gpus all -d -it -p 8848:8888 -v $(pwd)/data:/home/jovyan/work -e GRANT_SUDO=yes -e JUPYTER_ENABLE_LAB=yes --user root cschranz/gpu-jupyter:v1.5_cuda-11.6_ubuntu-20.04_python-only + docker run --gpus all -d -it -p 8848:8888 -v $(pwd)/data:/home/jovyan/work -e GRANT_SUDO=yes -e JUPYTER_ENABLE_LAB=yes --user root cschranz/gpu-jupyter:v1.6_cuda-12.0_ubuntu-22.04 ``` - This starts an instance of *GPU-Jupyter* with the tag `v1.5_cuda-11.6_ubuntu-20.04_python-only` at [http://localhost:8848](http://localhost:8848) (port `8848`). + This starts an instance of *GPU-Jupyter* with the tag `v1.6_cuda-12.0_ubuntu-22.04` at [http://localhost:8848](http://localhost:8848) (port `8848`). To log into Jupyterlab, you have to specify a token that you get from: ```bash docker exec -it [container-ID/name] jupyter server list # [JupyterServerListApp] Currently running servers: # [JupyterServerListApp] http://791003a731e1:8888/?token=5b96bb15be315ccb24643ea368a52cc0ba13657fbc29e409 :: /home/jovyan - ``` + ``` You can optionally set a password in [http://localhost:8848/login](http://localhost:8848/login) or as described [below](#change-the-password) (former default password `gpu-jupyter`). Additionally, data within the host's `data` directory is shared with the container. - Note that the following images of GPU-Jupyter are available on [Dockerhub](https://hub.docker.com/r/cschranz/gpu-jupyter): - - `v1.5_cuda-11.6_ubuntu-20.04` (full image) - - `v1.5_cuda-11.6_ubuntu-20.04_python-only` (only with a python interpreter and without Julia and R) - - `v1.5_cuda-11.6_ubuntu-20.04_slim` (only with a python interpreter and without additional packages) - - `v1.4_cuda-11.6_ubuntu-20.04` (full image) - - `v1.4_cuda-11.6_ubuntu-20.04_python-only` (only with a python interpreter and without Julia and R) - - `v1.4_cuda-11.6_ubuntu-20.04_slim` (only with a python interpreter and without additional packages) - - `v1.4_cuda-11.2_ubuntu-20.04` (full image) - - `v1.4_cuda-11.2_ubuntu-20.04_python-only` (only with a python interpreter and without Julia and R) - - `v1.4_cuda-11.2_ubuntu-20.04_slim` (only with a python interpreter and without additional packages) - - `v1.4_cuda-11.0_ubuntu-20.04` (full image) - - `v1.4_cuda-11.0_ubuntu-20.04_python-only` (only with a python interpreter and without Julia and R) - - `v1.4_cuda-11.0_ubuntu-20.04_slim` (only with a python interpreter and without additional packages) - - `v1.4_cuda-11.0_ubuntu-18.04` (full image) - - `v1.4_cuda-11.0_ubuntu-18.04_python-only` (only with a python interpreter and without Julia and R) - - `v1.4_cuda-11.0_ubuntu-18.04_slim` (only with a python interpreter and without additional packages) - - `v1.4_cuda-10.1_ubuntu-18.04` (full image) - - `v1.4_cuda-10.1_ubuntu-18.04_python-only` (only with a python interpreter and without Julia and R) - - `v1.4_cuda-10.1_ubuntu-18.04_slim` (only with a python interpreter and without additional packages) - - The version, e.g. `v1.5`, declares the version of the generator setup. - The Cuda version, e.g. `cuda-11.6`, must match the CUDA driver version and be supported by the GPU libraries. + The following images of GPU-Jupyter are available on [Dockerhub](https://hub.docker.com/r/cschranz/gpu-jupyter): + - `v1.6_cuda-12.0_ubuntu-22.04` (full image) + - `v1.6_cuda-12.0_ubuntu-22.04_python-only` (only with a python interpreter and without Julia and R) + - `v1.6_cuda-12.0_ubuntu-22.04_slim` (only with a python interpreter and without additional packages) + - `v1.6_cuda-11.8_ubuntu-22.04` (full image) + - `v1.6_cuda-11.8_ubuntu-22.04_python-only` (only with a python interpreter and without Julia and R) + - `v1.6_cuda-11.8_ubuntu-22.04_slim` (only with a python interpreter and without additional packages) + +
+ Older images + + - `v1.5_cuda-12.0_ubuntu-22.04` (full image) + - `v1.5_cuda-12.0_ubuntu-22.04_python-only` (only with a python interpreter and without Julia and R) + - `v1.5_cuda-12.0_ubuntu-22.04_slim` (only with a python interpreter and without additional packages) + - `v1.5_cuda-11.8_ubuntu-22.04` (full image) + - `v1.5_cuda-11.8_ubuntu-22.04_python-only` (only with a python interpreter and without Julia and R) + - `v1.5_cuda-11.8_ubuntu-22.04_slim` (only with a python interpreter and without additional packages) + - `v1.5_cuda-11.6_ubuntu-20.04` (full image) + - `v1.5_cuda-11.6_ubuntu-20.04_python-only` (only with a python interpreter and without Julia and R) + - `v1.5_cuda-11.6_ubuntu-20.04_slim` (only with a python interpreter and without additional packages) + - `v1.4_cuda-11.6_ubuntu-20.04` (full image) + - `v1.4_cuda-11.6_ubuntu-20.04_python-only` (only with a python interpreter and without Julia and R) + - `v1.4_cuda-11.6_ubuntu-20.04_slim` (only with a python interpreter and without additional packages) + - `v1.4_cuda-11.2_ubuntu-20.04` (full image) + - `v1.4_cuda-11.2_ubuntu-20.04_python-only` (only with a python interpreter and without Julia and R) + - `v1.4_cuda-11.2_ubuntu-20.04_slim` (only with a python interpreter and without additional packages) + - `v1.4_cuda-11.0_ubuntu-20.04` (full image) + - `v1.4_cuda-11.0_ubuntu-20.04_python-only` (only with a python interpreter and without Julia and R) + - `v1.4_cuda-11.0_ubuntu-20.04_slim` (only with a python interpreter and without additional packages) + - `v1.4_cuda-11.0_ubuntu-18.04` (full image) + - `v1.4_cuda-11.0_ubuntu-18.04_python-only` (only with a python interpreter and without Julia and R) + - `v1.4_cuda-11.0_ubuntu-18.04_slim` (only with a python interpreter and without additional packages) + - `v1.4_cuda-10.1_ubuntu-18.04` (full image) + - `v1.4_cuda-10.1_ubuntu-18.04_python-only` (only with a python interpreter and without Julia and R) + - `v1.4_cuda-10.1_ubuntu-18.04_slim` (only with a python interpreter and without additional packages) +
+ + The version, e.g. `v1.6`, declares the version of the generator setup. + The Cuda version, e.g. `cuda-12.0`, must match the CUDA driver version and be supported by the GPU libraries. These and older versions of GPU-Jupyter are listed on [Dockerhub](https://hub.docker.com/r/cschranz/gpu-jupyter/tags?page=1&ordering=last_updated). In case you are using another version or the GPU libraries don't work on your hardware, please try to build the image on your own as described below. Note that the images built for Ubuntu 20.04 LTS work also on Ubuntu 22.04 LTS is currently not supported. -Within the Jupyterlab UI, ensure you can access your GPU by opening a new Terminal window and running `nvidia-smi`. -Here, you can also install additional packages on top of the built image. +Within the Jupyterlab UI, ensure you can access your GPU by opening a new Terminal window and running `nvidia-smi`. +Here, you can also install additional packages on top of the built image. To help you get started with using the GPU, the repository includes some sample code located in `extra/Getting_Started`. -If you're new to JupyterLab or want to learn more about its features, -we recommend checking out this [tutorial](https://www.youtube.com/watch?v=7wfPqAyYADY). +If you're new to JupyterLab or want to learn more about its features, +we recommend checking out this [tutorial](https://www.youtube.com/watch?v=7wfPqAyYADY). ## Build Your Image -Building a custom Docker image is the recommended option if you have a different GPU architecture or if you want to customize the pre-installed packages. The Dockerfiles in `src/` can be modified to achieve this. To use a custom base image, modify `src/Dockerfile.header`. To install specific GPU-related libraries, modify `src/Dockerfile.gpulibs`, and to add specific libraries, append them to `src/Dockerfile.usefulpackages`. +Building a custom Docker image is the recommended option if you have a different GPU architecture or if you want to customize the pre-installed packages. The Dockerfiles in `custom/` can be modified to achieve this. To use a custom base image, modify `custom/header.Dockerfile`. To install specific GPU-related libraries, modify `custom/gpulibs.Dockerfile`, and to add specific libraries, append them to `custom/usefulpackages.Dockerfile`. -After making the necessary modifications, regenerate the `Dockerfile` in `/.build`. Once you have confirmed that your GPU is accessible within Docker containers by running `docker run --gpus all nvidia/cuda:11.2.2-cudnn8-runtime-ubuntu20.04 nvidia-smi` and seeing the GPU statistics, you can generate, build, and run the Docker image. +After making the necessary modifications, regenerate the `Dockerfile` in `/.build`. Once you have confirmed that your GPU is accessible within Docker containers by running `docker run --gpus all nvidia/cuda:12.0.1-cudnn8-runtime-ubuntu22.04 nvidia-smi` and seeing the GPU statistics, you can generate, build, and run the Docker image. The following commands will start *GPU-Jupyter* on [localhost:8848](http://localhost:8848) with the default password `gpu-jupyter`. ```bash git clone https://github.com/iot-salzburg/gpu-jupyter.git cd gpu-jupyter git branch # Check for extisting branches -git checkout v1.5_cuda-11.6_ubuntu-20.04 # select or create a new version +git checkout v1.6_cuda-11.8_ubuntu-22.04 # select or create a new version # generate the Dockerfile with python and without Julia and R (see options: --help) ./generate-Dockerfile.sh --python-only docker build -t gpu-jupyter .build/ # will take a while docker run --gpus all -d -it -p 8848:8888 -v $(pwd)/data:/home/jovyan/work -e GRANT_SUDO=yes -e JUPYTER_ENABLE_LAB=yes -e NB_UID="$(id -u)" -e NB_GID="$(id -g)" --user root --restart always --name gpu-jupyter_1 gpu-jupyter -``` +``` This command starts a container with GPU support and a shared local data volume `/data`, along with other necessary configurations, such as root permissions to install packages within the container. For more configuration options, see [Configuration of the Dockerfile-Generation](#configuration-of-the-dockerfile-generation) below. @@ -138,13 +168,13 @@ docker-compose logs -f # view the logs docker-compose down # stop the container ``` -This step requires a `docker-compose` version of at least `1.28.0`, +This step requires a `docker-compose` version of at least `1.28.0`, as the Dockerfile requests GPU resources (see this [changelog](https://docs.docker.com/compose/release-notes/#1280)). To update `docker-compose`, this [discussion](https://stackoverflow.com/a/50454860) may be useful. ## Tracing - + With these commands we can investigate the container: ```bash @@ -159,7 +189,7 @@ To stop the local deployment, run: ```bash docker rm -f [service-name | UID] # or ``` - + ## Configuration @@ -173,38 +203,71 @@ The script has the following parameters: * `-h|--help`: Show a help message. * `-p|--pw|--password`: Set the password for *GPU-Jupyter* by updating - the salted hashed token in `src/jupyter_notebook_config.json`. + the salted hashed token in `custom/jupyter_notebook_config.json`. -* `-c|--commit`: specify a commit or `"latest"` for the `docker-stacks`, +* `-c|--commit`: specify a commit or `"latest"` for the `docker-stacks`, the default commit is a working one. -* `-s|--slim`: Generate a slim Dockerfile. -As some installations are not needed by everyone, there is the possibility to skip some +* `-s|--slim`: Generate a slim Dockerfile. +As some installations are not needed by everyone, there is the possibility to skip some installations to reduce the size of the image. -Here the `docker-stack` `scipy-notebook` is used instead of `datascience-notebook` -that comes with Julia and R. -Moreover, none of the packages within `src/Dockerfile.usefulpackages` is installed. +Here the `docker-stack` `scipy-notebook` is used instead of `datascience-notebook` +that comes with Julia and R. +Moreover, none of the packages within `custom/usefulpackages.Dockerfile` is installed. -* `--python-only|--no-datascience-notebook`: As the name suggests, the `docker-stack` `datascience-notebook` +* `--python-only|--no-datascience-notebook`: As the name suggests, the `docker-stack` `datascience-notebook` is not installed -on top of the `scipy-notebook`, but the packages within `src/Dockerfile.usefulpackages` are. +on top of the `scipy-notebook`, but the packages within `custom/usefulpackages.Dockerfile` are. -* `--no-useful-packages`: On top of the `docker-stack` `datascience-notebook` (Julia and R), -the essential `gpulibs` are installed, but not the packages within `src/Dockerfile.usefulpackages`. +* `--no-useful-packages`: On top of the `docker-stack` `datascience-notebook` (Julia and R), +the essential `gpulibs` are installed, but not the packages within `custom/usefulpackages.Dockerfile`. -Note that only one of the parameters `--slim`, `--python-only`, and `--no-useful-packages` can be used at the same time: +Note that only one of the parameters `--slim`, `--python-only`, and `--no-useful-packages` can be used at the same time: ### Custom Installations -If you need to install custom packages within the container, you can modify the `src/Dockerfile.usefulpackages` file or do it directly within the container. -**Keep in mind that every time a Dockerfile is generated, the file `.build/Dockerfile` is overwritten, so it's best to append custom installations in `src/Dockerfile.usefulpackages` or `generate-Dockerfile.sh`.** +If you need to install custom packages within the container, you can modify the `custom/usefulpackages.Dockerfile` file or do it directly within the container. +**Keep in mind that every time a Dockerfile is generated, the file `.build/Dockerfile` is overwritten, so it's best to append custom installations in `custom/usefulpackages.Dockerfile` or `generate-Dockerfile.sh`.** Some useful packages are suggested in the [Extension docs](https://jupyterlab.readthedocs.io/en/stable/user/extensions.html) and in this blog article from [neptune.ai](https://neptune.ai/blog/jupyterlab-extensions-for-machine-learning). If you notice that an important package is missing in the default stack, please let us know so we can update it. -### Change the Password +### Authorization + +#### Set a Static Token + +Jupyter by default regenerates a new token on each new start. +GPU-Jupyter provides the environment variable `JUPYTER_TOKEN` to set a customized static token. +This option is practicable if the host machine is periodically restartet. +It is suggested to use a long token such as a UUID: + +```bash +export JUPYTER_TOKEN=$(uuidgen) +echo $JUPYTER_TOKEN +``` + + - For Docker add the parameter `-e JUPYTER_TOKEN=${JUPYTER_TOKEN}`, e.g.: + + ```bash + docker run --gpus all -d -it -p 8848:8888 -v $(pwd)/data:/home/jovyan/work -e GRANT_SUDO=yes -e JUPYTER_ENABLE_LAB=yes -e NB_UID="$(id -u)" -e NB_GID="$(id -g)" -e JUPYTER_TOKEN=${JUPYTER_TOKEN} --user root --restart always --name gpu-jupyter_1 gpu-jupyter + ``` + +- In `docker-compose.yml`, the environment variable can be set under + `ENVIRONMENT`: + + `JUPYTER_TOKEN: ${JUPYTER_TOKEN}` + + Please note that environment variables might not be accessable for all docker-compose versions. Consider to setting `JUPYTER_TOKEN` in a separate `.env`-file and using `env_file` in docker-compose or a hard-coded token. + +The static token can be requested using `docker exec`: +```bash +docker exec -it gpu-jupyter_1 jupyter server list +``` + + +#### Set a custom Password There are two ways to set a password for GPU-Jupyter: @@ -215,7 +278,7 @@ There are two ways to set a password for GPU-Jupyter: ```bash bash generate-Dockerfile.sh --password [your_password] ``` - This will update automatically the salted hashed token in the `src/jupyter_notebook_config.json` file. Note that the specified password may be visible in your account's bash history. + This will update automatically the salted hashed token in the `.build/jupyter_notebook_config.json` file. Note that the specified password may be visible in your account's bash history. ### Adaptions for using Tensorboard @@ -239,17 +302,17 @@ If the port is exposed, tensorboard can be accessed in the browser on [localhost ### Updates - + #### Update CUDA to another version -The GPU-libraries such as PyTorch and Tensorflow in `src/Docker.gpulibs` must support the CUDA version and NVIDIA drivers on the host machine. Check out the compatibility lists for [PyTorch](https://pytorch.org/get-started/locally/) and [Tensorflow](https://www.tensorflow.org/install/source#gpu) or search online for the explicit versions. In this setup, the NVIDIA Driver has version 530.30.02 and CUDA version 11.6.2 is used, which is compatible with Tensorflow 2.10 and PyTorch 1.12. +The GPU-libraries such as PyTorch and Tensorflow in `custom/Docker.gpulibs` must support the CUDA version and NVIDIA drivers on the host machine. Check out the compatibility lists for [PyTorch](https://pytorch.org/get-started/locally/) and [Tensorflow](https://www.tensorflow.org/install/source#gpu) or search online for the explicit versions. In this setup, the NVIDIA Driver has version 530.30.02 and CUDA version 11.6.2 is used, which is compatible with Tensorflow 2.10 and PyTorch 1.12. -The host's CUDA version must be equal to or higher than that of the container itself (in `Dockerfile.header`). -Check the host's version with `nvcc --version` and the version compatibilities +The host's CUDA version must be equal to or higher than that used by the container (set within `custom/header.Dockerfile`). +Check the host's version with `nvcc --version` and the version compatibilities for CUDA-dependent packages as [Pytorch](https://pytorch.org/get-started/locally/) respectively [Tensorflow](https://www.tensorflow.org/install/gpu) previously. Then modify, if supported, the CUDA-version (find all tags [here](https://hub.docker.com/r/nvidia/cuda/tags)) -in `src/Dockerfile.header` to, e.g.: +in `custom/header.Dockerfile` to, e.g.: the line: FROM nvidia/cuda:X.Y-base-ubuntu20.04 @@ -266,7 +329,7 @@ docker run --gpus all -d -it -p 8848:8888 -v $(pwd)/data:/home/jovyan/work -e GR #### Upgrade / Downgrade the Docker-Stacks -The [docker-stacks](https://github.com/jupyter/docker-stacks) is used as a submodule within `.build/docker-stacks`. Per default, the head of the commit is reset to a commit on which `gpu-jupyter` runs stable. +The [docker-stacks](https://github.com/jupyter/docker-stacks) is used as a submodule within `.build/docker-stacks`. Per default, the head of the commit is reset to a commit on which `gpu-jupyter` runs stable. To set the docker-stacks to a specific version generate the Dockerfile with a specific [docker-stacks commit](https://github.com/jupyter/docker-stacks/commits/main), run: ```bash @@ -280,13 +343,13 @@ To update the generated Dockerfile to the latest commit, run: ``` A new build can last some time and may consume a lot of data traffic. Note, that untested versions often result in -a version conflict, as some files have to be adapted. Here are some examples of solutions: +a version conflict, as some files have to be adapted. Here are some examples of solutions: -- **Some file is not found:** +- **Some file is not found:** ``` Step 22/64 : COPY --chown="${NB_UID}:${NB_GID}" initial-condarc "${CONDA_DIR}/.condarc" COPY failed: file not found in build context or excluded by .dockerignore: stat initial-condarc: file does not exist - ``` + ``` → Adapt `generate-Dockerfile.sh` so that it copies `initial-condarc` into the working directory as it does with other files. Renamed files result in a similar issue and solution. - **The specified package version is not compatible with the drivers.** @@ -296,15 +359,15 @@ a version conflict, as some files have to be adapted. Here are some examples of Requirement already satisfied: pip in /opt/conda/lib/python3.10/site-packages (22.1.2) ERROR: Could not find a version that satisfies the requirement tensorflow==2.6.2 (from versions: 2.8.0rc0, 2.8.0rc1, 2.8.0, 2.8.1, 2.8.2, 2.9.0rc0, 2.9.0rc1, 2.9.0rc2, 2.9.0, 2.9.1) ERROR: No matching distribution found for tensorflow==2.6.2 - ``` + ``` → Just update the package to a version that is compatible, here tensorflow 2.8.2 was. - **Branch `master` is not known:** ``` error: pathspec 'master' did not match any file(s) known to git. - ``` - → The default branch of [docker-stacks](https://github.com/jupyter/docker-stacks) were + ``` + → The default branch of [docker-stacks](https://github.com/jupyter/docker-stacks) were renamed from `master` to `main`. Delete the subdirectory `.build/docker-stacks` and regenerate the the Dockerfile. General information on submodules can be found in [this tutorial](https://www.vogella.com/tutorials/GitSubmodules/article.html). @@ -312,15 +375,15 @@ a version conflict, as some files have to be adapted. Here are some examples of ## Deployment in the Docker Swarm - -A Jupyter instance often requires data from other services. + +A Jupyter instance often requires data from other services. If that data source is containerized in Docker and sharing a port for communication shouldn't be allowed, e.g., for security reasons, -then connecting the data source with *GPU-Jupyter* within a Docker Swarm is a great option! +then connecting the data source with *GPU-Jupyter* within a Docker Swarm is a great option! ### Set up Docker Swarm and Registry This step requires a running [Docker Swarm](https://www.youtube.com/watch?v=x843GyFRIIY) on a cluster or at least on this node. -In order to register custom images in a local Docker Swarm cluster, +In order to register custom images in a local Docker Swarm cluster, a registry instance must be deployed in advance. Note that we are using port 5001, as many services use the default port 5000. @@ -348,9 +411,9 @@ services: networks: datastack: driver: overlay - attachable: true + attachable: true ``` - In this example, + In this example, * The docker stack was deployed in Docker swarm with the name **elk** (`docker stack deploy ... elk`), * The docker network has the name **datastack** within the `docker-compose.yml` file, * This network is configured to be attachable in the `docker-compose.yml` file @@ -362,7 +425,7 @@ networks: # ... ``` The docker network name **elk_datastack** is used in the next step as a parameter. - + ### Start GPU-Jupyter in Docker Swarm Finally, *GPU-Jupyter* can be deployed in the Docker Swarm with the shared network, using: @@ -374,13 +437,13 @@ Finally, *GPU-Jupyter* can be deployed in the Docker Swarm with the shared netwo ``` where: * **-p:** port specifies the port on which the service will be available. -* **-n:** docker-network is the name of the attachable network from the previous step, +* **-n:** docker-network is the name of the attachable network from the previous step, e.g., here it is **elk_datastack**. * **-r:** registry port is the port that is published by the registry service, the default is `5000`. -Now, *GPU-jupyter* will be accessible here on [localhost:8848](http://localhost:8848) -with the default password `gpu-jupyter` and shares the network with the other data source, i.e., -all ports of the data source will be accessible within *GPU-Jupyter*, +Now, *GPU-jupyter* will be accessible here on [localhost:8848](http://localhost:8848) +with the default password `gpu-jupyter` and shares the network with the other data source, i.e., +all ports of the data source will be accessible within *GPU-Jupyter*, even if they aren't routed it the source's `docker-compose` file. Check if everything works well using: @@ -409,8 +472,8 @@ To remove the service from the swarm, use: generate-Dockerfile.sh: line 11: `while [[ "$#" -gt 0 ]]; do case $1 in ``` The reason for this issue is that the line breaks between Unix and Windows-based systems are different and in the current version different. - - **Solution**: Change the line endings of the bash scripts. This can be done e.g. in the *Notepad++* under + + **Solution**: Change the line endings of the bash scripts. This can be done e.g. in the *Notepad++* under *Edit* - *EOL Conversion*, or using `dos2unix` ```bash sudo apt install dos2unix @@ -423,16 +486,40 @@ To remove the service from the swarm, use: ERROR: for fc8d8dfbebe9_gpu-jupyter_gpu-jupyter_1 Cannot start service gpu-jupyter: OCI runtime create failed: container_linux.go:370: starting container process caused: process_linux.go:459: container init ca used: Running hook #0:: error running hook: exit status 1, stdout: , stderr: nvidia-container-cli: initialization error: driver error: failed to process request: unknown ``` - **Solution**: + **Solution**: Check if the GPU is available on the host node via `nvidia-smi` and run with the described `docker`-commands. - If the error still occurs, so try there could be an issue that docker can't visualize the GPU. - + If the error still occurs, so try there could be an issue that docker can't use the GPU. Please try [this](https://cschranz.medium.com/set-up-your-own-gpu-based-jupyterlab-e0d45fcacf43) or similar tutorials on how to install the required drivers. ### Contribution -This project has the intention to create a robust image for CUDA-based GPU applications, -which is built on top of the [docker-stacks](https://github.com/jupyter/docker-stacks). +This project has the intention to create a robust image for CUDA-based GPU applications, +which is built on top of the [docker-stacks](https://github.com/jupyter/docker-stacks). Please help us to improve this project, by: * [filing a new issue](https://github.com/iot-salzburg/gpu-jupyter/issues/new) * [open a pull request](https://help.github.com/articles/using-pull-requests/) + +## Support + +For commercial support, please contact [b-data](https://github.com/b-data) by +email: . + +b-data maintains its own CUDA-enabled +[JupyterLab](https://github.com/b-data/jupyterlab-r-docker-stack) +[docker](https://github.com/b-data/jupyterlab-python-docker-stack) +[stacks](https://github.com/b-data/jupyterlab-julia-docker-stack) and tailors +them to your needs, e.g. + +- Integration of self-signed CA certificates to enable communication with web + services on the intranet. +- Setting up the necessary environment variables so that everything works + behind a corporate proxy server. + +Additionally, the +[JupyterHub](https://github.com/b-data/docker-deployment-jupyter) setup can be +customised to allow + +- authentication with AD/LDAP +- mounting CIFS/SMB file shares + +and much more. diff --git a/custom/gpulibs.Dockerfile b/custom/gpulibs.Dockerfile new file mode 100644 index 0000000..4481775 --- /dev/null +++ b/custom/gpulibs.Dockerfile @@ -0,0 +1,69 @@ +LABEL maintainer="Christoph Schranz , Mathematical Michael " + +# Install Tensorflow, check compatibility here: +# https://www.tensorflow.org/install/source#gpu +# installation via conda leads to errors in version 4.8.2 +# Install CUDA-specific nvidia libraries and update libcudnn8 before that +# using device_lib.list_local_devices() the cudNN version is shown, adapt version to tested compat +USER ${NB_UID} +RUN pip install --upgrade pip && \ + pip install --no-cache-dir tensorflow==2.15.0 keras==2.15.0 && \ + fix-permissions "${CONDA_DIR}" && \ + fix-permissions "/home/${NB_USER}" + +# Install PyTorch with dependencies +RUN mamba install --quiet --yes \ + pyyaml setuptools cmake cffi typing && \ + mamba clean --all -f -y && \ + fix-permissions "${CONDA_DIR}" && \ + fix-permissions "/home/${NB_USER}" + +# Check compatibility here: +# https://pytorch.org/get-started/locally/ +# Installation via conda leads to errors installing cudatoolkit=11.1 +# RUN pip install --no-cache-dir torch==2.1.0 torchvision==0.16.0 torchaudio==2.1.0 && \ +# torchviz==0.0.2 --extra-index-url https://download.pytorch.org/whl/cu118 +RUN set -ex \ + && buildDeps=' \ + torch==2.1.2 \ + torchvision==0.16.2 \ + torchaudio==2.1.2 \ +' \ + && pip install --no-cache-dir $buildDeps \ + && fix-permissions "${CONDA_DIR}" \ + && fix-permissions "/home/${NB_USER}" + +USER root +ENV CUDA_PATH=/opt/conda/ + +# Install nvtop to monitor the gpu tasks +RUN apt-get update && \ + apt-get install -y --no-install-recommends cmake libncurses5-dev libncursesw5-dev git && \ + apt-get clean && rm -rf /var/lib/apt/lists/* + +USER $NB_UID +# These need to be two separate pip install commands, otherwise it will throw an error +# attempting to resolve the nvidia-cuda-nvcc package at the same time as nvidia-pyindex +RUN pip install --no-cache-dir nvidia-pyindex && \ + pip install --no-cache-dir nvidia-cuda-nvcc && \ + fix-permissions "${CONDA_DIR}" && \ + fix-permissions "/home/${NB_USER}" + +# reinstall nvcc with cuda-nvcc to install ptax +USER $NB_UID +# These need to be two separate pip install commands, otherwise it will throw an error +# attempting to resolve the nvidia-cuda-nvcc package at the same time as nvidia-pyindex +RUN pip install --no-cache-dir nvidia-pyindex && \ + pip install --no-cache-dir nvidia-cuda-nvcc && \ + fix-permissions "${CONDA_DIR}" && \ + fix-permissions "/home/${NB_USER}" + +RUN mamba install -c nvidia cuda-nvcc=12.0.140 -y && \ + mamba clean --all -f -y && \ + fix-permissions $CONDA_DIR && \ + fix-permissions /home/$NB_USER + +USER root +RUN ln -s $CONDA_DIR/bin/ptxas /usr/bin/ptxas + +USER $NB_UID diff --git a/src/Dockerfile.header b/custom/header.Dockerfile similarity index 91% rename from src/Dockerfile.header rename to custom/header.Dockerfile index abafde3..a4d9889 100644 --- a/src/Dockerfile.header +++ b/custom/header.Dockerfile @@ -1,6 +1,6 @@ # Use NVIDIA CUDA as base image and run the same installation as in the other packages. # The version of cuda must match those of the packages installed in src/Dockerfile.gpulibs -FROM nvidia/cuda:11.6.2-cudnn8-runtime-ubuntu20.04 +FROM nvidia/cuda:12.0.1-cudnn8-runtime-ubuntu22.04 LABEL authors="Christoph Schranz , Mathematical Michael " # This is a concatenated Dockerfile, the maintainers of subsequent sections may vary. RUN chmod 1777 /tmp && chmod 1777 /var/tmp diff --git a/custom/jupyter_server_config_token_addendum.py b/custom/jupyter_server_config_token_addendum.py new file mode 100644 index 0000000..fd91b6b --- /dev/null +++ b/custom/jupyter_server_config_token_addendum.py @@ -0,0 +1,5 @@ + +# Set static token +import os +if os.getenv("JUPYTER_TOKEN"): + c.ServerApp.token = os.getenv("JUPYTER_TOKEN") diff --git a/src/Dockerfile.usefulpackages b/custom/usefulpackages.Dockerfile similarity index 100% rename from src/Dockerfile.usefulpackages rename to custom/usefulpackages.Dockerfile diff --git a/docker-compose-swarm.yml b/docker-compose-swarm.yml index ec1646a..3fbdc56 100644 --- a/docker-compose-swarm.yml +++ b/docker-compose-swarm.yml @@ -12,6 +12,7 @@ services: JUPYTER_ENABLE_LAB: "yes" NB_UID: ${JUPYTER_UID:-1000} NB_GID: ${JUPYTER_GID:-1000} + JUPYTER_TOKEN: ${JUPYTER_TOKEN} # enable sudo permissions user: "root" diff --git a/docker-compose.yml b/docker-compose.yml index eee9a25..5568ad2 100755 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -29,6 +29,7 @@ services: JUPYTER_ENABLE_LAB: "yes" NB_UID: ${JUPYTER_UID:-1000} NB_GID: ${JUPYTER_GID:-1000} + JUPYTER_TOKEN: ${JUPYTER_TOKEN} # enable sudo permissions user: "root" diff --git a/extra/Getting_Started/GPU-processing.ipynb b/extra/Getting_Started/GPU-processing.ipynb old mode 100644 new mode 100755 index b64b7a9..20fc6a8 --- a/extra/Getting_Started/GPU-processing.ipynb +++ b/extra/Getting_Started/GPU-processing.ipynb @@ -27,16 +27,16 @@ "name": "stdout", "output_type": "stream", "text": [ - "Mon Apr 26 13:59:53 2021 \n", + "Tue Dec 19 15:20:27 2023 \n", "+-----------------------------------------------------------------------------+\n", - "| NVIDIA-SMI 465.19.01 Driver Version: 465.19.01 CUDA Version: 11.3 |\n", + "| NVIDIA-SMI 525.54 Driver Version: 526.56 CUDA Version: 12.0 |\n", "|-------------------------------+----------------------+----------------------+\n", "| GPU Name Persistence-M| Bus-Id Disp.A | Volatile Uncorr. ECC |\n", "| Fan Temp Perf Pwr:Usage/Cap| Memory-Usage | GPU-Util Compute M. |\n", "| | | MIG M. |\n", "|===============================+======================+======================|\n", - "| 0 NVIDIA GeForce ... On | 00000000:01:00.0 On | N/A |\n", - "| 0% 48C P8 8W / 215W | 283MiB / 7974MiB | 11% Default |\n", + "| 0 NVIDIA GeForce ... On | 00000000:01:00.0 Off | N/A |\n", + "| N/A 43C P0 19W / N/A | 0MiB / 6144MiB | 0% Default |\n", "| | | N/A |\n", "+-------------------------------+----------------------+----------------------+\n", " \n", @@ -45,6 +45,7 @@ "| GPU GI CI PID Type Process name GPU Memory |\n", "| ID ID Usage |\n", "|=============================================================================|\n", + "| No running processes found |\n", "+-----------------------------------------------------------------------------+\n" ] } @@ -86,11 +87,48 @@ "execution_count": 3, "metadata": {}, "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "2023-12-19 15:20:31.292167: E external/local_xla/xla/stream_executor/cuda/cuda_dnn.cc:9261] Unable to register cuDNN factory: Attempting to register factory for plugin cuDNN when one has already been registered\n", + "2023-12-19 15:20:31.292283: E external/local_xla/xla/stream_executor/cuda/cuda_fft.cc:607] Unable to register cuFFT factory: Attempting to register factory for plugin cuFFT when one has already been registered\n", + "2023-12-19 15:20:31.345027: E external/local_xla/xla/stream_executor/cuda/cuda_blas.cc:1515] Unable to register cuBLAS factory: Attempting to register factory for plugin cuBLAS when one has already been registered\n", + "2023-12-19 15:20:31.405681: I tensorflow/core/platform/cpu_feature_guard.cc:182] This TensorFlow binary is optimized to use available CPU instructions in performance-critical operations.\n", + "To enable the following instructions: AVX2 FMA, in other operations, rebuild TensorFlow with the appropriate compiler flags.\n" + ] + }, { "name": "stdout", "output_type": "stream", "text": [ - "[PhysicalDevice(name='/physical_device:XLA_GPU:0', device_type='XLA_GPU')]\n" + "[]\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "2023-12-19 15:20:33.437438: I external/local_xla/xla/stream_executor/cuda/cuda_executor.cc:887] could not open file to read NUMA node: /sys/bus/pci/devices/0000:01:00.0/numa_node\n", + "Your kernel may have been built without NUMA support.\n", + "2023-12-19 15:20:33.438375: I external/local_xla/xla/stream_executor/cuda/cuda_executor.cc:887] could not open file to read NUMA node: /sys/bus/pci/devices/0000:01:00.0/numa_node\n", + "Your kernel may have been built without NUMA support.\n", + "2023-12-19 15:20:33.438401: I external/local_xla/xla/stream_executor/cuda/cuda_executor.cc:887] could not open file to read NUMA node: /sys/bus/pci/devices/0000:01:00.0/numa_node\n", + "Your kernel may have been built without NUMA support.\n", + "2023-12-19 15:20:33.439883: I external/local_xla/xla/stream_executor/cuda/cuda_executor.cc:887] could not open file to read NUMA node: /sys/bus/pci/devices/0000:01:00.0/numa_node\n", + "Your kernel may have been built without NUMA support.\n", + "2023-12-19 15:20:33.439914: I external/local_xla/xla/stream_executor/cuda/cuda_executor.cc:887] could not open file to read NUMA node: /sys/bus/pci/devices/0000:01:00.0/numa_node\n", + "Your kernel may have been built without NUMA support.\n", + "2023-12-19 15:20:33.439931: I external/local_xla/xla/stream_executor/cuda/cuda_executor.cc:887] could not open file to read NUMA node: /sys/bus/pci/devices/0000:01:00.0/numa_node\n", + "Your kernel may have been built without NUMA support.\n", + "2023-12-19 15:20:35.742285: I external/local_xla/xla/stream_executor/cuda/cuda_executor.cc:887] could not open file to read NUMA node: /sys/bus/pci/devices/0000:01:00.0/numa_node\n", + "Your kernel may have been built without NUMA support.\n", + "2023-12-19 15:20:35.742336: I external/local_xla/xla/stream_executor/cuda/cuda_executor.cc:887] could not open file to read NUMA node: /sys/bus/pci/devices/0000:01:00.0/numa_node\n", + "Your kernel may have been built without NUMA support.\n", + "2023-12-19 15:20:35.742346: I tensorflow/core/common_runtime/gpu/gpu_device.cc:2022] Could not identify NUMA node of platform GPU id 0, defaulting to 0. Your kernel may not have been built with NUMA support.\n", + "2023-12-19 15:20:35.742371: I external/local_xla/xla/stream_executor/cuda/cuda_executor.cc:887] could not open file to read NUMA node: /sys/bus/pci/devices/0000:01:00.0/numa_node\n", + "Your kernel may have been built without NUMA support.\n", + "2023-12-19 15:20:35.742387: I tensorflow/core/common_runtime/gpu/gpu_device.cc:1929] Created device /device:GPU:0 with 3007 MB memory: -> device: 0, name: NVIDIA GeForce RTX 3060 Laptop GPU, pci bus id: 0000:01:00.0, compute capability: 8.6\n" ] }, { @@ -101,21 +139,19 @@ " memory_limit: 268435456\n", " locality {\n", " }\n", - " incarnation: 6507124110760788315,\n", - " name: \"/device:XLA_CPU:0\"\n", - " device_type: \"XLA_CPU\"\n", - " memory_limit: 17179869184\n", + " incarnation: 16132906446837489126\n", + " xla_global_id: -1,\n", + " name: \"/device:GPU:0\"\n", + " device_type: \"GPU\"\n", + " memory_limit: 3153068032\n", " locality {\n", + " bus_id: 1\n", + " links {\n", + " }\n", " }\n", - " incarnation: 4922654194336399393\n", - " physical_device_desc: \"device: XLA_CPU device\",\n", - " name: \"/device:XLA_GPU:0\"\n", - " device_type: \"XLA_GPU\"\n", - " memory_limit: 17179869184\n", - " locality {\n", - " }\n", - " incarnation: 1179884248341804191\n", - " physical_device_desc: \"device: XLA_GPU device\"]" + " incarnation: 13564847057713934038\n", + " physical_device_desc: \"device: 0, name: NVIDIA GeForce RTX 3060 Laptop GPU, pci bus id: 0000:01:00.0, compute capability: 8.6\"\n", + " xla_global_id: 416903419]" ] }, "execution_count": 3, @@ -125,9 +161,10 @@ ], "source": [ "import tensorflow as tf\n", + "print(tf.test.is_built_with_cuda(), tf.config.list_physical_devices('GPU'))\n", + "\n", "from tensorflow.python.client import device_lib\n", - "print(tf.config.list_physical_devices('XLA_GPU'))\n", - "device_lib.list_local_devices()" + "print(device_lib.list_local_devices())" ] }, { @@ -138,11 +175,11 @@ { "data": { "text/plain": [ - "tensor([[0.6378, 0.9107, 0.5509],\n", - " [0.4454, 0.1930, 0.4130],\n", - " [0.0074, 0.9115, 0.1397],\n", - " [0.4758, 0.0569, 0.8469],\n", - " [0.1666, 0.7414, 0.5519]])" + "tensor([[0.6527, 0.7924, 0.8878],\n", + " [0.7822, 0.0338, 0.4025],\n", + " [0.6130, 0.1177, 0.9255],\n", + " [0.0451, 0.7010, 0.0331],\n", + " [0.1705, 0.8165, 0.7323]])" ] }, "execution_count": 4, @@ -192,7 +229,7 @@ "name": "stdout", "output_type": "stream", "text": [ - "358 ms ± 72.9 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)\n" + "559 ms ± 87.8 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)\n" ] } ], @@ -226,7 +263,7 @@ "name": "stdout", "output_type": "stream", "text": [ - "187 ms ± 40.1 ms per loop (mean ± std. dev. of 7 runs, 10 loops each)\n" + "200 ms ± 4.12 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)\n" ] } ], @@ -252,16 +289,16 @@ "name": "stdout", "output_type": "stream", "text": [ - "tensor([[0.5021, 0.1432, 0.7876, 0.4729, 0.8067],\n", - " [0.7827, 0.3770, 0.8910, 0.3543, 0.3826],\n", - " [0.1806, 0.2917, 0.3224, 0.2717, 0.3795],\n", - " [0.5002, 0.2753, 0.5238, 0.0830, 0.9391],\n", - " [0.0774, 0.3479, 0.8384, 0.6825, 0.4502]], device='cuda:0')\n", - "tensor([[0.5021, 0.1432, 0.7876, 0.4729, 0.8067],\n", - " [0.7827, 0.3770, 0.8910, 0.3543, 0.3826],\n", - " [0.1806, 0.2917, 0.3224, 0.2717, 0.3795],\n", - " [0.5002, 0.2753, 0.5238, 0.0830, 0.9391],\n", - " [0.0774, 0.3479, 0.8384, 0.6825, 0.4502]], dtype=torch.float64)\n" + "tensor([[0.4609, 0.7584, 0.4593, 0.0551, 0.1594],\n", + " [0.6063, 0.5960, 0.4197, 0.7962, 0.1542],\n", + " [0.5160, 0.4067, 0.6062, 0.1356, 0.8867],\n", + " [0.3636, 0.7090, 0.3487, 0.0552, 0.4904],\n", + " [0.6309, 0.0065, 0.8926, 0.0643, 0.6346]], device='cuda:0')\n", + "tensor([[0.4609, 0.7584, 0.4593, 0.0551, 0.1594],\n", + " [0.6063, 0.5960, 0.4197, 0.7962, 0.1542],\n", + " [0.5160, 0.4067, 0.6062, 0.1356, 0.8867],\n", + " [0.3636, 0.7090, 0.3487, 0.0552, 0.4904],\n", + " [0.6309, 0.0065, 0.8926, 0.0643, 0.6346]], dtype=torch.float64)\n" ] } ], @@ -285,7 +322,8 @@ "name": "stdout", "output_type": "stream", "text": [ - "8.42 ms ± 223 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)\n" + "The slowest run took 5.26 times longer than the fastest. This could mean that an intermediate result is being cached.\n", + "90.5 ms ± 74.6 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)\n" ] } ], @@ -332,11 +370,11 @@ "name": "stdout", "output_type": "stream", "text": [ - "tensor([[0.6581, 0.1584, 0.1951, 0.7333, 0.2423],\n", - " [0.7057, 0.4649, 0.6851, 0.4686, 0.4990],\n", - " [0.0904, 0.3937, 0.1658, 0.3733, 0.8904],\n", - " [0.2138, 0.0609, 0.5688, 0.1917, 0.8857],\n", - " [0.2110, 0.6726, 0.2961, 0.3625, 0.0745]], device='cuda:0')\n" + "tensor([[0.2782, 0.4737, 0.6745, 0.9081, 0.3480],\n", + " [0.1753, 0.6475, 0.3926, 0.3947, 0.9197],\n", + " [0.1747, 0.6550, 0.4903, 0.4221, 0.3066],\n", + " [0.8606, 0.6053, 0.0784, 0.1127, 0.2536],\n", + " [0.0236, 0.5264, 0.6400, 0.5198, 0.5281]], device='cuda:0')\n" ] } ], @@ -353,7 +391,7 @@ "outputs": [], "source": [ "if torch.cuda.is_available():\n", - " # Here is the memory of the GPU a border. \n", + " # Here is the memory of the GPU a border.\n", " # A matrix with 100000 lines requires 37 GB, but only 8 GB are available.\n", " H = x.mm( (x.t().mm(x)).inverse() ).mm(x.t())" ] @@ -367,11 +405,11 @@ "name": "stdout", "output_type": "stream", "text": [ - "tensor([[ 7.5589e-04, 9.0142e-05, 1.7263e-04, 7.5191e-05, 1.2231e-04],\n", - " [ 9.0142e-05, 5.8283e-04, -2.2237e-04, 3.5647e-04, -2.3438e-05],\n", - " [ 1.7263e-04, -2.2237e-04, 8.8304e-04, 3.3944e-04, -4.9345e-05],\n", - " [ 7.5191e-05, 3.5647e-04, 3.3944e-04, 9.6286e-04, -1.4842e-05],\n", - " [ 1.2231e-04, -2.3438e-05, -4.9345e-05, -1.4842e-05, 1.0476e-03]],\n", + "tensor([[ 6.5489e-04, 1.8794e-04, 2.2678e-04, -2.8653e-04, 1.9096e-04],\n", + " [ 1.8794e-04, 7.0443e-04, 2.0275e-04, -2.2673e-04, 2.6704e-04],\n", + " [ 2.2678e-04, 2.0275e-04, 6.8227e-04, -1.5024e-05, 3.2128e-04],\n", + " [-2.8653e-04, -2.2673e-04, -1.5024e-05, 1.1865e-03, 1.9364e-04],\n", + " [ 1.9096e-04, 2.6704e-04, 3.2128e-04, 1.9364e-04, 1.0109e-03]],\n", " device='cuda:0')\n" ] } @@ -390,18 +428,18 @@ "name": "stdout", "output_type": "stream", "text": [ - "tensor([[ 7.5589e-04, 9.0142e-05, 1.7263e-04, 7.5191e-05, 1.2231e-04],\n", - " [ 9.0142e-05, 5.8283e-04, -2.2237e-04, 3.5647e-04, -2.3438e-05],\n", - " [ 1.7263e-04, -2.2237e-04, 8.8304e-04, 3.3944e-04, -4.9345e-05],\n", - " [ 7.5191e-05, 3.5647e-04, 3.3944e-04, 9.6286e-04, -1.4842e-05],\n", - " [ 1.2231e-04, -2.3438e-05, -4.9345e-05, -1.4842e-05, 1.0476e-03]],\n", + "tensor([[ 6.5489e-04, 1.8794e-04, 2.2678e-04, -2.8653e-04, 1.9096e-04],\n", + " [ 1.8794e-04, 7.0443e-04, 2.0275e-04, -2.2673e-04, 2.6704e-04],\n", + " [ 2.2678e-04, 2.0275e-04, 6.8227e-04, -1.5024e-05, 3.2128e-04],\n", + " [-2.8653e-04, -2.2673e-04, -1.5024e-05, 1.1865e-03, 1.9364e-04],\n", + " [ 1.9096e-04, 2.6704e-04, 3.2128e-04, 1.9364e-04, 1.0109e-03]],\n", " dtype=torch.float64)\n" ] } ], "source": [ "if torch.cuda.is_available():\n", - " # This operation is difficult, as an symmetric matrix is transferred \n", + " # This operation is difficult, as an symmetric matrix is transferred\n", " # back to the CPU. Is possible up to 30000 rows.\n", " print(H.to(\"cpu\", torch.double)[0:5, 0:5])" ] @@ -416,7 +454,7 @@ ], "metadata": { "kernelspec": { - "display_name": "Python 3", + "display_name": "Python 3 (ipykernel)", "language": "python", "name": "python3" }, @@ -430,7 +468,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.8.8" + "version": "3.11.7" } }, "nbformat": 4, diff --git a/extra/Getting_Started/JuliaQuickstart.ipynb b/extra/Getting_Started/JuliaQuickstart.ipynb index 6f9e005..24cbe15 100755 --- a/extra/Getting_Started/JuliaQuickstart.ipynb +++ b/extra/Getting_Started/JuliaQuickstart.ipynb @@ -40,8 +40,295 @@ "cell_type": "code", "execution_count": 2, "metadata": {}, - "outputs": [], + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "\u001b[32m\u001b[1m Updating\u001b[22m\u001b[39m registry at `/opt/julia/registries/General.toml`\n", + "\u001b[32m\u001b[1m Resolving\u001b[22m\u001b[39m package versions...\n", + "\u001b[32m\u001b[1m Installed\u001b[22m\u001b[39m Showoff ───────────────── v1.0.3\n", + "\u001b[32m\u001b[1m Installed\u001b[22m\u001b[39m Adapt ─────────────────── v3.7.2\n", + "\u001b[32m\u001b[1m Installed\u001b[22m\u001b[39m Calculus ──────────────── v0.5.1\n", + "\u001b[32m\u001b[1m Installed\u001b[22m\u001b[39m Rmath ─────────────────── v0.7.1\n", + "\u001b[32m\u001b[1m Installed\u001b[22m\u001b[39m IrrationalConstants ───── v0.2.2\n", + "\u001b[32m\u001b[1m Installed\u001b[22m\u001b[39m ColorTypes ────────────── v0.11.4\n", + "\u001b[32m\u001b[1m Installed\u001b[22m\u001b[39m DualNumbers ───────────── v0.6.8\n", + "\u001b[32m\u001b[1m Installed\u001b[22m\u001b[39m OffsetArrays ──────────── v1.12.10\n", + "\u001b[32m\u001b[1m Installed\u001b[22m\u001b[39m HypergeometricFunctions ─ v0.3.23\n", + "\u001b[32m\u001b[1m Installed\u001b[22m\u001b[39m StatsFuns ─────────────── v1.3.0\n", + "\u001b[32m\u001b[1m Installed\u001b[22m\u001b[39m FFTW ──────────────────── v1.7.2\n", + "\u001b[32m\u001b[1m Installed\u001b[22m\u001b[39m IndirectArrays ────────── v1.0.0\n", + "\u001b[32m\u001b[1m Installed\u001b[22m\u001b[39m IterTools ─────────────── v1.8.0\n", + "\u001b[32m\u001b[1m Installed\u001b[22m\u001b[39m PDMats ────────────────── v0.11.31\n", + "\u001b[32m\u001b[1m Installed\u001b[22m\u001b[39m SpecialFunctions ──────── v2.3.1\n", + "\u001b[32m\u001b[1m Installed\u001b[22m\u001b[39m FixedPointNumbers ─────── v0.8.4\n", + "\u001b[32m\u001b[1m Installed\u001b[22m\u001b[39m CategoricalArrays ─────── v0.10.8\n", + "\u001b[32m\u001b[1m Installed\u001b[22m\u001b[39m Contour ───────────────── v0.6.2\n", + "\u001b[32m\u001b[1m Installed\u001b[22m\u001b[39m MKL_jll ───────────────── v2024.0.0+0\n", + "\u001b[32m\u001b[1m Installed\u001b[22m\u001b[39m Hexagons ──────────────── v0.2.0\n", + "\u001b[32m\u001b[1m Installed\u001b[22m\u001b[39m Measures ──────────────── v0.3.2\n", + "\u001b[32m\u001b[1m Installed\u001b[22m\u001b[39m AbstractFFTs ──────────── v1.5.0\n", + "\u001b[32m\u001b[1m Installed\u001b[22m\u001b[39m Grisu ─────────────────── v1.0.2\n", + "\u001b[32m\u001b[1m Installed\u001b[22m\u001b[39m StaticArraysCore ──────── v1.4.2\n", + "\u001b[32m\u001b[1m Installed\u001b[22m\u001b[39m NaNMath ───────────────── v1.0.2\n", + "\u001b[32m\u001b[1m Installed\u001b[22m\u001b[39m StaticArrays ──────────── v1.8.0\n", + "\u001b[32m\u001b[1m Installed\u001b[22m\u001b[39m Gadfly ────────────────── v1.4.0\n", + "\u001b[32m\u001b[1m Installed\u001b[22m\u001b[39m KernelDensity ─────────── v0.6.7\n", + "\u001b[32m\u001b[1m Installed\u001b[22m\u001b[39m ChainRulesCore ────────── v1.18.0\n", + "\u001b[32m\u001b[1m Installed\u001b[22m\u001b[39m Reexport ──────────────── v1.2.2\n", + "\u001b[32m\u001b[1m Installed\u001b[22m\u001b[39m Loess ─────────────────── v0.6.3\n", + "\u001b[32m\u001b[1m Installed\u001b[22m\u001b[39m QuadGK ────────────────── v2.9.1\n", + "\u001b[32m\u001b[1m Installed\u001b[22m\u001b[39m FillArrays ────────────── v1.9.3\n", + "\u001b[32m\u001b[1m Installed\u001b[22m\u001b[39m Media ─────────────────── v0.5.0\n", + "\u001b[32m\u001b[1m Installed\u001b[22m\u001b[39m Rmath_jll ─────────────── v0.4.0+0\n", + "\u001b[32m\u001b[1m Installed\u001b[22m\u001b[39m Ratios ────────────────── v0.4.5\n", + "\u001b[32m\u001b[1m Installed\u001b[22m\u001b[39m AxisAlgorithms ────────── v1.0.1\n", + "\u001b[32m\u001b[1m Installed\u001b[22m\u001b[39m IntelOpenMP_jll ───────── v2024.0.0+0\n", + "\u001b[32m\u001b[1m Installed\u001b[22m\u001b[39m LogExpFunctions ───────── v0.3.26\n", + "\u001b[32m\u001b[1m Installed\u001b[22m\u001b[39m DataStructures ────────── v0.18.15\n", + "\u001b[32m\u001b[1m Installed\u001b[22m\u001b[39m Colors ────────────────── v0.12.10\n", + "\u001b[32m\u001b[1m Installed\u001b[22m\u001b[39m Juno ──────────────────── v0.8.4\n", + "\u001b[32m\u001b[1m Installed\u001b[22m\u001b[39m MacroTools ────────────── v0.5.11\n", + "\u001b[32m\u001b[1m Installed\u001b[22m\u001b[39m FFTW_jll ──────────────── v3.3.10+0\n", + "\u001b[32m\u001b[1m Installed\u001b[22m\u001b[39m StatsAPI ──────────────── v1.7.0\n", + "\u001b[32m\u001b[1m Installed\u001b[22m\u001b[39m CoupledFields ─────────── v0.2.0\n", + "\u001b[32m\u001b[1m Installed\u001b[22m\u001b[39m Distributions ─────────── v0.25.104\n", + "\u001b[32m\u001b[1m Installed\u001b[22m\u001b[39m OpenSpecFun_jll ───────── v0.5.5+0\n", + "\u001b[32m\u001b[1m Installed\u001b[22m\u001b[39m WoodburyMatrices ──────── v0.5.6\n", + "\u001b[32m\u001b[1m Installed\u001b[22m\u001b[39m Distances ─────────────── v0.10.11\n", + "\u001b[32m\u001b[1m Installed\u001b[22m\u001b[39m Missings ──────────────── v1.1.0\n", + "\u001b[32m\u001b[1m Installed\u001b[22m\u001b[39m Interpolations ────────── v0.14.7\n", + "\u001b[32m\u001b[1m Installed\u001b[22m\u001b[39m DocStringExtensions ───── v0.9.3\n", + "\u001b[32m\u001b[1m Installed\u001b[22m\u001b[39m SortingAlgorithms ─────── v1.2.0\n", + "\u001b[32m\u001b[1m Installed\u001b[22m\u001b[39m Compose ───────────────── v0.9.5\n", + "\u001b[32m\u001b[1m Installed\u001b[22m\u001b[39m StatsBase ─────────────── v0.33.21\n", + "\u001b[32m\u001b[1m Updating\u001b[22m\u001b[39m `/opt/julia/environments/v1.9/Project.toml`\n", + " \u001b[90m[c91e804a] \u001b[39m\u001b[92m+ Gadfly v1.4.0\u001b[39m\n", + "\u001b[32m\u001b[1m Updating\u001b[22m\u001b[39m `/opt/julia/environments/v1.9/Manifest.toml`\n", + " \u001b[90m[621f4979] \u001b[39m\u001b[92m+ AbstractFFTs v1.5.0\u001b[39m\n", + " \u001b[90m[79e6a3ab] \u001b[39m\u001b[92m+ Adapt v3.7.2\u001b[39m\n", + " \u001b[90m[13072b0f] \u001b[39m\u001b[92m+ AxisAlgorithms v1.0.1\u001b[39m\n", + " \u001b[90m[49dc2e85] \u001b[39m\u001b[92m+ Calculus v0.5.1\u001b[39m\n", + " \u001b[90m[324d7699] \u001b[39m\u001b[92m+ CategoricalArrays v0.10.8\u001b[39m\n", + " \u001b[90m[d360d2e6] \u001b[39m\u001b[92m+ ChainRulesCore v1.18.0\u001b[39m\n", + " \u001b[90m[3da002f7] \u001b[39m\u001b[92m+ ColorTypes v0.11.4\u001b[39m\n", + " \u001b[90m[5ae59095] \u001b[39m\u001b[92m+ Colors v0.12.10\u001b[39m\n", + " \u001b[90m[a81c6b42] \u001b[39m\u001b[92m+ Compose v0.9.5\u001b[39m\n", + " \u001b[90m[d38c429a] \u001b[39m\u001b[92m+ Contour v0.6.2\u001b[39m\n", + " \u001b[90m[7ad07ef1] \u001b[39m\u001b[92m+ CoupledFields v0.2.0\u001b[39m\n", + " \u001b[90m[864edb3b] \u001b[39m\u001b[92m+ DataStructures v0.18.15\u001b[39m\n", + " \u001b[90m[b4f34e82] \u001b[39m\u001b[92m+ Distances v0.10.11\u001b[39m\n", + " \u001b[90m[31c24e10] \u001b[39m\u001b[92m+ Distributions v0.25.104\u001b[39m\n", + " \u001b[90m[ffbed154] \u001b[39m\u001b[92m+ DocStringExtensions v0.9.3\u001b[39m\n", + " \u001b[90m[fa6b7ba4] \u001b[39m\u001b[92m+ DualNumbers v0.6.8\u001b[39m\n", + " \u001b[90m[7a1cc6ca] \u001b[39m\u001b[92m+ FFTW v1.7.2\u001b[39m\n", + " \u001b[90m[1a297f60] \u001b[39m\u001b[92m+ FillArrays v1.9.3\u001b[39m\n", + " \u001b[90m[53c48c17] \u001b[39m\u001b[92m+ FixedPointNumbers v0.8.4\u001b[39m\n", + " \u001b[90m[c91e804a] \u001b[39m\u001b[92m+ Gadfly v1.4.0\u001b[39m\n", + " \u001b[90m[42e2da0e] \u001b[39m\u001b[92m+ Grisu v1.0.2\u001b[39m\n", + " \u001b[90m[a1b4810d] \u001b[39m\u001b[92m+ Hexagons v0.2.0\u001b[39m\n", + " \u001b[90m[34004b35] \u001b[39m\u001b[92m+ HypergeometricFunctions v0.3.23\u001b[39m\n", + " \u001b[90m[9b13fd28] \u001b[39m\u001b[92m+ IndirectArrays v1.0.0\u001b[39m\n", + "\u001b[33m⌅\u001b[39m \u001b[90m[a98d9a8b] \u001b[39m\u001b[92m+ Interpolations v0.14.7\u001b[39m\n", + " \u001b[90m[92d709cd] \u001b[39m\u001b[92m+ IrrationalConstants v0.2.2\u001b[39m\n", + " \u001b[90m[c8e1da08] \u001b[39m\u001b[92m+ IterTools v1.8.0\u001b[39m\n", + " \u001b[90m[e5e0dc1b] \u001b[39m\u001b[92m+ Juno v0.8.4\u001b[39m\n", + " \u001b[90m[5ab0869b] \u001b[39m\u001b[92m+ KernelDensity v0.6.7\u001b[39m\n", + " \u001b[90m[4345ca2d] \u001b[39m\u001b[92m+ Loess v0.6.3\u001b[39m\n", + " \u001b[90m[2ab3a3ac] \u001b[39m\u001b[92m+ LogExpFunctions v0.3.26\u001b[39m\n", + " \u001b[90m[1914dd2f] \u001b[39m\u001b[92m+ MacroTools v0.5.11\u001b[39m\n", + " \u001b[90m[442fdcdd] \u001b[39m\u001b[92m+ Measures v0.3.2\u001b[39m\n", + " \u001b[90m[e89f7d12] \u001b[39m\u001b[92m+ Media v0.5.0\u001b[39m\n", + " \u001b[90m[e1d29d7a] \u001b[39m\u001b[92m+ Missings v1.1.0\u001b[39m\n", + " \u001b[90m[77ba4419] \u001b[39m\u001b[92m+ NaNMath v1.0.2\u001b[39m\n", + " \u001b[90m[6fe1bfb0] \u001b[39m\u001b[92m+ OffsetArrays v1.12.10\u001b[39m\n", + " \u001b[90m[90014a1f] \u001b[39m\u001b[92m+ PDMats v0.11.31\u001b[39m\n", + " \u001b[90m[1fd47b50] \u001b[39m\u001b[92m+ QuadGK v2.9.1\u001b[39m\n", + " \u001b[90m[c84ed2f1] \u001b[39m\u001b[92m+ Ratios v0.4.5\u001b[39m\n", + " \u001b[90m[189a3867] \u001b[39m\u001b[92m+ Reexport v1.2.2\u001b[39m\n", + " \u001b[90m[79098fc4] \u001b[39m\u001b[92m+ Rmath v0.7.1\u001b[39m\n", + " \u001b[90m[992d4aef] \u001b[39m\u001b[92m+ Showoff v1.0.3\u001b[39m\n", + " \u001b[90m[a2af1166] \u001b[39m\u001b[92m+ SortingAlgorithms v1.2.0\u001b[39m\n", + " \u001b[90m[276daf66] \u001b[39m\u001b[92m+ SpecialFunctions v2.3.1\u001b[39m\n", + " \u001b[90m[90137ffa] \u001b[39m\u001b[92m+ StaticArrays v1.8.0\u001b[39m\n", + " \u001b[90m[1e83bf80] \u001b[39m\u001b[92m+ StaticArraysCore v1.4.2\u001b[39m\n", + " \u001b[90m[82ae8749] \u001b[39m\u001b[92m+ StatsAPI v1.7.0\u001b[39m\n", + "\u001b[33m⌅\u001b[39m \u001b[90m[2913bbd2] \u001b[39m\u001b[92m+ StatsBase v0.33.21\u001b[39m\n", + " \u001b[90m[4c63d2b9] \u001b[39m\u001b[92m+ StatsFuns v1.3.0\u001b[39m\n", + " \u001b[90m[efce3f68] \u001b[39m\u001b[92m+ WoodburyMatrices v0.5.6\u001b[39m\n", + " \u001b[90m[f5851436] \u001b[39m\u001b[92m+ FFTW_jll v3.3.10+0\u001b[39m\n", + " \u001b[90m[1d5cc7b8] \u001b[39m\u001b[92m+ IntelOpenMP_jll v2024.0.0+0\u001b[39m\n", + " \u001b[90m[856f044c] \u001b[39m\u001b[92m+ MKL_jll v2024.0.0+0\u001b[39m\n", + " \u001b[90m[efe28fd5] \u001b[39m\u001b[92m+ OpenSpecFun_jll v0.5.5+0\u001b[39m\n", + " \u001b[90m[f50d1b31] \u001b[39m\u001b[92m+ Rmath_jll v0.4.0+0\u001b[39m\n", + " \u001b[90m[9fa8497b] \u001b[39m\u001b[92m+ Future\u001b[39m\n", + " \u001b[90m[9abbd945] \u001b[39m\u001b[92m+ Profile\u001b[39m\n", + " \u001b[90m[1a1011a3] \u001b[39m\u001b[92m+ SharedArrays\u001b[39m\n", + " \u001b[90m[2f01184e] \u001b[39m\u001b[92m+ SparseArrays\u001b[39m\n", + " \u001b[90m[10745b16] \u001b[39m\u001b[92m+ Statistics v1.9.0\u001b[39m\n", + " \u001b[90m[4607b0f0] \u001b[39m\u001b[92m+ SuiteSparse\u001b[39m\n", + " \u001b[90m[05823500] \u001b[39m\u001b[92m+ OpenLibm_jll v0.8.1+0\u001b[39m\n", + " \u001b[90m[bea87d4a] \u001b[39m\u001b[92m+ SuiteSparse_jll v5.10.1+6\u001b[39m\n", + "\u001b[36m\u001b[1m Info\u001b[22m\u001b[39m Packages marked with \u001b[33m⌅\u001b[39m have new versions available but compatibility constraints restrict them from upgrading. To see why use `status --outdated -m`\n", + "\u001b[32m\u001b[1mPrecompiling\u001b[22m\u001b[39m project...\n", + "\u001b[32m ✓ \u001b[39m\u001b[90mSuiteSparse\u001b[39m\n", + "\u001b[32m ✓ \u001b[39m\u001b[90mReexport\u001b[39m\n", + "\u001b[32m ✓ \u001b[39m\u001b[90mIndirectArrays\u001b[39m\n", + "\u001b[32m ✓ \u001b[39m\u001b[90mOpenLibm_jll\u001b[39m\n", + "\u001b[32m ✓ \u001b[39m\u001b[90mStatsAPI\u001b[39m\n", + "\u001b[32m ✓ \u001b[39m\u001b[90mAdapt\u001b[39m\n", + "\u001b[32m ✓ \u001b[39m\u001b[90mHexagons\u001b[39m\n", + "\u001b[32m ✓ \u001b[39m\u001b[90mMeasures\u001b[39m\n", + "\u001b[32m ✓ \u001b[39m\u001b[90mWoodburyMatrices\u001b[39m\n", + "\u001b[32m ✓ \u001b[39m\u001b[90mDocStringExtensions\u001b[39m\n", + "\u001b[32m ✓ \u001b[39m\u001b[90mAbstractFFTs\u001b[39m\n", + "\u001b[32m ✓ \u001b[39m\u001b[90mStatistics\u001b[39m\n", + "\u001b[32m ✓ \u001b[39m\u001b[90mCalculus\u001b[39m\n", + "\u001b[32m ✓ \u001b[39m\u001b[90mIterTools\u001b[39m\n", + "\u001b[32m ✓ \u001b[39m\u001b[90mSuiteSparse_jll\u001b[39m\n", + "\u001b[32m ✓ \u001b[39m\u001b[90mContour\u001b[39m\n", + "\u001b[32m ✓ \u001b[39m\u001b[90mStaticArraysCore\u001b[39m\n", + "\u001b[32m ✓ \u001b[39m\u001b[90mRatios\u001b[39m\n", + "\u001b[32m ✓ \u001b[39m\u001b[90mMissings\u001b[39m\n", + "\u001b[32m ✓ \u001b[39m\u001b[90mIrrationalConstants\u001b[39m\n", + "\u001b[32m ✓ \u001b[39m\u001b[90mIntelOpenMP_jll\u001b[39m\n", + "\u001b[32m ✓ \u001b[39m\u001b[90mFillArrays\u001b[39m\n", + "\u001b[32m ✓ \u001b[39m\u001b[90mFFTW_jll\u001b[39m\n", + "\u001b[32m ✓ \u001b[39m\u001b[90mRmath_jll\u001b[39m\n", + "\u001b[32m ✓ \u001b[39m\u001b[90mOpenSpecFun_jll\u001b[39m\n", + "\u001b[32m ✓ \u001b[39m\u001b[90mGrisu\u001b[39m\n", + "\u001b[32m ✓ \u001b[39m\u001b[90mNaNMath\u001b[39m\n", + "\u001b[32m ✓ \u001b[39m\u001b[90mAxisAlgorithms\u001b[39m\n", + "\u001b[32m ✓ \u001b[39m\u001b[90mPDMats\u001b[39m\n", + "\u001b[32m ✓ \u001b[39m\u001b[90mFillArrays → FillArraysSparseArraysExt\u001b[39m\n", + "\u001b[32m ✓ \u001b[39m\u001b[90mLogExpFunctions\u001b[39m\n", + "\u001b[32m ✓ \u001b[39m\u001b[90mShowoff\u001b[39m\n", + "\u001b[32m ✓ \u001b[39m\u001b[90mChainRulesCore\u001b[39m\n", + "\u001b[32m ✓ \u001b[39m\u001b[90mDistances\u001b[39m\n", + "\u001b[32m ✓ \u001b[39m\u001b[90mOffsetArrays\u001b[39m\n", + "\u001b[32m ✓ \u001b[39m\u001b[90mRmath\u001b[39m\n", + "\u001b[32m ✓ \u001b[39m\u001b[90mAbstractFFTs → AbstractFFTsTestExt\u001b[39m\n", + "\u001b[32m ✓ \u001b[39m\u001b[90mDistances → DistancesSparseArraysExt\u001b[39m\n", + "\u001b[32m ✓ \u001b[39m\u001b[90mChainRulesCore → ChainRulesCoreSparseArraysExt\u001b[39m\n", + "\u001b[32m ✓ \u001b[39m\u001b[90mCategoricalArrays\u001b[39m\n", + "\u001b[32m ✓ \u001b[39m\u001b[90mFillArrays → FillArraysStatisticsExt\u001b[39m\n", + "\u001b[32m ✓ \u001b[39m\u001b[90mFillArrays → FillArraysPDMatsExt\u001b[39m\n", + "\u001b[32m ✓ \u001b[39m\u001b[90mDataStructures\u001b[39m\n", + "\u001b[32m ✓ \u001b[39m\u001b[90mDistances → DistancesChainRulesCoreExt\u001b[39m\n", + "\u001b[32m ✓ \u001b[39m\u001b[90mCategoricalArrays → CategoricalArraysJSONExt\u001b[39m\n", + "\u001b[32m ✓ \u001b[39m\u001b[90mMacroTools\u001b[39m\n", + "\u001b[32m ✓ \u001b[39m\u001b[90mLoess\u001b[39m\n", + "\u001b[32m ✓ \u001b[39m\u001b[90mSortingAlgorithms\u001b[39m\n", + "\u001b[32m ✓ \u001b[39m\u001b[90mAbstractFFTs → AbstractFFTsChainRulesCoreExt\u001b[39m\n", + "\u001b[32m ✓ \u001b[39m\u001b[90mMedia\u001b[39m\n", + "\u001b[32m ✓ \u001b[39m\u001b[90mLogExpFunctions → LogExpFunctionsChainRulesCoreExt\u001b[39m\n", + "\u001b[32m ✓ \u001b[39m\u001b[90mQuadGK\u001b[39m\n", + "\u001b[32m ✓ \u001b[39m\u001b[90mFixedPointNumbers\u001b[39m\n", + "\u001b[32m ✓ \u001b[39m\u001b[90mRatios → RatiosFixedPointNumbersExt\u001b[39m\n", + "\u001b[32m ✓ \u001b[39m\u001b[90mJuno\u001b[39m\n", + "\u001b[32m ✓ \u001b[39m\u001b[90mStatsBase\u001b[39m\n", + "\u001b[32m ✓ \u001b[39m\u001b[90mCoupledFields\u001b[39m\n", + "\u001b[32m ✓ \u001b[39m\u001b[90mColorTypes\u001b[39m\n", + "\u001b[32m ✓ \u001b[39m\u001b[90mSpecialFunctions\u001b[39m\n", + "\u001b[32m ✓ \u001b[39m\u001b[90mSpecialFunctions → SpecialFunctionsChainRulesCoreExt\u001b[39m\n", + "\u001b[32m ✓ \u001b[39m\u001b[90mDualNumbers\u001b[39m\n", + "\u001b[32m ✓ \u001b[39m\u001b[90mStaticArrays\u001b[39m\n", + "\u001b[32m ✓ \u001b[39m\u001b[90mHypergeometricFunctions\u001b[39m\n", + "\u001b[32m ✓ \u001b[39m\u001b[90mStaticArrays → StaticArraysStatisticsExt\u001b[39m\n", + "\u001b[32m ✓ \u001b[39m\u001b[90mAdapt → AdaptStaticArraysExt\u001b[39m\n", + "\u001b[32m ✓ \u001b[39m\u001b[90mStaticArrays → StaticArraysChainRulesCoreExt\u001b[39m\n", + "\u001b[32m ✓ \u001b[39m\u001b[90mColors\u001b[39m\n", + "\u001b[32m ✓ \u001b[39m\u001b[90mStatsFuns\u001b[39m\n", + "\u001b[32m ✓ \u001b[39m\u001b[90mStatsFuns → StatsFunsChainRulesCoreExt\u001b[39m\n", + "\u001b[32m ✓ \u001b[39m\u001b[90mInterpolations\u001b[39m\n", + "\u001b[32m ✓ \u001b[39m\u001b[90mCompose\u001b[39m\n", + "\u001b[32m ✓ \u001b[39m\u001b[90mDistributions\u001b[39m\n", + "\u001b[32m ✓ \u001b[39m\u001b[90mDistributions → DistributionsTestExt\u001b[39m\n", + "\u001b[32m ✓ \u001b[39m\u001b[90mDistributions → DistributionsChainRulesCoreExt\u001b[39m\n", + "\u001b[32m ✓ \u001b[39m\u001b[90mMKL_jll\u001b[39m\n", + "\u001b[32m ✓ \u001b[39m\u001b[90mFFTW\u001b[39m\n", + "\u001b[32m ✓ \u001b[39m\u001b[90mKernelDensity\u001b[39m\n", + "\u001b[32m ✓ \u001b[39mGadfly\n", + " 78 dependencies successfully precompiled in 33 seconds. 66 already precompiled.\n", + " \u001b[33m1\u001b[39m dependency had warnings during precompilation:\u001b[33m\n", + "┌ \u001b[39mMKL_jll [856f044c-d86e-5d09-b602-aeab76dc8ba7]\u001b[33m\n", + "│ \u001b[39m\u001b[32m\u001b[1m Downloading\u001b[22m\u001b[39m artifact: MKL\u001b[33m\n", + "└ \u001b[39m\n", + "\u001b[32m\u001b[1m Resolving\u001b[22m\u001b[39m package versions...\n", + "\u001b[32m\u001b[1m Installed\u001b[22m\u001b[39m InvertedIndices ──── v1.3.0\n", + "\u001b[32m\u001b[1m Installed\u001b[22m\u001b[39m InlineStrings ────── v1.4.0\n", + "\u001b[32m\u001b[1m Installed\u001b[22m\u001b[39m WeakRefStrings ───── v1.4.2\n", + "\u001b[32m\u001b[1m Installed\u001b[22m\u001b[39m SentinelArrays ───── v1.4.1\n", + "\u001b[32m\u001b[1m Installed\u001b[22m\u001b[39m WorkerUtilities ──── v1.6.1\n", + "\u001b[32m\u001b[1m Installed\u001b[22m\u001b[39m ExprTools ────────── v0.1.10\n", + "\u001b[32m\u001b[1m Installed\u001b[22m\u001b[39m FileIO ───────────── v1.16.1\n", + "\u001b[32m\u001b[1m Installed\u001b[22m\u001b[39m Crayons ──────────── v4.1.1\n", + "\u001b[32m\u001b[1m Installed\u001b[22m\u001b[39m PooledArrays ─────── v1.4.3\n", + "\u001b[32m\u001b[1m Installed\u001b[22m\u001b[39m RData ────────────── v0.8.3\n", + "\u001b[32m\u001b[1m Installed\u001b[22m\u001b[39m TimeZones ────────── v1.13.0\n", + "\u001b[32m\u001b[1m Installed\u001b[22m\u001b[39m DataFrames ───────── v1.6.1\n", + "\u001b[32m\u001b[1m Installed\u001b[22m\u001b[39m Mocking ──────────── v0.7.7\n", + "\u001b[32m\u001b[1m Installed\u001b[22m\u001b[39m LaTeXStrings ─────── v1.3.1\n", + "\u001b[32m\u001b[1m Installed\u001b[22m\u001b[39m TZJData ──────────── v1.0.0+2023c\n", + "\u001b[32m\u001b[1m Installed\u001b[22m\u001b[39m FilePathsBase ────── v0.9.21\n", + "\u001b[32m\u001b[1m Installed\u001b[22m\u001b[39m PrettyTables ─────── v2.3.1\n", + "\u001b[32m\u001b[1m Installed\u001b[22m\u001b[39m StringManipulation ─ v0.3.4\n", + "\u001b[32m\u001b[1m Installed\u001b[22m\u001b[39m CSV ──────────────── v0.10.11\n", + "\u001b[32m\u001b[1m Installed\u001b[22m\u001b[39m RDatasets ────────── v0.7.7\n", + "\u001b[32m\u001b[1m Updating\u001b[22m\u001b[39m `/opt/julia/environments/v1.9/Project.toml`\n", + " \u001b[90m[ce6b1742] \u001b[39m\u001b[92m+ RDatasets v0.7.7\u001b[39m\n", + "\u001b[32m\u001b[1m Updating\u001b[22m\u001b[39m `/opt/julia/environments/v1.9/Manifest.toml`\n", + " \u001b[90m[336ed68f] \u001b[39m\u001b[92m+ CSV v0.10.11\u001b[39m\n", + " \u001b[90m[a8cc5b0e] \u001b[39m\u001b[92m+ Crayons v4.1.1\u001b[39m\n", + " \u001b[90m[a93c6f00] \u001b[39m\u001b[92m+ DataFrames v1.6.1\u001b[39m\n", + " \u001b[90m[e2ba6199] \u001b[39m\u001b[92m+ ExprTools v0.1.10\u001b[39m\n", + " \u001b[90m[5789e2e9] \u001b[39m\u001b[92m+ FileIO v1.16.1\u001b[39m\n", + " \u001b[90m[48062228] \u001b[39m\u001b[92m+ FilePathsBase v0.9.21\u001b[39m\n", + " \u001b[90m[842dd82b] \u001b[39m\u001b[92m+ InlineStrings v1.4.0\u001b[39m\n", + " \u001b[90m[41ab1584] \u001b[39m\u001b[92m+ InvertedIndices v1.3.0\u001b[39m\n", + " \u001b[90m[b964fa9f] \u001b[39m\u001b[92m+ LaTeXStrings v1.3.1\u001b[39m\n", + " \u001b[90m[78c3b35d] \u001b[39m\u001b[92m+ Mocking v0.7.7\u001b[39m\n", + " \u001b[90m[2dfb63ee] \u001b[39m\u001b[92m+ PooledArrays v1.4.3\u001b[39m\n", + " \u001b[90m[08abe8d2] \u001b[39m\u001b[92m+ PrettyTables v2.3.1\u001b[39m\n", + "\u001b[33m⌅\u001b[39m \u001b[90m[df47a6cb] \u001b[39m\u001b[92m+ RData v0.8.3\u001b[39m\n", + " \u001b[90m[ce6b1742] \u001b[39m\u001b[92m+ RDatasets v0.7.7\u001b[39m\n", + " \u001b[90m[91c51154] \u001b[39m\u001b[92m+ SentinelArrays v1.4.1\u001b[39m\n", + " \u001b[90m[892a3eda] \u001b[39m\u001b[92m+ StringManipulation v0.3.4\u001b[39m\n", + " \u001b[90m[dc5dba14] \u001b[39m\u001b[92m+ TZJData v1.0.0+2023c\u001b[39m\n", + " \u001b[90m[f269a46b] \u001b[39m\u001b[92m+ TimeZones v1.13.0\u001b[39m\n", + " \u001b[90m[ea10d353] \u001b[39m\u001b[92m+ WeakRefStrings v1.4.2\u001b[39m\n", + " \u001b[90m[76eceee3] \u001b[39m\u001b[92m+ WorkerUtilities v1.6.1\u001b[39m\n", + "\u001b[36m\u001b[1m Info\u001b[22m\u001b[39m Packages marked with \u001b[33m⌅\u001b[39m have new versions available but compatibility constraints restrict them from upgrading. To see why use `status --outdated -m`\n", + "\u001b[32m\u001b[1mPrecompiling\u001b[22m\u001b[39m project...\n", + "\u001b[32m ✓ \u001b[39m\u001b[90mTZJData\u001b[39m\n", + "\u001b[32m ✓ \u001b[39m\u001b[90mLaTeXStrings\u001b[39m\n", + "\u001b[32m ✓ \u001b[39m\u001b[90mInvertedIndices\u001b[39m\n", + "\u001b[32m ✓ \u001b[39m\u001b[90mExprTools\u001b[39m\n", + "\u001b[32m ✓ \u001b[39m\u001b[90mWorkerUtilities\u001b[39m\n", + "\u001b[32m ✓ \u001b[39m\u001b[90mPooledArrays\u001b[39m\n", + "\u001b[32m ✓ \u001b[39m\u001b[90mInlineStrings\u001b[39m\n", + "\u001b[32m ✓ \u001b[39m\u001b[90mMocking\u001b[39m\n", + "\u001b[32m ✓ \u001b[39m\u001b[90mCrayons\u001b[39m\n", + "\u001b[32m ✓ \u001b[39m\u001b[90mFilePathsBase\u001b[39m\n", + "\u001b[32m ✓ \u001b[39m\u001b[90mSentinelArrays\u001b[39m\n", + "\u001b[32m ✓ \u001b[39m\u001b[90mWeakRefStrings\u001b[39m\n", + "\u001b[32m ✓ \u001b[39m\u001b[90mStringManipulation\u001b[39m\n", + "\u001b[32m ✓ \u001b[39m\u001b[90mCategoricalArrays → CategoricalArraysSentinelArraysExt\u001b[39m\n", + "\u001b[32m ✓ \u001b[39m\u001b[90mFileIO\u001b[39m\n", + "\u001b[32m ✓ \u001b[39mGadfly\n", + "\u001b[32m ✓ \u001b[39m\u001b[90mTimeZones\u001b[39m\n", + "\u001b[32m ✓ \u001b[39m\u001b[90mCSV\u001b[39m\n", + "\u001b[32m ✓ \u001b[39m\u001b[90mPrettyTables\u001b[39m\n", + "\u001b[32m ✓ \u001b[39m\u001b[90mDataFrames\u001b[39m\n", + "\u001b[32m ✓ \u001b[39m\u001b[90mRData\u001b[39m\n", + "\u001b[32m ✓ \u001b[39mRDatasets\n", + " 22 dependencies successfully precompiled in 68 seconds. 143 already precompiled.\n" + ] + } + ], "source": [ + "import Pkg; Pkg.add(\"Gadfly\"); Pkg.add(\"RDatasets\");\n", "using IJulia\n", "using Gadfly\n", "using RDatasets" @@ -72,15 +359,6 @@ "execution_count": 5, "metadata": {}, "outputs": [ - { - "name": "stderr", - "output_type": "stream", - "text": [ - "┌ Warning: `getindex(df::DataFrame, col_ind::ColumnIndex)` is deprecated, use `df[!, col_ind]` instead.\n", - "│ caller = evalmapping(::DataFrame, ::Symbol) at dataframes.jl:96\n", - "└ @ Gadfly /opt/julia/packages/Gadfly/1wgcD/src/dataframes.jl:96\n" - ] - }, { "data": { "image/svg+xml": [ @@ -100,15 +378,15 @@ " \n", " \n", "\n", - "\n", - " \n", + "\n", + " \n", " \n", " \n", " SepalLength\n", " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " 4\n", @@ -135,4328 +413,8617 @@ " \n", " \n", " \n", - " \n", - " \n", - " \n", + " \n", + " \n", + " \n", " \n", " setosa\n", " \n", " \n", - " \n", + " \n", " \n", " versicolor\n", " \n", " \n", - " \n", + " \n", " \n", " virginica\n", " \n", " \n", " \n", - " \n", - " \n", - " \n", + " \n", + " \n", + " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", " Species\n", " \n", " \n", " \n", " \n", - " \n", - " \n", - " \n", - " \n", - " \n", + " \n", + " \n", + " \n", + " \n", + " \n", " \n", " \n", - " \n", - " \n", - " \n", + " \n", + " \n", + " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", " \n", - " \n", - " \n", - " \n", + " \n", + " \n", + " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", + " \n", + " \n", + " \n", + " \n", + " \n", " \n", " \n", - " \n", - " \n", - " \n", - " \n", + " \n", + " \n", + " \n", + " 5.9,1.8\n", " \n", " \n", " \n", - " \n", - " \n", - " \n", - " \n", - " \n", + " \n", + " \n", + " \n", + " \n", + " \n", " \n", " \n", - " \n", - " \n", - " \n", - " \n", + " \n", + " \n", + " \n", + " 6.2,2.3\n", " \n", " \n", " \n", - " \n", - " \n", - " \n", - " \n", - " \n", + " \n", + " \n", + " \n", + " \n", + " \n", " \n", " \n", - " \n", - " \n", - " \n", - " \n", + " \n", + " \n", + " \n", + " 6.5,2.0\n", " \n", " \n", " \n", - " \n", - " \n", - " \n", - " \n", - " \n", + " \n", + " \n", + " \n", + " \n", + " \n", " \n", " \n", - " \n", - " \n", - " \n", - " \n", + " \n", + " \n", + " \n", + " 6.3,1.9\n", " \n", " \n", " \n", - " \n", - " \n", - " \n", - " \n", - " \n", + " \n", + " \n", + " \n", + " \n", + " \n", " \n", " \n", - " \n", - " \n", - " \n", - " \n", + " \n", + " \n", + " \n", + " 6.7,2.3\n", " \n", " \n", " \n", - " \n", - " \n", - " \n", - " \n", - " \n", + " \n", + " \n", + " \n", + " \n", + " \n", " \n", " \n", - " \n", - " \n", - " \n", - " \n", + " \n", + " \n", + " \n", + " 6.7,2.5\n", " \n", " \n", " \n", - " \n", - " \n", - " \n", - " \n", - " \n", + " \n", + " \n", + " \n", + " \n", + " \n", " \n", " \n", - " \n", - " \n", - " \n", - " \n", + " \n", + " \n", + " \n", + " 6.8,2.3\n", " \n", " \n", " \n", - " \n", - " \n", - " \n", - " \n", - " \n", + " \n", + " \n", + " \n", + " \n", + " \n", " \n", " \n", - " \n", - " \n", - " \n", - " \n", + " \n", + " \n", + " \n", + " 5.8,1.9\n", " \n", " \n", " \n", - " \n", - " \n", - " \n", - " \n", - " \n", + " \n", + " \n", + " \n", + " \n", + " \n", " \n", " \n", - " \n", - " \n", - " \n", - " \n", + " \n", + " \n", + " \n", + " 6.9,2.3\n", " \n", " \n", " \n", - " \n", - " \n", - " \n", - " \n", - " \n", + " \n", + " \n", + " \n", + " \n", + " \n", " \n", " \n", - " \n", - " \n", - " \n", - " \n", + " \n", + " \n", + " \n", + " 6.7,2.4\n", " \n", " \n", " \n", - " \n", - " \n", - " \n", - " \n", - " \n", + " \n", + " \n", + " \n", + " \n", + " \n", " \n", " \n", - " \n", - " \n", - " \n", - " \n", + " \n", + " \n", + " \n", + " 6.9,2.1\n", " \n", " \n", " \n", - " \n", - " \n", - " \n", - " \n", - " \n", + " \n", + " \n", + " \n", + " \n", + " \n", " \n", " \n", - " \n", - " \n", - " \n", - " \n", + " \n", + " \n", + " \n", + " 6.0,1.8\n", " \n", " \n", " \n", - " \n", - " \n", - " \n", - " \n", - " \n", + " \n", + " \n", + " \n", + " \n", + " \n", " \n", " \n", - " \n", - " \n", - " \n", - " \n", + " \n", + " \n", + " \n", + " 6.4,1.8\n", " \n", " \n", " \n", - " \n", - " \n", - " \n", - " \n", - " \n", + " \n", + " \n", + " \n", + " \n", + " \n", " \n", " \n", - " \n", - " \n", - " \n", - " \n", + " \n", + " \n", + " \n", + " 6.3,2.4\n", " \n", " \n", " \n", - " \n", - " \n", - " \n", - " \n", - " \n", + " \n", + " \n", + " \n", + " \n", + " \n", " \n", " \n", - " \n", - " \n", - " \n", - " \n", + " \n", + " \n", + " \n", + " 7.7,2.3\n", " \n", " \n", " \n", - " \n", - " \n", - " \n", - " \n", - " \n", + " \n", + " \n", + " \n", + " \n", + " \n", " \n", " \n", - " \n", - " \n", - " \n", - " \n", + " \n", + " \n", + " \n", + " 6.1,1.4\n", " \n", " \n", " \n", - " \n", - " \n", - " \n", - " \n", - " \n", + " \n", + " \n", + " \n", + " \n", + " \n", " \n", " \n", - " \n", - " \n", - " \n", - " \n", + " \n", + " \n", + " \n", + " 6.3,1.5\n", " \n", " \n", " \n", - " \n", - " \n", - " \n", - " \n", - " \n", + " \n", + " \n", + " \n", + " \n", + " \n", " \n", " \n", - " \n", - " \n", - " \n", - " \n", + " \n", + " \n", + " \n", + " 6.4,2.2\n", " \n", " \n", " \n", - " \n", - " \n", - " \n", - " \n", - " \n", + " \n", + " \n", + " \n", + " \n", + " \n", " \n", " \n", - " \n", - " \n", - " \n", - " \n", + " \n", + " \n", + " \n", + " 7.9,2.0\n", " \n", " \n", " \n", - " \n", - " \n", - " \n", - " \n", - " \n", + " \n", + " \n", + " \n", + " \n", + " \n", " \n", " \n", - " \n", - " \n", - " \n", - " \n", + " \n", + " \n", + " \n", + " 7.4,1.9\n", " \n", " \n", " \n", - " \n", - " \n", - " \n", - " \n", - " \n", + " \n", + " \n", + " \n", + " \n", + " \n", " \n", " \n", - " \n", - " \n", - " \n", - " \n", + " \n", + " \n", + " \n", + " 7.2,1.6\n", " \n", " \n", " \n", - " \n", - " \n", - " \n", - " \n", - " \n", + " \n", + " \n", + " \n", + " \n", + " \n", " \n", " \n", - " \n", - " \n", - " \n", - " \n", + " \n", + " \n", + " \n", + " 6.4,2.1\n", " \n", " \n", " \n", - " \n", - " \n", - " \n", - " \n", - " \n", + " \n", + " \n", + " \n", + " \n", + " \n", " \n", " \n", - " \n", - " \n", - " \n", - " \n", + " \n", + " \n", + " \n", + " 6.1,1.8\n", " \n", " \n", " \n", - " \n", - " \n", - " \n", - " \n", - " \n", + " \n", + " \n", + " \n", + " \n", + " \n", " \n", " \n", - " \n", - " \n", - " \n", - " \n", + " \n", + " \n", + " \n", + " 6.2,1.8\n", " \n", " \n", " \n", - " \n", - " \n", - " \n", - " \n", - " \n", + " \n", + " \n", + " \n", + " \n", + " \n", " \n", " \n", - " \n", - " \n", - " \n", - " \n", + " \n", + " \n", + " \n", + " 7.2,1.8\n", " \n", " \n", " \n", - " \n", - " \n", - " \n", - " \n", - " \n", + " \n", + " \n", + " \n", + " \n", + " \n", " \n", " \n", - " \n", - " \n", - " \n", - " \n", + " \n", + " \n", + " \n", + " 6.7,2.1\n", " \n", " \n", " \n", - " \n", - " \n", - " \n", - " \n", - " \n", + " \n", + " \n", + " \n", + " \n", + " \n", " \n", " \n", - " \n", - " \n", - " \n", - " \n", + " \n", + " \n", + " \n", + " 6.3,1.8\n", " \n", " \n", " \n", - " \n", - " \n", - " \n", - " \n", - " \n", + " \n", + " \n", + " \n", + " \n", + " \n", " \n", " \n", - " \n", - " \n", - " \n", - " \n", + " \n", + " \n", + " \n", + " 7.7,2.0\n", " \n", " \n", " \n", - " \n", - " \n", - " \n", - " \n", - " \n", + " \n", + " \n", + " \n", + " \n", + " \n", " \n", " \n", - " \n", - " \n", - " \n", - " \n", + " \n", + " \n", + " \n", + " 5.6,2.0\n", " \n", " \n", " \n", - " \n", - " \n", - " \n", - " \n", - " \n", + " \n", + " \n", + " \n", + " \n", + " \n", " \n", " \n", - " \n", - " \n", - " \n", - " \n", + " \n", + " \n", + " \n", + " 6.9,2.3\n", " \n", " \n", " \n", - " \n", - " \n", - " \n", - " \n", - " \n", + " \n", + " \n", + " \n", + " \n", + " \n", " \n", " \n", - " \n", - " \n", - " \n", - " \n", + " \n", + " \n", + " \n", + " 6.0,1.5\n", " \n", " \n", " \n", - " \n", - " \n", - " \n", - " \n", - " \n", + " \n", + " \n", + " \n", + " \n", + " \n", " \n", " \n", - " \n", - " \n", - " \n", - " \n", + " \n", + " \n", + " \n", + " 7.7,2.3\n", " \n", " \n", " \n", - " \n", - " \n", - " \n", - " \n", - " \n", + " \n", + " \n", + " \n", + " \n", + " \n", " \n", " \n", - " \n", - " \n", - " \n", - " \n", + " \n", + " \n", + " \n", + " 7.7,2.2\n", " \n", " \n", " \n", - " \n", - " \n", - " \n", - " \n", - " \n", + " \n", + " \n", + " \n", + " \n", + " \n", " \n", " \n", - " \n", - " \n", - " \n", - " \n", + " \n", + " \n", + " \n", + " 6.5,1.8\n", " \n", " \n", " \n", - " \n", - " \n", - " \n", - " \n", - " \n", + " \n", + " \n", + " \n", + " \n", + " \n", " \n", " \n", - " \n", - " \n", - " \n", - " \n", + " \n", + " \n", + " \n", + " 6.4,2.3\n", " \n", " \n", " \n", - " \n", - " \n", - " \n", - " \n", - " \n", + " \n", + " \n", + " \n", + " \n", + " \n", " \n", " \n", - " \n", - " \n", - " \n", - " \n", + " \n", + " \n", + " \n", + " 5.8,2.4\n", " \n", " \n", " \n", - " \n", - " \n", - " \n", - " \n", - " \n", + " \n", + " \n", + " \n", + " \n", + " \n", " \n", " \n", - " \n", - " \n", - " \n", - " \n", + " \n", + " \n", + " \n", + " 5.7,2.0\n", " \n", " \n", " \n", - " \n", - " \n", - " \n", - " \n", - " \n", + " \n", + " \n", + " \n", + " \n", + " \n", " \n", " \n", - " \n", - " \n", - " \n", - " \n", + " \n", + " \n", + " \n", + " 6.8,2.1\n", " \n", " \n", " \n", - " \n", - " \n", - " \n", - " \n", - " \n", + " \n", + " \n", + " \n", + " \n", + " \n", " \n", " \n", - " \n", - " \n", - " \n", - " \n", + " \n", + " \n", + " \n", + " 6.4,1.9\n", " \n", " \n", " \n", - " \n", - " \n", - " \n", - " \n", - " \n", + " \n", + " \n", + " \n", + " \n", + " \n", " \n", " \n", - " \n", - " \n", - " \n", - " \n", + " \n", + " \n", + " \n", + " 6.5,2.0\n", " \n", " \n", " \n", - " \n", - " \n", - " \n", - " \n", - " \n", + " \n", + " \n", + " \n", + " \n", + " \n", " \n", " \n", - " \n", - " \n", - " \n", - " \n", + " \n", + " \n", + " \n", + " 7.2,2.5\n", " \n", " \n", " \n", - " \n", - " \n", - " \n", - " \n", - " \n", + " \n", + " \n", + " \n", + " \n", + " \n", " \n", " \n", - " \n", - " \n", - " \n", - " \n", + " \n", + " \n", + " \n", + " 6.7,1.8\n", " \n", " \n", " \n", - " \n", - " \n", - " \n", - " \n", - " \n", + " \n", + " \n", + " \n", + " \n", + " \n", " \n", " \n", - " \n", - " \n", - " \n", - " \n", + " \n", + " \n", + " \n", + " 7.3,1.8\n", " \n", " \n", " \n", - " \n", - " \n", - " \n", - " \n", - " \n", + " \n", + " \n", + " \n", + " \n", + " \n", " \n", " \n", - " \n", - " \n", - " \n", - " \n", + " \n", + " \n", + " \n", + " 4.9,1.7\n", " \n", " \n", " \n", - " \n", - " \n", - " \n", - " \n", - " \n", + " \n", + " \n", + " \n", + " \n", + " \n", " \n", " \n", - " \n", - " \n", - " \n", - " \n", + " \n", + " \n", + " \n", + " 7.6,2.1\n", " \n", " \n", " \n", - " \n", - " \n", - " \n", - " \n", - " \n", + " \n", + " \n", + " \n", + " \n", + " \n", " \n", " \n", - " \n", - " \n", - " \n", - " \n", + " \n", + " \n", + " \n", + " 6.5,2.2\n", " \n", " \n", " \n", - " \n", - " \n", - " \n", - " \n", - " \n", + " \n", + " \n", + " \n", + " \n", + " \n", " \n", " \n", - " \n", - " \n", - " \n", - " \n", + " \n", + " \n", + " \n", + " 6.3,1.8\n", " \n", " \n", " \n", - " \n", - " \n", - " \n", - " \n", - " \n", + " \n", + " \n", + " \n", + " \n", + " \n", " \n", " \n", - " \n", - " \n", - " \n", - " \n", + " \n", + " \n", + " \n", + " 7.1,2.1\n", " \n", " \n", " \n", - " \n", - " \n", - " \n", - " \n", - " \n", + " \n", + " \n", + " \n", + " \n", + " \n", " \n", " \n", - " \n", - " \n", - " \n", - " \n", + " \n", + " \n", + " \n", + " 5.8,1.9\n", " \n", " \n", " \n", - " \n", - " \n", - " \n", - " \n", - " \n", + " \n", + " \n", + " \n", + " \n", + " \n", " \n", " \n", - " \n", - " \n", - " \n", - " \n", + " \n", + " \n", + " \n", + " 6.3,2.5\n", " \n", " \n", " \n", - " \n", - " \n", - " \n", - " \n", - " \n", + " \n", + " \n", + " \n", + " \n", + " \n", " \n", " \n", - " \n", - " \n", - " \n", - " \n", + " \n", + " \n", + " \n", + " 5.7,1.3\n", " \n", " \n", " \n", - " \n", - " \n", - " \n", - " \n", - " \n", + " \n", + " \n", + " \n", + " \n", + " \n", " \n", " \n", - " \n", - " \n", - " \n", - " \n", + " \n", + " \n", + " \n", + " 5.1,1.1\n", " \n", " \n", " \n", - " \n", - " \n", - " \n", - " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " 6.2,1.3\n", " \n", " \n", " \n", - " \n", - " \n", - " \n", - " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " 5.7,1.3\n", " \n", " \n", " \n", - " \n", - " \n", - " \n", - " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " 5.7,1.2\n", " \n", " \n", " \n", - " \n", - " \n", - " \n", - " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " 5.6,1.3\n", " \n", " \n", " \n", - " \n", - " \n", - " \n", - " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " 5.0,1.0\n", " \n", " \n", " \n", - " \n", - " \n", - " \n", - " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " 5.8,1.2\n", " \n", " \n", " \n", - " \n", - " \n", - " \n", - " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " 6.1,1.4\n", " \n", " \n", " \n", - " \n", - " \n", - " \n", - " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " 5.5,1.2\n", " \n", " \n", " \n", - " \n", - " \n", - " \n", - " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " 5.5,1.3\n", " \n", " \n", " \n", - " \n", - " \n", - " \n", - " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " 5.6,1.3\n", " \n", " \n", " \n", - " \n", - " \n", - " \n", - " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " 6.3,1.3\n", " \n", " \n", " \n", - " \n", - " \n", - " \n", - " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " 6.7,1.5\n", " \n", " \n", " \n", - " \n", - " \n", - " \n", - " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " 6.0,1.6\n", " \n", " \n", " \n", - " \n", - " \n", - " \n", - " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " 5.4,1.5\n", " \n", " \n", " \n", - " \n", - " \n", - " \n", - " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " 6.0,1.6\n", " \n", " \n", " \n", - " \n", - " \n", - " \n", - " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " 5.8,1.2\n", " \n", " \n", " \n", - " \n", - " \n", - " \n", - " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " 5.5,1.0\n", " \n", " \n", " \n", - " \n", - " \n", - " \n", - " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " 5.5,1.1\n", " \n", " \n", " \n", - " \n", - " \n", - " \n", - " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " 5.7,1.0\n", " \n", " \n", " \n", - " \n", - " \n", - " \n", - " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " 6.0,1.5\n", " \n", " \n", " \n", - " \n", - " \n", - " \n", - " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " 6.7,1.7\n", " \n", " \n", " \n", - " \n", - " \n", - " \n", - " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " 6.8,1.4\n", " \n", " \n", " \n", - " \n", - " \n", - " \n", - " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " 6.6,1.4\n", " \n", " \n", " \n", - " \n", - " \n", - " \n", - " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " 6.4,1.3\n", " \n", " \n", " \n", - " \n", - " \n", - " \n", - " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " 6.1,1.2\n", " \n", " \n", " \n", - " \n", - " \n", - " \n", - " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " 6.3,1.5\n", " \n", " \n", " \n", - " \n", - " \n", - " \n", - " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " 6.1,1.3\n", " \n", " \n", " \n", - " \n", - " \n", - " \n", - " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " 5.9,1.8\n", " \n", " \n", " \n", - " \n", - " \n", - " \n", - " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " 5.6,1.1\n", " \n", " \n", " \n", - " \n", - " \n", - " \n", - " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " 6.2,1.5\n", " \n", " \n", " \n", - " \n", - " \n", - " \n", - " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " 5.8,1.0\n", " \n", " \n", " \n", - " \n", - " \n", - " \n", - " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " 5.6,1.5\n", " \n", " \n", " \n", - " \n", - " \n", - " \n", - " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " 6.7,1.4\n", " \n", " \n", " \n", - " \n", - " \n", - " \n", - " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " 5.6,1.3\n", " \n", " \n", " \n", - " \n", - " \n", - " \n", - " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " 6.1,1.4\n", " \n", " \n", " \n", - " \n", - " \n", - " \n", - " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " 6.0,1.0\n", " \n", " \n", " \n", - " \n", - " \n", - " \n", - " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " 5.9,1.5\n", " \n", " \n", " \n", - " \n", - " \n", - " \n", - " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " 5.0,1.0\n", " \n", " \n", " \n", - " \n", - " \n", - " \n", - " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " 5.2,1.4\n", " \n", " \n", " \n", - " \n", - " \n", - " \n", - " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " 6.6,1.3\n", " \n", " \n", " \n", - " \n", - " \n", - " \n", - " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " 4.9,1.0\n", " \n", " \n", " \n", - " \n", - " \n", - " \n", - " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " 6.3,1.6\n", " \n", " \n", " \n", - " \n", - " \n", - " \n", - " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " 5.7,1.3\n", " \n", " \n", " \n", - " \n", - " \n", - " \n", - " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " 6.5,1.5\n", " \n", " \n", " \n", - " \n", - " \n", - " \n", - " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " 5.5,1.3\n", " \n", " \n", " \n", - " \n", - " \n", - " \n", - " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " 6.9,1.5\n", " \n", " \n", " \n", " \n", - " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " 6.4,1.5\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " 7.0,1.4\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " 5.0,0.2\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " 5.3,0.2\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " 4.6,0.2\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " 5.1,0.2\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " 4.8,0.3\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " 5.1,0.4\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " 5.0,0.6\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " 4.4,0.2\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " 4.5,0.3\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " 5.0,0.3\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " 5.1,0.2\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " 4.4,0.2\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " 4.9,0.1\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " 5.5,0.2\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " 5.0,0.2\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " 4.9,0.2\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " 5.5,0.2\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " 5.2,0.1\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " 5.4,0.4\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " 4.8,0.2\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " 4.7,0.2\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " 5.2,0.2\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " 5.2,0.2\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " 5.0,0.4\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " 5.0,0.2\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " 4.8,0.2\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " 5.1,0.5\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " 4.6,0.2\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " 5.1,0.4\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " 5.4,0.2\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " 5.1,0.3\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " 5.7,0.3\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " 5.1,0.3\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " 5.4,0.4\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " 5.7,0.4\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " 5.8,0.2\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " 4.3,0.1\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " 4.8,0.1\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " 4.8,0.2\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " 5.4,0.2\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " 4.9,0.1\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " 4.4,0.2\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " 5.0,0.2\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " 4.6,0.3\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " 5.4,0.4\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " 5.0,0.2\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " 4.6,0.2\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " 4.7,0.2\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " 4.9,0.2\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " 5.1,0.2\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " 0.0\n", + " \n", + " \n", + " \n", + " \n", + " 0.5\n", + " \n", + " \n", + " \n", + " \n", + " 1.0\n", + " \n", + " \n", + " \n", + " \n", + " 1.5\n", + " \n", + " \n", + " \n", + " \n", + " 2.0\n", + " \n", + " \n", + " \n", + " \n", + " 2.5\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " PetalWidth\n", + " \n", + " \n", + " \n", + "\n", + "\n", + " \n", + " \n", + " \n", + "\n", + "\n" + ], + "text/html": [ + "\n", + "\n", + "\n", + "\n", + " \n", + " \n", + " \n", + "\n", + "\n", + " \n", + " \n", + " \n", + " SepalLength\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " 4\n", + " \n", + " \n", + " \n", + " \n", + " 5\n", + " \n", + " \n", + " \n", + " \n", + " 6\n", + " \n", + " \n", + " \n", + " \n", + " 7\n", + " \n", + " \n", + " \n", + " \n", + " 8\n", + " \n", + " \n", + " \n", + " \n", + " 4.0\n", + " \n", + " \n", + " \n", + " \n", + " 4.2\n", + " \n", + " \n", + " \n", + " \n", + " 4.4\n", + " \n", + " \n", + " \n", + " \n", + " 4.6\n", + " \n", + " \n", + " \n", + " \n", + " 4.8\n", + " \n", + " \n", + " \n", + " \n", + " 5.0\n", + " \n", + " \n", + " \n", + " \n", + " 5.2\n", + " \n", + " \n", + " \n", + " \n", + " 5.4\n", + " \n", + " \n", + " \n", + " \n", + " 5.6\n", + " \n", + " \n", + " \n", + " \n", + " 5.8\n", + " \n", + " \n", + " \n", + " \n", + " 6.0\n", + " \n", + " \n", + " \n", + " \n", + " 6.2\n", + " \n", + " \n", + " \n", + " \n", + " 6.4\n", + " \n", + " \n", + " \n", + " \n", + " 6.6\n", + " \n", + " \n", + " \n", + " \n", + " 6.8\n", + " \n", + " \n", + " \n", + " \n", + " 7.0\n", + " \n", + " \n", + " \n", + " \n", + " 7.2\n", + " \n", + " \n", + " \n", + " \n", + " 7.4\n", + " \n", + " \n", + " \n", + " \n", + " 7.6\n", + " \n", + " \n", + " \n", + " \n", + " 7.8\n", + " \n", + " \n", + " \n", + " \n", + " 8.0\n", + " \n", + " \n", + " \n", + " \n", + " 3.98\n", + " \n", + " \n", + " \n", + " \n", + " 4.00\n", + " \n", + " \n", + " \n", + " \n", + " 4.02\n", + " \n", + " \n", + " \n", + " \n", + " 4.04\n", + " \n", + " \n", + " \n", + " \n", + " 4.06\n", + " \n", + " \n", + " \n", + " \n", + " 4.08\n", + " \n", + " \n", + " \n", + " \n", + " 4.10\n", + " \n", + " \n", + " \n", + " \n", + " 4.12\n", + " \n", + " \n", + " \n", + " \n", + " 4.14\n", + " \n", + " \n", + " \n", + " \n", + " 4.16\n", + " \n", + " \n", + " \n", + " \n", + " 4.18\n", + " \n", + " \n", + " \n", + " \n", + " 4.20\n", + " \n", + " \n", + " \n", + " \n", + " 4.22\n", + " \n", + " \n", + " \n", + " \n", + " 4.24\n", + " \n", + " \n", + " \n", + " \n", + " 4.26\n", + " \n", + " \n", + " \n", + " \n", + " 4.28\n", + " \n", + " \n", + " \n", + " \n", + " 4.30\n", + " \n", + " \n", + " \n", + " \n", + " 4.32\n", + " \n", + " \n", + " \n", + " \n", + " 4.34\n", + " \n", + " \n", + " \n", + " \n", + " 4.36\n", + " \n", + " \n", + " \n", + " \n", + " 4.38\n", + " \n", + " \n", + " \n", + " \n", + " 4.40\n", + " \n", + " \n", + " \n", + " \n", + " 4.42\n", + " \n", + " \n", + " \n", + " \n", + " 4.44\n", + " \n", + " \n", + " \n", + " \n", + " 4.46\n", + " \n", + " \n", + " \n", + " \n", + " 4.48\n", + " \n", + " \n", + " \n", + " \n", + " 4.50\n", + " \n", + " \n", + " \n", + " \n", + " 4.52\n", + " \n", + " \n", + " \n", + " \n", + " 4.54\n", + " \n", + " \n", + " \n", + " \n", + " 4.56\n", + " \n", + " \n", + " \n", + " \n", + " 4.58\n", + " \n", + " \n", + " \n", + " \n", + " 4.60\n", + " \n", + " \n", + " \n", + " \n", + " 4.62\n", + " \n", + " \n", + " \n", + " \n", + " 4.64\n", + " \n", + " \n", + " \n", + " \n", + " 4.66\n", + " \n", + " \n", + " \n", + " \n", + " 4.68\n", + " \n", + " \n", + " \n", + " \n", + " 4.70\n", + " \n", + " \n", + " \n", + " \n", + " 4.72\n", + " \n", + " \n", + " \n", + " \n", + " 4.74\n", + " \n", + " \n", + " \n", + " \n", + " 4.76\n", + " \n", + " \n", + " \n", + " \n", + " 4.78\n", + " \n", + " \n", + " \n", + " \n", + " 4.80\n", + " \n", + " \n", + " \n", + " \n", + " 4.82\n", + " \n", + " \n", + " \n", + " \n", + " 4.84\n", + " \n", + " \n", + " \n", + " \n", + " 4.86\n", + " \n", + " \n", + " \n", + " \n", + " 4.88\n", + " \n", + " \n", + " \n", + " \n", + " 4.90\n", + " \n", + " \n", + " \n", + " \n", + " 4.92\n", + " \n", + " \n", + " \n", + " \n", + " 4.94\n", + " \n", + " \n", + " \n", + " \n", + " 4.96\n", + " \n", + " \n", + " \n", + " \n", + " 4.98\n", + " \n", + " \n", + " \n", + " \n", + " 5.00\n", + " \n", + " \n", + " \n", + " \n", + " 5.02\n", + " \n", + " \n", + " \n", + " \n", + " 5.04\n", + " \n", + " \n", + " \n", + " \n", + " 5.06\n", + " \n", + " \n", + " \n", + " \n", + " 5.08\n", + " \n", + " \n", + " \n", + " \n", + " 5.10\n", + " \n", + " \n", + " \n", + " \n", + " 5.12\n", + " \n", + " \n", + " \n", + " \n", + " 5.14\n", + " \n", + " \n", + " \n", + " \n", + " 5.16\n", + " \n", + " \n", + " \n", + " \n", + " 5.18\n", + " \n", + " \n", + " \n", + " \n", + " 5.20\n", + " \n", + " \n", + " \n", + " \n", + " 5.22\n", + " \n", + " \n", + " \n", + " \n", + " 5.24\n", + " \n", + " \n", + " \n", + " \n", + " 5.26\n", + " \n", + " \n", + " \n", + " \n", + " 5.28\n", " \n", " \n", - " \n", - " \n", - " \n", + " \n", " \n", - " 0.0\n", + " 5.30\n", " \n", " \n", - " \n", + " \n", " \n", - " 0.5\n", + " 5.32\n", " \n", " \n", - " \n", + " \n", " \n", - " 1.0\n", + " 5.34\n", " \n", " \n", - " \n", + " \n", " \n", - " 1.5\n", + " 5.36\n", " \n", " \n", - " \n", + " \n", " \n", - " 2.0\n", + " 5.38\n", " \n", " \n", - " \n", + " \n", " \n", - " 2.5\n", + " 5.40\n", " \n", " \n", - " \n", - " \n", - " \n", + " \n", " \n", - " PetalWidth\n", + " 5.42\n", " \n", " \n", - " \n", - "\n", - "\n", - " \n", - " \n", - " \n", - "\n", - "\n" - ], - "text/html": [ - "\n", - "\n", - "\n", - " \n", - " \n", - " \n", - "\n", - "\n", - " \n", - " \n", + " \n", " \n", - " SepalLength\n", + " 5.44\n", " \n", " \n", - " \n", - " \n", - " \n", + " \n", " \n", - " -1\n", + " 5.46\n", " \n", " \n", - " \n", + " \n", " \n", - " 0\n", + " 5.48\n", " \n", " \n", - " \n", + " \n", " \n", - " 1\n", + " 5.50\n", " \n", " \n", - " \n", + " \n", " \n", - " 2\n", + " 5.52\n", " \n", " \n", - " \n", + " \n", " \n", - " 3\n", + " 5.54\n", " \n", " \n", - " \n", + " \n", " \n", - " 4\n", + " 5.56\n", " \n", " \n", - " \n", + " \n", " \n", - " 5\n", + " 5.58\n", " \n", " \n", - " \n", + " \n", " \n", - " 6\n", + " 5.60\n", " \n", " \n", - " \n", + " \n", " \n", - " 7\n", + " 5.62\n", " \n", " \n", - " \n", + " \n", " \n", - " 8\n", + " 5.64\n", " \n", " \n", - " \n", + " \n", " \n", - " 9\n", + " 5.66\n", " \n", " \n", - " \n", + " \n", " \n", - " 10\n", + " 5.68\n", " \n", " \n", - " \n", + " \n", " \n", - " 11\n", + " 5.70\n", " \n", " \n", - " \n", + " \n", " \n", - " 12\n", + " 5.72\n", " \n", " \n", - " \n", + " \n", " \n", - " 13\n", + " 5.74\n", " \n", " \n", - " \n", + " \n", " \n", - " 0.0\n", + " 5.76\n", " \n", " \n", - " \n", + " \n", " \n", - " 0.2\n", + " 5.78\n", " \n", " \n", - " \n", + " \n", " \n", - " 0.4\n", + " 5.80\n", " \n", " \n", - " \n", + " \n", " \n", - " 0.6\n", + " 5.82\n", " \n", " \n", - " \n", + " \n", " \n", - " 0.8\n", + " 5.84\n", " \n", " \n", - " \n", + " \n", " \n", - " 1.0\n", + " 5.86\n", " \n", " \n", - " \n", + " \n", " \n", - " 1.2\n", + " 5.88\n", " \n", " \n", - " \n", + " \n", " \n", - " 1.4\n", + " 5.90\n", " \n", " \n", - " \n", + " \n", " \n", - " 1.6\n", + " 5.92\n", " \n", " \n", - " \n", + " \n", " \n", - " 1.8\n", + " 5.94\n", " \n", " \n", - " \n", + " \n", " \n", - " 2.0\n", + " 5.96\n", " \n", " \n", - " \n", + " \n", " \n", - " 2.2\n", + " 5.98\n", " \n", " \n", - " \n", + " \n", " \n", - " 2.4\n", + " 6.00\n", " \n", " \n", - " \n", + " \n", " \n", - " 2.6\n", + " 6.02\n", " \n", " \n", - " \n", + " \n", " \n", - " 2.8\n", + " 6.04\n", " \n", " \n", - " \n", + " \n", " \n", - " 3.0\n", + " 6.06\n", " \n", " \n", - " \n", + " \n", " \n", - " 3.2\n", + " 6.08\n", " \n", " \n", - " \n", + " \n", " \n", - " 3.4\n", + " 6.10\n", " \n", " \n", - " \n", + " \n", " \n", - " 3.6\n", + " 6.12\n", " \n", " \n", - " \n", + " \n", " \n", - " 3.8\n", + " 6.14\n", " \n", " \n", - " \n", + " \n", " \n", - " 4.0\n", + " 6.16\n", " \n", " \n", - " \n", + " \n", " \n", - " 4.2\n", + " 6.18\n", " \n", " \n", - " \n", + " \n", " \n", - " 4.4\n", + " 6.20\n", " \n", " \n", - " \n", + " \n", " \n", - " 4.6\n", + " 6.22\n", " \n", " \n", - " \n", + " \n", " \n", - " 4.8\n", + " 6.24\n", " \n", " \n", - " \n", + " \n", " \n", - " 5.0\n", + " 6.26\n", " \n", " \n", - " \n", + " \n", " \n", - " 5.2\n", + " 6.28\n", " \n", " \n", - " \n", + " \n", " \n", - " 5.4\n", + " 6.30\n", " \n", " \n", - " \n", + " \n", " \n", - " 5.6\n", + " 6.32\n", " \n", " \n", - " \n", + " \n", " \n", - " 5.8\n", + " 6.34\n", " \n", " \n", - " \n", + " \n", " \n", - " 6.0\n", + " 6.36\n", " \n", " \n", - " \n", + " \n", " \n", - " 6.2\n", + " 6.38\n", " \n", " \n", - " \n", + " \n", " \n", - " 6.4\n", + " 6.40\n", " \n", " \n", - " \n", + " \n", " \n", - " 6.6\n", + " 6.42\n", " \n", " \n", - " \n", + " \n", " \n", - " 6.8\n", + " 6.44\n", " \n", " \n", - " \n", + " \n", " \n", - " 7.0\n", + " 6.46\n", " \n", " \n", - " \n", + " \n", " \n", - " 7.2\n", + " 6.48\n", " \n", " \n", - " \n", + " \n", " \n", - " 7.4\n", + " 6.50\n", " \n", " \n", - " \n", + " \n", " \n", - " 7.6\n", + " 6.52\n", " \n", " \n", - " \n", + " \n", " \n", - " 7.8\n", + " 6.54\n", " \n", " \n", - " \n", + " \n", " \n", - " 8.0\n", + " 6.56\n", " \n", " \n", - " \n", + " \n", " \n", - " 8.2\n", + " 6.58\n", " \n", " \n", - " \n", + " \n", " \n", - " 8.4\n", + " 6.60\n", " \n", " \n", - " \n", + " \n", " \n", - " 8.6\n", + " 6.62\n", " \n", " \n", - " \n", + " \n", " \n", - " 8.8\n", + " 6.64\n", " \n", " \n", - " \n", + " \n", " \n", - " 9.0\n", + " 6.66\n", " \n", " \n", - " \n", + " \n", " \n", - " 9.2\n", + " 6.68\n", " \n", " \n", - " \n", + " \n", " \n", - " 9.4\n", + " 6.70\n", " \n", " \n", - " \n", + " \n", " \n", - " 9.6\n", + " 6.72\n", " \n", " \n", - " \n", + " \n", " \n", - " 9.8\n", + " 6.74\n", " \n", " \n", - " \n", + " \n", " \n", - " 10.0\n", + " 6.76\n", " \n", " \n", - " \n", + " \n", " \n", - " 10.2\n", + " 6.78\n", " \n", " \n", - " \n", + " \n", " \n", - " 10.4\n", + " 6.80\n", " \n", " \n", - " \n", + " \n", " \n", - " 10.6\n", + " 6.82\n", " \n", " \n", - " \n", + " \n", " \n", - " 10.8\n", + " 6.84\n", " \n", " \n", - " \n", + " \n", " \n", - " 11.0\n", + " 6.86\n", " \n", " \n", - " \n", + " \n", " \n", - " 11.2\n", + " 6.88\n", " \n", " \n", - " \n", + " \n", " \n", - " 11.4\n", + " 6.90\n", " \n", " \n", - " \n", + " \n", " \n", - " 11.6\n", + " 6.92\n", " \n", " \n", - " \n", + " \n", " \n", - " 11.8\n", + " 6.94\n", " \n", " \n", - " \n", + " \n", " \n", - " 12.0\n", + " 6.96\n", " \n", " \n", - " \n", + " \n", " \n", - " 0\n", + " 6.98\n", " \n", " \n", - " \n", + " \n", " \n", - " 5\n", + " 7.00\n", " \n", " \n", - " \n", + " \n", " \n", - " 10\n", + " 7.02\n", " \n", " \n", - " \n", + " \n", " \n", - " 15\n", + " 7.04\n", " \n", " \n", - " \n", + " \n", " \n", - " 0.0\n", + " 7.06\n", " \n", " \n", - " \n", + " \n", " \n", - " 0.5\n", + " 7.08\n", " \n", " \n", - " \n", + " \n", " \n", - " 1.0\n", + " 7.10\n", " \n", " \n", - " \n", + " \n", " \n", - " 1.5\n", + " 7.12\n", " \n", " \n", - " \n", + " \n", " \n", - " 2.0\n", + " 7.14\n", " \n", " \n", - " \n", + " \n", " \n", - " 2.5\n", + " 7.16\n", " \n", " \n", - " \n", + " \n", " \n", - " 3.0\n", + " 7.18\n", " \n", " \n", - " \n", + " \n", " \n", - " 3.5\n", + " 7.20\n", " \n", " \n", - " \n", + " \n", " \n", - " 4.0\n", + " 7.22\n", " \n", " \n", - " \n", + " \n", " \n", - " 4.5\n", + " 7.24\n", " \n", " \n", - " \n", + " \n", " \n", - " 5.0\n", + " 7.26\n", " \n", " \n", - " \n", + " \n", " \n", - " 5.5\n", + " 7.28\n", " \n", " \n", - " \n", + " \n", " \n", - " 6.0\n", + " 7.30\n", " \n", " \n", - " \n", + " \n", " \n", - " 6.5\n", + " 7.32\n", " \n", " \n", - " \n", + " \n", " \n", - " 7.0\n", + " 7.34\n", " \n", " \n", - " \n", + " \n", " \n", - " 7.5\n", + " 7.36\n", " \n", " \n", - " \n", + " \n", " \n", - " 8.0\n", + " 7.38\n", + " \n", + " \n", + " \n", + " \n", + " 7.40\n", + " \n", + " \n", + " \n", + " \n", + " 7.42\n", + " \n", + " \n", + " \n", + " \n", + " 7.44\n", + " \n", + " \n", + " \n", + " \n", + " 7.46\n", + " \n", + " \n", + " \n", + " \n", + " 7.48\n", + " \n", + " \n", + " \n", + " \n", + " 7.50\n", + " \n", + " \n", + " \n", + " \n", + " 7.52\n", + " \n", + " \n", + " \n", + " \n", + " 7.54\n", + " \n", + " \n", + " \n", + " \n", + " 7.56\n", + " \n", + " \n", + " \n", + " \n", + " 7.58\n", + " \n", + " \n", + " \n", + " \n", + " 7.60\n", + " \n", + " \n", + " \n", + " \n", + " 7.62\n", + " \n", + " \n", + " \n", + " \n", + " 7.64\n", + " \n", + " \n", + " \n", + " \n", + " 7.66\n", + " \n", + " \n", + " \n", + " \n", + " 7.68\n", + " \n", + " \n", + " \n", + " \n", + " 7.70\n", + " \n", + " \n", + " \n", + " \n", + " 7.72\n", + " \n", + " \n", + " \n", + " \n", + " 7.74\n", + " \n", + " \n", + " \n", + " \n", + " 7.76\n", + " \n", + " \n", + " \n", + " \n", + " 7.78\n", " \n", " \n", - " \n", + " \n", " \n", - " 8.5\n", + " 7.80\n", " \n", " \n", - " \n", + " \n", " \n", - " 9.0\n", + " 7.82\n", " \n", " \n", - " \n", + " \n", " \n", - " 9.5\n", + " 7.84\n", " \n", " \n", - " \n", + " \n", " \n", - " 10.0\n", + " 7.86\n", " \n", " \n", - " \n", + " \n", " \n", - " 10.5\n", + " 7.88\n", " \n", " \n", - " \n", + " \n", " \n", - " 11.0\n", + " 7.90\n", " \n", " \n", - " \n", + " \n", " \n", - " 11.5\n", + " 7.92\n", " \n", " \n", - " \n", + " \n", " \n", - " 12.0\n", + " 7.94\n", + " \n", + " \n", + " \n", + " \n", + " 7.96\n", + " \n", + " \n", + " \n", + " \n", + " 7.98\n", + " \n", + " \n", + " \n", + " \n", + " 8.00\n", + " \n", + " \n", + " \n", + " \n", + " 4\n", + " \n", + " \n", + " \n", + " \n", + " 6\n", + " \n", + " \n", + " \n", + " \n", + " 8\n", " \n", " \n", " \n", - " \n", - " \n", - " \n", + " \n", + " \n", + " \n", " \n", " setosa\n", " \n", - " \n", - " \n", - " \n", - " versicolor\n", + " \n", + " \n", + " \n", + " versicolor\n", + " \n", + " \n", + " \n", + " \n", + " virginica\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " Species\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", " \n", - " \n", - " \n", - " \n", - " virginica\n", + " \n", + " \n", " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " Species\n", + " \n", + " \n", " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", + " \n", + " \n", " \n", - " \n", - " \n", - " \n", - " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", - " \n", - " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", " \n", " \n", - " \n", - " \n", - " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", - " \n", - " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " 5.9,1.8\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " 6.2,2.3\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " 6.5,2.0\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " 6.3,1.9\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " 6.7,2.3\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " 6.7,2.5\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " 6.8,2.3\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " 5.8,1.9\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " 6.9,2.3\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " 6.7,2.4\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " 6.9,2.1\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " 6.0,1.8\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " 6.4,1.8\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " 6.3,2.4\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " 7.7,2.3\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " 6.1,1.4\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " 6.3,1.5\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " 6.4,2.2\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " 7.9,2.0\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " 7.4,1.9\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " 7.2,1.6\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " 6.4,2.1\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " 6.1,1.8\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " 6.2,1.8\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " 7.2,1.8\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " 6.7,2.1\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " 6.3,1.8\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " 7.7,2.0\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " 5.6,2.0\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " 6.9,2.3\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " 6.0,1.5\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " 7.7,2.3\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " 7.7,2.2\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " 6.5,1.8\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " 6.4,2.3\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " 5.8,2.4\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " 5.7,2.0\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " 6.8,2.1\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " 6.4,1.9\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " 6.5,2.0\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " 7.2,2.5\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " 6.7,1.8\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " 7.3,1.8\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " 4.9,1.7\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " 7.6,2.1\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " 6.5,2.2\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " 6.3,1.8\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " 7.1,2.1\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " 5.8,1.9\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " 6.3,2.5\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " 5.7,1.3\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " 5.1,1.1\n", " \n", " \n", " \n", - " \n", - " \n", - " \n", - " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " 6.2,1.3\n", " \n", " \n", " \n", - " \n", - " \n", - " \n", - " \n", - " \n", + " \n", + " \n", + " \n", + " \n", + " \n", " \n", " \n", - " \n", - " \n", - " \n", - " \n", + " \n", + " \n", + " \n", + " 5.7,1.3\n", " \n", " \n", " \n", - " \n", - " \n", - " \n", - " \n", - " \n", + " \n", + " \n", + " \n", + " \n", + " \n", " \n", " \n", - " \n", - " \n", - " \n", - " \n", + " \n", + " \n", + " \n", + " 5.7,1.2\n", " \n", " \n", " \n", - " \n", - " \n", - " \n", - " \n", - " \n", + " \n", + " \n", + " \n", + " \n", + " \n", " \n", " \n", - " \n", - " \n", - " \n", - " \n", + " \n", + " \n", + " \n", + " 5.6,1.3\n", " \n", " \n", " \n", - " \n", - " \n", - " \n", - " \n", - " \n", + " \n", + " \n", + " \n", + " \n", + " \n", " \n", " \n", - " \n", - " \n", - " \n", - " \n", + " \n", + " \n", + " \n", + " 5.0,1.0\n", " \n", " \n", " \n", - " \n", - " \n", - " \n", - " \n", - " \n", + " \n", + " \n", + " \n", + " \n", + " \n", " \n", " \n", - " \n", - " \n", - " \n", - " \n", + " \n", + " \n", + " \n", + " 5.8,1.2\n", " \n", " \n", " \n", - " \n", - " \n", - " \n", - " \n", - " \n", + " \n", + " \n", + " \n", + " \n", + " \n", " \n", " \n", - " \n", - " \n", - " \n", - " \n", + " \n", + " \n", + " \n", + " 6.1,1.4\n", " \n", " \n", " \n", - " \n", - " \n", - " \n", - " \n", - " \n", + " \n", + " \n", + " \n", + " \n", + " \n", " \n", " \n", - " \n", - " \n", - " \n", - " \n", + " \n", + " \n", + " \n", + " 5.5,1.2\n", " \n", " \n", " \n", - " \n", - " \n", - " \n", - " \n", - " \n", + " \n", + " \n", + " \n", + " \n", + " \n", " \n", " \n", - " \n", - " \n", - " \n", - " \n", + " \n", + " \n", + " \n", + " 5.5,1.3\n", " \n", " \n", " \n", - " \n", - " \n", - " \n", - " \n", - " \n", + " \n", + " \n", + " \n", + " \n", + " \n", " \n", " \n", - " \n", - " \n", - " \n", - " \n", + " \n", + " \n", + " \n", + " 5.6,1.3\n", " \n", " \n", " \n", - " \n", - " \n", - " \n", - " \n", - " \n", + " \n", + " \n", + " \n", + " \n", + " \n", " \n", " \n", - " \n", - " \n", - " \n", - " \n", + " \n", + " \n", + " \n", + " 6.3,1.3\n", " \n", " \n", " \n", - " \n", - " \n", - " \n", - " \n", - " \n", + " \n", + " \n", + " \n", + " \n", + " \n", " \n", " \n", - " \n", - " \n", - " \n", - " \n", + " \n", + " \n", + " \n", + " 6.7,1.5\n", " \n", " \n", " \n", - " \n", - " \n", - " \n", - " \n", - " \n", + " \n", + " \n", + " \n", + " \n", + " \n", " \n", " \n", - " \n", - " \n", - " \n", - " \n", + " \n", + " \n", + " \n", + " 6.0,1.6\n", " \n", " \n", " \n", - " \n", - " \n", - " \n", - " \n", - " \n", + " \n", + " \n", + " \n", + " \n", + " \n", " \n", " \n", - " \n", - " \n", - " \n", - " \n", + " \n", + " \n", + " \n", + " 5.4,1.5\n", " \n", " \n", " \n", - " \n", - " \n", - " \n", - " \n", - " \n", + " \n", + " \n", + " \n", + " \n", + " \n", " \n", " \n", - " \n", - " \n", - " \n", - " \n", + " \n", + " \n", + " \n", + " 6.0,1.6\n", " \n", " \n", " \n", - " \n", - " \n", - " \n", - " \n", - " \n", + " \n", + " \n", + " \n", + " \n", + " \n", " \n", " \n", - " \n", - " \n", - " \n", - " \n", + " \n", + " \n", + " \n", + " 5.8,1.2\n", " \n", " \n", " \n", - " \n", - " \n", - " \n", - " \n", - " \n", + " \n", + " \n", + " \n", + " \n", + " \n", " \n", " \n", - " \n", - " \n", - " \n", - " \n", + " \n", + " \n", + " \n", + " 5.5,1.0\n", " \n", " \n", " \n", - " \n", - " \n", - " \n", - " \n", - " \n", + " \n", + " \n", + " \n", + " \n", + " \n", " \n", " \n", - " \n", - " \n", - " \n", - " \n", + " \n", + " \n", + " \n", + " 5.5,1.1\n", " \n", " \n", " \n", - " \n", - " \n", - " \n", - " \n", - " \n", + " \n", + " \n", + " \n", + " \n", + " \n", " \n", " \n", - " \n", - " \n", - " \n", - " \n", + " \n", + " \n", + " \n", + " 5.7,1.0\n", " \n", " \n", " \n", - " \n", - " \n", - " \n", - " \n", - " \n", + " \n", + " \n", + " \n", + " \n", + " \n", " \n", " \n", - " \n", - " \n", - " \n", - " \n", + " \n", + " \n", + " \n", + " 6.0,1.5\n", " \n", " \n", " \n", - " \n", - " \n", - " \n", - " \n", - " \n", + " \n", + " \n", + " \n", + " \n", + " \n", " \n", " \n", - " \n", - " \n", - " \n", - " \n", + " \n", + " \n", + " \n", + " 6.7,1.7\n", " \n", " \n", " \n", - " \n", - " \n", - " \n", - " \n", - " \n", + " \n", + " \n", + " \n", + " \n", + " \n", " \n", " \n", - " \n", - " \n", - " \n", - " \n", + " \n", + " \n", + " \n", + " 6.8,1.4\n", " \n", " \n", " \n", - " \n", - " \n", - " \n", - " \n", - " \n", + " \n", + " \n", + " \n", + " \n", + " \n", " \n", " \n", - " \n", - " \n", - " \n", - " \n", + " \n", + " \n", + " \n", + " 6.6,1.4\n", " \n", " \n", " \n", - " \n", - " \n", - " \n", - " \n", - " \n", + " \n", + " \n", + " \n", + " \n", + " \n", " \n", " \n", - " \n", - " \n", - " \n", - " \n", + " \n", + " \n", + " \n", + " 6.4,1.3\n", " \n", " \n", " \n", - " \n", - " \n", - " \n", - " \n", - " \n", + " \n", + " \n", + " \n", + " \n", + " \n", " \n", " \n", - " \n", - " \n", - " \n", - " \n", + " \n", + " \n", + " \n", + " 6.1,1.2\n", " \n", " \n", " \n", - " \n", - " \n", - " \n", - " \n", - " \n", + " \n", + " \n", + " \n", + " \n", + " \n", " \n", " \n", - " \n", - " \n", - " \n", - " \n", + " \n", + " \n", + " \n", + " 6.3,1.5\n", " \n", " \n", " \n", - " \n", - " \n", - " \n", - " \n", - " \n", + " \n", + " \n", + " \n", + " \n", + " \n", " \n", " \n", - " \n", - " \n", - " \n", - " \n", + " \n", + " \n", + " \n", + " 6.1,1.3\n", " \n", " \n", " \n", - " \n", - " \n", - " \n", - " \n", - " \n", + " \n", + " \n", + " \n", + " \n", + " \n", " \n", " \n", - " \n", - " \n", - " \n", - " \n", + " \n", + " \n", + " \n", + " 5.9,1.8\n", " \n", " \n", " \n", - " \n", - " \n", - " \n", - " \n", - " \n", + " \n", + " \n", + " \n", + " \n", + " \n", " \n", " \n", - " \n", - " \n", - " \n", - " \n", + " \n", + " \n", + " \n", + " 5.6,1.1\n", " \n", " \n", " \n", - " \n", - " \n", - " \n", - " \n", - " \n", + " \n", + " \n", + " \n", + " \n", + " \n", " \n", " \n", - " \n", - " \n", - " \n", - " \n", + " \n", + " \n", + " \n", + " 6.2,1.5\n", " \n", " \n", " \n", - " \n", - " \n", - " \n", - " \n", - " \n", + " \n", + " \n", + " \n", + " \n", + " \n", " \n", " \n", - " \n", - " \n", - " \n", - " \n", + " \n", + " \n", + " \n", + " 5.8,1.0\n", " \n", " \n", " \n", - " \n", - " \n", - " \n", - " \n", - " \n", + " \n", + " \n", + " \n", + " \n", + " \n", " \n", " \n", - " \n", - " \n", - " \n", - " \n", + " \n", + " \n", + " \n", + " 5.6,1.5\n", " \n", " \n", " \n", - " \n", - " \n", - " \n", - " \n", - " \n", + " \n", + " \n", + " \n", + " \n", + " \n", " \n", " \n", - " \n", - " \n", - " \n", - " \n", + " \n", + " \n", + " \n", + " 6.7,1.4\n", " \n", " \n", " \n", - " \n", - " \n", - " \n", - " \n", - " \n", + " \n", + " \n", + " \n", + " \n", + " \n", " \n", " \n", - " \n", - " \n", - " \n", - " \n", + " \n", + " \n", + " \n", + " 5.6,1.3\n", " \n", " \n", " \n", - " \n", - " \n", - " \n", - " \n", - " \n", + " \n", + " \n", + " \n", + " \n", + " \n", " \n", " \n", - " \n", - " \n", - " \n", - " \n", + " \n", + " \n", + " \n", + " 6.1,1.4\n", " \n", " \n", " \n", - " \n", - " \n", - " \n", - " \n", - " \n", + " \n", + " \n", + " \n", + " \n", + " \n", " \n", " \n", - " \n", - " \n", - " \n", - " \n", + " \n", + " \n", + " \n", + " 6.0,1.0\n", " \n", " \n", " \n", - " \n", - " \n", - " \n", - " \n", - " \n", + " \n", + " \n", + " \n", + " \n", + " \n", " \n", " \n", - " \n", - " \n", - " \n", - " \n", + " \n", + " \n", + " \n", + " 5.9,1.5\n", " \n", " \n", " \n", - " \n", - " \n", - " \n", - " \n", - " \n", + " \n", + " \n", + " \n", + " \n", + " \n", " \n", " \n", - " \n", - " \n", - " \n", - " \n", + " \n", + " \n", + " \n", + " 5.0,1.0\n", " \n", " \n", " \n", - " \n", - " \n", - " \n", - " \n", - " \n", + " \n", + " \n", + " \n", + " \n", + " \n", " \n", " \n", - " \n", - " \n", - " \n", - " \n", + " \n", + " \n", + " \n", + " 5.2,1.4\n", " \n", " \n", " \n", - " \n", - " \n", - " \n", - " \n", - " \n", + " \n", + " \n", + " \n", + " \n", + " \n", " \n", " \n", - " \n", - " \n", - " \n", - " \n", + " \n", + " \n", + " \n", + " 6.6,1.3\n", " \n", " \n", " \n", - " \n", - " \n", - " \n", - " \n", - " \n", + " \n", + " \n", + " \n", + " \n", + " \n", " \n", " \n", - " \n", - " \n", - " \n", - " \n", + " \n", + " \n", + " \n", + " 4.9,1.0\n", " \n", " \n", " \n", - " \n", - " \n", - " \n", - " \n", - " \n", + " \n", + " \n", + " \n", + " \n", + " \n", " \n", " \n", - " \n", - " \n", - " \n", - " \n", + " \n", + " \n", + " \n", + " 6.3,1.6\n", " \n", " \n", " \n", - " \n", - " \n", - " \n", - " \n", - " \n", + " \n", + " \n", + " \n", + " \n", + " \n", " \n", " \n", - " \n", - " \n", - " \n", - " \n", + " \n", + " \n", + " \n", + " 5.7,1.3\n", " \n", " \n", " \n", - " \n", - " \n", - " \n", - " \n", - " \n", + " \n", + " \n", + " \n", + " \n", + " \n", " \n", " \n", - " \n", - " \n", - " \n", - " \n", + " \n", + " \n", + " \n", + " 6.5,1.5\n", " \n", " \n", " \n", - " \n", - " \n", - " \n", - " \n", - " \n", + " \n", + " \n", + " \n", + " \n", + " \n", " \n", " \n", - " \n", - " \n", - " \n", - " \n", + " \n", + " \n", + " \n", + " 5.5,1.3\n", " \n", " \n", " \n", - " \n", - " \n", - " \n", - " \n", - " \n", + " \n", + " \n", + " \n", + " \n", + " \n", " \n", " \n", - " \n", - " \n", - " \n", - " \n", + " \n", + " \n", + " \n", + " 6.9,1.5\n", " \n", " \n", " \n", - " \n", - " \n", - " \n", - " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " 6.4,1.5\n", " \n", " \n", " \n", - " \n", - " \n", - " \n", - " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " 7.0,1.4\n", " \n", " \n", " \n", - " \n", - " \n", - " \n", - " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " 5.0,0.2\n", " \n", " \n", " \n", - " \n", - " \n", - " \n", - " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " 5.3,0.2\n", " \n", " \n", " \n", - " \n", - " \n", - " \n", - " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " 4.6,0.2\n", " \n", " \n", " \n", - " \n", - " \n", - " \n", - " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " 5.1,0.2\n", " \n", " \n", " \n", - " \n", - " \n", - " \n", - " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " 4.8,0.3\n", " \n", " \n", " \n", - " \n", - " \n", - " \n", - " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " 5.1,0.4\n", " \n", " \n", " \n", - " \n", - " \n", - " \n", - " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " 5.0,0.6\n", " \n", " \n", " \n", - " \n", - " \n", - " \n", - " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " 4.4,0.2\n", " \n", " \n", " \n", - " \n", - " \n", - " \n", - " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " 4.5,0.3\n", " \n", " \n", " \n", - " \n", - " \n", - " \n", - " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " 5.0,0.3\n", " \n", " \n", " \n", - " \n", - " \n", - " \n", - " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " 5.1,0.2\n", " \n", " \n", " \n", - " \n", - " \n", - " \n", - " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " 4.4,0.2\n", " \n", " \n", " \n", - " \n", - " \n", - " \n", - " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " 4.9,0.1\n", " \n", " \n", " \n", - " \n", - " \n", - " \n", - " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " 5.5,0.2\n", " \n", " \n", " \n", - " \n", - " \n", - " \n", - " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " 5.0,0.2\n", " \n", " \n", " \n", - " \n", - " \n", - " \n", - " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " 4.9,0.2\n", " \n", " \n", " \n", - " \n", - " \n", - " \n", - " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " 5.5,0.2\n", " \n", " \n", " \n", - " \n", - " \n", - " \n", - " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " 5.2,0.1\n", " \n", " \n", " \n", - " \n", - " \n", - " \n", - " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " 5.4,0.4\n", " \n", " \n", " \n", - " \n", - " \n", - " \n", - " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " 4.8,0.2\n", " \n", " \n", " \n", - " \n", - " \n", - " \n", - " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " 4.7,0.2\n", " \n", " \n", " \n", - " \n", - " \n", - " \n", - " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " 5.2,0.2\n", " \n", " \n", " \n", - " \n", - " \n", - " \n", - " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " 5.2,0.2\n", " \n", " \n", " \n", - " \n", - " \n", - " \n", - " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " 5.0,0.4\n", " \n", " \n", " \n", - " \n", - " \n", - " \n", - " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " 5.0,0.2\n", " \n", " \n", " \n", - " \n", - " \n", - " \n", - " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " 4.8,0.2\n", " \n", " \n", " \n", - " \n", - " \n", - " \n", - " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " 5.1,0.5\n", " \n", " \n", " \n", - " \n", - " \n", - " \n", - " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " 4.6,0.2\n", " \n", " \n", " \n", - " \n", - " \n", - " \n", - " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " 5.1,0.4\n", " \n", " \n", " \n", - " \n", - " \n", - " \n", - " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " 5.4,0.2\n", " \n", " \n", " \n", - " \n", - " \n", - " \n", - " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " 5.1,0.3\n", " \n", " \n", " \n", - " \n", - " \n", - " \n", - " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " 5.7,0.3\n", " \n", " \n", " \n", - " \n", - " \n", - " \n", - " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " 5.1,0.3\n", " \n", " \n", " \n", - " \n", - " \n", - " \n", - " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " 5.4,0.4\n", " \n", " \n", " \n", - " \n", - " \n", - " \n", - " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " 5.7,0.4\n", " \n", " \n", " \n", - " \n", - " \n", - " \n", - " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " 5.8,0.2\n", " \n", " \n", " \n", - " \n", - " \n", - " \n", - " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " 4.3,0.1\n", " \n", " \n", " \n", - " \n", - " \n", - " \n", - " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " 4.8,0.1\n", " \n", " \n", " \n", - " \n", - " \n", - " \n", - " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " 4.8,0.2\n", " \n", " \n", " \n", - " \n", - " \n", - " \n", - " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " 5.4,0.2\n", " \n", " \n", " \n", - " \n", - " \n", - " \n", - " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " 4.9,0.1\n", " \n", " \n", " \n", - " \n", - " \n", - " \n", - " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " 4.4,0.2\n", " \n", " \n", " \n", - " \n", - " \n", - " \n", - " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " 5.0,0.2\n", " \n", " \n", " \n", - " \n", - " \n", - " \n", - " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " 4.6,0.3\n", " \n", " \n", " \n", - " \n", - " \n", - " \n", - " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " 5.4,0.4\n", " \n", " \n", " \n", - " \n", - " \n", - " \n", - " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " 5.0,0.2\n", " \n", " \n", " \n", - " \n", - " \n", - " \n", - " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " 4.6,0.2\n", " \n", " \n", " \n", - " \n", - " \n", - " \n", - " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " 4.7,0.2\n", " \n", " \n", " \n", - " \n", - " \n", - " \n", - " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " 4.9,0.2\n", " \n", " \n", " \n", - " \n", - " \n", - " \n", - " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " 5.1,0.2\n", " \n", " \n", " \n", - " \n", - " \n", - " \n", - " \n", - " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " h,j,k,l,arrows,drag to pan\n", " \n", " \n", - " \n", - " \n", - " \n", - " \n", - " \n", + " \n", + " \n", + " i,o,+,-,scroll,shift-drag to zoom\n", " \n", " \n", - " \n", - " \n", - " \n", - " \n", - " \n", + " \n", + " \n", + " r,dbl-click to reset\n", " \n", " \n", - " \n", - " \n", - " \n", - " \n", - " \n", + " \n", + " \n", + " c for coordinates\n", " \n", " \n", - " \n", - " \n", - " \n", - " \n", - " \n", + " \n", + " \n", + " ? for help\n", " \n", " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " ?\n", " \n", " \n", " \n", " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " 0.0\n", + " \n", + " \n", + " \n", + " \n", + " 0.5\n", + " \n", + " \n", + " \n", + " \n", + " 1.0\n", + " \n", + " \n", + " \n", + " \n", + " 1.5\n", + " \n", + " \n", + " \n", + " \n", + " 2.0\n", + " \n", + " \n", + " \n", + " \n", + " 2.5\n", + " \n", + " \n", + " \n", + " \n", + " 0.0\n", + " \n", + " \n", + " \n", + " \n", + " 0.1\n", + " \n", + " \n", + " \n", + " \n", + " 0.2\n", + " \n", + " \n", + " \n", + " \n", + " 0.3\n", + " \n", + " \n", + " \n", + " \n", + " 0.4\n", + " \n", + " \n", + " \n", + " \n", + " 0.5\n", + " \n", + " \n", + " \n", + " \n", + " 0.6\n", + " \n", + " \n", + " \n", + " \n", + " 0.7\n", + " \n", + " \n", + " \n", + " \n", + " 0.8\n", + " \n", + " \n", + " \n", + " \n", + " 0.9\n", + " \n", + " \n", + " \n", + " \n", + " 1.0\n", + " \n", + " \n", + " \n", + " \n", + " 1.1\n", + " \n", + " \n", + " \n", + " \n", + " 1.2\n", + " \n", + " \n", + " \n", + " \n", + " 1.3\n", + " \n", + " \n", + " \n", + " \n", + " 1.4\n", + " \n", + " \n", + " \n", + " \n", + " 1.5\n", + " \n", + " \n", + " \n", + " \n", + " 1.6\n", + " \n", + " \n", + " \n", + " \n", + " 1.7\n", + " \n", + " \n", + " \n", + " \n", + " 1.8\n", + " \n", + " \n", + " \n", + " \n", + " 1.9\n", + " \n", + " \n", + " \n", + " \n", + " 2.0\n", + " \n", + " \n", + " \n", + " \n", + " 2.1\n", + " \n", + " \n", + " \n", + " \n", + " 2.2\n", + " \n", + " \n", + " \n", + " \n", + " 2.3\n", + " \n", + " \n", + " \n", + " \n", + " 2.4\n", + " \n", + " \n", + " \n", + " \n", + " 2.5\n", + " \n", + " \n", + " \n", + " \n", + " 0.00\n", + " \n", + " \n", + " \n", + " \n", + " 0.01\n", + " \n", + " \n", + " \n", + " \n", + " 0.02\n", + " \n", + " \n", + " \n", + " \n", + " 0.03\n", + " \n", + " \n", + " \n", + " \n", + " 0.04\n", + " \n", + " \n", + " \n", + " \n", + " 0.05\n", + " \n", + " \n", + " \n", + " \n", + " 0.06\n", + " \n", + " \n", + " \n", + " \n", + " 0.07\n", + " \n", + " \n", + " \n", + " \n", + " 0.08\n", + " \n", + " \n", + " \n", + " \n", + " 0.09\n", + " \n", + " \n", + " \n", + " \n", + " 0.10\n", + " \n", + " \n", + " \n", + " \n", + " 0.11\n", + " \n", + " \n", + " \n", + " \n", + " 0.12\n", + " \n", + " \n", + " \n", + " \n", + " 0.13\n", + " \n", + " \n", + " \n", + " \n", + " 0.14\n", + " \n", + " \n", + " \n", + " \n", + " 0.15\n", + " \n", + " \n", + " \n", + " \n", + " 0.16\n", + " \n", + " \n", + " \n", + " \n", + " 0.17\n", + " \n", + " \n", + " \n", + " \n", + " 0.18\n", + " \n", + " \n", + " \n", + " \n", + " 0.19\n", + " \n", + " \n", + " \n", + " \n", + " 0.20\n", + " \n", + " \n", + " \n", + " \n", + " 0.21\n", + " \n", + " \n", + " \n", + " \n", + " 0.22\n", + " \n", + " \n", + " \n", + " \n", + " 0.23\n", + " \n", + " \n", + " \n", + " \n", + " 0.24\n", + " \n", + " \n", + " \n", + " \n", + " 0.25\n", + " \n", + " \n", + " \n", + " \n", + " 0.26\n", + " \n", + " \n", + " \n", + " \n", + " 0.27\n", + " \n", + " \n", + " \n", + " \n", + " 0.28\n", + " \n", + " \n", + " \n", + " \n", + " 0.29\n", + " \n", + " \n", + " \n", + " \n", + " 0.30\n", + " \n", + " \n", + " \n", + " \n", + " 0.31\n", + " \n", + " \n", + " \n", + " \n", + " 0.32\n", + " \n", + " \n", + " \n", + " \n", + " 0.33\n", + " \n", + " \n", + " \n", + " \n", + " 0.34\n", " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " h,j,k,l,arrows,drag to pan\n", - " \n", - " \n", - " \n", - " \n", - " i,o,+,-,scroll,shift-drag to zoom\n", - " \n", - " \n", - " \n", - " \n", - " r,dbl-click to reset\n", - " \n", - " \n", - " \n", - " \n", - " c for coordinates\n", - " \n", - " \n", - " \n", - " \n", - " ? for help\n", - " \n", - " \n", - " \n", - " \n", + " \n", + " \n", + " \n", + " 0.35\n", + " \n", + " \n", + " \n", + " \n", + " 0.36\n", + " \n", + " \n", + " \n", + " \n", + " 0.37\n", + " \n", + " \n", + " \n", + " \n", + " 0.38\n", + " \n", + " \n", + " \n", + " \n", + " 0.39\n", + " \n", + " \n", + " \n", + " \n", + " 0.40\n", + " \n", + " \n", + " \n", + " \n", + " 0.41\n", + " \n", + " \n", + " \n", + " \n", + " 0.42\n", + " \n", + " \n", + " \n", + " \n", + " 0.43\n", + " \n", + " \n", + " \n", + " \n", + " 0.44\n", + " \n", + " \n", + " \n", + " \n", + " 0.45\n", + " \n", + " \n", + " \n", + " \n", + " 0.46\n", + " \n", + " \n", + " \n", + " \n", + " 0.47\n", + " \n", + " \n", + " \n", + " \n", + " 0.48\n", + " \n", + " \n", + " \n", + " \n", + " 0.49\n", + " \n", + " \n", + " \n", + " \n", + " 0.50\n", + " \n", + " \n", + " \n", + " \n", + " 0.51\n", + " \n", + " \n", + " \n", + " \n", + " 0.52\n", + " \n", + " \n", + " \n", + " \n", + " 0.53\n", + " \n", + " \n", + " \n", + " \n", + " 0.54\n", + " \n", + " \n", + " \n", + " \n", + " 0.55\n", + " \n", + " \n", + " \n", + " \n", + " 0.56\n", + " \n", + " \n", + " \n", + " \n", + " 0.57\n", + " \n", + " \n", + " \n", + " \n", + " 0.58\n", + " \n", + " \n", + " \n", + " \n", + " 0.59\n", + " \n", + " \n", + " \n", + " \n", + " 0.60\n", + " \n", + " \n", + " \n", + " \n", + " 0.61\n", + " \n", + " \n", + " \n", + " \n", + " 0.62\n", + " \n", + " \n", + " \n", + " \n", + " 0.63\n", + " \n", + " \n", + " \n", + " \n", + " 0.64\n", + " \n", + " \n", + " \n", + " \n", + " 0.65\n", + " \n", + " \n", + " \n", + " \n", + " 0.66\n", + " \n", + " \n", + " \n", + " \n", + " 0.67\n", + " \n", + " \n", + " \n", + " \n", + " 0.68\n", + " \n", + " \n", + " \n", + " \n", + " 0.69\n", + " \n", + " \n", + " \n", + " \n", + " 0.70\n", + " \n", + " \n", + " \n", + " \n", + " 0.71\n", + " \n", + " \n", + " \n", + " \n", + " 0.72\n", + " \n", + " \n", + " \n", + " \n", + " 0.73\n", + " \n", + " \n", + " \n", + " \n", + " 0.74\n", + " \n", + " \n", + " \n", + " \n", + " 0.75\n", + " \n", + " \n", + " \n", + " \n", + " 0.76\n", + " \n", + " \n", + " \n", + " \n", + " 0.77\n", + " \n", + " \n", + " \n", + " \n", + " 0.78\n", + " \n", + " \n", + " \n", + " \n", + " 0.79\n", + " \n", + " \n", + " \n", + " \n", + " 0.80\n", + " \n", + " \n", + " \n", + " \n", + " 0.81\n", + " \n", + " \n", + " \n", + " \n", + " 0.82\n", + " \n", + " \n", + " \n", + " \n", + " 0.83\n", + " \n", + " \n", + " \n", + " \n", + " 0.84\n", + " \n", + " \n", + " \n", + " \n", + " 0.85\n", + " \n", + " \n", + " \n", + " \n", + " 0.86\n", + " \n", + " \n", + " \n", + " \n", + " 0.87\n", + " \n", + " \n", + " \n", + " \n", + " 0.88\n", + " \n", + " \n", + " \n", + " \n", + " 0.89\n", + " \n", + " \n", + " \n", + " \n", + " 0.90\n", + " \n", + " \n", + " \n", + " \n", + " 0.91\n", + " \n", + " \n", + " \n", + " \n", + " 0.92\n", + " \n", + " \n", + " \n", + " \n", + " 0.93\n", + " \n", + " \n", + " \n", + " \n", + " 0.94\n", + " \n", + " \n", + " \n", + " \n", + " 0.95\n", + " \n", + " \n", + " \n", + " \n", + " 0.96\n", + " \n", + " \n", + " \n", + " \n", + " 0.97\n", + " \n", + " \n", + " \n", + " \n", + " 0.98\n", + " \n", + " \n", + " \n", + " \n", + " 0.99\n", + " \n", + " \n", + " \n", + " \n", + " 1.00\n", + " \n", + " \n", + " \n", + " \n", + " 1.01\n", + " \n", + " \n", + " \n", + " \n", + " 1.02\n", + " \n", + " \n", + " \n", + " \n", + " 1.03\n", + " \n", + " \n", + " \n", + " \n", + " 1.04\n", + " \n", + " \n", + " \n", + " \n", + " 1.05\n", + " \n", + " \n", + " \n", + " \n", + " 1.06\n", + " \n", + " \n", + " \n", + " \n", + " 1.07\n", + " \n", + " \n", + " \n", + " \n", + " 1.08\n", + " \n", + " \n", + " \n", + " \n", + " 1.09\n", + " \n", + " \n", + " \n", + " \n", + " 1.10\n", " \n", - " \n", - " \n", - " \n", - " \n", - " ?\n", - " \n", - " \n", - " \n", + " \n", + " \n", + " \n", + " 1.11\n", " \n", " \n", - " \n", - " \n", - " \n", + " \n", " \n", - " -3.0\n", + " 1.12\n", " \n", " \n", - " \n", + " \n", " \n", - " -2.5\n", + " 1.13\n", " \n", " \n", - " \n", + " \n", " \n", - " -2.0\n", + " 1.14\n", " \n", " \n", - " \n", + " \n", " \n", - " -1.5\n", + " 1.15\n", " \n", " \n", - " \n", + " \n", " \n", - " -1.0\n", + " 1.16\n", " \n", " \n", - " \n", + " \n", " \n", - " -0.5\n", + " 1.17\n", " \n", " \n", - " \n", + " \n", " \n", - " 0.0\n", + " 1.18\n", " \n", " \n", - " \n", + " \n", " \n", - " 0.5\n", + " 1.19\n", " \n", " \n", - " \n", + " \n", " \n", - " 1.0\n", + " 1.20\n", " \n", " \n", - " \n", + " \n", " \n", - " 1.5\n", + " 1.21\n", " \n", " \n", - " \n", + " \n", " \n", - " 2.0\n", + " 1.22\n", " \n", " \n", - " \n", + " \n", " \n", - " 2.5\n", + " 1.23\n", " \n", " \n", - " \n", + " \n", " \n", - " 3.0\n", + " 1.24\n", " \n", " \n", - " \n", + " \n", " \n", - " 3.5\n", + " 1.25\n", " \n", " \n", - " \n", + " \n", " \n", - " 4.0\n", + " 1.26\n", " \n", " \n", - " \n", + " \n", " \n", - " 4.5\n", + " 1.27\n", " \n", " \n", - " \n", + " \n", " \n", - " 5.0\n", + " 1.28\n", " \n", " \n", - " \n", + " \n", " \n", - " 5.5\n", + " 1.29\n", " \n", " \n", - " \n", + " \n", " \n", - " -2.5\n", + " 1.30\n", " \n", " \n", - " \n", + " \n", " \n", - " -2.4\n", + " 1.31\n", " \n", " \n", - " \n", + " \n", " \n", - " -2.3\n", + " 1.32\n", " \n", " \n", - " \n", + " \n", " \n", - " -2.2\n", + " 1.33\n", " \n", " \n", - " \n", + " \n", " \n", - " -2.1\n", + " 1.34\n", " \n", " \n", - " \n", + " \n", " \n", - " -2.0\n", + " 1.35\n", " \n", " \n", - " \n", + " \n", " \n", - " -1.9\n", + " 1.36\n", " \n", " \n", - " \n", + " \n", " \n", - " -1.8\n", + " 1.37\n", " \n", " \n", - " \n", + " \n", " \n", - " -1.7\n", + " 1.38\n", " \n", " \n", - " \n", + " \n", " \n", - " -1.6\n", + " 1.39\n", " \n", " \n", - " \n", + " \n", " \n", - " -1.5\n", + " 1.40\n", " \n", " \n", - " \n", + " \n", " \n", - " -1.4\n", + " 1.41\n", " \n", " \n", - " \n", + " \n", " \n", - " -1.3\n", + " 1.42\n", " \n", " \n", - " \n", + " \n", " \n", - " -1.2\n", + " 1.43\n", " \n", " \n", - " \n", + " \n", " \n", - " -1.1\n", + " 1.44\n", " \n", " \n", - " \n", + " \n", " \n", - " -1.0\n", + " 1.45\n", " \n", " \n", - " \n", + " \n", " \n", - " -0.9\n", + " 1.46\n", " \n", " \n", - " \n", + " \n", " \n", - " -0.8\n", + " 1.47\n", " \n", " \n", - " \n", + " \n", " \n", - " -0.7\n", + " 1.48\n", " \n", " \n", - " \n", + " \n", " \n", - " -0.6\n", + " 1.49\n", " \n", " \n", - " \n", + " \n", " \n", - " -0.5\n", + " 1.50\n", " \n", " \n", - " \n", + " \n", " \n", - " -0.4\n", + " 1.51\n", " \n", " \n", - " \n", + " \n", " \n", - " -0.3\n", + " 1.52\n", " \n", " \n", - " \n", + " \n", " \n", - " -0.2\n", + " 1.53\n", " \n", " \n", - " \n", + " \n", " \n", - " -0.1\n", + " 1.54\n", " \n", " \n", - " \n", + " \n", " \n", - " 0.0\n", + " 1.55\n", " \n", " \n", - " \n", + " \n", " \n", - " 0.1\n", + " 1.56\n", " \n", " \n", - " \n", + " \n", " \n", - " 0.2\n", + " 1.57\n", " \n", " \n", - " \n", + " \n", " \n", - " 0.3\n", + " 1.58\n", " \n", " \n", - " \n", + " \n", " \n", - " 0.4\n", + " 1.59\n", " \n", " \n", - " \n", + " \n", " \n", - " 0.5\n", + " 1.60\n", " \n", " \n", - " \n", + " \n", " \n", - " 0.6\n", + " 1.61\n", " \n", " \n", - " \n", + " \n", " \n", - " 0.7\n", + " 1.62\n", " \n", " \n", - " \n", + " \n", " \n", - " 0.8\n", + " 1.63\n", " \n", " \n", - " \n", + " \n", " \n", - " 0.9\n", + " 1.64\n", " \n", " \n", - " \n", + " \n", " \n", - " 1.0\n", + " 1.65\n", " \n", " \n", - " \n", + " \n", " \n", - " 1.1\n", + " 1.66\n", " \n", " \n", - " \n", + " \n", " \n", - " 1.2\n", + " 1.67\n", " \n", " \n", - " \n", + " \n", " \n", - " 1.3\n", + " 1.68\n", " \n", " \n", - " \n", + " \n", " \n", - " 1.4\n", + " 1.69\n", " \n", " \n", - " \n", + " \n", " \n", - " 1.5\n", + " 1.70\n", " \n", " \n", - " \n", + " \n", " \n", - " 1.6\n", + " 1.71\n", " \n", " \n", - " \n", + " \n", " \n", - " 1.7\n", + " 1.72\n", " \n", " \n", - " \n", + " \n", " \n", - " 1.8\n", + " 1.73\n", " \n", " \n", - " \n", + " \n", " \n", - " 1.9\n", + " 1.74\n", " \n", " \n", - " \n", + " \n", " \n", - " 2.0\n", + " 1.75\n", " \n", " \n", - " \n", + " \n", " \n", - " 2.1\n", + " 1.76\n", " \n", " \n", - " \n", + " \n", " \n", - " 2.2\n", + " 1.77\n", " \n", " \n", - " \n", + " \n", " \n", - " 2.3\n", + " 1.78\n", " \n", " \n", - " \n", + " \n", " \n", - " 2.4\n", + " 1.79\n", " \n", " \n", - " \n", + " \n", " \n", - " 2.5\n", + " 1.80\n", " \n", " \n", - " \n", + " \n", " \n", - " 2.6\n", + " 1.81\n", " \n", " \n", - " \n", + " \n", " \n", - " 2.7\n", + " 1.82\n", " \n", " \n", - " \n", + " \n", " \n", - " 2.8\n", + " 1.83\n", " \n", " \n", - " \n", + " \n", " \n", - " 2.9\n", + " 1.84\n", " \n", " \n", - " \n", + " \n", " \n", - " 3.0\n", + " 1.85\n", " \n", " \n", - " \n", + " \n", " \n", - " 3.1\n", + " 1.86\n", " \n", " \n", - " \n", + " \n", " \n", - " 3.2\n", + " 1.87\n", " \n", " \n", - " \n", + " \n", " \n", - " 3.3\n", + " 1.88\n", " \n", " \n", - " \n", + " \n", " \n", - " 3.4\n", + " 1.89\n", " \n", " \n", - " \n", + " \n", " \n", - " 3.5\n", + " 1.90\n", " \n", " \n", - " \n", + " \n", " \n", - " 3.6\n", + " 1.91\n", " \n", " \n", - " \n", + " \n", " \n", - " 3.7\n", + " 1.92\n", " \n", " \n", - " \n", + " \n", " \n", - " 3.8\n", + " 1.93\n", " \n", " \n", - " \n", + " \n", " \n", - " 3.9\n", + " 1.94\n", " \n", " \n", - " \n", + " \n", " \n", - " 4.0\n", + " 1.95\n", " \n", " \n", - " \n", + " \n", " \n", - " 4.1\n", + " 1.96\n", " \n", " \n", - " \n", + " \n", " \n", - " 4.2\n", + " 1.97\n", " \n", " \n", - " \n", + " \n", " \n", - " 4.3\n", + " 1.98\n", " \n", " \n", - " \n", + " \n", " \n", - " 4.4\n", + " 1.99\n", " \n", " \n", - " \n", + " \n", " \n", - " 4.5\n", + " 2.00\n", " \n", " \n", - " \n", + " \n", " \n", - " 4.6\n", + " 2.01\n", " \n", " \n", - " \n", + " \n", " \n", - " 4.7\n", + " 2.02\n", " \n", " \n", - " \n", + " \n", " \n", - " 4.8\n", + " 2.03\n", " \n", " \n", - " \n", + " \n", " \n", - " 4.9\n", + " 2.04\n", " \n", " \n", - " \n", + " \n", " \n", - " 5.0\n", + " 2.05\n", " \n", " \n", - " \n", + " \n", " \n", - " -2.5\n", + " 2.06\n", " \n", " \n", - " \n", + " \n", " \n", - " 0.0\n", + " 2.07\n", " \n", " \n", - " \n", + " \n", " \n", - " 2.5\n", + " 2.08\n", " \n", " \n", - " \n", + " \n", " \n", - " 5.0\n", + " 2.09\n", " \n", " \n", - " \n", + " \n", " \n", - " -2.6\n", + " 2.10\n", " \n", " \n", - " \n", + " \n", " \n", - " -2.4\n", + " 2.11\n", " \n", " \n", - " \n", + " \n", " \n", - " -2.2\n", + " 2.12\n", " \n", " \n", - " \n", + " \n", " \n", - " -2.0\n", + " 2.13\n", " \n", " \n", - " \n", + " \n", " \n", - " -1.8\n", + " 2.14\n", " \n", " \n", - " \n", + " \n", " \n", - " -1.6\n", + " 2.15\n", " \n", " \n", - " \n", + " \n", " \n", - " -1.4\n", + " 2.16\n", " \n", " \n", - " \n", + " \n", " \n", - " -1.2\n", + " 2.17\n", " \n", " \n", - " \n", + " \n", " \n", - " -1.0\n", + " 2.18\n", " \n", " \n", - " \n", + " \n", " \n", - " -0.8\n", + " 2.19\n", " \n", " \n", - " \n", + " \n", " \n", - " -0.6\n", + " 2.20\n", " \n", " \n", - " \n", + " \n", " \n", - " -0.4\n", + " 2.21\n", " \n", " \n", - " \n", + " \n", " \n", - " -0.2\n", + " 2.22\n", " \n", " \n", - " \n", + " \n", " \n", - " 0.0\n", + " 2.23\n", " \n", " \n", - " \n", + " \n", " \n", - " 0.2\n", + " 2.24\n", " \n", " \n", - " \n", + " \n", " \n", - " 0.4\n", + " 2.25\n", " \n", " \n", - " \n", + " \n", " \n", - " 0.6\n", + " 2.26\n", " \n", " \n", - " \n", + " \n", " \n", - " 0.8\n", + " 2.27\n", " \n", " \n", - " \n", + " \n", " \n", - " 1.0\n", + " 2.28\n", " \n", " \n", - " \n", + " \n", " \n", - " 1.2\n", + " 2.29\n", " \n", " \n", - " \n", + " \n", " \n", - " 1.4\n", + " 2.30\n", " \n", " \n", - " \n", + " \n", " \n", - " 1.6\n", + " 2.31\n", " \n", " \n", - " \n", + " \n", " \n", - " 1.8\n", + " 2.32\n", " \n", " \n", - " \n", + " \n", " \n", - " 2.0\n", + " 2.33\n", " \n", " \n", - " \n", + " \n", " \n", - " 2.2\n", + " 2.34\n", " \n", " \n", - " \n", + " \n", " \n", - " 2.4\n", + " 2.35\n", + " \n", + " \n", + " \n", + " \n", + " 2.36\n", + " \n", + " \n", + " \n", + " \n", + " 2.37\n", + " \n", + " \n", + " \n", + " \n", + " 2.38\n", + " \n", + " \n", + " \n", + " \n", + " 2.39\n", " \n", " \n", - " \n", + " \n", " \n", - " 2.6\n", + " 2.40\n", " \n", " \n", - " \n", + " \n", " \n", - " 2.8\n", + " 2.41\n", " \n", " \n", - " \n", + " \n", " \n", - " 3.0\n", + " 2.42\n", " \n", " \n", - " \n", + " \n", " \n", - " 3.2\n", + " 2.43\n", " \n", " \n", - " \n", + " \n", " \n", - " 3.4\n", + " 2.44\n", " \n", " \n", - " \n", + " \n", " \n", - " 3.6\n", + " 2.45\n", " \n", " \n", - " \n", + " \n", " \n", - " 3.8\n", + " 2.46\n", " \n", " \n", - " \n", + " \n", " \n", - " 4.0\n", + " 2.47\n", " \n", " \n", - " \n", + " \n", " \n", - " 4.2\n", + " 2.48\n", " \n", " \n", - " \n", + " \n", " \n", - " 4.4\n", + " 2.49\n", " \n", " \n", - " \n", + " \n", " \n", - " 4.6\n", + " 2.50\n", " \n", " \n", - " \n", + " \n", " \n", - " 4.8\n", + " 0.0\n", " \n", " \n", - " \n", + " \n", " \n", - " 5.0\n", + " 2.5\n", " \n", " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", " PetalWidth\n", " \n", @@ -4464,8 +9031,8 @@ " \n", "\n", "\n", - " \n", - " \n", + " \n", + " \n", " \n", "\n", "\n", - "\n" + "\n", + "\n", + "\n" ], "text/plain": [ "Plot(...)" @@ -5653,45 +11028,40 @@ "metadata": {}, "outputs": [ { - "name": "stdout", + "name": "stderr", "output_type": "stream", "text": [ - "\u001b[32m\u001b[1m Updating\u001b[22m\u001b[39m registry at `/opt/julia/registries/General`\n", - "\u001b[32m\u001b[1m Updating\u001b[22m\u001b[39m git-repo `https://github.com/JuliaRegistries/General.git`\n", - "\u001b[?25l\u001b[2K\u001b[?25h\u001b[32m\u001b[1m Resolving\u001b[22m\u001b[39m package versions...\n", - "\u001b[32m\u001b[1m Updating\u001b[22m\u001b[39m `/opt/julia/environments/v1.1/Project.toml`\n", - "\u001b[90m [no changes]\u001b[39m\n", - "\u001b[32m\u001b[1m Updating\u001b[22m\u001b[39m `/opt/julia/environments/v1.1/Manifest.toml`\n", - "\u001b[90m [no changes]\u001b[39m\n" + "\u001b[32m\u001b[1m Resolving\u001b[22m\u001b[39m package versions...\n", + "\u001b[32m\u001b[1m Installed\u001b[22m\u001b[39m PyCall ─ v1.96.3\n", + "\u001b[32m\u001b[1m Updating\u001b[22m\u001b[39m `/opt/julia/environments/v1.9/Project.toml`\n", + " \u001b[90m[438e738f] \u001b[39m\u001b[92m+ PyCall v1.96.3\u001b[39m\n", + "\u001b[32m\u001b[1m Updating\u001b[22m\u001b[39m `/opt/julia/environments/v1.9/Manifest.toml`\n", + " \u001b[90m[438e738f] \u001b[39m\u001b[92m+ PyCall v1.96.3\u001b[39m\n", + "\u001b[32m\u001b[1m Building\u001b[22m\u001b[39m PyCall → `/opt/julia/scratchspaces/44cfe95a-1eb2-52ea-b672-e2afdf69b78f/c9932f1c60d2e653df4f06d76108af8fde2200c0/build.log`\n", + "\u001b[32m\u001b[1mPrecompiling\u001b[22m\u001b[39m project...\n", + "\u001b[32m ✓ \u001b[39mPyCall\n", + " 1 dependency successfully precompiled in 11 seconds. 165 already precompiled.\n" ] } ], "source": [ "# Install if not already done\n", - "import Pkg; Pkg.add(\"PyCall\")" - ] - }, - { - "cell_type": "code", - "execution_count": 7, - "metadata": {}, - "outputs": [], - "source": [ + "import Pkg; Pkg.add(\"PyCall\");\n", "using PyCall" ] }, { "cell_type": "code", - "execution_count": 8, + "execution_count": 7, "metadata": {}, "outputs": [ { "data": { "text/plain": [ - "PyObject " + "PyObject " ] }, - "execution_count": 8, + "execution_count": 7, "metadata": {}, "output_type": "execute_result" } @@ -5702,7 +11072,7 @@ }, { "cell_type": "code", - "execution_count": 9, + "execution_count": 8, "metadata": {}, "outputs": [ { @@ -5726,15 +11096,15 @@ ], "metadata": { "kernelspec": { - "display_name": "Julia 1.1.0", + "display_name": "Julia 1.9.1", "language": "julia", - "name": "julia-1.1" + "name": "julia-1.9" }, "language_info": { "file_extension": ".jl", "mimetype": "application/julia", "name": "julia", - "version": "1.1.0" + "version": "1.9.1" } }, "nbformat": 4, diff --git a/extra/Getting_Started/JupyterBasics.ipynb b/extra/Getting_Started/JupyterBasics.ipynb index 52b7f35..48844b3 100755 --- a/extra/Getting_Started/JupyterBasics.ipynb +++ b/extra/Getting_Started/JupyterBasics.ipynb @@ -58,6 +58,7 @@ "SVG": "Other", "bash": "Other", "capture": "ExecutionMagics", + "code_wrap": "ExecutionMagics", "debug": "ExecutionMagics", "file": "Other", "html": "DisplayMagics", @@ -92,6 +93,7 @@ "cat": "Other", "cd": "OSMagics", "clear": "KernelMagics", + "code_wrap": "ExecutionMagics", "colors": "BasicMagics", "conda": "PackagingMagics", "config": "ConfigMagics", @@ -126,8 +128,10 @@ "lx": "Other", "macro": "ExecutionMagics", "magic": "BasicMagics", + "mamba": "PackagingMagics", "man": "KernelMagics", "matplotlib": "PylabMagics", + "micromamba": "PackagingMagics", "mkdir": "Other", "more": "KernelMagics", "mv": "Other", @@ -183,10 +187,10 @@ }, "text/plain": [ "Available line magics:\n", - "%alias %alias_magic %autoawait %autocall %automagic %autosave %bookmark %cat %cd %clear %colors %conda %config %connect_info %cp %debug %dhist %dirs %doctest_mode %ed %edit %env %gui %hist %history %killbgscripts %ldir %less %lf %lk %ll %load %load_ext %loadpy %logoff %logon %logstart %logstate %logstop %ls %lsmagic %lx %macro %magic %man %matplotlib %mkdir %more %mv %notebook %page %pastebin %pdb %pdef %pdoc %pfile %pinfo %pinfo2 %pip %popd %pprint %precision %prun %psearch %psource %pushd %pwd %pycat %pylab %qtconsole %quickref %recall %rehashx %reload_ext %rep %rerun %reset %reset_selective %rm %rmdir %run %save %sc %set_env %store %sx %system %tb %time %timeit %unalias %unload_ext %who %who_ls %whos %xdel %xmode\n", + "%alias %alias_magic %autoawait %autocall %automagic %autosave %bookmark %cat %cd %clear %code_wrap %colors %conda %config %connect_info %cp %debug %dhist %dirs %doctest_mode %ed %edit %env %gui %hist %history %killbgscripts %ldir %less %lf %lk %ll %load %load_ext %loadpy %logoff %logon %logstart %logstate %logstop %ls %lsmagic %lx %macro %magic %mamba %man %matplotlib %micromamba %mkdir %more %mv %notebook %page %pastebin %pdb %pdef %pdoc %pfile %pinfo %pinfo2 %pip %popd %pprint %precision %prun %psearch %psource %pushd %pwd %pycat %pylab %qtconsole %quickref %recall %rehashx %reload_ext %rep %rerun %reset %reset_selective %rm %rmdir %run %save %sc %set_env %store %sx %system %tb %time %timeit %unalias %unload_ext %who %who_ls %whos %xdel %xmode\n", "\n", "Available cell magics:\n", - "%%! %%HTML %%SVG %%bash %%capture %%debug %%file %%html %%javascript %%js %%latex %%markdown %%perl %%prun %%pypy %%python %%python2 %%python3 %%ruby %%script %%sh %%svg %%sx %%system %%time %%timeit %%writefile\n", + "%%! %%HTML %%SVG %%bash %%capture %%code_wrap %%debug %%file %%html %%javascript %%js %%latex %%markdown %%perl %%prun %%pypy %%python %%python2 %%python3 %%ruby %%script %%sh %%svg %%sx %%system %%time %%timeit %%writefile\n", "\n", "Automagic is ON, % prefix IS NOT needed for line magics." ] @@ -220,7 +224,7 @@ "name": "stdout", "output_type": "stream", "text": [ - "1.03 ms ± 4.93 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)\n" + "453 µs ± 9.64 µs per loop (mean ± std. dev. of 7 runs, 1,000 loops each)\n" ] } ], @@ -271,11 +275,11 @@ "name": "stdout", "output_type": "stream", "text": [ - "-rw-r--r-- 1 jovyan users 0 Dec 19 08:44 string_0\n", - "-rw-r--r-- 1 jovyan users 0 Dec 19 08:44 string_1\n", - "-rw-r--r-- 1 jovyan users 0 Dec 19 08:44 string_2\n", - "-rw-r--r-- 1 jovyan users 0 Dec 19 08:44 string_3\n", - "-rw-r--r-- 1 jovyan users 0 Dec 19 08:44 string_4\n" + "-rw-rw-r-- 1 jovyan jovyan 0 Dec 14 17:17 string_0\n", + "-rw-rw-r-- 1 jovyan jovyan 0 Dec 14 17:17 string_1\n", + "-rw-rw-r-- 1 jovyan jovyan 0 Dec 14 17:17 string_2\n", + "-rw-rw-r-- 1 jovyan jovyan 0 Dec 14 17:17 string_3\n", + "-rw-rw-r-- 1 jovyan jovyan 0 Dec 14 17:17 string_4\n" ] } ], @@ -315,7 +319,7 @@ ], "metadata": { "kernelspec": { - "display_name": "Python 3", + "display_name": "Python 3 (ipykernel)", "language": "python", "name": "python3" }, @@ -329,7 +333,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.7.3" + "version": "3.11.6" } }, "nbformat": 4, diff --git a/extra/Getting_Started/MultiInterpreterNotebook.ipynb b/extra/Getting_Started/MultiInterpreterNotebook.ipynb index ed97de3..ebd03f2 100755 --- a/extra/Getting_Started/MultiInterpreterNotebook.ipynb +++ b/extra/Getting_Started/MultiInterpreterNotebook.ipynb @@ -18,7 +18,7 @@ "name": "stdout", "output_type": "stream", "text": [ - "Last run: 2019-12-19 09:09:24.610738 UTC\n" + "Last run: 2023-12-14 17:17:31.662735 UTC\n" ] } ], @@ -89,16 +89,18 @@ "metadata": {}, "outputs": [ { - "name": "stderr", + "name": "stdout", "output_type": "stream", "text": [ - "/opt/conda/lib/python3.7/site-packages/rpy2/robjects/pandas2ri.py:191: FutureWarning: from_items is deprecated. Please use DataFrame.from_dict(dict(items), ...) instead. DataFrame.from_dict(OrderedDict(items)) may be used to preserve the key order.\n", - " res = PandasDataFrame.from_items(items)\n" + "`geom_smooth()` using formula = 'y ~ x'\n" ] }, { "data": { - "image/png": "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JpPn6uu0krJYrnLUgD1fkWQA2w8jSFBwbx0CADDeJD07tuSO041yMEunOVbLb0qKgj5Ryy90rrld+nKXcOhrrr0NKKWZWWr1RHn2vFHeesU4GH9CkgQMRCGIP6ickD5WZGaUVIgPNjZ/5fb4Dlo4clte7k8L86TQESkmSd65871z5wOlwBhE0ScSiR7UT0hSof9BiqKYlZX15ZdfJno5CJIAhqCcFi5caHy+rVu3Gr8IMkLMspo3VZUf8Hi/cnt6GRsrChfZrDYu6pRu9CORIYL6CUlCqqqqVFUF/MtERhlDUE7btm0buXUgycNks2myGU2YkhE0f0KSE0znIaOKISinrCxsb4MgCQaDT0iSgwYHSNozBOXU2dk5cutAECR6UD8hyQ8GopB0BSvEESRVQf2EpAoYiELSiTiV9La3txNChtHnDkGQ8KDjDpJCVPqR6LUgyDCJU8yptrYWAL744ov4TIfEFg9jx7xyD6VjRKFMFCM/AYk7WDyOpBwYiIoJJuyqHndioJwURXn33Xc///xzh8OhaVrAWcZYa2urbkbAo9NPqtGoqP/d0vZWV4+rv6vdJJN0b2H+VVnocpl0YPIOSVGwImrYTJo0KdFLGI0YVU41NTWrVq06duxYNIOXLl1qcDoknux1e248ebpNHaCGD3rlW+sadjizHy8two50SQjqJySlwUAUkvwYUk5tbW3Lly9vbm4OP4wQMmbMmBUrVqxdu9bIdEg8aVO1m07WB8gmYAAEAOCl9s6xoviTgtyErA2JCOonJNXBQBSStBiqEH/mmWd02XTddde9//77R44cqaurA4DMzMy6urojR46sX79+7ty5xcXFzz333DPPPJOdHaQ1LJKcPNna1qKqAAD+jezIgAGtamByFkkqsAgXSQ+wqBxJKgzFnN577z0AWLVq1fr16/2P60EmABg/fvw111xz7733XnbZZc8999xtt91mZDokbmiMvdHZ0/dDiJycm7L/093zg1xUw0kNBp+QdAIDUUgyYEg5HT58GABuv/32MGM4jnv66af37Nlz5513zps3b+rUqUZmROJDi6o5BhX7D+aAxxuHxSDRQGSZa24kbhe12WlxaUDfZdRPSPqBFVFIojCknHp7ewFg7NixAce93sAb6r333rtjx44//OEPf/7zn43MiMQHmbHIgwA8/RvukARCXE7T9k3CgX2k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cYv/offH3p2ydwy31+Cotra2Yz8qe+/1//mf/+m4yvHjxzvbV2RkJPdI4OHDh69fv/7xxx+zLCsUCn/1q195VjxAOENygkCbPXs29+VUU1Mzb948F91Kjh49umDBAiJiGGb58uXcQoZhuD/Wr1692nGVzZs3Oz5Y1I7VarWPeePIft+NGxjQZDJt3br1z3/+84EDB5xup3///twL151zJ02axIU8++Da7din3eXmF/OMl5+nv4ucNGkS93T9Bx984LTB8ePHX331Vcf04MEqbvE89H7au1O33nor9+K7777r+O7mzZs7Lmxra+NedOzSxLLs+vXr7a87rsvFfZZlN2/e/NFHHxHR5MmTO+s4DwCu8Bz3CcCHzpw5w3UYIqIhQ4Z0HN3YYDC8/vrr9q+HdhO32R9tO3HihOPy69evp6amclN6dTYSZk5OjlardXzrwoULXDHJycncbCEWi4V7SGrEiBGtra3tajObzdxUrBEREW5HXp4+fTq3346TytmH5Jk8ebLj8i6NhMnx8vP0VZFuxxB/44032m2/ubl5+PDhRBQTE9PW1ubNKp3p0qH3eO/cYARDhw51W4+dwWDgjohcLm834GpVVZV9tDDHkTAff/xxbuHmzZvbbW3FihXJyclcCL777rs77s5qtXLbtF/reu+99/hXCwB2SE4QHEVFRY4PIuXk5Pzud79bu3bt2rVrlyxZws0CxlmyZEm72exffPFF7q309PR33nmnuLj4xx9/fOWVV5KSknJzc7mHyZ0mp7y8vISEhBEjRmzbtu369evcbYu0tDRua6+++mrHXQwYMODVV189dOjQ+fPnT5w4sWnTJm4eVuI3bPf58+e572a5XL5mzZqzZ8/W1dWdPn16zZo1XNdshUJRVlbmuIoHycnLz9NXRXZWeUVFBffgPcMwjz322IEDB65du1ZcXPzmm2/ah1Ny/PA9W6UzXT30nu3dg+TEsuyzzz7LbS0pKenNN988fvz40aNHX3vttbS0tLS0NG6ETMfkZL86lZqaunXr1rq6uqqqqq1bt44bN46Ivvrqq169ehFRRETEkSNHOg6w/sc//tH+30CpVPLJnQDQEZITBM358+ft41M7lZiY+Pbbb3dcUafT2XvnOOrdu/f58+e5G1LJycmOq3Bfn1OnTt2xY4f98oyjBx54wDFP2Gy2xx57zEVt999/P8+pvoqKijrrWx0fH3/gwIF27T1LTt58nr4q0kXlxcXF9pjSjlAofOaZZzqW5MEqTnX10Hu2d8+Sk8lkmjZtWsddRERE7Nmzh+uEpFAoHFfh/nt3LOnNN99kWfa3v/2t4/J2u3McuvPBBx/sUqkAYIfkBEF29OjRlStX3nbbbampqVKpVKlUZmRk3Hvvve+++267eyuOWlpannnmmcGDB8vlcpVKdcsttzz11FM1NTUsyy5ZsoSI1Gq1Y3vu63PChAksy549e/axxx7LzMyUyWQxMTFjx47duHGj070UFRU98sgjAwcOVKlUAoFAqVQOGDBg0aJFu3fv7tLP2NTUtHr16tGjR8fExIjF4ri4uPz8/L/97W8ajaZjY4+TE8ezz9MnRbquXKfTvfLKKxMmTIiPjxeJRCqVavDgwYWFhadPn+6sJA9W6cizQ9/VvXuWnFiWtVqtb7zxxujRo9VqtUwmy8jI+PWvf81d4fvNb35DRAKBoF37DRs2jBgxQqlUikSitLS0xYsX229bNzY2zp8/PyYmRqVSFRQUdNzdyJEjuWO0c+fOrpYKAByGddaXEKCHUavVGo2moKBg7969wa4FAgqH3tFDDz30/vvvp6SklJeXO50XDwDcwrN1AABhobm5mXuCctGiRYhNAB5DcgIACAsvv/yyTqcTiUTtukMBQJcgOQEA9HxHjx5du3YtES1atIh7BA8APCMKdgEAAOAvZ8+eNRgMO3fuXL16tdFojIuLW716dbCLAujekJwAAHqsQYMG2V/L5fJPPvkkKSkpiPUA9AC4WwcA0GNx46NGR0fPmTPnxx9/nDBhQrArAuj2MCoBAAAAAF+45gQAAADAF5ITAAAAAF9ITgAAAAB8ITkBAAAA8IXkBAAAAMAXkhMAAAAAX0hOAAAAAHwhOQEAAADwheQEAAAAwBeSEwAAAABfSE4AAAAAfCE5AQAAAPCF5AQAAADAF5ITAAAAAF//PwXdx+gzg/LsAAAAAElFTkSuQmCC\n" + "image/png": "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4/niybkSCAOS99577/bbb9f/n56enp+f39TU9Nprr3377bd//vOf9eN6CsqLxWK55JJLtm7dCgAIodLSUp7njx8/Xltb++STT3766adr1671tbD2Wmx0dHTceOON69ato2k6JyfHZrPJstzR0fHYY4/Z7fb/+q//8r3K//zP//z85z/X/5+Tk5Ofn9/a2vrhhx9u2rTp5ZdfDvq9xBqYV0g1Nzdfe+21J06c6OWLGAtx3Ww+//xzALjgggsirpw3bx7LsuvWrbNYLMRPPBqQ7OH//U/m0H7vEdphp5ubuO+3ui6+QomvFEkrKXPeejfd1EA31SO3GxtN6pBKNS8/7qj98ZYx/b3D6iebdM7qst7aeEz0aacyqxg6OrX0DK24NJrsF47RYjtKkCzT9bW+25pI05DNSnXZtPxCNScXAFoQtZVmNtLs/hgFUy7Wpmrq2ao8JVUFE6UqjN3OunoG4vbh9BI1daykCIQzgcbGxnvuuQcADAbDX/7yl4ULFzIM43A4Xn755SeffPJ3v/udvsxv62rhwoW6Orn77rv/8Ic/5OfnA4DVan3++edfeOGF3bt3X3fddatXr/au927GPfHEE999990bb7zxs5/9zGQyybL897///Y477vB4PC+99NJDDz3k9dk5ceLEfffdBwCCIPz1r3+96qqrEEIY45UrV956662PPvpo0G8n1sC8LoNvvvlmS0vLPffcM2fOHFmWi4rCDTCNk7iUU11dHQCYTJF3kvQxLB0dHfX19UQ5RUbT+H9+whw/GvgIcruFf37ivOoGtWJYXJdASC0doqdtEo5f3fdRt2dXsHkyI+y2u+uP0FgL7I+jbFbQNHVIRTLCiwjSND/ZdAqMj3fZ1mfmbBJNDVRs9/hCjM8FbYbiGa7IKZU2QZqmD3czuF2sS2KcDipGn7Ao6Z5eIuijS0RZENW+9VYlEAYeS5Ys0Tevn3322Ztvvlk/aDQa9b25J554IvAp//rXv1auXAkAt99++5tvvuk9npGR8cc//lGSpNdee23NmjVff/31/Pnz9Ye8yukf//jHv/71r4svvlj/kmXZm266aevWrUuXLvV4PBs2bLj88sv1h958803dAvCPf/zj1VdfrR9ECM2fP//zzz+fPv20MV/xB/bRRx8tWbJEF5HJJt46JwA4ePBgxJVms1n3I+gve70zC3bfrqCyqRtN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mTOXLFkSGxvr/r7alcN61+O/HQmLtDCM9M/HpeTDbszs26uas4ZKWDnm+gUAAPAcd8/W1dbWpqenL1682G5sIiKdTvfOO++kpKQ0Hr8AxKiwWl22MUsk1bI/HdIz9+prGjhULmGipVLEJgAAAM9y95jTvffee+zYMSIKCgoaPXp0ampqbGysWq02mUw1NTWZmZl79+7Ny8urrKycOnXq6dOnExMTPVF2uxAq4nJFlue1lv/OksErlaahw00DhxImpAQAAPAOt5LTyZMnt2/fTkQzZsxYtWqV3QHpeZ7fvHnzfffdV1NTs2LFirVr17qzx3blBrVqS7WLuRGul7LlI8ZIeU4VGcUnduGlGKALAADAi9w6W7dz504iGjhw4MaNGx3N48MwzIwZM95++20i2r59e8DO4hSAbtaGREpdzAOYwXFdgsISVBHdTMy/yipLAnUqWQAAgGuDW8np3LlzRDRjxgzG1emh6dOnq1Sqqqqq7Oxsd/bYrgRLJK907OD8kbX80TW80mL9oKLqxks5v9QH6OTnAAAA1wC3klNlZSURxcfHu2wpk8mEHk6BPMN5AJqsDVkT31Eput9ShdV6d15hgcns1aoAAADaLbeSU1BQEBHpdDoxjQ0GAxEpFAp39tgO3RGqOda964NR4b2VinApmyCTBjntOV5psb5QingKAADgFW4lp4SEBCI6dOiQy5a5ubk5OTkk7gAVNBErkz7bIepgcuesnsmvxsU0uOortqNGp0d/MgAAAC9wKzmNGjWKiD755JMffvjBSTOj0Thv3jwi6tevX1RUlDt7hNMNBpdtjDx/0WjyQTEAAADtjVvJacqUKZ07d7ZYLDfddNPChQt//vlno9HYuEFOTo4wDObu3buJ6J///KdbxQJRvbiDSSKbAQAAQIu4NfyPXC7/8MMPJ0yYYDQa33rrrbfeeksikURGRqpUKpPJVF1dXV//v/lDbr/99r/97W9uF9zexctkHmwGAAAALeLu7CujRo3as2dP165dhT85jistLc3JySkqKrLFJqlU+sQTT3zyyScSEYNig3Ojg9UuH8TuCnknOZITAACA53lgyOkRI0ZkZWXt3Llz586dGRkZxcXFdXV1crk8LCysd+/ew4cPnzVrVkxMjPs7AiKKl8vuDNNuqapx0uafURE+qwcAAKBd8cxkHVKp9JZbbrnllls8sjVw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", + "text/plain": [ + "" + ] }, "metadata": {}, "output_type": "display_data" @@ -120,7 +122,7 @@ ], "metadata": { "kernelspec": { - "display_name": "Python 3", + "display_name": "Python 3 (ipykernel)", "language": "python", "name": "python3" }, @@ -134,7 +136,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.7.3" + "version": "3.11.6" } }, "nbformat": 4, diff --git a/extra/Getting_Started/tensorboard/tensorboard_with_pytorch.ipynb b/extra/Getting_Started/tensorboard/tensorboard_with_pytorch.ipynb old mode 100644 new mode 100755 index 1de5193..bf2de3a --- a/extra/Getting_Started/tensorboard/tensorboard_with_pytorch.ipynb +++ b/extra/Getting_Started/tensorboard/tensorboard_with_pytorch.ipynb @@ -74,12 +74,14 @@ "name": "stderr", "output_type": "stream", "text": [ - "2023-03-06 10:53:12.601699: I tensorflow/core/platform/cpu_feature_guard.cc:193] This TensorFlow binary is optimized with oneAPI Deep Neural Network Library (oneDNN) to use the following CPU instructions in performance-critical operations: AVX2 FMA\n", - "To enable them in other operations, rebuild TensorFlow with the appropriate compiler flags.\n", - "2023-03-06 10:53:12.711871: E tensorflow/stream_executor/cuda/cuda_blas.cc:2981] Unable to register cuBLAS factory: Attempting to register factory for plugin cuBLAS when one has already been registered\n", - "2023-03-06 10:53:13.121665: W tensorflow/stream_executor/platform/default/dso_loader.cc:64] Could not load dynamic library 'libnvinfer.so.7'; dlerror: libnvinfer.so.7: cannot open shared object file: No such file or directory\n", - "2023-03-06 10:53:13.121710: W tensorflow/stream_executor/platform/default/dso_loader.cc:64] Could not load dynamic library 'libnvinfer_plugin.so.7'; dlerror: libnvinfer_plugin.so.7: cannot open shared object file: No such file or directory\n", - "2023-03-06 10:53:13.121717: W tensorflow/compiler/tf2tensorrt/utils/py_utils.cc:38] TF-TRT Warning: Cannot dlopen some TensorRT libraries. If you would like to use Nvidia GPU with TensorRT, please make sure the missing libraries mentioned above are installed properly.\n" + "2023-12-14 17:18:14.322300: I external/local_tsl/tsl/cuda/cudart_stub.cc:31] Could not find cuda drivers on your machine, GPU will not be used.\n", + "2023-12-14 17:18:14.345418: E external/local_xla/xla/stream_executor/cuda/cuda_dnn.cc:9261] Unable to register cuDNN factory: Attempting to register factory for plugin cuDNN when one has already been registered\n", + "2023-12-14 17:18:14.345442: E external/local_xla/xla/stream_executor/cuda/cuda_fft.cc:607] Unable to register cuFFT factory: Attempting to register factory for plugin cuFFT when one has already been registered\n", + "2023-12-14 17:18:14.346047: E external/local_xla/xla/stream_executor/cuda/cuda_blas.cc:1515] Unable to register cuBLAS factory: Attempting to register factory for plugin cuBLAS when one has already been registered\n", + "2023-12-14 17:18:14.349859: I external/local_tsl/tsl/cuda/cudart_stub.cc:31] Could not find cuda drivers on your machine, GPU will not be used.\n", + "2023-12-14 17:18:14.350205: I tensorflow/core/platform/cpu_feature_guard.cc:182] This TensorFlow binary is optimized to use available CPU instructions in performance-critical operations.\n", + "To enable the following instructions: AVX2 FMA, in other operations, rebuild TensorFlow with the appropriate compiler flags.\n", + "2023-12-14 17:18:15.059230: W tensorflow/compiler/tf2tensorrt/utils/py_utils.cc:38] TF-TRT Warning: Could not find TensorRT\n" ] } ], @@ -281,7 +283,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.10.9" + "version": "3.11.6" } }, "nbformat": 4, diff --git a/extra/Getting_Started/tensorboard/tensorboard_with_tensorflow.ipynb b/extra/Getting_Started/tensorboard/tensorboard_with_tensorflow.ipynb old mode 100644 new mode 100755 index c33509d..e69614d --- a/extra/Getting_Started/tensorboard/tensorboard_with_tensorflow.ipynb +++ b/extra/Getting_Started/tensorboard/tensorboard_with_tensorflow.ipynb @@ -92,12 +92,14 @@ "name": "stderr", "output_type": "stream", "text": [ - "2023-03-06 10:51:15.118111: I tensorflow/core/platform/cpu_feature_guard.cc:193] This TensorFlow binary is optimized with oneAPI Deep Neural Network Library (oneDNN) to use the following CPU instructions in performance-critical operations: AVX2 FMA\n", - "To enable them in other operations, rebuild TensorFlow with the appropriate compiler flags.\n", - "2023-03-06 10:51:15.217654: E tensorflow/stream_executor/cuda/cuda_blas.cc:2981] Unable to register cuBLAS factory: Attempting to register factory for plugin cuBLAS when one has already been registered\n", - "2023-03-06 10:51:15.671297: W tensorflow/stream_executor/platform/default/dso_loader.cc:64] Could not load dynamic library 'libnvinfer.so.7'; dlerror: libnvinfer.so.7: cannot open shared object file: No such file or directory\n", - "2023-03-06 10:51:15.671357: W tensorflow/stream_executor/platform/default/dso_loader.cc:64] Could not load dynamic library 'libnvinfer_plugin.so.7'; dlerror: libnvinfer_plugin.so.7: cannot open shared object file: No such file or directory\n", - "2023-03-06 10:51:15.671377: W tensorflow/compiler/tf2tensorrt/utils/py_utils.cc:38] TF-TRT Warning: Cannot dlopen some TensorRT libraries. If you would like to use Nvidia GPU with TensorRT, please make sure the missing libraries mentioned above are installed properly.\n" + "2023-12-14 17:18:15.632959: I external/local_tsl/tsl/cuda/cudart_stub.cc:31] Could not find cuda drivers on your machine, GPU will not be used.\n", + "2023-12-14 17:18:15.656733: E external/local_xla/xla/stream_executor/cuda/cuda_dnn.cc:9261] Unable to register cuDNN factory: Attempting to register factory for plugin cuDNN when one has already been registered\n", + "2023-12-14 17:18:15.656757: E external/local_xla/xla/stream_executor/cuda/cuda_fft.cc:607] Unable to register cuFFT factory: Attempting to register factory for plugin cuFFT when one has already been registered\n", + "2023-12-14 17:18:15.657399: E external/local_xla/xla/stream_executor/cuda/cuda_blas.cc:1515] Unable to register cuBLAS factory: Attempting to register factory for plugin cuBLAS when one has already been registered\n", + "2023-12-14 17:18:15.661313: I external/local_tsl/tsl/cuda/cudart_stub.cc:31] Could not find cuda drivers on your machine, GPU will not be used.\n", + "2023-12-14 17:18:15.661887: I tensorflow/core/platform/cpu_feature_guard.cc:182] This TensorFlow binary is optimized to use available CPU instructions in performance-critical operations.\n", + "To enable the following instructions: AVX2 FMA, in other operations, rebuild TensorFlow with the appropriate compiler flags.\n", + "2023-12-14 17:18:16.365070: W tensorflow/compiler/tf2tensorrt/utils/py_utils.cc:38] TF-TRT Warning: Could not find TensorRT\n" ] } ], @@ -135,7 +137,16 @@ "id": "j-DHsby18cot", "tags": [] }, - "outputs": [], + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Downloading data from https://storage.googleapis.com/tensorflow/tf-keras-datasets/mnist.npz\n", + "11490434/11490434 [==============================] - 1s 0us/step\n" + ] + } + ], "source": [ "mnist = tf.keras.datasets.mnist\n", "\n", @@ -183,40 +194,45 @@ "name": "stderr", "output_type": "stream", "text": [ - "2023-03-06 10:51:16.792703: I tensorflow/stream_executor/cuda/cuda_gpu_executor.cc:980] successful NUMA node read from SysFS had negative value (-1), but there must be at least one NUMA node, so returning NUMA node zero\n", - "2023-03-06 10:51:16.816039: I tensorflow/stream_executor/cuda/cuda_gpu_executor.cc:980] successful NUMA node read from SysFS had negative value (-1), but there must be at least one NUMA node, so returning NUMA node zero\n", - "2023-03-06 10:51:16.816173: I tensorflow/stream_executor/cuda/cuda_gpu_executor.cc:980] successful NUMA node read from SysFS had negative value (-1), but there must be at least one NUMA node, so returning NUMA node zero\n", - "2023-03-06 10:51:16.816790: I tensorflow/core/platform/cpu_feature_guard.cc:193] This TensorFlow binary is optimized with oneAPI Deep Neural Network Library (oneDNN) to use the following CPU instructions in performance-critical operations: AVX2 FMA\n", - "To enable them in other operations, rebuild TensorFlow with the appropriate compiler flags.\n", - "2023-03-06 10:51:16.817127: I tensorflow/stream_executor/cuda/cuda_gpu_executor.cc:980] successful NUMA node read from SysFS had negative value (-1), but there must be at least one NUMA node, so returning NUMA node zero\n", - "2023-03-06 10:51:16.817237: I tensorflow/stream_executor/cuda/cuda_gpu_executor.cc:980] successful NUMA node read from SysFS had negative value (-1), but there must be at least one NUMA node, so returning NUMA node zero\n", - "2023-03-06 10:51:16.817332: I tensorflow/stream_executor/cuda/cuda_gpu_executor.cc:980] successful NUMA node read from SysFS had negative value (-1), but there must be at least one NUMA node, so returning NUMA node zero\n", - "2023-03-06 10:51:17.308525: I tensorflow/stream_executor/cuda/cuda_gpu_executor.cc:980] successful NUMA node read from SysFS had negative value (-1), but there must be at least one NUMA node, so returning NUMA node zero\n", - "2023-03-06 10:51:17.308658: I tensorflow/stream_executor/cuda/cuda_gpu_executor.cc:980] successful NUMA node read from SysFS had negative value (-1), but there must be at least one NUMA node, so returning NUMA node zero\n", - "2023-03-06 10:51:17.308758: I tensorflow/stream_executor/cuda/cuda_gpu_executor.cc:980] successful NUMA node read from SysFS had negative value (-1), but there must be at least one NUMA node, so returning NUMA node zero\n", - "2023-03-06 10:51:17.308838: I tensorflow/core/common_runtime/gpu/gpu_device.cc:1616] Created device /job:localhost/replica:0/task:0/device:GPU:0 with 6574 MB memory: -> device: 0, name: NVIDIA GeForce RTX 2070 SUPER, pci bus id: 0000:01:00.0, compute capability: 7.5\n" + "2023-12-14 17:18:19.033227: I external/local_xla/xla/stream_executor/cuda/cuda_executor.cc:901] successful NUMA node read from SysFS had negative value (-1), but there must be at least one NUMA node, so returning NUMA node zero. See more at https://github.com/torvalds/linux/blob/v6.0/Documentation/ABI/testing/sysfs-bus-pci#L344-L355\n", + "2023-12-14 17:18:19.033669: I external/local_xla/xla/stream_executor/cuda/cuda_executor.cc:901] successful NUMA node read from SysFS had negative value (-1), but there must be at least one NUMA node, so returning NUMA node zero. See more at https://github.com/torvalds/linux/blob/v6.0/Documentation/ABI/testing/sysfs-bus-pci#L344-L355\n", + "2023-12-14 17:18:19.048651: W tensorflow/core/common_runtime/gpu/gpu_device.cc:2256] Cannot dlopen some GPU libraries. Please make sure the missing libraries mentioned above are installed properly if you would like to use GPU. Follow the guide at https://www.tensorflow.org/install/gpu for how to download and setup the required libraries for your platform.\n", + "Skipping registering GPU devices...\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Epoch 1/5\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "2023-12-14 17:18:19.775852: W external/local_tsl/tsl/framework/cpu_allocator_impl.cc:83] Allocation of 188160000 exceeds 10% of free system memory.\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ - "Epoch 1/5\n", - "1875/1875 [==============================] - 11s 6ms/step - loss: 0.2203 - accuracy: 0.9343 - val_loss: 0.1090 - val_accuracy: 0.9677\n", + "1875/1875 [==============================] - 4s 2ms/step - loss: 0.2187 - accuracy: 0.9345 - val_loss: 0.1003 - val_accuracy: 0.9685\n", "Epoch 2/5\n", - "1875/1875 [==============================] - 10s 6ms/step - loss: 0.0959 - accuracy: 0.9710 - val_loss: 0.0805 - val_accuracy: 0.9748\n", + "1875/1875 [==============================] - 4s 2ms/step - loss: 0.0975 - accuracy: 0.9707 - val_loss: 0.0771 - val_accuracy: 0.9760\n", "Epoch 3/5\n", - "1875/1875 [==============================] - 10s 6ms/step - loss: 0.0688 - accuracy: 0.9782 - val_loss: 0.0641 - val_accuracy: 0.9805\n", + "1875/1875 [==============================] - 4s 2ms/step - loss: 0.0688 - accuracy: 0.9783 - val_loss: 0.0687 - val_accuracy: 0.9792\n", "Epoch 4/5\n", - "1875/1875 [==============================] - 10s 5ms/step - loss: 0.0534 - accuracy: 0.9834 - val_loss: 0.0631 - val_accuracy: 0.9814\n", + "1875/1875 [==============================] - 4s 2ms/step - loss: 0.0543 - accuracy: 0.9824 - val_loss: 0.0690 - val_accuracy: 0.9778\n", "Epoch 5/5\n", - "1875/1875 [==============================] - 10s 5ms/step - loss: 0.0426 - accuracy: 0.9862 - val_loss: 0.0681 - val_accuracy: 0.9779\n" + "1875/1875 [==============================] - 4s 2ms/step - loss: 0.0422 - accuracy: 0.9865 - val_loss: 0.0641 - val_accuracy: 0.9800\n" ] }, { "data": { "text/plain": [ - "" + "" ] }, "execution_count": 6, @@ -261,11 +277,11 @@ "data": { "text/html": [ "\n", - " \n", " \n", + " " + ], + "text/plain": [ + "" ] }, "metadata": {}, @@ -614,7 +629,7 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 15, "metadata": { "id": "Q3nupQL24E5E", "tags": [] @@ -624,35 +639,34 @@ "name": "stdout", "output_type": "stream", "text": [ - "2023-03-06 10:52:58.548075: I tensorflow/core/platform/cpu_feature_guard.cc:193] This TensorFlow binary is optimized with oneAPI Deep Neural Network Library (oneDNN) to use the following CPU instructions in performance-critical operations: AVX2 FMA\n", - "To enable them in other operations, rebuild TensorFlow with the appropriate compiler flags.\n", - "2023-03-06 10:52:58.643597: E tensorflow/stream_executor/cuda/cuda_blas.cc:2981] Unable to register cuBLAS factory: Attempting to register factory for plugin cuBLAS when one has already been registered\n", - "2023-03-06 10:52:59.047723: W tensorflow/stream_executor/platform/default/dso_loader.cc:64] Could not load dynamic library 'libnvinfer.so.7'; dlerror: libnvinfer.so.7: cannot open shared object file: No such file or directory\n", - "2023-03-06 10:52:59.047780: W tensorflow/stream_executor/platform/default/dso_loader.cc:64] Could not load dynamic library 'libnvinfer_plugin.so.7'; dlerror: libnvinfer_plugin.so.7: cannot open shared object file: No such file or directory\n", - "2023-03-06 10:52:59.047788: W tensorflow/compiler/tf2tensorrt/utils/py_utils.cc:38] TF-TRT Warning: Cannot dlopen some TensorRT libraries. If you would like to use Nvidia GPU with TensorRT, please make sure the missing libraries mentioned above are installed properly.\n", - "2023-03-06 10:52:59.645017: I tensorflow/stream_executor/cuda/cuda_gpu_executor.cc:980] successful NUMA node read from SysFS had negative value (-1), but there must be at least one NUMA node, so returning NUMA node zero\n", - "2023-03-06 10:52:59.667592: I tensorflow/stream_executor/cuda/cuda_gpu_executor.cc:980] successful NUMA node read from SysFS had negative value (-1), but there must be at least one NUMA node, so returning NUMA node zero\n", - "2023-03-06 10:52:59.667740: I tensorflow/stream_executor/cuda/cuda_gpu_executor.cc:980] successful NUMA node read from SysFS had negative value (-1), but there must be at least one NUMA node, so returning NUMA node zero\n", - "\n", - "***** TensorBoard Uploader *****\n", - "\n", - "This will upload your TensorBoard logs to https://tensorboard.dev/ from\n", - "the following directory:\n", + "2023-12-14 17:19:53.374133: I external/local_tsl/tsl/cuda/cudart_stub.cc:31] Could not find cuda drivers on your machine, GPU will not be used.\n", + "2023-12-14 17:19:53.396308: E external/local_xla/xla/stream_executor/cuda/cuda_dnn.cc:9261] Unable to register cuDNN factory: Attempting to register factory for plugin cuDNN when one has already been registered\n", + "2023-12-14 17:19:53.396331: E external/local_xla/xla/stream_executor/cuda/cuda_fft.cc:607] Unable to register cuFFT factory: Attempting to register factory for plugin cuFFT when one has already been registered\n", + "2023-12-14 17:19:53.396968: E external/local_xla/xla/stream_executor/cuda/cuda_blas.cc:1515] Unable to register cuBLAS factory: Attempting to register factory for plugin cuBLAS when one has already been registered\n", + "2023-12-14 17:19:53.400694: I external/local_tsl/tsl/cuda/cudart_stub.cc:31] Could not find cuda drivers on your machine, GPU will not be used.\n", + "2023-12-14 17:19:53.400830: I tensorflow/core/platform/cpu_feature_guard.cc:182] This TensorFlow binary is optimized to use available CPU instructions in performance-critical operations.\n", + "To enable the following instructions: AVX2 FMA, in other operations, rebuild TensorFlow with the appropriate compiler flags.\n", + "2023-12-14 17:19:54.014266: W tensorflow/compiler/tf2tensorrt/utils/py_utils.cc:38] TF-TRT Warning: Could not find TensorRT\n", + "2023-12-14 17:19:54.725388: I external/local_xla/xla/stream_executor/cuda/cuda_executor.cc:901] successful NUMA node read from SysFS had negative value (-1), but there must be at least one NUMA node, so returning NUMA node zero. See more at https://github.com/torvalds/linux/blob/v6.0/Documentation/ABI/testing/sysfs-bus-pci#L344-L355\n", + "2023-12-14 17:19:54.725602: I external/local_xla/xla/stream_executor/cuda/cuda_executor.cc:901] successful NUMA node read from SysFS had negative value (-1), but there must be at least one NUMA node, so returning NUMA node zero. See more at https://github.com/torvalds/linux/blob/v6.0/Documentation/ABI/testing/sysfs-bus-pci#L344-L355\n", + "2023-12-14 17:19:54.736401: W tensorflow/core/common_runtime/gpu/gpu_device.cc:2256] Cannot dlopen some GPU libraries. Please make sure the missing libraries mentioned above are installed properly if you would like to use GPU. Follow the guide at https://www.tensorflow.org/install/gpu for how to download and setup the required libraries for your platform.\n", + "Skipping registering GPU devices...\n", + "****************************************************************\n", + "****************************************************************\n", + "****************************************************************\n", "\n", - "logs/fit\n", + "Uploading TensorBoard logs to https://tensorboard.dev/ is no longer\n", + "supported.\n", "\n", - "This TensorBoard will be visible to everyone. Do not upload sensitive\n", - "data.\n", + "TensorBoard.dev is shutting down.\n", "\n", - "Your use of this service is subject to Google's Terms of Service\n", - " and Privacy Policy\n", - ", and TensorBoard.dev's Terms of Service\n", - ".\n", + "Please export your experiments by Dec 31, 2023.\n", "\n", - "This notice will not be shown again while you are logged into the uploader.\n", - "To log out, run `tensorboard dev auth revoke`.\n", + "See the FAQ at https://tensorboard.dev.\n", "\n", - "Continue? (yes/NO) " + "****************************************************************\n", + "****************************************************************\n", + "****************************************************************\n" ] } ], @@ -707,7 +721,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.10.9" + "version": "3.11.6" } }, "nbformat": 4, diff --git a/generate-Dockerfile.sh b/generate-Dockerfile.sh index 4e1abbb..d91de70 100755 --- a/generate-Dockerfile.sh +++ b/generate-Dockerfile.sh @@ -5,7 +5,7 @@ cd $(cd -P -- "$(dirname -- "$0")" && pwd -P) export DOCKERFILE=".build/Dockerfile" export STACKS_DIR=".build/docker-stacks" # please test the build of the commit in https://github.com/jupyter/docker-stacks/commits/main in advance -export HEAD_COMMIT="efa95c2c5b9b095247cd2f5e55bc3b38c85da335" +export HEAD_COMMIT="1494233e27cdc70e3766ea2518e7153ee425fc4f" while [[ "$#" -gt 0 ]]; do case $1 in -p|--pw|--password) PASSWORD="$2" && USE_PASSWORD=1; shift;; @@ -22,10 +22,10 @@ if [[ "$HELP" == 1 ]]; then echo "Help for ./generate-Dockerfile.sh:" echo "Usage: $0 [parameters]" echo " -h|--help: Show this help." - echo " -p|--pw|--password: Set the password (and update in src/jupyter_notebook_config.json)" + echo " -p|--pw|--password: Set the password (creates .build/jupyter_notebook_config.json and overrides the token)" echo " -c|--commit: Set the head commit of the jupyter/docker-stacks submodule (https://github.com/jupyter/docker-stacks/commits/main). default: $HEAD_COMMIT." echo " --python-only|--no-datascience-notebook: Use not the datascience-notebook from jupyter/docker-stacks, don't install Julia and R." - echo " --no-useful-packages: Don't install the useful packages, specified in src/Dockerfile.usefulpackages" + echo " --no-useful-packages: Don't install the useful packages, specified in custom/usefulpackages.Dockerfile" echo " --slim: no useful packages and no datascience notebook." exit 21 fi @@ -52,29 +52,58 @@ else fi # Write the contents into the DOCKERFILE and start with the header -echo "# This Dockerfile is generated by 'generate-Dockerfile.sh' from elements within 'src/' +echo "# This Dockerfile is generated by 'generate-Dockerfile.sh' from elements within 'custom/' # **Please do not change this file directly!** -# To adapt this Dockerfile, adapt 'generate-Dockerfile.sh' or 'src/Dockerfile.usefulpackages'. +# To adapt this Dockerfile, adapt 'generate-Dockerfile.sh' or 'custom/usefulpackages.Dockerfile'. # More information can be found in the README under configuration. " > $DOCKERFILE -cat src/Dockerfile.header >> $DOCKERFILE +cat custom/header.Dockerfile >> $DOCKERFILE echo " ############################################################################ -#################### Dependency: jupyter/base-image ######################## +#################### Dependency: jupyter/docker-stacks-foundation ########## ############################################################################ " >> $DOCKERFILE -cat $STACKS_DIR/base-notebook/Dockerfile | grep -v 'BASE_CONTAINER' | grep -v 'FROM $ROOT_CONTAINER' >> $DOCKERFILE - -# copy files that are used during the build: -cp $STACKS_DIR/base-notebook/jupyter_server_config.py .build/ -cp $STACKS_DIR/base-notebook/initial-condarc .build/ -cp $STACKS_DIR/base-notebook/fix-permissions .build/ -cp $STACKS_DIR/base-notebook/start.sh .build/ -cp $STACKS_DIR/base-notebook/start-notebook.sh .build/ -cp $STACKS_DIR/base-notebook/start-singleuser.sh .build/ +if [ -f "$STACKS_DIR/images/docker-stacks-foundation/Dockerfile" ]; then + cat $STACKS_DIR/images/docker-stacks-foundation/Dockerfile | grep -v 'BASE_CONTAINER' | grep -v 'FROM $ROOT_CONTAINER' >> $DOCKERFILE + # copy files that are used during the build + cp $STACKS_DIR/images/docker-stacks-foundation/initial-condarc .build/ + cp $STACKS_DIR/images/docker-stacks-foundation/fix-permissions .build/ + cp $STACKS_DIR/images/docker-stacks-foundation/start.sh .build/ + cp $STACKS_DIR/images/docker-stacks-foundation/run-hooks.sh .build/ + cp $STACKS_DIR/images/docker-stacks-foundation/10activate-conda-env.sh .build/ +else + cat $STACKS_DIR/docker-stacks-foundation/Dockerfile | grep -v 'BASE_CONTAINER' | grep -v 'FROM $ROOT_CONTAINER' >> $DOCKERFILE + # copy files that are used during the build + cp $STACKS_DIR/docker-stacks-foundation/initial-condarc .build/ + cp $STACKS_DIR/docker-stacks-foundation/fix-permissions .build/ + cp $STACKS_DIR/docker-stacks-foundation/start.sh .build/ +fi + +echo " +############################################################################ +#################### Dependency: jupyter/base-notebook ##################### +############################################################################ +" >> $DOCKERFILE +if [ -f "$STACKS_DIR/images/base-notebook/Dockerfile" ]; then + cat $STACKS_DIR/images/base-notebook/Dockerfile | grep -v 'BASE_CONTAINER' >> $DOCKERFILE + # copy files that are used during the build + cp $STACKS_DIR/images/base-notebook/jupyter_server_config.py .build/ + cp $STACKS_DIR/images/base-notebook/start-notebook.sh .build/ + cp $STACKS_DIR/images/base-notebook/start-notebook.py .build/ + cp $STACKS_DIR/images/base-notebook/start-singleuser.sh .build/ + cp $STACKS_DIR/images/base-notebook/start-singleuser.py .build/ + cp $STACKS_DIR/images/base-notebook/docker_healthcheck.py .build/ +else + cat $STACKS_DIR/base-notebook/Dockerfile | grep -v 'BASE_CONTAINER' >> $DOCKERFILE + # copy files that are used during the build + cp $STACKS_DIR/base-notebook/jupyter_server_config.py .build/ + cp $STACKS_DIR/base-notebook/start-notebook.sh .build/ + cp $STACKS_DIR/base-notebook/start-singleuser.sh .build/ + cp $STACKS_DIR/base-notebook/docker_healthcheck.py .build/ +fi chmod 755 .build/* echo " @@ -82,14 +111,28 @@ echo " ################# Dependency: jupyter/minimal-notebook ##################### ############################################################################ " >> $DOCKERFILE -cat $STACKS_DIR/minimal-notebook/Dockerfile | grep -v BASE_CONTAINER >> $DOCKERFILE +if [ -f "$STACKS_DIR/images/minimal-notebook/Dockerfile" ]; then + cat $STACKS_DIR/images/minimal-notebook/Dockerfile | grep -v BASE_CONTAINER >> $DOCKERFILE + # copy files that are used during the build + cp -r $STACKS_DIR/images/minimal-notebook/setup-scripts .build/ + cp $STACKS_DIR/images/minimal-notebook/Rprofile.site .build/ +else + cat $STACKS_DIR/minimal-notebook/Dockerfile | grep -v BASE_CONTAINER >> $DOCKERFILE + # copy files that are used during the build + cp -r $STACKS_DIR/minimal-notebook/setup-scripts .build/ + cp $STACKS_DIR/minimal-notebook/Rprofile.site .build/ +fi echo " ############################################################################ ################# Dependency: jupyter/scipy-notebook ####################### ############################################################################ " >> $DOCKERFILE -cat $STACKS_DIR/scipy-notebook/Dockerfile | grep -v BASE_CONTAINER >> $DOCKERFILE +if [ -f "$STACKS_DIR/images/scipy-notebook/Dockerfile" ]; then + cat $STACKS_DIR/images/scipy-notebook/Dockerfile | grep -v BASE_CONTAINER >> $DOCKERFILE +else + cat $STACKS_DIR/scipy-notebook/Dockerfile | grep -v BASE_CONTAINER >> $DOCKERFILE +fi # install Julia and R if not excluded or spare mode is used if [[ "$no_datascience_notebook" != 1 ]]; then @@ -98,7 +141,11 @@ if [[ "$no_datascience_notebook" != 1 ]]; then ################ Dependency: jupyter/datascience-notebook ################## ############################################################################ " >> $DOCKERFILE - cat $STACKS_DIR/datascience-notebook/Dockerfile | grep -v BASE_CONTAINER >> $DOCKERFILE + if [ -f "$STACKS_DIR/images/datascience-notebook/Dockerfile" ]; then + cat $STACKS_DIR/images/datascience-notebook/Dockerfile | grep -v BASE_CONTAINER >> $DOCKERFILE + else + cat $STACKS_DIR/images/datascience-notebook/Dockerfile | grep -v BASE_CONTAINER >> $DOCKERFILE + fi else echo "Set 'no-datascience-notebook' = 'python-only', not installing the datascience-notebook with Julia and R." fi @@ -110,7 +157,7 @@ echo " ########################## Dependency: gpulibs ############################# ############################################################################ " >> $DOCKERFILE -cat src/Dockerfile.gpulibs >> $DOCKERFILE +cat custom/gpulibs.Dockerfile >> $DOCKERFILE # install useful packages if not excluded or spare mode is used if [[ "$no_useful_packages" != 1 ]]; then @@ -119,15 +166,27 @@ if [[ "$no_useful_packages" != 1 ]]; then ############################ Useful packages ############################### ############################################################################ " >> $DOCKERFILE - cat src/Dockerfile.usefulpackages >> $DOCKERFILE + cat custom/usefulpackages.Dockerfile >> $DOCKERFILE else - echo "Set 'no-useful-packages', not installing stuff within src/Dockerfile.usefulpackages." + echo "Set 'no-useful-packages', not installing stuff within custom/usefulpackages.Dockerfile." fi # Copy the demo notebooks and change permissions cp -r extra/Getting_Started data chmod -R 755 data/ +# set static token (optional if set) +# copy jupyter server config token addendum to .build +cp custom/jupyter_server_config_token_addendum.py .build/ +# append token config into the jupyter server config +echo >> $DOCKERFILE +echo "# Set env-var JUPYTER_TOKEN as static token" >> $DOCKERFILE +echo "ARG JUPYTER_TOKEN" >> $DOCKERFILE +echo "ENV JUPYTER_TOKEN=\$JUPYTER_TOKEN" >> $DOCKERFILE +echo "COPY jupyter_server_config_token_addendum.py /etc/jupyter/" >> $DOCKERFILE +echo "RUN cat /etc/jupyter/jupyter_server_config_token_addendum.py >> /etc/jupyter/jupyter_server_config.py" >> $DOCKERFILE + + # set password if [[ "$USE_PASSWORD" == 1 ]]; then echo "Set password to given input" diff --git a/src/Dockerfile.gpulibs b/src/Dockerfile.gpulibs deleted file mode 100644 index 82bdfbc..0000000 --- a/src/Dockerfile.gpulibs +++ /dev/null @@ -1,53 +0,0 @@ -LABEL maintainer="Christoph Schranz , Mathematical Michael " - -# Install Tensorflow, check compatibility here: -# https://www.tensorflow.org/install/source#gpu -# installation via conda leads to errors in version 4.8.2 -USER ${NB_UID} -RUN pip install --upgrade pip && \ - pip install --no-cache-dir tensorflow==2.10.1 keras==2.10 && \ - fix-permissions "${CONDA_DIR}" && \ - fix-permissions "/home/${NB_USER}" - -# Install PyTorch with dependencies -RUN conda install --quiet --yes \ - pyyaml mkl mkl-include setuptools cmake cffi typing && \ - conda clean --all -f -y && \ - fix-permissions "${CONDA_DIR}" && \ - fix-permissions "/home/${NB_USER}" - -# Check compatibility here: -# https://pytorch.org/get-started/locally/ -# Installation via conda leads to errors installing cudatoolkit=11.1 -# RUN pip install --no-cache-dir torch==1.13.1 torchvision==0.14.1 torchaudio==0.13.1 && \ -# torchviz==0.0.2 --extra-index-url https://download.pytorch.org/whl/cu116 -RUN set -ex \ - && buildDeps=' \ - torch==1.13.1 \ - torchvision==0.14.1 \ - torchaudio==0.13.1 \ - torchviz==0.0.2 \ -' \ - && pip install --no-cache-dir $buildDeps --extra-index-url https://download.pytorch.org/whl/cu116 \ - && fix-permissions "${CONDA_DIR}" \ - && fix-permissions "/home/${NB_USER}" - -USER root -ENV CUDA_PATH=/opt/conda/ - -# Install nvtop to monitor the gpu tasks -RUN apt-get update && \ - apt-get install -y --no-install-recommends cmake libncurses5-dev libncursesw5-dev git && \ - apt-get clean && rm -rf /var/lib/apt/lists/* - -# reinstall nvcc with cuda-nvcc to install ptax -USER $NB_UID -RUN conda install -c nvidia cuda-nvcc -y && \ - conda clean --all -f -y && \ - fix-permissions $CONDA_DIR && \ - fix-permissions /home/$NB_USER - -USER root -RUN ln -s /opt/conda/bin/ptxas /usr/bin/ptxas - -USER $NB_UID