From fc22647a8bf60747251d81a994c4669636b554c1 Mon Sep 17 00:00:00 2001 From: "Pedro D. Bello-Maldonado" Date: Mon, 12 Sep 2022 18:07:00 -0400 Subject: [PATCH 01/18] Added jupyter-lab ports --- .../start/kubernetes/chart/templates/_head-deployment.tpl | 1 + .../ray/start/kubernetes/chart/templates/_head-service.tpl | 6 +++++- 2 files changed, 6 insertions(+), 1 deletion(-) diff --git a/guidebooks/ml/ray/start/kubernetes/chart/templates/_head-deployment.tpl b/guidebooks/ml/ray/start/kubernetes/chart/templates/_head-deployment.tpl index 64359a7b..3332aeb6 100644 --- a/guidebooks/ml/ray/start/kubernetes/chart/templates/_head-deployment.tpl +++ b/guidebooks/ml/ray/start/kubernetes/chart/templates/_head-deployment.tpl @@ -60,6 +60,7 @@ spec: - containerPort: 10001 # Used by Ray Client - containerPort: 8265 # Used by Ray Dashboard - containerPort: 8000 # Used by Ray Serve + - containerPort: 8888 # Used by Jupyter-lab server startupProbe: periodSeconds: {{ .Values.startupProbe.periodSeconds | default 10 }} diff --git a/guidebooks/ml/ray/start/kubernetes/chart/templates/_head-service.tpl b/guidebooks/ml/ray/start/kubernetes/chart/templates/_head-service.tpl index 48c93167..ff252651 100644 --- a/guidebooks/ml/ray/start/kubernetes/chart/templates/_head-service.tpl +++ b/guidebooks/ml/ray/start/kubernetes/chart/templates/_head-service.tpl @@ -19,6 +19,10 @@ spec: protocol: TCP port: 6379 targetPort: 6379 + - name: jupyter-lab + protocol: TCP + port: 8888 + targetPort: 8888 selector: component: ray-head -{{end}} \ No newline at end of file +{{end}} From 925ef03c1970bc82f32b7c45442d8bc6c8235ebe Mon Sep 17 00:00:00 2001 From: "Pedro D. Bello-Maldonado" Date: Mon, 12 Sep 2022 18:31:45 -0400 Subject: [PATCH 02/18] Added option to specify subdirectory where the Ray chart could be in the repository --- guidebooks/ml/ray/start/kubernetes/install-via-helm.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/guidebooks/ml/ray/start/kubernetes/install-via-helm.sh b/guidebooks/ml/ray/start/kubernetes/install-via-helm.sh index f147075c..d56d7467 100644 --- a/guidebooks/ml/ray/start/kubernetes/install-via-helm.sh +++ b/guidebooks/ml/ray/start/kubernetes/install-via-helm.sh @@ -14,7 +14,7 @@ if [ "$KUBE_POD_MANAGER" = mcad ] || [ "$KUBE_POD_MANAGER" = kubernetes ]; then ORG=${RAY_CHART_ORG-guidebooks} REPO=${RAY_CHART_REPO-store} BRANCH=${RAY_CHART_BRANCH} - SUBDIR=guidebooks/ml/ray/start/kubernetes/chart + SUBDIR=${RAY_CHART_SUBDIR-guidebooks/ml/ray/start/kubernetes/chart} if [ "$KUBE_POD_MANAGER" = mcad ] then MCAD_ENABLED=true From 23b64995f5e361434275c27692c2047a06e697ac Mon Sep 17 00:00:00 2001 From: "Pedro D. Bello-Maldonado" Date: Wed, 14 Sep 2022 14:31:38 -0400 Subject: [PATCH 03/18] Update to support other Linux distributions --- guidebooks/util/jq.md | 1 + 1 file changed, 1 insertion(+) diff --git a/guidebooks/util/jq.md b/guidebooks/util/jq.md index d30670bc..ec8d4314 100644 --- a/guidebooks/util/jq.md +++ b/guidebooks/util/jq.md @@ -12,6 +12,7 @@ ``` === "Linux" + ```shell --- validate: which jq From e7731bbeae63c5ac2701402bfcb6eb19393e6fc2 Mon Sep 17 00:00:00 2001 From: "Pedro D. Bello-Maldonado" Date: Wed, 14 Sep 2022 16:52:38 -0400 Subject: [PATCH 04/18] JupyterLab ready with deployment directly on the Ray head node. This will be improved by creating a separate JupyterLab pod and is connected to the existing Ray cluster --- .../ml/jupyterlab/start/examples/.gitignore | 2 + .../jupyterlab/start/examples/example.ipynb | 263 ++++++++++++++++++ .../ml/jupyterlab/start/examples/mymodule.py | 6 + guidebooks/ml/jupyterlab/start/index.md | 17 ++ .../ml/jupyterlab/start/kubernetes/index.md | 7 + .../start/kubernetes/jupyter-server.md | 30 ++ .../start/kubernetes/port-forward.md | 27 ++ .../jupyterlab/start/kubernetes/ray-server.md | 15 + guidebooks/ml/jupyterlab/start/local/image.md | 26 ++ guidebooks/ml/jupyterlab/start/local/index.md | 39 +++ .../start/util/working-directory.md | 4 + 11 files changed, 436 insertions(+) create mode 100644 guidebooks/ml/jupyterlab/start/examples/.gitignore create mode 100644 guidebooks/ml/jupyterlab/start/examples/example.ipynb create mode 100644 guidebooks/ml/jupyterlab/start/examples/mymodule.py create mode 100644 guidebooks/ml/jupyterlab/start/index.md create mode 100644 guidebooks/ml/jupyterlab/start/kubernetes/index.md create mode 100644 guidebooks/ml/jupyterlab/start/kubernetes/jupyter-server.md create mode 100644 guidebooks/ml/jupyterlab/start/kubernetes/port-forward.md create mode 100644 guidebooks/ml/jupyterlab/start/kubernetes/ray-server.md create mode 100644 guidebooks/ml/jupyterlab/start/local/image.md create mode 100644 guidebooks/ml/jupyterlab/start/local/index.md create mode 100644 guidebooks/ml/jupyterlab/start/util/working-directory.md diff --git a/guidebooks/ml/jupyterlab/start/examples/.gitignore b/guidebooks/ml/jupyterlab/start/examples/.gitignore new file mode 100644 index 00000000..f22a19e6 --- /dev/null +++ b/guidebooks/ml/jupyterlab/start/examples/.gitignore @@ -0,0 +1,2 @@ +.ipynb_checkpoints/ +__pycache__/ diff --git a/guidebooks/ml/jupyterlab/start/examples/example.ipynb b/guidebooks/ml/jupyterlab/start/examples/example.ipynb new file mode 100644 index 00000000..f10848b1 --- /dev/null +++ b/guidebooks/ml/jupyterlab/start/examples/example.ipynb @@ -0,0 +1,263 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "id": "b61a3cbf-eaa3-49e1-bcd8-2ff7453cc0c6", + "metadata": {}, + "source": [ + "# Jupyter notebook example\n", + "\n", + "Here we demonstrate how to use a Jupyter notebook that may be served locally or on a Kubernetes cluster" + ] + }, + { + "cell_type": "markdown", + "id": "e5d77556-8e98-40c9-9901-17a7aa63cc1c", + "metadata": {}, + "source": [ + "## Plotting using NumPy\n", + "\n", + "This is a simple script to generate and plot a *sine* wave." + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "id": "1df92a57-5155-4849-b274-c5c38211606d", + "metadata": {}, + "outputs": [], + "source": [ + "import numpy as np\n", + "import matplotlib.pyplot as plt" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "id": "d3b85b96-3fb7-4e2e-892b-b71d8930f2b0", + "metadata": {}, + "outputs": [], + "source": [ + "n = 100\n", + "x = np.linspace(0.0, 2.0, n)\n", + "y = np.sin(np.pi * x)" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "id": "ecec7155-320e-47c1-878e-aa0017d13ca5", + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "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odVqjfb38ccfY+PGjXj44Yfx1FNP4ezZszh48CBOnjyJc+fOwdPTEwAwevRoHD16FGlpaejfvz/atWun34euzuXLlzFt2jR4eXkhMDAQvXv3Rm5uLv79738jJSUFGRkZWL58eY3zNsfUqVNRUlKCrl27IigoCLdu3cLXX3+NxYsX49ixYzh8+LA+Pk5OTti1axdCQkIwZcoUfPfdd2jdujUA4MqVK5g5cyY0Gg327NkDtVpdY7+nT59GSEgISktLERQUhOHDh6O4uBiZmZnYuHEjRowYgTZt2tR5fkRkBYSIiO4JgNzrkLljxw4BIJMnTzYoX79+vQCQLl26SG5urr48OztbAgMDBYBs2rTJoE1oaKgAEI1GI8nJySbH5Ofnd8+x37hxQwICAgSA7Nu3T18eHx8vAMTLy0suXLigL8/Pz5eQkBABIPPnzzfY1+TJkwWA2NjYyP79+/XllZWVMmrUKAEgS5cuNWizbNkyASA7duwwOb4jR45IdXW1QXlmZqb4+/uLjY2NXLp06b72qeRf//qXFBcXG5QVFBTIkCFDBIC89957Rm2WL18uAGTIkCEiIlJVVSW///3vBYC89dZbRvX9/PyM1smkSZMEgKxfv96ofnp6umRnZ5s9ByKybkysiYjMoEuszXncnVj7+voKADl06JDRfg8cOCAApF27dgblusR65syZNY7pXol1RUWFhIWFKSa8AwYMEADyzjvvGLVLS0sTlUolTk5OUlJSoi/XJdYTJkwwapOamioAJDQ01KC8NkmwzrZt2wSA/O1vf7PYPu928eJFASAjR4402lZZWSl9+/YVABITEyOrV68WABIeHm70h4CIcmL95JNPCgA5e/ZsncdKRNaNl4IQEd0HU5daAP+73OJOP/30E3766Sd4eHggPDzcqM2QIUPg6uqKH374Abm5ufrLI3SGDRtWp/G++OKLSE5OxtNPP62/1hkAKioq8NVXXwEAJkyYYNQuKCgIQUFBSEtLw9mzZ9GnTx+D7Upz6dChAwDU+prhL774AsnJycjKykJpaSlERL+vixcv1mqfd7t48SIOHjyIH374Abdv30Z1dTVExGQftra22LVrF4KDg7FgwQJUVlbC3d0dO3bsMPt+1b169cKnn36KmTNnYvXq1QgJCUGLFnz7Jfot4iubiOg+1HQv5ri4OKPEOjs7GwDg5+en2EalUsHPzw/5+fnIysoySqx9fX1rPdbNmzdj69at6N69O3bu3GmQCObl5aG8vBytWrWCo6OjYnt/f3+kpaUhKyvLaJu3t7dRmbOzMwAYfRHwXm7duoWRI0ciMTHRZJ3CwsL72ufdRAQLFixAdHS0PpE2t4+AgACsXr0ac+bMAfBrXL28vMzue+HChfo/GgYOHAgnJyf07dsXERERiIyMRMuWLe9/QkRklXhXECKiRlbTmU+NRlOrfSYlJWHOnDnw8PDARx99ZDJ5ru24lL5oWVuLFi1CYmIiQkNDkZycjBs3bqCyshIigkOHDgGAyWTYXPv27cOGDRvg7e2N+Ph4ZGVloby8HCKi/0PAVB/V1dWIj4/XP09NTb2vvl1cXJCYmIiUlBS8/PLL6Ny5MxITEzF37lwEBgZa7Gw8ETU+JtZERPVId2bzypUrJuvotj344IMW6fPHH3/E6NGjYWNjgw8//FDxbLm7uzvs7e1x48YN3L59W3E/ly9ftui4TNm/fz9sbW1x4MABhIaGwt3dXX93jszMTIv1AQBbtmzBqFGj4OXlpf9xnXv1sW7dOqSkpCAsLAze3t5488039bcKNJdKpUJISAjWrVuHkydPIjs7G+PHj8fPP/+MxYsX12pORGR9mFgTEdUjX19f+Pr64vr16zh27JjR9oSEBPzyyy9o166d0WUgtVFYWIhhw4bh5s2b2Lx5M0JCQhTr2dnZ6a+bVrpX9Llz55CWlgYnJycEBwfXaUz29vYAfr2Xt5JffvkFLi4ucHFxMdr2/vvv16nvO/sAlC9hqamP06dPY9myZXBzc8Pu3bsRFxcHEcGkSZOQn59f6/G0bt1afwvBc+fO1Xo/RGRdmFgTEdWzF198EQDw0ksv4fr16/ry3NxcLFy4EAD01+/WRXV1NZ555hmcP38ec+bMwdSpU80a1/Llyw3O2hYWFmLWrFkQETz//PO1vhxFR3fW/vvvv1fc3qFDB/zyyy/Yt2+fQXl0dDSSkpLq1PedfQBAbGyswSUfKSkpeOONNxTblJSUYOLEiaioqEBsbCy8vLzw2GOPYe7cubh69SqmT59uVt9bt27FpUuXjMoPHjwIAPDx8bnf6RCRleKXF4mI6tm8efOQmJiITz/9FO3bt8egQYMgIjh27BgKCwsxYsQIzJgxo879nDhxAp988glsbW2Rl5eHyMhIozqtWrXC+vXrAfz64y1RUVGIjY1F165dDX4g5vr16+jTpw9WrlxZ53GFh4dDo9EgOjoa586dg5eXF1QqFRYuXIjAwEC88sormDhxIv74xz8iJiYG3t7eSEtLQ0ZGBubNm4fo6Og6j2H27NmIi4vD5s2bkZycjKCgIGRlZeGLL77A/Pnz9TG50/z585GRkYFnn30Wo0aN0pevXbsWR48exd69exEREYGJEyfW2PfWrVsxffp0dO7cGZ06dUKLFi2QkZGBtLQ0aDQa/OUvf6nz/IjISjTOXf6IiJoW1OEHYkR+vZ/0xo0bpUePHqLVakWr1crDDz8sMTExUllZaVRfdx/ru38Y5e4x3Xkf66SkpHveY1vpvtf/+Mc/pF+/fuLk5CQajUa6dOkia9asMfoxFZH/3cc6KSnJrDHpHDp0SPr37y9OTk76sdy5j4SEBOnTp484OzuLq6ur/OEPf5Dk5GT9nO6OaW3uY52eni5Dhw6V1q1bi1arlR49ekhsbKziuBMSEgSABAQESGFhodG+vv32W1Gr1eLi4mLwb6R0H+sDBw7IlClTpEuXLuLq6iparVY6dOgg06ZNk4yMDLPHT0TWTyVSx69aExERERERr7EmIiIiIrIEJtZERERERBbAxJqIiIiIyAKYWBMRERERWQATayIiIiIiC2BiTURERERkAUysiYiIiIgsgIk1EREREZEFMLEmIiIiIrIAJtZERERERBbAxJqIiIiIyAKYWBMRERERWcD/AcwvBLPX5ccOAAAAAElFTkSuQmCC\n", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "plt.figure(figsize = (8, 6))\n", + "plt.title(\"A sine plot\", fontsize = 16)\n", + "plt.xlabel(\"Horizontal axis\", fontsize = 15)\n", + "plt.ylabel(\"Vertical axis\", fontsize = 15)\n", + "plt.plot(x, y)\n", + "plt.xticks(fontsize = 12)\n", + "plt.yticks(fontsize = 12)\n", + "plt.grid()" + ] + }, + { + "cell_type": "markdown", + "id": "9f9c218f-7247-4d50-8009-aa136a44ec75", + "metadata": {}, + "source": [ + "## Ray cluster testing\n", + "\n", + "The following code tests the Ray cluster in which the JupyterLab server is running. The code runs a remote function on all the available workers, and prints their `hostname` on return. This demonstrates that the remote functions are being executed on different work units." + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "id": "40e97020-a023-47a1-9080-ba7751ffe82d", + "metadata": {}, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "2022-09-14 12:33:19,906\tINFO worker.py:1333 -- Connecting to existing Ray cluster at address: 10.217.0.189:6379...\n", + "2022-09-14 12:33:19,927\tINFO worker.py:1515 -- Connected to Ray cluster. View the dashboard at \u001b[1m\u001b[32mhttp://10.217.0.189:8265 \u001b[39m\u001b[22m\n" + ] + }, + { + "data": { + "text/html": [ + "
\n", + "
\n", + "

