From 25dece116eb419213fe9c1b85f2cc7374fb8dee5 Mon Sep 17 00:00:00 2001 From: Dean P Date: Wed, 2 Sep 2020 10:10:32 +0300 Subject: [PATCH 01/11] Update README.md --- README.md | 151 +++++++----------------------------------------------- 1 file changed, 19 insertions(+), 132 deletions(-) diff --git a/README.md b/README.md index 89580f83..325a751d 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,8 @@ +# This Repository is a fork that is being maintained. Feel free to use it, create PR and requests if you have any. +

- +

@@ -9,19 +11,19 @@

- - - - + + + + - +

Getting StartedFeatures & ScreenshotsSupport • - Report a Bug • + Report a BugFAQKnown IssuesContribution @@ -45,7 +47,7 @@ The ML workspace is an all-in-one web-based IDE specialized for machine learning ## Getting Started

-Try in PWD +Try in PWD

### Prerequisites @@ -250,10 +252,10 @@ In addition to the main workspace image (`mltooling/ml-workspace`), we provide o #### Minimal Flavor

- - - - + + + +

@@ -266,134 +268,19 @@ docker run -p 8080:8080 mltooling/ml-workspace-minimal:latest ```
-#### R Flavor - -

- - - - -

- -
-Details (click to expand...) - -The R flavor (`mltooling/ml-workspace-r`) is based on our default workspace image and extends it with the R-interpreter, R-Jupyter kernel, RStudio server (access via `Open Tool -> RStudio`), and a variety of popular packages from the R ecosystem. - -```bash -docker run -p 8080:8080 mltooling/ml-workspace-r:latest -``` -
- -#### Spark Flavor - -

- - - - -

- -
-Details (click to expand...) - -The Spark flavor (`mltooling/ml-workspace-spark`) is based on our R-flavor workspace image and extends it with the Spark-interpreter, Spark-Jupyter kernel (Apache Toree), Zeppelin Notebook (access via `Open Tool -> Zeppelin`), and a few additional python libraries & Jupyter extensions. - -```bash -docker run -p 8080:8080 mltooling/ml-workspace-spark:latest -``` - -
- -#### GPU Flavor - -

- - - - -

- -
-Details (click to expand...) - -> _Currently, the GPU-flavor only supports CUDA 10.1. Support for other CUDA versions might be added in the future._ - -The GPU flavor (`mltooling/ml-workspace-gpu`) is based on our default workspace image and extends it with CUDA 10.1 and GPU-ready versions of various machine learning libraries (e.g., tensorflow, pytorch, cntk, jax). This GPU image has the following additional requirements for the system: - -- Nvidia Drivers for the GPUs. Drivers need to be CUDA 10.1 compatible, version `>= 418.39` ([📖 Instructions](https://github.com/NVIDIA/nvidia-docker/wiki/Frequently-Asked-Questions#how-do-i-install-the-nvidia-driver)). -- (Docker >= 19.03) Nvidia Container Toolkit ([📖 Instructions](https://github.com/NVIDIA/nvidia-docker/wiki/Installation-(Native-GPU-Support))). - -```bash -docker run -p 8080:8080 --gpus all mltooling/ml-workspace-gpu:latest -``` - -- (Docker < 19.03) Nvidia Docker 2.0 ([📖 Instructions](https://github.com/NVIDIA/nvidia-docker/wiki/Installation-(version-2.0))). - -```bash -docker run -p 8080:8080 --runtime nvidia --env NVIDIA_VISIBLE_DEVICES="all" mltooling/ml-workspace-gpu:latest -``` - -The GPU flavor also comes with a few additional configuration options, as explained below: - - - - - - - - - - - - - - - - - - - - - - -
VariableDescriptionDefault
NVIDIA_VISIBLE_DEVICESControls which GPUs will be accessible inside the workspace. By default, all GPUs from the host are accessible within the workspace. You can either use all, none, or specify a comma-separated list of device IDs (e.g., 0,1). You can find out the list of available device IDs by running nvidia-smi on the host machine.all
CUDA_VISIBLE_DEVICESControls which GPUs CUDA applications running inside the workspace will see. By default, all GPUs that the workspace has access to will be visible. To restrict applications, provide a comma-separated list of internal device IDs (e.g., 0,2) based on the available devices within the workspace (run nvidia-smi). In comparison to NVIDIA_VISIBLE_DEVICES, the workspace user will be still able to access other GPUs by overwriting this configuration from within the workspace.
TF_FORCE_GPU_ALLOW_GROWTHBy default, the majority of GPU memory will be allocated by the first execution of a TensorFlow graph. While this behavior can be desirable for production pipelines, it is less desirable for interactive use. Use true to enable dynamic GPU Memory allocation or false to instruct TensorFlow to allocate all memory at execution.true
-
- -### Multi-user setup - -The workspace is designed as a single-user development environment. For a multi-user setup, we recommend deploying [🧰 ML Hub](https://github.com/ml-tooling/ml-hub). ML Hub is based on JupyterHub with the task to spawn, manage, and proxy workspace instances for multiple users. - -
-Deployment (click to expand...) - -ML Hub makes it easy to set up a multi-user environment on a single server (via Docker) or a cluster (via Kubernetes) and supports a variety of usage scenarios & authentication providers. You can try out ML Hub via: - -```bash -docker run -p 8080:8080 -v /var/run/docker.sock:/var/run/docker.sock mltooling/ml-hub:latest -``` - -For more information and documentation about ML Hub, please take a look at the [Github Site](https://github.com/ml-tooling/ml-hub). - -
- ---- -
## Support - -The ML Workspace project is maintained by [Lukas Masuch](https://twitter.com/LukasMasuch) -and [Benjamin Räthlein](https://twitter.com/raethlein). Please understand that we won't be able -to provide individual support via email. We also believe that help is much more +This project seems to be no longer maintained by its original creators. It is now maintained here by DAGsHub. +Please understand that we won't be able to provide individual support via email. We also believe that help is much more valuable if it's shared publicly so that more people can benefit from it. | Type | Channel | | ------------------------ | ------------------------------------------------------ | -| 🚨 **Bug Reports** | | -| 🎁 **Feature Requests** | | +| 🚨 **Bug Reports** | | +| 🎁 **Feature Requests** | | | 👩‍💻 **Usage Questions** | | -| 🗯 **General Discussion** | | +| 🗯 **General Discussion** | | --- From 422691416e5502d237f3bfe49e9d22b7903a1966 Mon Sep 17 00:00:00 2001 From: Dean P Date: Wed, 2 Sep 2020 10:37:50 +0300 Subject: [PATCH 02/11] Add files via upload --- docs/images/ml-workspace-logo.png | Bin 30047 -> 49910 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/docs/images/ml-workspace-logo.png b/docs/images/ml-workspace-logo.png index a582f3a3e6b6baeab52507c123f417b8d2f04165..83d527779fe927651b320afa21953095b1d67757 100644 GIT binary patch literal 49910 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 literal 30047 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 G@c#j=?+up# From ef48de6b79ff17522cfa268120ed46aede20f6e4 Mon Sep 17 00:00:00 2001 From: Dean P Date: Wed, 2 Sep 2020 10:42:50 +0300 Subject: [PATCH 03/11] Update Dockerfile --- deployment/google-cloud-run/Dockerfile | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/deployment/google-cloud-run/Dockerfile b/deployment/google-cloud-run/Dockerfile index 28752606..b4057f0a 100644 --- a/deployment/google-cloud-run/Dockerfile +++ b/deployment/google-cloud-run/Dockerfile @@ -1,5 +1,5 @@ -FROM mltooling/ml-workspace-minimal:latest +FROM dagshub/ml-workspace-minimal:latest # Set port to 8080 -> main port for cloud run ENV WORKSPACE_PORT=8080 -EXPOSE 8080 \ No newline at end of file +EXPOSE 8080 From a15ba7b33b481a8747f17f76f9702c928c26a0fe Mon Sep 17 00:00:00 2001 From: Dean P Date: Wed, 2 Sep 2020 10:43:10 +0300 Subject: [PATCH 04/11] Update docker-compose.yml --- deployment/play-with-docker/docker-compose.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/deployment/play-with-docker/docker-compose.yml b/deployment/play-with-docker/docker-compose.yml index 664c2112..e5439501 100644 --- a/deployment/play-with-docker/docker-compose.yml +++ b/deployment/play-with-docker/docker-compose.yml @@ -2,7 +2,7 @@ version: '3.2' services: ml-workspace: - image: mltooling/ml-workspace-minimal + image: dagshub/ml-workspace-minimal restart: always volumes: - ml-workspace:/workspace @@ -10,4 +10,4 @@ services: - 8080:8080 volumes: - ml-workspace: \ No newline at end of file + ml-workspace: From 5b48b8eb90a70b15691cced55733c03e0d000fd3 Mon Sep 17 00:00:00 2001 From: Dean P Date: Wed, 2 Sep 2020 11:05:08 +0300 Subject: [PATCH 05/11] Update Dockerfile --- gpu-flavor/Dockerfile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gpu-flavor/Dockerfile b/gpu-flavor/Dockerfile index 8e0f085c..51976b0c 100644 --- a/gpu-flavor/Dockerfile +++ b/gpu-flavor/Dockerfile @@ -1,6 +1,6 @@ ARG ARG_WORKSPACE_VERSION="latest" # Build from full flavor of workspace with same version -FROM mltooling/ml-workspace:$ARG_WORKSPACE_VERSION +FROM dagshub/ml-workspace:$ARG_WORKSPACE_VERSION ARG ARG_WORKSPACE_FLAVOR="gpu" ENV WORKSPACE_FLAVOR=$ARG_WORKSPACE_FLAVOR From 200e5e43efd507e3a56dee541cd7b8f6f66dec21 Mon Sep 17 00:00:00 2001 From: Dean P Date: Wed, 2 Sep 2020 11:05:39 +0300 Subject: [PATCH 06/11] Update Dockerfile --- r-flavor/Dockerfile | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/r-flavor/Dockerfile b/r-flavor/Dockerfile index 937146c2..3ddecde3 100644 --- a/r-flavor/Dockerfile +++ b/r-flavor/Dockerfile @@ -1,6 +1,6 @@ ARG ARG_WORKSPACE_VERSION="latest" # Build from full flavor of workspace with same version -FROM mltooling/ml-workspace:$ARG_WORKSPACE_VERSION +FROM dagshub/ml-workspace:$ARG_WORKSPACE_VERSION ARG ARG_WORKSPACE_FLAVOR="r" ENV WORKSPACE_FLAVOR=$ARG_WORKSPACE_FLAVOR @@ -36,7 +36,7 @@ ARG ARG_VCS_REF="unknown" LABEL \ "workspace.version"=$WORKSPACE_VERSION \ "workspace.flavor"=$WORKSPACE_FLAVOR \ - "workspace.baseimage"=mltooling/ml-workspace:$WORKSPACE_VERSION \ + "workspace.baseimage"=dagshub/ml-workspace:$WORKSPACE_VERSION \ "org.opencontainers.image.version"=$WORKSPACE_VERSION \ "org.opencontainers.image.revision"=$ARG_VCS_REF \ "org.opencontainers.image.created"=$ARG_BUILD_DATE \ From f155a38130579fa0833fb12f8059d51bfbbf473e Mon Sep 17 00:00:00 2001 From: Dean P Date: Wed, 2 Sep 2020 11:06:22 +0300 Subject: [PATCH 07/11] Update Dockerfile --- spark-flavor/Dockerfile | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/spark-flavor/Dockerfile b/spark-flavor/Dockerfile index 88356085..6070995a 100644 --- a/spark-flavor/Dockerfile +++ b/spark-flavor/Dockerfile @@ -1,6 +1,6 @@ ARG ARG_WORKSPACE_VERSION="latest" # Build from full flavor of workspace with same version -FROM mltooling/ml-workspace-r:$ARG_WORKSPACE_VERSION +FROM dagshub/ml-workspace-r:$ARG_WORKSPACE_VERSION ARG ARG_WORKSPACE_FLAVOR="spark" ENV WORKSPACE_FLAVOR=$ARG_WORKSPACE_FLAVOR @@ -152,7 +152,7 @@ ARG ARG_VCS_REF="unknown" LABEL \ "workspace.version"=$WORKSPACE_VERSION \ "workspace.flavor"=$WORKSPACE_FLAVOR \ - "workspace.baseimage"=mltooling/ml-workspace:$WORKSPACE_VERSION \ + "workspace.baseimage"=dagshub/ml-workspace:$WORKSPACE_VERSION \ "org.opencontainers.image.version"=$WORKSPACE_VERSION \ "org.opencontainers.image.revision"=$ARG_VCS_REF \ "org.opencontainers.image.created"=$ARG_BUILD_DATE \ From daf1b27b484350251ecaa192713c6fe6924a6012 Mon Sep 17 00:00:00 2001 From: Dean P Date: Wed, 2 Sep 2020 11:11:53 +0300 Subject: [PATCH 08/11] Update README.md --- spark-flavor/README.md | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/spark-flavor/README.md b/spark-flavor/README.md index eeb460f2..6e4ec8da 100644 --- a/spark-flavor/README.md +++ b/spark-flavor/README.md @@ -1,6 +1,6 @@

- - + +

@@ -9,16 +9,16 @@

- - - - + + + + - +

-Please visit our [Github repository](https://github.com/ml-tooling/ml-workspace#spark-flavor) for documentation and deployment information. +Please visit our [Github repository](https://github.com/dagshub/ml-workspace#spark-flavor) for documentation and deployment information. --- -Licensed **Apache 2.0**. Created and maintained with ❤️ by developers from SAP in Berlin. \ No newline at end of file +Licensed **Apache 2.0**. Created and maintained with ❤️ by developers from SAP in Berlin. From 7db52b02060f17d4ed3d853a31b8d7bdeac763ac Mon Sep 17 00:00:00 2001 From: Dean P Date: Wed, 2 Sep 2020 11:12:58 +0300 Subject: [PATCH 09/11] Update README.md --- r-flavor/README.md | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/r-flavor/README.md b/r-flavor/README.md index c3e533c6..dd27919e 100644 --- a/r-flavor/README.md +++ b/r-flavor/README.md @@ -1,6 +1,6 @@

- - + +

@@ -9,16 +9,16 @@

- - - + + + - +

-Please visit our [Github repository](https://github.com/ml-tooling/ml-workspace#r-flavor) for documentation and deployment information. +Please visit our [Github repository](https://github.com/dagshub/ml-workspace#r-flavor) for documentation and deployment information. --- -Licensed **Apache 2.0**. Created and maintained with ❤️ by developers from SAP in Berlin. \ No newline at end of file +Licensed **Apache 2.0**. Created and maintained with ❤️ by developers from SAP in Berlin. From ee11b76004f7ac3a5f40ae9f859091fc2a45ce4c Mon Sep 17 00:00:00 2001 From: Dean P Date: Wed, 2 Sep 2020 11:13:47 +0300 Subject: [PATCH 10/11] Update README.md --- gpu-flavor/README.md | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/gpu-flavor/README.md b/gpu-flavor/README.md index ceb20cc5..56d887d5 100644 --- a/gpu-flavor/README.md +++ b/gpu-flavor/README.md @@ -1,6 +1,6 @@

- - + +

@@ -9,16 +9,16 @@

- - - + + + - +

Please visit our [Github repository](https://github.com/ml-tooling/ml-workspace#gpu-flavor) for documentation and deployment information. --- -Licensed **Apache 2.0**. Created and maintained with ❤️ by developers from SAP in Berlin. \ No newline at end of file +Licensed **Apache 2.0**. Created and maintained with ❤️ by developers from SAP in Berlin. From 6c977a496df5f99e2aac96bd5933f40c53cae909 Mon Sep 17 00:00:00 2001 From: Dean P Date: Wed, 2 Sep 2020 11:25:59 +0300 Subject: [PATCH 11/11] Update README.md --- README.md | 195 ++++++++++++++++++++++++++++++++++++++++-------------- 1 file changed, 144 insertions(+), 51 deletions(-) diff --git a/README.md b/README.md index 325a751d..9d564de5 100644 --- a/README.md +++ b/README.md @@ -1,7 +1,7 @@ # This Repository is a fork that is being maintained. Feel free to use it, create PR and requests if you have any.

- +

@@ -11,7 +11,7 @@

- + @@ -59,7 +59,7 @@ The workspace requires **Docker** to be installed on your machine ([📖 Install Deploying a single workspace instance is as simple as: ```bash -docker run -p 8080:8080 mltooling/ml-workspace:latest +docker run -p 8080:8080 dagshub/ml-workspace:latest ``` Voilà, that was easy! Now, Docker will pull the latest workspace image to your machine. This may take a few minutes, depending on your internet speed. Once the workspace is started, you can access it via http://localhost:8080. @@ -75,7 +75,7 @@ docker run -d \ --env AUTHENTICATE_VIA_JUPYTER="mytoken" \ --shm-size 512m \ --restart always \ - mltooling/ml-workspace:latest + dagshub/ml-workspace:latest ``` This command runs the container in background (`-d`), mounts your current working directory into the `/workspace` folder (`-v`), secures the workspace via a provided token (`--env AUTHENTICATE_VIA_JUPYTER`), provides 512MB of shared memory (`--shm-size`) to prevent unexpected crashes (see [known issues section](#known-issues)), and keeps the container running even on system restarts (`--restart always`). You can find additional options for docker run [here](https://docs.docker.com/engine/reference/commandline/run/) and workspace configuration options in [the section below](#Configuration). @@ -182,7 +182,7 @@ We strongly recommend enabling authentication via one of the following two optio Activate the token-based authentication based on the authentication implementation of Jupyter via the `AUTHENTICATE_VIA_JUPYTER` variable: ```bash -docker run -p 8080:8080 --env AUTHENTICATE_VIA_JUPYTER="mytoken" mltooling/ml-workspace:latest +docker run -p 8080:8080 --env AUTHENTICATE_VIA_JUPYTER="mytoken" dagshub/ml-workspace:latest ``` You can also use `` to let Jupyter generate a random token that is printed out on the container logs. A value of `true` will not set any token but activate that every request to any tool in the workspace will be checked with the Jupyter instance if the user is authenticated. This is used for tools like JupyterHub, which configures its own way of authentication. @@ -192,7 +192,7 @@ You can also use `` to let Jupyter generate a random token that is pr Activate the basic authentication via the `WORKSPACE_AUTH_USER` and `WORKSPACE_AUTH_PASSWORD` variable: ```bash -docker run -p 8080:8080 --env WORKSPACE_AUTH_USER="user" --env WORKSPACE_AUTH_PASSWORD="pwd" mltooling/ml-workspace:latest +docker run -p 8080:8080 --env WORKSPACE_AUTH_USER="user" --env WORKSPACE_AUTH_PASSWORD="pwd" dagshub/ml-workspace:latest ``` The basic authentication is configured via the nginx proxy and might be more performant compared to the other option since with `AUTHENTICATE_VIA_JUPYTER` every request to any tool in the workspace will check via the Jupyter instance if the user (based on the request cookies) is authenticated. @@ -213,7 +213,7 @@ docker run \ -p 8080:8080 \ --env WORKSPACE_SSL_ENABLED="true" \ -v /path/with/certificate/files:/resources/ssl:ro \ - mltooling/ml-workspace:latest + dagshub/ml-workspace:latest ``` If you want to host the workspace on a public domain, we recommend to use [Let's encrypt](https://letsencrypt.org/getting-started/) to get a trusted certificate for your domain. To use the generated certificate (e.g., via [certbot](https://certbot.eff.org/) tool) for the workspace, the `privkey.pem` corresponds to the `cert.key` file and the `fullchain.pem` to the `cert.crt` file. @@ -234,7 +234,7 @@ By default, the workspace container has no resource constraints and can use as m For example, the following command restricts the workspace to only use a maximum of 8 CPUs, 16 GB of memory, and 1 GB of shared memory (see [Known Issues](#known-issues)): ```bash -docker run -p 8080:8080 --cpus=8 --memory=16g --shm-size=1G mltooling/ml-workspace:latest +docker run -p 8080:8080 --cpus=8 --memory=16g --shm-size=1G dagshub/ml-workspace:latest ``` > 📖 _For more options and documentation on resource constraints, please refer to the [official docker guide](https://docs.docker.com/config/containers/resource_constraints/)._ @@ -247,7 +247,7 @@ If a proxy is required, you can pass the proxy configuration via the `HTTP_PROXY ### Workspace Flavors -In addition to the main workspace image (`mltooling/ml-workspace`), we provide other image flavors that extend the features or minimize the image size to support a variety of use cases. +In addition to the main workspace image (`dagshub/ml-workspace`), we provide other image flavors that extend the features or minimize the image size to support a variety of use cases. #### Minimal Flavor @@ -261,13 +261,106 @@ In addition to the main workspace image (`mltooling/ml-workspace`), we provide o

Details (click to expand...) -The minimal flavor (`mltooling/ml-workspace-minimal`) is our smallest image that contains most of the tools and features described in the [features section](#features) without most of the python libraries that are pre-installed in our main image. Any Python library or excluded tool can be installed manually during runtime by the user. +The minimal flavor (`dagshub/ml-workspace-minimal`) is our smallest image that contains most of the tools and features described in the [features section](#features) without most of the python libraries that are pre-installed in our main image. Any Python library or excluded tool can be installed manually during runtime by the user. ```bash -docker run -p 8080:8080 mltooling/ml-workspace-minimal:latest +docker run -p 8080:8080 dagshub/ml-workspace-minimal:latest ```
+#### R Flavor + +

+ + + + +

+ +
+Details (click to expand...) + +The R flavor (`dagshub/ml-workspace-r`) is based on our default workspace image and extends it with the R-interpreter, R-Jupyter kernel, RStudio server (access via `Open Tool -> RStudio`), and a variety of popular packages from the R ecosystem. + +```bash +docker run -p 8080:8080 dagshub/ml-workspace-r:latest +``` +
+ +#### Spark Flavor + +

+ + + + +

+ +
+Details (click to expand...) + +The Spark flavor (`dagshub/ml-workspace-spark`) is based on our R-flavor workspace image and extends it with the Spark-interpreter, Spark-Jupyter kernel (Apache Toree), Zeppelin Notebook (access via `Open Tool -> Zeppelin`), and a few additional python libraries & Jupyter extensions. + +```bash +docker run -p 8080:8080 dagshub/ml-workspace-spark:latest +``` + +
+ +#### GPU Flavor + +

+ + + + +

+ +
+Details (click to expand...) + +> _Currently, the GPU-flavor only supports CUDA 10.1. Support for other CUDA versions might be added in the future._ + +The GPU flavor (`dagshub/ml-workspace-gpu`) is based on our default workspace image and extends it with CUDA 10.1 and GPU-ready versions of various machine learning libraries (e.g., tensorflow, pytorch, cntk, jax). This GPU image has the following additional requirements for the system: + +- Nvidia Drivers for the GPUs. Drivers need to be CUDA 10.1 compatible, version `>= 418.39` ([📖 Instructions](https://github.com/NVIDIA/nvidia-docker/wiki/Frequently-Asked-Questions#how-do-i-install-the-nvidia-driver)). +- (Docker >= 19.03) Nvidia Container Toolkit ([📖 Instructions](https://github.com/NVIDIA/nvidia-docker/wiki/Installation-(Native-GPU-Support))). + +```bash +docker run -p 8080:8080 --gpus all dagshub/ml-workspace-gpu:latest +``` + +- (Docker < 19.03) Nvidia Docker 2.0 ([📖 Instructions](https://github.com/NVIDIA/nvidia-docker/wiki/Installation-(version-2.0))). + +```bash +docker run -p 8080:8080 --runtime nvidia --env NVIDIA_VISIBLE_DEVICES="all" dagshub/ml-workspace-gpu:latest +``` + +The GPU flavor also comes with a few additional configuration options, as explained below: + + + + + + + + + + + + + + + + + + + + + + +
VariableDescriptionDefault
NVIDIA_VISIBLE_DEVICESControls which GPUs will be accessible inside the workspace. By default, all GPUs from the host are accessible within the workspace. You can either use all, none, or specify a comma-separated list of device IDs (e.g., 0,1). You can find out the list of available device IDs by running nvidia-smi on the host machine.all
CUDA_VISIBLE_DEVICESControls which GPUs CUDA applications running inside the workspace will see. By default, all GPUs that the workspace has access to will be visible. To restrict applications, provide a comma-separated list of internal device IDs (e.g., 0,2) based on the available devices within the workspace (run nvidia-smi). In comparison to NVIDIA_VISIBLE_DEVICES, the workspace user will be still able to access other GPUs by overwriting this configuration from within the workspace.
TF_FORCE_GPU_ALLOW_GROWTHBy default, the majority of GPU memory will be allocated by the first execution of a TensorFlow graph. While this behavior can be desirable for production pipelines, it is less desirable for interactive use. Use true to enable dynamic GPU Memory allocation or false to instruct TensorFlow to allocate all memory at execution.true
+

## Support @@ -306,7 +399,7 @@ valuable if it's shared publicly so that more people can benefit from it. The workspace is equipped with a selection of best-in-class open-source development tools to help with the machine learning workflow. Many of these tools can be started from the `Open Tool` menu from Jupyter (the main application of the workspace): - + > _Within your workspace you have **full root & sudo privileges** to install any library or tool you need via terminal (e.g., `pip`, `apt-get`, `conda`, or `npm`). You can find more ways to extend the workspace within the [Extensibility](#extensibility) section_ @@ -314,13 +407,13 @@ The workspace is equipped with a selection of best-in-class open-source developm [Jupyter Notebook](https://jupyter.org/) is a web-based interactive environment for writing and running code. The main building blocks of Jupyter are the file-browser, the notebook editor, and kernels. The file-browser provides an interactive file manager for all notebooks, files, and folders in the `/workspace` directory. - + A new notebook can be created by clicking on the `New` drop-down button at the top of the list and selecting the desired language kernel. > _You can spawn interactive **terminal** instances as well by selecting `New -> Terminal` in the file-browser._ - + The notebook editor enables users to author documents that include live code, markdown text, shell commands, LaTeX equations, interactive widgets, plots, and images. These notebook documents provide a complete and self-contained record of a computation that can be converted to various formats and shared with others. @@ -334,13 +427,13 @@ The Notebook allows code to be run in a range of different programming languages This workspace provides an HTTP-based VNC access to the workspace via [noVNC](https://github.com/novnc/noVNC). Thereby, you can access and work within the workspace with a fully-featured desktop GUI. To access this desktop GUI, go to `Open Tool`, select `VNC`, and click the `Connect` button. In the case you are asked for a password, use `vncpassword`. - + Once you are connected, you will see a desktop GUI that allows you to install and use full-fledged web-browsers or any other tool that is available for Ubuntu. Within the `Tools` folder on the desktop, you will find a collection of install scripts that makes it straightforward to install some of the most commonly used development tools, such as Atom, PyCharm, R-Runtime, R-Studio, or Postman (just double-click on the script). **Clipboard:** If you want to share the clipboard between your machine and the workspace, you can use the copy-paste functionality as described below: - + > 💡 _**Long-running tasks:** Use the desktop GUI for long-running Jupyter executions. By running notebooks from the browser of your workspace desktop GUI, all output will be synchronized to the notebook even if you have disconnected your browser from the notebook._ @@ -348,17 +441,17 @@ Once you are connected, you will see a desktop GUI that allows you to install an [Visual Studio Code](https://github.com/microsoft/vscode) (`Open Tool -> VS Code`) is an open-source lightweight but powerful code editor with built-in support for a variety of languages and a rich ecosystem of extensions. It combines the simplicity of a source code editor with powerful developer tooling, like IntelliSense code completion and debugging. The workspace integrates VS Code as a web-based application accessible through the browser-based on the awesome [code-server](https://github.com/cdr/code-server) project. It allows you to customize every feature to your liking and install any number of third-party extensions. -

+

The workspace also provides a VS Code integration into Jupyter allowing you to open a VS Code instance for any selected folder, as shown below: -

+

### JupyterLab [JupyterLab](https://github.com/jupyterlab/jupyterlab) (`Open Tool -> JupyterLab`) is the next-generation user interface for Project Jupyter. It offers all the familiar building blocks of the classic Jupyter Notebook (notebook, terminal, text editor, file browser, rich outputs, etc.) in a flexible and powerful user interface. This JupyterLab instance comes pre-installed with a few helpful extensions such as a the [jupyterlab-toc](https://github.com/jupyterlab/jupyterlab-toc), [jupyterlab-git](https://github.com/jupyterlab/jupyterlab-git), and [juptyterlab-tensorboard](https://github.com/chaoleili/jupyterlab_tensorboard). - + ### Git Integration @@ -368,17 +461,17 @@ Version control is a crucial aspect of productive collaboration. To make this pr For cloning repositories via `https`, we recommend to navigate to the desired root folder and to click on the `git` button as shown below: - + This might ask for some required settings and, subsequently, opens [ungit](https://github.com/FredrikNoren/ungit), a web-based Git client with a clean and intuitive UI that makes it convenient to sync your code artifacts. Within ungit, you can clone any repository. If authentication is required, you will get asked for your credentials. - + #### Push, Pull, Merge, and Other Git Actions To commit and push a single notebook to a remote Git repository, we recommend to use the Git plugin integrated into Jupyter, as shown below: - + For more advanced Git operations, we recommend to use [ungit](https://github.com/FredrikNoren/ungit). With ungit, you can do most of the common git actions such as push, pull, merge, branch, tag, checkout, and many more. @@ -386,11 +479,11 @@ For more advanced Git operations, we recommend to use [ungit](https://github.com Jupyter notebooks are great, but they often are huge files, with a very specific JSON file format. To enable seamless diffing and merging via Git this workspace is pre-installed with [nbdime](https://github.com/jupyter/nbdime). Nbdime understands the structure of notebook documents and, therefore, automatically makes intelligent decisions when diffing and merging notebooks. In the case you have merge conflicts, nbdime will make sure that the notebook is still readable by Jupyter, as shown below: - + Furthermore, the workspace comes pre-installed with [jupytext](https://github.com/mwouts/jupytext), a Jupyter plugin that reads and writes notebooks as plain text files. This allows you to open, edit, and run scripts or markdown files (e.g., `.py`, `.md`) as notebooks within Jupyter. In the following screenshot, we have opened a markdown file via Jupyter: - + In combination with Git, jupytext enables a clear diff history and easy merging of version conflicts. With both of those tools, collaborating on Jupyter notebooks with Git becomes straightforward. @@ -398,11 +491,11 @@ In combination with Git, jupytext enables a clear diff history and easy merging The workspace has a feature to share any file or folder with anyone via a token-protected link. To share data via a link, select any file or folder from the Jupyter directory tree and click on the share button as shown in the following screenshot: - + This will generate a unique link protected via a token that gives anyone with the link access to view and download the selected data via the [Filebrowser](https://github.com/filebrowser/filebrowser) UI: - + To deactivate or manage (e.g., provide edit permissions) shared links, open the Filebrowser via `Open Tool -> Filebrowser` and select `Settings->User Management`. @@ -410,7 +503,7 @@ To deactivate or manage (e.g., provide edit permissions) shared links, open the It is possible to securely access any workspace internal port by selecting `Open Tool -> Access Port`. With this feature, you are able to access a REST API or web application running inside the workspace directly with your browser. The feature enables developers to build, run, test, and debug REST APIs or web applications directly from the workspace. - + If you want to use an HTTP client or share access to a given port, you can select the `Get shareable link` option. This generates a token-secured link that anyone with access to the link can use to access the specified port. @@ -431,7 +524,7 @@ If you want to use an HTTP client or share access to a given port, you can selec SSH provides a powerful set of features that enables you to be more productive with your development tasks. You can easily set up a secure and passwordless SSH connection to a workspace by selecting `Open Tool -> SSH`. This will generate a secure setup command that can be run on any Linux or Mac machine to configure a passwordless & secure SSH connection to the workspace. Alternatively, you can also download the setup script and run it (instead of using the command). - + > _The setup script only runs on Mac and Linux. Windows is currently not supported._ @@ -465,7 +558,7 @@ Port tunneling is quite useful when you have started any server-based tool withi - `3389`: RDP server. - `22`: SSH server. -You can find port information on all the tools in the [supervisor configuration](https://github.com/ml-tooling/ml-workspace/blob/master/resources/config/supervisord.conf). +You can find port information on all the tools in the [supervisor configuration](https://github.com/dagshub/ml-workspace/blob/master/resources/config/supervisord.conf). > 📖 _For more information about port tunneling/forwarding, we recommend [this guide](https://www.everythingcli.org/ssh-tunnelling-for-fun-and-profit-local-vs-remote/)._ @@ -550,7 +643,7 @@ remote_ikernel manage --add \ You can use the remote_ikernel command line functionality to list (`remote_ikernel manage --show`) or delete (`remote_ikernel manage --delete `) remote kernel connections. - + @@ -563,7 +656,7 @@ The Visual Studio Code [Remote - SSH](https://marketplace.visualstudio.com/item 2. Run the SSH setup script of a selected workspace as explained in the [SSH Access](#ssh-access) section. 3. Open the Remote-SSH panel in your local VS Code. All configured SSH connections should be automatically discovered. Just select any configured workspace connection you like to connect to as shown below: - + > 📖 _You can find additional features and information about the Remote SSH extension in [this guide](https://code.visualstudio.com/docs/remote/ssh)._ @@ -573,11 +666,11 @@ The Visual Studio Code [Remote - SSH](https://marketplace.visualstudio.com/item [Tensorboard](https://www.tensorflow.org/tensorboard) provides a suite of visualization tools to make it easier to understand, debug, and optimize your experiment runs. It includes logging features for scalar, histogram, model structure, embeddings, and text & image visualization. The workspace comes pre-installed with [jupyter_tensorboard extension](https://github.com/lspvic/jupyter_tensorboard) that integrates Tensorboard into the Jupyter interface with functionalities to start, manage, and stop instances. You can open a new instance for a valid logs directory, as shown below: - + If you have opened a Tensorboard instance in a valid log directory, you will see the visualizations of your logged data: - + > _Tensorboard can be used in combination with many other ML frameworks besides Tensorflow. By using the [tensorboardX](https://github.com/lanpa/tensorboardX) library you can log basically from any python based library. Also, PyTorch has a direct Tensorboard integration as described [here](https://pytorch.org/docs/stable/tensorboard.html)._ @@ -594,11 +687,11 @@ The workspace provides two pre-installed web-based tools to help developers duri [Netdata](https://github.com/netdata/netdata) (`Open Tool -> Netdata`) is a real-time hardware and performance monitoring dashboard that visualize the processes and services on your Linux systems. It monitors metrics about CPU, GPU, memory, disks, networks, processes, and more. - + [Glances](https://github.com/nicolargo/glances) (`Open Tool -> Glances`) is a web-based hardware monitoring dashboard as well and can be used as an alternative to Netdata. - + > _Netdata and Glances will show you the hardware statistics for the entire machine on which the workspace container is running._ @@ -615,10 +708,10 @@ To run Python code as a job, you need to provide a path or URL to a code directo #### Run code from version control system -You can execute code directly from Git, Mercurial, Subversion, or Bazaar by using the pip-vcs format as described in [this guide](https://pip.pypa.io/en/stable/reference/pip_install/#vcs-support). For example, to execute code from a [subdirectory](https://github.com/ml-tooling/ml-workspace/tree/master/resources/tests/ml-job) of a git repository, just run: +You can execute code directly from Git, Mercurial, Subversion, or Bazaar by using the pip-vcs format as described in [this guide](https://pip.pypa.io/en/stable/reference/pip_install/#vcs-support). For example, to execute code from a [subdirectory](https://github.com/dagshub/ml-workspace/tree/master/resources/tests/ml-job) of a git repository, just run: ```bash -docker run --env EXECUTE_CODE="git+https://github.com/ml-tooling/ml-workspace.git#subdirectory=resources/tests/ml-job" mltooling/ml-workspace:latest +docker run --env EXECUTE_CODE="git+https://github.com/dagshub/ml-workspace.git#subdirectory=resources/tests/ml-job" dagshub/ml-workspace:latest ``` > 📖 _For additional information on how to specify branches, commits, or tags please refer to [this guide](https://pip.pypa.io/en/stable/reference/pip_install/#vcs-support)._ @@ -628,7 +721,7 @@ docker run --env EXECUTE_CODE="git+https://github.com/ml-tooling/ml-workspace.gi In the following example, we mount and execute the current working directory (expected to contain our code) into the `/workspace/ml-job/` directory of the workspace: ```bash -docker run -v "${PWD}:/workspace/ml-job/" --env EXECUTE_CODE="/workspace/ml-job/" mltooling/ml-workspace:latest +docker run -v "${PWD}:/workspace/ml-job/" --env EXECUTE_CODE="/workspace/ml-job/" dagshub/ml-workspace:latest ``` #### Install Dependencies @@ -654,7 +747,7 @@ python /resources/scripts/execute_code.py /path/to/your/job It is also possible to embed your code directly into a custom job image, as shown below: ```dockerfile -FROM mltooling/ml-workspace:latest +FROM dagshub/ml-workspace:latest # Add job code to image COPY ml-job /workspace/ml-job @@ -674,10 +767,10 @@ CMD ["python", "/resources/docker-entrypoint.py", "--code-only"] The workspace is pre-installed with many popular interpreters, data science libraries, and ubuntu packages: - **Interpreter:** Python 3.7 (Miniconda 3), Java 11 (OpenJDK), NodeJS 13, Scala, Perl 5 -- **Python libraries:** Tensorflow, Keras, Pytorch, Sklearn, XGBoost, MXNet, Theano, and [many more](https://github.com/ml-tooling/ml-workspace/tree/master/resources/libraries) +- **Python libraries:** Tensorflow, Keras, Pytorch, Sklearn, XGBoost, MXNet, Theano, and [many more](https://github.com/dagshub/ml-workspace/tree/master/resources/libraries) - **Package Manager:** `conda`, `pip`, `npm`, `apt-get`, `yarn`, `sdk`, `gdebi`, `mvn` ... -The full list of installed tools can be found within the [Dockerfile](https://github.com/ml-tooling/ml-workspace/blob/master/Dockerfile). +The full list of installed tools can be found within the [Dockerfile](https://github.com/dagshub/ml-workspace/blob/master/Dockerfile). > _For every minor version release, we run vulnerability, virus, and security checks within the workspace using [vuls](https://vuls.io/), [safety](https://pyup.io/safety/), and [clamav](https://www.clamav.net/) to make sure that the workspace environment is as secure as possible._ @@ -690,7 +783,7 @@ The workspace provides a high degree of extensibility. Within the workspace, you - **JupyterLab:** `File -> New -> Terminal` - **VS Code:** `Terminal -> New Terminal` -Additionally, pre-installed tools such as Jupyter, JupyterLab, and Visual Studio Code each provide their own rich ecosystem of extensions. The workspace also contains a [collection of installer scripts](https://github.com/ml-tooling/ml-workspace/tree/master/resources/tools) for many commonly used development tools or libraries (e.g., `PyCharm`, `Zeppelin`, `RStudio`, `Starspace`). You can find and execute all tool installers via `Open Tool -> Install Tool`. Those scripts can be also executed from the Desktop VNC (double-click on the script within the `Tools` folder on the Desktop VNC). +Additionally, pre-installed tools such as Jupyter, JupyterLab, and Visual Studio Code each provide their own rich ecosystem of extensions. The workspace also contains a [collection of installer scripts](https://github.com/dagshub/ml-workspace/tree/master/resources/tools) for many commonly used development tools or libraries (e.g., `PyCharm`, `Zeppelin`, `RStudio`, `Starspace`). You can find and execute all tool installers via `Open Tool -> Install Tool`. Those scripts can be also executed from the Desktop VNC (double-click on the script within the `Tools` folder on the Desktop VNC).
Example (click to expand...) @@ -720,7 +813,7 @@ The workspace can be extended in many ways at runtime, as explained [here](#exte ```dockerfile # Extend from any of the workspace versions/flavors # Using latest as version is not recommended, please specify a specific version -FROM mltooling/ml-workspace:latest +FROM dagshub/ml-workspace:latest # Run you customizations, e.g. RUN \ @@ -733,7 +826,7 @@ RUN \ Finally, use [docker build](https://docs.docker.com/engine/reference/commandline/build/) to build your customized Docker image. -> 📖 _For a more comprehensive Dockerfile example, take a look at the [Dockerfile of the R-flavor](https://github.com/ml-tooling/ml-workspace/blob/master/r-flavor/Dockerfile)._ +> 📖 _For a more comprehensive Dockerfile example, take a look at the [Dockerfile of the R-flavor](https://github.com/dagshub/ml-workspace/blob/master/r-flavor/Dockerfile)._
@@ -748,10 +841,10 @@ All data within the workspace that is not persisted to a mounted volume will be Update Example (click to expand...) -If the workspace is deployed via Docker (Kubernetes will have a different update process), you need to remove the existing container (via `docker rm`) and start a new one (via `docker run`) with the newer workspace image. Make sure to use the same configuration, volume, name, and port. For example, a workspace (image version `0.8.3`) was started with this command: `docker run -d -p 8080:8080 --name "ml-workspace" -v "/path/on/host:/workspace" --env AUTHENTICATE_VIA_JUPYTER="mytoken" --restart always mltooling/ml-workspace:0.8.3`) and needs to be updated to version `0.8.4`, you need to: +If the workspace is deployed via Docker (Kubernetes will have a different update process), you need to remove the existing container (via `docker rm`) and start a new one (via `docker run`) with the newer workspace image. Make sure to use the same configuration, volume, name, and port. For example, a workspace (image version `0.8.3`) was started with this command: `docker run -d -p 8080:8080 --name "ml-workspace" -v "/path/on/host:/workspace" --env AUTHENTICATE_VIA_JUPYTER="mytoken" --restart always dagshub/ml-workspace:0.8.3`) and needs to be updated to version `0.8.4`, you need to: 1. Stop and remove the running workspace container: `docker stop "ml-workspace" && docker rm "ml-workspace"` -2. Start a new workspace container with the newer image and same configuration: `docker run -d -p 8080:8080 --name "ml-workspace" -v "/path/on/host:/workspace" --env AUTHENTICATE_VIA_JUPYTER="mytoken" --restart always mltooling/ml-workspace:latest` +2. Start a new workspace container with the newer image and same configuration: `docker run -d -p 8080:8080 --name "ml-workspace" -v "/path/on/host:/workspace" --env AUTHENTICATE_VIA_JUPYTER="mytoken" --restart always dagshub/ml-workspace:latest` @@ -809,7 +902,7 @@ Using root-user (or users with sudo permission) within containers is generally n Certain desktop tools (e.g., recent versions of [Firefox](https://github.com/jlesage/docker-firefox#increasing-shared-memory-size)) or libraries (e.g., Pytorch - see Issues: [1](https://github.com/pytorch/pytorch/issues/2244), [2](https://github.com/pytorch/pytorch/issues/1355)) might crash if the shared memory size (`/dev/shm`) is too small. The default shared memory size of Docker is 64MB, which might not be enough for a few tools. You can provide a higher shared memory size via the `shm-size` docker run option: ```bash -docker run --shm-size=2G mltooling/ml-workspace:latest +docker run --shm-size=2G dagshub/ml-workspace:latest ``` @@ -819,7 +912,7 @@ docker run --shm-size=2G mltooling/ml-workspace:latest
## Contributors - +### Original ML-workspace Contributors [![](https://sourcerer.io/fame/LukasMasuch/ml-tooling/ml-workspace/images/0)](https://sourcerer.io/fame/LukasMasuch/ml-tooling/ml-workspace/links/0)[![](https://sourcerer.io/fame/LukasMasuch/ml-tooling/ml-workspace/images/1)](https://sourcerer.io/fame/LukasMasuch/ml-tooling/ml-workspace/links/1)[![](https://sourcerer.io/fame/LukasMasuch/ml-tooling/ml-workspace/images/2)](https://sourcerer.io/fame/LukasMasuch/ml-tooling/ml-workspace/links/2)[![](https://sourcerer.io/fame/LukasMasuch/ml-tooling/ml-workspace/images/3)](https://sourcerer.io/fame/LukasMasuch/ml-tooling/ml-workspace/links/3)[![](https://sourcerer.io/fame/LukasMasuch/ml-tooling/ml-workspace/images/4)](https://sourcerer.io/fame/LukasMasuch/ml-tooling/ml-workspace/links/4)[![](https://sourcerer.io/fame/LukasMasuch/ml-tooling/ml-workspace/images/5)](https://sourcerer.io/fame/LukasMasuch/ml-tooling/ml-workspace/links/5)[![](https://sourcerer.io/fame/LukasMasuch/ml-tooling/ml-workspace/images/6)](https://sourcerer.io/fame/LukasMasuch/ml-tooling/ml-workspace/links/6)[![](https://sourcerer.io/fame/LukasMasuch/ml-tooling/ml-workspace/images/7)](https://sourcerer.io/fame/LukasMasuch/ml-tooling/ml-workspace/links/7) --- @@ -828,9 +921,9 @@ docker run --shm-size=2G mltooling/ml-workspace:latest ## Contribution -- Pull requests are encouraged and always welcome. Read [`CONTRIBUTING.md`](https://github.com/ml-tooling/ml-workspace/tree/master/CONTRIBUTING.md) and check out [help-wanted](https://github.com/ml-tooling/ml-workspace/issues?utf8=%E2%9C%93&q=is%3Aopen+is%3Aissue+label%3A"help+wanted"+sort%3Areactions-%2B1-desc+) issues. -- Submit Github issues for any [feature enhancements](https://github.com/ml-tooling/ml-workspace/issues/new?assignees=&labels=feature-request&template=02_feature-request.md&title=), [bugs](https://github.com/ml-tooling/ml-workspace/issues/new?assignees=&labels=bug&template=01_bug-report.md&title=), or [documentation](https://github.com/ml-tooling/ml-workspace/issues/new?assignees=&labels=enhancement%2C+docs&template=03_documentation.md&title=) problems. -- By participating in this project, you agree to abide by its [Code of Conduct](https://github.com/ml-tooling/ml-workspace/tree/master/CODE_OF_CONDUCT.md). +- Pull requests are encouraged and always welcome. Read [`CONTRIBUTING.md`](https://github.com/dagshub/ml-workspace/tree/master/CONTRIBUTING.md) and check out [help-wanted](https://github.com/dagshub/ml-workspace/issues?utf8=%E2%9C%93&q=is%3Aopen+is%3Aissue+label%3A"help+wanted"+sort%3Areactions-%2B1-desc+) issues. +- Submit Github issues for any [feature enhancements](https://github.com/dagshub/ml-workspace/issues/new?assignees=&labels=feature-request&template=02_feature-request.md&title=), [bugs](https://github.com/dagshub/ml-workspace/issues/new?assignees=&labels=bug&template=01_bug-report.md&title=), or [documentation](https://github.com/dagshub/ml-workspace/issues/new?assignees=&labels=enhancement%2C+docs&template=03_documentation.md&title=) problems. +- By participating in this project, you agree to abide by its [Code of Conduct](https://github.com/dagshub/ml-workspace/tree/master/CODE_OF_CONDUCT.md).