Repository: modin-project/modin
Pull request: Improve containerized benchmark examples
<!--
Thank you for your contribution!
Please review the contributing docs: https://modin.readthedocs.io/en/latest/CONTRIBUTING.html
if you have questions about contributing.
-->

## What do these changes do?

<!-- Please give a short brief about these changes. -->

- [x] commit message follows format outlined [here](https://modin.readthedocs.io/en/latest/contributing.html)
- [x] passes `flake8 modin`
- [x] passes `black --check modin`
- [x] signed commit with `git commit -s` <!-- you can amend your commit with a signature via `git commit -amend -s` -->
- [x] Resolves #3392 <!-- issue must be created for each patch -->
- [x] tests added and passing
- [x] module layout described at `docs/developer/architecture.rst` is up-to-date <!-- if you have added, renamed or removed files or directories please update the documentation accordingly -->


Problem statement:
Problems with current modin docker examples
1. Executable scripts build*.sh are not executable.
2. If HTTP(S) proxy is used during build, environment variables remain to be set in the container image. If this image is uploaded to a Docker Hub, and is used by someone else, they will get proxy settings that were used during build. These proxy variables have to be cleared at the end of docker build script.
3. There is no need to create separate containers for different benchmarks. One container can encompass all of them.
4. Conda environment may be activated without use of login shell for everything (it is slow).
5. Need to add modin on ray examples in container.

Hints from issue discussion:

Commit message: FIX-#3392: Cosmetic changes to long lines formatting

Signed-off-by: Gregory Shimansky <gregory.shimansky@intel.com>

Patch to review:
diff --git a/examples/docker/build.sh b/examples/docker/build.sh
deleted file mode 100755
index 77b29a844d6..00000000000
--- a/examples/docker/build.sh
+++ /dev/null
@@ -1,19 +0,0 @@
-#!/bin/bash -e
-
-# Licensed to Modin Development Team under one or more contributor license agreements.
-# See the NOTICE file distributed with this work for additional information regarding
-# copyright ownership.  The Modin Development Team licenses this file to you under the
-# Apache License, Version 2.0 (the "License"); you may not use this file except in
-# compliance with the License.  You may obtain a copy of the License at
-#
-#     http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software distributed under
-# the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF
-# ANY KIND, either express or implied. See the License for the specific language
-# governing permissions and limitations under the License.
-
-cd "`dirname \"$0\"`"
-
-docker build -f nyc-taxi.dockerfile -t nyc-taxi --build-arg https_proxy --build-arg http_proxy .
-printf "\n\nTo run the benchmark execute:\n\tdocker run --rm nyc-taxi\n"
diff --git a/examples/docker/census-on-omnisci/build-docker-image.sh b/examples/docker/census-on-omnisci/build-docker-image.sh
deleted file mode 100644
index 7b3e04d61cc..00000000000
--- a/examples/docker/census-on-omnisci/build-docker-image.sh
+++ /dev/null
@@ -1,25 +0,0 @@
-#!/bin/bash -e
-
-# Licensed to Modin Development Team under one or more contributor license agreements.
-# See the NOTICE file distributed with this work for additional information regarding
-# copyright ownership.  The Modin Development Team licenses this file to you under the
-# Apache License, Version 2.0 (the "License"); you may not use this file except in
-# compliance with the License.  You may obtain a copy of the License at
-#
-#     http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software distributed under
-# the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF
-# ANY KIND, either express or implied. See the License for the specific language
-# governing permissions and limitations under the License.
-
-cd "`dirname \"$0\"`"
-
-docker build -f census-omnisci.dockerfile -t census-omnisci --build-arg no_proxy \
-    --build-arg https_proxy --build-arg http_proxy .
-
-echo -e "\nNote: a user is responsible for preparing the dataset.
-It can be downloaded by link:
-'https://rapidsai-data.s3.us-east-2.amazonaws.com/datasets/ipums_education2income_1970-2010.csv.gz'"
-printf "\n\nTo run the benchmark execute:\n"
-printf "\tdocker run --rm -v /path/to/dataset:/dataset census-omnisci <name of file in /path/to/dataset>\n"
diff --git a/examples/docker/census-on-omnisci/census-omnisci.dockerfile b/examples/docker/census-on-omnisci/census-omnisci.dockerfile
deleted file mode 100644
index 529fef250c8..00000000000
--- a/examples/docker/census-on-omnisci/census-omnisci.dockerfile
+++ /dev/null
@@ -1,56 +0,0 @@
-# Licensed to Modin Development Team under one or more contributor license agreements.
-# See the NOTICE file distributed with this work for additional information regarding
-# copyright ownership.  The Modin Development Team licenses this file to you under the
-# Apache License, Version 2.0 (the "License"); you may not use this file except in
-# compliance with the License.  You may obtain a copy of the License at
-#
-#     http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software distributed under
-# the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF
-# ANY KIND, either express or implied. See the License for the specific language
-# governing permissions and limitations under the License.
-
-FROM ubuntu:18.04
-ENV http_proxy ${http_proxy}
-ENV https_proxy ${https_proxy}
-ENV no_proxy ${no_proxy}
-ENV MODIN_BACKEND "omnisci"
-ENV MODIN_EXPERIMENTAL "true"
-
-RUN apt-get update --yes && apt-get upgrade --yes \
-    && apt-get install wget --yes && \
-    rm -rf /var/lib/apt/lists/*
-
-ENV USER modin
-ENV UID 1000
-ENV HOME /home/$USER
-
-RUN adduser --disabled-password \
-    --gecos "Non-root user" \
-    --uid $UID \
-    --home $HOME \
-    $USER
-
-ENV CONDA_DIR ${HOME}/miniconda
-
-SHELL ["/bin/bash", "--login", "-c"]
-
-RUN wget -nv https://repo.anaconda.com/miniconda/Miniconda3-latest-Linux-x86_64.sh -O /tmp/miniconda3.sh && \
-    bash /tmp/miniconda3.sh -b -p "${CONDA_DIR}" -f -u && \
-    "${CONDA_DIR}/bin/conda" init bash && \
-    rm -f /tmp/miniconda3.sh && \
-    echo ". '${CONDA_DIR}/etc/profile.d/conda.sh'" >> "${HOME}/.profile"
-
-RUN conda update -n base -c defaults conda -y && \
-    conda config --set channel_priority strict && \
-    conda create -n modin --yes --no-default-packages && \
-    conda activate modin && \
-    conda install -c conda-forge modin-omnisci scikit-learn scikit-learn-intelex && \
-    conda clean --all --yes
-
-COPY census-omnisci.py "${HOME}/census-omnisci.py"
-RUN mkdir /dataset
-RUN echo 'conda activate modin && python -u ${HOME}/census-omnisci.py $*' > /entrypoint.sh
-
-ENTRYPOINT ["/bin/bash", "--login", "/entrypoint.sh"]
diff --git a/examples/docker/modin-omnisci/Dockerfile b/examples/docker/modin-omnisci/Dockerfile
new file mode 100644
index 00000000000..47ff64c9405
--- /dev/null
+++ b/examples/docker/modin-omnisci/Dockerfile
@@ -0,0 +1,81 @@
+# Licensed to Modin Development Team under one or more contributor license agreements.
+# See the NOTICE file distributed with this work for additional information regarding
+# copyright ownership.  The Modin Development Team licenses this file to you under the
+# Apache License, Version 2.0 (the "License"); you may not use this file except in
+# compliance with the License.  You may obtain a copy of the License at
+#
+#     http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software distributed under
+# the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF
+# ANY KIND, either express or implied. See the License for the specific language
+# governing permissions and limitations under the License.
+
+# Build image from this dockerfile like this:
+# docker build -t modin-omnisci:latest .
+
+FROM ubuntu:20.04
+
+# Proxy settings
+ENV http_proxy=${http_proxy}
+ENV https_proxy=${https_proxy}
+ENV no_proxy=${no_proxy}
+
+RUN apt-get update --yes \
+    && apt-get install wget --yes && \
+    rm -rf /var/lib/apt/lists/*
+
+# Modin settings
+ENV MODIN_BACKEND="omnisci"
+ENV MODIN_EXPERIMENTAL="true"
+
+ENV USER modin
+ENV UID 1000
+ENV HOME /home/$USER
+
+RUN adduser --disabled-password \
+    --gecos "Non-root user" \
+    --uid $UID \
+    --home $HOME \
+    $USER
+
+# Conda settings
+ENV CONDA_DIR=${HOME}/miniconda
+ENV CONDA_ENV_NAME=modin-omnisci
+ENV PATH="${CONDA_DIR}/bin:${PATH}"
+
+RUN wget -nv https://repo.anaconda.com/miniconda/Miniconda3-latest-Linux-x86_64.sh -O /tmp/miniconda3.sh \
+    && bash /tmp/miniconda3.sh -b -p "${CONDA_DIR}" -f -u \
+    && "${CONDA_DIR}/bin/conda" init bash \
+    && rm -f /tmp/miniconda3.sh
+
+RUN conda update -n base -c defaults conda -y \
+    && conda create -n ${CONDA_ENV_NAME} --yes -c conda-forge \
+        modin-omnisci \
+        scikit-learn \
+        scikit-learn-intelex \
+        xgboost \
+    && conda clean --all --yes
+
+# Activate ${CONDA_ENV_NAME} for interactive shells
+RUN echo "source ${CONDA_DIR}/bin/activate ${CONDA_ENV_NAME}" >> "${HOME}/.bashrc"
+# Activate ${CONDA_ENV_NAME} for non-interactive shells
+# The following line comments out line that prevents ~/.bashrc execution in
+# non-interactive mode.
+RUN sed -e 's,\(^[[:space:]]\+[*]) return;;$\),# \1,' -i "${HOME}/.bashrc"
+ENV BASH_ENV="${HOME}/.bashrc"
+
+# Set up benchmark scripts
+COPY nyc-taxi-omnisci.py "${HOME}"
+COPY census-omnisci.py "${HOME}"
+COPY plasticc-omnisci.py "${HOME}"
+RUN mkdir /dataset
+WORKDIR ${HOME}
+
+# Clean up proxy settings to publish on Docker Hub
+ENV http_proxy=
+ENV https_proxy=
+ENV no_proxy=
+
+# Set entrypoint with arguments expansion
+ENTRYPOINT ["/bin/bash", "-c", "exec $0 $*"]
diff --git a/examples/docker/modin-omnisci/build-docker-image.sh b/examples/docker/modin-omnisci/build-docker-image.sh
new file mode 100755
index 00000000000..f9bb4d0d567
--- /dev/null
+++ b/examples/docker/modin-omnisci/build-docker-image.sh
@@ -0,0 +1,39 @@
+#!/bin/bash -e
+
+# Licensed to Modin Development Team under one or more contributor license agreements.
+# See the NOTICE file distributed with this work for additional information regarding
+# copyright ownership.  The Modin Development Team licenses this file to you under the
+# Apache License, Version 2.0 (the "License"); you may not use this file except in
+# compliance with the License.  You may obtain a copy of the License at
+#
+#     http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software distributed under
+# the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF
+# ANY KIND, either express or implied. See the License for the specific language
+# governing permissions and limitations under the License.
+
+cd "`dirname \"$0\"`"
+
+docker build -t modin-omnisci .
+
+echo -e '\nNYC TAXI BENCHMARK
+User is responsible for preparing the dataset.
+It Can be generated by following the instructions on the link:
+https://github.com/toddwschneider/nyc-taxi-data#instructions
+To run the benchmark execute:
+\tdocker run --rm -v /path/to/dataset:/dataset python nyc-taxi-omnisci.py <name of file starting with /dataset>
+
+CENSUS BENCHMARK
+User is responsible for preparing the dataset.
+It can be downloaded by link:
+https://rapidsai-data.s3.us-east-2.amazonaws.com/datasets/ipums_education2income_1970-2010.csv.gz
+To run the benchmark execute:
+\tdocker run --rm -v /path/to/dataset:/dataset python census-omnisci.py <name of file starting with /dataset>
+
+PLASTICC BENCHMARK
+User is responsible for preparing the datasets.
+The datasets must include four files: training set, test set,
+training set metadata and test set metadata.
+To run the benchmark execute:
+\tdocker run --rm -v /path/to/dataset:/dataset python plasticc-omnisci.py <training set file name starting with /dataset> <test set file name starting with /dataset> <training set metadata file name starting with /dataset> <test set metadata file name starting with /dataset>\n'
diff --git a/examples/docker/census-on-omnisci/census-omnisci.py b/examples/docker/modin-omnisci/census-omnisci.py
similarity index 97%
rename from examples/docker/census-on-omnisci/census-omnisci.py
rename to examples/docker/modin-omnisci/census-omnisci.py
index bf2b2a95c33..c67ba76062e 100644
--- a/examples/docker/census-on-omnisci/census-omnisci.py
+++ b/examples/docker/modin-omnisci/census-omnisci.py
@@ -11,7 +11,6 @@
 # ANY KIND, either express or implied. See the License for the specific language
 # governing permissions and limitations under the License.
 
-import os
 import sys
 import time
 import modin.pandas as pd
@@ -252,7 +251,7 @@ def measure(name, func, *args, **kw):
 def main():
     if len(sys.argv) != 2:
         print(
-            f"USAGE: docker run --rm -v /path/to/dataset:/dataset census-omnisci <data file name in /path/to/dataset>"
+            f"USAGE: docker run --rm -v /path/to/dataset:/dataset python census-omnisci.py <data file name starting with /dataset>"
         )
         return
     # ML specific
@@ -260,7 +259,7 @@ def main():
     TEST_SIZE = 0.1
     RANDOM_STATE = 777
 
-    df = measure("Reading", read, os.path.join("/dataset", sys.argv[1]))
+    df = measure("Reading", read, sys.argv[1])
     _, X, y = measure("ETL", etl, df)
     measure(
         "ML", ml, X, y, random_state=RANDOM_STATE, n_runs=N_RUNS, test_size=TEST_SIZE
diff --git a/examples/docker/taxi-on-omnisci/nyc-taxi-omnisci.py b/examples/docker/modin-omnisci/nyc-taxi-omnisci.py
similarity index 97%
rename from examples/docker/taxi-on-omnisci/nyc-taxi-omnisci.py
rename to examples/docker/modin-omnisci/nyc-taxi-omnisci.py
index 52a7970dc0c..29a37b307bc 100644
--- a/examples/docker/taxi-on-omnisci/nyc-taxi-omnisci.py
+++ b/examples/docker/modin-omnisci/nyc-taxi-omnisci.py
@@ -11,7 +11,6 @@
 # ANY KIND, either express or implied. See the License for the specific language
 # governing permissions and limitations under the License.
 
-import os
 import sys
 import time
 import modin.pandas as pd
@@ -196,10 +195,10 @@ def measure(name, func, *args, **kw):
 def main():
     if len(sys.argv) != 2:
         print(
-            f"USAGE: docker run --rm -v /path/to/dataset:/dataset nyc-taxi-omnisci <data file name in /path/to/dataset>"
+            f"USAGE: docker run --rm -v /path/to/dataset:/dataset python nyc-taxi-omnisci.py <data file name starting with /dataset>"
         )
         return
-    df = measure("Reading", read, os.path.join("/dataset", sys.argv[1]))
+    df = measure("Reading", read, sys.argv[1])
     measure("Q1", q1_omnisci, df)
     measure("Q2", q2_omnisci, df)
     measure("Q3", q3_omnisci, df.copy())
diff --git a/examples/docker/plasticc-on-omnisci/plasticc-omnisci.py b/examples/docker/modin-omnisci/plasticc-omnisci.py
similarity index 95%
rename from examples/docker/plasticc-on-omnisci/plasticc-omnisci.py
rename to examples/docker/modin-omnisci/plasticc-omnisci.py
index 0f9db91938e..958a524d7e6 100644
--- a/examples/docker/plasticc-on-omnisci/plasticc-omnisci.py
+++ b/examples/docker/modin-omnisci/plasticc-omnisci.py
@@ -11,7 +11,6 @@
 # ANY KIND, either express or implied. See the License for the specific language
 # governing permissions and limitations under the License.
 
-import os
 import sys
 import time
 from collections import OrderedDict
@@ -253,7 +252,7 @@ def ml(train_final, test_final):
 def main():
     if len(sys.argv) != 5:
         print(
-            f"USAGE: docker run --rm -v /path/to/dataset:/dataset plasticc-omnisci <training set file name in /path/to/dataset> <test set file name in /path/to/dataset> <training set metadata file name in /path/to/dataset> <test set metadata file name in /path/to/dataset>"
+            f"USAGE: docker run --rm -v /path/to/dataset:/dataset python plasticc-omnisci.py <training set file name startin with /dataset> <test set file name starting with /dataset> <training set metadata file name starting with /dataset> <test set metadata file name starting with /dataset>"
         )
         return
 
@@ -262,10 +261,10 @@ def main():
     train, train_meta, test, test_meta = measure(
         "Reading",
         read,
-        os.path.join("/dataset", sys.argv[1]),
-        os.path.join("/dataset", sys.argv[2]),
-        os.path.join("/dataset", sys.argv[3]),
-        os.path.join("/dataset", sys.argv[4]),
+        sys.argv[1],
+        sys.argv[2],
+        sys.argv[3],
+        sys.argv[4],
         dtypes,
         meta_dtypes,
     )
diff --git a/examples/docker/modin-ray/Dockerfile b/examples/docker/modin-ray/Dockerfile
new file mode 100644
index 00000000000..2fce4d28d97
--- /dev/null
+++ b/examples/docker/modin-ray/Dockerfile
@@ -0,0 +1,78 @@
+# Licensed to Modin Development Team under one or more contributor license agreements.
+# See the NOTICE file distributed with this work for additional information regarding
+# copyright ownership.  The Modin Development Team licenses this file to you under the
+# Apache License, Version 2.0 (the "License"); you may not use this file except in
+# compliance with the License.  You may obtain a copy of the License at
+#
+#     http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software distributed under
+# the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF
+# ANY KIND, either express or implied. See the License for the specific language
+# governing permissions and limitations under the License.
+
+# Build image from this dockerfile like this:
+# docker build -t modin-ray:latest .
+
+FROM ubuntu:20.04
+
+# Proxy settings
+ENV http_proxy=${http_proxy}
+ENV https_proxy=${https_proxy}
+ENV no_proxy=${no_proxy}
+
+RUN apt-get update --yes \
+    && apt-get install wget --yes && \
+    rm -rf /var/lib/apt/lists/*
+
+ENV USER modin
+ENV UID 1000
+ENV HOME /home/$USER
+
+RUN adduser --disabled-password \
+    --gecos "Non-root user" \
+    --uid $UID \
+    --home $HOME \
+    $USER
+
+# Conda settings
+ENV CONDA_DIR=${HOME}/miniconda
+ENV CONDA_ENV_NAME=modin-ray
+ENV PATH="${CONDA_DIR}/bin:${PATH}"
+
+RUN wget -nv https://repo.anaconda.com/miniconda/Miniconda3-latest-Linux-x86_64.sh -O /tmp/miniconda3.sh \
+    && bash /tmp/miniconda3.sh -b -p "${CONDA_DIR}" -f -u \
+    && "${CONDA_DIR}/bin/conda" init bash \
+    && rm -f /tmp/miniconda3.sh
+
+RUN conda update -n base -c defaults conda -y \
+    && conda create -n ${CONDA_ENV_NAME} --yes -c conda-forge \
+        modin-ray \
+        ray-dashboard \
+        scikit-learn \
+        scikit-learn-intelex \
+        xgboost \
+    && conda clean --all --yes
+
+# Activate ${CONDA_ENV_NAME} for interactive shells
+RUN echo "source ${CONDA_DIR}/bin/activate ${CONDA_ENV_NAME}" >> "${HOME}/.bashrc"
+# Activate ${CONDA_ENV_NAME} for non-interactive shells
+# The following line comments out line that prevents ~/.bashrc execution in
+# non-interactive mode.
+RUN sed -e 's,\(^[[:space:]]\+[*]) return;;$\),# \1,' -i "${HOME}/.bashrc"
+ENV BASH_ENV="${HOME}/.bashrc"
+
+# Set up benchmark scripts
+COPY nyc-taxi.py "${HOME}"
+COPY census.py "${HOME}"
+COPY plasticc.py "${HOME}"
+RUN mkdir /dataset
+WORKDIR ${HOME}
+
+# Clean up proxy settings to publish on Docker Hub
+ENV http_proxy=
+ENV https_proxy=
+ENV no_proxy=
+
+# Set entrypoint with arguments expansion
+ENTRYPOINT ["/bin/bash", "-c", "exec $0 $*"]
diff --git a/examples/docker/modin-ray/build-docker-image.sh b/examples/docker/modin-ray/build-docker-image.sh
new file mode 100755
index 00000000000..2fef8eaff4e
--- /dev/null
+++ b/examples/docker/modin-ray/build-docker-image.sh
@@ -0,0 +1,39 @@
+#!/bin/bash -e
+
+# Licensed to Modin Development Team under one or more contributor license agreements.
+# See the NOTICE file distributed with this work for additional information regarding
+# copyright ownership.  The Modin Development Team licenses this file to you under the
+# Apache License, Version 2.0 (the "License"); you may not use this file except in
+# compliance with the License.  You may obtain a copy of the License at
+#
+#     http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software distributed under
+# the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF
+# ANY KIND, either express or implied. See the License for the specific language
+# governing permissions and limitations under the License.
+
+cd "`dirname \"$0\"`"
+
+docker build -t modin-ray .
+
+echo -e '\nNYC TAXI BENCHMARK
+User is responsible for preparing the dataset.
+It Can be generated by following the instructions on the link:
+https://github.com/toddwschneider/nyc-taxi-data#instructions
+To run the benchmark execute:
+\tdocker run --rm -v /path/to/dataset:/dataset python nyc-taxi.py <name of file starting with /dataset>
+
+CENSUS BENCHMARK
+User is responsible for preparing the dataset.
+It can be downloaded by link:
+https://rapidsai-data.s3.us-east-2.amazonaws.com/datasets/ipums_education2income_1970-2010.csv.gz
+To run the benchmark execute:
+\tdocker run --rm -v /path/to/dataset:/dataset python census.py <name of file starting with /dataset>
+
+PLASTICC BENCHMARK
+User is responsible for preparing the datasets.
+The datasets must include four files: training set, test set,
+training set metadata and test set metadata.
+To run the benchmark execute:
+\tdocker run --rm -v /path/to/dataset:/dataset python plasticc.py <training set file name starting with /dataset> <test set file name starting with /dataset> <training set metadata file name starting with /dataset> <test set metadata file name starting with /dataset>\n'
diff --git a/examples/docker/modin-ray/census.py b/examples/docker/modin-ray/census.py
new file mode 100644
index 00000000000..3e066dd8f7e
--- /dev/null
+++ b/examples/docker/modin-ray/census.py
@@ -0,0 +1,258 @@
+# Licensed to Modin Development Team under one or more contributor license agreements.
+# See the NOTICE file distributed with this work for additional information regarding
+# copyright ownership.  The Modin Development Team licenses this file to you under the
+# Apache License, Version 2.0 (the "License"); you may not use this file except in
+# compliance with the License.  You may obtain a copy of the License at
+#
+#     http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software distributed under
+# the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF
+# ANY KIND, either express or implied. See the License for the specific language
+# governing permissions and limitations under the License.
+
+import sys
+import time
+import modin.pandas as pd
+
+from sklearn import config_context
+import sklearnex
+
+sklearnex.patch_sklearn()
+from sklearn.model_selection import train_test_split
+import sklearn.linear_model as lm
+import numpy as np
+
+
+def read(filename):
+    columns_names = [
+        "YEAR0",
+        "DATANUM",
+        "SERIAL",
+        "CBSERIAL",
+        "HHWT",
+        "CPI99",
+        "GQ",
+        "QGQ",
+        "PERNUM",
+        "PERWT",
+        "SEX",
+        "AGE",
+        "EDUC",
+        "EDUCD",
+        "INCTOT",
+        "SEX_HEAD",
+        "SEX_MOM",
+        "SEX_POP",
+        "SEX_SP",
+        "SEX_MOM2",
+        "SEX_POP2",
+        "AGE_HEAD",
+        "AGE_MOM",
+        "AGE_POP",
+        "AGE_SP",
+        "AGE_MOM2",
+        "AGE_POP2",
+        "EDUC_HEAD",
+        "EDUC_MOM",
+        "EDUC_POP",
+        "EDUC_SP",
+        "EDUC_MOM2",
+        "EDUC_POP2",
+        "EDUCD_HEAD",
+        "EDUCD_MOM",
+        "EDUCD_POP",
+        "EDUCD_SP",
+        "EDUCD_MOM2",
+        "EDUCD_POP2",
+        "INCTOT_HEAD",
+        "INCTOT_MOM",
+        "INCTOT_POP",
+        "INCTOT_SP",
+        "INCTOT_MOM2",
+        "INCTOT_POP2",
+    ]
+    columns_types = [
+        "int64",
+        "int64",
+        "int64",
+        "float64",
+        "int64",
+        "float64",
+        "int64",
+        "float64",
+        "int64",
+        "int64",
+        "int64",
+        "int64",
+        "int64",
+        "int64",
+        "int64",
+        "float64",
+        "float64",
+        "float64",
+        "float64",
+        "float64",
+        "float64",
+        "float64",
+        "float64",
+        "float64",
+        "float64",
+        "float64",
+        "float64",
+        "float64",
+        "float64",
+        "float64",
+        "float64",
+        "float64",
+        "float64",
+        "float64",
+        "float64",
+        "float64",
+        "float64",
+        "float64",
+        "float64",
+        "float64",
+        "float64",
+        "float64",
+        "float64",
+        "float64",
+        "float64",
+    ]
+    dtypes = {columns_names[i]: columns_types[i] for i in range(len(columns_names))}
+
+    df = pd.read_csv(
+        filename,
+        names=columns_names,
+        dtype=dtypes,
+        skiprows=1,
+    )
+
+    return df
+
+
+def etl(df):
+    keep_cols = [
+        "YEAR0",
+        "DATANUM",
+        "SERIAL",
+        "CBSERIAL",
+        "HHWT",
+        "CPI99",
+        "GQ",
+        "PERNUM",
+        "SEX",
+        "AGE",
+        "INCTOT",
+        "EDUC",
+        "EDUCD",
+        "EDUC_HEAD",
+        "EDUC_POP",
+        "EDUC_MOM",
+        "EDUCD_MOM2",
+        "EDUCD_POP2",
+        "INCTOT_MOM",
+        "INCTOT_POP",
+        "INCTOT_MOM2",
+        "INCTOT_POP2",
+        "INCTOT_HEAD",
+        "SEX_HEAD",
+    ]
+    df = df[keep_cols]
+
+    df = df[df["INCTOT"] != 9999999]
+    df = df[df["EDUC"] != -1]
+    df = df[df["EDUCD"] != -1]
+
+    df["INCTOT"] = df["INCTOT"] * df["CPI99"]
+
+    for column in keep_cols:
+        df[column] = df[column].fillna(-1)
+
+        df[column] = df[column].astype("float64")
+
+    y = df["EDUC"]
+    X = df.drop(columns=["EDUC", "CPI99"])
+
+    return (df, X, y)
+
+
+def mse(y_test, y_pred):
+    return ((y_test - y_pred) ** 2).mean()
+
+
+def cod(y_test, y_pred):
+    y_bar = y_test.mean()
+    total = ((y_test - y_bar) ** 2).sum()
+    residuals = ((y_test - y_pred) ** 2).sum()
+    return 1 - (residuals / total)
+
+
+def ml(X, y, random_state, n_runs, test_size):
+    clf = lm.Ridge()
+
+    X = np.ascontiguousarray(X, dtype=np.float64)
+    y = np.ascontiguousarray(y, dtype=np.float64)
+
+    mse_values, cod_values = [], []
+    ml_scores = {}
+
+    print("ML runs: ", n_runs)
+    for i in range(n_runs):
+        (X_train, X_test, y_train, y_test) = train_test_split(
+            X, y, test_size=test_size, random_state=random_state
+        )
+        random_state += 777
+
+        with config_context(assume_finite=True):
+            model = clf.fit(X_train, y_train)
+
+        y_pred = model.predict(X_test)
+
+        mse_values.append(mse(y_test, y_pred))
+        cod_values.append(cod(y_test, y_pred))
+
+    ml_scores["mse_mean"] = sum(mse_values) / len(mse_values)
+    ml_scores["cod_mean"] = sum(cod_values) / len(cod_values)
+    ml_scores["mse_dev"] = pow(
+        sum([(mse_value - ml_scores["mse_mean"]) ** 2 for mse_value in mse_values])
+        / (len(mse_values) - 1),
+        0.5,
+    )
+    ml_scores["cod_dev"] = pow(
+        sum([(cod_value - ml_scores["cod_mean"]) ** 2 for cod_value in cod_values])
+        / (len(cod_values) - 1),
+        0.5,
+    )
+
+    return ml_scores
+
+
+def measure(name, func, *args, **kw):
+    t0 = time.time()
+    res = func(*args, **kw)
+    t1 = time.time()
+    print(f"{name}: {t1 - t0} sec")
+    return res
+
+
+def main():
+    if len(sys.argv) != 2:
+        print(
+            f"USAGE: docker run --rm -v /path/to/dataset:/dataset python census.py <data file name starting with /dataset>"
+        )
+        return
+    # ML specific
+    N_RUNS = 50
+    TEST_SIZE = 0.1
+    RANDOM_STATE = 777
+
+    df = measure("Reading", read, sys.argv[1])
+    _, X, y = measure("ETL", etl, df)
+    measure(
+        "ML", ml, X, y, random_state=RANDOM_STATE, n_runs=N_RUNS, test_size=TEST_SIZE
+    )
+
+
+if __name__ == "__main__":
+    main()
diff --git a/examples/docker/modin-ray/nyc-taxi.py b/examples/docker/modin-ray/nyc-taxi.py
new file mode 100644
index 00000000000..402928988fe
--- /dev/null
+++ b/examples/docker/modin-ray/nyc-taxi.py
@@ -0,0 +1,127 @@
+# Licensed to Modin Development Team under one or more contributor license agreements.
+# See the NOTICE file distributed with this work for additional information regarding
+# copyright ownership.  The Modin Development Team licenses this file to you under the
+# Apache License, Version 2.0 (the "License"); you may not use this file except in
+# compliance with the License.  You may obtain a copy of the License at
+#
+#     http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software distributed under
+# the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF
+# ANY KIND, either express or implied. See the License for the specific language
+# governing permissions and limitations under the License.
+
+import sys
+import time
+import modin.pandas as pd
+
+
+def read(filename):
+    columns_names = [
+        "trip_id",
+        "vendor_id",
+        "pickup_datetime",
+        "dropoff_datetime",
+        "store_and_fwd_flag",
+        "rate_code_id",
+        "pickup_longitude",
+        "pickup_latitude",
+        "dropoff_longitude",
+        "dropoff_latitude",
+        "passenger_count",
+        "trip_distance",
+        "fare_amount",
+        "extra",
+        "mta_tax",
+        "tip_amount",
+        "tolls_amount",
+        "ehail_fee",
+        "improvement_surcharge",
+        "total_amount",
+        "payment_type",
+        "trip_type",
+        "pickup",
+        "dropoff",
+        "cab_type",
+        "precipitation",
+        "snow_depth",
+        "snowfall",
+        "max_temperature",
+        "min_temperature",
+        "average_wind_speed",
+        "pickup_nyct2010_gid",
+        "pickup_ctlabel",
+        "pickup_borocode",
+        "pickup_boroname",
+        "pickup_ct2010",
+        "pickup_boroct2010",
+        "pickup_cdeligibil",
+        "pickup_ntacode",
+        "pickup_ntaname",
+        "pickup_puma",
+        "dropoff_nyct2010_gid",
+        "dropoff_ctlabel",
+        "dropoff_borocode",
+        "dropoff_boroname",
+        "dropoff_ct2010",
+        "dropoff_boroct2010",
+        "dropoff_cdeligibil",
+        "dropoff_ntacode",
+        "dropoff_ntaname",
+        "dropoff_puma",
+    ]
+    parse_dates = ["pickup_datetime", "dropoff_datetime"]
+    return pd.read_csv(
+        filename, names=columns_names, header=None, parse_dates=parse_dates
+    )
+
+
+def q1(df):
+    return df.groupby("cab_type")["cab_type"].count()
+
+
+def q2(df):
+    return df.groupby("passenger_count", as_index=False).mean()[
+        ["passenger_count", "total_amount"]
+    ]
+
+
+def q3(df):
+    df["pickup_datetime"] = df["pickup_datetime"].dt.year
+    return df.groupby(["pickup_datetime", "passenger_count"]).size().reset_index()
+
+
+def q4(df):
+    df["pickup_datetime"] = df["pickup_datetime"].dt.year
+    df["trip_distance"] = df["trip_distance"].astype("int64")
+    return (
+        df.groupby(["passenger_count", "pickup_datetime", "trip_distance"])
+        .size()
+        .reset_index()
+        .sort_values(by=["pickup_datetime", 0], ascending=[True, False])
+    )
+
+
+def measure(name, func, *args, **kw):
+    t0 = time.time()
+    res = func(*args, **kw)
+    t1 = time.time()
+    print(f"{name}: {t1 - t0} sec")
+    return res
+
+
+def main():
+    if len(sys.argv) != 2:
+        print(
+            f"USAGE: docker run --rm -v /path/to/dataset:/dataset python nyc-taxi.py <data file name starting with /dataset>"
+        )
+        return
+    df = measure("Reading", read, sys.argv[1])
+    measure("Q1", q1, df)
+    measure("Q2", q2, df)
+    measure("Q3", q3, df.copy())
+    measure("Q4", q4, df.copy())
+
+
+if __name__ == "__main__":
+    main()
diff --git a/examples/docker/modin-ray/plasticc.py b/examples/docker/modin-ray/plasticc.py
new file mode 100644
index 00000000000..92440bc3688
--- /dev/null
+++ b/examples/docker/modin-ray/plasticc.py
@@ -0,0 +1,271 @@
+# Licensed to Modin Development Team under one or more contributor license agreements.
+# See the NOTICE file distributed with this work for additional information regarding
+# copyright ownership.  The Modin Development Team licenses this file to you under the
+# Apache License, Version 2.0 (the "License"); you may not use this file except in
+# compliance with the License.  You may obtain a copy of the License at
+#
+#     http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software distributed under
+# the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF
+# ANY KIND, either express or implied. See the License for the specific language
+# governing permissions and limitations under the License.
+
+import sys
+import time
+from collections import OrderedDict
+from functools import partial
+import modin.pandas as pd
+
+import numpy as np
+import xgboost as xgb
+
+import sklearnex
+
+sklearnex.patch_sklearn()
+from sklearn.model_selection import train_test_split
+from sklearn.preprocessing import LabelEncoder
+
+
+################ helper functions ###############################
+def create_dtypes():
+    dtypes = OrderedDict(
+        [
+            ("object_id", "int32"),
+            ("mjd", "float32"),
+            ("passband", "int32"),
+            ("flux", "float32"),
+            ("flux_err", "float32"),
+            ("detected", "int32"),
+        ]
+    )
+
+    # load metadata
+    columns_names = [
+        "object_id",
+        "ra",
+        "decl",
+        "gal_l",
+        "gal_b",
+        "ddf",
+        "hostgal_specz",
+        "hostgal_photoz",
+        "hostgal_photoz_err",
+        "distmod",
+        "mwebv",
+        "target",
+    ]
+    meta_dtypes = ["int32"] + ["float32"] * 4 + ["int32"] + ["float32"] * 5 + ["int32"]
+    meta_dtypes = OrderedDict(
+        [(columns_names[i], meta_dtypes[i]) for i in range(len(meta_dtypes))]
+    )
+    return dtypes, meta_dtypes
+
+
+def ravel_column_names(cols):
+    d0 = cols.get_level_values(0)
+    d1 = cols.get_level_values(1)
+    return ["%s_%s" % (i, j) for i, j in zip(d0, d1)]
+
+
+def measure(name, func, *args, **kw):
+    t0 = time.time()
+    res = func(*args, **kw)
+    t1 = time.time()
+    print(f"{name}: {t1 - t0} sec")
+    return res
+
+
+def all_etl(train, train_meta, test, test_meta):
+    train_final = etl(train, train_meta)
+    test_final = etl(test, test_meta)
+    return (train_final, test_final)
+
+
+def split_step(train_final, test_final):
+    X = train_final.drop(["object_id", "target"], axis=1).values
+    Xt = test_final.drop(["object_id"], axis=1).values
+
+    y = train_final["target"]
+    assert X.shape[1] == Xt.shape[1]
+    classes = sorted(y.unique())
+
+    class_weights = {c: 1 for c in classes}
+    class_weights.update({c: 2 for c in [64, 15]})
+
+    lbl = LabelEncoder()
+    y = lbl.fit_transform(y)
+
+    X_train, X_test, y_train, y_test = train_test_split(
+        X, y, test_size=0.1, stratify=y, random_state=126
+    )
+
+    return X_train, y_train, X_test, y_test, Xt, classes, class_weights
+
+
+def multi_weighted_logloss(y_true, y_preds, classes, class_weights):
+    """
+    refactor from
+    @author olivier https://www.kaggle.com/ogrellier
+    multi logloss for PLAsTiCC challenge
+    """
+    y_p = y_preds.reshape(y_true.shape[0], len(classes), order="F")
+    y_ohe = pd.get_dummies(y_true)
+    y_p = np.clip(a=y_p, a_min=1e-15, a_max=1 - 1e-15)
+    y_p_log = np.log(y_p)
+    y_log_ones = np.sum(y_ohe.values * y_p_log, axis=0)
+    nb_pos = y_ohe.sum(axis=0).values.astype(float)
+    class_arr = np.array([class_weights[k] for k in sorted(class_weights.keys())])
+    y_w = y_log_ones * class_arr / nb_pos
+
+    loss = -np.sum(y_w) / np.sum(class_arr)
+    return loss
+
+
+def xgb_multi_weighted_logloss(y_predicted, y_true, classes, class_weights):
+    loss = multi_weighted_logloss(
+        y_true.get_label(), y_predicted, classes, class_weights
+    )
+    return "wloss", loss
+
+
+################ helper functions ###############################
+
+
+def read(
+    training_set_filename,
+    test_set_filename,
+    training_set_metadata_filename,
+    test_set_metadata_filename,
+    dtypes,
+    meta_dtypes,
+):
+    train = pd.read_csv(training_set_filename, dtype=dtypes)
+    test = pd.read_csv(
+        test_set_filename,
+        names=list(dtypes.keys()),
+        dtype=dtypes,
+        header=0,
+    )
+
+    train_meta = pd.read_csv(training_set_metadata_filename, dtype=meta_dtypes)
+    target = meta_dtypes.pop("target")
+    test_meta = pd.read_csv(test_set_metadata_filename, dtype=meta_dtypes)
+    meta_dtypes["target"] = target
+
+    dfs = (train, train_meta, test, test_meta)
+    return dfs
+
+
+def etl(df, df_meta):
+    # workaround for both Modin_on_ray and Modin_on_omnisci modes. Eventually this should be fixed
+    df["flux_ratio_sq"] = (df["flux"] / df["flux_err"]) * (
+        df["flux"] / df["flux_err"]
+    )  # np.power(df["flux"] / df["flux_err"], 2.0)
+    df["flux_by_flux_ratio_sq"] = df["flux"] * df["flux_ratio_sq"]
+
+    aggs = {
+        "passband": ["mean"],
+        "flux": ["min", "max", "mean", "skew"],
+        "flux_err": ["min", "max", "mean"],
+        "detected": ["mean"],
+        "mjd": ["max", "min"],
+        "flux_ratio_sq": ["sum"],
+        "flux_by_flux_ratio_sq": ["sum"],
+    }
+    agg_df = df.groupby("object_id", sort=False).agg(aggs)
+
+    agg_df.columns = ravel_column_names(agg_df.columns)
+
+    agg_df["flux_diff"] = agg_df["flux_max"] - agg_df["flux_min"]
+    agg_df["flux_dif2"] = agg_df["flux_diff"] / agg_df["flux_mean"]
+    agg_df["flux_w_mean"] = (
+        agg_df["flux_by_flux_ratio_sq_sum"] / agg_df["flux_ratio_sq_sum"]
+    )
+    agg_df["flux_dif3"] = agg_df["flux_diff"] / agg_df["flux_w_mean"]
+    agg_df["mjd_diff"] = agg_df["mjd_max"] - agg_df["mjd_min"]
+
+    agg_df = agg_df.drop(["mjd_max", "mjd_min"], axis=1)
+
+    agg_df = agg_df.reset_index()
+
+    df_meta = df_meta.drop(["ra", "decl", "gal_l", "gal_b"], axis=1)
+
+    df_meta = df_meta.merge(agg_df, on="object_id", how="left")
+
+    return df_meta
+
+
+def ml(train_final, test_final):
+    X_train, y_train, X_test, y_test, Xt, classes, class_weights = split_step(
+        train_final, test_final
+    )
+
+    cpu_params = {
+        "objective": "multi:softprob",
+        "eval_metric": "merror",
+        "tree_method": "hist",
+        "nthread": 16,
+        "num_class": 14,
+        "max_depth": 7,
+        "verbosity": 1,
+        "subsample": 0.7,
+        "colsample_bytree": 0.7,
+    }
+
+    func_loss = partial(
+        xgb_multi_weighted_logloss, classes=classes, class_weights=class_weights
+    )
+
+    dtrain = xgb.DMatrix(data=X_train, label=y_train)
+    dvalid = xgb.DMatrix(data=X_test, label=y_test)
+    dtest = xgb.DMatrix(data=Xt)
+
+    watchlist = [(dvalid, "eval"), (dtrain, "train")]
+
+    clf = xgb.train(
+        cpu_params,
+        dtrain=dtrain,
+        num_boost_round=60,
+        evals=watchlist,
+        feval=func_loss,
+        early_stopping_rounds=10,
+        verbose_eval=None,
+    )
+
+    yp = clf.predict(dvalid)
+    cpu_loss = multi_weighted_logloss(y_test, yp, classes, class_weights)
+    ysub = clf.predict(dtest)  # noqa: F841 (unused variable)
+
+    return cpu_loss
+
+
+def main():
+    if len(sys.argv) != 5:
+        print(
+            f"USAGE: docker run --rm -v /path/to/dataset:/dataset python plasticc.py <training set file name startin with /dataset> <test set file name starting with /dataset> <training set metadata file name starting with /dataset> <test set metadata file name starting with /dataset>"
+        )
+        return
+
+    dtypes, meta_dtypes = create_dtypes()
+
+    train, train_meta, test, test_meta = measure(
+        "Reading",
+        read,
+        sys.argv[1],
+        sys.argv[2],
+        sys.argv[3],
+        sys.argv[4],
+        dtypes,
+        meta_dtypes,
+    )
+    train_final, test_final = measure(
+        "ETL", all_etl, train, train_meta, test, test_meta
+    )
+    cpu_loss = measure("ML", ml, train_final, test_final)
+
+    print("validation cpu_loss:", cpu_loss)
+
+
+if __name__ == "__main__":
+    main()
diff --git a/examples/docker/nyc-taxi.dockerfile b/examples/docker/nyc-taxi.dockerfile
deleted file mode 100644
index 2d6c816cfa6..00000000000
--- a/examples/docker/nyc-taxi.dockerfile
+++ /dev/null
@@ -1,58 +0,0 @@
-# Licensed to Modin Development Team under one or more contributor license agreements.
-# See the NOTICE file distributed with this work for additional information regarding
-# copyright ownership.  The Modin Development Team licenses this file to you under the
-# Apache License, Version 2.0 (the "License"); you may not use this file except in
-# compliance with the License.  You may obtain a copy of the License at
-#
-#     http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software distributed under
-# the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF
-# ANY KIND, either express or implied. See the License for the specific language
-# governing permissions and limitations under the License.
-
-FROM ubuntu:18.04
-
-ARG PYTHON_VERSION=3.7
-ENV http_proxy ${http_proxy}
-ENV https_proxy ${https_proxy}
-
-RUN apt-get update --yes && \
-    apt-get install --yes --no-install-recommends --fix-missing \
-        gcc \
-        python${PYTHON_VERSION}-dev \
-        wget && \
-    rm -rf /var/lib/apt/lists/*
-
-ENV USER modin
-ENV UID 1000
-ENV HOME /home/$USER
-
-RUN adduser --disabled-password \
-    --gecos "Non-root user" \
-    --uid $UID \
-    --home $HOME \
-    $USER
-
-ENV CONDA_DIR ${HOME}/miniconda
-
-SHELL ["/bin/bash", "--login", "-c"]
-
-RUN wget --quiet --no-check-certificate https://repo.anaconda.com/miniconda/Miniconda3-latest-Linux-x86_64.sh -O /tmp/miniconda3.sh && \
-    bash /tmp/miniconda3.sh -b -p "${CONDA_DIR}" -f -u && \
-    "${CONDA_DIR}/bin/conda" init bash && \
-    rm -f /tmp/miniconda3.sh && \
-    echo ". '${CONDA_DIR}/etc/profile.d/conda.sh'" >> "${HOME}/.profile"
-
-RUN conda update -n base -c defaults conda -y && \
-    conda create --name modin --yes python==3.7.6 && \
-    conda activate modin && \
-    pip install --no-cache-dir modin[ray] && \
-    conda clean --all --yes
-
-RUN wget --quiet --no-check-certificate https://modin-datasets.s3.amazonaws.com/trips_data.csv -O "${HOME}/trips_data.csv"
-
-COPY nyc-taxi.py "${HOME}/nyc-taxi.py"
-
-ENTRYPOINT ["/bin/bash", "--login", "-c", "http_proxy= https_proxy= conda run \"$@\"", "/bin/bash", "-n", "modin", "/usr/bin/env", "--"]
-CMD ["python", "${HOME}/nyc-taxi.py"]
diff --git a/examples/docker/nyc-taxi.py b/examples/docker/nyc-taxi.py
deleted file mode 100644
index 753b857b52b..00000000000
--- a/examples/docker/nyc-taxi.py
+++ /dev/null
@@ -1,69 +0,0 @@
-# Licensed to Modin Development Team under one or more contributor license agreements.
-# See the NOTICE file distributed with this work for additional information regarding
-# copyright ownership.  The Modin Development Team licenses this file to you under the
-# Apache License, Version 2.0 (the "License"); you may not use this file except in
-# compliance with the License.  You may obtain a copy of the License at
-#
-#     http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software distributed under
-# the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF
-# ANY KIND, either express or implied. See the License for the specific language
-# governing permissions and limitations under the License.
-
-import os
-import time
-import modin.pandas as pd
-
-def read():
-    columns_names = [
-        "trip_id", "vendor_id", "pickup_datetime", "dropoff_datetime", "store_and_fwd_flag",
-        "rate_code_id", "pickup_longitude", "pickup_latitude", "dropoff_longitude", "dropoff_latitude",
-        "passenger_count", "trip_distance", "fare_amount", "extra", "mta_tax", "tip_amount",
-        "tolls_amount", "ehail_fee", "improvement_surcharge", "total_amount", "payment_type",
-        "trip_type", "pickup", "dropoff", "cab_type", "precipitation", "snow_depth", "snowfall",
-        "max_temperature", "min_temperature", "average_wind_speed", "pickup_nyct2010_gid",
-        "pickup_ctlabel", "pickup_borocode", "pickup_boroname", "pickup_ct2010",
-        "pickup_boroct2010", "pickup_cdeligibil", "pickup_ntacode", "pickup_ntaname", "pickup_puma",
-        "dropoff_nyct2010_gid", "dropoff_ctlabel", "dropoff_borocode", "dropoff_boroname",
-        "dropoff_ct2010", "dropoff_boroct2010", "dropoff_cdeligibil", "dropoff_ntacode",
-        "dropoff_ntaname", "dropoff_puma",
-    ]
-    parse_dates=["pickup_datetime", "dropoff_datetime"]
-    return pd.read_csv(os.path.expanduser('~/trips_data.csv'), names=columns_names,
-                header=None, parse_dates=parse_dates)
-
-def q1(df):
-    return df.groupby("cab_type")["cab_type"].count()
-
-def q2(df):
-    return df.groupby("passenger_count", as_index=False).mean()[["passenger_count", "total_amount"]]
-
-def q3(df):
-    df["pickup_datetime"] = df["pickup_datetime"].dt.year
-    return df.groupby(["pickup_datetime", "passenger_count"]).size().reset_index()
-
-
-def q4(df):
-    df["pickup_datetime"] = df["pickup_datetime"].dt.year
-    df["trip_distance"] = df["trip_distance"].astype("int64")
-    return df.groupby(["passenger_count", "pickup_datetime", "trip_distance"])  \
-            .size().reset_index().sort_values(by=["pickup_datetime", 0], ascending=[True, False])
-
-def measure(name, func, *args, **kw):
-    t0 = time.time()
-    res = func(*args, **kw)
-    t1 = time.time()
-    print(f'{name}: {t1 - t0} sec')
-    return res
-
-def main():
-    df = measure('Reading', read)
-    measure('Q1', q1, df)
-    measure('Q2', q2, df)
-    measure('Q3', q3, df.copy())
-    measure('Q4', q4, df.copy())
-
-if __name__ == '__main__':
-    main()
-
diff --git a/examples/docker/plasticc-on-omnisci/build-docker-image.sh b/examples/docker/plasticc-on-omnisci/build-docker-image.sh
deleted file mode 100644
index b6e784d35ff..00000000000
--- a/examples/docker/plasticc-on-omnisci/build-docker-image.sh
+++ /dev/null
@@ -1,25 +0,0 @@
-#!/bin/bash -e
-
-# Licensed to Modin Development Team under one or more contributor license agreements.
-# See the NOTICE file distributed with this work for additional information regarding
-# copyright ownership.  The Modin Development Team licenses this file to you under the
-# Apache License, Version 2.0 (the "License"); you may not use this file except in
-# compliance with the License.  You may obtain a copy of the License at
-#
-#     http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software distributed under
-# the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF
-# ANY KIND, either express or implied. See the License for the specific language
-# governing permissions and limitations under the License.
-
-cd "`dirname \"$0\"`"
-
-docker build -f plasticc-omnisci.dockerfile -t plasticc-omnisci --build-arg no_proxy \
-    --build-arg https_proxy --build-arg http_proxy .
-
-echo -e "\nNote: a user is responsible for preparing the datasets.
-The datasets must include four files: training set, test set,
-training set metadata and test set metadata."
-printf "\n\nTo run the benchmark execute:\n"
-printf "\tdocker run --rm -v /path/to/dataset:/dataset plasticc-omnisci <training set file name in /path/to/dataset> <test set file name in /path/to/dataset> <training set metadata file name in /path/to/dataset> <test set metadata file name in /path/to/dataset>\n"
diff --git a/examples/docker/plasticc-on-omnisci/plasticc-omnisci.dockerfile b/examples/docker/plasticc-on-omnisci/plasticc-omnisci.dockerfile
deleted file mode 100644
index afb91917dd1..00000000000
--- a/examples/docker/plasticc-on-omnisci/plasticc-omnisci.dockerfile
+++ /dev/null
@@ -1,56 +0,0 @@
-# Licensed to Modin Development Team under one or more contributor license agreements.
-# See the NOTICE file distributed with this work for additional information regarding
-# copyright ownership.  The Modin Development Team licenses this file to you under the
-# Apache License, Version 2.0 (the "License"); you may not use this file except in
-# compliance with the License.  You may obtain a copy of the License at
-#
-#     http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software distributed under
-# the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF
-# ANY KIND, either express or implied. See the License for the specific language
-# governing permissions and limitations under the License.
-
-FROM ubuntu:18.04
-ENV http_proxy ${http_proxy}
-ENV https_proxy ${https_proxy}
-ENV no_proxy ${no_proxy}
-ENV MODIN_BACKEND "omnisci"
-ENV MODIN_EXPERIMENTAL "true"
-
-RUN apt-get update --yes \
-    && apt-get install wget --yes && \
-    rm -rf /var/lib/apt/lists/*
-
-ENV USER modin
-ENV UID 1000
-ENV HOME /home/$USER
-
-RUN adduser --disabled-password \
-    --gecos "Non-root user" \
-    --uid $UID \
-    --home $HOME \
-    $USER
-
-ENV CONDA_DIR ${HOME}/miniconda
-
-SHELL ["/bin/bash", "--login", "-c"]
-
-RUN wget -nv https://repo.anaconda.com/miniconda/Miniconda3-latest-Linux-x86_64.sh -O /tmp/miniconda3.sh && \
-    bash /tmp/miniconda3.sh -b -p "${CONDA_DIR}" -f -u && \
-    "${CONDA_DIR}/bin/conda" init bash && \
-    rm -f /tmp/miniconda3.sh && \
-    echo ". '${CONDA_DIR}/etc/profile.d/conda.sh'" >> "${HOME}/.profile"
-
-RUN conda update -n base -c defaults conda -y && \
-    conda config --set channel_priority strict && \
-    conda create -n modin --yes --no-default-packages && \
-    conda activate modin && \
-    conda install -c conda-forge modin-omnisci scikit-learn scikit-learn-intelex xgboost && \
-    conda clean --all --yes
-
-COPY plasticc-omnisci.py "${HOME}/plasticc-omnisci.py"
-RUN mkdir /dataset
-RUN echo 'conda activate modin && python -u ${HOME}/plasticc-omnisci.py $*' > /entrypoint.sh
-
-ENTRYPOINT ["/bin/bash", "--login", "/entrypoint.sh"]
diff --git a/examples/docker/taxi-on-omnisci/build-docker-image.sh b/examples/docker/taxi-on-omnisci/build-docker-image.sh
deleted file mode 100644
index b433b98e784..00000000000
--- a/examples/docker/taxi-on-omnisci/build-docker-image.sh
+++ /dev/null
@@ -1,24 +0,0 @@
-#!/bin/bash -e
-
-# Licensed to Modin Development Team under one or more contributor license agreements.
-# See the NOTICE file distributed with this work for additional information regarding
-# copyright ownership.  The Modin Development Team licenses this file to you under the
-# Apache License, Version 2.0 (the "License"); you may not use this file except in
-# compliance with the License.  You may obtain a copy of the License at
-#
-#     http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software distributed under
-# the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF
-# ANY KIND, either express or implied. See the License for the specific language
-# governing permissions and limitations under the License.
-
-cd "`dirname \"$0\"`"
-
-docker build -f nyc-taxi-omnisci.dockerfile -t nyc-taxi-omnisci --build-arg https_proxy --build-arg http_proxy .
-
-echo -e "\nNote: a user is responsible for preparing the dataset.
-It Can be generated by following the instructions on the link:
-'https://github.com/toddwschneider/nyc-taxi-data#instructions'"
-printf "\n\nTo run the benchmark execute:\n"
-printf "\tdocker run --rm -v /path/to/dataset:/dataset nyc-taxi-omnisci <name of file in /path/to/dataset>\n"
diff --git a/examples/docker/taxi-on-omnisci/nyc-taxi-omnisci.dockerfile b/examples/docker/taxi-on-omnisci/nyc-taxi-omnisci.dockerfile
deleted file mode 100644
index a67103c555e..00000000000
--- a/examples/docker/taxi-on-omnisci/nyc-taxi-omnisci.dockerfile
+++ /dev/null
@@ -1,56 +0,0 @@
-# Licensed to Modin Development Team under one or more contributor license agreements.
-# See the NOTICE file distributed with this work for additional information regarding
-# copyright ownership.  The Modin Development Team licenses this file to you under the
-# Apache License, Version 2.0 (the "License"); you may not use this file except in
-# compliance with the License.  You may obtain a copy of the License at
-#
-#     http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software distributed under
-# the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF
-# ANY KIND, either express or implied. See the License for the specific language
-# governing permissions and limitations under the License.
-
-FROM ubuntu:18.04
-ENV http_proxy ${http_proxy}
-ENV https_proxy ${https_proxy}
-ENV MODIN_BACKEND "omnisci"
-ENV MODIN_EXPERIMENTAL "true"
-
-RUN apt-get update --yes \
-    && apt-get install wget --yes && \
-    rm -rf /var/lib/apt/lists/*
-
-ENV USER modin
-ENV UID 1000
-ENV HOME /home/$USER
-
-RUN adduser --disabled-password \
-    --gecos "Non-root user" \
-    --uid $UID \
-    --home $HOME \
-    $USER
-
-ENV CONDA_DIR ${HOME}/miniconda
-
-SHELL ["/bin/bash", "--login", "-c"]
-
-RUN wget -nv https://repo.anaconda.com/miniconda/Miniconda3-latest-Linux-x86_64.sh -O /tmp/miniconda3.sh && \
-    bash /tmp/miniconda3.sh -b -p "${CONDA_DIR}" -f -u && \
-    "${CONDA_DIR}/bin/conda" init bash && \
-    rm -f /tmp/miniconda3.sh && \
-    echo ". '${CONDA_DIR}/etc/profile.d/conda.sh'" >> "${HOME}/.profile"
-
-RUN conda update -n base -c defaults conda -y && \
-    conda config --set channel_priority strict && \
-    conda create -n modin --yes --no-default-packages && \
-    conda activate modin && \
-    conda install -c conda-forge modin-omnisci && \
-    conda clean --all --yes
-
-COPY nyc-taxi-omnisci.py "${HOME}/nyc-taxi-omnisci.py"
-RUN mkdir /dataset
-RUN echo 'conda activate modin && python -u ${HOME}/nyc-taxi-omnisci.py $*' > /entrypoint.sh
-
-ENTRYPOINT ["/bin/bash", "--login", "/entrypoint.sh"]
-


Code review comments:
diff_hunk: @@ -0,0 +1,78 @@
+# Licensed to Modin Development Team under one or more contributor license agreements.
+# See the NOTICE file distributed with this work for additional information regarding
+# copyright ownership.  The Modin Development Team licenses this file to you under the
+# Apache License, Version 2.0 (the "License"); you may not use this file except in
+# compliance with the License.  You may obtain a copy of the License at
+#
+#     http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software distributed under
+# the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF
+# ANY KIND, either express or implied. See the License for the specific language
+# governing permissions and limitations under the License.
+
+# Build image from this dockerfile like this:
+# docker build -t modin-ray:latest .
+
+FROM ubuntu:20.04
+
+# Proxy settings
+ENV http_proxy=${http_proxy}
+ENV https_proxy=${https_proxy}
+ENV no_proxy=${no_proxy}
+
+RUN apt-get update --yes \
+    && apt-get install wget --yes && \
+    rm -rf /var/lib/apt/lists/*
path: examples/docker/modin-ray/Dockerfile
text: @user1:
```suggestion
RUN apt-get update --yes \
 && apt-get install wget --yes \
 && rm -rf /var/lib/apt/lists/*
```

diff_hunk: @@ -0,0 +1,81 @@
+# Licensed to Modin Development Team under one or more contributor license agreements.
+# See the NOTICE file distributed with this work for additional information regarding
+# copyright ownership.  The Modin Development Team licenses this file to you under the
+# Apache License, Version 2.0 (the "License"); you may not use this file except in
+# compliance with the License.  You may obtain a copy of the License at
+#
+#     http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software distributed under
+# the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF
+# ANY KIND, either express or implied. See the License for the specific language
+# governing permissions and limitations under the License.
+
+# Build image from this dockerfile like this:
+# docker build -t modin-omnisci:latest .
+
+FROM ubuntu:20.04
+
+# Proxy settings
+ENV http_proxy=${http_proxy}
+ENV https_proxy=${https_proxy}
+ENV no_proxy=${no_proxy}
+
+RUN apt-get update --yes \
+    && apt-get install wget --yes && \
+    rm -rf /var/lib/apt/lists/*
path: examples/docker/modin-omnisci/Dockerfile
text: @user1:
```suggestion
RUN apt-get update --yes \
 && apt-get install wget --yes \
 && rm -rf /var/lib/apt/lists/*
```