Ray

\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "\n", + "\n", + "
Python version:3.7.7
Ray version: 2.0.0
Dashboard:http://10.217.0.189:8265
\n", + "
\n", + "
\n" + ], + "text/plain": [ + "RayContext(dashboard_url='10.217.0.189:8265', python_version='3.7.7', ray_version='2.0.0', ray_commit='cba26cc83f6b5b8a2ff166594a65cb74c0ec8740', address_info={'node_ip_address': '10.217.0.189', 'raylet_ip_address': '10.217.0.189', 'redis_address': None, 'object_store_address': '/tmp/ray/session_2022-09-14_12-31-58_035203_1/sockets/plasma_store', 'raylet_socket_name': '/tmp/ray/session_2022-09-14_12-31-58_035203_1/sockets/raylet', 'webui_url': '10.217.0.189:8265', 'session_dir': '/tmp/ray/session_2022-09-14_12-31-58_035203_1', 'metrics_export_port': 60220, 'gcs_address': '10.217.0.189:6379', 'address': '10.217.0.189:6379', 'dashboard_agent_listen_port': 52365, 'node_id': 'c841194fa26440d757f2f970f63d688633c254dee7b2d41257bb3a8a'})" + ] + }, + "execution_count": 1, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "import ray\n", + "import time\n", + "import socket\n", + "\n", + "ray.init(\"auto\")" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "id": "ed02f67a-b97f-4033-af5f-ed79b8168ddc", + "metadata": {}, + "outputs": [], + "source": [ + "@ray.remote\n", + "def gethostname(worker_id):\n", + " time.sleep(2)\n", + " return \"Worker %d: %s\" % (worker_id, socket.gethostname())" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "id": "208a3d7a-07c4-4267-829d-6f4c0b928325", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Worker 0: mycluster-ray-head-68db74bfd9-zfwpx\n", + "Worker 1: mycluster-ray-worker-99d5fbd59-w4wkk\n", + "Worker 2: mycluster-ray-head-68db74bfd9-zfwpx\n", + "Worker 3: mycluster-ray-worker-99d5fbd59-w4wkk\n", + "Worker 4: mycluster-ray-head-68db74bfd9-zfwpx\n", + "Worker 5: mycluster-ray-worker-99d5fbd59-w4wkk\n", + "Worker 6: mycluster-ray-head-68db74bfd9-zfwpx\n", + "Worker 7: mycluster-ray-worker-99d5fbd59-w4wkk\n" + ] + } + ], + "source": [ + "num_workers = 8\n", + "output = ray.get([gethostname.remote(worker_id) for worker_id in range(num_workers)])\n", + "print(\"\\n\".join(output))" + ] + }, + { + "cell_type": "markdown", + "id": "2af0e93a-8315-49ba-911b-673c9543ac81", + "metadata": {}, + "source": [ + "## Importing custome made modules\n", + "\n", + "In cases a script needs to be broken into parts or some other code is needed, the respective code can be turned into a module and loaded here." + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "id": "094cbdfb-75b7-402b-bd5f-e9ee7e6a0d16", + "metadata": {}, + "outputs": [], + "source": [ + "import mymodule\n", + "\n", + "%load_ext autoreload\n", + "%autoreload 2" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "id": "15d87093-d329-427c-9c22-f1d734579a77", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Hi from 'mymodule'\n" + ] + } + ], + "source": [ + "mymodule.say_hi()" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3 (ipykernel)", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.7.7" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} diff --git a/guidebooks/ml/jupyterlab/start/examples/mymodule.py b/guidebooks/ml/jupyterlab/start/examples/mymodule.py new file mode 100644 index 00000000..dfc32431 --- /dev/null +++ b/guidebooks/ml/jupyterlab/start/examples/mymodule.py @@ -0,0 +1,6 @@ +""" +Module function +""" + +def say_hi(): + print("Hi from '%s'" % (__name__)) \ No newline at end of file diff --git a/guidebooks/ml/jupyterlab/start/index.md b/guidebooks/ml/jupyterlab/start/index.md new file mode 100644 index 00000000..b9773ccd --- /dev/null +++ b/guidebooks/ml/jupyterlab/start/index.md @@ -0,0 +1,17 @@ +# Run a JupyterLab Server + +[JupyterLab](https://jupyterlab.readthedocs.io/en/stable/index.html) is an open source platform to manage Jupyter notebooks +from a web console with ease. Jupyter notebooks are interactive Python sessions that allow users to build Python scripts +in a *comparmentalized* way, with the data living throughout the notebook execution. + +=== "Run Locally" + Start a JupyterLab server on your computer + --8<-- "./local" + +=== "Run on a Kubernetes Cluster" + Start a JupyterLab server on a Kubernetes cluster + --8<-- "./kubernetes" + +=== "Shut down a Kubernetes Cluster" + Stop a Kubernetes cluster that maybe running a Jupyter server + :import{ml/ray/stop/kubernetes} diff --git a/guidebooks/ml/jupyterlab/start/kubernetes/index.md b/guidebooks/ml/jupyterlab/start/kubernetes/index.md new file mode 100644 index 00000000..f91eed09 --- /dev/null +++ b/guidebooks/ml/jupyterlab/start/kubernetes/index.md @@ -0,0 +1,7 @@ +--- +imports: + - ./ray-server + - ./port-forward + - ./jupyter-server +--- + diff --git a/guidebooks/ml/jupyterlab/start/kubernetes/jupyter-server.md b/guidebooks/ml/jupyterlab/start/kubernetes/jupyter-server.md new file mode 100644 index 00000000..ab624c53 --- /dev/null +++ b/guidebooks/ml/jupyterlab/start/kubernetes/jupyter-server.md @@ -0,0 +1,30 @@ +--- +imports: + - ml/ray/cluster/head +--- + +# Create working directory and copy everything in the local working directory to the server working directory + +```shell +oc exec -it $RAY_HEAD_POD -- mkdir -p /home/ray/work +tar -zcvf .work.tar -C $CUSTOM_WORKING_DIR . +kubectl cp .work.tar $RAY_HEAD_POD:/home/ray/work +oc exec $RAY_HEAD_POD -- bash -c -- "tar -xvf /home/ray/work/.work.tar -C /home/ray/work; rm /home/ray/work/.work.tar" +rm .work.tar +``` + +# Initiate Jupyter-lab server on the head node of the Ray cluster + +```shell +oc exec -it $RAY_HEAD_POD -- jupyter-lab --port=8888 --no-browser --notebook-dir=/home/ray/work +``` + +# On completion of the Jupyter-lab cluster work, copy everything back to the local working directory + +```shell +oc exec $RAY_HEAD_POD -- tar -zcvf .work.tar -C /home/ray/work . +kubectl cp $RAY_HEAD_POD:/home/ray/.work.tar $CUSTOM_WORKING_DIR/.work.tar +oc exec $RAY_HEAD_POD -- rm /home/ray/.work.tar +tar -xvf $CUSTOM_WORKING_DIR/.work.tar -C $CUSTOM_WORKING_DIR . +rm $CUSTOM_WORKING_DIR/.work.tar +``` diff --git a/guidebooks/ml/jupyterlab/start/kubernetes/port-forward.md b/guidebooks/ml/jupyterlab/start/kubernetes/port-forward.md new file mode 100644 index 00000000..73ab9b22 --- /dev/null +++ b/guidebooks/ml/jupyterlab/start/kubernetes/port-forward.md @@ -0,0 +1,27 @@ +--- +imports: + - kubernetes/kubectl + - kubernetes/context + - kubernetes/choose/ns +--- + +# Port-forward to the Jupyter-lab server + +Port-forwarding needs to be initiated after the JupyterLab server has started to avoid a failed connection. We wait for the server to start before calling the forwarding command. + +```shell.async +date > /tmp/port-forward-jupyterlab + +export RAY_HEAD_POD=$(kubectl get pod -l ${KUBE_POD_RAY_HEAD_LABEL_SELECTOR} --no-headers | awk '{print $1}') + +num_lines=1 + +while [ $num_lines = 1 ]; do + server_list=$(oc exec $RAY_HEAD_POD -- jupyter server list) + num_lines=$(oc exec $RAY_HEAD_POD -- python3 -c "response = \"\"\"${server_list}\"\"\"; print(len(response.split('\n')))") + echo "Waiting for server to start..." >> /tmp/port-forward-jupyterlab + sleep 1 +done + +kubectl ${KUBE_CONTEXT_ARG} ${KUBE_NS_ARG} port-forward service/${RAY_KUBE_CLUSTER_NAME}-ray-head 8888:8888 >> /tmp/port-forward-jupyterlab +``` diff --git a/guidebooks/ml/jupyterlab/start/kubernetes/ray-server.md b/guidebooks/ml/jupyterlab/start/kubernetes/ray-server.md new file mode 100644 index 00000000..65724b34 --- /dev/null +++ b/guidebooks/ml/jupyterlab/start/kubernetes/ray-server.md @@ -0,0 +1,15 @@ +--- +imports: + - kubernetes/kubectl + - kubernetes/helm3 + - kubernetes/context + - kubernetes/choose/ns +--- + +# JupyterLab on a Kubernetes cluster + +A JupyterLab server will run on a Kubernetes cluster + +--8<-- "../util/working-directory.md" + +:import{ml/ray/start/kubernetes} diff --git a/guidebooks/ml/jupyterlab/start/local/image.md b/guidebooks/ml/jupyterlab/start/local/image.md new file mode 100644 index 00000000..476ec826 --- /dev/null +++ b/guidebooks/ml/jupyterlab/start/local/image.md @@ -0,0 +1,26 @@ +# "Set docker executable" +```shell +export DOCKER=docker +``` + +# If 'docker' is not available use 'podman' +```shell +--- +validate: which docker +--- +export DOCKER=podman +``` + +# If 'docker' is not available use 'podman' +```shell +--- +validate: which podman +--- +echo "No container builder (e.g., docker, podman) was found" +exit 1 +``` + +# "Pulling image" +```bash +$DOCKER pull docker.io/metalcycling/jupyterlab +``` diff --git a/guidebooks/ml/jupyterlab/start/local/index.md b/guidebooks/ml/jupyterlab/start/local/index.md new file mode 100644 index 00000000..c2114a5b --- /dev/null +++ b/guidebooks/ml/jupyterlab/start/local/index.md @@ -0,0 +1,39 @@ +--- +imports: + - ./local/image.md +--- + +# JupyterLab on a local server + +A JupyterLab server will run on your local computer + +--8<-- "../util/working-directory.md" + +```shell.async +$DOCKER run --privileged=true \ + --rm --net=host \ + -v $CUSTOM_WORKING_DIR:/home/ray/code \ + -u root \ + --name jupyterlab \ + docker.io/metalcycling/jupyterlab:latest jupyter-lab \ + --notebook-dir=/home/ray/code --port=8888 --no-browser --allow-root +``` + +```shell +while [ "$($DOCKER ps -q -f name=jupyterlab)" = "" ] +do + sleep 1 +done + +sleep 1 + +server_data=$($DOCKER exec jupyterlab jupyter server list --json) +url=$($DOCKER exec jupyterlab python3 -c "false = False; print(${server_data}['url'])") +token=$($DOCKER exec jupyterlab python3 -c "false = False; print(${server_data}['token'])") +xdg-open ${url}lab?token=${token} + +while true +do + sleep 1 +done +``` diff --git a/guidebooks/ml/jupyterlab/start/util/working-directory.md b/guidebooks/ml/jupyterlab/start/util/working-directory.md new file mode 100644 index 00000000..be4beea2 --- /dev/null +++ b/guidebooks/ml/jupyterlab/start/util/working-directory.md @@ -0,0 +1,4 @@ +=== "What working directory would you like to use? [default: ./]" + ```shell + export CUSTOM_WORKING_DIR=${choice} + ``` From 311ee0720ae4eac0a119b1fae899cb93504154b3 Mon Sep 17 00:00:00 2001 From: "Pedro D. Bello-Maldonado" Date: Fri, 16 Sep 2022 11:19:22 -0400 Subject: [PATCH 05/18] Helm chart to build the JupyterLab pod --- .../start/kubernetes/chart/Chart.yaml | 10 ++++++++ .../chart/templates/jupyterlab.yaml | 25 +++++++++++++++++++ .../kubernetes/chart/templates/service.yaml | 12 +++++++++ .../start/kubernetes/chart/values.yaml | 2 ++ 4 files changed, 49 insertions(+) create mode 100644 guidebooks/ml/jupyterlab/start/kubernetes/chart/Chart.yaml create mode 100644 guidebooks/ml/jupyterlab/start/kubernetes/chart/templates/jupyterlab.yaml create mode 100644 guidebooks/ml/jupyterlab/start/kubernetes/chart/templates/service.yaml create mode 100644 guidebooks/ml/jupyterlab/start/kubernetes/chart/values.yaml diff --git a/guidebooks/ml/jupyterlab/start/kubernetes/chart/Chart.yaml b/guidebooks/ml/jupyterlab/start/kubernetes/chart/Chart.yaml new file mode 100644 index 00000000..691ea33a --- /dev/null +++ b/guidebooks/ml/jupyterlab/start/kubernetes/chart/Chart.yaml @@ -0,0 +1,10 @@ +apiVersion: v2 +name: jupyterlab +description: A Helm chart for deployments of JupyterLab on Kubernetes. +type: application + +# Chart version +version: 0.1.0 + +# JupyterLab version +appVersion: "latest" diff --git a/guidebooks/ml/jupyterlab/start/kubernetes/chart/templates/jupyterlab.yaml b/guidebooks/ml/jupyterlab/start/kubernetes/chart/templates/jupyterlab.yaml new file mode 100644 index 00000000..9b860a38 --- /dev/null +++ b/guidebooks/ml/jupyterlab/start/kubernetes/chart/templates/jupyterlab.yaml @@ -0,0 +1,25 @@ +apiVersion: apps/v1 +kind: Deployment +metadata: + name: {{ .Values.clusterName }}-jupyterlab + labels: + app: jupyterlab +spec: + replicas: 1 + selector: + matchLabels: + app: jupyterlab + template: + metadata: + labels: + app: jupyterlab + spec: + restartPolicy: Always + containers: + - name: jupyterlab + image: docker.io/metalcycling/ray-jupyter + command: ["/bin/bash", "-c", "--"] + args: ["ray start --address={{ .Values.clusterName }}-ray-head:{{ .Values.rayHeadPort; sleep infinity;"] + imagePullPolicy: IfNotPresent + ports: + - containerPort: 8888 diff --git a/guidebooks/ml/jupyterlab/start/kubernetes/chart/templates/service.yaml b/guidebooks/ml/jupyterlab/start/kubernetes/chart/templates/service.yaml new file mode 100644 index 00000000..e0dff3b8 --- /dev/null +++ b/guidebooks/ml/jupyterlab/start/kubernetes/chart/templates/service.yaml @@ -0,0 +1,12 @@ +apiVersion: v1 +kind: Service +metadata: + name: {{ .Values.clusterName }}-jupyterlab + labels: + app: jupyterlab +spec: + ports: + - port: 8888 + protocol: TCP + selector: + app: jupyterlab diff --git a/guidebooks/ml/jupyterlab/start/kubernetes/chart/values.yaml b/guidebooks/ml/jupyterlab/start/kubernetes/chart/values.yaml new file mode 100644 index 00000000..8148a959 --- /dev/null +++ b/guidebooks/ml/jupyterlab/start/kubernetes/chart/values.yaml @@ -0,0 +1,2 @@ +clusterName: mycluster +rayHeadPort: 6379 From 1728109b5e8c4f715c78db87c156d8887adcb4b7 Mon Sep 17 00:00:00 2001 From: "Pedro D. Bello-Maldonado" Date: Fri, 16 Sep 2022 19:14:09 -0400 Subject: [PATCH 06/18] Fixed template --- .../jupyterlab/start/kubernetes/chart/templates/jupyterlab.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/guidebooks/ml/jupyterlab/start/kubernetes/chart/templates/jupyterlab.yaml b/guidebooks/ml/jupyterlab/start/kubernetes/chart/templates/jupyterlab.yaml index 9b860a38..3fc61196 100644 --- a/guidebooks/ml/jupyterlab/start/kubernetes/chart/templates/jupyterlab.yaml +++ b/guidebooks/ml/jupyterlab/start/kubernetes/chart/templates/jupyterlab.yaml @@ -19,7 +19,7 @@ spec: - name: jupyterlab image: docker.io/metalcycling/ray-jupyter command: ["/bin/bash", "-c", "--"] - args: ["ray start --address={{ .Values.clusterName }}-ray-head:{{ .Values.rayHeadPort; sleep infinity;"] + args: ["ray start --address={{ .Values.clusterName }}-ray-head:{{ .Values.rayHeadPort }}; sleep infinity;"] imagePullPolicy: IfNotPresent ports: - containerPort: 8888 From c9bed3077f56c3a4af3ca400c7dad0394a81d008 Mon Sep 17 00:00:00 2001 From: "Pedro D. Bello-Maldonado" Date: Sun, 18 Sep 2022 17:25:21 -0400 Subject: [PATCH 07/18] Updated chart to use better labels --- .../chart/templates/.jupyterlab.yaml.swp | Bin 0 -> 12288 bytes .../kubernetes/chart/templates/jupyterlab.yaml | 4 ++-- .../kubernetes/chart/templates/service.yaml | 4 ++-- 3 files changed, 4 insertions(+), 4 deletions(-) create mode 100644 guidebooks/ml/jupyterlab/start/kubernetes/chart/templates/.jupyterlab.yaml.swp diff --git a/guidebooks/ml/jupyterlab/start/kubernetes/chart/templates/.jupyterlab.yaml.swp b/guidebooks/ml/jupyterlab/start/kubernetes/chart/templates/.jupyterlab.yaml.swp new file mode 100644 index 0000000000000000000000000000000000000000..fd34e5e40829973946328bd88c71bf47a16786b0 GIT binary patch literal 12288 zcmeI2F>ezw6vthpGEqPnc0F`~LnsV+nX^RH=+kH>>62%xD3fTep|)+)`qxEf+Rs@t&@n{T_Fdq-%^}zvO(Z6GRb-`y+{g%*W$uH15ka1U2N$SbHQ^!2 zjI5qVzRgl5=D3P!o(P;U0)^iYojJC&*cyD*uQsmmix-}qFbH&9B0vO)01+SpM1Tko z0U~g+3HWS=y+Z`2h8Qjn$C-(7_(%g0AOb{y2oM1xKm>>Y5g-CYfCvx)BJdv)kTGLB zXBhj1s{a2!`2GL$9An>6-%wvrpHMrfx2PWKIqD&59(4&di`qNO*jLmp>NDyCDneaD z?aeXfP!CWyP*uKJ9Lb0P5g-CYfCvx)B0vO)01+Sp|BwLxn+dLL>ZML0@7mmlyo1J$ z?#gh{g;N%EA~&I17}K>zt1{%P8*A2gb8y)2JjGw;n=a%p8o4a_pv9RBA>$bR-QBG% z-dvZa0M}HeaM%dFCKKS>+XB5s4`dwHTyX9&PE}>2%QANcAmcjS(5d$2a^vNc?8+vI zOyjD6Akt|NN!M%KAbQWdk)=D_=`v79Z$f5SJ&(w2e7J+7VM{rfTAu0*vGj63(m_}Gc-%k5 zOr%%6C$*ps3@B`A-w%;PhOdLft8TIJf+vCwimVs6Ppo#&6R$#z<>(B3U0v!5CbebN VXwPJ(*CBV>rXk0SE_mHyzX3OzGBp4I literal 0 HcmV?d00001 diff --git a/guidebooks/ml/jupyterlab/start/kubernetes/chart/templates/jupyterlab.yaml b/guidebooks/ml/jupyterlab/start/kubernetes/chart/templates/jupyterlab.yaml index 3fc61196..aea5fa3d 100644 --- a/guidebooks/ml/jupyterlab/start/kubernetes/chart/templates/jupyterlab.yaml +++ b/guidebooks/ml/jupyterlab/start/kubernetes/chart/templates/jupyterlab.yaml @@ -8,11 +8,11 @@ spec: replicas: 1 selector: matchLabels: - app: jupyterlab + app: jupyterlab-pod template: metadata: labels: - app: jupyterlab + app: jupyterlab-pod spec: restartPolicy: Always containers: diff --git a/guidebooks/ml/jupyterlab/start/kubernetes/chart/templates/service.yaml b/guidebooks/ml/jupyterlab/start/kubernetes/chart/templates/service.yaml index e0dff3b8..35b55867 100644 --- a/guidebooks/ml/jupyterlab/start/kubernetes/chart/templates/service.yaml +++ b/guidebooks/ml/jupyterlab/start/kubernetes/chart/templates/service.yaml @@ -3,10 +3,10 @@ kind: Service metadata: name: {{ .Values.clusterName }}-jupyterlab labels: - app: jupyterlab + app: jupyterlab-service spec: ports: - port: 8888 protocol: TCP selector: - app: jupyterlab + app: jupyterlab-deployment From 251baaebadd4be77c403ea57111a21a29b88d711 Mon Sep 17 00:00:00 2001 From: "Pedro D. Bello-Maldonado" Date: Sun, 18 Sep 2022 18:19:25 -0400 Subject: [PATCH 08/18] Updated chart to use correct labels --- .../chart/templates/.jupyterlab.yaml.swp | Bin 12288 -> 0 bytes .../kubernetes/chart/templates/jupyterlab.yaml | 2 +- .../kubernetes/chart/templates/service.yaml | 4 ++-- 3 files changed, 3 insertions(+), 3 deletions(-) delete mode 100644 guidebooks/ml/jupyterlab/start/kubernetes/chart/templates/.jupyterlab.yaml.swp diff --git a/guidebooks/ml/jupyterlab/start/kubernetes/chart/templates/.jupyterlab.yaml.swp b/guidebooks/ml/jupyterlab/start/kubernetes/chart/templates/.jupyterlab.yaml.swp deleted file mode 100644 index fd34e5e40829973946328bd88c71bf47a16786b0..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 12288 zcmeI2F>ezw6vthpGEqPnc0F`~LnsV+nX^RH=+kH>>62%xD3fTep|)+)`qxEf+Rs@t&@n{T_Fdq-%^}zvO(Z6GRb-`y+{g%*W$uH15ka1U2N$SbHQ^!2 zjI5qVzRgl5=D3P!o(P;U0)^iYojJC&*cyD*uQsmmix-}qFbH&9B0vO)01+SpM1Tko z0U~g+3HWS=y+Z`2h8Qjn$C-(7_(%g0AOb{y2oM1xKm>>Y5g-CYfCvx)BJdv)kTGLB zXBhj1s{a2!`2GL$9An>6-%wvrpHMrfx2PWKIqD&59(4&di`qNO*jLmp>NDyCDneaD z?aeXfP!CWyP*uKJ9Lb0P5g-CYfCvx)B0vO)01+Sp|BwLxn+dLL>ZML0@7mmlyo1J$ z?#gh{g;N%EA~&I17}K>zt1{%P8*A2gb8y)2JjGw;n=a%p8o4a_pv9RBA>$bR-QBG% z-dvZa0M}HeaM%dFCKKS>+XB5s4`dwHTyX9&PE}>2%QANcAmcjS(5d$2a^vNc?8+vI zOyjD6Akt|NN!M%KAbQWdk)=D_=`v79Z$f5SJ&(w2e7J+7VM{rfTAu0*vGj63(m_}Gc-%k5 zOr%%6C$*ps3@B`A-w%;PhOdLft8TIJf+vCwimVs6Ppo#&6R$#z<>(B3U0v!5CbebN VXwPJ(*CBV>rXk0SE_mHyzX3OzGBp4I diff --git a/guidebooks/ml/jupyterlab/start/kubernetes/chart/templates/jupyterlab.yaml b/guidebooks/ml/jupyterlab/start/kubernetes/chart/templates/jupyterlab.yaml index aea5fa3d..9fd38b5e 100644 --- a/guidebooks/ml/jupyterlab/start/kubernetes/chart/templates/jupyterlab.yaml +++ b/guidebooks/ml/jupyterlab/start/kubernetes/chart/templates/jupyterlab.yaml @@ -3,7 +3,7 @@ kind: Deployment metadata: name: {{ .Values.clusterName }}-jupyterlab labels: - app: jupyterlab + app: jupyterlab-deployment spec: replicas: 1 selector: diff --git a/guidebooks/ml/jupyterlab/start/kubernetes/chart/templates/service.yaml b/guidebooks/ml/jupyterlab/start/kubernetes/chart/templates/service.yaml index 35b55867..094d440e 100644 --- a/guidebooks/ml/jupyterlab/start/kubernetes/chart/templates/service.yaml +++ b/guidebooks/ml/jupyterlab/start/kubernetes/chart/templates/service.yaml @@ -3,10 +3,10 @@ kind: Service metadata: name: {{ .Values.clusterName }}-jupyterlab labels: - app: jupyterlab-service + app: jupyterlab-deployment spec: ports: - port: 8888 protocol: TCP selector: - app: jupyterlab-deployment + app: jupyterlab-pod From 23e8035d593dc383cf87664aa2ad098c9e910151 Mon Sep 17 00:00:00 2001 From: "Pedro D. Bello-Maldonado" Date: Mon, 19 Sep 2022 16:13:53 -0400 Subject: [PATCH 09/18] Moved port-forwarding to jupyter-server file --- .../start/kubernetes/port-forward.md | 27 ------------------- 1 file changed, 27 deletions(-) delete mode 100644 guidebooks/ml/jupyterlab/start/kubernetes/port-forward.md diff --git a/guidebooks/ml/jupyterlab/start/kubernetes/port-forward.md b/guidebooks/ml/jupyterlab/start/kubernetes/port-forward.md deleted file mode 100644 index 73ab9b22..00000000 --- a/guidebooks/ml/jupyterlab/start/kubernetes/port-forward.md +++ /dev/null @@ -1,27 +0,0 @@ ---- -imports: - - kubernetes/kubectl - - kubernetes/context - - kubernetes/choose/ns ---- - -# Port-forward to the Jupyter-lab server - -Port-forwarding needs to be initiated after the JupyterLab server has started to avoid a failed connection. We wait for the server to start before calling the forwarding command. - -```shell.async -date > /tmp/port-forward-jupyterlab - -export RAY_HEAD_POD=$(kubectl get pod -l ${KUBE_POD_RAY_HEAD_LABEL_SELECTOR} --no-headers | awk '{print $1}') - -num_lines=1 - -while [ $num_lines = 1 ]; do - server_list=$(oc exec $RAY_HEAD_POD -- jupyter server list) - num_lines=$(oc exec $RAY_HEAD_POD -- python3 -c "response = \"\"\"${server_list}\"\"\"; print(len(response.split('\n')))") - echo "Waiting for server to start..." >> /tmp/port-forward-jupyterlab - sleep 1 -done - -kubectl ${KUBE_CONTEXT_ARG} ${KUBE_NS_ARG} port-forward service/${RAY_KUBE_CLUSTER_NAME}-ray-head 8888:8888 >> /tmp/port-forward-jupyterlab -``` From ab81398747b521a418065ac028f559c9095d37dd Mon Sep 17 00:00:00 2001 From: "Pedro D. Bello-Maldonado" Date: Mon, 19 Sep 2022 16:54:39 -0400 Subject: [PATCH 10/18] Changed image to the Ray base image and install JupyterLab directly --- .../start/kubernetes/chart/templates/jupyterlab.yaml | 4 ++-- guidebooks/ml/jupyterlab/start/kubernetes/chart/values.yaml | 1 + 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/guidebooks/ml/jupyterlab/start/kubernetes/chart/templates/jupyterlab.yaml b/guidebooks/ml/jupyterlab/start/kubernetes/chart/templates/jupyterlab.yaml index 9fd38b5e..680f84a2 100644 --- a/guidebooks/ml/jupyterlab/start/kubernetes/chart/templates/jupyterlab.yaml +++ b/guidebooks/ml/jupyterlab/start/kubernetes/chart/templates/jupyterlab.yaml @@ -17,9 +17,9 @@ spec: restartPolicy: Always containers: - name: jupyterlab - image: docker.io/metalcycling/ray-jupyter + image: {{ .Values.rayImage }} command: ["/bin/bash", "-c", "--"] - args: ["ray start --address={{ .Values.clusterName }}-ray-head:{{ .Values.rayHeadPort }}; sleep infinity;"] + args: ["pip install jupyterlab; ray start --address={{ .Values.clusterName }}-ray-head:{{ .Values.rayHeadPort }}; sleep infinity;"] imagePullPolicy: IfNotPresent ports: - containerPort: 8888 diff --git a/guidebooks/ml/jupyterlab/start/kubernetes/chart/values.yaml b/guidebooks/ml/jupyterlab/start/kubernetes/chart/values.yaml index 8148a959..7a8b897b 100644 --- a/guidebooks/ml/jupyterlab/start/kubernetes/chart/values.yaml +++ b/guidebooks/ml/jupyterlab/start/kubernetes/chart/values.yaml @@ -1,2 +1,3 @@ clusterName: mycluster rayHeadPort: 6379 +rayImage: rayproject/ray:1.13.1-py37 From b8d24991277a59f9a1113254d9f892f4511f8cc1 Mon Sep 17 00:00:00 2001 From: "Pedro D. Bello-Maldonado" Date: Mon, 19 Sep 2022 20:51:58 -0400 Subject: [PATCH 11/18] Install vim and JupyterLab on the fly --- .../jupyterlab/start/kubernetes/chart/templates/jupyterlab.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/guidebooks/ml/jupyterlab/start/kubernetes/chart/templates/jupyterlab.yaml b/guidebooks/ml/jupyterlab/start/kubernetes/chart/templates/jupyterlab.yaml index 680f84a2..d438067a 100644 --- a/guidebooks/ml/jupyterlab/start/kubernetes/chart/templates/jupyterlab.yaml +++ b/guidebooks/ml/jupyterlab/start/kubernetes/chart/templates/jupyterlab.yaml @@ -19,7 +19,7 @@ spec: - name: jupyterlab image: {{ .Values.rayImage }} command: ["/bin/bash", "-c", "--"] - args: ["pip install jupyterlab; ray start --address={{ .Values.clusterName }}-ray-head:{{ .Values.rayHeadPort }}; sleep infinity;"] + args: ["conda install -c conda-forge vim; pip install jupyterlab; ray start --address={{ .Values.clusterName }}-ray-head:{{ .Values.rayHeadPort }}; sleep infinity;"] imagePullPolicy: IfNotPresent ports: - containerPort: 8888 From a0b029a8999217719222da52af3884992d3bed15 Mon Sep 17 00:00:00 2001 From: "Pedro D. Bello-Maldonado" Date: Mon, 19 Sep 2022 20:58:21 -0400 Subject: [PATCH 12/18] Install JupyterLab-vim on the fly --- .../jupyterlab/start/kubernetes/chart/templates/jupyterlab.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/guidebooks/ml/jupyterlab/start/kubernetes/chart/templates/jupyterlab.yaml b/guidebooks/ml/jupyterlab/start/kubernetes/chart/templates/jupyterlab.yaml index d438067a..bee68d31 100644 --- a/guidebooks/ml/jupyterlab/start/kubernetes/chart/templates/jupyterlab.yaml +++ b/guidebooks/ml/jupyterlab/start/kubernetes/chart/templates/jupyterlab.yaml @@ -19,7 +19,7 @@ spec: - name: jupyterlab image: {{ .Values.rayImage }} command: ["/bin/bash", "-c", "--"] - args: ["conda install -c conda-forge vim; pip install jupyterlab; ray start --address={{ .Values.clusterName }}-ray-head:{{ .Values.rayHeadPort }}; sleep infinity;"] + args: ["conda install -c conda-forge vim; pip install jupyterlab jupyterlab-vim; ray start --address={{ .Values.clusterName }}-ray-head:{{ .Values.rayHeadPort }}; sleep infinity;"] imagePullPolicy: IfNotPresent ports: - containerPort: 8888 From 0983cd93b67cba029a46854d6de6c62596adeb15 Mon Sep 17 00:00:00 2001 From: "Pedro D. Bello-Maldonado" Date: Mon, 19 Sep 2022 21:14:02 -0400 Subject: [PATCH 13/18] Added option to shutdown JupyterLab server --- guidebooks/ml/jupyterlab/start/index.md | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/guidebooks/ml/jupyterlab/start/index.md b/guidebooks/ml/jupyterlab/start/index.md index b9773ccd..46b45e30 100644 --- a/guidebooks/ml/jupyterlab/start/index.md +++ b/guidebooks/ml/jupyterlab/start/index.md @@ -15,3 +15,7 @@ in a *comparmentalized* way, with the data living throughout the notebook execut === "Shut down a Kubernetes Cluster" Stop a Kubernetes cluster that maybe running a Jupyter server :import{ml/ray/stop/kubernetes} + +=== "Shut down a JupyterLab server" + Stop a JupyterLab server + :import{ml/jupyterlab/stop/kubernetes} From e5ba81d0182ac9e6e7e63a1b1fcd3cbb99b99b25 Mon Sep 17 00:00:00 2001 From: "Pedro D. Bello-Maldonado" Date: Mon, 19 Sep 2022 21:14:18 -0400 Subject: [PATCH 14/18] Modified example --- .../jupyterlab/start/examples/example.ipynb | 75 +++---------------- 1 file changed, 12 insertions(+), 63 deletions(-) diff --git a/guidebooks/ml/jupyterlab/start/examples/example.ipynb b/guidebooks/ml/jupyterlab/start/examples/example.ipynb index f10848b1..ad8ff96a 100644 --- a/guidebooks/ml/jupyterlab/start/examples/example.ipynb +++ b/guidebooks/ml/jupyterlab/start/examples/example.ipynb @@ -22,7 +22,7 @@ }, { "cell_type": "code", - "execution_count": 1, + "execution_count": 3, "id": "1df92a57-5155-4849-b274-c5c38211606d", "metadata": {}, "outputs": [], @@ -33,7 +33,7 @@ }, { "cell_type": "code", - "execution_count": 2, + "execution_count": 4, "id": "d3b85b96-3fb7-4e2e-892b-b71d8930f2b0", "metadata": {}, "outputs": [], @@ -45,7 +45,7 @@ }, { "cell_type": "code", - "execution_count": 3, + "execution_count": 5, "id": "ecec7155-320e-47c1-878e-aa0017d13ca5", "metadata": {}, "outputs": [ @@ -87,61 +87,10 @@ "id": "40e97020-a023-47a1-9080-ba7751ffe82d", "metadata": {}, "outputs": [ - { - "name": "stderr", - "output_type": "stream", - "text": [ - "2022-09-14 12:33:19,906\tINFO worker.py:1333 -- Connecting to existing Ray cluster at address: 10.217.0.189:6379...\n", - "2022-09-14 12:33:19,927\tINFO worker.py:1515 -- Connected to Ray cluster. View the dashboard at \u001b[1m\u001b[32mhttp://10.217.0.189:8265 \u001b[39m\u001b[22m\n" - ] - }, { "data": { - "text/html": [ - "
\n", - "
\n", - "

Ray

\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "\n", - "\n", - "
Python version:3.7.7
Ray version: 2.0.0
Dashboard:http://10.217.0.189:8265
\n", - "
\n", - "
\n" - ], "text/plain": [ - "RayContext(dashboard_url='10.217.0.189:8265', python_version='3.7.7', ray_version='2.0.0', ray_commit='cba26cc83f6b5b8a2ff166594a65cb74c0ec8740', address_info={'node_ip_address': '10.217.0.189', 'raylet_ip_address': '10.217.0.189', 'redis_address': None, 'object_store_address': '/tmp/ray/session_2022-09-14_12-31-58_035203_1/sockets/plasma_store', 'raylet_socket_name': '/tmp/ray/session_2022-09-14_12-31-58_035203_1/sockets/raylet', 'webui_url': '10.217.0.189:8265', 'session_dir': '/tmp/ray/session_2022-09-14_12-31-58_035203_1', 'metrics_export_port': 60220, 'gcs_address': '10.217.0.189:6379', 'address': '10.217.0.189:6379', 'dashboard_agent_listen_port': 52365, 'node_id': 'c841194fa26440d757f2f970f63d688633c254dee7b2d41257bb3a8a'})" + "RayContext(dashboard_url='10.217.0.250:8265', python_version='3.7.7', ray_version='1.13.1', ray_commit='da2a91cd34ac58df4c49b2fa65a5bd25bc1e2057', address_info={'node_ip_address': '10.217.0.253', 'raylet_ip_address': '10.217.0.253', 'redis_address': None, 'object_store_address': '/tmp/ray/session_2022-09-19_18-04-20_803254_1/sockets/plasma_store', 'raylet_socket_name': '/tmp/ray/session_2022-09-19_18-04-20_803254_1/sockets/raylet', 'webui_url': '10.217.0.250:8265', 'session_dir': '/tmp/ray/session_2022-09-19_18-04-20_803254_1', 'metrics_export_port': 60865, 'gcs_address': 'mycluster-ray-head:6379', 'address': 'mycluster-ray-head:6379', 'node_id': 'df94b490ae84d2b774897f29f4aaee631453f7778ccc4c8dc155d4ce'})" ] }, "execution_count": 1, @@ -180,14 +129,14 @@ "name": "stdout", "output_type": "stream", "text": [ - "Worker 0: mycluster-ray-head-68db74bfd9-zfwpx\n", - "Worker 1: mycluster-ray-worker-99d5fbd59-w4wkk\n", - "Worker 2: mycluster-ray-head-68db74bfd9-zfwpx\n", - "Worker 3: mycluster-ray-worker-99d5fbd59-w4wkk\n", - "Worker 4: mycluster-ray-head-68db74bfd9-zfwpx\n", - "Worker 5: mycluster-ray-worker-99d5fbd59-w4wkk\n", - "Worker 6: mycluster-ray-head-68db74bfd9-zfwpx\n", - "Worker 7: mycluster-ray-worker-99d5fbd59-w4wkk\n" + "Worker 0: mycluster-ray-worker-68c6679546-9b87f\n", + "Worker 1: mycluster-jupyterlab-58f59b7597-bhtlv\n", + "Worker 2: mycluster-jupyterlab-58f59b7597-bhtlv\n", + "Worker 3: mycluster-jupyterlab-58f59b7597-bhtlv\n", + "Worker 4: mycluster-ray-head-6479567bbd-rt2dz\n", + "Worker 5: mycluster-ray-worker-68c6679546-l6b78\n", + "Worker 6: mycluster-jupyterlab-58f59b7597-bhtlv\n", + "Worker 7: mycluster-jupyterlab-58f59b7597-bhtlv\n" ] } ], From 2074761ff29b9c8b8854dfaebf1d6318aec95d50 Mon Sep 17 00:00:00 2001 From: "Pedro D. Bello-Maldonado" Date: Mon, 19 Sep 2022 21:15:59 -0400 Subject: [PATCH 15/18] JupyterLab server deployment ready to be tested --- .../ml/jupyterlab/start/kubernetes/index.md | 1 - .../ml/jupyterlab/start/kubernetes/install.sh | 24 +++++++ .../start/kubernetes/jupyter-server.md | 66 ++++++++++++++++--- .../jupyterlab/start/kubernetes/ray-server.md | 3 +- .../ml/jupyterlab/stop/kubernetes/index.md | 14 ++++ 5 files changed, 95 insertions(+), 13 deletions(-) create mode 100644 guidebooks/ml/jupyterlab/start/kubernetes/install.sh create mode 100644 guidebooks/ml/jupyterlab/stop/kubernetes/index.md diff --git a/guidebooks/ml/jupyterlab/start/kubernetes/index.md b/guidebooks/ml/jupyterlab/start/kubernetes/index.md index f91eed09..44f92ca1 100644 --- a/guidebooks/ml/jupyterlab/start/kubernetes/index.md +++ b/guidebooks/ml/jupyterlab/start/kubernetes/index.md @@ -1,7 +1,6 @@ --- imports: - ./ray-server - - ./port-forward - ./jupyter-server --- diff --git a/guidebooks/ml/jupyterlab/start/kubernetes/install.sh b/guidebooks/ml/jupyterlab/start/kubernetes/install.sh new file mode 100644 index 00000000..17ef5096 --- /dev/null +++ b/guidebooks/ml/jupyterlab/start/kubernetes/install.sh @@ -0,0 +1,24 @@ +# +# Helm deployment of Ray server with JupyterLab +# + +GITHUB=github.com +ORG=${JUPYTERLAB_CHART_ORG-guidebooks} +REPO=${JUPYTERLAB_CHART_REPO-store} +BRANCH=${JUPYTERLAB_CHART_BRANCH} +SUBDIR=${JUPYTERLAB_CHART_SUBDIR-guidebooks/ml/jupyterlab/start/kubernetes/chart} + +JUPYTERLAB_CLONE_TEMPDIR=$(mktemp -d) + +if [ -n "$BRANCH" ]; then + BRANCH_OPT="-b ${BRANCH}" +fi + +git clone --filter=tree:0 --depth 1 --sparse https://${GITHUB}/${ORG}/${REPO}.git ${BRANCH_OPT} ${JUPYTERLAB_CLONE_TEMPDIR} && \ + cd ${JUPYTERLAB_CLONE_TEMPDIR} && \ + git sparse-checkout init --cone && \ + git sparse-checkout set ${SUBDIR} + +helm --kube-context ${KUBE_CONTEXT} --namespace ${KUBE_NS} \ + upgrade --install --wait \ + jupyterlab ${JUPYTERLAB_CLONE_TEMPDIR}/${SUBDIR} diff --git a/guidebooks/ml/jupyterlab/start/kubernetes/jupyter-server.md b/guidebooks/ml/jupyterlab/start/kubernetes/jupyter-server.md index ab624c53..525bafb0 100644 --- a/guidebooks/ml/jupyterlab/start/kubernetes/jupyter-server.md +++ b/guidebooks/ml/jupyterlab/start/kubernetes/jupyter-server.md @@ -3,28 +3,74 @@ imports: - ml/ray/cluster/head --- -# Create working directory and copy everything in the local working directory to the server working directory +```shell +export RAY_KUBE_CLUSTER_NAME=$(kubectl get pod --no-headers -l ray-node-type=head -o custom-columns=NAME:.metadata.labels.ray-cluster-name | head -1 ) +``` + +# Start the JupyterLab server, create working directory, and copy everything in the local working directory to the server working directory ```shell -oc exec -it $RAY_HEAD_POD -- mkdir -p /home/ray/work +--- +validate: | + if [ -n "${KUBE_CONTEXT}" ] && [ -n "${KUBE_NS}" ]; then kubectl ${KUBE_CONTEXT_ARG} ${KUBE_NS_ARG} get deploy ${RAY_KUBE_CLUSTER_NAME}-jupyterlab; else exit 1; fi +--- + +--8<-- "./install.sh" + +while [ "${JUPYTERLAB_POD}" = "" ]; +do + JUPYTERLAB_POD=$(python3 -c "pod = '''$(kubectl get pods --selector app=jupyterlab-pod | grep Running)'''.split(); print(pod[0]) if len(pod) > 0 else print()") +done + +echo -n "Instillaing JupyterLab..." + +while [ $(oc exec $JUPYTERLAB_POD -- which jupyter-lab &> /dev/null && echo 1 || echo 0) -eq 0 ] +do + echo -n "." +done + +echo + +oc exec -it $JUPYTERLAB_POD -- mkdir -p /home/ray/work tar -zcvf .work.tar -C $CUSTOM_WORKING_DIR . -kubectl cp .work.tar $RAY_HEAD_POD:/home/ray/work -oc exec $RAY_HEAD_POD -- bash -c -- "tar -xvf /home/ray/work/.work.tar -C /home/ray/work; rm /home/ray/work/.work.tar" -rm .work.tar +kubectl cp .work.tar $JUPYTERLAB_POD:/home/ray/work +oc exec $JUPYTERLAB_POD -- bash -c -- "tar -xvf /home/ray/work/.work.tar -C /home/ray/work; rm /home/ray/work/.work.tar" +``` + +```shell +export JUPYTERLAB_POD=$(python3 -c "pod = '''$(kubectl get pods --selector app=jupyterlab-pod | grep Running)'''.split(); print(pod[0]) if len(pod) > 0 else print()") +``` + +# Port-forward to the Jupyter-lab server + +```shell.async +date > /tmp/port-forward-jupyterlab + +NUM_SERVERS=0 + +while [ ${NUM_SERVERS} -eq 0 ]; +do + SERVER_LIST=$(oc exec $JUPYTERLAB_POD -- jupyter server list) + NUM_SERVERS=$(oc exec $JUPYTERLAB_POD -- python3 -c "response = '''${SERVER_LIST}'''.split('\n'); print(len(response) - 1)") + echo "Waiting for server to start..." >> /tmp/port-forward-jupyterlab + sleep 1 +done + +kubectl ${KUBE_CONTEXT_ARG} ${KUBE_NS_ARG} port-forward service/${RAY_KUBE_CLUSTER_NAME}-jupyterlab 8888:8888 >> /tmp/port-forward-jupyterlab ``` -# Initiate Jupyter-lab server on the head node of the Ray cluster +# Initiate Jupyter-lab server on the pod ```shell -oc exec -it $RAY_HEAD_POD -- jupyter-lab --port=8888 --no-browser --notebook-dir=/home/ray/work +oc exec -it $JUPYTERLAB_POD -- jupyter-lab --port=8888 --no-browser --notebook-dir=/home/ray/work ``` # On completion of the Jupyter-lab cluster work, copy everything back to the local working directory ```shell -oc exec $RAY_HEAD_POD -- tar -zcvf .work.tar -C /home/ray/work . -kubectl cp $RAY_HEAD_POD:/home/ray/.work.tar $CUSTOM_WORKING_DIR/.work.tar -oc exec $RAY_HEAD_POD -- rm /home/ray/.work.tar +oc exec $JUPYTERLAB_POD -- tar -zcvf .work.tar -C /home/ray/work . +kubectl cp $JUPYTERLAB_POD:/home/ray/.work.tar $CUSTOM_WORKING_DIR/.work.tar +oc exec $JUPYTERLAB_POD -- rm /home/ray/.work.tar tar -xvf $CUSTOM_WORKING_DIR/.work.tar -C $CUSTOM_WORKING_DIR . rm $CUSTOM_WORKING_DIR/.work.tar ``` diff --git a/guidebooks/ml/jupyterlab/start/kubernetes/ray-server.md b/guidebooks/ml/jupyterlab/start/kubernetes/ray-server.md index 65724b34..377271dd 100644 --- a/guidebooks/ml/jupyterlab/start/kubernetes/ray-server.md +++ b/guidebooks/ml/jupyterlab/start/kubernetes/ray-server.md @@ -1,5 +1,6 @@ --- imports: + - ml/ray/start/kubernetes - kubernetes/kubectl - kubernetes/helm3 - kubernetes/context @@ -11,5 +12,3 @@ imports: A JupyterLab server will run on a Kubernetes cluster --8<-- "../util/working-directory.md" - -:import{ml/ray/start/kubernetes} diff --git a/guidebooks/ml/jupyterlab/stop/kubernetes/index.md b/guidebooks/ml/jupyterlab/stop/kubernetes/index.md new file mode 100644 index 00000000..519965c3 --- /dev/null +++ b/guidebooks/ml/jupyterlab/stop/kubernetes/index.md @@ -0,0 +1,14 @@ +--- +imports: + - kubernetes/helm3 + - kubernetes/context + - kubernetes/choose/ns +--- + +# Stop The JupyterLab Server in Kubernetes + +Stop The JupyterLab Server in Kubernetes. + +```shell +helm ${KUBE_CONTEXT_ARG_HELM} ${KUBE_NS_ARG} uninstall jupyterlab || exit 0 +``` From 460f06afed05bae2c9e196e6830656334d904ac6 Mon Sep 17 00:00:00 2001 From: "Pedro D. Bello-Maldonado" Date: Mon, 19 Sep 2022 21:21:04 -0400 Subject: [PATCH 16/18] Simple fixes --- guidebooks/ml/jupyterlab/start/local/index.md | 2 +- .../ray/start/kubernetes/chart/templates/_head-deployment.tpl | 1 - .../ml/ray/start/kubernetes/chart/templates/_head-service.tpl | 4 ---- 3 files changed, 1 insertion(+), 6 deletions(-) diff --git a/guidebooks/ml/jupyterlab/start/local/index.md b/guidebooks/ml/jupyterlab/start/local/index.md index c2114a5b..a5436f08 100644 --- a/guidebooks/ml/jupyterlab/start/local/index.md +++ b/guidebooks/ml/jupyterlab/start/local/index.md @@ -1,5 +1,5 @@ --- -imports: +imports: - ./local/image.md --- diff --git a/guidebooks/ml/ray/start/kubernetes/chart/templates/_head-deployment.tpl b/guidebooks/ml/ray/start/kubernetes/chart/templates/_head-deployment.tpl index 3332aeb6..64359a7b 100644 --- a/guidebooks/ml/ray/start/kubernetes/chart/templates/_head-deployment.tpl +++ b/guidebooks/ml/ray/start/kubernetes/chart/templates/_head-deployment.tpl @@ -60,7 +60,6 @@ spec: - containerPort: 10001 # Used by Ray Client - containerPort: 8265 # Used by Ray Dashboard - containerPort: 8000 # Used by Ray Serve - - containerPort: 8888 # Used by Jupyter-lab server startupProbe: periodSeconds: {{ .Values.startupProbe.periodSeconds | default 10 }} diff --git a/guidebooks/ml/ray/start/kubernetes/chart/templates/_head-service.tpl b/guidebooks/ml/ray/start/kubernetes/chart/templates/_head-service.tpl index ff252651..56f37fca 100644 --- a/guidebooks/ml/ray/start/kubernetes/chart/templates/_head-service.tpl +++ b/guidebooks/ml/ray/start/kubernetes/chart/templates/_head-service.tpl @@ -19,10 +19,6 @@ spec: protocol: TCP port: 6379 targetPort: 6379 - - name: jupyter-lab - protocol: TCP - port: 8888 - targetPort: 8888 selector: component: ray-head {{end}} From 03d8039952d7a445bb85b43b0bd23762b4d02807 Mon Sep 17 00:00:00 2001 From: "Pedro D. Bello-Maldonado" Date: Mon, 26 Sep 2022 16:58:46 -0400 Subject: [PATCH 17/18] Updated code with Nick's revisions to include Kubernetes context and namespace. Change 'oc' to 'kubectl'. --- .../jupyterlab/start/examples/example.ipynb | 45 +++++++++++-------- .../start/kubernetes/jupyter-server.md | 43 +++++++++--------- 2 files changed, 49 insertions(+), 39 deletions(-) diff --git a/guidebooks/ml/jupyterlab/start/examples/example.ipynb b/guidebooks/ml/jupyterlab/start/examples/example.ipynb index ad8ff96a..91076345 100644 --- a/guidebooks/ml/jupyterlab/start/examples/example.ipynb +++ b/guidebooks/ml/jupyterlab/start/examples/example.ipynb @@ -22,7 +22,7 @@ }, { "cell_type": "code", - "execution_count": 3, + "execution_count": 1, "id": "1df92a57-5155-4849-b274-c5c38211606d", "metadata": {}, "outputs": [], @@ -33,25 +33,25 @@ }, { "cell_type": "code", - "execution_count": 4, + "execution_count": 2, "id": "d3b85b96-3fb7-4e2e-892b-b71d8930f2b0", "metadata": {}, "outputs": [], "source": [ - "n = 100\n", + "n = 10\n", "x = np.linspace(0.0, 2.0, n)\n", "y = np.sin(np.pi * x)" ] }, { "cell_type": "code", - "execution_count": 5, + "execution_count": 4, "id": "ecec7155-320e-47c1-878e-aa0017d13ca5", "metadata": {}, "outputs": [ { "data": { - "image/png": "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odVqjfb38ccfY+PGjXj44Yfx1FNP4ezZszh48CBOnjyJc+fOwdPTEwAwevRoHD16FGlpaejfvz/atWun34euzuXLlzFt2jR4eXkhMDAQvXv3Rm5uLv79738jJSUFGRkZWL58eY3zNsfUqVNRUlKCrl27IigoCLdu3cLXX3+NxYsX49ixYzh8+LA+Pk5OTti1axdCQkIwZcoUfPfdd2jdujUA4MqVK5g5cyY0Gg327NkDtVpdY7+nT59GSEgISktLERQUhOHDh6O4uBiZmZnYuHEjRowYgTZt2tR5fkRkBYSIiO4JgNzrkLljxw4BIJMnTzYoX79+vQCQLl26SG5urr48OztbAgMDBYBs2rTJoE1oaKgAEI1GI8nJySbH5Ofnd8+x37hxQwICAgSA7Nu3T18eHx8vAMTLy0suXLigL8/Pz5eQkBABIPPnzzfY1+TJkwWA2NjYyP79+/XllZWVMmrUKAEgS5cuNWizbNkyASA7duwwOb4jR45IdXW1QXlmZqb4+/uLjY2NXLp06b72qeRf//qXFBcXG5QVFBTIkCFDBIC89957Rm2WL18uAGTIkCEiIlJVVSW///3vBYC89dZbRvX9/PyM1smkSZMEgKxfv96ofnp6umRnZ5s9ByKybkysiYjMoEuszXncnVj7+voKADl06JDRfg8cOCAApF27dgblusR65syZNY7pXol1RUWFhIWFKSa8AwYMEADyzjvvGLVLS0sTlUolTk5OUlJSoi/XJdYTJkwwapOamioAJDQ01KC8NkmwzrZt2wSA/O1vf7PYPu928eJFASAjR4402lZZWSl9+/YVABITEyOrV68WABIeHm70h4CIcmL95JNPCgA5e/ZsncdKRNaNl4IQEd0HU5daAP+73OJOP/30E3766Sd4eHggPDzcqM2QIUPg6uqKH374Abm5ufrLI3SGDRtWp/G++OKLSE5OxtNPP62/1hkAKioq8NVXXwEAJkyYYNQuKCgIQUFBSEtLw9mzZ9GnTx+D7Upz6dChAwDU+prhL774AsnJycjKykJpaSlERL+vixcv1mqfd7t48SIOHjyIH374Abdv30Z1dTVExGQftra22LVrF4KDg7FgwQJUVlbC3d0dO3bsMPt+1b169cKnn36KmTNnYvXq1QgJCUGLFnz7Jfot4iubiOg+1HQv5ri4OKPEOjs7GwDg5+en2EalUsHPzw/5+fnIysoySqx9fX1rPdbNmzdj69at6N69O3bu3GmQCObl5aG8vBytWrWCo6OjYnt/f3+kpaUhKyvLaJu3t7dRmbOzMwAYfRHwXm7duoWRI0ciMTHRZJ3CwsL72ufdRAQLFixAdHS0PpE2t4+AgACsXr0ac+bMAfBrXL28vMzue+HChfo/GgYOHAgnJyf07dsXERERiIyMRMuWLe9/QkRklXhXECKiRlbTmU+NRlOrfSYlJWHOnDnw8PDARx99ZDJ5ru24lL5oWVuLFi1CYmIiQkNDkZycjBs3bqCyshIigkOHDgGAyWTYXPv27cOGDRvg7e2N+Ph4ZGVloby8HCKi/0PAVB/V1dWIj4/XP09NTb2vvl1cXJCYmIiUlBS8/PLL6Ny5MxITEzF37lwEBgZa7Gw8ETU+JtZERPVId2bzypUrJuvotj344IMW6fPHH3/E6NGjYWNjgw8//FDxbLm7uzvs7e1x48YN3L59W3E/ly9ftui4TNm/fz9sbW1x4MABhIaGwt3dXX93jszMTIv1AQBbtmzBqFGj4OXlpf9xnXv1sW7dOqSkpCAsLAze3t5488039bcKNJdKpUJISAjWrVuHkydPIjs7G+PHj8fPP/+MxYsX12pORGR9mFgTEdUjX19f+Pr64vr16zh27JjR9oSEBPzyyy9o166d0WUgtVFYWIhhw4bh5s2b2Lx5M0JCQhTr2dnZ6a+bVrpX9Llz55CWlgYnJycEBwfXaUz29vYAfr2Xt5JffvkFLi4ucHFxMdr2/vvv16nvO/sAlC9hqamP06dPY9myZXBzc8Pu3bsRFxcHEcGkSZOQn59f6/G0bt1afwvBc+fO1Xo/RGRdmFgTEdWzF198EQDw0ksv4fr16/ry3NxcLFy4EAD01+/WRXV1NZ555hmcP38ec+bMwdSpU80a1/Llyw3O2hYWFmLWrFkQETz//PO1vhxFR3fW/vvvv1fc3qFDB/zyyy/Yt2+fQXl0dDSSkpLq1PedfQBAbGyswSUfKSkpeOONNxTblJSUYOLEiaioqEBsbCy8vLzw2GOPYe7cubh69SqmT59uVt9bt27FpUuXjMoPHjwIAPDx8bnf6RCRleKXF4mI6tm8efOQmJiITz/9FO3bt8egQYMgIjh27BgKCwsxYsQIzJgxo879nDhxAp988glsbW2Rl5eHyMhIozqtWrXC+vXrAfz64y1RUVGIjY1F165dDX4g5vr16+jTpw9WrlxZ53GFh4dDo9EgOjoa586dg5eXF1QqFRYuXIjAwEC88sormDhxIv74xz8iJiYG3t7eSEtLQ0ZGBubNm4fo6Og6j2H27NmIi4vD5s2bkZycjKCgIGRlZeGLL77A/Pnz9TG50/z585GRkYFnn30Wo0aN0pevXbsWR48exd69exEREYGJEyfW2PfWrVsxffp0dO7cGZ06dUKLFi2QkZGBtLQ0aDQa/OUvf6nz/IjISjTOXf6IiJoW1OEHYkR+vZ/0xo0bpUePHqLVakWr1crDDz8sMTExUllZaVRfdx/ru38Y5e4x3Xkf66SkpHveY1vpvtf/+Mc/pF+/fuLk5CQajUa6dOkia9asMfoxFZH/3cc6KSnJrDHpHDp0SPr37y9OTk76sdy5j4SEBOnTp484OzuLq6ur/OEPf5Dk5GT9nO6OaW3uY52eni5Dhw6V1q1bi1arlR49ekhsbKziuBMSEgSABAQESGFhodG+vv32W1Gr1eLi4mLwb6R0H+sDBw7IlClTpEuXLuLq6iparVY6dOgg06ZNk4yMDLPHT0TWTyVSx69aExERERERr7EmIiIiIrIEJtZERERERBbAxJqIiIiIyAKYWBMRERERWQATayIiIiIiC2BiTURERERkAUysiYiIiIgsgIk1EREREZEFMLEmIiIiIrIAJtZERERERBbAxJqIiIiIyAKYWBMRERERWcD/AcwvBLPX5ccOAAAAAElFTkSuQmCC\n", + "image/png": "iVBORw0KGgoAAAANSUhEUgAAAtYAAAIvCAYAAABQjZwXAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjUuMiwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8qNh9FAAAACXBIWXMAAA9hAAAPYQGoP6dpAAComklEQVR4nOzdeVxUZd8G8OvMsCOL7DsIgrijCLjilitqamq5hpnanlZaZmW9ZfVk+1NW5oJrllhqau67GG64gyiygyAgggLDMDPvH8g8EYMCDhxm5vp+Pn7elzNnuc4tPv043Od3CyqVSgUiIiIiInokErEDEBERERHpAxbWRERERERawMKaiIiIiEgLWFgTEREREWkBC2siIiIiIi1gYU1EREREpAUsrImIiIiItICFNRERERGRFrCwJiIiIiLSAhbWREQi6ty5MwRBgKmpKfLz85vsuj4+PhAEASkpKU12zaYSGRkJQRAQFRUldhQiMjAsrImIRHLq1ClcuHABAFBeXo5169aJnIg06devHwRBwKFDh8SOQkTNHAtrIiKRrFixAgDg7u5e7eumsH//fsTHx6uvTUREj46FNRGRCEpKSvDLL78AANauXYsWLVrg4sWLOHXqVJNc38/PD4GBgTA2Nm6S6xERGQIW1kREIti0aROKiorQoUMH9O/fH08++SSAhj+1lslkWLJkCYKDg2FlZQUTExO4uLggJCQE8+fPR0FBQbX9a5tj/c9pD+fOncPYsWPh4OAAU1NTtGvXDl988QVUKlWtOfbv34+xY8fC1dUVJiYmcHJywpgxY3DixIl639M/M/7xxx/o3bs3rK2tYWVlhX79+mHnzp31PicAbNy4EQMHDoSdnR1MTU3h7e2NZ555BomJidX2O3ToEARBwOHDhwEA/fv3hyAI6j+cw01E/8bCmohIBFUF9DPPPFPt/27cuBGlpaX1OpdSqURERATmz5+P69evo0+fPhg3bhw6duyIW7duYcmSJUhLS6vXOXfv3o2wsDAkJCRg0KBB6NGjBxITE/HGG29g7ty5Go9544038Nhjj2Hr1q3w8vLC6NGj4evri61bt6JPnz5YtWpVvTJU+fbbbzF27FjIZDKMGDEC7dq1w+HDhxEREYH//ve/dT6PSqXC008/jYkTJ+LIkSPo0qULxo4dCzMzM6xatQpdunTBrl271Pu7uLjg6aefhrOzMwBgyJAhePrpp9V/Wrdu3aD7ISI9piIioiZ19epVFQCVsbGxKjc3V709MDBQBUC1Zs2aep3v8OHDKgCqLl26qIqKimp8furUKVVeXl61bd7e3ioAquTk5Grb+/btqwKgAqD68ccfq322f/9+lSAIKqlUqkpPT6/22bJly1QAVK1bt1adP3++Rj4rKyuViYmJKjExsc73VZVREATVunXrqn22ceNGlSAIKiMjI9XFixerffb000+rAKhWrVpVbfsPP/ygAqBycHBQxcXFqbcrlUrVokWLVABUtra21f5O/jkmBw8erHN2IjJMfGJNRNTEVq5cCQAYNWoUHB0d1durnlrXdzpITk4OAKBPnz6wsrKq8Xm3bt1gb29fr3OOHTsWs2fPrrZtwIABGDJkCBQKBQ4ePKjerlQq8f777wOofOLeqVOnaseFh4fj3XffRXl5OX766ad65QCAxx9/HJMnT6627cknn8TYsWNRUVGBb7/9tk7n+fzzzwEA7733HoKCgtTbBUHAokWL0KlTJxQWFuLnn3+ud0YiIoBTQYiImlRFRQVWr14N4H+FdJVp06bByMgIR44cQVJSUp3P2bVrV0ilUqxcuRLff/89srOzHznnyJEjNW5v27YtACAzM1O9LS4uDllZWfDz80NwcLDG4/r16wcAiImJqXeWp59++oHb69IGLyMjQz2mms4nCAKmT58OANV+aCAiqg8W1kRETWjHjh24efMm3N3dMWTIkGqfOTs7Y/jw4VCpVOqn2nXh5+eHr776CnK5HC+99BLc3Nzg4+ODiRMnYv369SgvL693Ti8vL43bra2tAQBlZWXqbTdu3AAAJCUlVXu5759/QkNDAQC3bt2qd5ZWrVo9cHtGRsZDz1H1g4C9vb36Hv7Nz8+v2r5ERPVlJHYAIiJDUjXNo6ysDH379q3xeVVRFxUVhf/7v/+DVCqt03lffvllTJgwAdu2bcOxY8dw7NgxbNy4ERs3bsSiRYtw9OhRuLq61jmnRFL35y5KpRJA5ct+//5h4d8cHBzqfN66Uj2gSwkRUVNiYU1E1ESys7PVLeLy8/Nx/PjxWvfNysrCrl27EBERUefzOzs7Y+bMmZg5cyYAICEhAc888wxOnDiBt956Sz0FRds8PT0BVD4NbowWdMnJyejcuXON7VWtAj08PB56jqqFcPLz81FUVKTxqXXVk3cumkNEDcWpIERETSQqKgoKhQJhYWFQqVS1/pk/fz6AR1+JMTAwEG+++SYA4Ny5c48av1YhISFwcHDAlStXcPnyZa2ff+3atRq3r1mzBsD/5m8/iIeHh3qqh6biX6VSqbf379+/2mcmJiYAKufHExE9CAtrIqImUjVvuraX8apMmzYNALB9+/Y6zUk+cOAAdu7cCblcXm27SqXC9u3bAQDe3t4NiVwnxsbGWLRoEVQqFcaMGYNjx47V2EehUODAgQP4+++/633+P/74Axs3bqy2LTo6Gps3b4aRkRFefvnlOp3njTfeAAB8+OGHOH/+vHq7SqXCRx99hHPnzsHW1lb9xL9K1RPxxvihgYj0C6eCEBE1gcOHD+P69eswNTXFU0899cB927dvj65du+Ls2bNYs2YNXn/99Qfuf+HCBcydOxfW1tbo2rUr3NzcUFpairNnzyI1NRU2Njb4v//7P23eTg0vvfQS0tLSsGTJEvTp0wft27dH69atYW5ujps3b+LcuXMoLCzEDz/8gO7du9fr3K+++iomTpyIL7/8Ev7+/khKSkJsbCyAyhZ6/27vV5vZs2cjJiYGa9euRbdu3dC3b184OTnh7NmzuHr1KszNzbFhw4ZqLRAB4IknnsCqVaswf/587Nu3D05OThAEAc888wx69uxZr3shIv3GJ9ZERE2galrHyJEj0bJly4fuX/XUui7TQUaOHIn3338fISEhuHHjBn7//XccOnQINjY2eOutt3Dp0qVqfZsby2effYbjx49j8uTJuHv3Lnbt2oUdO3YgKysL/fr1w/Lly9VLt9fHq6++it9++w1GRkbYtm0bLl26hD59+uDPP/+sdRVITQRBwJo1a7Bhwwb07t0bZ86cQXR0NEpKShAZGYm4uDgMGzasxnERERH4+eef0aFDBxw4cAArV67EihUraiyBTkQkqPg6NRERNUM+Pj5ITU1FcnIyfHx8xI5DRPRQfGJNRERERKQFLKyJiIiIiLSAhTURERERkRZwjjURERERkRbwiTURERERkRawsCYiIiIi0gIuECMipVKJrKwsWFlZQRAEseMQERER0b+oVCoUFxfDzc0NEsmDn0mzsBZRVlYWPD09xY5BRERERA+Rnp4ODw+PB+7DwlpEVlZWACr/oqytrRv9enK5HHv27MHgwYNhbGzc6NfTJRwbzTgutePYaMZx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\n", "text/plain": [ "
" ] @@ -83,17 +83,17 @@ }, { "cell_type": "code", - "execution_count": 1, + "execution_count": 5, "id": "40e97020-a023-47a1-9080-ba7751ffe82d", "metadata": {}, "outputs": [ { "data": { "text/plain": [ - "RayContext(dashboard_url='10.217.0.250:8265', python_version='3.7.7', ray_version='1.13.1', ray_commit='da2a91cd34ac58df4c49b2fa65a5bd25bc1e2057', address_info={'node_ip_address': '10.217.0.253', 'raylet_ip_address': '10.217.0.253', 'redis_address': None, 'object_store_address': '/tmp/ray/session_2022-09-19_18-04-20_803254_1/sockets/plasma_store', 'raylet_socket_name': '/tmp/ray/session_2022-09-19_18-04-20_803254_1/sockets/raylet', 'webui_url': '10.217.0.250:8265', 'session_dir': '/tmp/ray/session_2022-09-19_18-04-20_803254_1', 'metrics_export_port': 60865, 'gcs_address': 'mycluster-ray-head:6379', 'address': 'mycluster-ray-head:6379', 'node_id': 'df94b490ae84d2b774897f29f4aaee631453f7778ccc4c8dc155d4ce'})" + "RayContext(dashboard_url='10.217.0.118:8265', python_version='3.7.7', ray_version='1.13.1', ray_commit='da2a91cd34ac58df4c49b2fa65a5bd25bc1e2057', address_info={'node_ip_address': '10.217.0.121', 'raylet_ip_address': '10.217.0.121', 'redis_address': None, 'object_store_address': '/tmp/ray/session_2022-09-26_13-38-36_182086_1/sockets/plasma_store', 'raylet_socket_name': '/tmp/ray/session_2022-09-26_13-38-36_182086_1/sockets/raylet', 'webui_url': '10.217.0.118:8265', 'session_dir': '/tmp/ray/session_2022-09-26_13-38-36_182086_1', 'metrics_export_port': 54840, 'gcs_address': 'mycluster-ray-head:6379', 'address': 'mycluster-ray-head:6379', 'node_id': '204a8ae48e6c0b1c338cd8506b2e86d4376f1fcd7ee67cc40e409cec'})" ] }, - "execution_count": 1, + "execution_count": 5, "metadata": {}, "output_type": "execute_result" } @@ -103,12 +103,19 @@ "import time\n", "import socket\n", "\n", - "ray.init(\"auto\")" + "if ray.is_initialized():\n", + " ray.shutdown()\n", + " \n", + "ray.init(\"auto\")\n", + "#ray.init(address = \"ray://mycluster-ray-head:10001\")\n", + "#ray.init(address = \"172.30.186.150:6379\")\n", + "#ray.init(address = \"172.21.103.4:8265\")\n", + "#ray.init(address = \"172.21.103.4:10001\")" ] }, { "cell_type": "code", - "execution_count": 2, + "execution_count": 6, "id": "ed02f67a-b97f-4033-af5f-ed79b8168ddc", "metadata": {}, "outputs": [], @@ -121,7 +128,7 @@ }, { "cell_type": "code", - "execution_count": 3, + "execution_count": 7, "id": "208a3d7a-07c4-4267-829d-6f4c0b928325", "metadata": {}, "outputs": [ @@ -129,14 +136,14 @@ "name": "stdout", "output_type": "stream", "text": [ - "Worker 0: mycluster-ray-worker-68c6679546-9b87f\n", - "Worker 1: mycluster-jupyterlab-58f59b7597-bhtlv\n", - "Worker 2: mycluster-jupyterlab-58f59b7597-bhtlv\n", - "Worker 3: mycluster-jupyterlab-58f59b7597-bhtlv\n", - "Worker 4: mycluster-ray-head-6479567bbd-rt2dz\n", - "Worker 5: mycluster-ray-worker-68c6679546-l6b78\n", - "Worker 6: mycluster-jupyterlab-58f59b7597-bhtlv\n", - "Worker 7: mycluster-jupyterlab-58f59b7597-bhtlv\n" + "Worker 0: mycluster-ray-worker-68c6679546-jkhqf\n", + "Worker 1: mycluster-ray-worker-68c6679546-lp6b6\n", + "Worker 2: mycluster-ray-head-6479567bbd-s9k9k\n", + "Worker 3: mycluster-jupyterlab-58f59b7597-28n78\n", + "Worker 4: mycluster-jupyterlab-58f59b7597-28n78\n", + "Worker 5: mycluster-jupyterlab-58f59b7597-28n78\n", + "Worker 6: mycluster-jupyterlab-58f59b7597-28n78\n", + "Worker 7: mycluster-jupyterlab-58f59b7597-28n78\n" ] } ], diff --git a/guidebooks/ml/jupyterlab/start/kubernetes/jupyter-server.md b/guidebooks/ml/jupyterlab/start/kubernetes/jupyter-server.md index 525bafb0..77071b6b 100644 --- a/guidebooks/ml/jupyterlab/start/kubernetes/jupyter-server.md +++ b/guidebooks/ml/jupyterlab/start/kubernetes/jupyter-server.md @@ -4,7 +4,7 @@ imports: --- ```shell -export RAY_KUBE_CLUSTER_NAME=$(kubectl get pod --no-headers -l ray-node-type=head -o custom-columns=NAME:.metadata.labels.ray-cluster-name | head -1 ) +export RAY_KUBE_CLUSTER_NAME=$(kubectl get ${KUBE_CONTEXT_ARG} ${KUBE_NS_ARG} pod --no-headers -l ray-node-type=head -o custom-columns=NAME:.metadata.labels.ray-cluster-name | head -1 ) ``` # Start the JupyterLab server, create working directory, and copy everything in the local working directory to the server working directory @@ -12,33 +12,35 @@ export RAY_KUBE_CLUSTER_NAME=$(kubectl get pod --no-headers -l ray-node-type=hea ```shell --- validate: | - if [ -n "${KUBE_CONTEXT}" ] && [ -n "${KUBE_NS}" ]; then kubectl ${KUBE_CONTEXT_ARG} ${KUBE_NS_ARG} get deploy ${RAY_KUBE_CLUSTER_NAME}-jupyterlab; else exit 1; fi + if [ -n "${KUBE_CONTEXT}" ] && [ -n "${KUBE_NS}" ]; then kubectl get ${KUBE_CONTEXT_ARG} ${KUBE_NS_ARG} deploy ${RAY_KUBE_CLUSTER_NAME}-jupyterlab; else exit 1; fi --- --8<-- "./install.sh" +``` -while [ "${JUPYTERLAB_POD}" = "" ]; -do - JUPYTERLAB_POD=$(python3 -c "pod = '''$(kubectl get pods --selector app=jupyterlab-pod | grep Running)'''.split(); print(pod[0]) if len(pod) > 0 else print()") -done +```shell +kubectl wait ${KUBE_CONTEXT_ARG} ${KUBE_NS_ARG} deploy/${RAY_KUBE_CLUSTER_NAME}-jupyterlab --for=condition=Available + +JUPYTERLAB_POD=$(python3 -c "pod = '''$(kubectl get ${KUBE_CONTEXT_ARG} ${KUBE_NS_ARG} pods --selector app=jupyterlab-pod | grep Running)'''.split(); print(pod[0]) if len(pod) > 0 else print()") -echo -n "Instillaing JupyterLab..." +echo -n "Installing JupyterLab..." -while [ $(oc exec $JUPYTERLAB_POD -- which jupyter-lab &> /dev/null && echo 1 || echo 0) -eq 0 ] +while [ $(kubectl exec ${KUBE_CONTEXT_ARG} ${KUBE_NS_ARG} $JUPYTERLAB_POD -- which jupyter-lab &> /dev/null && echo 1 || echo 0) -eq 0 ] do echo -n "." done echo -oc exec -it $JUPYTERLAB_POD -- mkdir -p /home/ray/work +# This trick is used because 'kubectl cp /* :' doesn't work for me +kubectl exec ${KUBE_CONTEXT_ARG} ${KUBE_NS_ARG} $JUPYTERLAB_POD -- mkdir -p /home/ray/work tar -zcvf .work.tar -C $CUSTOM_WORKING_DIR . -kubectl cp .work.tar $JUPYTERLAB_POD:/home/ray/work -oc exec $JUPYTERLAB_POD -- bash -c -- "tar -xvf /home/ray/work/.work.tar -C /home/ray/work; rm /home/ray/work/.work.tar" +kubectl cp ${KUBE_CONTEXT_ARG} ${KUBE_NS_ARG} .work.tar $JUPYTERLAB_POD:/home/ray/work +kubectl exec ${KUBE_CONTEXT_ARG} ${KUBE_NS_ARG} $JUPYTERLAB_POD -- bash -c -- "tar -xvf /home/ray/work/.work.tar -C /home/ray/work; rm /home/ray/work/.work.tar" ``` ```shell -export JUPYTERLAB_POD=$(python3 -c "pod = '''$(kubectl get pods --selector app=jupyterlab-pod | grep Running)'''.split(); print(pod[0]) if len(pod) > 0 else print()") +export JUPYTERLAB_POD=$(python3 -c "pod = '''$(kubectl get ${KUBE_CONTEXT_ARG} ${KUBE_NS_ARG} pods --selector app=jupyterlab-pod | grep Running)'''.split(); print(pod[0]) if len(pod) > 0 else print()") ``` # Port-forward to the Jupyter-lab server @@ -48,29 +50,30 @@ date > /tmp/port-forward-jupyterlab NUM_SERVERS=0 -while [ ${NUM_SERVERS} -eq 0 ]; +while [ "${NUM_SERVERS}" = "0" ]; do - SERVER_LIST=$(oc exec $JUPYTERLAB_POD -- jupyter server list) - NUM_SERVERS=$(oc exec $JUPYTERLAB_POD -- python3 -c "response = '''${SERVER_LIST}'''.split('\n'); print(len(response) - 1)") + SERVER_LIST=$(kubectl exec ${KUBE_CONTEXT_ARG} ${KUBE_NS_ARG} $JUPYTERLAB_POD -- jupyter server list) + NUM_SERVERS=$(kubectl exec ${KUBE_CONTEXT_ARG} ${KUBE_NS_ARG} $JUPYTERLAB_POD -- python3 -c "response = '''${SERVER_LIST}'''.split('\n'); print(len(response) - 1)") echo "Waiting for server to start..." >> /tmp/port-forward-jupyterlab sleep 1 done -kubectl ${KUBE_CONTEXT_ARG} ${KUBE_NS_ARG} port-forward service/${RAY_KUBE_CLUSTER_NAME}-jupyterlab 8888:8888 >> /tmp/port-forward-jupyterlab +kubectl port-forward ${KUBE_CONTEXT_ARG} ${KUBE_NS_ARG} service/${RAY_KUBE_CLUSTER_NAME}-jupyterlab 8888:8888 >> /tmp/port-forward-jupyterlab ``` # Initiate Jupyter-lab server on the pod ```shell -oc exec -it $JUPYTERLAB_POD -- jupyter-lab --port=8888 --no-browser --notebook-dir=/home/ray/work +kubectl exec ${KUBE_CONTEXT_ARG} ${KUBE_NS_ARG} -it $JUPYTERLAB_POD -- jupyter-lab --port=8888 --no-browser --notebook-dir=/home/ray/work ``` # On completion of the Jupyter-lab cluster work, copy everything back to the local working directory ```shell -oc exec $JUPYTERLAB_POD -- tar -zcvf .work.tar -C /home/ray/work . -kubectl cp $JUPYTERLAB_POD:/home/ray/.work.tar $CUSTOM_WORKING_DIR/.work.tar -oc exec $JUPYTERLAB_POD -- rm /home/ray/.work.tar +# This trick is used because 'kubectl cp :/* ' doesn't work for me +kubectl exec ${KUBE_CONTEXT_ARG} ${KUBE_NS_ARG} $JUPYTERLAB_POD -- tar -zcvf .work.tar -C /home/ray/work . +kubectl cp ${KUBE_CONTEXT_ARG} ${KUBE_NS_ARG} $JUPYTERLAB_POD:/home/ray/.work.tar $CUSTOM_WORKING_DIR/.work.tar +kubectl exec ${KUBE_CONTEXT_ARG} ${KUBE_NS_ARG} $JUPYTERLAB_POD -- rm /home/ray/.work.tar tar -xvf $CUSTOM_WORKING_DIR/.work.tar -C $CUSTOM_WORKING_DIR . rm $CUSTOM_WORKING_DIR/.work.tar ``` From f82b635bdc31fabc326c96ad0039e589c57eaeb2 Mon Sep 17 00:00:00 2001 From: "Pedro D. Bello-Maldonado" Date: Wed, 26 Oct 2022 16:43:53 -0400 Subject: [PATCH 18/18] Enable users to change imagePullPolicy in the YAML file --- .../ray/start/kubernetes/chart/templates/_head-deployment.tpl | 2 +- .../start/kubernetes/chart/templates/_worker-deployment.tpl | 2 +- guidebooks/ml/ray/start/kubernetes/chart/values.yaml | 2 ++ guidebooks/ml/ray/start/kubernetes/install-via-helm.sh | 3 ++- 4 files changed, 6 insertions(+), 3 deletions(-) diff --git a/guidebooks/ml/ray/start/kubernetes/chart/templates/_head-deployment.tpl b/guidebooks/ml/ray/start/kubernetes/chart/templates/_head-deployment.tpl index 64359a7b..2d146c83 100644 --- a/guidebooks/ml/ray/start/kubernetes/chart/templates/_head-deployment.tpl +++ b/guidebooks/ml/ray/start/kubernetes/chart/templates/_head-deployment.tpl @@ -51,7 +51,7 @@ spec: containers: - name: ray-head image: {{ .Values.image }} - imagePullPolicy: IfNotPresent + imagePullPolicy: {{ .Values.imagePullPolicy }} command: [ "/bin/bash", "-c", "--" ] args: - {{ print "ray start --head --port=6379 --redis-shard-ports=6380,6381 --num-cpus=" .Values.podTypes.rayHeadType.CPUInteger " --num-gpus=" .Values.podTypes.rayHeadType.GPU " --object-manager-port=22345 --node-manager-port=22346 --dashboard-host=0.0.0.0 --block" }} diff --git a/guidebooks/ml/ray/start/kubernetes/chart/templates/_worker-deployment.tpl b/guidebooks/ml/ray/start/kubernetes/chart/templates/_worker-deployment.tpl index 3e6fbc08..b9d4420e 100644 --- a/guidebooks/ml/ray/start/kubernetes/chart/templates/_worker-deployment.tpl +++ b/guidebooks/ml/ray/start/kubernetes/chart/templates/_worker-deployment.tpl @@ -38,7 +38,7 @@ spec: containers: - name: ray-worker image: {{ .Values.image }} - imagePullPolicy: IfNotPresent + imagePullPolicy: {{ .Values.imagePullPolicy }} command: ["/bin/bash", "-c", "--"] args: - {{ print "ray start --num-cpus=" .Values.podTypes.rayWorkerType.CPUInteger " --num-gpus=" .Values.podTypes.rayWorkerType.GPU " --address=" (include "ray.headService" .) ":6379 --object-manager-port=22345 --node-manager-port=22346 --block" }} diff --git a/guidebooks/ml/ray/start/kubernetes/chart/values.yaml b/guidebooks/ml/ray/start/kubernetes/chart/values.yaml index 2d3119ec..f0c46063 100644 --- a/guidebooks/ml/ray/start/kubernetes/chart/values.yaml +++ b/guidebooks/ml/ray/start/kubernetes/chart/values.yaml @@ -24,6 +24,8 @@ failsafes: # It's recommended to build custom dependencies for your workload into this image, # taking one of the offical `rayproject/ray` images as base. image: rayproject/ray:latest +# Define if images should be pulled or taken if present +imagePullPolicy: IfNotPresent # If a node is idle for this many minutes, it will be removed. idleTimeoutMinutes: 5 # serviceAccountName is used for the Ray head and each Ray worker. diff --git a/guidebooks/ml/ray/start/kubernetes/install-via-helm.sh b/guidebooks/ml/ray/start/kubernetes/install-via-helm.sh index d56d7467..3ad0f99f 100644 --- a/guidebooks/ml/ray/start/kubernetes/install-via-helm.sh +++ b/guidebooks/ml/ray/start/kubernetes/install-via-helm.sh @@ -77,4 +77,5 @@ cd $REPO/$SUBDIR && \ --set operatorNamespace=${KUBE_NS} \ ${startupProbe} \ --set clusterOnly=${CLUSTER_ONLY-false} ${SKIP_CRDS} \ - --set image=${RAY_IMAGE} + --set image=${RAY_IMAGE} \ + --set imagePullPolicy=${IMAGE_PULL_POLICY}