From 5fecb3585789114543f97f431d42319de447e2f7 Mon Sep 17 00:00:00 2001 From: dormullor <105583031+dormullor@users.noreply.github.com> Date: Thu, 25 Apr 2024 08:51:49 +0300 Subject: [PATCH 01/87] Delete .circleci directory --- .circleci/config.yml | 25 ------------------------- 1 file changed, 25 deletions(-) delete mode 100644 .circleci/config.yml diff --git a/.circleci/config.yml b/.circleci/config.yml deleted file mode 100644 index c65cd175fe..0000000000 --- a/.circleci/config.yml +++ /dev/null @@ -1,25 +0,0 @@ -version: 2.1 - -jobs: - build-docs: - docker: - - image: runai/circleci-mkdocs:latest - steps: - # - add_ssh_keys: - # fingerprints: - # - "e6:d0:9e:2e:b1:3c:16:48:11:1a:83:56:e4:b1:3f:8f" - # - checkout - - run: - name: deploy-documentation - command: echo "we moved to github actions..." - -workflows: - version: 2.1 - deploy: - jobs: - - build-docs: - name: build - filters: - branches: - only: - - master From 33eecad45e15a4f31ee4169684649d089f09a427 Mon Sep 17 00:00:00 2001 From: ofir-run-ai <126491455+ofir-run-ai@users.noreply.github.com> Date: Sun, 26 May 2024 16:06:26 +0300 Subject: [PATCH 02/87] Adding necessary secret label to enable cluster-wide secret --- docs/admin/admin-ui-setup/credentials-setup.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/admin/admin-ui-setup/credentials-setup.md b/docs/admin/admin-ui-setup/credentials-setup.md index 3a6563dc11..bde6bc7b59 100644 --- a/docs/admin/admin-ui-setup/credentials-setup.md +++ b/docs/admin/admin-ui-setup/credentials-setup.md @@ -22,7 +22,7 @@ creation tool to create a pre-existing secret for the credential. You must `labe The following command makes the secret available to all projects in the cluster. ```console -kubectl label secret -n runai run.ai/cluster-wide-credentials=true +kubectl label secret -n runai run.ai/resource= run.ai/cluster-wide-credentials=true ``` The following command makes the secret available to the entire scope of a department. From bbb4c93dd54132f620214c6dcf009ed7a5e005e3 Mon Sep 17 00:00:00 2001 From: ozRunAI <138565115+ozRunAI@users.noreply.github.com> Date: Tue, 28 May 2024 13:42:13 +0300 Subject: [PATCH 03/87] added 2.18 k8s requirements --- docs/admin/runai-setup/cluster-setup/cluster-prerequisites.md | 1 + 1 file changed, 1 insertion(+) diff --git a/docs/admin/runai-setup/cluster-setup/cluster-prerequisites.md b/docs/admin/runai-setup/cluster-setup/cluster-prerequisites.md index 794471feeb..b01480a60c 100644 --- a/docs/admin/runai-setup/cluster-setup/cluster-prerequisites.md +++ b/docs/admin/runai-setup/cluster-setup/cluster-prerequisites.md @@ -62,6 +62,7 @@ Following is a Kubernetes support matrix for the latest Run:ai releases: Date: Thu, 13 Jun 2024 12:45:18 +0300 Subject: [PATCH 04/87] RUN-14733 - added backoff limit to procedure under General --- docs/admin/workloads/submitting-workloads.md | 24 ++++++++++++-------- 1 file changed, 14 insertions(+), 10 deletions(-) diff --git a/docs/admin/workloads/submitting-workloads.md b/docs/admin/workloads/submitting-workloads.md index 9db72270c9..ef33968970 100644 --- a/docs/admin/workloads/submitting-workloads.md +++ b/docs/admin/workloads/submitting-workloads.md @@ -36,11 +36,13 @@ To submit a workload using the UI: 8. In the *General* pane, add special settings for your training (optional): - 1. Press *Auto-deletion* to delete the training automatically when it either completes or fails. You can configure the timeframe in days, hours, minuets, and seconds. If the timeframe is set to 0, the training will be deleted immediately after it completes or fails. - 2. Press *Annotation* to a name and value to annotate the training. Repeat this step to add multiple annotations. - 3. Press *Label* to a name and value to label the training. Repeat this step to add multiple labels. + 1. Toggle the switch to allow the workspace to exceed the project's quota. + 2. Set the backoff limit before workload failure, this can be changed, if necessary. Use integers only. (Default = 6, maximum = 100, minimum = 0). + 3. Press *Auto-deletion* to delete the training automatically when it either completes or fails. You can configure the timeframe in days, hours, minuets, and seconds. If the timeframe is set to 0, the training will be deleted immediately after it completes or fails. + 4. Press *Annotation* to a name and value to annotate the training. Repeat this step to add multiple annotations. + 5. Press *Label* to a name and value to label the training. Repeat this step to add multiple labels. - 9. When complete, press *Create workspace. + 9. When complete, press *Create workspace*. === "Training" @@ -73,9 +75,10 @@ To submit a workload using the UI: 9. (Optional) In the *General* pane, add special settings for your training (optional): - 1. Press *Auto-deletion* to delete the training automatically when it either completes or fails. You can configure the timeframe in days, hours, minuets, and seconds. If the timeframe is set to 0, the training will be deleted immediately after it completes or fails. - 2. Press *Annotation* to a name and value to annotate the training. Repeat this step to add multiple annotations. - 3. Press *Label* to a name and value to label the training. Repeat this step to add multiple labels. + 1. Set the backoff limit before workload failure, this can be changed, if necessary. Use integers only. (Default = 6, maximum = 100, minimum = 0). + 2. Press *Auto-deletion* to delete the training automatically when it either completes or fails. You can configure the timeframe in days, hours, minuets, and seconds. If the timeframe is set to 0, the training will be deleted immediately after it completes or fails. + 3. Press *Annotation* to a name and value to annotate the training. Repeat this step to add multiple annotations. + 4. Press *Label* to a name and value to label the training. Repeat this step to add multiple labels. 10. If you if selected `Workers & master` Press *Continue* to `Configure the master` and go to the next step. If not, then press *Create training*. @@ -99,9 +102,10 @@ To submit a workload using the UI: 5. (Optional) In the *General* pane, add special settings for your training (optional): - 1. Press *Auto-deletion* to delete the training automatically when it either completes or fails. You can configure the timeframe in days, hours, minuets, and seconds. If the timeframe is set to 0, the training will be deleted immediately after it completes or fails. - 2. Press *Annotation* to a name and value to annotate the training. Repeat this step to add multiple annotations. - 3. Press *Label* to a name and value to label the training. Repeat this step to add multiple labels. + 1. Set the backoff limit before workload failure, this can be changed, if necessary. Use integers only. (Default = 6, maximum = 100, minimum = 0). + 2. Press *Auto-deletion* to delete the training automatically when it either completes or fails. You can configure the timeframe in days, hours, minuets, and seconds. If the timeframe is set to 0, the training will be deleted immediately after it completes or fails. + 3. Press *Annotation* to a name and value to annotate the training. Repeat this step to add multiple annotations. + 4. Press *Label* to a name and value to label the training. Repeat this step to add multiple labels. 12. When your training configuration is complete. press *Create training*. From 471312f63fbd85ae689d24d9237c069337e195a8 Mon Sep 17 00:00:00 2001 From: JamieWeider72 <147967555+JamieWeider72@users.noreply.github.com> Date: Sun, 16 Jun 2024 12:22:18 +0300 Subject: [PATCH 05/87] Run-19295 added Run-14732 --- docs/home/whats-new-2-18.md | 32 ++++++++++++++++++++++++++++++++ 1 file changed, 32 insertions(+) create mode 100644 docs/home/whats-new-2-18.md diff --git a/docs/home/whats-new-2-18.md b/docs/home/whats-new-2-18.md new file mode 100644 index 0000000000..99de575c2e --- /dev/null +++ b/docs/home/whats-new-2-18.md @@ -0,0 +1,32 @@ +--- +title: Version 2.17 +summary: This article describes new features and functionality in the version. +authors: + - Jason Novich +date: 2024-Apr-14 +--- + +## Release Content - April 14, 2024 + +* [Deprecation notifications](#deprecation-notifications) +* [Breaking changes](#breaking-changes) + +### Researcher + +#### Jobs, Workloads, and Workspaces + +* Added backoff limit functionality to Training and Workspace workloads. The backoff limit is the maximum number of retry attempts for failed workloads. After reaching the limit, the workload's status will change to `Failed`. + + + + +## Deprecation Notifications + +Deprecation notifications allow you to plan for future changes in the Run:ai Platform. + + +## Breaking changes + +Breaking changes notifications allow you to plan around potential changes that may interfere your current workflow when interfacing with the Run:ai Platform. + + From 09100bca7081483a8509fe94a107e686304b0507 Mon Sep 17 00:00:00 2001 From: JamieWeider72 <147967555+JamieWeider72@users.noreply.github.com> Date: Sun, 16 Jun 2024 12:26:02 +0300 Subject: [PATCH 06/87] Run-19295 Changed release date --- docs/home/whats-new-2-18.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/docs/home/whats-new-2-18.md b/docs/home/whats-new-2-18.md index 99de575c2e..ba2cbca02f 100644 --- a/docs/home/whats-new-2-18.md +++ b/docs/home/whats-new-2-18.md @@ -2,11 +2,11 @@ title: Version 2.17 summary: This article describes new features and functionality in the version. authors: - - Jason Novich -date: 2024-Apr-14 + - Jamie Weider +date: 2024-June-14 --- -## Release Content - April 14, 2024 +## Release Content - June 30, 2024 * [Deprecation notifications](#deprecation-notifications) * [Breaking changes](#breaking-changes) From 1e5b5dff3e2ba79f0ec4fddf52a491212f835b55 Mon Sep 17 00:00:00 2001 From: JamieWeider72 <147967555+JamieWeider72@users.noreply.github.com> Date: Sun, 16 Jun 2024 12:30:02 +0300 Subject: [PATCH 07/87] RUN-19295 Added todo --- docs/home/whats-new-2-18.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/home/whats-new-2-18.md b/docs/home/whats-new-2-18.md index ba2cbca02f..a8db407f73 100644 --- a/docs/home/whats-new-2-18.md +++ b/docs/home/whats-new-2-18.md @@ -15,7 +15,7 @@ date: 2024-June-14 #### Jobs, Workloads, and Workspaces -* Added backoff limit functionality to Training and Workspace workloads. The backoff limit is the maximum number of retry attempts for failed workloads. After reaching the limit, the workload's status will change to `Failed`. +* Added backoff limit functionality to Training and Workspace workloads. The backoff limit is the maximum number of retry attempts for failed workloads. After reaching the limit, the workload's status will change to `Failed`. From b0ac91b3bd97200d5d2b574fcaa4429707799984 Mon Sep 17 00:00:00 2001 From: Liran Ben Abu Date: Sun, 16 Jun 2024 16:03:47 +0300 Subject: [PATCH 08/87] adding redis auth password --- docs/admin/runai-setup/self-hosted/k8s/backend.md | 1 + 1 file changed, 1 insertion(+) diff --git a/docs/admin/runai-setup/self-hosted/k8s/backend.md b/docs/admin/runai-setup/self-hosted/k8s/backend.md index af84b57310..664c0d1e28 100644 --- a/docs/admin/runai-setup/self-hosted/k8s/backend.md +++ b/docs/admin/runai-setup/self-hosted/k8s/backend.md @@ -45,6 +45,7 @@ There may be cases where you need to set additional properties as follows: | Key | Change | Description | |----------|----------|-------------| +| `redis.auth.password` | Redis (Runai internal cache mechanism) applicative password | Override the default password | | `keycloakx.adminUser` | User name of the internal identity provider administrator | This user is the administrator of Keycloak | | `keycloakx.adminPassword` | Password of the internal identity provider administrator | This password is for the administrator of Keycloak | | `global.keycloakx.host` | KeyCloak (Run:ai internal identity provider) host path | Override the DNS for Keycloak. This can be used to access Keycloak from outside the Run:ai Control Plane cluster via ingress | From 36802ca3e24bd6a1a57863be9c087cca6c745ee1 Mon Sep 17 00:00:00 2001 From: ozRunAI <138565115+ozRunAI@users.noreply.github.com> Date: Mon, 17 Jun 2024 09:51:46 +0300 Subject: [PATCH 09/87] added preinstall script details --- .../cluster-setup/cluster-prerequisites.md | 37 +++++++++++++++++-- 1 file changed, 33 insertions(+), 4 deletions(-) diff --git a/docs/admin/runai-setup/cluster-setup/cluster-prerequisites.md b/docs/admin/runai-setup/cluster-setup/cluster-prerequisites.md index b01480a60c..b4b0c425cf 100644 --- a/docs/admin/runai-setup/cluster-setup/cluster-prerequisites.md +++ b/docs/admin/runai-setup/cluster-setup/cluster-prerequisites.md @@ -381,10 +381,39 @@ Once you believe that the Run:ai prerequisites are met, we highly recommend inst To use the script [download](https://github.com/run-ai/preinstall-diagnostics/releases){target=_blank} the latest version of the script and run: -``` -chmod +x preinstall-diagnostics- -./preinstall-diagnostics- -``` + + +=== "SaaS" +* On EKS deployments, please run aws configure prior to execution + + ``` bash + chmod +x ./preinstall-diagnostics-darwin-arm64 && \ + ./preinstall-diagnostics-darwin-arm64 \ + --domain ${TENANT_NAME}.run.ai \ + --cluster-domain ${CLUSTER_FQDN} + ``` + +=== "Self-hosted" + + + ``` bash + chmod +x ./preinstall-diagnostics-darwin-arm64 && ./preinstall-diagnostics-darwin-arm64 \ + --domain ${CONTROL_PLANE_FQDN} \ + --cluster-domain ${CLUSTER_FQDN} \ + #if the diagnostics image is hosted in a private registry + --image-pull-secret ${IMAGE_PULL_SECRET_NAME} \ + --image ${PRIVATE_REGISTRY_IMAGE_URL} + ``` + +=== "Airgap" + + On an air-gapped deployment, the diagnostics image should be pulled, saved and manually pushed to the organization's registry. + + The binary should be run with --image parameter to modify the diagnostics image to be used: + + + + If the script shows warnings or errors, locate the file `runai-preinstall-diagnostics.txt` in the current directory and send it to Run:ai technical support. From 940045783013f6902493fca22c9ba6f2ba755bb0 Mon Sep 17 00:00:00 2001 From: JamieWeider72 <147967555+JamieWeider72@users.noreply.github.com> Date: Mon, 17 Jun 2024 13:59:23 +0300 Subject: [PATCH 10/87] Update rbac.md --- docs/admin/runai-setup/access-control/rbac.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/admin/runai-setup/access-control/rbac.md b/docs/admin/runai-setup/access-control/rbac.md index 0340bd324c..3d6f0ee808 100644 --- a/docs/admin/runai-setup/access-control/rbac.md +++ b/docs/admin/runai-setup/access-control/rbac.md @@ -27,7 +27,7 @@ Environment administrator | Create, view, edit, and delete *Environments*.
V | System administrator | Controls all aspects of the system. This role has global system control and should be limited to a small group of skilled IT administrators. | | Department administrator | Create, view, edit, and delete: *Departments* and *Projects*.
Assign *Roles (Researcher, ML engineer, Research manager, Viewer) within those departments and projects.
View *Dashboards* (including the *Consumption dashboard). | | Editor | View *Screens* and *Dashboards*
Manage *Departments* and *Projects*. | -| Research manager | Create, view, edit, and delete: *Environments*, *Data sources*, *Compute resources*, and *Templates*.
View *Projects*, related *Jobs* and *Workspaces*, and *Dashboards*. | +| Research manager | Create, view, edit, and delete: *Environments*, *Data sources*, *Compute resources*, *Templates*, and *Projects*
View related *Jobs* and *Workspaces*, and *Dashboards*. | | L1 researcher | Create, view, edit, and delete *Jobs*, *Workspaces*, *Environments*, *Data sources*, *Compute resources*, *Templates*.
View *Dashboards*. | ML engineer | Create, edit, view, and delete *Deployments*.
View *Departments*, *Projects*, *Clusters*, *Node-pools*, *Nodes*, *Dashboards*. | | Viewer | View *Departments*, *Projects*, *Respective subordinates* (Jobs, Deployments, Workspaces, Environments, Data sources, Compute resources, Templates), *Dashboards*.
A viewer cannot edit *Configurations*. | From 44fff683b9fe382f5a50d8069336cf38d0d8324d Mon Sep 17 00:00:00 2001 From: Oz Bar-Shalom Date: Mon, 17 Jun 2024 14:09:44 +0300 Subject: [PATCH 11/87] added preinstall script description to 2.18 --- .../cluster-setup/cluster-prerequisites.md | 30 ++++++++++++++----- 1 file changed, 23 insertions(+), 7 deletions(-) diff --git a/docs/admin/runai-setup/cluster-setup/cluster-prerequisites.md b/docs/admin/runai-setup/cluster-setup/cluster-prerequisites.md index b4b0c425cf..7b1c1a51a1 100644 --- a/docs/admin/runai-setup/cluster-setup/cluster-prerequisites.md +++ b/docs/admin/runai-setup/cluster-setup/cluster-prerequisites.md @@ -384,20 +384,20 @@ To use the script [download](https://github.com/run-ai/preinstall-diagnostics/re === "SaaS" -* On EKS deployments, please run aws configure prior to execution + * On EKS deployments, please run `aws configure` prior to execution ``` bash - chmod +x ./preinstall-diagnostics-darwin-arm64 && \ - ./preinstall-diagnostics-darwin-arm64 \ + chmod +x ./preinstall-diagnostics- && \ + ./preinstall-diagnostics- \ --domain ${TENANT_NAME}.run.ai \ --cluster-domain ${CLUSTER_FQDN} ``` === "Self-hosted" - ``` bash - chmod +x ./preinstall-diagnostics-darwin-arm64 && ./preinstall-diagnostics-darwin-arm64 \ + chmod +x ./preinstall-diagnostics- && \ + ./preinstall-diagnostics- \ --domain ${CONTROL_PLANE_FQDN} \ --cluster-domain ${CLUSTER_FQDN} \ #if the diagnostics image is hosted in a private registry @@ -409,10 +409,26 @@ To use the script [download](https://github.com/run-ai/preinstall-diagnostics/re On an air-gapped deployment, the diagnostics image should be pulled, saved and manually pushed to the organization's registry. - The binary should be run with --image parameter to modify the diagnostics image to be used: - + The binary should be run with `--image` parameter to modify the diagnostics image to be used: + ``` bash + #Save the image locally + docker save --output preinstall-diagnostics.tar gcr.io/run-ai-lab/preinstall-diagnostics:${VERSION} + #Load the image to the organization's registry + docker load --input preinstall-diagnostics.tar + docker tag gcr.io/run-ai-lab/preinstall-diagnostics:${VERSION} ${CLIENT_IMAGE_AND_TAG} + docker push ${CLIENT_IMAGE_AND_TAG} + ``` + Finally, run the diagnostics tool: + ``` bash + chmod +x ./preinstall-diagnostics-darwin-arm64 && \ + ./preinstall-diagnostics-darwin-arm64 \ + --domain ${CONTROL_PLANE_FQDN} \ + --cluster-domain ${CLUSTER_FQDN} \ + --image-pull-secret ${IMAGE_PULL_SECRET_NAME} \ + --image ${PRIVATE_REGISTRY_IMAGE_URL} + ``` If the script shows warnings or errors, locate the file `runai-preinstall-diagnostics.txt` in the current directory and send it to Run:ai technical support. From 3dc2a6ee80a97bf075707b2d272946d7aae05248 Mon Sep 17 00:00:00 2001 From: Oz Bar-Shalom Date: Mon, 17 Jun 2024 14:47:01 +0300 Subject: [PATCH 12/87] fixed grammer for pre-install-disgnostics --- .../runai-setup/cluster-setup/cluster-prerequisites.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/docs/admin/runai-setup/cluster-setup/cluster-prerequisites.md b/docs/admin/runai-setup/cluster-setup/cluster-prerequisites.md index 7b1c1a51a1..bb96889729 100644 --- a/docs/admin/runai-setup/cluster-setup/cluster-prerequisites.md +++ b/docs/admin/runai-setup/cluster-setup/cluster-prerequisites.md @@ -407,9 +407,8 @@ To use the script [download](https://github.com/run-ai/preinstall-diagnostics/re === "Airgap" - On an air-gapped deployment, the diagnostics image should be pulled, saved and manually pushed to the organization's registry. + In an air-gapped deployment, the diagnostics image is saved, pushed, and pulled manually from the organization's registry. - The binary should be run with `--image` parameter to modify the diagnostics image to be used: ``` bash #Save the image locally @@ -420,7 +419,8 @@ To use the script [download](https://github.com/run-ai/preinstall-diagnostics/re docker push ${CLIENT_IMAGE_AND_TAG} ``` - Finally, run the diagnostics tool: + Run the binary with the `--image` parameter to modify the diagnostics image to be used: + ``` bash chmod +x ./preinstall-diagnostics-darwin-arm64 && \ ./preinstall-diagnostics-darwin-arm64 \ From bbf87434926dfd0729e52daa0ed4df168657bee3 Mon Sep 17 00:00:00 2001 From: ozRunAI <138565115+ozRunAI@users.noreply.github.com> Date: Mon, 17 Jun 2024 14:50:19 +0300 Subject: [PATCH 13/87] Update docs/admin/runai-setup/cluster-setup/cluster-prerequisites.md Co-authored-by: JamieWeider72 <147967555+JamieWeider72@users.noreply.github.com> --- docs/admin/runai-setup/cluster-setup/cluster-prerequisites.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/admin/runai-setup/cluster-setup/cluster-prerequisites.md b/docs/admin/runai-setup/cluster-setup/cluster-prerequisites.md index bb96889729..4678cea6e3 100644 --- a/docs/admin/runai-setup/cluster-setup/cluster-prerequisites.md +++ b/docs/admin/runai-setup/cluster-setup/cluster-prerequisites.md @@ -384,7 +384,7 @@ To use the script [download](https://github.com/run-ai/preinstall-diagnostics/re === "SaaS" - * On EKS deployments, please run `aws configure` prior to execution + * On EKS deployments, run `aws configure` prior to execution ``` bash chmod +x ./preinstall-diagnostics- && \ From 51975d826eda6e13d31ecf6db42672d67e16df35 Mon Sep 17 00:00:00 2001 From: JamieWeider72 <147967555+JamieWeider72@users.noreply.github.com> Date: Mon, 17 Jun 2024 15:25:41 +0300 Subject: [PATCH 14/87] Removed Limitation and Login --- .../runai-setup/self-hosted/ocp/additional-clusters.md | 9 --------- docs/index.md | 2 +- 2 files changed, 1 insertion(+), 10 deletions(-) diff --git a/docs/admin/runai-setup/self-hosted/ocp/additional-clusters.md b/docs/admin/runai-setup/self-hosted/ocp/additional-clusters.md index d273718796..04d633d5e8 100644 --- a/docs/admin/runai-setup/self-hosted/ocp/additional-clusters.md +++ b/docs/admin/runai-setup/self-hosted/ocp/additional-clusters.md @@ -4,9 +4,6 @@ The first Run:ai cluster is typically installed on the same OpenShift cluster as The instructions are for Run:ai version __2.13__ and up. -!!! Limitation - When you log in, you do so in the context of a specific cluster. When you switch to a different cluster, you will be prompted to log in to that cluster. - ## Configuration The exact configuration details must be worked together with Run:ai customer support. @@ -18,9 +15,3 @@ Create a new cluster, then: * Select a Cluster location `Remote to Control Plane`. * You must enter a specific cluster URL with the format `https://runai.apps.`. To get the base Domain run `oc get dns cluster -oyaml | grep baseDomain` * Ignore the instructions for creating a secret. - -## Login - -When configured, you will see an option to choose a cluster at the bottom of the login screen: - -![](img/ocp-multi-cluster-login.png) diff --git a/docs/index.md b/docs/index.md index 5881c85304..9fcd5d28fd 100644 --- a/docs/index.md +++ b/docs/index.md @@ -1,4 +1,4 @@ -# Run:ai Documentation Library +# Run:ai Documentation Library Welcome to the Run:ai documentation area. For an introduction about what is the Run:ai Platform see [Run:ai platform](https://www.run.ai/platform/){target=_blank} on the run.ai website. From b6fc8135fbac191019a7819faf32bd136f198967 Mon Sep 17 00:00:00 2001 From: JamieWeider72 <147967555+JamieWeider72@users.noreply.github.com> Date: Mon, 17 Jun 2024 16:43:34 +0300 Subject: [PATCH 15/87] in Open ID Connect added info about Scope in #5) --- docs/admin/runai-setup/authentication/sso.md | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/docs/admin/runai-setup/authentication/sso.md b/docs/admin/runai-setup/authentication/sso.md index b472794fee..6d3b2a6191 100644 --- a/docs/admin/runai-setup/authentication/sso.md +++ b/docs/admin/runai-setup/authentication/sso.md @@ -71,8 +71,9 @@ You can configure your IdP to map several IdP attributes: 1. In the `Discovery URL` field, enter the discovery URL . 2. In the `Client ID` field, enter the client ID. 3. In the `Client Secret` field, enter the client secret. - 4. In the `User attributes` field enter the attribute and the value in the identity provider. (optional) - 5.When complete, press `Save`. + 4. Add OIDC scope to be used during authentication to authorize access to a user's details. Each scope returns a set of user attributes. The scope must match the names in your identity provider. + 5. In the `User attributes` field enter the attribute and the value in the identity provider. (optional) + 6.When complete, press `Save`. 4. In the `Logout uri` field, enter the desired URL logout page. If left empty, you will be redirected to the Run:ai portal. 5. In the `Session timeout` field, enter the amount of idle time before users are automatically logged out. (Default is 60 minutes) From b62eecab5657602d14cf19db63c20dfe16067c25 Mon Sep 17 00:00:00 2001 From: JamieWeider72 <147967555+JamieWeider72@users.noreply.github.com> Date: Tue, 18 Jun 2024 14:12:05 +0300 Subject: [PATCH 16/87] Run-16866-added-scopes and OpenShift info --- docs/admin/runai-setup/authentication/sso.md | 45 ++++++++++++++++++-- 1 file changed, 41 insertions(+), 4 deletions(-) diff --git a/docs/admin/runai-setup/authentication/sso.md b/docs/admin/runai-setup/authentication/sso.md index 6d3b2a6191..c49b3bfe93 100644 --- a/docs/admin/runai-setup/authentication/sso.md +++ b/docs/admin/runai-setup/authentication/sso.md @@ -1,8 +1,9 @@ # Single Sign-On -Single Sign-On (SSO) is an authentication scheme that allows a user to log in with a single ID to other, independent, software systems. SSO solves security issues involving multiple user/password data entries, multiple compliance schemes, etc. +Single Sign-On (SSO) is an authentication scheme allowing users to log in with a single ID to other, independent, software systems. SSO solves security issues involving multiple user/password data entries, multiple compliance schemes, etc. + +Run:ai supports SSO using the [SAML 2.0](https://en.wikipedia.org/wiki/Security_Assertion_Markup_Language){target=_blank} protocol, Open ID Connect [OIDC](https://openid.net/developers/how-connect-works/){target=_blank} and [OpenShift V4](https://en.wikipedia.org/wiki/OpenShift){target=_blank}. -Run:ai supports SSO using the [SAML 2.0](https://en.wikipedia.org/wiki/Security_Assertion_Markup_Language){target=_blank} protocol and Open ID Connect or [OIDC](https://openid.net/developers/how-connect-works/){target=_blank}. !!! Caution Single sign-on is only available with SaaS installations where the tenant has been created post-January 2022 or any Self-hosted installation of release 2.0.58 or later. If you are using single sign-on with older versions of Run:ai, please contact Run:ai customer support @@ -13,7 +14,7 @@ Run:ai supports SSO using the [SAML 2.0](https://en.wikipedia.org/wiki/Security_ ## SAML Prerequisites -**XML Metadata**—you must have an *XML Metadata file* retrieved from your IdP. Upload the file to a web server such that you will have a URL to the file. The URL must have the *XML* file extension. For example, to connect using Google, you must create a custom SAML App [here](https://admin.google.com/ac/apps/unified){target=_blank}, download the Metadata file, and upload it to a web server. +**XML Metadata**—you must have an *XML Metadata file* retrieved from your IdP. Upload the file to a web server so that you have a URL to the file. The URL must have the *XML* file extension. For example, to connect using Google, you must create a custom SAML App [here](https://admin.google.com/ac/apps/unified){target=_blank}, download the Metadata file, and upload it to a web server. ## OIDC Prerequisites @@ -21,6 +22,33 @@ Run:ai supports SSO using the [SAML 2.0](https://en.wikipedia.org/wiki/Security_ * **ClientID**—the ID used to identify the client with the Authorization Server. * **Client Secret**—a secret password that only the Client and Authorization Server know. + +## OpenShift Prerequisites + +Before using OpenShift, first define OAuthClient to control various aspects of the OAuth flow, such as redirect URIs and authentication methods to ensure secure and approprpriate access to resources. + +To define OAuthClient, follow these steps: + +1. Create a new ```OAuthClient``` Kubernetes object with the following content +``` + apiVersion: oauth.openshift.io/v1 + grantMethod: auto + kind: OAuthClient + metadata: + name: my-client + redirectURIs: + - https:///auth/realms/runai/broker/openshift-v4/endpoint + secret: this-is-my-secret +``` +2. Run the following command to apply the OAuthClient object to the environment. Create the object on OpenShift cluster where you define your OpenShift IDP: +``` +oc apply +``` +3. Check that the file has been applied successfully by running the following command: +``` +oc get oauthclient +``` + ### Additional attribute mappings You can configure your IdP to map several IdP attributes: @@ -71,10 +99,19 @@ You can configure your IdP to map several IdP attributes: 1. In the `Discovery URL` field, enter the discovery URL . 2. In the `Client ID` field, enter the client ID. 3. In the `Client Secret` field, enter the client secret. - 4. Add OIDC scope to be used during authentication to authorize access to a user's details. Each scope returns a set of user attributes. The scope must match the names in your identity provider. + 4. Add the OIDC scope to be used during authentication to authorize access to a user's details. Each scope returns a set of user attributes. The scope must match the names in your identity provider. 5. In the `User attributes` field enter the attribute and the value in the identity provider. (optional) 6.When complete, press `Save`. + === "OpenShift V4" + + 1. In the `Discovery URL` field, enter the discovery URL . + 2. In the `Client ID` field, enter the client ID. + 3. In the `Client Secret` field, enter the client secret. + 4. Add the OIDC scope to be used during authentication to authorize access to a user's details. Each scope returns a set of user attributes. The scope must match the names in your identity provider. + 5. In the `User attributes` field enter the attribute and the value in the identity provider. (optional) + 6. When complete, press `Save`. + 4. In the `Logout uri` field, enter the desired URL logout page. If left empty, you will be redirected to the Run:ai portal. 5. In the `Session timeout` field, enter the amount of idle time before users are automatically logged out. (Default is 60 minutes) From d8ca25de4fd3c333cfe0045a2f8de303a0689637 Mon Sep 17 00:00:00 2001 From: jasonnovichRunAI <124490127+jasonnovichRunAI@users.noreply.github.com> Date: Tue, 18 Jun 2024 14:17:36 +0300 Subject: [PATCH 17/87] RUN-16337 add CLI V2 files --- .../Researcher/cli-reference/new-cli/runai.md | 42 +++++++ .../cli-reference/new-cli/runai_cluster.md | 30 +++++ .../new-cli/runai_cluster_list.md | 30 +++++ .../new-cli/runai_cluster_set.md | 29 +++++ .../cli-reference/new-cli/runai_config.md | 30 +++++ .../new-cli/runai_config_generate.md | 30 +++++ .../cli-reference/new-cli/runai_config_set.md | 31 +++++ .../cli-reference/new-cli/runai_list.md | 33 +++++ .../new-cli/runai_list_clusters.md | 30 +++++ .../cli-reference/new-cli/runai_list_jobs.md | 32 +++++ .../cli-reference/new-cli/runai_list_nodes.md | 30 +++++ .../new-cli/runai_list_projects.md | 30 +++++ .../cli-reference/new-cli/runai_login.md | 44 +++++++ .../new-cli/runai_login_application.md | 47 +++++++ .../cli-reference/new-cli/runai_login_sso.md | 27 ++++ .../cli-reference/new-cli/runai_login_user.md | 42 +++++++ .../cli-reference/new-cli/runai_logout.md | 27 ++++ .../cli-reference/new-cli/runai_node.md | 24 ++++ .../cli-reference/new-cli/runai_node_list.md | 30 +++++ .../cli-reference/new-cli/runai_nodepool.md | 28 +++++ .../new-cli/runai_nodepool_list.md | 30 +++++ .../cli-reference/new-cli/runai_project.md | 30 +++++ .../new-cli/runai_project_list.md | 30 +++++ .../new-cli/runai_project_set.md | 28 +++++ .../cli-reference/new-cli/runai_report.md | 24 ++++ .../new-cli/runai_report_metrics.md | 26 ++++ .../new-cli/runai_report_metrics_clear.md | 27 ++++ .../new-cli/runai_report_metrics_config.md | 32 +++++ .../new-cli/runai_report_metrics_output.md | 28 +++++ .../cli-reference/new-cli/runai_training.md | 30 +++++ .../new-cli/runai_training_delete.md | 37 ++++++ .../new-cli/runai_training_list.md | 42 +++++++ .../new-cli/runai_training_logs.md | 76 ++++++++++++ .../new-cli/runai_training_resume.md | 37 ++++++ .../new-cli/runai_training_submit.md | 84 +++++++++++++ .../new-cli/runai_training_suspend.md | 37 ++++++ .../cli-reference/new-cli/runai_upgrade.md | 28 +++++ .../cli-reference/new-cli/runai_version.md | 28 +++++ .../cli-reference/new-cli/runai_workload.md | 26 ++++ .../new-cli/runai_workload_list.md | 36 ++++++ .../new-cli/runai_workload_logs.md | 77 ++++++++++++ .../cli-reference/new-cli/runai_workspace.md | 30 +++++ .../new-cli/runai_workspace_delete.md | 37 ++++++ .../new-cli/runai_workspace_list.md | 42 +++++++ .../new-cli/runai_workspace_logs.md | 76 ++++++++++++ .../new-cli/runai_workspace_resume.md | 37 ++++++ .../new-cli/runai_workspace_submit.md | 83 +++++++++++++ .../new-cli/runai_workspace_suspend.md | 37 ++++++ mkdocs.yml | 115 ++++++++++++------ 49 files changed, 1856 insertions(+), 40 deletions(-) create mode 100644 docs/Researcher/cli-reference/new-cli/runai.md create mode 100644 docs/Researcher/cli-reference/new-cli/runai_cluster.md create mode 100644 docs/Researcher/cli-reference/new-cli/runai_cluster_list.md create mode 100644 docs/Researcher/cli-reference/new-cli/runai_cluster_set.md create mode 100644 docs/Researcher/cli-reference/new-cli/runai_config.md create mode 100644 docs/Researcher/cli-reference/new-cli/runai_config_generate.md create mode 100644 docs/Researcher/cli-reference/new-cli/runai_config_set.md create mode 100644 docs/Researcher/cli-reference/new-cli/runai_list.md create mode 100644 docs/Researcher/cli-reference/new-cli/runai_list_clusters.md create mode 100644 docs/Researcher/cli-reference/new-cli/runai_list_jobs.md create mode 100644 docs/Researcher/cli-reference/new-cli/runai_list_nodes.md create mode 100644 docs/Researcher/cli-reference/new-cli/runai_list_projects.md create mode 100644 docs/Researcher/cli-reference/new-cli/runai_login.md create mode 100644 docs/Researcher/cli-reference/new-cli/runai_login_application.md create mode 100644 docs/Researcher/cli-reference/new-cli/runai_login_sso.md create mode 100644 docs/Researcher/cli-reference/new-cli/runai_login_user.md create mode 100644 docs/Researcher/cli-reference/new-cli/runai_logout.md create mode 100644 docs/Researcher/cli-reference/new-cli/runai_node.md create mode 100644 docs/Researcher/cli-reference/new-cli/runai_node_list.md create mode 100644 docs/Researcher/cli-reference/new-cli/runai_nodepool.md create mode 100644 docs/Researcher/cli-reference/new-cli/runai_nodepool_list.md create mode 100644 docs/Researcher/cli-reference/new-cli/runai_project.md create mode 100644 docs/Researcher/cli-reference/new-cli/runai_project_list.md create mode 100644 docs/Researcher/cli-reference/new-cli/runai_project_set.md create mode 100644 docs/Researcher/cli-reference/new-cli/runai_report.md create mode 100644 docs/Researcher/cli-reference/new-cli/runai_report_metrics.md create mode 100644 docs/Researcher/cli-reference/new-cli/runai_report_metrics_clear.md create mode 100644 docs/Researcher/cli-reference/new-cli/runai_report_metrics_config.md create mode 100644 docs/Researcher/cli-reference/new-cli/runai_report_metrics_output.md create mode 100644 docs/Researcher/cli-reference/new-cli/runai_training.md create mode 100644 docs/Researcher/cli-reference/new-cli/runai_training_delete.md create mode 100644 docs/Researcher/cli-reference/new-cli/runai_training_list.md create mode 100644 docs/Researcher/cli-reference/new-cli/runai_training_logs.md create mode 100644 docs/Researcher/cli-reference/new-cli/runai_training_resume.md create mode 100644 docs/Researcher/cli-reference/new-cli/runai_training_submit.md create mode 100644 docs/Researcher/cli-reference/new-cli/runai_training_suspend.md create mode 100644 docs/Researcher/cli-reference/new-cli/runai_upgrade.md create mode 100644 docs/Researcher/cli-reference/new-cli/runai_version.md create mode 100644 docs/Researcher/cli-reference/new-cli/runai_workload.md create mode 100644 docs/Researcher/cli-reference/new-cli/runai_workload_list.md create mode 100644 docs/Researcher/cli-reference/new-cli/runai_workload_logs.md create mode 100644 docs/Researcher/cli-reference/new-cli/runai_workspace.md create mode 100644 docs/Researcher/cli-reference/new-cli/runai_workspace_delete.md create mode 100644 docs/Researcher/cli-reference/new-cli/runai_workspace_list.md create mode 100644 docs/Researcher/cli-reference/new-cli/runai_workspace_logs.md create mode 100644 docs/Researcher/cli-reference/new-cli/runai_workspace_resume.md create mode 100644 docs/Researcher/cli-reference/new-cli/runai_workspace_submit.md create mode 100644 docs/Researcher/cli-reference/new-cli/runai_workspace_suspend.md diff --git a/docs/Researcher/cli-reference/new-cli/runai.md b/docs/Researcher/cli-reference/new-cli/runai.md new file mode 100644 index 0000000000..82142135dc --- /dev/null +++ b/docs/Researcher/cli-reference/new-cli/runai.md @@ -0,0 +1,42 @@ +--- +title: Run:ai Command-line Interface +summary: This article is the summary article for the CLI V2. +authors: + - Jason Novich +date: 2024-Jun-18 +--- + +## Summary + +The Run:ai Command-line Interface (CLI) tool for a Researcher to send deep learning workloads, acquire GPU-based containers, list jobs, and access other features in the Run:ai platform. + +``` +runai [flags] +``` + +### Options + +``` + --config-file string config file name; can be set by environment variable RUNAI_CLI_CONFIG_FILE (default "config.json") + --config-path string config path; can be set by environment variable RUNAI_CLI_CONFIG_PATH (default "~/.runai/") + -d, --debug enable debug mode + -h, --help help for runai + -v, --verbose enable verbose mode +``` + +### SEE ALSO + +* [runai cluster](runai_cluster.md)—cluster management +* [runai config](runai_config.md)—configuration management +* [runai list](runai_list.md)—[Deprecated] display resource list. By default displays the job list +* [runai login](runai_login.md)—login to the control plane +* [runai logout](runai_logout.md)—logout from control plane +* [runai node](runai_node.md)—node management +* [runai nodepool](runai_nodepool.md)—node pool management +* [runai project](runai_project.md)—project management +* [runai report](runai_report.md)—report management +* [runai training](runai_training.md)—training management +* [runai upgrade](runai_upgrade.md)—upgrades the CLI to the latest version +* [runai version](runai_version.md)—print version information +* [runai workload](runai_workload.md)—workload management +* [runai workspace](runai_workspace.md)—workspace management diff --git a/docs/Researcher/cli-reference/new-cli/runai_cluster.md b/docs/Researcher/cli-reference/new-cli/runai_cluster.md new file mode 100644 index 0000000000..1310c1ae44 --- /dev/null +++ b/docs/Researcher/cli-reference/new-cli/runai_cluster.md @@ -0,0 +1,30 @@ +## runai cluster + +cluster management + +``` +runai cluster [flags] +``` + +### Options + +``` + -h, --help help for cluster + --interactive enable set interactive mode (enabled|disabled) +``` + +### Options inherited from parent commands + +``` + --config-file string config file name; can be set by environment variable RUNAI_CLI_CONFIG_FILE (default "config.json") + --config-path string config path; can be set by environment variable RUNAI_CLI_CONFIG_PATH (default "~/.runai/") + -d, --debug enable debug mode + -v, --verbose enable verbose mode +``` + +### SEE ALSO + +* [runai](runai.md) - Run:ai Command-line Interface +* [runai cluster list](runai_cluster_list.md) - cluster list command +* [runai cluster set](runai_cluster_set.md) - set cluster context + diff --git a/docs/Researcher/cli-reference/new-cli/runai_cluster_list.md b/docs/Researcher/cli-reference/new-cli/runai_cluster_list.md new file mode 100644 index 0000000000..259db1c3cf --- /dev/null +++ b/docs/Researcher/cli-reference/new-cli/runai_cluster_list.md @@ -0,0 +1,30 @@ +## runai cluster list + +cluster list command + +``` +runai cluster list [flags] +``` + +### Options + +``` + -h, --help help for list + --json Output structure JSON + --table Output structure table + --yaml Output structure YAML +``` + +### Options inherited from parent commands + +``` + --config-file string config file name; can be set by environment variable RUNAI_CLI_CONFIG_FILE (default "config.json") + --config-path string config path; can be set by environment variable RUNAI_CLI_CONFIG_PATH (default "~/.runai/") + -d, --debug enable debug mode + -v, --verbose enable verbose mode +``` + +### SEE ALSO + +* [runai cluster](runai_cluster.md) - cluster management + diff --git a/docs/Researcher/cli-reference/new-cli/runai_cluster_set.md b/docs/Researcher/cli-reference/new-cli/runai_cluster_set.md new file mode 100644 index 0000000000..d894df6724 --- /dev/null +++ b/docs/Researcher/cli-reference/new-cli/runai_cluster_set.md @@ -0,0 +1,29 @@ +## runai cluster set + +set cluster context + +``` +runai cluster set [flags] +``` + +### Options + +``` + -h, --help help for set + --id string set by cluster ID + --name string set by cluster name +``` + +### Options inherited from parent commands + +``` + --config-file string config file name; can be set by environment variable RUNAI_CLI_CONFIG_FILE (default "config.json") + --config-path string config path; can be set by environment variable RUNAI_CLI_CONFIG_PATH (default "~/.runai/") + -d, --debug enable debug mode + -v, --verbose enable verbose mode +``` + +### SEE ALSO + +* [runai cluster](runai_cluster.md) - cluster management + diff --git a/docs/Researcher/cli-reference/new-cli/runai_config.md b/docs/Researcher/cli-reference/new-cli/runai_config.md new file mode 100644 index 0000000000..e32ece388d --- /dev/null +++ b/docs/Researcher/cli-reference/new-cli/runai_config.md @@ -0,0 +1,30 @@ +## runai config + +configuration management + +``` +runai config [flags] +``` + +### Options + +``` + -h, --help help for config + --interactive enable set interactive mode (enabled|disabled) +``` + +### Options inherited from parent commands + +``` + --config-file string config file name; can be set by environment variable RUNAI_CLI_CONFIG_FILE (default "config.json") + --config-path string config path; can be set by environment variable RUNAI_CLI_CONFIG_PATH (default "~/.runai/") + -d, --debug enable debug mode + -v, --verbose enable verbose mode +``` + +### SEE ALSO + +* [runai](runai.md) - Run:ai Command-line Interface +* [runai config generate](runai_config_generate.md) - generate config file +* [runai config set](runai_config_set.md) - Set configuration values + diff --git a/docs/Researcher/cli-reference/new-cli/runai_config_generate.md b/docs/Researcher/cli-reference/new-cli/runai_config_generate.md new file mode 100644 index 0000000000..dcb853d255 --- /dev/null +++ b/docs/Researcher/cli-reference/new-cli/runai_config_generate.md @@ -0,0 +1,30 @@ +## runai config generate + +generate config file + +``` +runai config generate [flags] +``` + +### Options + +``` + --file string Output structure to file + -h, --help help for generate + --json Output structure JSON + --yaml Output structure YAML +``` + +### Options inherited from parent commands + +``` + --config-file string config file name; can be set by environment variable RUNAI_CLI_CONFIG_FILE (default "config.json") + --config-path string config path; can be set by environment variable RUNAI_CLI_CONFIG_PATH (default "~/.runai/") + -d, --debug enable debug mode + -v, --verbose enable verbose mode +``` + +### SEE ALSO + +* [runai config](runai_config.md) - configuration management + diff --git a/docs/Researcher/cli-reference/new-cli/runai_config_set.md b/docs/Researcher/cli-reference/new-cli/runai_config_set.md new file mode 100644 index 0000000000..308f0a4ede --- /dev/null +++ b/docs/Researcher/cli-reference/new-cli/runai_config_set.md @@ -0,0 +1,31 @@ +## runai config set + +Set configuration values + +``` +runai config set [flags] +``` + +### Options + +``` + --auth-url string set the authorization URL + --cp-url string set the control plane URL + -h, --help help for set + --interactive enable set interactive mode (enabled|disabled) + --output string set the default output type +``` + +### Options inherited from parent commands + +``` + --config-file string config file name; can be set by environment variable RUNAI_CLI_CONFIG_FILE (default "config.json") + --config-path string config path; can be set by environment variable RUNAI_CLI_CONFIG_PATH (default "~/.runai/") + -d, --debug enable debug mode + -v, --verbose enable verbose mode +``` + +### SEE ALSO + +* [runai config](runai_config.md) - configuration management + diff --git a/docs/Researcher/cli-reference/new-cli/runai_list.md b/docs/Researcher/cli-reference/new-cli/runai_list.md new file mode 100644 index 0000000000..356dc1ed95 --- /dev/null +++ b/docs/Researcher/cli-reference/new-cli/runai_list.md @@ -0,0 +1,33 @@ +## runai list + +[Deprecated] display resource list. By default displays the job list + +``` +runai list [flags] +``` + +### Options + +``` + -A, --all-projects list jobs from all projects + -h, --help help for list + -p, --project string Specify the project to which the command applies. By default, commands apply to the default project. To change the default project use ‘runai config project ’ +``` + +### Options inherited from parent commands + +``` + --config-file string config file name; can be set by environment variable RUNAI_CLI_CONFIG_FILE (default "config.json") + --config-path string config path; can be set by environment variable RUNAI_CLI_CONFIG_PATH (default "~/.runai/") + -d, --debug enable debug mode + -v, --verbose enable verbose mode +``` + +### SEE ALSO + +* [runai](runai.md) - Run:ai Command-line Interface +* [runai list clusters](runai_list_clusters.md) - [Deprecated] list all available clusters +* [runai list jobs](runai_list_jobs.md) - [Deprecated] list all jobs +* [runai list nodes](runai_list_nodes.md) - [Deprecated] list all nodes +* [runai list projects](runai_list_projects.md) - [Deprecated] list all available projects + diff --git a/docs/Researcher/cli-reference/new-cli/runai_list_clusters.md b/docs/Researcher/cli-reference/new-cli/runai_list_clusters.md new file mode 100644 index 0000000000..4308d7895e --- /dev/null +++ b/docs/Researcher/cli-reference/new-cli/runai_list_clusters.md @@ -0,0 +1,30 @@ +## runai list clusters + +[Deprecated] list all available clusters + +``` +runai list clusters [flags] +``` + +### Options + +``` + -h, --help help for clusters + --json Output structure JSON + --table Output structure table + --yaml Output structure YAML +``` + +### Options inherited from parent commands + +``` + --config-file string config file name; can be set by environment variable RUNAI_CLI_CONFIG_FILE (default "config.json") + --config-path string config path; can be set by environment variable RUNAI_CLI_CONFIG_PATH (default "~/.runai/") + -d, --debug enable debug mode + -v, --verbose enable verbose mode +``` + +### SEE ALSO + +* [runai list](runai_list.md) - [Deprecated] display resource list. By default displays the job list + diff --git a/docs/Researcher/cli-reference/new-cli/runai_list_jobs.md b/docs/Researcher/cli-reference/new-cli/runai_list_jobs.md new file mode 100644 index 0000000000..6df39f4e56 --- /dev/null +++ b/docs/Researcher/cli-reference/new-cli/runai_list_jobs.md @@ -0,0 +1,32 @@ +## runai list jobs + +[Deprecated] list all jobs + +``` +runai list jobs [flags] +``` + +### Options + +``` + -A, --all-projects list jobs from all projects + -h, --help help for jobs + --json Output structure JSON + -p, --project string Specify the project to which the command applies. By default, commands apply to the default project. To change the default project use ‘runai config project ’ + --table Output structure table + --yaml Output structure YAML +``` + +### Options inherited from parent commands + +``` + --config-file string config file name; can be set by environment variable RUNAI_CLI_CONFIG_FILE (default "config.json") + --config-path string config path; can be set by environment variable RUNAI_CLI_CONFIG_PATH (default "~/.runai/") + -d, --debug enable debug mode + -v, --verbose enable verbose mode +``` + +### SEE ALSO + +* [runai list](runai_list.md) - [Deprecated] display resource list. By default displays the job list + diff --git a/docs/Researcher/cli-reference/new-cli/runai_list_nodes.md b/docs/Researcher/cli-reference/new-cli/runai_list_nodes.md new file mode 100644 index 0000000000..b324e1fcd8 --- /dev/null +++ b/docs/Researcher/cli-reference/new-cli/runai_list_nodes.md @@ -0,0 +1,30 @@ +## runai list nodes + +[Deprecated] list all nodes + +``` +runai list nodes [flags] +``` + +### Options + +``` + -h, --help help for nodes + --json Output structure JSON + --table Output structure table + --yaml Output structure YAML +``` + +### Options inherited from parent commands + +``` + --config-file string config file name; can be set by environment variable RUNAI_CLI_CONFIG_FILE (default "config.json") + --config-path string config path; can be set by environment variable RUNAI_CLI_CONFIG_PATH (default "~/.runai/") + -d, --debug enable debug mode + -v, --verbose enable verbose mode +``` + +### SEE ALSO + +* [runai list](runai_list.md) - [Deprecated] display resource list. By default displays the job list + diff --git a/docs/Researcher/cli-reference/new-cli/runai_list_projects.md b/docs/Researcher/cli-reference/new-cli/runai_list_projects.md new file mode 100644 index 0000000000..58998b1c26 --- /dev/null +++ b/docs/Researcher/cli-reference/new-cli/runai_list_projects.md @@ -0,0 +1,30 @@ +## runai list projects + +[Deprecated] list all available projects + +``` +runai list projects [flags] +``` + +### Options + +``` + -h, --help help for projects + --json Output structure JSON + --table Output structure table + --yaml Output structure YAML +``` + +### Options inherited from parent commands + +``` + --config-file string config file name; can be set by environment variable RUNAI_CLI_CONFIG_FILE (default "config.json") + --config-path string config path; can be set by environment variable RUNAI_CLI_CONFIG_PATH (default "~/.runai/") + -d, --debug enable debug mode + -v, --verbose enable verbose mode +``` + +### SEE ALSO + +* [runai list](runai_list.md) - [Deprecated] display resource list. By default displays the job list + diff --git a/docs/Researcher/cli-reference/new-cli/runai_login.md b/docs/Researcher/cli-reference/new-cli/runai_login.md new file mode 100644 index 0000000000..1653e23697 --- /dev/null +++ b/docs/Researcher/cli-reference/new-cli/runai_login.md @@ -0,0 +1,44 @@ +## runai login + +login to the control plane + +``` +runai login [flags] +``` + +### Examples + +``` + + # Login using browser + runai login + + # Login using browser with specific port and host + runai login --listen-port=43121 --listen-host=localhost + +``` + +### Options + +``` + -h, --help help for login + --listen-host string the host to listen on for the authentication callback (for browser mode only) (default "localhost") + --listen-port int the port to listen on for the authentication callback (for browser mode only) (default 43121) +``` + +### Options inherited from parent commands + +``` + --config-file string config file name; can be set by environment variable RUNAI_CLI_CONFIG_FILE (default "config.json") + --config-path string config path; can be set by environment variable RUNAI_CLI_CONFIG_PATH (default "~/.runai/") + -d, --debug enable debug mode + -v, --verbose enable verbose mode +``` + +### SEE ALSO + +* [runai](runai.md) - Run:ai Command-line Interface +* [runai login application](runai_login_application.md) - login as an application +* [runai login sso](runai_login_sso.md) - login using sso without browser +* [runai login user](runai_login_user.md) - login for local user without browser + diff --git a/docs/Researcher/cli-reference/new-cli/runai_login_application.md b/docs/Researcher/cli-reference/new-cli/runai_login_application.md new file mode 100644 index 0000000000..1c4bd91cb8 --- /dev/null +++ b/docs/Researcher/cli-reference/new-cli/runai_login_application.md @@ -0,0 +1,47 @@ +## runai login application + +login as an application + +``` +runai login application [flags] +``` + +### Examples + +``` + + # Login interactive using application credentials + runai login app + + # Login using application credentials + login app --name= --secret= --interactive=disabled + + # Login and Save application credentials + login app --name= --secret= --interactive=disabled --save + +``` + +### Options + +``` + -h, --help help for application + --interactive enable set interactive mode (enabled|disabled) + --name string application name + --save save application credentials in config file + --secret string application secret + --secret-file string use application secret from file +``` + +### Options inherited from parent commands + +``` + --config-file string config file name; can be set by environment variable RUNAI_CLI_CONFIG_FILE (default "config.json") + --config-path string config path; can be set by environment variable RUNAI_CLI_CONFIG_PATH (default "~/.runai/") + -d, --debug enable debug mode + -v, --verbose enable verbose mode +``` + +### SEE ALSO + +* [runai login](runai_login.md) - login to the control plane + diff --git a/docs/Researcher/cli-reference/new-cli/runai_login_sso.md b/docs/Researcher/cli-reference/new-cli/runai_login_sso.md new file mode 100644 index 0000000000..b86f8f127b --- /dev/null +++ b/docs/Researcher/cli-reference/new-cli/runai_login_sso.md @@ -0,0 +1,27 @@ +## runai login sso + +login using sso without browser + +``` +runai login sso [flags] +``` + +### Options + +``` + -h, --help help for sso +``` + +### Options inherited from parent commands + +``` + --config-file string config file name; can be set by environment variable RUNAI_CLI_CONFIG_FILE (default "config.json") + --config-path string config path; can be set by environment variable RUNAI_CLI_CONFIG_PATH (default "~/.runai/") + -d, --debug enable debug mode + -v, --verbose enable verbose mode +``` + +### SEE ALSO + +* [runai login](runai_login.md) - login to the control plane + diff --git a/docs/Researcher/cli-reference/new-cli/runai_login_user.md b/docs/Researcher/cli-reference/new-cli/runai_login_user.md new file mode 100644 index 0000000000..5d8da9cd46 --- /dev/null +++ b/docs/Researcher/cli-reference/new-cli/runai_login_user.md @@ -0,0 +1,42 @@ +## runai login user + +login for local user without browser + +### Synopsis + +Login to the control plane using a local user without browser + +``` +runai login user [flags] +``` + +### Examples + +``` + + # Login using user credentials without browser + runai login user --user= --password= + +``` + +### Options + +``` + -h, --help help for user + -p, --password string the password of the given username + -u, --user string the username to login with +``` + +### Options inherited from parent commands + +``` + --config-file string config file name; can be set by environment variable RUNAI_CLI_CONFIG_FILE (default "config.json") + --config-path string config path; can be set by environment variable RUNAI_CLI_CONFIG_PATH (default "~/.runai/") + -d, --debug enable debug mode + -v, --verbose enable verbose mode +``` + +### SEE ALSO + +* [runai login](runai_login.md) - login to the control plane + diff --git a/docs/Researcher/cli-reference/new-cli/runai_logout.md b/docs/Researcher/cli-reference/new-cli/runai_logout.md new file mode 100644 index 0000000000..c100d816ca --- /dev/null +++ b/docs/Researcher/cli-reference/new-cli/runai_logout.md @@ -0,0 +1,27 @@ +## runai logout + +logout from control plane + +``` +runai logout [flags] +``` + +### Options + +``` + -h, --help help for logout +``` + +### Options inherited from parent commands + +``` + --config-file string config file name; can be set by environment variable RUNAI_CLI_CONFIG_FILE (default "config.json") + --config-path string config path; can be set by environment variable RUNAI_CLI_CONFIG_PATH (default "~/.runai/") + -d, --debug enable debug mode + -v, --verbose enable verbose mode +``` + +### SEE ALSO + +* [runai](runai.md) - Run:ai Command-line Interface + diff --git a/docs/Researcher/cli-reference/new-cli/runai_node.md b/docs/Researcher/cli-reference/new-cli/runai_node.md new file mode 100644 index 0000000000..9c01037086 --- /dev/null +++ b/docs/Researcher/cli-reference/new-cli/runai_node.md @@ -0,0 +1,24 @@ +## runai node + +node management + +### Options + +``` + -h, --help help for node +``` + +### Options inherited from parent commands + +``` + --config-file string config file name; can be set by environment variable RUNAI_CLI_CONFIG_FILE (default "config.json") + --config-path string config path; can be set by environment variable RUNAI_CLI_CONFIG_PATH (default "~/.runai/") + -d, --debug enable debug mode + -v, --verbose enable verbose mode +``` + +### SEE ALSO + +* [runai](runai.md) - Run:ai Command-line Interface +* [runai node list](runai_node_list.md) - List node + diff --git a/docs/Researcher/cli-reference/new-cli/runai_node_list.md b/docs/Researcher/cli-reference/new-cli/runai_node_list.md new file mode 100644 index 0000000000..fd5c4cb620 --- /dev/null +++ b/docs/Researcher/cli-reference/new-cli/runai_node_list.md @@ -0,0 +1,30 @@ +## runai node list + +List node + +``` +runai node list [flags] +``` + +### Options + +``` + -h, --help help for list + --json Output structure JSON + --table Output structure table + --yaml Output structure YAML +``` + +### Options inherited from parent commands + +``` + --config-file string config file name; can be set by environment variable RUNAI_CLI_CONFIG_FILE (default "config.json") + --config-path string config path; can be set by environment variable RUNAI_CLI_CONFIG_PATH (default "~/.runai/") + -d, --debug enable debug mode + -v, --verbose enable verbose mode +``` + +### SEE ALSO + +* [runai node](runai_node.md) - node management + diff --git a/docs/Researcher/cli-reference/new-cli/runai_nodepool.md b/docs/Researcher/cli-reference/new-cli/runai_nodepool.md new file mode 100644 index 0000000000..c643813188 --- /dev/null +++ b/docs/Researcher/cli-reference/new-cli/runai_nodepool.md @@ -0,0 +1,28 @@ +## runai nodepool + +node pool management + +``` +runai nodepool [flags] +``` + +### Options + +``` + -h, --help help for nodepool +``` + +### Options inherited from parent commands + +``` + --config-file string config file name; can be set by environment variable RUNAI_CLI_CONFIG_FILE (default "config.json") + --config-path string config path; can be set by environment variable RUNAI_CLI_CONFIG_PATH (default "~/.runai/") + -d, --debug enable debug mode + -v, --verbose enable verbose mode +``` + +### SEE ALSO + +* [runai](runai.md) - Run:ai Command-line Interface +* [runai nodepool list](runai_nodepool_list.md) - List node pool + diff --git a/docs/Researcher/cli-reference/new-cli/runai_nodepool_list.md b/docs/Researcher/cli-reference/new-cli/runai_nodepool_list.md new file mode 100644 index 0000000000..38febb47ae --- /dev/null +++ b/docs/Researcher/cli-reference/new-cli/runai_nodepool_list.md @@ -0,0 +1,30 @@ +## runai nodepool list + +List node pool + +``` +runai nodepool list [flags] +``` + +### Options + +``` + -h, --help help for list + --json Output structure JSON + --table Output structure table + --yaml Output structure YAML +``` + +### Options inherited from parent commands + +``` + --config-file string config file name; can be set by environment variable RUNAI_CLI_CONFIG_FILE (default "config.json") + --config-path string config path; can be set by environment variable RUNAI_CLI_CONFIG_PATH (default "~/.runai/") + -d, --debug enable debug mode + -v, --verbose enable verbose mode +``` + +### SEE ALSO + +* [runai nodepool](runai_nodepool.md) - node pool management + diff --git a/docs/Researcher/cli-reference/new-cli/runai_project.md b/docs/Researcher/cli-reference/new-cli/runai_project.md new file mode 100644 index 0000000000..40af0ae4f1 --- /dev/null +++ b/docs/Researcher/cli-reference/new-cli/runai_project.md @@ -0,0 +1,30 @@ +## runai project + +project management + +``` +runai project [flags] +``` + +### Options + +``` + -h, --help help for project + --interactive enable set interactive mode (enabled|disabled) +``` + +### Options inherited from parent commands + +``` + --config-file string config file name; can be set by environment variable RUNAI_CLI_CONFIG_FILE (default "config.json") + --config-path string config path; can be set by environment variable RUNAI_CLI_CONFIG_PATH (default "~/.runai/") + -d, --debug enable debug mode + -v, --verbose enable verbose mode +``` + +### SEE ALSO + +* [runai](runai.md) - Run:ai Command-line Interface +* [runai project list](runai_project_list.md) - list available project +* [runai project set](runai_project_set.md) - set project context + diff --git a/docs/Researcher/cli-reference/new-cli/runai_project_list.md b/docs/Researcher/cli-reference/new-cli/runai_project_list.md new file mode 100644 index 0000000000..8ebcd17657 --- /dev/null +++ b/docs/Researcher/cli-reference/new-cli/runai_project_list.md @@ -0,0 +1,30 @@ +## runai project list + +list available project + +``` +runai project list [flags] +``` + +### Options + +``` + -h, --help help for list + --json Output structure JSON + --table Output structure table + --yaml Output structure YAML +``` + +### Options inherited from parent commands + +``` + --config-file string config file name; can be set by environment variable RUNAI_CLI_CONFIG_FILE (default "config.json") + --config-path string config path; can be set by environment variable RUNAI_CLI_CONFIG_PATH (default "~/.runai/") + -d, --debug enable debug mode + -v, --verbose enable verbose mode +``` + +### SEE ALSO + +* [runai project](runai_project.md) - project management + diff --git a/docs/Researcher/cli-reference/new-cli/runai_project_set.md b/docs/Researcher/cli-reference/new-cli/runai_project_set.md new file mode 100644 index 0000000000..2677009fb3 --- /dev/null +++ b/docs/Researcher/cli-reference/new-cli/runai_project_set.md @@ -0,0 +1,28 @@ +## runai project set + +set project context + +``` +runai project set [flags] +``` + +### Options + +``` + -h, --help help for set + --name string set default project name +``` + +### Options inherited from parent commands + +``` + --config-file string config file name; can be set by environment variable RUNAI_CLI_CONFIG_FILE (default "config.json") + --config-path string config path; can be set by environment variable RUNAI_CLI_CONFIG_PATH (default "~/.runai/") + -d, --debug enable debug mode + -v, --verbose enable verbose mode +``` + +### SEE ALSO + +* [runai project](runai_project.md) - project management + diff --git a/docs/Researcher/cli-reference/new-cli/runai_report.md b/docs/Researcher/cli-reference/new-cli/runai_report.md new file mode 100644 index 0000000000..d7ca36bdc7 --- /dev/null +++ b/docs/Researcher/cli-reference/new-cli/runai_report.md @@ -0,0 +1,24 @@ +## runai report + +report management + +### Options + +``` + -h, --help help for report +``` + +### Options inherited from parent commands + +``` + --config-file string config file name; can be set by environment variable RUNAI_CLI_CONFIG_FILE (default "config.json") + --config-path string config path; can be set by environment variable RUNAI_CLI_CONFIG_PATH (default "~/.runai/") + -d, --debug enable debug mode + -v, --verbose enable verbose mode +``` + +### SEE ALSO + +* [runai](runai.md) - Run:ai Command-line Interface +* [runai report metrics](runai_report_metrics.md) - metrics management + diff --git a/docs/Researcher/cli-reference/new-cli/runai_report_metrics.md b/docs/Researcher/cli-reference/new-cli/runai_report_metrics.md new file mode 100644 index 0000000000..1b3fa01a89 --- /dev/null +++ b/docs/Researcher/cli-reference/new-cli/runai_report_metrics.md @@ -0,0 +1,26 @@ +## runai report metrics + +metrics management + +### Options + +``` + -h, --help help for metrics +``` + +### Options inherited from parent commands + +``` + --config-file string config file name; can be set by environment variable RUNAI_CLI_CONFIG_FILE (default "config.json") + --config-path string config path; can be set by environment variable RUNAI_CLI_CONFIG_PATH (default "~/.runai/") + -d, --debug enable debug mode + -v, --verbose enable verbose mode +``` + +### SEE ALSO + +* [runai report](runai_report.md) - report management +* [runai report metrics clear](runai_report_metrics_clear.md) - metrics logs deletion +* [runai report metrics config](runai_report_metrics_config.md) - metrics configuration +* [runai report metrics output](runai_report_metrics_output.md) - metrics logs output + diff --git a/docs/Researcher/cli-reference/new-cli/runai_report_metrics_clear.md b/docs/Researcher/cli-reference/new-cli/runai_report_metrics_clear.md new file mode 100644 index 0000000000..f2f579172e --- /dev/null +++ b/docs/Researcher/cli-reference/new-cli/runai_report_metrics_clear.md @@ -0,0 +1,27 @@ +## runai report metrics clear + +metrics logs deletion + +``` +runai report metrics clear [flags] +``` + +### Options + +``` + -h, --help help for clear +``` + +### Options inherited from parent commands + +``` + --config-file string config file name; can be set by environment variable RUNAI_CLI_CONFIG_FILE (default "config.json") + --config-path string config path; can be set by environment variable RUNAI_CLI_CONFIG_PATH (default "~/.runai/") + -d, --debug enable debug mode + -v, --verbose enable verbose mode +``` + +### SEE ALSO + +* [runai report metrics](runai_report_metrics.md) - metrics management + diff --git a/docs/Researcher/cli-reference/new-cli/runai_report_metrics_config.md b/docs/Researcher/cli-reference/new-cli/runai_report_metrics_config.md new file mode 100644 index 0000000000..1dca4fd23c --- /dev/null +++ b/docs/Researcher/cli-reference/new-cli/runai_report_metrics_config.md @@ -0,0 +1,32 @@ +## runai report metrics config + +metrics configuration + +``` +runai report metrics config [flags] +``` + +### Options + +``` + --age int metrics max file age (default 14) + --files int metrics max file number (default 30) + -h, --help help for config + --metrics enable metrics enable flag (enabled|disabled) + --size int metrics max file size (default 10) + --type reporter report generated type (none|logger|local) +``` + +### Options inherited from parent commands + +``` + --config-file string config file name; can be set by environment variable RUNAI_CLI_CONFIG_FILE (default "config.json") + --config-path string config path; can be set by environment variable RUNAI_CLI_CONFIG_PATH (default "~/.runai/") + -d, --debug enable debug mode + -v, --verbose enable verbose mode +``` + +### SEE ALSO + +* [runai report metrics](runai_report_metrics.md) - metrics management + diff --git a/docs/Researcher/cli-reference/new-cli/runai_report_metrics_output.md b/docs/Researcher/cli-reference/new-cli/runai_report_metrics_output.md new file mode 100644 index 0000000000..74904a2b98 --- /dev/null +++ b/docs/Researcher/cli-reference/new-cli/runai_report_metrics_output.md @@ -0,0 +1,28 @@ +## runai report metrics output + +metrics logs output + +``` +runai report metrics output [flags] +``` + +### Options + +``` + -h, --help help for output + --tail int number of tail metrics (default 100) +``` + +### Options inherited from parent commands + +``` + --config-file string config file name; can be set by environment variable RUNAI_CLI_CONFIG_FILE (default "config.json") + --config-path string config path; can be set by environment variable RUNAI_CLI_CONFIG_PATH (default "~/.runai/") + -d, --debug enable debug mode + -v, --verbose enable verbose mode +``` + +### SEE ALSO + +* [runai report metrics](runai_report_metrics.md) - metrics management + diff --git a/docs/Researcher/cli-reference/new-cli/runai_training.md b/docs/Researcher/cli-reference/new-cli/runai_training.md new file mode 100644 index 0000000000..b9eadd7f15 --- /dev/null +++ b/docs/Researcher/cli-reference/new-cli/runai_training.md @@ -0,0 +1,30 @@ +## runai training + +training management + +### Options + +``` + -h, --help help for training + --interactive enable set interactive mode (enabled|disabled) +``` + +### Options inherited from parent commands + +``` + --config-file string config file name; can be set by environment variable RUNAI_CLI_CONFIG_FILE (default "config.json") + --config-path string config path; can be set by environment variable RUNAI_CLI_CONFIG_PATH (default "~/.runai/") + -d, --debug enable debug mode + -v, --verbose enable verbose mode +``` + +### SEE ALSO + +* [runai](runai.md) - Run:ai Command-line Interface +* [runai training delete](runai_training_delete.md) - delete training workload +* [runai training list](runai_training_list.md) - list training +* [runai training logs](runai_training_logs.md) - logs management +* [runai training resume](runai_training_resume.md) - resume training +* [runai training submit](runai_training_submit.md) - submit training +* [runai training suspend](runai_training_suspend.md) - suspend training + diff --git a/docs/Researcher/cli-reference/new-cli/runai_training_delete.md b/docs/Researcher/cli-reference/new-cli/runai_training_delete.md new file mode 100644 index 0000000000..03ef8faec7 --- /dev/null +++ b/docs/Researcher/cli-reference/new-cli/runai_training_delete.md @@ -0,0 +1,37 @@ +## runai training delete + +delete training workload + +``` +runai training delete [flags] +``` + +### Examples + +``` +runai training delete --name= (optional)--project= +runai training delete --uuid= +``` + +### Options + +``` + -h, --help help for delete + --name string The name of the workload + --project string Specify the project to which the command applies. By default, commands apply to the default project. To change the default project use ‘runai config project ’ + --uuid string The UUID of the workload +``` + +### Options inherited from parent commands + +``` + --config-file string config file name; can be set by environment variable RUNAI_CLI_CONFIG_FILE (default "config.json") + --config-path string config path; can be set by environment variable RUNAI_CLI_CONFIG_PATH (default "~/.runai/") + -d, --debug enable debug mode + -v, --verbose enable verbose mode +``` + +### SEE ALSO + +* [runai training](runai_training.md) - training management + diff --git a/docs/Researcher/cli-reference/new-cli/runai_training_list.md b/docs/Researcher/cli-reference/new-cli/runai_training_list.md new file mode 100644 index 0000000000..f3820840c1 --- /dev/null +++ b/docs/Researcher/cli-reference/new-cli/runai_training_list.md @@ -0,0 +1,42 @@ +## runai training list + +list training + +``` +runai training list [flags] +``` + +### Examples + +``` +runai training list -A +runai training list --state= --limit=20 +``` + +### Options + +``` + -A, --all list jobs from all projects + -h, --help help for list + --json Output structure JSON + --limit int32 number of workload in list, (default 50) (default 50) + --offset int32 offset number of limit, default 0 (first offset) + --project string Specify the project to which the command applies. By default, commands apply to the default project. To change the default project use ‘runai config project ’ + --state string filter by workload state + --table Output structure table + --yaml Output structure YAML +``` + +### Options inherited from parent commands + +``` + --config-file string config file name; can be set by environment variable RUNAI_CLI_CONFIG_FILE (default "config.json") + --config-path string config path; can be set by environment variable RUNAI_CLI_CONFIG_PATH (default "~/.runai/") + -d, --debug enable debug mode + -v, --verbose enable verbose mode +``` + +### SEE ALSO + +* [runai training](runai_training.md) - training management + diff --git a/docs/Researcher/cli-reference/new-cli/runai_training_logs.md b/docs/Researcher/cli-reference/new-cli/runai_training_logs.md new file mode 100644 index 0000000000..df86aea47e --- /dev/null +++ b/docs/Researcher/cli-reference/new-cli/runai_training_logs.md @@ -0,0 +1,76 @@ +## runai training logs + +logs management + +``` +runai training logs [flags] +``` + +### Examples + +``` + # Get logs for a training + runai training logs training-01 + + # Get logs for a specific pod in a training + runai training logs training-01 --pod=training-01-0 + + # Get logs for a specific container in a training + runai training logs training-01 --container=container-01 + + # Get the last 100 lines of logs + runai training logs training-01 --tail=100 + + # Get logs with timestamps + runai training logs training-01 --timestamps + + # Follow the logs + runai training logs training-01 --follow + + # Get logs for the previous instance of the training + runai training logs training-01 --previous + + # Limit the logs to 1024 bytes + runai training logs training-01 --limit-bytes=1024 + + # Get logs since the last 5 minutes + runai training logs training-01 --since=300s + + # Get logs since a specific timestamp + runai training logs training-01 --since-time=2023-05-30T10:00:00Z + + # Wait up to 30 seconds for training to be ready for logs + runai training logs training-01 --wait-timeout=30s +``` + +### Options + +``` + -c, --container string Container name for log extraction + -f, --follow Follow log output + -h, --help help for logs + --limit-bytes int Limit the number of bytes returned from the server + --pod string Job pod ID for log extraction, default: master (0-0) + --previous Show previous pod log output + -p, --project string Specify the project to which the command applies. By default, commands apply to the default project. To change the default project use ‘runai config project ’ + --since duration Return logs newer than a relative duration like 5s, 2m, or 3h. Defaults to all logs + --since-time string Return logs after a specific date (RFC3339) + --tail int Numer of tailed lines to fetch from the log, for no limit set to -1 (default -1) + --timestamps Show timestamps in log output + --wait-timeout duration Timeout for waiting for workload to be ready for log streaming + --workload-name string Set job name for log extraction +``` + +### Options inherited from parent commands + +``` + --config-file string config file name; can be set by environment variable RUNAI_CLI_CONFIG_FILE (default "config.json") + --config-path string config path; can be set by environment variable RUNAI_CLI_CONFIG_PATH (default "~/.runai/") + -d, --debug enable debug mode + -v, --verbose enable verbose mode +``` + +### SEE ALSO + +* [runai training](runai_training.md) - training management + diff --git a/docs/Researcher/cli-reference/new-cli/runai_training_resume.md b/docs/Researcher/cli-reference/new-cli/runai_training_resume.md new file mode 100644 index 0000000000..326eedba29 --- /dev/null +++ b/docs/Researcher/cli-reference/new-cli/runai_training_resume.md @@ -0,0 +1,37 @@ +## runai training resume + +resume training + +``` +runai training resume [flags] +``` + +### Examples + +``` +runai training resume --name= --project= +runai training resume --uuid= +``` + +### Options + +``` + -h, --help help for resume + --name string The name of the workload + --project string Specify the project to which the command applies. By default, commands apply to the default project. To change the default project use ‘runai config project ’ + --uuid string The UUID of the workload +``` + +### Options inherited from parent commands + +``` + --config-file string config file name; can be set by environment variable RUNAI_CLI_CONFIG_FILE (default "config.json") + --config-path string config path; can be set by environment variable RUNAI_CLI_CONFIG_PATH (default "~/.runai/") + -d, --debug enable debug mode + -v, --verbose enable verbose mode +``` + +### SEE ALSO + +* [runai training](runai_training.md) - training management + diff --git a/docs/Researcher/cli-reference/new-cli/runai_training_submit.md b/docs/Researcher/cli-reference/new-cli/runai_training_submit.md new file mode 100644 index 0000000000..6035d29c6b --- /dev/null +++ b/docs/Researcher/cli-reference/new-cli/runai_training_submit.md @@ -0,0 +1,84 @@ +## runai training submit + +submit training + +``` +runai training submit [flags] +``` + +### Examples + +``` +runai training submit --name= --project= -i=gcr.io/run-ai-demo/quickstart +``` + +### Options + +``` + --allow-privilege-escalation Allow the job to gain additional privileges after starting + --annotations stringArray Set of annotations to populate into the container running the workspace + --args string container arguments + --auto-deletion-time-after-completion duration The length of time (like 5s, 2m, or 3h, higher than zero) after which a completed job is automatically deleted (default 0s) + --backoff-limit int The number of times the job will be retried before failing + -c, --command string command + --completions int32 Number of successful pods required for this job to be completed. Used with HPO + --configmap-map-volume stringArray Mount ConfigMap as a volume. Use the fhe format name=CONFIGMAP_NAME,path=PATH + --cpu-core-limit float CPU core limit (e.g. 0.5, 1) + --cpu-core-request float CPU core request (e.g. 0.5, 1) + --cpu-memory-limit string CPU memory limit to allocate for the job (e.g. 1G, 500M) + --cpu-memory-request string CPU memory to allocate for the job (e.g. 1G, 500M) + --create-home-dir Create a temporary home directory. Defaults to true when --run-as-user is set, false otherwise + -e, --environment stringArray Set environment variables in the container + --existing-pvc stringArray Mount an existing persistent volume. Use the format: claimname=CLAIM_NAME,path=PATH + --extended-resources stringArray Request access to an extended resource. Use the format: resource_name=quantity + --external-url stringArray Expose URL from the job container. Use the format: container=9443,url=https://external.runai.com,authusers=user1,authgroups=group1 + --git-sync stringArray Specifies git repositories to mount into the container. Use the format: name=NAME,repository=REPO,path=PATH,secret=SECRET,rev=REVISION + -g, --gpu-devices-request int32 GPU units to allocate for the job (e.g. 1, 2) + --gpu-memory-limit string GPU memory limit to allocate for the job (e.g. 1G, 500M) + --gpu-memory-request string GPU memory to allocate for the job (e.g. 1G, 500M) + --gpu-portion-limit float GPU portion limit, must be no less than the gpu-memory-request (between 0 and 1, e.g. 0.5, 0.2) + --gpu-portion-request float GPU portion request (between 0 and 1, e.g. 0.5, 0.2) + --gpu-request-type string GPU request type (portion|memory|mig) + -h, --help help for submit + --host-ipc Whether to enable host IPC. (Default: false) + --host-network Whether to enable host networking. (Default: false) + --host-path stringArray Volumes to mount into the container. Use the format: path=PATH,mount=MOUNT,mount-propagation=None|HostToContainer,readwrite + -i, --image string The image for the workload + --image-pull-policy string Set image pull policy. One of: Always, IfNotPresent, Never. Defaults to Always (default "Always") + --labels stringArray Set of labels to populate into the container running the workspace + --large-shm-request Request large /dev/shm device to mount + --mig-profile string MIG profile to allocate for the job (1g.5gb, 2g.10gb, 3g.20gb, 4g.20gb, 7g.40gb) + --name string The name of the workload + --new-pvc stringArray Mount a persistent volume, create it if it does not exist. Use the format: claimname=CLAIM_NAME,storageclass=STORAGE_CLASS,size=SIZE,path=PATH,accessmode-rwo,accessmode-rom,accessmode-rwm,ro,ephemeral + --nfs stringArray s3 storage details. Use the format: path=PATH,server=SERVER,mountpath=MOUNT_PATH,readwrite + --node-pool stringArray List of node pools to use for scheduling the job, ordered by priority + --node-type string Enforce node type affinity by setting a node-type label + --parallelism int32 Number of pods to run in parallel at any given time. Used with HPO + --port stringArray Expose ports from the job container. Use the format: service-type=NodePort,container=80,external=8080 + --preferred-pod-topology-key string If possible, all pods of this job will be scheduled onto nodes that have a label with this key and identical values + --prefix Set defined prefix for the job name + --project string Specify the project to which the command applies. By default, commands apply to the default project. To change the default project use ‘runai config project ’ + --required-pod-topology-key string Enforce scheduling pods of this job onto nodes that have a label with this key and identical values + --run-as-group int Run in the context of the current CLI group rather than the root group + --run-as-user int Run in the context of the current CLI user rather than the root user + --s3 stringArray s3 storage details. Use the format: name=NAME,bucket=BUCKET,path=PATH,accesskey=ACCESS_KEY,url=URL + --seccomp-profile string Indicates which kind of seccomp profile will be applied to the container, options: RuntimeDefault|Unconfined|Localhost + --supplemental-groups string Comma seperated list of groups that the user running the container belongs to, in addition to the group indicated by --run-as-gid + --toleration stringArray Toleration details. Use the format: operator=Equal|Exists,key=KEY,[value=VALUE],[effect=NoSchedule|NoExecute|PreferNoSchedule],[seconds=SECONDS] + --user-group-source string Indicate the way to determine the user and group ids of the container, options: fromTheImage|fromIdpToken|fromIdpToken + --working-dir string Set the container's working directory +``` + +### Options inherited from parent commands + +``` + --config-file string config file name; can be set by environment variable RUNAI_CLI_CONFIG_FILE (default "config.json") + --config-path string config path; can be set by environment variable RUNAI_CLI_CONFIG_PATH (default "~/.runai/") + -d, --debug enable debug mode + -v, --verbose enable verbose mode +``` + +### SEE ALSO + +* [runai training](runai_training.md) - training management + diff --git a/docs/Researcher/cli-reference/new-cli/runai_training_suspend.md b/docs/Researcher/cli-reference/new-cli/runai_training_suspend.md new file mode 100644 index 0000000000..768f3ae4e8 --- /dev/null +++ b/docs/Researcher/cli-reference/new-cli/runai_training_suspend.md @@ -0,0 +1,37 @@ +## runai training suspend + +suspend training + +``` +runai training suspend [flags] +``` + +### Examples + +``` +runai training --name= --project= +runai training suspend --uuid= +``` + +### Options + +``` + -h, --help help for suspend + --name string The name of the workload + --project string Specify the project to which the command applies. By default, commands apply to the default project. To change the default project use ‘runai config project ’ + --uuid string The UUID of the workload +``` + +### Options inherited from parent commands + +``` + --config-file string config file name; can be set by environment variable RUNAI_CLI_CONFIG_FILE (default "config.json") + --config-path string config path; can be set by environment variable RUNAI_CLI_CONFIG_PATH (default "~/.runai/") + -d, --debug enable debug mode + -v, --verbose enable verbose mode +``` + +### SEE ALSO + +* [runai training](runai_training.md) - training management + diff --git a/docs/Researcher/cli-reference/new-cli/runai_upgrade.md b/docs/Researcher/cli-reference/new-cli/runai_upgrade.md new file mode 100644 index 0000000000..c4ed5659b5 --- /dev/null +++ b/docs/Researcher/cli-reference/new-cli/runai_upgrade.md @@ -0,0 +1,28 @@ +## runai upgrade + +upgrades the CLI to the latest version + +``` +runai upgrade [flags] +``` + +### Options + +``` + --force upgrade CLI without checking for new version + -h, --help help for upgrade +``` + +### Options inherited from parent commands + +``` + --config-file string config file name; can be set by environment variable RUNAI_CLI_CONFIG_FILE (default "config.json") + --config-path string config path; can be set by environment variable RUNAI_CLI_CONFIG_PATH (default "~/.runai/") + -d, --debug enable debug mode + -v, --verbose enable verbose mode +``` + +### SEE ALSO + +* [runai](runai.md) - Run:ai Command-line Interface + diff --git a/docs/Researcher/cli-reference/new-cli/runai_version.md b/docs/Researcher/cli-reference/new-cli/runai_version.md new file mode 100644 index 0000000000..ae808df258 --- /dev/null +++ b/docs/Researcher/cli-reference/new-cli/runai_version.md @@ -0,0 +1,28 @@ +## runai version + +print version information + +``` +runai version [flags] +``` + +### Options + +``` + -h, --help help for version + --wide print full version details +``` + +### Options inherited from parent commands + +``` + --config-file string config file name; can be set by environment variable RUNAI_CLI_CONFIG_FILE (default "config.json") + --config-path string config path; can be set by environment variable RUNAI_CLI_CONFIG_PATH (default "~/.runai/") + -d, --debug enable debug mode + -v, --verbose enable verbose mode +``` + +### SEE ALSO + +* [runai](runai.md) - Run:ai Command-line Interface + diff --git a/docs/Researcher/cli-reference/new-cli/runai_workload.md b/docs/Researcher/cli-reference/new-cli/runai_workload.md new file mode 100644 index 0000000000..5cb04da194 --- /dev/null +++ b/docs/Researcher/cli-reference/new-cli/runai_workload.md @@ -0,0 +1,26 @@ +## runai workload + +workload management + +### Options + +``` + -h, --help help for workload + --interactive enable set interactive mode (enabled|disabled) +``` + +### Options inherited from parent commands + +``` + --config-file string config file name; can be set by environment variable RUNAI_CLI_CONFIG_FILE (default "config.json") + --config-path string config path; can be set by environment variable RUNAI_CLI_CONFIG_PATH (default "~/.runai/") + -d, --debug enable debug mode + -v, --verbose enable verbose mode +``` + +### SEE ALSO + +* [runai](runai.md) - Run:ai Command-line Interface +* [runai workload list](runai_workload_list.md) - List workloads +* [runai workload logs](runai_workload_logs.md) - logs management + diff --git a/docs/Researcher/cli-reference/new-cli/runai_workload_list.md b/docs/Researcher/cli-reference/new-cli/runai_workload_list.md new file mode 100644 index 0000000000..a9f30737cd --- /dev/null +++ b/docs/Researcher/cli-reference/new-cli/runai_workload_list.md @@ -0,0 +1,36 @@ +## runai workload list + +List workloads + +``` +runai workload list [flags] +``` + +### Options + +``` + -A, --all list jobs from all projects + -h, --help help for list + --json Output structure JSON + --limit int32 number of workload in list, (default 50) (default 50) + --offset int32 offset number of limit, default 0 (first offset) + --project string Specify the project to which the command applies. By default, commands apply to the default project. To change the default project use ‘runai config project ’ + --state string filter by workload state + --table Output structure table + --type string filter by workload type + --yaml Output structure YAML +``` + +### Options inherited from parent commands + +``` + --config-file string config file name; can be set by environment variable RUNAI_CLI_CONFIG_FILE (default "config.json") + --config-path string config path; can be set by environment variable RUNAI_CLI_CONFIG_PATH (default "~/.runai/") + -d, --debug enable debug mode + -v, --verbose enable verbose mode +``` + +### SEE ALSO + +* [runai workload](runai_workload.md) - workload management + diff --git a/docs/Researcher/cli-reference/new-cli/runai_workload_logs.md b/docs/Researcher/cli-reference/new-cli/runai_workload_logs.md new file mode 100644 index 0000000000..4553348539 --- /dev/null +++ b/docs/Researcher/cli-reference/new-cli/runai_workload_logs.md @@ -0,0 +1,77 @@ +## runai workload logs + +logs management + +``` +runai workload logs [flags] +``` + +### Examples + +``` + # Get logs for a workspace + runai workload logs workspace-01 --workload-type=workspace + + # Get logs for a specific pod in a workspace + runai workload logs workspace-01 --workload-type=workspace --pod=workspace-01-0 + + # Get logs for a specific container in a workspace + runai workload logs workspace-01 --workload-type=workspace --container=container-01 + + # Get the last 100 lines of logs + runai workload logs workspace-01 --workload-type=workspace --tail=100 + + # Get logs with timestamps + runai workload logs workspace-01 --workload-type=workspace --timestamps + + # Follow the logs + runai workload logs workspace-01 --workload-type=workspace --follow + + # Get logs for the previous instance of the workspace + runai workload logs workspace-01 --workload-type=workspace --previous + + # Limit the logs to 1024 bytes + runai workload logs workspace-01 --workload-type=workspace --limit-bytes=1024 + + # Get logs since the last 5 minutes + runai workload logs workspace-01 --workload-type=workspace --since=5m + + # Get logs since a specific timestamp + runai workload logs workspace-01 --workload-type=workspace --since-time=2023-05-30T10:00:00Z + + # Wait up to 30 seconds for workload to be ready for logs + runai workload logs workspace-01 --workload-type=workspace --wait-timeout=30s +``` + +### Options + +``` + -c, --container string Container name for log extraction + -f, --follow Follow log output + -h, --help help for logs + --limit-bytes int Limit the number of bytes returned from the server + --pod string Job pod ID for log extraction, default: master (0-0) + --previous Show previous pod log output + -p, --project string Specify the project to which the command applies. By default, commands apply to the default project. To change the default project use ‘runai config project ’ + --since duration Return logs newer than a relative duration like 5s, 2m, or 3h. Defaults to all logs + --since-time string Return logs after a specific date (RFC3339) + --tail int Numer of tailed lines to fetch from the log, for no limit set to -1 (default -1) + --timestamps Show timestamps in log output + --wait-timeout duration Timeout for waiting for workload to be ready for log streaming + --workload-name string Set job name for log extraction + -t, --workload-type string The type of the workload (training, workspace, distributed) +``` + +### Options inherited from parent commands + +``` + --config-file string config file name; can be set by environment variable RUNAI_CLI_CONFIG_FILE (default "config.json") + --config-path string config path; can be set by environment variable RUNAI_CLI_CONFIG_PATH (default "~/.runai/") + -d, --debug enable debug mode + -v, --verbose enable verbose mode +``` + +### SEE ALSO + +* [runai workload](runai_workload.md) - workload management + diff --git a/docs/Researcher/cli-reference/new-cli/runai_workspace.md b/docs/Researcher/cli-reference/new-cli/runai_workspace.md new file mode 100644 index 0000000000..2afed619e0 --- /dev/null +++ b/docs/Researcher/cli-reference/new-cli/runai_workspace.md @@ -0,0 +1,30 @@ +## runai workspace + +workspace management + +### Options + +``` + -h, --help help for workspace + --interactive enable set interactive mode (enabled|disabled) +``` + +### Options inherited from parent commands + +``` + --config-file string config file name; can be set by environment variable RUNAI_CLI_CONFIG_FILE (default "config.json") + --config-path string config path; can be set by environment variable RUNAI_CLI_CONFIG_PATH (default "~/.runai/") + -d, --debug enable debug mode + -v, --verbose enable verbose mode +``` + +### SEE ALSO + +* [runai](runai.md) - Run:ai Command-line Interface +* [runai workspace delete](runai_workspace_delete.md) - delete workspace +* [runai workspace list](runai_workspace_list.md) - list workspace +* [runai workspace logs](runai_workspace_logs.md) - logs management +* [runai workspace resume](runai_workspace_resume.md) - resume workspace +* [runai workspace submit](runai_workspace_submit.md) - submit training +* [runai workspace suspend](runai_workspace_suspend.md) - suspend workspace + diff --git a/docs/Researcher/cli-reference/new-cli/runai_workspace_delete.md b/docs/Researcher/cli-reference/new-cli/runai_workspace_delete.md new file mode 100644 index 0000000000..4a8281f0ae --- /dev/null +++ b/docs/Researcher/cli-reference/new-cli/runai_workspace_delete.md @@ -0,0 +1,37 @@ +## runai workspace delete + +delete workspace + +``` +runai workspace delete [flags] +``` + +### Examples + +``` +runai workspace delete --name= (optional)--project= +runai workspace delete --uuid= +``` + +### Options + +``` + -h, --help help for delete + --name string The name of the workload + --project string Specify the project to which the command applies. By default, commands apply to the default project. To change the default project use ‘runai config project ’ + --uuid string The UUID of the workload +``` + +### Options inherited from parent commands + +``` + --config-file string config file name; can be set by environment variable RUNAI_CLI_CONFIG_FILE (default "config.json") + --config-path string config path; can be set by environment variable RUNAI_CLI_CONFIG_PATH (default "~/.runai/") + -d, --debug enable debug mode + -v, --verbose enable verbose mode +``` + +### SEE ALSO + +* [runai workspace](runai_workspace.md) - workspace management + diff --git a/docs/Researcher/cli-reference/new-cli/runai_workspace_list.md b/docs/Researcher/cli-reference/new-cli/runai_workspace_list.md new file mode 100644 index 0000000000..190d1335b1 --- /dev/null +++ b/docs/Researcher/cli-reference/new-cli/runai_workspace_list.md @@ -0,0 +1,42 @@ +## runai workspace list + +list workspace + +``` +runai workspace list [flags] +``` + +### Examples + +``` +runai workspace list -A +runai workspace list --state= --limit=20 +``` + +### Options + +``` + -A, --all list jobs from all projects + -h, --help help for list + --json Output structure JSON + --limit int32 number of workload in list, (default 50) (default 50) + --offset int32 offset number of limit, default 0 (first offset) + --project string Specify the project to which the command applies. By default, commands apply to the default project. To change the default project use ‘runai config project ’ + --state string filter by workload state + --table Output structure table + --yaml Output structure YAML +``` + +### Options inherited from parent commands + +``` + --config-file string config file name; can be set by environment variable RUNAI_CLI_CONFIG_FILE (default "config.json") + --config-path string config path; can be set by environment variable RUNAI_CLI_CONFIG_PATH (default "~/.runai/") + -d, --debug enable debug mode + -v, --verbose enable verbose mode +``` + +### SEE ALSO + +* [runai workspace](runai_workspace.md) - workspace management + diff --git a/docs/Researcher/cli-reference/new-cli/runai_workspace_logs.md b/docs/Researcher/cli-reference/new-cli/runai_workspace_logs.md new file mode 100644 index 0000000000..697ed8a1c2 --- /dev/null +++ b/docs/Researcher/cli-reference/new-cli/runai_workspace_logs.md @@ -0,0 +1,76 @@ +## runai workspace logs + +logs management + +``` +runai workspace logs [flags] +``` + +### Examples + +``` + # Get logs for a workspace + runai workspace logs workspace-01 + + # Get logs for a specific pod in a workspace + runai workspace logs workspace-01 --pod=workspace-01-0 + + # Get logs for a specific container in a workspace + runai workspace logs workspace-01 --container=container-01 + + # Get the last 100 lines of logs + runai workspace logs workspace-01 --tail=100 + + # Get logs with timestamps + runai workspace logs workspace-01 --timestamps + + # Follow the logs + runai workspace logs workspace-01 --follow + + # Get logs for the previous instance of the workspace + runai workspace logs workspace-01 --previous + + # Limit the logs to 1024 bytes + runai workspace logs workspace-01 --limit-bytes=1024 + + # Get logs since the last 5 minutes + runai workspace logs workspace-01 --since=300s + + # Get logs since a specific timestamp + runai workspace logs workspace-01 --since-time=2023-05-30T10:00:00Z + + # Wait up to 30 seconds for workspace to be ready for logs + runai workspace logs workspace-01 --wait-timeout=30s +``` + +### Options + +``` + -c, --container string Container name for log extraction + -f, --follow Follow log output + -h, --help help for logs + --limit-bytes int Limit the number of bytes returned from the server + --pod string Job pod ID for log extraction, default: master (0-0) + --previous Show previous pod log output + -p, --project string Specify the project to which the command applies. By default, commands apply to the default project. To change the default project use ‘runai config project ’ + --since duration Return logs newer than a relative duration like 5s, 2m, or 3h. Defaults to all logs + --since-time string Return logs after a specific date (RFC3339) + --tail int Numer of tailed lines to fetch from the log, for no limit set to -1 (default -1) + --timestamps Show timestamps in log output + --wait-timeout duration Timeout for waiting for workload to be ready for log streaming + --workload-name string Set job name for log extraction +``` + +### Options inherited from parent commands + +``` + --config-file string config file name; can be set by environment variable RUNAI_CLI_CONFIG_FILE (default "config.json") + --config-path string config path; can be set by environment variable RUNAI_CLI_CONFIG_PATH (default "~/.runai/") + -d, --debug enable debug mode + -v, --verbose enable verbose mode +``` + +### SEE ALSO + +* [runai workspace](runai_workspace.md) - workspace management + diff --git a/docs/Researcher/cli-reference/new-cli/runai_workspace_resume.md b/docs/Researcher/cli-reference/new-cli/runai_workspace_resume.md new file mode 100644 index 0000000000..4a8ae0cb56 --- /dev/null +++ b/docs/Researcher/cli-reference/new-cli/runai_workspace_resume.md @@ -0,0 +1,37 @@ +## runai workspace resume + +resume workspace + +``` +runai workspace resume [flags] +``` + +### Examples + +``` +runai workspace resume --name= --project= +runai workspace resume --uuid= +``` + +### Options + +``` + -h, --help help for resume + --name string The name of the workload + --project string Specify the project to which the command applies. By default, commands apply to the default project. To change the default project use ‘runai config project ’ + --uuid string The UUID of the workload +``` + +### Options inherited from parent commands + +``` + --config-file string config file name; can be set by environment variable RUNAI_CLI_CONFIG_FILE (default "config.json") + --config-path string config path; can be set by environment variable RUNAI_CLI_CONFIG_PATH (default "~/.runai/") + -d, --debug enable debug mode + -v, --verbose enable verbose mode +``` + +### SEE ALSO + +* [runai workspace](runai_workspace.md) - workspace management + diff --git a/docs/Researcher/cli-reference/new-cli/runai_workspace_submit.md b/docs/Researcher/cli-reference/new-cli/runai_workspace_submit.md new file mode 100644 index 0000000000..cf6070bd13 --- /dev/null +++ b/docs/Researcher/cli-reference/new-cli/runai_workspace_submit.md @@ -0,0 +1,83 @@ +## runai workspace submit + +submit training + +``` +runai workspace submit [flags] +``` + +### Examples + +``` +runai workspace submit --name= --project= -i=gcr.io/run-ai-demo/quickstart +``` + +### Options + +``` + --allow-privilege-escalation Allow the job to gain additional privileges after starting + --annotations stringArray Set of annotations to populate into the container running the workspace + --args string container arguments + --auto-deletion-time-after-completion duration The length of time (like 5s, 2m, or 3h, higher than zero) after which a completed job is automatically deleted (default 0s) + --backoff-limit int The number of times the job will be retried before failing + -c, --command string command + --configmap-map-volume stringArray Mount ConfigMap as a volume. Use the fhe format name=CONFIGMAP_NAME,path=PATH + --cpu-core-limit float CPU core limit (e.g. 0.5, 1) + --cpu-core-request float CPU core request (e.g. 0.5, 1) + --cpu-memory-limit string CPU memory limit to allocate for the job (e.g. 1G, 500M) + --cpu-memory-request string CPU memory to allocate for the job (e.g. 1G, 500M) + --create-home-dir Create a temporary home directory. Defaults to true when --run-as-user is set, false otherwise + -e, --environment stringArray Set environment variables in the container + --existing-pvc stringArray Mount an existing persistent volume. Use the format: claimname=CLAIM_NAME,path=PATH + --extended-resources stringArray Request access to an extended resource. Use the format: resource_name=quantity + --external-url stringArray Expose URL from the job container. Use the format: container=9443,url=https://external.runai.com,authusers=user1,authgroups=group1 + --git-sync stringArray Specifies git repositories to mount into the container. Use the format: name=NAME,repository=REPO,path=PATH,secret=SECRET,rev=REVISION + -g, --gpu-devices-request int32 GPU units to allocate for the job (e.g. 1, 2) + --gpu-memory-limit string GPU memory limit to allocate for the job (e.g. 1G, 500M) + --gpu-memory-request string GPU memory to allocate for the job (e.g. 1G, 500M) + --gpu-portion-limit float GPU portion limit, must be no less than the gpu-memory-request (between 0 and 1, e.g. 0.5, 0.2) + --gpu-portion-request float GPU portion request (between 0 and 1, e.g. 0.5, 0.2) + --gpu-request-type string GPU request type (portion|memory|mig) + -h, --help help for submit + --host-ipc Whether to enable host IPC. (Default: false) + --host-network Whether to enable host networking. (Default: false) + --host-path stringArray Volumes to mount into the container. Use the format: path=PATH,mount=MOUNT,mount-propagation=None|HostToContainer,readwrite + -i, --image string The image for the workload + --image-pull-policy string Set image pull policy. One of: Always, IfNotPresent, Never. Defaults to Always (default "Always") + --labels stringArray Set of labels to populate into the container running the workspace + --large-shm-request Request large /dev/shm device to mount + --mig-profile string MIG profile to allocate for the job (1g.5gb, 2g.10gb, 3g.20gb, 4g.20gb, 7g.40gb) + --name string The name of the workload + --new-pvc stringArray Mount a persistent volume, create it if it does not exist. Use the format: claimname=CLAIM_NAME,storageclass=STORAGE_CLASS,size=SIZE,path=PATH,accessmode-rwo,accessmode-rom,accessmode-rwm,ro,ephemeral + --nfs stringArray s3 storage details. Use the format: path=PATH,server=SERVER,mountpath=MOUNT_PATH,readwrite + --node-pool stringArray List of node pools to use for scheduling the job, ordered by priority + --node-type string Enforce node type affinity by setting a node-type label + --port stringArray Expose ports from the job container. Use the format: service-type=NodePort,container=80,external=8080 + --preemptible Interactive preemptible jobs can be scheduled above guaranteed quota but may be reclaimed at any time + --preferred-pod-topology-key string If possible, all pods of this job will be scheduled onto nodes that have a label with this key and identical values + --prefix Set defined prefix for the job name + --project string Specify the project to which the command applies. By default, commands apply to the default project. To change the default project use ‘runai config project ’ + --required-pod-topology-key string Enforce scheduling pods of this job onto nodes that have a label with this key and identical values + --run-as-group int Run in the context of the current CLI group rather than the root group + --run-as-user int Run in the context of the current CLI user rather than the root user + --s3 stringArray s3 storage details. Use the format: name=NAME,bucket=BUCKET,path=PATH,accesskey=ACCESS_KEY,url=URL + --seccomp-profile string Indicates which kind of seccomp profile will be applied to the container, options: RuntimeDefault|Unconfined|Localhost + --supplemental-groups string Comma seperated list of groups that the user running the container belongs to, in addition to the group indicated by --run-as-gid + --toleration stringArray Toleration details. Use the format: operator=Equal|Exists,key=KEY,[value=VALUE],[effect=NoSchedule|NoExecute|PreferNoSchedule],[seconds=SECONDS] + --user-group-source string Indicate the way to determine the user and group ids of the container, options: fromTheImage|fromIdpToken|fromIdpToken + --working-dir string Set the container's working directory +``` + +### Options inherited from parent commands + +``` + --config-file string config file name; can be set by environment variable RUNAI_CLI_CONFIG_FILE (default "config.json") + --config-path string config path; can be set by environment variable RUNAI_CLI_CONFIG_PATH (default "~/.runai/") + -d, --debug enable debug mode + -v, --verbose enable verbose mode +``` + +### SEE ALSO + +* [runai workspace](runai_workspace.md) - workspace management + diff --git a/docs/Researcher/cli-reference/new-cli/runai_workspace_suspend.md b/docs/Researcher/cli-reference/new-cli/runai_workspace_suspend.md new file mode 100644 index 0000000000..d22d8b3869 --- /dev/null +++ b/docs/Researcher/cli-reference/new-cli/runai_workspace_suspend.md @@ -0,0 +1,37 @@ +## runai workspace suspend + +suspend workspace + +``` +runai workspace suspend [flags] +``` + +### Examples + +``` +runai workspace --name= --project= +runai workspace suspend --uuid= +``` + +### Options + +``` + -h, --help help for suspend + --name string The name of the workload + --project string Specify the project to which the command applies. By default, commands apply to the default project. To change the default project use ‘runai config project ’ + --uuid string The UUID of the workload +``` + +### Options inherited from parent commands + +``` + --config-file string config file name; can be set by environment variable RUNAI_CLI_CONFIG_FILE (default "config.json") + --config-path string config path; can be set by environment variable RUNAI_CLI_CONFIG_PATH (default "~/.runai/") + -d, --debug enable debug mode + -v, --verbose enable verbose mode +``` + +### SEE ALSO + +* [runai workspace](runai_workspace.md) - workspace management + diff --git a/mkdocs.yml b/mkdocs.yml index 25437fbb8b..7f7446e9b5 100644 --- a/mkdocs.yml +++ b/mkdocs.yml @@ -238,21 +238,6 @@ nav: - 'Runai StatefulSet No Available Replicas' : 'admin/troubleshooting/alertmanager/RunaiStatefulSetNoAvailableReplicas.md' - 'Best Practices' : - 'From Docker to Run:ai ' : 'admin/researcher-setup/docker-to-runai.md' -# - 'Integrations' : -# - 'JupyterHub' : 'admin/integration/jupyterhub.md' -# - 'Airflow' : 'admin/integration/airflow.md' -# - 'MLflow' : 'admin/integration/mlflow.md' -# - 'Kubeflow' : 'admin/integration/kubeflow.md' -# - 'Seldon Core' : 'admin/integration/seldon.md' -# - 'ClearML' : 'admin/integration/clearml.md' -# - 'Argo Workflows' : 'admin/integration/argo-workflows.md' -# - 'KubeVirt (VM)' : 'admin/integration/kubevirt.md' -# - 'Weights & Biases' : 'admin/integration/weights-and-biases.md' -# - 'Event Messaging': 'admin/integration/messaging.md' -# - 'DeepSpeed': 'admin/integration/deepspeed.md' -# - 'Comet' : 'admin/integration/comet.md' -# - 'Spark' : 'admin/integration/spark.md' -# - 'Ray' : 'admin/integration/ray.md' - 'Researcher' : - 'Overview' : 'Researcher/overview-researcher.md' - 'Quickstart Guides' : @@ -282,31 +267,81 @@ nav: - 'Create a Workspace' : 'Researcher/user-interface/workspaces/create/workspace-v2.md' - 'Statuses' : 'Researcher/user-interface/workspaces/statuses.md' - 'Trainings' : 'Researcher/user-interface/trainings.md' - - 'CLI Reference' : - - 'Introduction' : 'Researcher/cli-reference/Introduction.md' - - 'runai attach' : 'Researcher/cli-reference/runai-attach.md' - - 'runai bash' : 'Researcher/cli-reference/runai-bash.md' - - 'runai config' : 'Researcher/cli-reference/runai-config.md' - - 'runai delete' : 'Researcher/cli-reference/runai-delete.md' - - 'runai describe' : 'Researcher/cli-reference/runai-describe.md' - - 'runai exec' : 'Researcher/cli-reference/runai-exec.md' - - 'runai list' : 'Researcher/cli-reference/runai-list.md' - - 'runai login' : 'Researcher/cli-reference/runai-login.md' - - 'runai logout' : 'Researcher/cli-reference/runai-logout.md' - - 'runai logs' : 'Researcher/cli-reference/runai-logs.md' - - 'runai port-forward' : 'Researcher/cli-reference/runai-port-forwarding.md' - - 'runai resume' : 'Researcher/cli-reference/runai-resume.md' - - 'runai submit' : 'Researcher/cli-reference/runai-submit.md' - - 'runai submit-dist mpi' : 'Researcher/cli-reference/runai-submit-dist-mpi.md' - - 'runai submit-dist pytorch' : 'Researcher/cli-reference/runai-submit-dist-pytorch.md' - - 'runai submit-dist tf' : 'Researcher/cli-reference/runai-submit-dist-TF.md' - - 'runai submit-dist xgboost' : 'Researcher/cli-reference/runai-submit-dist-xgboost.md' - - 'runai suspend' : 'Researcher/cli-reference/runai-suspend.md' - - 'runai top node' : 'Researcher/cli-reference/runai-top-node.md' - # - 'runai top job' : 'Researcher/cli-reference/runai-top-job.md' - - 'runai update' : 'Researcher/cli-reference/runai-update.md' - - 'runai version' : 'Researcher/cli-reference/runai-version.md' - - 'runai whoami' : 'Researcher/cli-reference/runai-whoami.md' + - 'Command Line Interface (CLI) Reference' : + - 'CLI V2': + - 'Introduction': 'Researcher/cli-reference/new-cli/runai.md' + - 'Researcher/cli-reference/new-cli/runai_cluster.md' + - 'Researcher/cli-reference/new-cli/runai_cluster_list.md' + - 'Researcher/cli-reference/new-cli/runai_cluster_set.md' + - 'Researcher/cli-reference/new-cli/runai_config.md' + - 'Researcher/cli-reference/new-cli/runai_config_generate.md' + - 'Researcher/cli-reference/new-cli/runai_config_set.md' + - 'Researcher/cli-reference/new-cli/runai_list.md' + - 'Researcher/cli-reference/new-cli/runai_list_clusters.md' + - 'Researcher/cli-reference/new-cli/runai_list_jobs.md' + - 'Researcher/cli-reference/new-cli/runai_list_nodes.md' + - 'Researcher/cli-reference/new-cli/runai_list_projects.md' + - 'Researcher/cli-reference/new-cli/runai_login.md' + - 'Researcher/cli-reference/new-cli/runai_login_application.md' + - 'Researcher/cli-reference/new-cli/runai_login_sso.md' + - 'Researcher/cli-reference/new-cli/runai_login_user.md' + - 'Researcher/cli-reference/new-cli/runai_logout.md' + - 'Researcher/cli-reference/new-cli/runai_node.md' + - 'Researcher/cli-reference/new-cli/runai_node_list.md' + - 'Researcher/cli-reference/new-cli/runai_nodepool.md' + - 'Researcher/cli-reference/new-cli/runai_nodepool_list.md' + - 'Researcher/cli-reference/new-cli/runai_project.md' + - 'Researcher/cli-reference/new-cli/runai_project_list.md' + - 'Researcher/cli-reference/new-cli/runai_project_set.md' + - 'Researcher/cli-reference/new-cli/runai_report.md' + - 'Researcher/cli-reference/new-cli/runai_report_metrics.md' + - 'Researcher/cli-reference/new-cli/runai_report_metrics_clear.md' + - 'Researcher/cli-reference/new-cli/runai_report_metrics_config.md' + - 'Researcher/cli-reference/new-cli/runai_report_metrics_output.md' + - 'Researcher/cli-reference/new-cli/runai_training.md' + - 'Researcher/cli-reference/new-cli/runai_training_delete.md' + - 'Researcher/cli-reference/new-cli/runai_training_list.md' + - 'Researcher/cli-reference/new-cli/runai_training_logs.md' + - 'Researcher/cli-reference/new-cli/runai_training_resume.md' + - 'Researcher/cli-reference/new-cli/runai_training_submit.md' + - 'Researcher/cli-reference/new-cli/runai_training_suspend.md' + - 'Researcher/cli-reference/new-cli/runai_upgrade.md' + - 'Researcher/cli-reference/new-cli/runai_version.md' + - 'Researcher/cli-reference/new-cli/runai_workload.md' + - 'Researcher/cli-reference/new-cli/runai_workload_list.md' + - 'Researcher/cli-reference/new-cli/runai_workload_logs.md' + - 'Researcher/cli-reference/new-cli/runai_workspace.md' + - 'Researcher/cli-reference/new-cli/runai_workspace_delete.md' + - 'Researcher/cli-reference/new-cli/runai_workspace_list.md' + - 'Researcher/cli-reference/new-cli/runai_workspace_logs.md' + - 'Researcher/cli-reference/new-cli/runai_workspace_resume.md' + - 'Researcher/cli-reference/new-cli/runai_workspace_submit.md' + - 'Researcher/cli-reference/new-cli/runai_workspace_suspend.md' + - 'CLI V1': + - 'Introduction' : 'Researcher/cli-reference/Introduction.md' + - 'runai attach' : 'Researcher/cli-reference/runai-attach.md' + - 'runai bash' : 'Researcher/cli-reference/runai-bash.md' + - 'runai config' : 'Researcher/cli-reference/runai-config.md' + - 'runai delete' : 'Researcher/cli-reference/runai-delete.md' + - 'runai describe' : 'Researcher/cli-reference/runai-describe.md' + - 'runai exec' : 'Researcher/cli-reference/runai-exec.md' + - 'runai list' : 'Researcher/cli-reference/runai-list.md' + - 'runai login' : 'Researcher/cli-reference/runai-login.md' + - 'runai logout' : 'Researcher/cli-reference/runai-logout.md' + - 'runai logs' : 'Researcher/cli-reference/runai-logs.md' + - 'runai port-forward' : 'Researcher/cli-reference/runai-port-forwarding.md' + - 'runai resume' : 'Researcher/cli-reference/runai-resume.md' + - 'runai submit' : 'Researcher/cli-reference/runai-submit.md' + - 'runai submit-dist mpi' : 'Researcher/cli-reference/runai-submit-dist-mpi.md' + - 'runai submit-dist pytorch' : 'Researcher/cli-reference/runai-submit-dist-pytorch.md' + - 'runai submit-dist tf' : 'Researcher/cli-reference/runai-submit-dist-TF.md' + - 'runai submit-dist xgboost' : 'Researcher/cli-reference/runai-submit-dist-xgboost.md' + - 'runai suspend' : 'Researcher/cli-reference/runai-suspend.md' + - 'runai top node' : 'Researcher/cli-reference/runai-top-node.md' + # - 'runai top job' : 'Researcher/cli-reference/runai-top-job.md' + - 'runai update' : 'Researcher/cli-reference/runai-update.md' + - 'runai version' : 'Researcher/cli-reference/runai-version.md' + - 'runai whoami' : 'Researcher/cli-reference/runai-whoami.md' - 'Best Practices' : - 'Bare-Metal to Docker Images' : 'Researcher/best-practices/bare-metal-to-docker-images.md' - 'Convert a Workload to Run Unattended' : 'Researcher/best-practices/convert-to-unattended.md' From 89d9e4ead78f64544399de018c16c050cdc18f93 Mon Sep 17 00:00:00 2001 From: JamieWeider72 <147967555+JamieWeider72@users.noreply.github.com> Date: Tue, 18 Jun 2024 16:31:42 +0300 Subject: [PATCH 18/87] RUN-16860-added-info-for-editing-and-viewing --- docs/admin/runai-setup/authentication/sso.md | 24 +++++++++++++------- 1 file changed, 16 insertions(+), 8 deletions(-) diff --git a/docs/admin/runai-setup/authentication/sso.md b/docs/admin/runai-setup/authentication/sso.md index c49b3bfe93..b31d243e90 100644 --- a/docs/admin/runai-setup/authentication/sso.md +++ b/docs/admin/runai-setup/authentication/sso.md @@ -31,14 +31,14 @@ To define OAuthClient, follow these steps: 1. Create a new ```OAuthClient``` Kubernetes object with the following content ``` - apiVersion: oauth.openshift.io/v1 - grantMethod: auto - kind: OAuthClient - metadata: - name: my-client - redirectURIs: +apiVersion: oauth.openshift.io/v1 +grantMethod: auto +kind: OAuthClient +metadata: +name: my-client +redirectURIs: - https:///auth/realms/runai/broker/openshift-v4/endpoint - secret: this-is-my-secret +secret: this-is-my-secret ``` 2. Run the following command to apply the OAuthClient object to the environment. Create the object on OpenShift cluster where you define your OpenShift IDP: ``` @@ -88,7 +88,7 @@ You can configure your IdP to map several IdP attributes: Press `Download` to download the file. - Pres `Edit` to both download the file, and view the: + Press `Edit` to both download the file, and view the: * Identity provider URL. * Identity provider entity ID. @@ -103,6 +103,14 @@ You can configure your IdP to map several IdP attributes: 5. In the `User attributes` field enter the attribute and the value in the identity provider. (optional) 6.When complete, press `Save`. + After you have configured the OIDC settings, you can view and edit the identity provider settings. + + Press `Edit` to view and edit the: + + * Discovery URL. + * Client ID. + * Client secret. + === "OpenShift V4" 1. In the `Discovery URL` field, enter the discovery URL . From 93d9d8f71f2b270925e13b0e4ed3d2245c5df1ef Mon Sep 17 00:00:00 2001 From: JamieWeider72 <147967555+JamieWeider72@users.noreply.github.com> Date: Tue, 18 Jun 2024 16:43:10 +0300 Subject: [PATCH 19/87] Updated --- docs/admin/runai-setup/authentication/sso.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/admin/runai-setup/authentication/sso.md b/docs/admin/runai-setup/authentication/sso.md index b31d243e90..4f99b7b063 100644 --- a/docs/admin/runai-setup/authentication/sso.md +++ b/docs/admin/runai-setup/authentication/sso.md @@ -12,7 +12,7 @@ Run:ai supports SSO using the [SAML 2.0](https://en.wikipedia.org/wiki/Security_ *Identity Provider (Idp)*— a system that creates, maintains, and manages identity information. Example IdPs: Google, Keycloak, Salesforce, Auth0. -## SAML Prerequisites +## SAML 2 Prerequisites **XML Metadata**—you must have an *XML Metadata file* retrieved from your IdP. Upload the file to a web server so that you have a URL to the file. The URL must have the *XML* file extension. For example, to connect using Google, you must create a custom SAML App [here](https://admin.google.com/ac/apps/unified){target=_blank}, download the Metadata file, and upload it to a web server. From 1e6477567cb1a6cfe15632c02231e7df2d71d204 Mon Sep 17 00:00:00 2001 From: JamieWeider72 <147967555+JamieWeider72@users.noreply.github.com> Date: Wed, 19 Jun 2024 10:44:57 +0300 Subject: [PATCH 20/87] RUN-16044-removed-limitation --- docs/admin/runai-setup/authentication/sso.md | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) diff --git a/docs/admin/runai-setup/authentication/sso.md b/docs/admin/runai-setup/authentication/sso.md index 4f99b7b063..d85af04d46 100644 --- a/docs/admin/runai-setup/authentication/sso.md +++ b/docs/admin/runai-setup/authentication/sso.md @@ -12,18 +12,22 @@ Run:ai supports SSO using the [SAML 2.0](https://en.wikipedia.org/wiki/Security_ *Identity Provider (Idp)*— a system that creates, maintains, and manages identity information. Example IdPs: Google, Keycloak, Salesforce, Auth0. -## SAML 2 Prerequisites +## Prerequisites + +For each of the SSO options, there are prerequisites that should be considered. + +### SAML 2 **XML Metadata**—you must have an *XML Metadata file* retrieved from your IdP. Upload the file to a web server so that you have a URL to the file. The URL must have the *XML* file extension. For example, to connect using Google, you must create a custom SAML App [here](https://admin.google.com/ac/apps/unified){target=_blank}, download the Metadata file, and upload it to a web server. -## OIDC Prerequisites +### OIDC * **Discovery URL**—the OpenID server where the content discovery information is published. * **ClientID**—the ID used to identify the client with the Authorization Server. * **Client Secret**—a secret password that only the Client and Authorization Server know. -## OpenShift Prerequisites +### OpenShift V4 Before using OpenShift, first define OAuthClient to control various aspects of the OAuth flow, such as redirect URIs and authentication methods to ensure secure and approprpriate access to resources. @@ -49,7 +53,7 @@ oc apply oc get oauthclient ``` -### Additional attribute mappings +## Additional attribute mappings You can configure your IdP to map several IdP attributes: From 71fae4ed7c6bfca2756c4c9df9085fe03db02c68 Mon Sep 17 00:00:00 2001 From: JamieWeider72 <147967555+JamieWeider72@users.noreply.github.com> Date: Wed, 19 Jun 2024 10:47:10 +0300 Subject: [PATCH 21/87] RUN-16044-Removed Limitation --- .../self-hosted/ocp/additional-clusters.md | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/docs/admin/runai-setup/self-hosted/ocp/additional-clusters.md b/docs/admin/runai-setup/self-hosted/ocp/additional-clusters.md index 04d633d5e8..62e00a2ac9 100644 --- a/docs/admin/runai-setup/self-hosted/ocp/additional-clusters.md +++ b/docs/admin/runai-setup/self-hosted/ocp/additional-clusters.md @@ -1,17 +1,18 @@ -# Installing additional Clusters +# Installing additional clusters The first Run:ai cluster is typically installed on the same OpenShift cluster as the Run:ai control plane. Run:ai supports multiple clusters per single control plane. This document is about installing additional clusters on different OpenShift clusters. -The instructions are for Run:ai version __2.13__ and up. +The instructions are for Run:ai version **2.13** and up. ## Configuration -The exact configuration details must be worked together with Run:ai customer support. -## Additional Cluster Installation +The exact configuration details must be worked on together with Run:ai customer support. + +## Additional cluster installation Create a new cluster, then: -* Select a target platform `OpenShift` +* Select a target platform `OpenShift` * Select a Cluster location `Remote to Control Plane`. * You must enter a specific cluster URL with the format `https://runai.apps.`. To get the base Domain run `oc get dns cluster -oyaml | grep baseDomain` * Ignore the instructions for creating a secret. From 7037119306c1a5537b58bc81c5ba32db5ea704d8 Mon Sep 17 00:00:00 2001 From: JamieWeider72 <147967555+JamieWeider72@users.noreply.github.com> Date: Wed, 19 Jun 2024 13:17:00 +0300 Subject: [PATCH 22/87] Update sso.md --- docs/admin/runai-setup/authentication/sso.md | 19 +++++++++++-------- 1 file changed, 11 insertions(+), 8 deletions(-) diff --git a/docs/admin/runai-setup/authentication/sso.md b/docs/admin/runai-setup/authentication/sso.md index d85af04d46..b8dd53f9db 100644 --- a/docs/admin/runai-setup/authentication/sso.md +++ b/docs/admin/runai-setup/authentication/sso.md @@ -2,7 +2,7 @@ Single Sign-On (SSO) is an authentication scheme allowing users to log in with a single ID to other, independent, software systems. SSO solves security issues involving multiple user/password data entries, multiple compliance schemes, etc. -Run:ai supports SSO using the [SAML 2.0](https://en.wikipedia.org/wiki/Security_Assertion_Markup_Language){target=_blank} protocol, Open ID Connect [OIDC](https://openid.net/developers/how-connect-works/){target=_blank} and [OpenShift V4](https://en.wikipedia.org/wiki/OpenShift){target=_blank}. +Run:ai supports SSO using the [SAML 2.0](https://en.wikipedia.org/wiki/Security_Assertion_Markup_Language){target=_blank} protocol, Open ID Connect [OIDC](https://openid.net/developers/how-connect-works/){target=_blank} and [OpenShift V4](https://en.wikipedia.org/wiki/OpenShift){target=_blank} (which is based on OIDC). !!! Caution @@ -29,7 +29,7 @@ For each of the SSO options, there are prerequisites that should be considered. ### OpenShift V4 -Before using OpenShift, first define OAuthClient to control various aspects of the OAuth flow, such as redirect URIs and authentication methods to ensure secure and approprpriate access to resources. +Before using OpenShift, first define OAuthClient. The OAuth client interacts with OpenShift’s OAuth server to authenticate users and request access tokens. To define OAuthClient, follow these steps: @@ -44,6 +44,9 @@ redirectURIs: - https:///auth/realms/runai/broker/openshift-v4/endpoint secret: this-is-my-secret ``` +Replace `` with the URL of your Run:ai platform. +Replace `my-client` and `this-is-my-secret` with client name and secret you have chosen. + 2. Run the following command to apply the OAuthClient object to the environment. Create the object on OpenShift cluster where you define your OpenShift IDP: ``` oc apply @@ -75,9 +78,9 @@ You can configure your IdP to map several IdP attributes: 1. Press the `Tools & Settings` then press `General`. 2. Open the `Security` pane and press `+Identity provider`. -3. Select the SSO protocol. Choose `SAML 2` or `Open ID Connect`. +3. Select the SSO protocol. Choose `Custom SAML 2.0`, `Custom OpenID Connect` or `OpenShift V4`. - === "SAML 2" + === "SAML 2.0" 1. Choose `From computer` or `From URL`. @@ -103,7 +106,7 @@ You can configure your IdP to map several IdP attributes: 1. In the `Discovery URL` field, enter the discovery URL . 2. In the `Client ID` field, enter the client ID. 3. In the `Client Secret` field, enter the client secret. - 4. Add the OIDC scope to be used during authentication to authorize access to a user's details. Each scope returns a set of user attributes. The scope must match the names in your identity provider. + 4. Add the OIDC scope to be used during authentication to authorize access to a user's details (optional). Each scope returns a set of user attributes. The scope must match the names in your identity provider. 5. In the `User attributes` field enter the attribute and the value in the identity provider. (optional) 6.When complete, press `Save`. @@ -117,11 +120,11 @@ You can configure your IdP to map several IdP attributes: === "OpenShift V4" - 1. In the `Discovery URL` field, enter the discovery URL . + 1. In the `Base URL` field, enter the OpenShift Base URL (https://api.:6443). 2. In the `Client ID` field, enter the client ID. 3. In the `Client Secret` field, enter the client secret. - 4. Add the OIDC scope to be used during authentication to authorize access to a user's details. Each scope returns a set of user attributes. The scope must match the names in your identity provider. - 5. In the `User attributes` field enter the attribute and the value in the identity provider. (optional) + 4. Add the OIDC scope to be used during authentication to authorize access to a user's details (optional). Each scope returns a set of user attributes. The scope must match the names in your identity provider. + 5. In the `User attributes` field enter the attribute and the value in the identity provider (optional). 6. When complete, press `Save`. 4. In the `Logout uri` field, enter the desired URL logout page. If left empty, you will be redirected to the Run:ai portal. From 5cb9ffdd21f95eb3e8a525979c6c4eabfbf9a65d Mon Sep 17 00:00:00 2001 From: JamieWeider72 <147967555+JamieWeider72@users.noreply.github.com> Date: Wed, 19 Jun 2024 13:24:04 +0300 Subject: [PATCH 23/87] Update sso.md --- docs/admin/runai-setup/authentication/sso.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/admin/runai-setup/authentication/sso.md b/docs/admin/runai-setup/authentication/sso.md index b8dd53f9db..551d499a35 100644 --- a/docs/admin/runai-setup/authentication/sso.md +++ b/docs/admin/runai-setup/authentication/sso.md @@ -62,11 +62,11 @@ You can configure your IdP to map several IdP attributes: | IdP attribute | Default Run:ai name | Description | |--|--|--| -| User email | email (cannot be changed) | **(Mandatory)** `e-mail` is the user identifier with Run:ai. | -| User role groups | GROUPS | (Optional) If exists, allows assigning Run:ai role groups via the IdP. The IdP attribute must be of a type of list of strings. See more below | | Linux User ID | UID | (Optional) If exists in IdP, allows Researcher containers to start with the Linux User `UID`. Used to map access to network resources such as file systems to users. The IdP attribute must be of integer type. | | Linux Group ID | GID | (Optional) If exists in IdP, allows Researcher containers to start with the Linux Group `GID`. The IdP attribute must be of integer type. | +| User role groups | GROUPS | (Optional) If exists, allows assigning Run:ai role groups via the IdP. The IdP attribute must be of a type of list of strings. See more below | | Linux Supplementary Groups | SUPPLEMENTARYGROUPS | (Optional) If exists in IdP, allows Researcher containers to start with the relevant Linux supplementary groups. The IdP attribute must be of a type of list of integers. | +| Email | Email | (Optional) Defines the user attribute holding the user's email address, which is the user identifier in Run:ai | | User first name | firstName | (Optional) Used as the first name showing in the Run:ai user interface. | | User last name | lastName | (Optional) Used as the last name showing in the Run:ai user interface | From 82cfc6c463ccf8af6d1b2a1e983bc707f5c8b4fb Mon Sep 17 00:00:00 2001 From: JamieWeider72 <147967555+JamieWeider72@users.noreply.github.com> Date: Wed, 19 Jun 2024 13:26:56 +0300 Subject: [PATCH 24/87] Update additional-clusters.md --- .../runai-setup/self-hosted/ocp/additional-clusters.md | 6 ------ 1 file changed, 6 deletions(-) diff --git a/docs/admin/runai-setup/self-hosted/ocp/additional-clusters.md b/docs/admin/runai-setup/self-hosted/ocp/additional-clusters.md index 62e00a2ac9..1ae316fdfd 100644 --- a/docs/admin/runai-setup/self-hosted/ocp/additional-clusters.md +++ b/docs/admin/runai-setup/self-hosted/ocp/additional-clusters.md @@ -2,12 +2,6 @@ The first Run:ai cluster is typically installed on the same OpenShift cluster as the Run:ai control plane. Run:ai supports multiple clusters per single control plane. This document is about installing additional clusters on different OpenShift clusters. -The instructions are for Run:ai version **2.13** and up. - -## Configuration - -The exact configuration details must be worked on together with Run:ai customer support. - ## Additional cluster installation Create a new cluster, then: From a8b5a9c2d45de708f104fcf3341a0fe7a8645e2c Mon Sep 17 00:00:00 2001 From: Yaron Date: Wed, 19 Jun 2024 14:15:52 +0300 Subject: [PATCH 25/87] 2-18-compatible-picture --- docs/home/img/multi-cluster-architecture.png | Bin 130360 -> 252975 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/docs/home/img/multi-cluster-architecture.png b/docs/home/img/multi-cluster-architecture.png index e0869c8998657d352dc60a41967dbcc7749bce53..c577d4c1cc35d687a304b1cc78047e014c3a0a63 100644 GIT binary patch literal 252975 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 SAl(5jD?DBOT-G@yGywn_ysb$9 From d66467eb9b515462f4145b6972325418ed6fd99b Mon Sep 17 00:00:00 2001 From: jasonnovichRunAI <124490127+jasonnovichRunAI@users.noreply.github.com> Date: Wed, 19 Jun 2024 14:47:36 +0300 Subject: [PATCH 26/87] Rename vale-linting.yml to vale-linting.yml.old --- .github/workflows/{vale-linting.yml => vale-linting.yml.old} | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename .github/workflows/{vale-linting.yml => vale-linting.yml.old} (100%) diff --git a/.github/workflows/vale-linting.yml b/.github/workflows/vale-linting.yml.old similarity index 100% rename from .github/workflows/vale-linting.yml rename to .github/workflows/vale-linting.yml.old From 5d42fc6918edb14ada7033e20aec5e3b405d1c6c Mon Sep 17 00:00:00 2001 From: jasonnovichRunAI <124490127+jasonnovichRunAI@users.noreply.github.com> Date: Wed, 19 Jun 2024 15:26:24 +0300 Subject: [PATCH 27/87] RUN-18432 add data volues partial --- docs/developer/admin-rest-api/data-volumes.md | 108 ++++++++++++++++++ 1 file changed, 108 insertions(+) create mode 100644 docs/developer/admin-rest-api/data-volumes.md diff --git a/docs/developer/admin-rest-api/data-volumes.md b/docs/developer/admin-rest-api/data-volumes.md new file mode 100644 index 0000000000..bcc60dc45d --- /dev/null +++ b/docs/developer/admin-rest-api/data-volumes.md @@ -0,0 +1,108 @@ +--- +title: Data Volumes +summary: This article is about what is a data volume and how to configure them for use in the Run:ai platform. +authors: + - Jason Novich +date: 2024-Jun-19 +--- + +Data Volumes offer a powerful solution for storing, managing, and sharing AI training data within your Run.ai environment. This functionality promotes collaboration, simplifies data access control, and streamlines the AI development lifecycle. + +## What are Data Volumes + +Data Volumes are snapshots of datasets stored in Kubernetes Persistent Volume Claims (PVCs). They act as a central repository for training data, and offer several key benefits. + +* Managed with dedicated permissions—Data admins, a new role within Run.ai, have exclusive control over data volume creation, data population, and sharing. +* Shared between multiple scopes—Unlike other Run:ai data sources, data volumes can be shared across projects, departments, or clusters. This promotes data reuse and collaboration within your organization. +* Coupled to workloads in the submission process— Similar to other Run:ai data sources, Data volumes can be easily attached to AI workloads during submission, specifying the data path within the workload environment. + +!!! Note + Data volumes are not versioned. + +## Data volumes use cases + +The following are typical use cases for Data Volumes: + +* Sharing large data sets with multiple researchers in my organization—Sometimes we have data located in a remote location. After moving it inside the cluster, sharing it easily with multiple users is still hard. Data volumes can help you do that seamlessly and with maximum security and control +* Sharing data created during the AI work cycle—When it is needed to share training results, generated data sets or other artifacts with our team members. Data volume helps you take your data and share it with your colleagues. + +## Data volumes authorization + +There is now a new role called `Data Volumes Administrator` which contains the following two sets of permissions and allows you to manage your Data Volumes easily. + +Data Volumes administrator contains two permission entities: + +* Data volumes - CRUD +* Data volumes - sharing list - CRUD + +Data volumes (should have the origin project in the scope) + +* Can create DV in the scope +* Can read DV in the scope +* Can update DV  in the scope +* Can delete DV in the scope (even if DV is shared out of its scope) + +Data volumes - sharing list + +* Can Share DV in the scope +* Can unshare DV from the scope + +### Data volume administrator permissions + +| Entity | Permissions | +| --- | --- | +| Data volumes  | CRUD | +| Data volumes - sharing list | CRUD | +| Account | R | +| Department | R | +| Project | R | +| Jobs | R | +| Workloads | R | +| Cluster | R | +| Overview dashboard | R | +| Consumption dashboard | R | +| Analytics dashboard | R | +| Policies | R | +| workloads | R | +| Workspaces | R | +| Trainings | R | +| Environments | R | +| Compute resources | R | +| Templates | R | +| Data source | R | +| Inferences | R | + +### Data volume permissions for each role + +| Role | DV permissions | +| --- | --- | +| Data volume administrator | DV CRUD, Sharing CRUD | +| System administrator | DV CRUD, Sharing CRUD | +| Department admin | DV CRUD, Sharing CRUD | +| Department viewer | DV R, Sharing R | +| Researcher manager | DV CRUD, Sharing CRUD | +| Editor | DV CRUD | +| L1 | DV CRUD | +| L2 | DV R | +| ML engineer | DV R | +| Assets admins  | DV R | +| Application admin | DV R | +| Cloud operator  | DV CRUD, Sharing CRUD | +| Viewer | DV R | + +## Using Data volumes + +This section outlines the procedure for creating, sharing, and submitting (Researcher) data volumes. + +### Creating Data Volumes + +!!! Note + Data volume admins can create data volumes within specific projects. Since data volumes are created from PVCs, there has to be a PVC in the namespace of a run:ai project for Run:Ai to have access to it and create the Data volume from it. Once the DV is created, the admin manages its sharing configurations. + +Data Volumes are created using the API endpoint. + +[Data Volumes](https://app.run.ai/api/docs#tag/Data-Volumes) + +### Sharing Data volumes + +Sharing permissions is a sub-entity of the Data volume management permissions. Meaning they can be assigned independently. A user can have permission to create a DV but not to share it and vice versa. A data volume can be shared with one or multiple scopes. In all the scopes that the DV is shared, it can be used by the users in their workloads. From 4304b560784f1356783368e98831d2e0cb53be49 Mon Sep 17 00:00:00 2001 From: jasonnovichRunAI <124490127+jasonnovichRunAI@users.noreply.github.com> Date: Wed, 19 Jun 2024 15:29:22 +0300 Subject: [PATCH 28/87] RUN-16337 add files --- docs/Researcher/cli-reference/new-cli/runai.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/Researcher/cli-reference/new-cli/runai.md b/docs/Researcher/cli-reference/new-cli/runai.md index 82142135dc..3797c3d566 100644 --- a/docs/Researcher/cli-reference/new-cli/runai.md +++ b/docs/Researcher/cli-reference/new-cli/runai.md @@ -24,7 +24,7 @@ runai [flags] -v, --verbose enable verbose mode ``` -### SEE ALSO +### See Also * [runai cluster](runai_cluster.md)—cluster management * [runai config](runai_config.md)—configuration management From b2bc0ba9f5c8a260923b30fc4b446143cdfbb6de Mon Sep 17 00:00:00 2001 From: JamieWeider72 <147967555+JamieWeider72@users.noreply.github.com> Date: Wed, 19 Jun 2024 16:47:09 +0300 Subject: [PATCH 29/87] Latest Hot Fixes --- docs/home/changelog/hotfixes-2-16.md | 8 ++++++++ docs/home/changelog/hotfixes-2-17.md | 21 +++++++++++++++++++++ docs/home/whats-new-2-18.md | 4 ++++ 3 files changed, 33 insertions(+) create mode 100644 docs/home/changelog/hotfixes-2-17.md diff --git a/docs/home/changelog/hotfixes-2-16.md b/docs/home/changelog/hotfixes-2-16.md index b54447df3a..f6993e55c2 100644 --- a/docs/home/changelog/hotfixes-2-16.md +++ b/docs/home/changelog/hotfixes-2-16.md @@ -8,6 +8,14 @@ date: 2024-Feb-26 The following is a list of the known and fixed issues for Run:ai V2.16. + +## Version 2.16.25 + +| Internal ID | Description | +|--|--| +| RUN-17241 | Fixed an issue where the nodes page showed nodes as not ready to to "tookit not installed". | + + ## Version 2.16.21 | Internal ID | Description | diff --git a/docs/home/changelog/hotfixes-2-17.md b/docs/home/changelog/hotfixes-2-17.md new file mode 100644 index 0000000000..73d369ad10 --- /dev/null +++ b/docs/home/changelog/hotfixes-2-17.md @@ -0,0 +1,21 @@ +--- +title: Changelog Version 2.17 +summary: This article lists the fixed and known issues in the patch versions as well as additional new features that were added in each patch version. +authors: + - Jamie Weider +date: 2024-Jun-19 +--- + +The following is a list of the known and fixed issues for Run:ai V2.17. + +## Version 2.17.25 + +| Internal ID | Description | +|--|--| +| RUN-16357 | Fixed an an issue where the Project button in the jobs screen redirects to the projects page but on the wrong cluster. | + +## Version 2.17.10 + +| Internal ID | Description | +|--|--| +| RUN-12664 | Fixed an issue where the legacy job submission configuration was not available in the Settings page. | diff --git a/docs/home/whats-new-2-18.md b/docs/home/whats-new-2-18.md index a8db407f73..dca0b453b0 100644 --- a/docs/home/whats-new-2-18.md +++ b/docs/home/whats-new-2-18.md @@ -19,6 +19,10 @@ date: 2024-June-14 +### Run:ai Administrator + +#### Authentication and Authorization + ## Deprecation Notifications From cddf4e6a6eb19fc6c657afbaa0367e9701913bba Mon Sep 17 00:00:00 2001 From: jasonnovichRunAI <124490127+jasonnovichRunAI@users.noreply.github.com> Date: Thu, 20 Jun 2024 11:23:48 +0300 Subject: [PATCH 30/87] RUN-19295 add admin section --- docs/home/whats-new-2-18.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/home/whats-new-2-18.md b/docs/home/whats-new-2-18.md index a8db407f73..144b146a84 100644 --- a/docs/home/whats-new-2-18.md +++ b/docs/home/whats-new-2-18.md @@ -18,7 +18,7 @@ date: 2024-June-14 * Added backoff limit functionality to Training and Workspace workloads. The backoff limit is the maximum number of retry attempts for failed workloads. After reaching the limit, the workload's status will change to `Failed`. - +### Run:ai Administrator ## Deprecation Notifications From 931ad260b349d3313a9321c48c6a00cbd706233a Mon Sep 17 00:00:00 2001 From: JamieWeider72 <147967555+JamieWeider72@users.noreply.github.com> Date: Thu, 20 Jun 2024 11:40:43 +0300 Subject: [PATCH 31/87] RUN-19295 Test Update --- docs/home/whats-new-2-18.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/home/whats-new-2-18.md b/docs/home/whats-new-2-18.md index 144b146a84..5d0cf8af3d 100644 --- a/docs/home/whats-new-2-18.md +++ b/docs/home/whats-new-2-18.md @@ -19,7 +19,7 @@ date: 2024-June-14 ### Run:ai Administrator - +New info here ## Deprecation Notifications Deprecation notifications allow you to plan for future changes in the Run:ai Platform. From d0944228490b27f36ed77e31970f68f272e5fbcc Mon Sep 17 00:00:00 2001 From: jasonnovichRunAI <124490127+jasonnovichRunAI@users.noreply.github.com> Date: Thu, 20 Jun 2024 15:56:35 +0300 Subject: [PATCH 32/87] RUN-16337 add download instructions --- docs/Researcher/cli-reference/new-cli/runai.md | 16 +++++++++++++++- mkdocs.yml | 4 ++-- 2 files changed, 17 insertions(+), 3 deletions(-) diff --git a/docs/Researcher/cli-reference/new-cli/runai.md b/docs/Researcher/cli-reference/new-cli/runai.md index 3797c3d566..59ab7e63fb 100644 --- a/docs/Researcher/cli-reference/new-cli/runai.md +++ b/docs/Researcher/cli-reference/new-cli/runai.md @@ -1,5 +1,5 @@ --- -title: Run:ai Command-line Interface +title: Run:ai Enhanced Command-line Interface summary: This article is the summary article for the CLI V2. authors: - Jason Novich @@ -14,6 +14,20 @@ The Run:ai Command-line Interface (CLI) tool for a Researcher to send deep learn runai [flags] ``` +## Installing the Improved Command Line Interface + +!!! Note + * Make sure the flag for the enhanced command line interface is enabled. To enable the Improved Command Line Interface Press the *Tools and Settings* icon, then *General*, then *Workloads*, then enable the *Improved Command Line Interface* toggle. + * Only clusters that are version 2.18 or later are supported. + +To install the Improved Command Line Interface: + +1. Press the *Help* icon, then select *Researcher Command Line Interface*. +2. From the dropdown, select a cluster. +3. Select your operating system. +4. Copy the installer command to your clipboard, then paste it into a terminal window and run the command. +5. Follow the instruction prompts during the installation process. Press `Enter` to use the default values (recommended). + ### Options ``` diff --git a/mkdocs.yml b/mkdocs.yml index 7f7446e9b5..cb6ea54463 100644 --- a/mkdocs.yml +++ b/mkdocs.yml @@ -268,7 +268,7 @@ nav: - 'Statuses' : 'Researcher/user-interface/workspaces/statuses.md' - 'Trainings' : 'Researcher/user-interface/trainings.md' - 'Command Line Interface (CLI) Reference' : - - 'CLI V2': + - 'Improved CLI': - 'Introduction': 'Researcher/cli-reference/new-cli/runai.md' - 'Researcher/cli-reference/new-cli/runai_cluster.md' - 'Researcher/cli-reference/new-cli/runai_cluster_list.md' @@ -317,7 +317,7 @@ nav: - 'Researcher/cli-reference/new-cli/runai_workspace_resume.md' - 'Researcher/cli-reference/new-cli/runai_workspace_submit.md' - 'Researcher/cli-reference/new-cli/runai_workspace_suspend.md' - - 'CLI V1': + - 'Legacy CLI': - 'Introduction' : 'Researcher/cli-reference/Introduction.md' - 'runai attach' : 'Researcher/cli-reference/runai-attach.md' - 'runai bash' : 'Researcher/cli-reference/runai-bash.md' From 85828e6819cf6ec336a41373f85e976ccbe9367f Mon Sep 17 00:00:00 2001 From: jasonnovichRunAI <124490127+jasonnovichRunAI@users.noreply.github.com> Date: Thu, 20 Jun 2024 16:45:33 +0300 Subject: [PATCH 33/87] RUN-19295 added new CLI --- docs/home/whats-new-2-18.md | 13 ++++++++++++- 1 file changed, 12 insertions(+), 1 deletion(-) diff --git a/docs/home/whats-new-2-18.md b/docs/home/whats-new-2-18.md index 5d0cf8af3d..2578e06312 100644 --- a/docs/home/whats-new-2-18.md +++ b/docs/home/whats-new-2-18.md @@ -1,5 +1,5 @@ --- -title: Version 2.17 +title: Version 2.18 summary: This article describes new features and functionality in the version. authors: - Jamie Weider @@ -17,6 +17,17 @@ date: 2024-June-14 * Added backoff limit functionality to Training and Workspace workloads. The backoff limit is the maximum number of retry attempts for failed workloads. After reaching the limit, the workload's status will change to `Failed`. +#### Command Line Interface + +* Added an improved researcher focused Command Line Interface (CLI). The improved CLI brings useablity enhancements for researcher which include: + + * Support multiple clusters + * Self upgrade + * Interactive mode + * Align CLI to be data consistent with UI and API + * Improved usability and performance + + For more information about installing and using the Improved CLI, see [Improved CLI](). ### Run:ai Administrator New info here From aa8c8c483c3604ca101f9161eda8743f85ec23a0 Mon Sep 17 00:00:00 2001 From: jasonnovichRunAI <124490127+jasonnovichRunAI@users.noreply.github.com> Date: Sun, 23 Jun 2024 09:23:03 +0300 Subject: [PATCH 34/87] RUN-18432 add data volumes page and RBAC table --- docs/admin/runai-setup/access-control/rbac.md | 17 +++++++++-------- docs/developer/admin-rest-api/data-volumes.md | 16 +++++++++++++--- 2 files changed, 22 insertions(+), 11 deletions(-) diff --git a/docs/admin/runai-setup/access-control/rbac.md b/docs/admin/runai-setup/access-control/rbac.md index 3d6f0ee808..efd95b5ee4 100644 --- a/docs/admin/runai-setup/access-control/rbac.md +++ b/docs/admin/runai-setup/access-control/rbac.md @@ -25,15 +25,16 @@ Environment administrator | Create, view, edit, and delete *Environments*.
V | Data source administrator| Create, view, edit, and delete *Data sources*.
View *Jobs*, *Workspaces*, *Dashboards*, *Environments*, *Compute resources*, and *Templates*. | | Compute resource administrator | Create, view, edit, and delete *Compute resources*.
View *Jobs*, *Workspaces*, *Dashboards*, *Environments*, *Data sources*, and *Templates*. | | System administrator | Controls all aspects of the system. This role has global system control and should be limited to a small group of skilled IT administrators. | -| Department administrator | Create, view, edit, and delete: *Departments* and *Projects*.
Assign *Roles (Researcher, ML engineer, Research manager, Viewer) within those departments and projects.
View *Dashboards* (including the *Consumption dashboard). | -| Editor | View *Screens* and *Dashboards*
Manage *Departments* and *Projects*. | -| Research manager | Create, view, edit, and delete: *Environments*, *Data sources*, *Compute resources*, *Templates*, and *Projects*
View related *Jobs* and *Workspaces*, and *Dashboards*. | -| L1 researcher | Create, view, edit, and delete *Jobs*, *Workspaces*, *Environments*, *Data sources*, *Compute resources*, *Templates*.
View *Dashboards*. -| ML engineer | Create, edit, view, and delete *Deployments*.
View *Departments*, *Projects*, *Clusters*, *Node-pools*, *Nodes*, *Dashboards*. | -| Viewer | View *Departments*, *Projects*, *Respective subordinates* (Jobs, Deployments, Workspaces, Environments, Data sources, Compute resources, Templates), *Dashboards*.
A viewer cannot edit *Configurations*. | -| L2 researcher | Create, view, edit, and delete *Jobs*, *Workspaces*.
An L2 researcher cannot create, edit, or delete *Environments*, *Data sources*, *Compute resources*, and *Templates*. | +| Department administrator | Create, view, edit, and delete: *Departments*, *Projects* and *Data Volumes (including sharing)*.
Assign *Roles (Researcher, ML engineer, Research manager, Viewer) within those departments and projects.*
View *Dashboards* (including the *Consumption dashboard). | +| Data Volumes administrator | Create, view, edit, and delete: *Data Volumes*, *Data Volumes sharing list*
View: *Account*, *Department*,*Project*, *Jobs*, *Workloads*, *Cluster*, *Overview dashboard*, *Consumption dashboard*, *Analytics dashboard*, *Policies*, *Workloads*, *Workspaces*, *Trainings*, *Environments*, *Compute resources*, *Templates*, *Data source*, *Inferences* | +| Editor | View *Screens* and *Dashboards*
Manage *Departments* and *Projects*.
Create: *Data Volumes* | +| Research manager | Create, view, edit, and delete: *Environments*, *Data sources*, *Compute resources*, *Templates*, *Data Volumes (including sharing)*, and *Projects*
View related *Jobs* and *Workspaces*, and *Dashboards*. | +| L1 researcher | Create, view, edit, and delete *Jobs*, *Workspaces*, *Environments*, *Data sources*, *Compute resources*, *Templates* and *Data Volumes*.
View *Dashboards*. +| ML engineer | Create, edit, view, and delete *Deployments*.
View *Departments*, *Projects*, *Clusters*, *Node-pools*, *Nodes*, *Dashboards* and *Data Volumes*. | +| Viewer | View *Departments*, *Projects*, *Respective subordinates* (Jobs, Deployments, Workspaces, Environments, Data sources, Compute resources, Templates), *Dashboards* and *Data Volumes*.
A viewer cannot edit *Configurations*. | +| L2 researcher | Create, view, edit, and delete *Jobs*, *Workspaces*.
An L2 researcher cannot create, edit, or delete *Environments*, *Data sources*, *Compute resources*, and *Templates*. View: *Data Volumes*| | Template administrator | Create, view, edit, and delete *Templates*.
View *Jobs*, *Workspaces*, *Dashboards*, *Environments*, *Compute resources*, and *Data sources*. | -| Department viewer | View *Departments*, *Projects*, assigned subordinates (*Jobs*, *Deployments*, *Workspaces*, *Environments*, *Data sources*, *Compute resources*, *Templates*), and *Dashboards*. | +| Department viewer | View *Departments*, *Projects*, assigned subordinates (*Jobs*, *Deployments*, *Workspaces*, *Environments*, *Data sources*, *Compute resources*, *Templates*),*Dashboards* and *Data Volumes (including sharing)*. | !!! Note Keep the following in mind when upgrading from versions 2.13 or earlier: diff --git a/docs/developer/admin-rest-api/data-volumes.md b/docs/developer/admin-rest-api/data-volumes.md index bcc60dc45d..e6b6ffc386 100644 --- a/docs/developer/admin-rest-api/data-volumes.md +++ b/docs/developer/admin-rest-api/data-volumes.md @@ -99,10 +99,20 @@ This section outlines the procedure for creating, sharing, and submitting (Resea !!! Note Data volume admins can create data volumes within specific projects. Since data volumes are created from PVCs, there has to be a PVC in the namespace of a run:ai project for Run:Ai to have access to it and create the Data volume from it. Once the DV is created, the admin manages its sharing configurations. -Data Volumes are created using the API endpoint. - -[Data Volumes](https://app.run.ai/api/docs#tag/Data-Volumes) +Data Volumes are created using the API endpoint. For more information, see [Data Volumes](https://app.run.ai/api/docs#tag/Data-Volumes) ### Sharing Data volumes Sharing permissions is a sub-entity of the Data volume management permissions. Meaning they can be assigned independently. A user can have permission to create a DV but not to share it and vice versa. A data volume can be shared with one or multiple scopes. In all the scopes that the DV is shared, it can be used by the users in their workloads. + +Data Volumes are shared using the API endpoint. For more information, see [Data Volumes](https://app.run.ai/api/docs#tag/Data-Volumes). + +### Using Data Volumes in Workloads + +You can attach a data volume to a workload during submission in the same way other data sources are used. You need to specify the desired data path within the data source parameters. + +Researchers can list available data volumes within their permitted scopes for easy selection. + +For more information on using a data volume when submitting a workload, see [Submitting Worklodas](). + +You can also add a data volumes to your workload when submitting a workload via the API. For more information, see [Workloads](https://app.run.ai/api/docs#tag/Workloads). From 2e04e9a143901ee92a56e31f20f4aef3bcd8955a Mon Sep 17 00:00:00 2001 From: jasonnovichRunAI <124490127+jasonnovichRunAI@users.noreply.github.com> Date: Sun, 23 Jun 2024 09:30:23 +0300 Subject: [PATCH 35/87] RUN-19295 add data volumes p1 --- docs/home/whats-new-2-18.md | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/docs/home/whats-new-2-18.md b/docs/home/whats-new-2-18.md index 2578e06312..fa42059877 100644 --- a/docs/home/whats-new-2-18.md +++ b/docs/home/whats-new-2-18.md @@ -30,7 +30,9 @@ date: 2024-June-14 For more information about installing and using the Improved CLI, see [Improved CLI](). ### Run:ai Administrator -New info here + +* Added *Data Volumes* new feature. + ## Deprecation Notifications Deprecation notifications allow you to plan for future changes in the Run:ai Platform. From 36c4177fa0294ad276789786b629e154c8442209 Mon Sep 17 00:00:00 2001 From: jasonnovichRunAI <124490127+jasonnovichRunAI@users.noreply.github.com> Date: Sun, 23 Jun 2024 09:34:03 +0300 Subject: [PATCH 36/87] RUN-19295 data volumes p2 --- docs/home/whats-new-2-18.md | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/docs/home/whats-new-2-18.md b/docs/home/whats-new-2-18.md index fa42059877..efa3e50c86 100644 --- a/docs/home/whats-new-2-18.md +++ b/docs/home/whats-new-2-18.md @@ -31,7 +31,13 @@ date: 2024-June-14 ### Run:ai Administrator -* Added *Data Volumes* new feature. +* Added *Data Volumes* new feature. Data Volumes are snapshots of datasets stored in Kubernetes Persistent Volume Claims (PVCs). They act as a central repository for training data, and offer several key benefits. + + * Managed with dedicated permissions—Data admins, a new role within Run.ai, have exclusive control over data volume creation, data population, and sharing. + * Shared between multiple scopes—Unlike other Run:ai data sources, data volumes can be shared across projects, departments, or clusters. This promotes data reuse and collaboration within your organization. + * Coupled to workloads in the submission process— Similar to other Run:ai data sources, Data volumes can be easily attached to AI workloads during submission, specifying the data path within the workload environment. + + For more information, see [Data Volumes](). ## Deprecation Notifications From e4dbebc59884764fe74c21f968b7e38a7a5dbf7e Mon Sep 17 00:00:00 2001 From: jasonnovichRunAI <124490127+jasonnovichRunAI@users.noreply.github.com> Date: Sun, 23 Jun 2024 11:05:59 +0300 Subject: [PATCH 37/87] RUN-18432 upate mkdocs yaml --- mkdocs.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/mkdocs.yml b/mkdocs.yml index 25437fbb8b..82cacaf834 100644 --- a/mkdocs.yml +++ b/mkdocs.yml @@ -340,6 +340,7 @@ nav: - 'Submit Workload via HTTP/REST' : 'developer/cluster-api/submit-rest.md' - 'Submit CRON job via YAML' : 'developer/cluster-api/submit-cron-yaml.md' - 'Kubernetes Workloads' : 'developer/cluster-api/other-resources.md' + - 'Data Volumes': 'developer/admin-rest-api/data-volumes.md' - 'Reference' : - 'Training Workloads' : 'developer/cluster-api/reference/training.md' - 'Interactive Workloads' : 'developer/cluster-api/reference/interactive.md' From 96ecef82c97e10f2fb7a4ba6339b4cdd0a43cc27 Mon Sep 17 00:00:00 2001 From: jasonnovichRunAI <124490127+jasonnovichRunAI@users.noreply.github.com> Date: Sun, 23 Jun 2024 11:34:29 +0300 Subject: [PATCH 38/87] RUN-19295 updated links --- docs/home/whats-new-2-18.md | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/docs/home/whats-new-2-18.md b/docs/home/whats-new-2-18.md index efa3e50c86..7e29bea5b3 100644 --- a/docs/home/whats-new-2-18.md +++ b/docs/home/whats-new-2-18.md @@ -19,7 +19,7 @@ date: 2024-June-14 #### Command Line Interface -* Added an improved researcher focused Command Line Interface (CLI). The improved CLI brings useablity enhancements for researcher which include: +* Added an improved researcher focused Command Line Interface (CLI). The improved CLI brings useablity enhancements for researcher which include: * Support multiple clusters * Self upgrade @@ -27,17 +27,17 @@ date: 2024-June-14 * Align CLI to be data consistent with UI and API * Improved usability and performance - For more information about installing and using the Improved CLI, see [Improved CLI](). + For more information about installing and using the Improved CLI, see [Improved CLI](../Researcher/cli-reference/new-cli/runai.md). ### Run:ai Administrator -* Added *Data Volumes* new feature. Data Volumes are snapshots of datasets stored in Kubernetes Persistent Volume Claims (PVCs). They act as a central repository for training data, and offer several key benefits. +* Added *Data Volumes* new feature. Data Volumes are snapshots of datasets stored in Kubernetes Persistent Volume Claims (PVCs). They act as a central repository for training data, and offer several key benefits. * Managed with dedicated permissions—Data admins, a new role within Run.ai, have exclusive control over data volume creation, data population, and sharing. * Shared between multiple scopes—Unlike other Run:ai data sources, data volumes can be shared across projects, departments, or clusters. This promotes data reuse and collaboration within your organization. * Coupled to workloads in the submission process— Similar to other Run:ai data sources, Data volumes can be easily attached to AI workloads during submission, specifying the data path within the workload environment. - For more information, see [Data Volumes](). + For more information, see [Data Volumes](../developer/admin-rest-api/data-volumes.md). ## Deprecation Notifications From 903b93492ddb61527337f2a29962f5b81ea15b32 Mon Sep 17 00:00:00 2001 From: JamieWeider72 <147967555+JamieWeider72@users.noreply.github.com> Date: Sun, 23 Jun 2024 13:57:23 +0300 Subject: [PATCH 39/87] Update docs/home/changelog/hotfixes-2-16.md Co-authored-by: ozRunAI <138565115+ozRunAI@users.noreply.github.com> --- docs/home/changelog/hotfixes-2-16.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/home/changelog/hotfixes-2-16.md b/docs/home/changelog/hotfixes-2-16.md index f6993e55c2..7e8fbec6fe 100644 --- a/docs/home/changelog/hotfixes-2-16.md +++ b/docs/home/changelog/hotfixes-2-16.md @@ -13,7 +13,7 @@ The following is a list of the known and fixed issues for Run:ai V2.16. | Internal ID | Description | |--|--| -| RUN-17241 | Fixed an issue where the nodes page showed nodes as not ready to to "tookit not installed". | +| RUN-17241 | Fixed an issue where the nodes page showed nodes as not ready due to "tookit not installed". | ## Version 2.16.21 From 7d3a2af8c78abfd29a7b6c3e6b302b3ccc6624dc Mon Sep 17 00:00:00 2001 From: jasonnovichRunAI <124490127+jasonnovichRunAI@users.noreply.github.com> Date: Sun, 23 Jun 2024 14:28:41 +0300 Subject: [PATCH 40/87] RUN-19554 add deprected APIs --- docs/home/whats-new-2-18.md | 25 +++++++++++++++++++++++++ 1 file changed, 25 insertions(+) diff --git a/docs/home/whats-new-2-18.md b/docs/home/whats-new-2-18.md index 7e29bea5b3..925b49579a 100644 --- a/docs/home/whats-new-2-18.md +++ b/docs/home/whats-new-2-18.md @@ -43,6 +43,31 @@ date: 2024-June-14 Deprecation notifications allow you to plan for future changes in the Run:ai Platform. +### Feature deprecations + +Deprecated features will be available for **two** versions ahead of the notification. For questions, see your Run:ai representative. + +### API support and endpoint deprecations + +The endpoints and parameters specified in the API reference are the ones that are officially supported by Run:ai. For more information about Run:ai's API support policy and deprecation process, see [Developer overview](../developer/overview-developer.md#overview-developer-documentation). + +#### Deprecated APIs and API fields + +##### Departments API + +| Deprecated | Replacement | +| --- | --- | +| /v1/k8s/clusters/{clusterId}/departments | /api/v1/org-unit/departments | +| /v1/k8s/clusters/{clusterId}/departments/{department-id} | /api/v1/org-unit/departments/{departmentId} | +| /v1/k8s/clusters/{clusterId}/departments/{department-id} | /api/v1/org-unit/departments/{departmentId}+PUT/PATCH /api/v1/org-unit/departments/{departmentId}/resources | + +##### Projects APi + +| Deprecated | Replacement | +| --- | --- | +| /v1/k8s/clusters/{clusterId}/projects | /api/v1/org-unit/projects | +| /v1/k8s/clusters/{clusterId}/projects/{id} | /api/v1/org-unit/projects/{projectId} | +| /v1/k8s/clusters/{clusterId}/projects/{id} | /api/v1/org-unit/projects/{projectId} + /api/v1/org-unit/projects/{projectId}/resources | ## Breaking changes From 8f97cac847b57ee489f9a56a56ee18947fdce987 Mon Sep 17 00:00:00 2001 From: jasonnovichRunAI <124490127+jasonnovichRunAI@users.noreply.github.com> Date: Sun, 23 Jun 2024 14:44:34 +0300 Subject: [PATCH 41/87] RUN-19502 remove HPO (sent to graveyard) and from nav --- {docs/Researcher/scheduling => graveyard}/hpo.md | 0 {docs/Researcher/Walkthroughs => graveyard}/walkthrough-hpo.md | 0 mkdocs.yml | 2 -- 3 files changed, 2 deletions(-) rename {docs/Researcher/scheduling => graveyard}/hpo.md (100%) rename {docs/Researcher/Walkthroughs => graveyard}/walkthrough-hpo.md (100%) diff --git a/docs/Researcher/scheduling/hpo.md b/graveyard/hpo.md similarity index 100% rename from docs/Researcher/scheduling/hpo.md rename to graveyard/hpo.md diff --git a/docs/Researcher/Walkthroughs/walkthrough-hpo.md b/graveyard/walkthrough-hpo.md similarity index 100% rename from docs/Researcher/Walkthroughs/walkthrough-hpo.md rename to graveyard/walkthrough-hpo.md diff --git a/mkdocs.yml b/mkdocs.yml index 7f7446e9b5..17c9c63852 100644 --- a/mkdocs.yml +++ b/mkdocs.yml @@ -247,7 +247,6 @@ nav: - 'Build with Connected Ports' : 'Researcher/Walkthroughs/walkthrough-build-ports.md' - 'GPU Fractions' : 'Researcher/Walkthroughs/walkthrough-fractions.md' - 'Distributed Training Workloads' : 'Researcher/Walkthroughs/walkthrough-distributed-training.md' - - 'Hyperparameter Optimization' : 'Researcher/Walkthroughs/walkthrough-hpo.md' - 'Over-Quota, Basic Fairness & Bin-Packing' : 'Researcher/Walkthroughs/walkthrough-overquota.md' - 'Queue Fairness' : 'Researcher/Walkthroughs/walkthrough-queue-fairness.md' - 'Inference' : 'Researcher/Walkthroughs/quickstart-inference.md' @@ -358,7 +357,6 @@ nav: - 'Scheduling Strategies' : 'Researcher/scheduling/strategies.md' - 'Scheduling workloads to AWS placement groups' : 'Researcher/scheduling/schedule-to-aws-groups.md' - 'Using Node Pools' : 'Researcher/scheduling/using-node-pools.md' - - 'Hyperparameter Optimization' : 'Researcher/scheduling/hpo.md' - 'Tools' : - 'Visual Studio Code' : 'Researcher/tools/dev-vscode.md' - 'PyCharm' : 'Researcher/tools/dev-pycharm.md' From 12da609b875977848b760ca9791722e5d0f581c6 Mon Sep 17 00:00:00 2001 From: jasonnovichRunAI <124490127+jasonnovichRunAI@users.noreply.github.com> Date: Mon, 24 Jun 2024 08:34:25 +0300 Subject: [PATCH 42/87] Update docs/home/whats-new-2-18.md Co-authored-by: ozRunAI <138565115+ozRunAI@users.noreply.github.com> --- docs/home/whats-new-2-18.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/home/whats-new-2-18.md b/docs/home/whats-new-2-18.md index dca0b453b0..6de379a3f3 100644 --- a/docs/home/whats-new-2-18.md +++ b/docs/home/whats-new-2-18.md @@ -1,5 +1,5 @@ --- -title: Version 2.17 +title: Version 2.18 summary: This article describes new features and functionality in the version. authors: - Jamie Weider From c49a9b97a42f07a948b10219a76480c78a1e77c2 Mon Sep 17 00:00:00 2001 From: jasonnovichRunAI <124490127+jasonnovichRunAI@users.noreply.github.com> Date: Mon, 24 Jun 2024 11:20:00 +0300 Subject: [PATCH 43/87] RUN-19295 add CLI deprecation notification --- docs/home/whats-new-2-18.md | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/docs/home/whats-new-2-18.md b/docs/home/whats-new-2-18.md index 925b49579a..ee75460491 100644 --- a/docs/home/whats-new-2-18.md +++ b/docs/home/whats-new-2-18.md @@ -33,9 +33,9 @@ date: 2024-June-14 * Added *Data Volumes* new feature. Data Volumes are snapshots of datasets stored in Kubernetes Persistent Volume Claims (PVCs). They act as a central repository for training data, and offer several key benefits. - * Managed with dedicated permissions—Data admins, a new role within Run.ai, have exclusive control over data volume creation, data population, and sharing. - * Shared between multiple scopes—Unlike other Run:ai data sources, data volumes can be shared across projects, departments, or clusters. This promotes data reuse and collaboration within your organization. - * Coupled to workloads in the submission process— Similar to other Run:ai data sources, Data volumes can be easily attached to AI workloads during submission, specifying the data path within the workload environment. + * Managed with dedicated permissions—Data Admins, a new role within Run.ai, have exclusive control over data volume creation, data population, and sharing. + * Shared between multiple scopes—unlike other Run:ai data sources, data volumes can be shared across projects, departments, or clusters. This promotes data reuse and collaboration within your organization. + * Coupled to workloads in the submission process—similar to other Run:ai data sources, Data volumes can be easily attached to AI workloads during submission, specifying the data path within the workload environment. For more information, see [Data Volumes](../developer/admin-rest-api/data-volumes.md). @@ -47,6 +47,8 @@ Deprecation notifications allow you to plan for future changes in the Run:ai Pla Deprecated features will be available for **two** versions ahead of the notification. For questions, see your Run:ai representative. +* Command Line Interface (CLI)—from cluster version 2.18 and higher, the *Legacy CLI* is deprecated. The *Legacy CLI* is still available for use on clusters that are 2.18 or higher, but it is recommended that you use the new *Improved CLI*. + ### API support and endpoint deprecations The endpoints and parameters specified in the API reference are the ones that are officially supported by Run:ai. For more information about Run:ai's API support policy and deprecation process, see [Developer overview](../developer/overview-developer.md#overview-developer-documentation). From 79d673ed491d3523db138db25e04c6ada1987fa4 Mon Sep 17 00:00:00 2001 From: jasonnovichRunAI <124490127+jasonnovichRunAI@users.noreply.github.com> Date: Mon, 24 Jun 2024 12:12:30 +0300 Subject: [PATCH 44/87] RUN-16831 add sections to filters --- docs/admin/workloads/README.md | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/docs/admin/workloads/README.md b/docs/admin/workloads/README.md index ba2210e8d8..7dcb4b5eec 100644 --- a/docs/admin/workloads/README.md +++ b/docs/admin/workloads/README.md @@ -77,8 +77,11 @@ You can manage a workload by selecting one from the view. Once selected, you can * Show details—provides in-depth information about the selected workload including: * Event history—workload status over time. Use the filter to search through the history for specific events. - * Metrics—use the drop down to filter metrics per pod. Select a category from the list below: + * Metrics—use the drop down to filter metrics per pod and over time. Select a category from the list below: + * Throughput—total of requests per second across all* replica at any given time + * Latency—average of time it took to answer any request across all replicas at any given time + * Number of replicas—Total number of all* replicas at any given time * GPU compute utilization—hover over for individual GPU details * GPU memory usage—hover over for individual GPU details * CPU usage—hover over for usage details From 3bc377996b6729531b2db94ad17f7c4ada448b81 Mon Sep 17 00:00:00 2001 From: jasonnovichRunAI <124490127+jasonnovichRunAI@users.noreply.github.com> Date: Mon, 24 Jun 2024 12:22:02 +0300 Subject: [PATCH 45/87] RUN-19295 add new inference graphs --- docs/home/whats-new-2-18.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/docs/home/whats-new-2-18.md b/docs/home/whats-new-2-18.md index ee75460491..236a972546 100644 --- a/docs/home/whats-new-2-18.md +++ b/docs/home/whats-new-2-18.md @@ -17,6 +17,8 @@ date: 2024-June-14 * Added backoff limit functionality to Training and Workspace workloads. The backoff limit is the maximum number of retry attempts for failed workloads. After reaching the limit, the workload's status will change to `Failed`. +* Added new graphs for *Inference* workloads. The new graphs provide more information for *Inference* workloads to help analyze performance of the workloads. For more information, see [Workloads View](../admin/workloads/#workloads-view). + #### Command Line Interface * Added an improved researcher focused Command Line Interface (CLI). The improved CLI brings useablity enhancements for researcher which include: From 8556bad40193538f5e6bcd250e2d58d81331465b Mon Sep 17 00:00:00 2001 From: jasonnovichRunAI <124490127+jasonnovichRunAI@users.noreply.github.com> Date: Mon, 24 Jun 2024 14:34:09 +0300 Subject: [PATCH 46/87] RUN-19295 add auto delete default improvement --- docs/home/whats-new-2-18.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/docs/home/whats-new-2-18.md b/docs/home/whats-new-2-18.md index 236a972546..3e4411ac2b 100644 --- a/docs/home/whats-new-2-18.md +++ b/docs/home/whats-new-2-18.md @@ -19,6 +19,8 @@ date: 2024-June-14 * Added new graphs for *Inference* workloads. The new graphs provide more information for *Inference* workloads to help analyze performance of the workloads. For more information, see [Workloads View](../admin/workloads/#workloads-view). +* Updated *Auto-deletion time* default value. Previously the default was **90 days** now the default is **30 days**. + #### Command Line Interface * Added an improved researcher focused Command Line Interface (CLI). The improved CLI brings useablity enhancements for researcher which include: From 8f1e2012da8c02a22de6d65eb2ac955c7434bcd9 Mon Sep 17 00:00:00 2001 From: JamieWeider72 <147967555+JamieWeider72@users.noreply.github.com> Date: Mon, 24 Jun 2024 14:44:19 +0300 Subject: [PATCH 47/87] YAML code update --- docs/Researcher/scheduling/node-level-scheduler.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/Researcher/scheduling/node-level-scheduler.md b/docs/Researcher/scheduling/node-level-scheduler.md index 7fb6e18c5b..dc2f9b5b24 100644 --- a/docs/Researcher/scheduling/node-level-scheduler.md +++ b/docs/Researcher/scheduling/node-level-scheduler.md @@ -45,7 +45,7 @@ To use Node Level Scheduler the Administrator should follow the steps: global: core: nodeScheduler: - enabled: true + enabled: true ``` The Administrator can also use this patch command to perform the change: From 3631330185ebb6edb69984ecc8c6987cb73327a2 Mon Sep 17 00:00:00 2001 From: JamieWeider72 <147967555+JamieWeider72@users.noreply.github.com> Date: Tue, 25 Jun 2024 15:33:23 +0300 Subject: [PATCH 48/87] RUN-19295 Add SSO section --- docs/home/whats-new-2-18.md | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/docs/home/whats-new-2-18.md b/docs/home/whats-new-2-18.md index 3e4411ac2b..36fb0139fa 100644 --- a/docs/home/whats-new-2-18.md +++ b/docs/home/whats-new-2-18.md @@ -43,6 +43,10 @@ date: 2024-June-14 For more information, see [Data Volumes](../developer/admin-rest-api/data-volumes.md). +#### SSO + +* + ## Deprecation Notifications Deprecation notifications allow you to plan for future changes in the Run:ai Platform. From a41279a56f55fc356e441c32f1b677a287eaaed3 Mon Sep 17 00:00:00 2001 From: JamieWeider72 <147967555+JamieWeider72@users.noreply.github.com> Date: Tue, 25 Jun 2024 16:16:54 +0300 Subject: [PATCH 49/87] RUN-19295 Add SSO info --- docs/home/whats-new-2-18.md | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/docs/home/whats-new-2-18.md b/docs/home/whats-new-2-18.md index 36fb0139fa..0a7e87eb38 100644 --- a/docs/home/whats-new-2-18.md +++ b/docs/home/whats-new-2-18.md @@ -45,7 +45,9 @@ date: 2024-June-14 #### SSO -* +* Run:ai now supports SSO using OpenShift v4 (which is based on OIDC). Before using OpenShift, you must first define OAuthClient which interacts with OpenShift's OAuth server to authenticate users and request access tokens. For more information, see [Single Sign-On](../admin/runai-setup/authentication/sso/). + +* OIDC scopes have been added to the authentication request. Scopes are used to specify what access privileges are being requested for access tokens. The scopes associated with the access tokens determine what resourcea are available when they are used to access OAuth 2.0 protected endopoints. Protected endpoints may perform different actions and return different information based on the scope values and other parameters used when requesting the presented access token. For more information, see [UI configuration](../admin/runai-setup/authentication/sso/#step-1-ui-configuration). ## Deprecation Notifications From 69ff28fbd3a05f0e8b006dccf5c604a55f12ab95 Mon Sep 17 00:00:00 2001 From: jasonnovichRunAI <124490127+jasonnovichRunAI@users.noreply.github.com> Date: Wed, 26 Jun 2024 11:18:35 +0300 Subject: [PATCH 50/87] RUN-19295 markdown corrections and spelling --- docs/home/whats-new-2-18.md | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/docs/home/whats-new-2-18.md b/docs/home/whats-new-2-18.md index 0a7e87eb38..54ec2f735e 100644 --- a/docs/home/whats-new-2-18.md +++ b/docs/home/whats-new-2-18.md @@ -17,13 +17,13 @@ date: 2024-June-14 * Added backoff limit functionality to Training and Workspace workloads. The backoff limit is the maximum number of retry attempts for failed workloads. After reaching the limit, the workload's status will change to `Failed`. -* Added new graphs for *Inference* workloads. The new graphs provide more information for *Inference* workloads to help analyze performance of the workloads. For more information, see [Workloads View](../admin/workloads/#workloads-view). +* Added new graphs for *Inference* workloads. The new graphs provide more information for *Inference* workloads to help analyze performance of the workloads. For more information, see [Workloads View](../admin/workloads/README.md#workloads-view). * Updated *Auto-deletion time* default value. Previously the default was **90 days** now the default is **30 days**. #### Command Line Interface -* Added an improved researcher focused Command Line Interface (CLI). The improved CLI brings useablity enhancements for researcher which include: +* Added an improved researcher focused Command Line Interface (CLI). The improved CLI brings usability enhancements for researcher which include: * Support multiple clusters * Self upgrade @@ -41,13 +41,13 @@ date: 2024-June-14 * Shared between multiple scopes—unlike other Run:ai data sources, data volumes can be shared across projects, departments, or clusters. This promotes data reuse and collaboration within your organization. * Coupled to workloads in the submission process—similar to other Run:ai data sources, Data volumes can be easily attached to AI workloads during submission, specifying the data path within the workload environment. - For more information, see [Data Volumes](../developer/admin-rest-api/data-volumes.md). + For more information, see [Data Volumes](../developer/admin-rest-api/data-volumes.md). #### SSO -* Run:ai now supports SSO using OpenShift v4 (which is based on OIDC). Before using OpenShift, you must first define OAuthClient which interacts with OpenShift's OAuth server to authenticate users and request access tokens. For more information, see [Single Sign-On](../admin/runai-setup/authentication/sso/). +* Run:ai now supports SSO using OpenShift v4 (which is based on OIDC). Before using OpenShift, you must first define OAuthClient which interacts with OpenShift's OAuth server to authenticate users and request access tokens. For more information, see [Single Sign-On](../admin/runai-setup/authentication/sso/). -* OIDC scopes have been added to the authentication request. Scopes are used to specify what access privileges are being requested for access tokens. The scopes associated with the access tokens determine what resourcea are available when they are used to access OAuth 2.0 protected endopoints. Protected endpoints may perform different actions and return different information based on the scope values and other parameters used when requesting the presented access token. For more information, see [UI configuration](../admin/runai-setup/authentication/sso/#step-1-ui-configuration). +* OIDC scopes have been added to the authentication request. Scopes are used to specify what access privileges are being requested for access tokens. The scopes associated with the access tokens determine what resource are available when they are used to access OAuth 2.0 protected endpoints. Protected endpoints may perform different actions and return different information based on the scope values and other parameters used when requesting the presented access token. For more information, see [UI configuration](../admin/runai-setup/authentication/sso/#step-1-ui-configuration). ## Deprecation Notifications @@ -61,7 +61,7 @@ Deprecated features will be available for **two** versions ahead of the notifica ### API support and endpoint deprecations -The endpoints and parameters specified in the API reference are the ones that are officially supported by Run:ai. For more information about Run:ai's API support policy and deprecation process, see [Developer overview](../developer/overview-developer.md#overview-developer-documentation). +The endpoints and parameters specified in the API reference are the ones that are officially supported by Run:ai. For more information about Run:ai's API support policy and deprecation process, see [Developer overview](../developer/overview-developer.md#api-support). #### Deprecated APIs and API fields From 3b0c9176ccc96849dad6fffc9a2e3d8297e359a5 Mon Sep 17 00:00:00 2001 From: ozRunAI <138565115+ozRunAI@users.noreply.github.com> Date: Wed, 26 Jun 2024 12:09:38 +0300 Subject: [PATCH 51/87] added external pg docs --- .../self-hosted/k8s/preparations.md | 19 +++++++++++++++++++ .../self-hosted/k8s/prerequisites.md | 12 +++++++++--- .../self-hosted/ocp/prerequisites.md | 8 ++++++-- 3 files changed, 34 insertions(+), 5 deletions(-) diff --git a/docs/admin/runai-setup/self-hosted/k8s/preparations.md b/docs/admin/runai-setup/self-hosted/k8s/preparations.md index d1de2b01ad..c0b15d79ad 100644 --- a/docs/admin/runai-setup/self-hosted/k8s/preparations.md +++ b/docs/admin/runai-setup/self-hosted/k8s/preparations.md @@ -77,6 +77,7 @@ You must provide the domain's private key and crt as a Kubernetes secret in the kubectl create secret tls runai-backend-tls -n runai-backend \ --cert /path/to/fullchain.pem --key /path/to/private.pem ``` + ### Local Certificate Authority (air-gapped only) In air-gapped environments, you must prepare the public key of your local certificate authority as described [here](../../config/org-cert.md). It will need to be installed in Kubernetes for the installation to succeed. @@ -94,6 +95,24 @@ kubectl label node node-role.kubernetes.io/runai-system=true !!! Warning Do not select the Kubernetes master as a `runai-system` node. This may cause Kubernetes to stop working (specifically if Kubernetes API Server is configured on 443 instead of the default 6443). + ### External Postgres database (optional) + +If you have chosen to use an external Postgress database, an first setup is required in order to complete the installation successfully. + +Run the following command in a machine where `pgsql` is instllaed: + +``` bash +curl -fsSL https://raw.githubusercontent.com/run-ai/public/main/externalpg-script.sql | psql --host \ + --user \ # (1) + --port \ # (2) + --dbname \ # (3) + --set=database_name='my_database' \ # (4) + --set=role_name='my_role' \ # (5) + --set=role_password='my_password' \ # (6) + --set=grafana_password='grafana_password' # (7) +``` + + ## Additional permissions As part of the installation, you will be required to install the [Run:ai Control Plane](backend.md) and [Cluster](cluster.md) Helm [Charts](https://helm.sh/){target=_blank}. The Helm Charts require Kubernetes administrator permissions. You can review the exact permissions provided by using the `--dry-run` on both helm charts. diff --git a/docs/admin/runai-setup/self-hosted/k8s/prerequisites.md b/docs/admin/runai-setup/self-hosted/k8s/prerequisites.md index 5306ca8d3b..67396fbc1a 100644 --- a/docs/admin/runai-setup/self-hosted/k8s/prerequisites.md +++ b/docs/admin/runai-setup/self-hosted/k8s/prerequisites.md @@ -66,20 +66,26 @@ The Run:ai control plane installation assumes an existing installation of NGINX See Run:ai Cluster prerequisites [NVIDIA](../../cluster-setup/cluster-prerequisites.md#nvidia) requirements. -The Run:ai control plane, when installed without a Run:ai cluster, does not require the NVIDIA prerequisites. + > The Run:ai control plane, when installed without a Run:ai cluster, does not require the NVIDIA prerequisites. ### Prometheus See Run:ai Cluster prerequisites [Prometheus](../../cluster-setup/cluster-prerequisites.md#prometheus) requirements. -The Run:ai control plane, when installed without a Run:ai cluster, does not require the Prometheus prerequisites. + > The Run:ai control plane, when installed without a Run:ai cluster, does not require the Prometheus prerequisites. ### Inference (optional) See Run:ai Cluster prerequisites [Inference](../../cluster-setup/cluster-prerequisites.md#inference) requirements. -The Run:ai control plane, when installed without a Run:ai cluster, does not require the Inference prerequisites. + > The Run:ai control plane, when installed without a Run:ai cluster, does not require the Inference prerequisites. + + + ### External Postgres database (optional) + +The Run:ai Control Plane installation includes a default PostgreSQL database. However, you may opt to use an existing PostgreSQL database if you have specific requirements or preferences. Please ensure that your PostgreSQL database is version 16 or higher. + ## Next steps Continue to [Preparing for a Run:ai Kubernetes Installation diff --git a/docs/admin/runai-setup/self-hosted/ocp/prerequisites.md b/docs/admin/runai-setup/self-hosted/ocp/prerequisites.md index bbe1eee567..8f484efde2 100644 --- a/docs/admin/runai-setup/self-hosted/ocp/prerequisites.md +++ b/docs/admin/runai-setup/self-hosted/ocp/prerequisites.md @@ -49,7 +49,7 @@ Run:ai supports OpenShift. OpenShift Versions supported are detailed [here](../. See Run:ai Cluster prerequisites [installing NVIDIA dependencies in OpenShift](cluster.md#prerequisites). -The Run:ai control plane, when installed without a Run:ai cluster, does not require the NVIDIA prerequisites. +> The Run:ai control plane, when installed without a Run:ai cluster, does not require the NVIDIA prerequisites. Information on how to download the GPU Operator for air-gapped installation can be found in the [NVIDIA GPU Operator pre-requisites](https://docs.nvidia.com/datacenter/cloud-native/gpu-operator/install-gpu-operator-air-gapped.html#install-gpu-operator-air-gapped){target=_blank}. @@ -58,7 +58,11 @@ Information on how to download the GPU Operator for air-gapped installation can See Run:ai Cluster prerequisites [Inference](../../cluster-setup/cluster-prerequisites.md#inference) requirements. -The Run:ai control plane, when installed without a Run:ai cluster, does not require the Inference prerequisites. +> The Run:ai control plane, when installed without a Run:ai cluster, does not require the Inference prerequisites. + + ### External Postgres database (optional) + +The Run:ai Control Plane installation includes a default PostgreSQL database. However, you may opt to use an existing PostgreSQL database if you have specific requirements or preferences. Please ensure that your PostgreSQL database is version 16 or higher. ## Next steps Continue to [Preparing for a Run:ai OpenShift Installation From 1388b50cfc61b635499f1e0eb5b2a9db8662a5f7 Mon Sep 17 00:00:00 2001 From: Oz Bar-Shalom Date: Wed, 26 Jun 2024 13:52:38 +0300 Subject: [PATCH 52/87] added docs for external pg self-hsoted --- .../runai-setup/self-hosted/k8s/backend.md | 12 +++ .../self-hosted/k8s/preparations.md | 59 ++++++++++--- .../self-hosted/k8s/prerequisites.md | 2 +- .../runai-setup/self-hosted/ocp/backend.md | 24 +++++- .../self-hosted/ocp/preparations.md | 86 +++++++++++++++++++ .../self-hosted/ocp/prerequisites.md | 2 +- 6 files changed, 167 insertions(+), 18 deletions(-) diff --git a/docs/admin/runai-setup/self-hosted/k8s/backend.md b/docs/admin/runai-setup/self-hosted/k8s/backend.md index 664c0d1e28..18f7966f58 100644 --- a/docs/admin/runai-setup/self-hosted/k8s/backend.md +++ b/docs/admin/runai-setup/self-hosted/k8s/backend.md @@ -62,6 +62,18 @@ There may be cases where you need to set additional properties as follows: Use the `--set` syntax in the helm command above. +#### External PostgreSQL database + +If you have opted to connect to an [external PostgreSQL database](preperations.md#external-postgres-database-optional), refer to the additional configurations table below. Adjust the following parameters based on your connection details: + +* `postgresql.enabled` - set to `false` +* `global.postgresql.auth.password` +* `global.postgresql.auth.username` +* `global.postgresql.auth.host` +* `global.postgresql.auth.port` +* `grafana.dbUser` +* `grafana.dbPassword` + ## Next Steps ### Connect to Run:ai User interface diff --git a/docs/admin/runai-setup/self-hosted/k8s/preparations.md b/docs/admin/runai-setup/self-hosted/k8s/preparations.md index c0b15d79ad..84dfb491cc 100644 --- a/docs/admin/runai-setup/self-hosted/k8s/preparations.md +++ b/docs/admin/runai-setup/self-hosted/k8s/preparations.md @@ -95,22 +95,55 @@ kubectl label node node-role.kubernetes.io/runai-system=true !!! Warning Do not select the Kubernetes master as a `runai-system` node. This may cause Kubernetes to stop working (specifically if Kubernetes API Server is configured on 443 instead of the default 6443). - ### External Postgres database (optional) +### External Postgres database (optional) -If you have chosen to use an external Postgress database, an first setup is required in order to complete the installation successfully. +If you have opted to use an [external PostgreSQL database](prerequisites.md#external-postgresql-database-optional). +, you need to perform initial setup to ensure successful installation. Follow these steps: -Run the following command in a machine where `pgsql` is instllaed: +1. Create a SQL script file, edit the parameters below, and save it locally: + * Replace `` with the name of your PostgreSQL database. + * Replace `` with the password for the PostgreSQL role (user). + * Replace `` with the name of the PostgreSQL role (user) to be created. + * Replace `` with the password to be set for Grafana integration. -``` bash -curl -fsSL https://raw.githubusercontent.com/run-ai/public/main/externalpg-script.sql | psql --host \ - --user \ # (1) - --port \ # (2) - --dbname \ # (3) - --set=database_name='my_database' \ # (4) - --set=role_name='my_role' \ # (5) - --set=role_password='my_password' \ # (6) - --set=grafana_password='grafana_password' # (7) -``` + ``` sql + -- Create a new database for runai + CREATE DATABASE ; + + -- Create the role with login and password + CREATE ROLE WITH LOGIN PASSWORD ''; + + -- Grant all privileges on the database to the role + GRANT ALL PRIVILEGES ON DATABASE TO ; + + -- Connect to the newly created database + \c + + -- grafana + CREATE ROLE grafana WITH LOGIN PASSWORD ''; + CREATE SCHEMA grafana authorization grafana; + ALTER USER grafana set search_path='grafana'; + -- Exit psql + \q + ``` + + +2. run the following command on a machine where PostgreSQL client (`pgsql`) is installed: + + ``` bash + psql --host \ # (1) + --user \ # (2) + --port \ # (3) + --dbname \ # (4) + -a -f \ # (5) + ``` + + 1. Replace `` with the PostgreSQL ip address or hostname. + 1. Replace `` with the PostgreSQL username. + 2. Replace `` with the port number where PostgreSQL is running. + 3. Replace `` with the name of your PostgreSQL database. + 4. Replace `` with the name of your PostgreSQL database. + 5. Replace `` with the path to the SQL script created in the previous step. ## Additional permissions diff --git a/docs/admin/runai-setup/self-hosted/k8s/prerequisites.md b/docs/admin/runai-setup/self-hosted/k8s/prerequisites.md index 67396fbc1a..e63f44eec6 100644 --- a/docs/admin/runai-setup/self-hosted/k8s/prerequisites.md +++ b/docs/admin/runai-setup/self-hosted/k8s/prerequisites.md @@ -82,7 +82,7 @@ See Run:ai Cluster prerequisites [Inference](../../cluster-setup/cluster-prerequ > The Run:ai control plane, when installed without a Run:ai cluster, does not require the Inference prerequisites. - ### External Postgres database (optional) +### External Postgres database (optional) The Run:ai Control Plane installation includes a default PostgreSQL database. However, you may opt to use an existing PostgreSQL database if you have specific requirements or preferences. Please ensure that your PostgreSQL database is version 16 or higher. diff --git a/docs/admin/runai-setup/self-hosted/ocp/backend.md b/docs/admin/runai-setup/self-hosted/ocp/backend.md index 0a095048d4..560cf601de 100644 --- a/docs/admin/runai-setup/self-hosted/ocp/backend.md +++ b/docs/admin/runai-setup/self-hosted/ocp/backend.md @@ -4,6 +4,7 @@ Make sure you have followed the Control Plane [prerequisites](./prerequisites.md) and [preperations](./preperations.md). + ## Install the Control Plane Run the helm command below: @@ -50,9 +51,15 @@ There may be cases where you need to set additional properties as follows: | `keycloakx.adminUser` | User name of the internal identity provider administrator | This user is the administrator of Keycloak | | `keycloakx.adminPassword` | Password of the internal identity provider administrator | This password is for the administrator of Keycloak | | `global.keycloakx.host` | KeyCloak (Run:ai internal identity provider) host path | Override the DNS for Keycloak. This can be used to access Keycloak from outside the Run:ai Control Plane cluster via ingress | -| `global.postgresql.auth.username` | PostgreSQL username | Override the Run:ai default user name for the Run:ai database | -| `global.postgresql.auth.password` | PostgreSQL password | Override the Run:ai default password for the Run:ai database | -| `global.postgresql.auth.port` | PostgreSQL port | Override the default PostgreSQL port for the Run:ai database | +| `postgresql.enabled`| PostgreSQL installation | If set to `false` the PostgreSQL will not be installed | +| `global.postgresql.auth.host` | PostgreSQL host | Hostname or IP address of the PostgreSQL server | +| `global.postgresql.auth.port` | PostgreSQL port | Port number on which PostgreSQL is running | +| `global.postgresql.auth.username` | PostgreSQL username | Username for connecting to PostgreSQL | +| `global.postgresql.auth.password` | PostgreSQL password | Password for the PostgreSQL user specified by `global.postgresql.auth.username` | +| `global.postgresql.auth.postgresPassword` | PostgreSQL default admin password | Password for the built-in PostgreSQL superuser (`postgres`) | +| `postgresql.primary.initdb.password` | PostgreSQL default admin password | Set the same password as in `global.postgresql.auth.postgresPassword` (if changed) | +| `grafana.dbUser` | Grafana database username | Username for accessing the Grafana database | +| `grafana.dbPassword` | Grafana database password | Password for the Grafana database user | | `grafana.adminUser` | Grafana username | Override the Run:ai default user name for accessing Grafana | | `grafana.adminPassword` | Grafana password | Override the Run:ai default password for accessing Grafana | | `thanos.receive.persistence.storageClass` and `postgresql.primary.persistence.storageClass` | Storage class | The installation to work with a specific storage class rather than the default one | @@ -61,6 +68,17 @@ There may be cases where you need to set additional properties as follows: Use the `--set` syntax in the helm command above. +#### External PostgreSQL database + +If you have opted to connect to an [external PostgreSQL database](preperations.md#external-postgres-database-optional), refer to the additional configurations table below. Adjust the following parameters based on your connection details: + +* `postgresql.enabled` - set to `false` +* `global.postgresql.auth.password` +* `global.postgresql.auth.username` +* `global.postgresql.auth.host` +* `global.postgresql.auth.port` +* `grafana.dbUser` +* `grafana.dbPassword` ## Next steps diff --git a/docs/admin/runai-setup/self-hosted/ocp/preparations.md b/docs/admin/runai-setup/self-hosted/ocp/preparations.md index fd7e5c7924..eeee2416e4 100644 --- a/docs/admin/runai-setup/self-hosted/ocp/preparations.md +++ b/docs/admin/runai-setup/self-hosted/ocp/preparations.md @@ -83,6 +83,92 @@ kubectl label node node-role.kubernetes.io/runai-system=true !!! Warning Do not select the Kubernetes master as a `runai-system` node. This may cause Kubernetes to stop working (specifically if Kubernetes API Server is configured on 443 instead of the default 6443). +### External Postgres database (optional) + +If you have opted to use an [external PostgreSQL database](prerequisites.md#external-postgresql-database-optional). +, you need to perform initial setup to ensure successful installation. Follow these steps: + +1. Create a SQL script file, edit the parameters below, and save it locally: + * Replace `` with the name of your PostgreSQL database. + * Replace `` with the password for the PostgreSQL role (user). + * Replace `` with the name of the PostgreSQL role (user) to be created. + * Replace `` with the password to be set for Grafana integration. + + ``` sql + -- Create a new database for runai + CREATE DATABASE ; + + -- Create the role with login and password + CREATE ROLE WITH LOGIN PASSWORD ''; + + -- Grant all privileges on the database to the role + GRANT ALL PRIVILEGES ON DATABASE TO ; + + -- Connect to the newly created database + \c + + -- grafana + CREATE ROLE grafana WITH LOGIN PASSWORD ''; + CREATE SCHEMA grafana authorization grafana; + ALTER USER grafana set search_path='grafana'; + -- Exit psql + \q + ``` + + +2. run the following command on a machine where PostgreSQL client (`pgsql`) is installed: + + ``` bash + psql --host \ # (1) + --user \ # (2) + --port \ # (3) + --dbname \ # (4) + -a -f \ # (5) + ``` + + 1. Replace `` with the PostgreSQL ip address or hostname. + 1. Replace `` with the PostgreSQL username. + 2. Replace `` with the port number where PostgreSQL is running. + 3. Replace `` with the name of your PostgreSQL database. + 4. Replace `` with the name of your PostgreSQL database. + 5. Replace `` with the path to the SQL script created in the previous step. + + +If you have opted to use an [external PostgreSQL database](prerequisites.md#external-postgresql-database-optional). +, you need to perform initial setup to ensure successful installation. Follow these steps: +Run the following command on a machine where PostgreSQL client (`pgsql`) is installed: + +``` bash +curl -fsSL https://raw.githubusercontent.com/run-ai/public/main/externalpg-script.sql | psql --host \ + --user \ # (1) + --port \ # (2) + --dbname \ # (3) + --set=database_name= \ # (4) + --set=role_name='backend' \ # (5) + --set=role_password='runai_password' \ # (6) + --set=grafana_password='runai_grafana_password' # (7) +``` + +1. Replace `` with the PostgreSQL username. +2. Replace `` with the port number where PostgreSQL is running. +3. Replace `` with the name of your PostgreSQL database. +4. Replace `` with the name of your PostgreSQL database. +5. Replace `'runai_role'` with the name of the PostgreSQL role (user) to be created. +6. Replace `'runai_password'` with the password for the PostgreSQL role (user). +7. Replace `'runai_grafana_password'` with the password to be set for Grafana integration. + +Example: +``` bash +curl -fsSL https://raw.githubusercontent.com/run-ai/public/main/externalpg-script.sql | psql --host pg-host \ + --user root \ + --port 5432 \ + --dbname runai_database \ + --set=database_name='runai_database' \ + --set=role_name='backend' \ + --set=role_password='password' \ + --set=grafana_password='password' +``` + ## Additional permissions As part of the installation, you will be required to install the [Control plane](backend.md) and [Cluster](cluster.md) Helm [Charts](https://helm.sh/){target=_blank}. The Helm Charts require Kubernetes administrator permissions. You can review the exact permissions provided by using the `--dry-run` on both helm charts. diff --git a/docs/admin/runai-setup/self-hosted/ocp/prerequisites.md b/docs/admin/runai-setup/self-hosted/ocp/prerequisites.md index 8f484efde2..2b1b895a92 100644 --- a/docs/admin/runai-setup/self-hosted/ocp/prerequisites.md +++ b/docs/admin/runai-setup/self-hosted/ocp/prerequisites.md @@ -60,7 +60,7 @@ See Run:ai Cluster prerequisites [Inference](../../cluster-setup/cluster-prerequ > The Run:ai control plane, when installed without a Run:ai cluster, does not require the Inference prerequisites. - ### External Postgres database (optional) +### External PostgreSQL database (optional) The Run:ai Control Plane installation includes a default PostgreSQL database. However, you may opt to use an existing PostgreSQL database if you have specific requirements or preferences. Please ensure that your PostgreSQL database is version 16 or higher. From c67e85491f186c394b5f7f7325b2b84c04d67859 Mon Sep 17 00:00:00 2001 From: Oz Bar-Shalom Date: Wed, 26 Jun 2024 13:54:10 +0300 Subject: [PATCH 53/87] external pg --- docs/admin/runai-setup/self-hosted/k8s/backend.md | 13 ++++++++++--- 1 file changed, 10 insertions(+), 3 deletions(-) diff --git a/docs/admin/runai-setup/self-hosted/k8s/backend.md b/docs/admin/runai-setup/self-hosted/k8s/backend.md index 18f7966f58..1aa5bfa947 100644 --- a/docs/admin/runai-setup/self-hosted/k8s/backend.md +++ b/docs/admin/runai-setup/self-hosted/k8s/backend.md @@ -51,9 +51,16 @@ There may be cases where you need to set additional properties as follows: | `global.keycloakx.host` | KeyCloak (Run:ai internal identity provider) host path | Override the DNS for Keycloak. This can be used to access Keycloak from outside the Run:ai Control Plane cluster via ingress | | `global.ingress.ingressClass` | Ingress class | Run:ai default is using NGINX. If your cluster has a different ingress controller, you can configure the ingress class to be created by Run:ai | | `global.ingress.tlsSecretName` | TLS secret name | Run:ai requires the creation of a secret with domain certificate. See [above](#domain-certificate). If the `runai-backend` namespace already had such a secret, you can set the secret name here | -| `global.postgresql.auth.username` | PostgreSQL username | Override the Run:ai default user name for the Run:ai database | -| `global.postgresql.auth.password` | PostgreSQL password | Override the Run:ai default password for the Run:ai database | -| `global.postgresql.auth.port` | PostgreSQL port | Override the default PostgreSQL port for the Run:ai database | + +| `postgresql.enabled`| PostgreSQL installation | If set to `false` the PostgreSQL will not be installed | +| `global.postgresql.auth.host` | PostgreSQL host | Hostname or IP address of the PostgreSQL server | +| `global.postgresql.auth.port` | PostgreSQL port | Port number on which PostgreSQL is running | +| `global.postgresql.auth.username` | PostgreSQL username | Username for connecting to PostgreSQL | +| `global.postgresql.auth.password` | PostgreSQL password | Password for the PostgreSQL user specified by `global.postgresql.auth.username` | +| `global.postgresql.auth.postgresPassword` | PostgreSQL default admin password | Password for the built-in PostgreSQL superuser (`postgres`) | +| `postgresql.primary.initdb.password` | PostgreSQL default admin password | Set the same password as in `global.postgresql.auth.postgresPassword` (if changed) | +| `grafana.dbUser` | Grafana database username | Username for accessing the Grafana database | +| `grafana.dbPassword` | Grafana database password | Password for the Grafana database user | | `grafana.adminUser` | Grafana username | Override the Run:ai default user name for accessing Grafana | | `grafana.adminPassword` | Grafana password | Override the Run:ai default password for accessing Grafana | | `thanos.receive.persistence.storageClass` and `postgresql.primary.persistence.storageClass` | Storage class | The installation to work with a specific storage class rather than the default one | From f08e60fd99e780d792ab4158ffa6d906a7f7794c Mon Sep 17 00:00:00 2001 From: Oz Bar-Shalom Date: Wed, 26 Jun 2024 13:55:38 +0300 Subject: [PATCH 54/87] external pg --- .../self-hosted/ocp/preparations.md | 37 +------------------ 1 file changed, 1 insertion(+), 36 deletions(-) diff --git a/docs/admin/runai-setup/self-hosted/ocp/preparations.md b/docs/admin/runai-setup/self-hosted/ocp/preparations.md index eeee2416e4..5ebbf310fd 100644 --- a/docs/admin/runai-setup/self-hosted/ocp/preparations.md +++ b/docs/admin/runai-setup/self-hosted/ocp/preparations.md @@ -84,6 +84,7 @@ kubectl label node node-role.kubernetes.io/runai-system=true Do not select the Kubernetes master as a `runai-system` node. This may cause Kubernetes to stop working (specifically if Kubernetes API Server is configured on 443 instead of the default 6443). ### External Postgres database (optional) +### External Postgres database (optional) If you have opted to use an [external PostgreSQL database](prerequisites.md#external-postgresql-database-optional). , you need to perform initial setup to ensure successful installation. Follow these steps: @@ -133,42 +134,6 @@ If you have opted to use an [external PostgreSQL database](prerequisites.md#exte 4. Replace `` with the name of your PostgreSQL database. 5. Replace `` with the path to the SQL script created in the previous step. - -If you have opted to use an [external PostgreSQL database](prerequisites.md#external-postgresql-database-optional). -, you need to perform initial setup to ensure successful installation. Follow these steps: -Run the following command on a machine where PostgreSQL client (`pgsql`) is installed: - -``` bash -curl -fsSL https://raw.githubusercontent.com/run-ai/public/main/externalpg-script.sql | psql --host \ - --user \ # (1) - --port \ # (2) - --dbname \ # (3) - --set=database_name= \ # (4) - --set=role_name='backend' \ # (5) - --set=role_password='runai_password' \ # (6) - --set=grafana_password='runai_grafana_password' # (7) -``` - -1. Replace `` with the PostgreSQL username. -2. Replace `` with the port number where PostgreSQL is running. -3. Replace `` with the name of your PostgreSQL database. -4. Replace `` with the name of your PostgreSQL database. -5. Replace `'runai_role'` with the name of the PostgreSQL role (user) to be created. -6. Replace `'runai_password'` with the password for the PostgreSQL role (user). -7. Replace `'runai_grafana_password'` with the password to be set for Grafana integration. - -Example: -``` bash -curl -fsSL https://raw.githubusercontent.com/run-ai/public/main/externalpg-script.sql | psql --host pg-host \ - --user root \ - --port 5432 \ - --dbname runai_database \ - --set=database_name='runai_database' \ - --set=role_name='backend' \ - --set=role_password='password' \ - --set=grafana_password='password' -``` - ## Additional permissions As part of the installation, you will be required to install the [Control plane](backend.md) and [Cluster](cluster.md) Helm [Charts](https://helm.sh/){target=_blank}. The Helm Charts require Kubernetes administrator permissions. You can review the exact permissions provided by using the `--dry-run` on both helm charts. From 3428a2c11ac4c473e7e6b59e5b945a5fd00e999b Mon Sep 17 00:00:00 2001 From: Oz Bar-Shalom Date: Wed, 26 Jun 2024 14:00:45 +0300 Subject: [PATCH 55/87] . --- docs/admin/runai-setup/self-hosted/ocp/preparations.md | 1 - 1 file changed, 1 deletion(-) diff --git a/docs/admin/runai-setup/self-hosted/ocp/preparations.md b/docs/admin/runai-setup/self-hosted/ocp/preparations.md index 5ebbf310fd..00cd51dc24 100644 --- a/docs/admin/runai-setup/self-hosted/ocp/preparations.md +++ b/docs/admin/runai-setup/self-hosted/ocp/preparations.md @@ -84,7 +84,6 @@ kubectl label node node-role.kubernetes.io/runai-system=true Do not select the Kubernetes master as a `runai-system` node. This may cause Kubernetes to stop working (specifically if Kubernetes API Server is configured on 443 instead of the default 6443). ### External Postgres database (optional) -### External Postgres database (optional) If you have opted to use an [external PostgreSQL database](prerequisites.md#external-postgresql-database-optional). , you need to perform initial setup to ensure successful installation. Follow these steps: From b863e976cd73f0fed5ac25cb1d23f8f3f08a5002 Mon Sep 17 00:00:00 2001 From: JamieWeider72 <147967555+JamieWeider72@users.noreply.github.com> Date: Wed, 26 Jun 2024 14:42:25 +0300 Subject: [PATCH 56/87] RUN-19295 Added GPU Memory Usage under Researcher --- docs/home/whats-new-2-18.md | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/docs/home/whats-new-2-18.md b/docs/home/whats-new-2-18.md index 54ec2f735e..389081ce77 100644 --- a/docs/home/whats-new-2-18.md +++ b/docs/home/whats-new-2-18.md @@ -33,6 +33,10 @@ date: 2024-June-14 For more information about installing and using the Improved CLI, see [Improved CLI](../Researcher/cli-reference/new-cli/runai.md). +#### GPU memory swap + +* To ensure efficient usage of an organization’s resources, Run:ai provides multiple features on multiple layers to help administrators and practitioners maximize their existing GPUs resource utilization. Run:ai’s GPU memory swap feature helps administrators and AI practitioners to further increase the utilization of existing GPU HW by improving GPU sharing between AI initiatives and stakeholders. This is done by expending the GPU physical memory to the CPU memory which is typically an order of magnitude larger than that of the GPU. For more information see, [GPU Memory Swap](../Researcher/scheduling/gpu-memory-swap.md). + ### Run:ai Administrator * Added *Data Volumes* new feature. Data Volumes are snapshots of datasets stored in Kubernetes Persistent Volume Claims (PVCs). They act as a central repository for training data, and offer several key benefits. From cc8607f7bfdacf0aeb46833e2be36738999be5e1 Mon Sep 17 00:00:00 2001 From: jasonnovichRunAI <124490127+jasonnovichRunAI@users.noreply.github.com> Date: Wed, 26 Jun 2024 15:56:13 +0300 Subject: [PATCH 57/87] RUN-19363 add secrets in workload --- .../workspaces/create/create-ds.md | 14 ++++++++ .../admin/admin-ui-setup/credentials-setup.md | 35 ++++++++++++++----- docs/admin/workloads/submitting-workloads.md | 15 ++++---- 3 files changed, 49 insertions(+), 15 deletions(-) diff --git a/docs/Researcher/user-interface/workspaces/create/create-ds.md b/docs/Researcher/user-interface/workspaces/create/create-ds.md index ba7adddcf9..28cfb8cbfa 100644 --- a/docs/Researcher/user-interface/workspaces/create/create-ds.md +++ b/docs/Researcher/user-interface/workspaces/create/create-ds.md @@ -82,6 +82,20 @@ To create a host path data source, provide: * A ConfigMap name—select from the drop down. * A target location—the path to the container. +## Create a Secret as data source + +* A Run:ai project scope which is assigned to that item and all its subsidiaries. +* A *Credentials*. To create a new *Credentials*, see [Configuring Credentials](../../../../admin/admin-ui-setup/credentials-setup.md#configuring-credentials) + + !!! Note + You can only choose a project as a scope. + +* A data source name and description. +* A data mount consisting of: + + * A *Credentials*—select from the drop down. + * A target location—the path to the container. + ## Data sources table The *Data sources* table contains a column for the status of the data source. The following statuses are supported: diff --git a/docs/admin/admin-ui-setup/credentials-setup.md b/docs/admin/admin-ui-setup/credentials-setup.md index 6b2660b45d..2ab8d84df8 100644 --- a/docs/admin/admin-ui-setup/credentials-setup.md +++ b/docs/admin/admin-ui-setup/credentials-setup.md @@ -2,14 +2,16 @@ Credentials are used to unlock protected resources such as applications, containers, and other assets. -The *Credentials* manager in the Run:ai environment supports 3 types of credentials: +The *Credentials* manager in the Run:ai environment supports the following types of credentials: -1. [Docker registry](#docker-registry) -2. [Access key](#access-key) -3. [User name and password](#username-and-password) - +[Docker registry](#docker-registry) + +[Access key](#access-key) +[Username and password](#username-and-password) + +[Generic Secret](#generic-secret) + ## Secrets Credentials are built using `Secrets`. A `Secret` is an object that contains a small amount of sensitive data so that you don't need to include confidential data in your application code. When creating a credential you can either [create a new secret](#configuring-credentials) or use an [existing secret](#existing-secrets). @@ -68,7 +70,7 @@ To configure *Credentials*: * If you choose `New secret`, enter a username and password. -4. Enter a URL for the docker registry, then press `Create credential` to create the credential. +4. Enter a URL for the docker registry, then press `Create credentials` to create the credential. ### `Access key` @@ -83,7 +85,7 @@ To configure *Credentials*: * If you choose `New secret`, enter an access key and access secret. -4. Press `Create credential` to create the credential. +4. Press `Create credentials` to create the credential. ### `Username and password` @@ -98,7 +100,22 @@ To configure *Credentials*: * If you choose `New secret`, enter a username and password. -4. Press `Create credential` to create the credential. +4. Press `Create credentials` to create the credential. + +### Generic Secret + +1. Select a `Scope` (cluster, department, or project) for the credential. +2. In the `Credential name` field, enter a name for the credential, and the in the *Description* field, enter a description.. +3. In the `Secret` field, choose from `Existing secret` or `New secret`. + + * If you select `Existing secret`, select an unused secret from the drop down. + + !!! Note + Existing secrets can't be used more than once. + + * If you choose `New secret`, enter a key, valuer pair. + +4. Press `Create credentials` to create the credential. ## Credentials Table diff --git a/docs/admin/workloads/submitting-workloads.md b/docs/admin/workloads/submitting-workloads.md index ef33968970..5c4e3f3472 100644 --- a/docs/admin/workloads/submitting-workloads.md +++ b/docs/admin/workloads/submitting-workloads.md @@ -29,10 +29,11 @@ To submit a workload using the UI: 5. Enter the *Container path* for volume target location. 6. Select a *Volume persistency. - 7. In the *Data sources* pane, press *add a new data source*. For more information, see [Creating a new data source](../../Researcher/user-interface/workspaces/create/create-ds.md) When complete press, *Create Data Source*. + 7. In the *Data sources* pane, select a data source. If you need a new data source, press *add a new data source*. For more information, see [Creating a new data source](../../Researcher/user-interface/workspaces/create/create-ds.md) When complete press, *Create Data Source*. !!! Note - Data sources that have private credentials that have the status of issues found will be greyed out. + * Data sources that have private credentials, which have the status of *issues found*, will be greyed out. + * Data sources can now include *Secrets*. 8. In the *General* pane, add special settings for your training (optional): @@ -68,10 +69,11 @@ To submit a workload using the UI: 5. Enter the *Container path* for volume target location. 6. Select a *Volume persistency. - 8. (Optional) In the *Data sources* pane, press *add a new data source*. For more information, see [Creating a new data source](../../Researcher/user-interface/workspaces/create/create-ds.md) When complete press, *Create Data Source*. + 8. (Optional) In the *Data sources* pane, select a data source. If you need a new data source, press *add a new data source*. For more information, see [Creating a new data source](../../Researcher/user-interface/workspaces/create/create-ds.md) When complete press, *Create Data Source*. !!! Note - Data sources that have private credentials that have the status of issues found will be greyed out. + * Data sources that have private credentials, which have the status of *issues found*, will be greyed out. + * * Data sources can now include *Secrets*. 9. (Optional) In the *General* pane, add special settings for your training (optional): @@ -95,10 +97,11 @@ To submit a workload using the UI: 5. Enter the *Container path* for volume target location. 6. Select a *Volume persistency. - 4. (Optional) In the *Data sources* pane, press *add a new data source*. For more information, see [Creating a new data source](../../Researcher/user-interface/workspaces/create/create-ds.md) When complete press, *Create Data Source*. + 4. (Optional) In the *Data sources* pane, select a data source. If you need a new data source, press *add a new data source*. For more information, see [Creating a new data source](../../Researcher/user-interface/workspaces/create/create-ds.md) When complete press, *Create Data Source*. !!! Note - Data sources that have private credentials that have the status of issues found will be greyed out. + * Data sources that have private credentials, which have the status of *issues found*, will be greyed out. + * * Data sources can now include *Secrets*. 5. (Optional) In the *General* pane, add special settings for your training (optional): From 4b52427b7e836e7c5de1d7bd1455f0640683ae3c Mon Sep 17 00:00:00 2001 From: jasonnovichRunAI <124490127+jasonnovichRunAI@users.noreply.github.com> Date: Wed, 26 Jun 2024 16:21:39 +0300 Subject: [PATCH 58/87] RUN-19363 markdown correction --- docs/admin/admin-ui-setup/credentials-setup.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/admin/admin-ui-setup/credentials-setup.md b/docs/admin/admin-ui-setup/credentials-setup.md index 2ab8d84df8..948e87798e 100644 --- a/docs/admin/admin-ui-setup/credentials-setup.md +++ b/docs/admin/admin-ui-setup/credentials-setup.md @@ -11,7 +11,7 @@ The *Credentials* manager in the Run:ai environment supports the following types [Username and password](#username-and-password) [Generic Secret](#generic-secret) - + ## Secrets Credentials are built using `Secrets`. A `Secret` is an object that contains a small amount of sensitive data so that you don't need to include confidential data in your application code. When creating a credential you can either [create a new secret](#configuring-credentials) or use an [existing secret](#existing-secrets). From 3e1f2dc562423379689fb5630f10299a439aa6d7 Mon Sep 17 00:00:00 2001 From: jasonnovichRunAI <124490127+jasonnovichRunAI@users.noreply.github.com> Date: Wed, 26 Jun 2024 16:31:08 +0300 Subject: [PATCH 59/87] RUN-19295 add secret as data source, generic credential, expose in workload --- docs/home/whats-new-2-18.md | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/docs/home/whats-new-2-18.md b/docs/home/whats-new-2-18.md index 389081ce77..87052b603a 100644 --- a/docs/home/whats-new-2-18.md +++ b/docs/home/whats-new-2-18.md @@ -21,6 +21,8 @@ date: 2024-June-14 * Updated *Auto-deletion time* default value. Previously the default was **90 days** now the default is **30 days**. +* Added new data sources to workload to include project secrets. + #### Command Line Interface * Added an improved researcher focused Command Line Interface (CLI). The improved CLI brings usability enhancements for researcher which include: @@ -35,10 +37,12 @@ date: 2024-June-14 #### GPU memory swap -* To ensure efficient usage of an organization’s resources, Run:ai provides multiple features on multiple layers to help administrators and practitioners maximize their existing GPUs resource utilization. Run:ai’s GPU memory swap feature helps administrators and AI practitioners to further increase the utilization of existing GPU HW by improving GPU sharing between AI initiatives and stakeholders. This is done by expending the GPU physical memory to the CPU memory which is typically an order of magnitude larger than that of the GPU. For more information see, [GPU Memory Swap](../Researcher/scheduling/gpu-memory-swap.md). +* To ensure efficient usage of an organization’s resources, Run:ai provides multiple features on multiple layers to help administrators and practitioners maximize their existing GPUs resource utilization. Run:ai’s GPU memory swap feature helps administrators and AI practitioners to further increase the utilization of existing GPU HW by improving GPU sharing between AI initiatives and stakeholders. This is done by expending the GPU physical memory to the CPU memory which is typically an order of magnitude larger than that of the GPU. For more information see, [GPU Memory Swap](../Researcher/scheduling/gpu-memory-swap.md). ### Run:ai Administrator +#### Data Sources + * Added *Data Volumes* new feature. Data Volumes are snapshots of datasets stored in Kubernetes Persistent Volume Claims (PVCs). They act as a central repository for training data, and offer several key benefits. * Managed with dedicated permissions—Data Admins, a new role within Run.ai, have exclusive control over data volume creation, data population, and sharing. @@ -47,6 +51,12 @@ date: 2024-June-14 For more information, see [Data Volumes](../developer/admin-rest-api/data-volumes.md). +* Added new data source type. Run:ai now allows you to configure a *Credential* (Secret) as a data source. + +#### Credentials + +* Added new *Generic secret* to the *Credentials*. + #### SSO * Run:ai now supports SSO using OpenShift v4 (which is based on OIDC). Before using OpenShift, you must first define OAuthClient which interacts with OpenShift's OAuth server to authenticate users and request access tokens. For more information, see [Single Sign-On](../admin/runai-setup/authentication/sso/). From cc60db036a8f96eee62eb5a07d5d3f3d082976b7 Mon Sep 17 00:00:00 2001 From: jasonnovichRunAI <124490127+jasonnovichRunAI@users.noreply.github.com> Date: Thu, 27 Jun 2024 09:33:30 +0300 Subject: [PATCH 60/87] RUN-19295 add autoscaling latency --- docs/home/whats-new-2-18.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/docs/home/whats-new-2-18.md b/docs/home/whats-new-2-18.md index 87052b603a..6677886508 100644 --- a/docs/home/whats-new-2-18.md +++ b/docs/home/whats-new-2-18.md @@ -23,6 +23,8 @@ date: 2024-June-14 * Added new data sources to workload to include project secrets. +* Added latency metric for autoscaling. This feature is used to set a target threshold for the response time of requests. This will adjust the number of applications to keep the response time below that threshold. For more information, see [Auto scaling](). + #### Command Line Interface * Added an improved researcher focused Command Line Interface (CLI). The improved CLI brings usability enhancements for researcher which include: From d5dc4b3257a0c68a3b74746961cb355419a0d937 Mon Sep 17 00:00:00 2001 From: jasonnovichRunAI <124490127+jasonnovichRunAI@users.noreply.github.com> Date: Thu, 27 Jun 2024 10:01:51 +0300 Subject: [PATCH 61/87] RUN-19295 add chatui as env --- docs/home/whats-new-2-18.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/docs/home/whats-new-2-18.md b/docs/home/whats-new-2-18.md index 6677886508..8b559fd450 100644 --- a/docs/home/whats-new-2-18.md +++ b/docs/home/whats-new-2-18.md @@ -25,6 +25,8 @@ date: 2024-June-14 * Added latency metric for autoscaling. This feature is used to set a target threshold for the response time of requests. This will adjust the number of applications to keep the response time below that threshold. For more information, see [Auto scaling](). +* Improved autoscaling for ChatUi models. Run:ai has improved autoscaling performance with ChatI models by adding them to *Environments*. ChatUi is an addition to inference workloads and is not mandatory for all types of workloads. For more information, see [Models](). + #### Command Line Interface * Added an improved researcher focused Command Line Interface (CLI). The improved CLI brings usability enhancements for researcher which include: From 9141c4a98c32ec08cab3566e453f742e4626a768 Mon Sep 17 00:00:00 2001 From: jasonnovichRunAI <124490127+jasonnovichRunAI@users.noreply.github.com> Date: Thu, 27 Jun 2024 10:15:27 +0300 Subject: [PATCH 62/87] RUN-19295 add hugging face integration --- docs/home/whats-new-2-18.md | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/docs/home/whats-new-2-18.md b/docs/home/whats-new-2-18.md index 8b559fd450..a3fa473295 100644 --- a/docs/home/whats-new-2-18.md +++ b/docs/home/whats-new-2-18.md @@ -25,7 +25,11 @@ date: 2024-June-14 * Added latency metric for autoscaling. This feature is used to set a target threshold for the response time of requests. This will adjust the number of applications to keep the response time below that threshold. For more information, see [Auto scaling](). -* Improved autoscaling for ChatUi models. Run:ai has improved autoscaling performance with ChatI models by adding them to *Environments*. ChatUi is an addition to inference workloads and is not mandatory for all types of workloads. For more information, see [Models](). +* Improved autoscaling for ChatUi models. Run:ai has improved autoscaling performance with ChatI models by adding them to *Environments*. ChatUi is an addition to inference workloads and is not mandatory for all types of workloads. For more information, see [Models](). + +* Added Hugging Face catalog integration in inference workloads. Run:ai has added Hugging Face integration directly to the inferenc e workload form, providing the ability to add models and data sets directly from the Hugging Face catalog. Hugging Face is a ML platform that helps users build, deploy and train machine learning models. For more information on how Hugging Face is integrated, see [Hugging Face](link to hugging face in the models doc). + +It provides the infrastructure to demo, run and deploy artificial intelligence (AI) in live applications. Users can also browse through models and data sets that other people have uploaded. #### Command Line Interface From 5ef72ca2513b0b50767f0e8e3481067914a85660 Mon Sep 17 00:00:00 2001 From: jasonnovichRunAI <124490127+jasonnovichRunAI@users.noreply.github.com> Date: Thu, 27 Jun 2024 12:31:48 +0300 Subject: [PATCH 63/87] Update docs/developer/admin-rest-api/data-volumes.md --- docs/developer/admin-rest-api/data-volumes.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/developer/admin-rest-api/data-volumes.md b/docs/developer/admin-rest-api/data-volumes.md index e6b6ffc386..4834094026 100644 --- a/docs/developer/admin-rest-api/data-volumes.md +++ b/docs/developer/admin-rest-api/data-volumes.md @@ -97,7 +97,7 @@ This section outlines the procedure for creating, sharing, and submitting (Resea ### Creating Data Volumes !!! Note - Data volume admins can create data volumes within specific projects. Since data volumes are created from PVCs, there has to be a PVC in the namespace of a run:ai project for Run:Ai to have access to it and create the Data volume from it. Once the DV is created, the admin manages its sharing configurations. + Data volume admins can create data volumes within specific projects. Since data volumes are created from PVs, there has to be a PV in the namespace of a run:ai project for Run:Ai to have access to it and create the Data volume from it. Once the DV is created, the admin manages its sharing configurations. Data Volumes are created using the API endpoint. For more information, see [Data Volumes](https://app.run.ai/api/docs#tag/Data-Volumes) From f69c38a9d4b08264d1ea1925f8341601daa9d818 Mon Sep 17 00:00:00 2001 From: JamieWeider72 <147967555+JamieWeider72@users.noreply.github.com> Date: Thu, 27 Jun 2024 13:48:35 +0300 Subject: [PATCH 64/87] Run-19295 Added ownership protection --- docs/home/whats-new-2-18.md | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/docs/home/whats-new-2-18.md b/docs/home/whats-new-2-18.md index a3fa473295..ca574fd7cd 100644 --- a/docs/home/whats-new-2-18.md +++ b/docs/home/whats-new-2-18.md @@ -67,9 +67,13 @@ It provides the infrastructure to demo, run and deploy artificial intelligence ( #### SSO -* Run:ai now supports SSO using OpenShift v4 (which is based on OIDC). Before using OpenShift, you must first define OAuthClient which interacts with OpenShift's OAuth server to authenticate users and request access tokens. For more information, see [Single Sign-On](../admin/runai-setup/authentication/sso/). +* Run:ai now supports SSO using OpenShift v4 (which is based on OIDC). Before using OpenShift, you must first define OAuthClient which interacts with OpenShift's OAuth server to authenticate users and request access tokens. For more information, see [Single Sign-On](../admin/runai-setup/authentication/sso/). -* OIDC scopes have been added to the authentication request. Scopes are used to specify what access privileges are being requested for access tokens. The scopes associated with the access tokens determine what resource are available when they are used to access OAuth 2.0 protected endpoints. Protected endpoints may perform different actions and return different information based on the scope values and other parameters used when requesting the presented access token. For more information, see [UI configuration](../admin/runai-setup/authentication/sso/#step-1-ui-configuration). +* OIDC scopes have been added to the authentication request. Scopes are used to specify what access privileges are being requested for access tokens. The scopes associated with the access tokens determine what resource are available when they are used to access OAuth 2.0 protected endpoints. Protected endpoints may perform different actions and return different information based on the scope values and other parameters used when requesting the presented access token. For more information, see [UI configuration](../admin/runai-setup/authentication/sso/#step-1-ui-configuration). + +#### Ownership protection + +* Ownership protection in Run:ai ensures that only authorized users can delete or modify workloads. This feature is designed to safeguard important jobs and configurations from accidental or unauthorized modifications by users who did not originally create the workload. ## Deprecation Notifications From 7f51b11fad8eacd0a9435ba14cf9228a72368e71 Mon Sep 17 00:00:00 2001 From: JamieWeider72 <147967555+JamieWeider72@users.noreply.github.com> Date: Thu, 27 Jun 2024 14:16:29 +0300 Subject: [PATCH 65/87] RUN-19295 Added YAML workload Reference table under the Researcher section --- docs/home/whats-new-2-18.md | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/docs/home/whats-new-2-18.md b/docs/home/whats-new-2-18.md index ca574fd7cd..d9038449a0 100644 --- a/docs/home/whats-new-2-18.md +++ b/docs/home/whats-new-2-18.md @@ -47,6 +47,10 @@ It provides the infrastructure to demo, run and deploy artificial intelligence ( * To ensure efficient usage of an organization’s resources, Run:ai provides multiple features on multiple layers to help administrators and practitioners maximize their existing GPUs resource utilization. Run:ai’s GPU memory swap feature helps administrators and AI practitioners to further increase the utilization of existing GPU HW by improving GPU sharing between AI initiatives and stakeholders. This is done by expending the GPU physical memory to the CPU memory which is typically an order of magnitude larger than that of the GPU. For more information see, [GPU Memory Swap](../Researcher/scheduling/gpu-memory-swap.md). +#### YAML Workload Reference table + +* Added doc containing the value types and workload YAML references. Each table contains the field name, its description and the supported Run:ai workload types. The YAML field details contains information on the value type and currently available exammple workload snippets. For more information see ... + ### Run:ai Administrator #### Data Sources From 5fb61fc1e184dcc8f16ffdda7dfddd67835faae1 Mon Sep 17 00:00:00 2001 From: jasonnovichRunAI <124490127+jasonnovichRunAI@users.noreply.github.com> Date: Thu, 27 Jun 2024 14:40:10 +0300 Subject: [PATCH 66/87] RUN-16337 add first login and shell configs --- .../Researcher/cli-reference/new-cli/runai.md | 37 +++++++++++++++++++ 1 file changed, 37 insertions(+) diff --git a/docs/Researcher/cli-reference/new-cli/runai.md b/docs/Researcher/cli-reference/new-cli/runai.md index 59ab7e63fb..6482686ccd 100644 --- a/docs/Researcher/cli-reference/new-cli/runai.md +++ b/docs/Researcher/cli-reference/new-cli/runai.md @@ -28,8 +28,45 @@ To install the Improved Command Line Interface: 4. Copy the installer command to your clipboard, then paste it into a terminal window and run the command. 5. Follow the instruction prompts during the installation process. Press `Enter` to use the default values (recommended). +### Install Command Auto-Completion + +Auto-completion is installed automatically. + +To install it manually: + +* For *ZSH*, edit the file ~/.zshrc and add the following lines: + +```zsh +autoload -U compinit; compinit -i +source <(runai completion zsh) +``` + +* For *bash*, install the bash-completion package. Choose your operating system: + + * Mac: brew install bash-completion + * Ubuntu/Debian: sudo apt-get install bash-completion + * Fedora/Centos: sudo yum install bash-completion + +Then, edit the file ~/.bashrc and add the following lines: + +```bash +[[ -r “/usr/local/etc/profile.d/bash_completion.sh” ]] && . “/usr/local/etc/profile.d/bash_completion.sh” + +source <(runai completion bash) +``` + +After you have configured your shell, you will need to login to authenticate the CLI. +In your terminal widow run: +`runai login` +You will be redirected to your platform's login page. +Enter your user name and password and login. + +You can then return to the terminal window to use the CLI. + ### Options +You can use the following configuration options with your CLI to customize your CLI. + ``` --config-file string config file name; can be set by environment variable RUNAI_CLI_CONFIG_FILE (default "config.json") --config-path string config path; can be set by environment variable RUNAI_CLI_CONFIG_PATH (default "~/.runai/") From 5b9a369df5780490a9827e386bed66ed11501d7c Mon Sep 17 00:00:00 2001 From: jasonnovichRunAI <124490127+jasonnovichRunAI@users.noreply.github.com> Date: Thu, 27 Jun 2024 14:58:52 +0300 Subject: [PATCH 67/87] RUN-16337 add default cluster and project config --- .../Researcher/cli-reference/new-cli/runai.md | 31 ++++++++++++++++++- 1 file changed, 30 insertions(+), 1 deletion(-) diff --git a/docs/Researcher/cli-reference/new-cli/runai.md b/docs/Researcher/cli-reference/new-cli/runai.md index 6482686ccd..dde5a6950a 100644 --- a/docs/Researcher/cli-reference/new-cli/runai.md +++ b/docs/Researcher/cli-reference/new-cli/runai.md @@ -30,7 +30,7 @@ To install the Improved Command Line Interface: ### Install Command Auto-Completion -Auto-completion is installed automatically. +Auto-completion is installed automatically. To install it manually: @@ -55,6 +55,8 @@ Then, edit the file ~/.bashrc and add the following lines: source <(runai completion bash) ``` +### Authenticating your CLI + After you have configured your shell, you will need to login to authenticate the CLI. In your terminal widow run: `runai login` @@ -63,6 +65,33 @@ Enter your user name and password and login. You can then return to the terminal window to use the CLI. +### Set the default cluster + +When you only have one cluster connected to the tenant, it will be set as default cluster when you first login. + +When there are multiple clusters, you can select the cluster you want to set as default by running the following: + +`runai cluster set --name ` + +To find the desired cluster name run: + +`runai cluster list` + +### Set a default project + +!!! Recommendation + Setting a default working project to, allows you to easily submit workloads without mentioning the project name in every command. + +`runai project set --name=` + +If successful the following message will return: + +`project configured successfully` + +To see the current configuration run: + +`runai config generate --json` + ### Options You can use the following configuration options with your CLI to customize your CLI. From a7e20ba603a733f8c0bcd5676890e729b919c837 Mon Sep 17 00:00:00 2001 From: jasonnovichRunAI <124490127+jasonnovichRunAI@users.noreply.github.com> Date: Thu, 27 Jun 2024 15:00:21 +0300 Subject: [PATCH 68/87] RUN-16337 add inline code block to OS install --- docs/Researcher/cli-reference/new-cli/runai.md | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/docs/Researcher/cli-reference/new-cli/runai.md b/docs/Researcher/cli-reference/new-cli/runai.md index dde5a6950a..d05689b8f9 100644 --- a/docs/Researcher/cli-reference/new-cli/runai.md +++ b/docs/Researcher/cli-reference/new-cli/runai.md @@ -43,9 +43,9 @@ source <(runai completion zsh) * For *bash*, install the bash-completion package. Choose your operating system: - * Mac: brew install bash-completion - * Ubuntu/Debian: sudo apt-get install bash-completion - * Fedora/Centos: sudo yum install bash-completion + * Mac: `brew install bash-completion` + * Ubuntu/Debian: `sudo apt-get install bash-completion` + * Fedora/Centos: `sudo yum install bash-completion` Then, edit the file ~/.bashrc and add the following lines: @@ -59,7 +59,9 @@ source <(runai completion bash) After you have configured your shell, you will need to login to authenticate the CLI. In your terminal widow run: + `runai login` + You will be redirected to your platform's login page. Enter your user name and password and login. From ebff5893c86ab7fb2a7aae7a1a56ec7273e48ae7 Mon Sep 17 00:00:00 2001 From: jasonnovichRunAI <124490127+jasonnovichRunAI@users.noreply.github.com> Date: Thu, 27 Jun 2024 15:04:54 +0300 Subject: [PATCH 69/87] RUN-16337 code block corrections --- docs/Researcher/cli-reference/new-cli/runai.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/Researcher/cli-reference/new-cli/runai.md b/docs/Researcher/cli-reference/new-cli/runai.md index d05689b8f9..c0d5f20e1f 100644 --- a/docs/Researcher/cli-reference/new-cli/runai.md +++ b/docs/Researcher/cli-reference/new-cli/runai.md @@ -34,7 +34,7 @@ Auto-completion is installed automatically. To install it manually: -* For *ZSH*, edit the file ~/.zshrc and add the following lines: +* For *ZSH*, edit the file `~/.zshrc` and add the following lines: ```zsh autoload -U compinit; compinit -i @@ -47,7 +47,7 @@ source <(runai completion zsh) * Ubuntu/Debian: `sudo apt-get install bash-completion` * Fedora/Centos: `sudo yum install bash-completion` -Then, edit the file ~/.bashrc and add the following lines: +Then, edit the file `~/.bashrc` and add the following lines: ```bash [[ -r “/usr/local/etc/profile.d/bash_completion.sh” ]] && . “/usr/local/etc/profile.d/bash_completion.sh” From cd9afb7be3a49dba546dc9de32c30ba36673dd13 Mon Sep 17 00:00:00 2001 From: JamieWeider72 <147967555+JamieWeider72@users.noreply.github.com> Date: Thu, 27 Jun 2024 15:21:16 +0300 Subject: [PATCH 70/87] RUN-19295 Minor corrections --- docs/home/whats-new-2-18.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/home/whats-new-2-18.md b/docs/home/whats-new-2-18.md index d9038449a0..93633c8acf 100644 --- a/docs/home/whats-new-2-18.md +++ b/docs/home/whats-new-2-18.md @@ -49,7 +49,7 @@ It provides the infrastructure to demo, run and deploy artificial intelligence ( #### YAML Workload Reference table -* Added doc containing the value types and workload YAML references. Each table contains the field name, its description and the supported Run:ai workload types. The YAML field details contains information on the value type and currently available exammple workload snippets. For more information see ... +* Added a file detailing the value types and workload YAML references. Each table contains the field name, its description and the supported Run:ai workload types. The individual YAML field details contains information on the value type and currently available exammple workload snippets. For more information see ... ### Run:ai Administrator From bff72eab081da5de45ac378b787bc9ef47a9d76f Mon Sep 17 00:00:00 2001 From: JamieWeider72 <147967555+JamieWeider72@users.noreply.github.com> Date: Thu, 27 Jun 2024 15:31:02 +0300 Subject: [PATCH 71/87] RUN-19557 Added workload ownership protection --- docs/admin/workloads/submitting-workloads.md | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/docs/admin/workloads/submitting-workloads.md b/docs/admin/workloads/submitting-workloads.md index ef33968970..73103885f5 100644 --- a/docs/admin/workloads/submitting-workloads.md +++ b/docs/admin/workloads/submitting-workloads.md @@ -150,3 +150,19 @@ To submit a workload using the UI: ## Workload Policies As an administrator, you can set *Policies* on Workloads. Policies allow administrators to *impose restrictions* and set *default values* for Researcher Workloads. For more information see [Workload Policies](../workloads/policies/policies.md). + +## Worklaod Ownership Protection + +Workload ownership protection in Run:ai ensures that only users who created a workload can delete or modify them. This feature is designed to safeguard important jobs and configurations from accidental or unauthorized modifications by users who did not originally create the workload. + +By enforcing ownership rules, Run:ai helps maintain the integrity and security of your machine learning operations. This additional layer of security ensures that only users with the appropriate permissions can delete and suspend workloads. + +This protection maintains workflow stability and prevents disruptions in shared or collaborative environments. + +This feature is implemented at the cluster management entity level. + +To enable ownership protection: + +1. Update the runai-public configmap for workloadOwnershipProtection, true = enabled +2. Perform cluster-sync to update cluster-service in the CP +3. Use the workload-service flag to block deletion and suspension of workloads, when appropriate From 35854dab68aba7a642d824d2a83fe5dffeeed7ee Mon Sep 17 00:00:00 2001 From: Oz Bar-Shalom Date: Sun, 30 Jun 2024 11:03:20 +0300 Subject: [PATCH 72/87] fixed pr comments --- docs/admin/runai-setup/self-hosted/k8s/backend.md | 1 - docs/admin/runai-setup/self-hosted/k8s/preparations.md | 7 +++---- docs/admin/runai-setup/self-hosted/k8s/prerequisites.md | 1 - docs/admin/runai-setup/self-hosted/ocp/backend.md | 2 -- docs/admin/runai-setup/self-hosted/ocp/preparations.md | 9 ++++----- 5 files changed, 7 insertions(+), 13 deletions(-) diff --git a/docs/admin/runai-setup/self-hosted/k8s/backend.md b/docs/admin/runai-setup/self-hosted/k8s/backend.md index 1aa5bfa947..e5d73dade3 100644 --- a/docs/admin/runai-setup/self-hosted/k8s/backend.md +++ b/docs/admin/runai-setup/self-hosted/k8s/backend.md @@ -51,7 +51,6 @@ There may be cases where you need to set additional properties as follows: | `global.keycloakx.host` | KeyCloak (Run:ai internal identity provider) host path | Override the DNS for Keycloak. This can be used to access Keycloak from outside the Run:ai Control Plane cluster via ingress | | `global.ingress.ingressClass` | Ingress class | Run:ai default is using NGINX. If your cluster has a different ingress controller, you can configure the ingress class to be created by Run:ai | | `global.ingress.tlsSecretName` | TLS secret name | Run:ai requires the creation of a secret with domain certificate. See [above](#domain-certificate). If the `runai-backend` namespace already had such a secret, you can set the secret name here | - | `postgresql.enabled`| PostgreSQL installation | If set to `false` the PostgreSQL will not be installed | | `global.postgresql.auth.host` | PostgreSQL host | Hostname or IP address of the PostgreSQL server | | `global.postgresql.auth.port` | PostgreSQL port | Port number on which PostgreSQL is running | diff --git a/docs/admin/runai-setup/self-hosted/k8s/preparations.md b/docs/admin/runai-setup/self-hosted/k8s/preparations.md index 84dfb491cc..569378c375 100644 --- a/docs/admin/runai-setup/self-hosted/k8s/preparations.md +++ b/docs/admin/runai-setup/self-hosted/k8s/preparations.md @@ -101,9 +101,9 @@ If you have opted to use an [external PostgreSQL database](prerequisites.md#exte , you need to perform initial setup to ensure successful installation. Follow these steps: 1. Create a SQL script file, edit the parameters below, and save it locally: - * Replace `` with the name of your PostgreSQL database. - * Replace `` with the password for the PostgreSQL role (user). - * Replace `` with the name of the PostgreSQL role (user) to be created. + * Replace `` with a dedicate database name for RunAi in your PostgreSQL database. + * Replace `` with a dedicated role name (user) for RunAi database. + * Replace `` with a password for the new PostgreSQL role. * Replace `` with the password to be set for Grafana integration. ``` sql @@ -127,7 +127,6 @@ If you have opted to use an [external PostgreSQL database](prerequisites.md#exte \q ``` - 2. run the following command on a machine where PostgreSQL client (`pgsql`) is installed: ``` bash diff --git a/docs/admin/runai-setup/self-hosted/k8s/prerequisites.md b/docs/admin/runai-setup/self-hosted/k8s/prerequisites.md index e63f44eec6..1872f97a38 100644 --- a/docs/admin/runai-setup/self-hosted/k8s/prerequisites.md +++ b/docs/admin/runai-setup/self-hosted/k8s/prerequisites.md @@ -81,7 +81,6 @@ See Run:ai Cluster prerequisites [Inference](../../cluster-setup/cluster-prerequ > The Run:ai control plane, when installed without a Run:ai cluster, does not require the Inference prerequisites. - ### External Postgres database (optional) The Run:ai Control Plane installation includes a default PostgreSQL database. However, you may opt to use an existing PostgreSQL database if you have specific requirements or preferences. Please ensure that your PostgreSQL database is version 16 or higher. diff --git a/docs/admin/runai-setup/self-hosted/ocp/backend.md b/docs/admin/runai-setup/self-hosted/ocp/backend.md index 560cf601de..7c8f9a5cae 100644 --- a/docs/admin/runai-setup/self-hosted/ocp/backend.md +++ b/docs/admin/runai-setup/self-hosted/ocp/backend.md @@ -4,7 +4,6 @@ Make sure you have followed the Control Plane [prerequisites](./prerequisites.md) and [preperations](./preperations.md). - ## Install the Control Plane Run the helm command below: @@ -80,7 +79,6 @@ If you have opted to connect to an [external PostgreSQL database](preperations.m * `grafana.dbUser` * `grafana.dbPassword` - ## Next steps ### Connect to Run:ai user interface diff --git a/docs/admin/runai-setup/self-hosted/ocp/preparations.md b/docs/admin/runai-setup/self-hosted/ocp/preparations.md index 00cd51dc24..1fe95f563b 100644 --- a/docs/admin/runai-setup/self-hosted/ocp/preparations.md +++ b/docs/admin/runai-setup/self-hosted/ocp/preparations.md @@ -89,10 +89,10 @@ If you have opted to use an [external PostgreSQL database](prerequisites.md#exte , you need to perform initial setup to ensure successful installation. Follow these steps: 1. Create a SQL script file, edit the parameters below, and save it locally: - * Replace `` with the name of your PostgreSQL database. - * Replace `` with the password for the PostgreSQL role (user). - * Replace `` with the name of the PostgreSQL role (user) to be created. - * Replace `` with the password to be set for Grafana integration. + * Replace `` with a dedicate database name for RunAi in your PostgreSQL database. + * Replace `` with a dedicated role name (user) for RunAi database. + * Replace `` with a password for the new PostgreSQL role. + * Replace `` with the password to be set for Grafana integration. ``` sql -- Create a new database for runai @@ -115,7 +115,6 @@ If you have opted to use an [external PostgreSQL database](prerequisites.md#exte \q ``` - 2. run the following command on a machine where PostgreSQL client (`pgsql`) is installed: ``` bash From 0859198cf2970b99fee1e7d140dbf21cc3b43baa Mon Sep 17 00:00:00 2001 From: Oz Bar-Shalom Date: Sun, 30 Jun 2024 11:04:14 +0300 Subject: [PATCH 73/87] . --- docs/admin/runai-setup/self-hosted/k8s/preparations.md | 1 - 1 file changed, 1 deletion(-) diff --git a/docs/admin/runai-setup/self-hosted/k8s/preparations.md b/docs/admin/runai-setup/self-hosted/k8s/preparations.md index 569378c375..03c7d99c23 100644 --- a/docs/admin/runai-setup/self-hosted/k8s/preparations.md +++ b/docs/admin/runai-setup/self-hosted/k8s/preparations.md @@ -77,7 +77,6 @@ You must provide the domain's private key and crt as a Kubernetes secret in the kubectl create secret tls runai-backend-tls -n runai-backend \ --cert /path/to/fullchain.pem --key /path/to/private.pem ``` - ### Local Certificate Authority (air-gapped only) In air-gapped environments, you must prepare the public key of your local certificate authority as described [here](../../config/org-cert.md). It will need to be installed in Kubernetes for the installation to succeed. From fe50ea13577de5404619d850de089e0489af86ab Mon Sep 17 00:00:00 2001 From: JamieWeider72 <147967555+JamieWeider72@users.noreply.github.com> Date: Sun, 30 Jun 2024 12:06:59 +0300 Subject: [PATCH 74/87] Apply suggestions from code review --- docs/admin/runai-setup/self-hosted/k8s/backend.md | 2 +- docs/admin/runai-setup/self-hosted/k8s/preparations.md | 5 ++--- docs/admin/runai-setup/self-hosted/k8s/prerequisites.md | 2 +- docs/admin/runai-setup/self-hosted/ocp/backend.md | 2 +- docs/admin/runai-setup/self-hosted/ocp/preparations.md | 5 ++--- docs/admin/runai-setup/self-hosted/ocp/prerequisites.md | 2 +- 6 files changed, 8 insertions(+), 10 deletions(-) diff --git a/docs/admin/runai-setup/self-hosted/k8s/backend.md b/docs/admin/runai-setup/self-hosted/k8s/backend.md index e5d73dade3..c33322c263 100644 --- a/docs/admin/runai-setup/self-hosted/k8s/backend.md +++ b/docs/admin/runai-setup/self-hosted/k8s/backend.md @@ -70,7 +70,7 @@ Use the `--set` syntax in the helm command above. #### External PostgreSQL database -If you have opted to connect to an [external PostgreSQL database](preperations.md#external-postgres-database-optional), refer to the additional configurations table below. Adjust the following parameters based on your connection details: +If you have opted to connect to an [external PostgreSQL database](preperations.md#external-postgres-database-optional), refer to the additional configurations table below. Adjust the following parameters based on your connection details: * `postgresql.enabled` - set to `false` * `global.postgresql.auth.password` diff --git a/docs/admin/runai-setup/self-hosted/k8s/preparations.md b/docs/admin/runai-setup/self-hosted/k8s/preparations.md index 03c7d99c23..5db88f935c 100644 --- a/docs/admin/runai-setup/self-hosted/k8s/preparations.md +++ b/docs/admin/runai-setup/self-hosted/k8s/preparations.md @@ -96,8 +96,7 @@ kubectl label node node-role.kubernetes.io/runai-system=true ### External Postgres database (optional) -If you have opted to use an [external PostgreSQL database](prerequisites.md#external-postgresql-database-optional). -, you need to perform initial setup to ensure successful installation. Follow these steps: +If you have opted to use an [external PostgreSQL database](prerequisites.md#external-postgresql-database-optional), you need to perform initial setup to ensure successful installation. Follow these steps: 1. Create a SQL script file, edit the parameters below, and save it locally: * Replace `` with a dedicate database name for RunAi in your PostgreSQL database. @@ -126,7 +125,7 @@ If you have opted to use an [external PostgreSQL database](prerequisites.md#exte \q ``` -2. run the following command on a machine where PostgreSQL client (`pgsql`) is installed: +2. Run the following command on a machine where PostgreSQL client (`pgsql`) is installed: ``` bash psql --host \ # (1) diff --git a/docs/admin/runai-setup/self-hosted/k8s/prerequisites.md b/docs/admin/runai-setup/self-hosted/k8s/prerequisites.md index 1872f97a38..b6a3e4780e 100644 --- a/docs/admin/runai-setup/self-hosted/k8s/prerequisites.md +++ b/docs/admin/runai-setup/self-hosted/k8s/prerequisites.md @@ -83,7 +83,7 @@ See Run:ai Cluster prerequisites [Inference](../../cluster-setup/cluster-prerequ ### External Postgres database (optional) -The Run:ai Control Plane installation includes a default PostgreSQL database. However, you may opt to use an existing PostgreSQL database if you have specific requirements or preferences. Please ensure that your PostgreSQL database is version 16 or higher. +The Run:ai control plane installation includes a default PostgreSQL database. However, you may opt to use an existing PostgreSQL database if you have specific requirements or preferences. Please ensure that your PostgreSQL database is version 16 or higher. ## Next steps diff --git a/docs/admin/runai-setup/self-hosted/ocp/backend.md b/docs/admin/runai-setup/self-hosted/ocp/backend.md index 7c8f9a5cae..3a214da4f0 100644 --- a/docs/admin/runai-setup/self-hosted/ocp/backend.md +++ b/docs/admin/runai-setup/self-hosted/ocp/backend.md @@ -69,7 +69,7 @@ Use the `--set` syntax in the helm command above. #### External PostgreSQL database -If you have opted to connect to an [external PostgreSQL database](preperations.md#external-postgres-database-optional), refer to the additional configurations table below. Adjust the following parameters based on your connection details: +If you have opted to connect to an [external PostgreSQL database](preperations.md#external-postgres-database-optional), refer to the additional configurations table below. Adjust the following parameters based on your connection details: * `postgresql.enabled` - set to `false` * `global.postgresql.auth.password` diff --git a/docs/admin/runai-setup/self-hosted/ocp/preparations.md b/docs/admin/runai-setup/self-hosted/ocp/preparations.md index 1fe95f563b..4fb7a2a181 100644 --- a/docs/admin/runai-setup/self-hosted/ocp/preparations.md +++ b/docs/admin/runai-setup/self-hosted/ocp/preparations.md @@ -85,8 +85,7 @@ kubectl label node node-role.kubernetes.io/runai-system=true ### External Postgres database (optional) -If you have opted to use an [external PostgreSQL database](prerequisites.md#external-postgresql-database-optional). -, you need to perform initial setup to ensure successful installation. Follow these steps: +If you have opted to use an [external PostgreSQL database](prerequisites.md#external-postgresql-database-optional), you need to perform initial setup to ensure successful installation. Follow these steps: 1. Create a SQL script file, edit the parameters below, and save it locally: * Replace `` with a dedicate database name for RunAi in your PostgreSQL database. @@ -115,7 +114,7 @@ If you have opted to use an [external PostgreSQL database](prerequisites.md#exte \q ``` -2. run the following command on a machine where PostgreSQL client (`pgsql`) is installed: +2. Run the following command on a machine where PostgreSQL client (`pgsql`) is installed: ``` bash psql --host \ # (1) diff --git a/docs/admin/runai-setup/self-hosted/ocp/prerequisites.md b/docs/admin/runai-setup/self-hosted/ocp/prerequisites.md index 2b1b895a92..f2637804c5 100644 --- a/docs/admin/runai-setup/self-hosted/ocp/prerequisites.md +++ b/docs/admin/runai-setup/self-hosted/ocp/prerequisites.md @@ -62,7 +62,7 @@ See Run:ai Cluster prerequisites [Inference](../../cluster-setup/cluster-prerequ ### External PostgreSQL database (optional) -The Run:ai Control Plane installation includes a default PostgreSQL database. However, you may opt to use an existing PostgreSQL database if you have specific requirements or preferences. Please ensure that your PostgreSQL database is version 16 or higher. +The Run:ai control plane installation includes a default PostgreSQL database. However, you may opt to use an existing PostgreSQL database if you have specific requirements or preferences. Please ensure that your PostgreSQL database is version 16 or higher. ## Next steps Continue to [Preparing for a Run:ai OpenShift Installation From 414e114bd19532e987d774cd43127713f4f2f3bb Mon Sep 17 00:00:00 2001 From: JamieWeider72 <147967555+JamieWeider72@users.noreply.github.com> Date: Mon, 1 Jul 2024 13:35:57 +0300 Subject: [PATCH 75/87] RUN-19848 Updated Jobs and Deployments --- docs/admin/admin-ui-setup/project-setup.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/admin/admin-ui-setup/project-setup.md b/docs/admin/admin-ui-setup/project-setup.md index 0ed0209a5d..7959fe6c3b 100644 --- a/docs/admin/admin-ui-setup/project-setup.md +++ b/docs/admin/admin-ui-setup/project-setup.md @@ -1,6 +1,6 @@ # Introduction -Researchers submit Jobs. To streamline resource allocation and prioritize work, Run:ai introduces the concept of **Projects**. Projects are the tool to implement resource allocation policies as well as create segregation between different initiatives. A project in most cases represents a team, an individual, or an initiative that shares resources or has a specific resources budget (quota). +Researchers submit Workloads. To streamline resource allocation and prioritize work, Run:ai introduces the concept of **Projects**. Projects are the tool to implement resource allocation policies as well as create segregation between different initiatives. A project in most cases represents a team, an individual, or an initiative that shares resources or has a specific resources budget (quota). A Researcher submitting a Job needs to associate a Project name with the request. The Run:ai scheduler will compare the request against the current allocations and the Project and determine whether the workload can be allocated resources or whether it should remain in the queue for future allocation. @@ -19,7 +19,7 @@ For detailed information on node pools, see [Using node pools](../../Researcher/ By default, all nodes in a cluster are part of the `Default` node pool. The administrator can choose to create new node pools and include a set of nodes in a node pool by associating the nodes with a label. Each node pool is automatically associated with all Projects and Departments with zero resource allocation (Quotas). -When submitting a Job (or Deployment), the Researcher can choose one or more node pools. When choosing more than one node pool, the researcher sets the order of priority between the chosen node pools. The scheduler will try to schedule the Job to the first node pool. If not successful the scheduler will try the second node pool in the list, and so forth until it finds a node pool that can provide the Job's specification. +When submitting a Workload (or Inference), the Researcher can choose one or more node pools. When choosing more than one node pool, the researcher sets the order of priority between the chosen node pools. The scheduler will try to schedule the Job to the first node pool. If not successful the scheduler will try the second node pool in the list, and so forth until it finds a node pool that can provide the Job's specification. An administrator can set a Project's `default priority list` of node pools. In case the Researcher did not specify any node pool (or node pool list), the scheduler will use the Project's default node pool priority list to determine the order that the scheduler will use when scheduling the Job. From e9d8e12c8f08d291f22d480632bdd0465ea0a414 Mon Sep 17 00:00:00 2001 From: JamieWeider72 <147967555+JamieWeider72@users.noreply.github.com> Date: Mon, 1 Jul 2024 13:34:09 +0300 Subject: [PATCH 76/87] RUN-19848 Updated deployments --- docs/admin/workloads/workload-overview-admin.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/admin/workloads/workload-overview-admin.md b/docs/admin/workloads/workload-overview-admin.md index 40799991f8..9f622db8c1 100644 --- a/docs/admin/workloads/workload-overview-admin.md +++ b/docs/admin/workloads/workload-overview-admin.md @@ -4,7 +4,7 @@ Run:ai schedules *Workloads*. Run:ai workloads are comprised of: -* The *Kubernetes object* (Job, Deployment, etc) which is used to launch the container, inside which the data science code runs. +* The *Kubernetes object* (Job, Inference, etc) which is used to launch the container, inside which the data science code runs. * A set of additional resources that are required to run the Workload. Examples: a service entry point that allows access to the Job, a persistent volume claim to access data on the network, and more. All of these components are created together and deleted together when the Workload ends. From a60c06001589cb25d9efe02e595ab779c2c24b68 Mon Sep 17 00:00:00 2001 From: JamieWeider72 <147967555+JamieWeider72@users.noreply.github.com> Date: Mon, 1 Jul 2024 13:26:37 +0300 Subject: [PATCH 77/87] RUN-19848 Updated references to deployments and removed bullet --- docs/Researcher/Walkthroughs/quickstart-inference.md | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/docs/Researcher/Walkthroughs/quickstart-inference.md b/docs/Researcher/Walkthroughs/quickstart-inference.md index b04d162567..21178048c3 100644 --- a/docs/Researcher/Walkthroughs/quickstart-inference.md +++ b/docs/Researcher/Walkthroughs/quickstart-inference.md @@ -24,14 +24,14 @@ To complete this Quickstart you must have: ### Run an Inference Workload -* In the Run:ai user interface go to `Deployments`. If you do not see the `Deployments` section you may not have the required access control, or the inference module is disabled. -* Select `New Deployment` on the top right. +* In the Run:ai user interface go to `Inference`. If you do not see the `Inference` section you may not have the required access control, or the inference module is disabled. +* Select `New workload` -> `Inference` on the top right. * Select `team-a` as a project and add an arbitrary name. Use the image `gcr.io/run-ai-demo/example-triton-server`. * Under `Resources` add 0.5 GPUs. * Under `Autoscaling` select a minimum of 1, a maximum of 2. Use the `concurrency` autoscaling threshold method. Add a threshold of 3. * Add a `Container port` of `8000`. -This would start an inference workload for team-a with an allocation of a single GPU. Follow up on the Job's progress using the [Deployment list](../../admin/admin-ui-setup/deployments.md) in the user interface or by running `runai list jobs` +This would start an inference workload for team-a with an allocation of a single GPU. ### Query the Inference Server @@ -63,4 +63,3 @@ Use the user interface to delete the workload. ## See also * You can also create Inference deployments via API. For more information see [Submitting Workloads via YAML](../../developer/cluster-api/submit-yaml.md). -* See [Deployment](../../admin/admin-ui-setup/deployments.md) user interface. From dde3a9129b79cacb32e7b50b116a528b5f495f36 Mon Sep 17 00:00:00 2001 From: JamieWeider72 <147967555+JamieWeider72@users.noreply.github.com> Date: Mon, 1 Jul 2024 13:20:52 +0300 Subject: [PATCH 78/87] RUN-19848 Updated Inference Issues section --- docs/admin/troubleshooting/troubleshooting.md | 26 ++++++------------- 1 file changed, 8 insertions(+), 18 deletions(-) diff --git a/docs/admin/troubleshooting/troubleshooting.md b/docs/admin/troubleshooting/troubleshooting.md index 02737532a9..170e6be942 100644 --- a/docs/admin/troubleshooting/troubleshooting.md +++ b/docs/admin/troubleshooting/troubleshooting.md @@ -288,7 +288,7 @@ __Symptoms:__ - * The `New Deployment` button on the top right of the Deployment list is grayed out. + * The `New workload type` -> `Inference` button is grayed out. * Cannot create a deployment via [Inference API](../../developer/cluster-api/submit-yaml.md#inference-workload-example). __Root Cause:__ Run:ai Inference prerequisites have not been met. @@ -296,23 +296,13 @@ __Resolution:__ Review [inference prerequisites](../runai-setup/cluster-setup/cluster-prerequisites.md#inference) and install accordingly. -??? "New Deployment button is not showing" - __Symptom:__ The `New Deployment` button on the top right of the Deployments list does not show. +??? "Submitted workload type of inference remains in Pending state" + __Symptom:__ A submitted inference is not running. - __Root Cause:__ You do not have `ML Engineer` permissions. + __Root Cause:__ The [patch](../runai-setup/cluster-setup/cluster-prerequisites.md#inference) statement to add the runai-scheduler has not been performed. -??? "Submitted Deployment remains in Pending state" - __Symptom:__ A submitted deployment is not running. - - __Root Cause:__ The [patch](../runai-setup/cluster-setup/cluster-prerequisites.md#inference) statement to add the runai-scheduler has not been performed. - -??? "Some Autoscaling metrics are not working" - __Symptom:__ Deployments do not autoscale when using metrics other than `requests-per-second` or `concurrency`. - - __Root Cause:__ The [horizontal pod autoscaler](../runai-setup/cluster-setup/cluster-prerequisites.md#inference-autoscaling) prerequisite has not been installed. - -??? "Deployment status is "Failed"" - __Symptom:__ Deployment status is always `Failed`. +??? "Workload of type inference status is "Failed"" + __Symptom:__ Inference status is always `Failed`. __Root Cause:__ (multiple) @@ -320,9 +310,9 @@ * Server model command is misconfigured (i.e sleep infinity). * Server port is misconfigured. -??? "Deployment does not scale up from zero" +??? "Worload of type inference does not scale up from zero" - __Symptom:__ In the Deployment form, when "Auto-scaling" is enabled, and "Minimum Replicas" is set to zero, the deployment cannot scale up from zero. + __Symptom:__ In the Inference form, when "Auto-scaling" is enabled, and "Minimum Replicas" is set to zero, the inference cannot scale up from zero. __Root Cause:__ From 152423d59502682a92880bf0caa8fff79b882869 Mon Sep 17 00:00:00 2001 From: JamieWeider72 <147967555+JamieWeider72@users.noreply.github.com> Date: Mon, 1 Jul 2024 11:05:57 +0300 Subject: [PATCH 79/87] RUN-19848 Removed Bullet to deployments --- docs/admin/workloads/inference-overview.md | 1 - 1 file changed, 1 deletion(-) diff --git a/docs/admin/workloads/inference-overview.md b/docs/admin/workloads/inference-overview.md index bf1d8d2cf5..5c84085b91 100644 --- a/docs/admin/workloads/inference-overview.md +++ b/docs/admin/workloads/inference-overview.md @@ -53,5 +53,4 @@ This has the benefit of conserving resources at the risk of a delay from "cold s * To set up *Inference*, see [Cluster installation prerequisites](../runai-setup/cluster-setup/cluster-prerequisites.md#inference). * For running *Inference* see [Inference quick-start](../../Researcher/Walkthroughs/quickstart-inference.md). -* To run *Inference* from the user interface see [Deployments](../admin-ui-setup/deployments.md). * To run *Inference* using API see [Workload overview](../../developer/cluster-api/workload-overview-dev.md). From cef04e32d8e75347fbf5f075cb15241b94149f58 Mon Sep 17 00:00:00 2001 From: JamieWeider72 <147967555+JamieWeider72@users.noreply.github.com> Date: Mon, 1 Jul 2024 11:03:11 +0300 Subject: [PATCH 80/87] RUN-19848 Moved deployments file to graveyard --- {docs/admin/admin-ui-setup => graveyard}/deployments.md | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename {docs/admin/admin-ui-setup => graveyard}/deployments.md (100%) diff --git a/docs/admin/admin-ui-setup/deployments.md b/graveyard/deployments.md similarity index 100% rename from docs/admin/admin-ui-setup/deployments.md rename to graveyard/deployments.md From ec87c3f169d32d75187efbad2f3639017c9cdaae Mon Sep 17 00:00:00 2001 From: Oz Bar-Shalom Date: Tue, 2 Jul 2024 14:31:48 +0300 Subject: [PATCH 81/87] changes for OpenShift v4 --- docs/admin/runai-setup/authentication/sso.md | 51 ++++++++------------ 1 file changed, 19 insertions(+), 32 deletions(-) diff --git a/docs/admin/runai-setup/authentication/sso.md b/docs/admin/runai-setup/authentication/sso.md index 551d499a35..fbf53ac60c 100644 --- a/docs/admin/runai-setup/authentication/sso.md +++ b/docs/admin/runai-setup/authentication/sso.md @@ -26,35 +26,12 @@ For each of the SSO options, there are prerequisites that should be considered. * **ClientID**—the ID used to identify the client with the Authorization Server. * **Client Secret**—a secret password that only the Client and Authorization Server know. - ### OpenShift V4 -Before using OpenShift, first define OAuthClient. The OAuth client interacts with OpenShift’s OAuth server to authenticate users and request access tokens. - -To define OAuthClient, follow these steps: - -1. Create a new ```OAuthClient``` Kubernetes object with the following content -``` -apiVersion: oauth.openshift.io/v1 -grantMethod: auto -kind: OAuthClient -metadata: -name: my-client -redirectURIs: - - https:///auth/realms/runai/broker/openshift-v4/endpoint -secret: this-is-my-secret -``` -Replace `` with the URL of your Run:ai platform. -Replace `my-client` and `this-is-my-secret` with client name and secret you have chosen. - -2. Run the following command to apply the OAuthClient object to the environment. Create the object on OpenShift cluster where you define your OpenShift IDP: -``` -oc apply -``` -3. Check that the file has been applied successfully by running the following command: -``` -oc get oauthclient -``` +* **OpenShift OAuth client** - see [Registering an additional OAuth client](https://docs.openshift.com/container-platform/4.16/authentication/configuring-oauth-clients.html#oauth-register-additional-client_configuring-oauth-clients){target=_blank} +* **Base URL**— - the OpenShift API Server endpoint (example: https://api.:6443) +* **ClientID**— - the ID used to identify the client with the Authorization Server. +* **Client Secret**—a secret password that only the Client and Authorization Server know. ## Additional attribute mappings @@ -106,9 +83,10 @@ You can configure your IdP to map several IdP attributes: 1. In the `Discovery URL` field, enter the discovery URL . 2. In the `Client ID` field, enter the client ID. 3. In the `Client Secret` field, enter the client secret. - 4. Add the OIDC scope to be used during authentication to authorize access to a user's details (optional). Each scope returns a set of user attributes. The scope must match the names in your identity provider. - 5. In the `User attributes` field enter the attribute and the value in the identity provider. (optional) - 6.When complete, press `Save`. + 4. Copy the `Redirect URL` and use it in your identity provider. + 5. Add the OIDC scope to be used during authentication to authorize access to a user's details (optional). Each scope returns a set of user attributes. The scope must match the names in your identity provider. + 6. In the `User attributes` field enter the attribute and the value in the identity provider. (optional) + 7.When complete, press `Save`. After you have configured the OIDC settings, you can view and edit the identity provider settings. @@ -117,16 +95,25 @@ You can configure your IdP to map several IdP attributes: * Discovery URL. * Client ID. * Client secret. + * OIDC Scopes === "OpenShift V4" - 1. In the `Base URL` field, enter the OpenShift Base URL (https://api.:6443). + 1. In the `Base URL` field, enter the OpenShift API server endpoint (https://api.:6443). 2. In the `Client ID` field, enter the client ID. 3. In the `Client Secret` field, enter the client secret. - 4. Add the OIDC scope to be used during authentication to authorize access to a user's details (optional). Each scope returns a set of user attributes. The scope must match the names in your identity provider. + 4. Add the OIDC scope to be used during authentication to authorize access to a user's details (optional). Each scope returns a set of user attributes. The scope must match the names in your identity provider. 5. In the `User attributes` field enter the attribute and the value in the identity provider (optional). 6. When complete, press `Save`. + After you have configured the OpenShift V4 settings, you can view and edit the identity provider settings. + + Press `Edit` to view and edit the: + + * Base URL. + * Client ID. + * Client secret. + 4. In the `Logout uri` field, enter the desired URL logout page. If left empty, you will be redirected to the Run:ai portal. 5. In the `Session timeout` field, enter the amount of idle time before users are automatically logged out. (Default is 60 minutes) From 7da2c0d249cb9e4b8811cbef40150ae9eaea8ff9 Mon Sep 17 00:00:00 2001 From: jasonnovichRunAI <124490127+jasonnovichRunAI@users.noreply.github.com> Date: Tue, 2 Jul 2024 16:24:29 +0300 Subject: [PATCH 82/87] Apply suggestions from code review --- docs/admin/runai-setup/authentication/sso.md | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/docs/admin/runai-setup/authentication/sso.md b/docs/admin/runai-setup/authentication/sso.md index fbf53ac60c..63a08e2e41 100644 --- a/docs/admin/runai-setup/authentication/sso.md +++ b/docs/admin/runai-setup/authentication/sso.md @@ -29,8 +29,8 @@ For each of the SSO options, there are prerequisites that should be considered. ### OpenShift V4 * **OpenShift OAuth client** - see [Registering an additional OAuth client](https://docs.openshift.com/container-platform/4.16/authentication/configuring-oauth-clients.html#oauth-register-additional-client_configuring-oauth-clients){target=_blank} -* **Base URL**— - the OpenShift API Server endpoint (example: https://api.:6443) -* **ClientID**— - the ID used to identify the client with the Authorization Server. +* **Base URL**—the OpenShift API Server endpoint (example: https://api.:6443) +* **ClientID**—the ID used to identify the client with the Authorization Server. * **Client Secret**—a secret password that only the Client and Authorization Server know. ## Additional attribute mappings @@ -83,8 +83,8 @@ You can configure your IdP to map several IdP attributes: 1. In the `Discovery URL` field, enter the discovery URL . 2. In the `Client ID` field, enter the client ID. 3. In the `Client Secret` field, enter the client secret. - 4. Copy the `Redirect URL` and use it in your identity provider. - 5. Add the OIDC scope to be used during authentication to authorize access to a user's details (optional). Each scope returns a set of user attributes. The scope must match the names in your identity provider. + 4. Copy the `Redirect URL` and use it in your identity provider. + 5. Add the OIDC scope to be used during authentication to authorize access to a user's details (optional). Each scope returns a set of user attributes. The scope must match the names in your identity provider. 6. In the `User attributes` field enter the attribute and the value in the identity provider. (optional) 7.When complete, press `Save`. @@ -102,7 +102,7 @@ You can configure your IdP to map several IdP attributes: 1. In the `Base URL` field, enter the OpenShift API server endpoint (https://api.:6443). 2. In the `Client ID` field, enter the client ID. 3. In the `Client Secret` field, enter the client secret. - 4. Add the OIDC scope to be used during authentication to authorize access to a user's details (optional). Each scope returns a set of user attributes. The scope must match the names in your identity provider. + 4. Add the OIDC scope to be used during authentication to authorize access to a user's details (optional). Each scope returns a set of user attributes. The scope must match the names in your identity provider. 5. In the `User attributes` field enter the attribute and the value in the identity provider (optional). 6. When complete, press `Save`. From e687a3304d07d8d88ab0c9c7bb24c142e180ee30 Mon Sep 17 00:00:00 2001 From: ozRunAI <138565115+ozRunAI@users.noreply.github.com> Date: Wed, 3 Jul 2024 10:36:03 +0300 Subject: [PATCH 83/87] Update sso.md --- docs/admin/runai-setup/authentication/sso.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/admin/runai-setup/authentication/sso.md b/docs/admin/runai-setup/authentication/sso.md index 63a08e2e41..83b8c133f8 100644 --- a/docs/admin/runai-setup/authentication/sso.md +++ b/docs/admin/runai-setup/authentication/sso.md @@ -29,7 +29,7 @@ For each of the SSO options, there are prerequisites that should be considered. ### OpenShift V4 * **OpenShift OAuth client** - see [Registering an additional OAuth client](https://docs.openshift.com/container-platform/4.16/authentication/configuring-oauth-clients.html#oauth-register-additional-client_configuring-oauth-clients){target=_blank} -* **Base URL**—the OpenShift API Server endpoint (example: https://api.:6443) +* **Base URL**—the OpenShift API Server endpoint (example: `https://api.:6443`) * **ClientID**—the ID used to identify the client with the Authorization Server. * **Client Secret**—a secret password that only the Client and Authorization Server know. @@ -99,7 +99,7 @@ You can configure your IdP to map several IdP attributes: === "OpenShift V4" - 1. In the `Base URL` field, enter the OpenShift API server endpoint (https://api.:6443). + 1. In the `Base URL` field, enter the OpenShift API server endpoint (example: `https://api.:6443`). 2. In the `Client ID` field, enter the client ID. 3. In the `Client Secret` field, enter the client secret. 4. Add the OIDC scope to be used during authentication to authorize access to a user's details (optional). Each scope returns a set of user attributes. The scope must match the names in your identity provider. From 56e6ed38aa5daf3f74c6519cad17598bdd61a7a2 Mon Sep 17 00:00:00 2001 From: jasonnovichRunAI <124490127+jasonnovichRunAI@users.noreply.github.com> Date: Thu, 4 Jul 2024 10:42:21 +0300 Subject: [PATCH 84/87] Adjustments before merge --- docs/home/changelog/hotfixes-2-16.md | 2 -- docs/home/whats-new-2-18.md | 36 ---------------------------- 2 files changed, 38 deletions(-) delete mode 100644 docs/home/whats-new-2-18.md diff --git a/docs/home/changelog/hotfixes-2-16.md b/docs/home/changelog/hotfixes-2-16.md index 7e8fbec6fe..eb6b8d392d 100644 --- a/docs/home/changelog/hotfixes-2-16.md +++ b/docs/home/changelog/hotfixes-2-16.md @@ -8,14 +8,12 @@ date: 2024-Feb-26 The following is a list of the known and fixed issues for Run:ai V2.16. - ## Version 2.16.25 | Internal ID | Description | |--|--| | RUN-17241 | Fixed an issue where the nodes page showed nodes as not ready due to "tookit not installed". | - ## Version 2.16.21 | Internal ID | Description | diff --git a/docs/home/whats-new-2-18.md b/docs/home/whats-new-2-18.md deleted file mode 100644 index 6de379a3f3..0000000000 --- a/docs/home/whats-new-2-18.md +++ /dev/null @@ -1,36 +0,0 @@ ---- -title: Version 2.18 -summary: This article describes new features and functionality in the version. -authors: - - Jamie Weider -date: 2024-June-14 ---- - -## Release Content - June 30, 2024 - -* [Deprecation notifications](#deprecation-notifications) -* [Breaking changes](#breaking-changes) - -### Researcher - -#### Jobs, Workloads, and Workspaces - -* Added backoff limit functionality to Training and Workspace workloads. The backoff limit is the maximum number of retry attempts for failed workloads. After reaching the limit, the workload's status will change to `Failed`. - - - -### Run:ai Administrator - -#### Authentication and Authorization - - -## Deprecation Notifications - -Deprecation notifications allow you to plan for future changes in the Run:ai Platform. - - -## Breaking changes - -Breaking changes notifications allow you to plan around potential changes that may interfere your current workflow when interfacing with the Run:ai Platform. - - From 187557256002778f0e09ec9983a96eb186aa15bf Mon Sep 17 00:00:00 2001 From: jasonnovichRunAI <124490127+jasonnovichRunAI@users.noreply.github.com> Date: Thu, 4 Jul 2024 10:51:53 +0300 Subject: [PATCH 85/87] RUN-19557 remobved whats new file from PR --- docs/home/whats-new-2-18.md | 118 ------------------------------------ 1 file changed, 118 deletions(-) delete mode 100644 docs/home/whats-new-2-18.md diff --git a/docs/home/whats-new-2-18.md b/docs/home/whats-new-2-18.md deleted file mode 100644 index 93633c8acf..0000000000 --- a/docs/home/whats-new-2-18.md +++ /dev/null @@ -1,118 +0,0 @@ ---- -title: Version 2.18 -summary: This article describes new features and functionality in the version. -authors: - - Jamie Weider -date: 2024-June-14 ---- - -## Release Content - June 30, 2024 - -* [Deprecation notifications](#deprecation-notifications) -* [Breaking changes](#breaking-changes) - -### Researcher - -#### Jobs, Workloads, and Workspaces - -* Added backoff limit functionality to Training and Workspace workloads. The backoff limit is the maximum number of retry attempts for failed workloads. After reaching the limit, the workload's status will change to `Failed`. - -* Added new graphs for *Inference* workloads. The new graphs provide more information for *Inference* workloads to help analyze performance of the workloads. For more information, see [Workloads View](../admin/workloads/README.md#workloads-view). - -* Updated *Auto-deletion time* default value. Previously the default was **90 days** now the default is **30 days**. - -* Added new data sources to workload to include project secrets. - -* Added latency metric for autoscaling. This feature is used to set a target threshold for the response time of requests. This will adjust the number of applications to keep the response time below that threshold. For more information, see [Auto scaling](). - -* Improved autoscaling for ChatUi models. Run:ai has improved autoscaling performance with ChatI models by adding them to *Environments*. ChatUi is an addition to inference workloads and is not mandatory for all types of workloads. For more information, see [Models](). - -* Added Hugging Face catalog integration in inference workloads. Run:ai has added Hugging Face integration directly to the inferenc e workload form, providing the ability to add models and data sets directly from the Hugging Face catalog. Hugging Face is a ML platform that helps users build, deploy and train machine learning models. For more information on how Hugging Face is integrated, see [Hugging Face](link to hugging face in the models doc). - -It provides the infrastructure to demo, run and deploy artificial intelligence (AI) in live applications. Users can also browse through models and data sets that other people have uploaded. - -#### Command Line Interface - -* Added an improved researcher focused Command Line Interface (CLI). The improved CLI brings usability enhancements for researcher which include: - - * Support multiple clusters - * Self upgrade - * Interactive mode - * Align CLI to be data consistent with UI and API - * Improved usability and performance - - For more information about installing and using the Improved CLI, see [Improved CLI](../Researcher/cli-reference/new-cli/runai.md). - -#### GPU memory swap - -* To ensure efficient usage of an organization’s resources, Run:ai provides multiple features on multiple layers to help administrators and practitioners maximize their existing GPUs resource utilization. Run:ai’s GPU memory swap feature helps administrators and AI practitioners to further increase the utilization of existing GPU HW by improving GPU sharing between AI initiatives and stakeholders. This is done by expending the GPU physical memory to the CPU memory which is typically an order of magnitude larger than that of the GPU. For more information see, [GPU Memory Swap](../Researcher/scheduling/gpu-memory-swap.md). - -#### YAML Workload Reference table - -* Added a file detailing the value types and workload YAML references. Each table contains the field name, its description and the supported Run:ai workload types. The individual YAML field details contains information on the value type and currently available exammple workload snippets. For more information see ... - -### Run:ai Administrator - -#### Data Sources - -* Added *Data Volumes* new feature. Data Volumes are snapshots of datasets stored in Kubernetes Persistent Volume Claims (PVCs). They act as a central repository for training data, and offer several key benefits. - - * Managed with dedicated permissions—Data Admins, a new role within Run.ai, have exclusive control over data volume creation, data population, and sharing. - * Shared between multiple scopes—unlike other Run:ai data sources, data volumes can be shared across projects, departments, or clusters. This promotes data reuse and collaboration within your organization. - * Coupled to workloads in the submission process—similar to other Run:ai data sources, Data volumes can be easily attached to AI workloads during submission, specifying the data path within the workload environment. - - For more information, see [Data Volumes](../developer/admin-rest-api/data-volumes.md). - -* Added new data source type. Run:ai now allows you to configure a *Credential* (Secret) as a data source. - -#### Credentials - -* Added new *Generic secret* to the *Credentials*. - -#### SSO - -* Run:ai now supports SSO using OpenShift v4 (which is based on OIDC). Before using OpenShift, you must first define OAuthClient which interacts with OpenShift's OAuth server to authenticate users and request access tokens. For more information, see [Single Sign-On](../admin/runai-setup/authentication/sso/). - -* OIDC scopes have been added to the authentication request. Scopes are used to specify what access privileges are being requested for access tokens. The scopes associated with the access tokens determine what resource are available when they are used to access OAuth 2.0 protected endpoints. Protected endpoints may perform different actions and return different information based on the scope values and other parameters used when requesting the presented access token. For more information, see [UI configuration](../admin/runai-setup/authentication/sso/#step-1-ui-configuration). - -#### Ownership protection - -* Ownership protection in Run:ai ensures that only authorized users can delete or modify workloads. This feature is designed to safeguard important jobs and configurations from accidental or unauthorized modifications by users who did not originally create the workload. - -## Deprecation Notifications - -Deprecation notifications allow you to plan for future changes in the Run:ai Platform. - -### Feature deprecations - -Deprecated features will be available for **two** versions ahead of the notification. For questions, see your Run:ai representative. - -* Command Line Interface (CLI)—from cluster version 2.18 and higher, the *Legacy CLI* is deprecated. The *Legacy CLI* is still available for use on clusters that are 2.18 or higher, but it is recommended that you use the new *Improved CLI*. - -### API support and endpoint deprecations - -The endpoints and parameters specified in the API reference are the ones that are officially supported by Run:ai. For more information about Run:ai's API support policy and deprecation process, see [Developer overview](../developer/overview-developer.md#api-support). - -#### Deprecated APIs and API fields - -##### Departments API - -| Deprecated | Replacement | -| --- | --- | -| /v1/k8s/clusters/{clusterId}/departments | /api/v1/org-unit/departments | -| /v1/k8s/clusters/{clusterId}/departments/{department-id} | /api/v1/org-unit/departments/{departmentId} | -| /v1/k8s/clusters/{clusterId}/departments/{department-id} | /api/v1/org-unit/departments/{departmentId}+PUT/PATCH /api/v1/org-unit/departments/{departmentId}/resources | - -##### Projects APi - -| Deprecated | Replacement | -| --- | --- | -| /v1/k8s/clusters/{clusterId}/projects | /api/v1/org-unit/projects | -| /v1/k8s/clusters/{clusterId}/projects/{id} | /api/v1/org-unit/projects/{projectId} | -| /v1/k8s/clusters/{clusterId}/projects/{id} | /api/v1/org-unit/projects/{projectId} + /api/v1/org-unit/projects/{projectId}/resources | - -## Breaking changes - -Breaking changes notifications allow you to plan around potential changes that may interfere your current workflow when interfacing with the Run:ai Platform. - - From 4d36c2efdbaaef23c9ec63c9431048441e90169c Mon Sep 17 00:00:00 2001 From: jasonnovichRunAI <124490127+jasonnovichRunAI@users.noreply.github.com> Date: Thu, 4 Jul 2024 11:09:30 +0300 Subject: [PATCH 86/87] Update docs/admin/workloads/submitting-workloads.md --- docs/admin/workloads/submitting-workloads.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/docs/admin/workloads/submitting-workloads.md b/docs/admin/workloads/submitting-workloads.md index 73103885f5..9155d1e6fa 100644 --- a/docs/admin/workloads/submitting-workloads.md +++ b/docs/admin/workloads/submitting-workloads.md @@ -163,6 +163,6 @@ This feature is implemented at the cluster management entity level. To enable ownership protection: -1. Update the runai-public configmap for workloadOwnershipProtection, true = enabled -2. Perform cluster-sync to update cluster-service in the CP -3. Use the workload-service flag to block deletion and suspension of workloads, when appropriate +1. Update the runai-public configmap for `workloadOwnershipProtection=true`. +2. Perform a cluster-sync to update cluster-service in the CP. +3. Use the workload-service flag to block deletion and suspension of workloads, when appropriate. From 5c197b87e4a84e6ffd3f4da4a328a2f895cfd8b2 Mon Sep 17 00:00:00 2001 From: jasonnovichRunAI <124490127+jasonnovichRunAI@users.noreply.github.com> Date: Thu, 4 Jul 2024 11:10:10 +0300 Subject: [PATCH 87/87] Update docs/admin/workloads/submitting-workloads.md --- docs/admin/workloads/submitting-workloads.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/admin/workloads/submitting-workloads.md b/docs/admin/workloads/submitting-workloads.md index 9155d1e6fa..81c7d226ea 100644 --- a/docs/admin/workloads/submitting-workloads.md +++ b/docs/admin/workloads/submitting-workloads.md @@ -163,6 +163,6 @@ This feature is implemented at the cluster management entity level. To enable ownership protection: -1. Update the runai-public configmap for `workloadOwnershipProtection=true`. +1. Update the runai-public configmap and set `workloadOwnershipProtection=true`. 2. Perform a cluster-sync to update cluster-service in the CP. 3. Use the workload-service flag to block deletion and suspension of workloads, when appropriate.

1?6Ol=vTqI46@zV` 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Ⓢh~Ef<={SZj7I^~g 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 literal 130360 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%0DZWQO0v)N8Xe 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