From f3b590af35d7830b96368a5800747c33696c8f16 Mon Sep 17 00:00:00 2001 From: jasonnovichRunAI <124490127+jasonnovichRunAI@users.noreply.github.com> Date: Mon, 22 Jul 2024 11:46:48 +0300 Subject: [PATCH 01/17] Update whats-new-2-18.md --- 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 ec555741a0..b8da997a35 100644 --- a/docs/home/whats-new-2-18.md +++ b/docs/home/whats-new-2-18.md @@ -26,7 +26,7 @@ date: 2024-June-14 * Added latency metric for autoscaling. This feature allows automatic scale-up/down the number of replicas of a Run:ai inference workload based on the threshold set by the ML Engineer. This ensures that response time is kept under the target SLA. -* Improved autoscaling for inference models by taking out ChatBot UI from models images. By moving ChatBot UI to predefined *Environments*, autoscaling is more accurate by taking into account all types of requests (API, and ChatBot UI). Adding a ChatBot UI environment preset by Run:ai allows AI practitioners to easily connect them to workloads. +* Improved autoscaling for inference models by taking out ChatBot UI from models images. By moving ChatBot UI to predefined *Environments*, autoscaling is more accurate by taking into account all types of requests (API, and ChatBot UI). Adding a ChatBot UI environment preset by Run:ai allows AI practitioners to easily connect them to workloads. * Added more precision to trigger auto-scaling to zero. Now users can configure a precise consecutive idle threshold custom setting to trigger Run:ai inference workloads to scale-to-zero. From fd48a07b81898e28332f10eab65f552aa250b814 Mon Sep 17 00:00:00 2001 From: JamieWeider72 <147967555+JamieWeider72@users.noreply.github.com> Date: Tue, 23 Jul 2024 13:14:29 +0300 Subject: [PATCH 02/17] Update hotfixes-2-16.md --- docs/home/changelog/hotfixes-2-16.md | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/docs/home/changelog/hotfixes-2-16.md b/docs/home/changelog/hotfixes-2-16.md index eb6b8d392d..a07194f9e3 100644 --- a/docs/home/changelog/hotfixes-2-16.md +++ b/docs/home/changelog/hotfixes-2-16.md @@ -8,6 +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.57 + +| Internal ID | Description | +|--|--| +| RUN-20388 | Fixed an issue where cluster-sync caused a memory leak. | + ## Version 2.16.25 | Internal ID | Description | From 58f088d94915ecfa3b8f552f55751fd2b26ebca5 Mon Sep 17 00:00:00 2001 From: Yaron Date: Tue, 23 Jul 2024 14:48:27 +0300 Subject: [PATCH 03/17] policies-example --- docs/admin/workloads/policies/README.md | 93 ++++++++++++------------- 1 file changed, 45 insertions(+), 48 deletions(-) diff --git a/docs/admin/workloads/policies/README.md b/docs/admin/workloads/policies/README.md index f76540e3ad..bdb3a90afb 100644 --- a/docs/admin/workloads/policies/README.md +++ b/docs/admin/workloads/policies/README.md @@ -8,16 +8,16 @@ date: 2023-Dec-12 ## Introduction -*Policies* allow administrators to impose restrictions and set default values for researcher workloads. Restrictions and default values can be placed on CPUs, GPUs, and other resources or entities. Enabling the *New Policy Manager* provides information about resources that are non-compliant to applied policies. Resources that are non-compliant will appear greyed out. To see how a resource is not compliant, press on the clipboard icon in the upper right hand corner of the resource. +*Policies* allow administrators to impose restrictions and set default values for researcher workloads. Restrictions and default values can be placed on CPUs, GPUs, and other resources or entities. Enabling the *New Policy Manager* provides information about resources that are non-compliant to applied policies. Resources that are non-compliant will appear greyed out. To see how a resource is not compliant, press on the clipboard icon in the upper right-hand corner of the resource. !!! Note - Policies from Run:ai versions 2.15 or lower will still work after enabling the *New Policy Manager*. However, showing non-compliant policy rules will not be available. For more information about policies for version 2.15 or lower, see [What are Policies](policies.md#what-are-policies). + Policies from Run:ai versions 2.17 or lower will still work after enabling the New Policy Manager. For more information about policies for version 2.17 or lower, see [What are Policies](policies.md#what-are-policies). For example, an administrator can create and apply a policy that will restrict researchers from requesting more than 2 GPUs, or less than 1GB of memory per type of workload. Another example is an administrator who wants to set different amounts of CPU, GPUs and memory for different kinds of workloads. A training workload can have a default of 1 GB of memory, or an interactive workload can have a default amount of GPUs. -Policies are created for each Run:ai project (Kubernetes namespace). When a policy is created in the `runai` namespace, it will take effect when there is no project-specific policy for the workloads of the same kind. +Policies are created for each Run:ai project (Kubernetes namespace). When a policy is created in the `runai` namespace, it will take effect when there is no project-specific policy for workloads of the same kind. In interactive workloads or workspaces, applied policies will only allow researchers access to resources that are permitted in the policy. This can include compute resources as well as node pools and node pool priority. @@ -47,7 +47,7 @@ A policy configured to a specific scope, is applied to all elements in that scop ### Policy Editor UI -Policies are added to the system using the policy editor and are written in YAML format. YAML™ is a human-friendly, cross language, Unicode based data serialization language designed around the common native data types of dynamic programming languages. It is useful for programming needs ranging from configuration files to internet messaging to object persistence to data auditing and visualization. For more information, see [YAML.org](https://yaml.org/){target=_blank}. +Policies are added to the system using the policy editor and are written in YAML format. YAML™ is a human-friendly, cross-language, Unicode-based data serialization language designed around the common native data types of dynamic programming languages. It is useful for programming needs ranging from configuration files to internet messaging to object persistence to data auditing and visualization. For more information, see [YAML.org](https://yaml.org/){target=_blank}. ### Policy API @@ -59,50 +59,47 @@ The following is an example of a workspace policy you can apply in your platform ```YAML defaults: - environment: - allowPrivilegeEscalation: false - createHomeDir: true - environmentVariables: - - name: MY_ENV - value: my_value - workspace: - allowOverQuota: true + createHomeDir: true + environmentVariables: + instances: + - name: MY_ENV + value: my_value + security: + allowPrivilegeEscalation: false rules: - compute: - cpuCoreLimit: - min: 0 - max: 9 - required: true - gpuPortionRequest: - min: 0 - max: 10 + imagePullPolicy: + required: true + options: + - value: Always + displayed: Always + - value: Never + displayed: Never + createHomeDir: + canEdit: false + security: + runAsUid: + min: 1 + max: 32700 + allowPrivilegeEscalation: + canEdit: false + compute: + cpuCoreLimit: + required: true + min: 0 + max: 9 + gpuPortionRequest: + min: 0 + max: 10 + storage: + nfs: + instances: + canAdd: false s3: - url: - options: - - displayed: "https://www.google.com" - value: "https://www.google.com" - - displayed: "https://www.yahoo.com" - value: "https://www.yahoo.com" - environment: - imagePullPolicy: - options: - - displayed: "Always" - value: "Always" - - displayed: "Never" - value: "Never" - required: true - runAsUid: - min: 1 - max: 32700 - createHomeDir: - canEdit: false - allowPrivilegeEscalation: - canEdit: false - workspace: - allowOverQuota: - canEdit: false - imposedAssets: - dataSources: - nfs: - canAdd: false + attributes: + url: + options: + - value: https://www.google.com + displayed: https://www.google.com + - value: https://www.yahoo.com + displayed: https://www.yahoo.com ``` From 4d421432c688c6ba6021d00f51ed3ec2867e72fa Mon Sep 17 00:00:00 2001 From: Haim Levy <39706566+haimlevy2006@users.noreply.github.com> Date: Tue, 23 Jul 2024 21:15:14 +0300 Subject: [PATCH 04/17] Update automated-publish-docs.yaml --- .github/workflows/automated-publish-docs.yaml | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/.github/workflows/automated-publish-docs.yaml b/.github/workflows/automated-publish-docs.yaml index 97c38ef47d..a1fac25875 100644 --- a/.github/workflows/automated-publish-docs.yaml +++ b/.github/workflows/automated-publish-docs.yaml @@ -97,4 +97,5 @@ jobs: SLACK_MESSAGE_ON_SUCCESS: "Docs were updated successfully for version ${{ needs.env.outputs.TITLE }}" SLACK_MESSAGE_ON_FAILURE: "Docs update FAILED for version ${{ needs.env.outputs.TITLE }}" MSG_MINIMAL: true - SLACK_FOOTER: "" \ No newline at end of file + SLACK_FOOTER: "" + From 81ca00ea8762bd5968bf33e3692dc469c303d773 Mon Sep 17 00:00:00 2001 From: Haim Levy <39706566+haimlevy2006@users.noreply.github.com> Date: Tue, 23 Jul 2024 21:49:43 +0300 Subject: [PATCH 05/17] Update automated-publish-docs.yaml --- .github/workflows/automated-publish-docs.yaml | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/.github/workflows/automated-publish-docs.yaml b/.github/workflows/automated-publish-docs.yaml index a1fac25875..429aa60a2a 100644 --- a/.github/workflows/automated-publish-docs.yaml +++ b/.github/workflows/automated-publish-docs.yaml @@ -19,6 +19,8 @@ jobs: steps: - name: Checkout code uses: actions/checkout@v4 + with: + fetch-depth: 0 - name: Get all v*.* branches id: calculate-env @@ -48,7 +50,6 @@ jobs: uses: actions/checkout@v4 with: ref: ${{ needs.env.outputs.CURRENT_BRANCH }} - fetch-depth: 0 - name: setup python uses: actions/setup-python@v5 From 26a385423580b555ba4e13df70a90feb2777d161 Mon Sep 17 00:00:00 2001 From: Haim Levy <39706566+haimlevy2006@users.noreply.github.com> Date: Tue, 23 Jul 2024 22:10:00 +0300 Subject: [PATCH 06/17] Update automated-publish-docs.yaml --- .github/workflows/automated-publish-docs.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/automated-publish-docs.yaml b/.github/workflows/automated-publish-docs.yaml index 429aa60a2a..4823a8d9ac 100644 --- a/.github/workflows/automated-publish-docs.yaml +++ b/.github/workflows/automated-publish-docs.yaml @@ -25,7 +25,7 @@ jobs: - name: Get all v*.* branches id: calculate-env run: | - BRANCHES=$(git branch --list --all | grep -v master | grep 'origin/v*.*' | sed -n -E 's:.*/(v[0-9]+\.[0-9]+).*:\1:p' | sort -Vu) + BRANCHES=$(git branch -r | grep -E '^ *origin/v[0-9]{1,2}\.[0-9]{1,2}$' | sort -Vu | sed 's/origin\///g' | sed 's/ //g') NEWEST_VERSION=$(printf '%s\n' "${BRANCHES[@]}" | sort -V | tail -n 1) CURRENT_BRANCH=${GITHUB_REF#refs/heads/} ALIAS=$CURRENT_BRANCH-alias From a2fa4e0b3cef2625eeac9c82da381a4d10bee1b3 Mon Sep 17 00:00:00 2001 From: Haim Levy <39706566+haimlevy2006@users.noreply.github.com> Date: Tue, 23 Jul 2024 22:12:08 +0300 Subject: [PATCH 07/17] Update automated-publish-docs.yaml From 3573c58db48d3b44ccbce06cc4cbc56da508b087 Mon Sep 17 00:00:00 2001 From: JamieWeider72 <147967555+JamieWeider72@users.noreply.github.com> Date: Thu, 25 Jul 2024 14:59:14 +0300 Subject: [PATCH 08/17] Update whats-new-2-18.md --- docs/home/whats-new-2-18.md | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/docs/home/whats-new-2-18.md b/docs/home/whats-new-2-18.md index b8da997a35..6ab6126302 100644 --- a/docs/home/whats-new-2-18.md +++ b/docs/home/whats-new-2-18.md @@ -22,19 +22,19 @@ date: 2024-June-14 * Added new *Data sources* of type *Secret* to workload form. *Data sources* of type *Secret* are used to hide 3rd party access credentials when submitting workloads. For more information, see [Submitting Workloads](../admin/workloads/submitting-workloads.md#how-to-submit-a-workload). -* Added new graphs for *Inference* workloads. The new graphs provide more information for *Inference* workloads to help analyze performance of the workloads. New graphs include Latency, Throughput, and number of replicas. For more information, see [Workloads View](../admin/workloads/README.md#workloads-view). +* Added new graphs for *Inference* workloads. The new graphs provide more information for *Inference* workloads to help analyze performance of the workloads. New graphs include Latency, Throughput, and number of replicas. For more information, see [Workloads View](../admin/workloads/README.md#workloads-view). (Requires minimum cluster version v2.18). -* Added latency metric for autoscaling. This feature allows automatic scale-up/down the number of replicas of a Run:ai inference workload based on the threshold set by the ML Engineer. This ensures that response time is kept under the target SLA. +* Added latency metric for autoscaling. This feature allows automatic scale-up/down the number of replicas of a Run:ai inference workload based on the threshold set by the ML Engineer. This ensures that response time is kept under the target SLA. (Requires minimum cluster version v2.18). * Improved autoscaling for inference models by taking out ChatBot UI from models images. By moving ChatBot UI to predefined *Environments*, autoscaling is more accurate by taking into account all types of requests (API, and ChatBot UI). Adding a ChatBot UI environment preset by Run:ai allows AI practitioners to easily connect them to workloads. -* Added more precision to trigger auto-scaling to zero. Now users can configure a precise consecutive idle threshold custom setting to trigger Run:ai inference workloads to scale-to-zero. +* Added more precision to trigger auto-scaling to zero. Now users can configure a precise consecutive idle threshold custom setting to trigger Run:ai inference workloads to scale-to-zero. (Requires minimum cluster version v2.18). * Added Hugging Face catalog integration of community models. Run:ai has added Hugging Face integration directly to the inference workload form, providing the ability to select models (vLLM models) from Hugging Face. This allows organizations to quickly experiment with the latest open source community language models. For more information on how Hugging Face is integrated, see [Hugging Face](../admin/workloads/submitting-workloads.md). -* Improved access permissions to external tools. This improvement now allows more granular control over which personas can access external tools (external URLs) such as Jupyter Notebooks, Chatbot UI, and others. For configuration information, see [Submitting workloads](../admin/workloads/submitting-workloads.md). +* Improved access permissions to external tools. This improvement now allows more granular control over which personas can access external tools (external URLs) such as Jupyter Notebooks, Chatbot UI, and others. For configuration information, see [Submitting workloads](../admin/workloads/submitting-workloads.md). (Requires minimum cluster version v2.18). -* Added a new API for submitting Run:ai inference workloads. This API allows users to easily submit inference workloads. This new API provides a consistent user experience for workload submission which maintains data integrity across all the user interfaces in the Run:ai platform. +* Added a new API for submitting Run:ai inference workloads. This API allows users to easily submit inference workloads. This new API provides a consistent user experience for workload submission which maintains data integrity across all the user interfaces in the Run:ai platform. (Requires minimum cluster version v2.18). #### Command Line Interface @@ -47,11 +47,11 @@ date: 2024-June-14 * Improved usability and performance This is an early access feature available for customers to use; however be aware that there may be functional gaps versus the legacy CLI. - For more information about installing and using the Improved CLI, see [Improved CLI](../Researcher/cli-reference/new-cli/runai.md). + For more information about installing and using the Improved CLI, see [Improved CLI](../Researcher/cli-reference/new-cli/runai.md). (Requires minimum cluster version v2.18). #### GPU memory swap -* Added new GPU to CPU 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). +* Added new GPU to CPU 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). (Requires minimum cluster version v2.18). #### YAML Workload Reference table @@ -75,13 +75,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). (Requires minimum cluster version v2.18). * Added new data source of type *Secret*. Run:ai now allows you to configure a *Credential* as a data source. A *Data source* of type *Secret* is best used in workloads so that access to 3rd party interfaces and storage used in containers, keep access credentials hidden. For more information, see [Secrets as a data source](../Researcher/user-interface/workspaces/create/create-ds.md/#create-a-secret-as-data-source). #### Credentials -* Added new *Generic secret* to *Credentials*. *Credentials* had been used only for access to data sources (S3, Git, etc.). However, AI practitioners need to use secrets to access sensitive data (interacting with 3rd party APIs, or other services) without having to put their credentials in their source code. *Generic secrets* leverage multiple key value pairs which helps reduce the number of Kubernetes resources and simplifies resource management by reducing the overhead associated with maintaining multiple Secrets. *Generic secrets* are best used as a data source of type *Secret* so that they can be used in containers to keep access credentials hidden. +* Added new *Generic secret* to *Credentials*. *Credentials* had been used only for access to data sources (S3, Git, etc.). However, AI practitioners need to use secrets to access sensitive data (interacting with 3rd party APIs, or other services) without having to put their credentials in their source code. *Generic secrets* leverage multiple key value pairs which helps reduce the number of Kubernetes resources and simplifies resource management by reducing the overhead associated with maintaining multiple Secrets. *Generic secrets* are best used as a data source of type *Secret* so that they can be used in containers to keep access credentials hidden. (Requires minimum cluster version v2.18). #### Single Sign On From 6f9dcd9defb6c2d7016f23e0a3230094126913ab Mon Sep 17 00:00:00 2001 From: JamieWeider72 <147967555+JamieWeider72@users.noreply.github.com> Date: Tue, 30 Jul 2024 13:39:00 +0300 Subject: [PATCH 09/17] RUN-19295 added policy for workloads in api --- 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 6a4c840d3c..26dc05a307 100644 --- a/docs/home/whats-new-2-18.md +++ b/docs/home/whats-new-2-18.md @@ -101,7 +101,7 @@ date: 2024-June-14 #### Policy for distributed and inference workloads in the API -Added a new API for creating distributed training workload policies and inference workload policies. These new policies in the API allow to set defaults, enforce rules and impose setup on distributed training and inference workloads. For distributed policies, worker and master may require different rules due to their different specifications. The new capability is currently available via API only. Documentation on submitting policies to follow shortly. +* Added a new API for creating distributed training workload policies and inference workload policies. These new policies in the API allow to set defaults, enforce rules and impose setup on distributed training and inference workloads. For distributed policies, worker and master may require different rules due to their different specifications. The new capability is currently available via API only. Documentation on submitting policies to follow shortly. ## Deprecation Notifications From 5e11b511d7ddd4bb8eb713a420c196f0d57154c8 Mon Sep 17 00:00:00 2001 From: Yaron Date: Tue, 30 Jul 2024 15:29:53 +0300 Subject: [PATCH 10/17] integrations --- docs/admin/workloads/README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/admin/workloads/README.md b/docs/admin/workloads/README.md index 57e63f52a3..bb999a5b17 100644 --- a/docs/admin/workloads/README.md +++ b/docs/admin/workloads/README.md @@ -126,7 +126,7 @@ To get the full experience of Run:ai’s environment and platform use the follow ## Supported integrations -To assist you with other platforms, and other types of workloads use the integrations listed below. +To assist you with other platforms, and other types of workloads use the integrations listed below. These integrations are not regularly tested by Run:ai and are hence provided on an as-is basis. The link below point to the Run:ai customer portal. 1. [Airflow](https://runai.my.site.com/community/s/article/How-to-integrate-Run-ai-with-Apache-Airflow){target=_blank} 2. [MLflow](https://runai.my.site.com/community/s/article/How-to-integrate-Run-ai-with-MLflow){target=_blank} From b80caa401afe73f1c68adb0070e381f2618c6b0d Mon Sep 17 00:00:00 2001 From: Yaron Date: Tue, 30 Jul 2024 15:34:30 +0300 Subject: [PATCH 11/17] integrations --- docs/admin/workloads/README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/admin/workloads/README.md b/docs/admin/workloads/README.md index bb999a5b17..556b945104 100644 --- a/docs/admin/workloads/README.md +++ b/docs/admin/workloads/README.md @@ -124,7 +124,7 @@ To get the full experience of Run:ai’s environment and platform use the follow * [Distributed trainings](../../Researcher/user-interface/trainings.md#trainings) * [Deployment](../admin-ui-setup/deployments.md#viewing-and-submitting-deployments) -## Supported integrations +## Workload-related Integrations To assist you with other platforms, and other types of workloads use the integrations listed below. These integrations are not regularly tested by Run:ai and are hence provided on an as-is basis. The link below point to the Run:ai customer portal. From c9ce1f16577a24a1215d7ef48a38670a805df5b6 Mon Sep 17 00:00:00 2001 From: Yaron Date: Wed, 31 Jul 2024 09:03:30 +0300 Subject: [PATCH 12/17] fix-references --- docs/Researcher/Walkthroughs/quickstart-overview.md | 1 - docs/Researcher/best-practices/env-variables.md | 7 ------- docs/Researcher/cli-reference/runai-submit.md | 8 -------- docs/Researcher/scheduling/the-runai-scheduler.md | 2 -- docs/admin/troubleshooting/cluster-health-check.md | 2 +- docs/admin/workloads/README.md | 4 ++-- docs/admin/workloads/inference-overview.md | 7 +++---- mkdocs.yml | 4 ---- 8 files changed, 6 insertions(+), 29 deletions(-) diff --git a/docs/Researcher/Walkthroughs/quickstart-overview.md b/docs/Researcher/Walkthroughs/quickstart-overview.md index 7e8ada7d47..ef25b7a14f 100644 --- a/docs/Researcher/Walkthroughs/quickstart-overview.md +++ b/docs/Researcher/Walkthroughs/quickstart-overview.md @@ -7,7 +7,6 @@ Follow the Quickstart documents below to learn more: * [Interactive build sessions with externalized services](walkthrough-build-ports.md) * [Using GPU Fractions](walkthrough-fractions.md) * [Distributed Training](walkthrough-distributed-training.md) -* [Hyperparameter Optimization](walkthrough-hpo.md) * [Over-Quota, Basic Fairness & Bin Packing](walkthrough-overquota.md) * [Fairness](walkthrough-queue-fairness.md) * [Inference](quickstart-inference.md) diff --git a/docs/Researcher/best-practices/env-variables.md b/docs/Researcher/best-practices/env-variables.md index a235e989a6..a131a32a28 100644 --- a/docs/Researcher/best-practices/env-variables.md +++ b/docs/Researcher/best-practices/env-variables.md @@ -13,13 +13,6 @@ Run:ai provides the following environment variables: Note that the Job can be deleted and then recreated with the same name. A Job UUID will be different even if the Job names are the same. -## Identifying a Pod - -With [Hyperparameter Optimization](../Walkthroughs/walkthrough-hpo.md), experiments are run as _Pods_ within the Job. Run:ai provides the following environment variables to identify the Pod. - -* ``POD_INDEX`` - An index number (0, 1, 2, 3....) for a specific Pod within the Job. This is useful for Hyperparameter Optimization to allow easy mapping to individual experiments. The Pod index will remain the same if restarted (due to a failure or preemption). Therefore, it can be used by the Researcher to identify experiments. -* ``POD_UUID`` - a unique identifier for the Pod. if the Pod is restarted, the Pod UUID will change. - ## GPU Allocation Run:ai provides an environment variable, visible inside the container, to help identify the number of GPUs allocated for the container. Use `RUNAI_NUM_OF_GPUS` diff --git a/docs/Researcher/cli-reference/runai-submit.md b/docs/Researcher/cli-reference/runai-submit.md index fe026c01ab..4426884676 100644 --- a/docs/Researcher/cli-reference/runai-submit.md +++ b/docs/Researcher/cli-reference/runai-submit.md @@ -50,14 +50,6 @@ runai submit --name frac05 -i gcr.io/run-ai-demo/quickstart -g 0.5 (see: [GPU fractions Quickstart](../Walkthroughs/walkthrough-fractions.md)). -Hyperparameter Optimization - -```console -runai submit --name hpo1 -i gcr.io/run-ai-demo/quickstart-hpo -g 1 \ - --parallelism 3 --completions 12 -v /nfs/john/hpo:/hpo -``` - -(see: [hyperparameter optimization Quickstart](../Walkthroughs/walkthrough-hpo.md)). Submit a Job without a name (automatically generates a name) diff --git a/docs/Researcher/scheduling/the-runai-scheduler.md b/docs/Researcher/scheduling/the-runai-scheduler.md index b8f0550a8d..804fea145a 100644 --- a/docs/Researcher/scheduling/the-runai-scheduler.md +++ b/docs/Researcher/scheduling/the-runai-scheduler.md @@ -226,5 +226,3 @@ To search for good hyperparameters, Researchers typically start a series of smal With HPO, the Researcher provides a single script that is used with multiple, varying, parameters. Each run is a *pod* (see definition above). Unlike Gang Scheduling, with HPO, pods are **independent**. They are scheduled independently, started, and end independently, and if preempted, the other pods are unaffected. The scheduling behavior for individual pods is exactly as described in the Scheduler Details section above for Jobs. In case node pools are enabled, if the HPO workload has been assigned with more than one node pool, the different pods might end up running on different node pools. - -For more information on Hyperparameter Optimization in Run:ai see [here](../Walkthroughs/walkthrough-hpo.md) diff --git a/docs/admin/troubleshooting/cluster-health-check.md b/docs/admin/troubleshooting/cluster-health-check.md index 78e7018616..3c204fd850 100644 --- a/docs/admin/troubleshooting/cluster-health-check.md +++ b/docs/admin/troubleshooting/cluster-health-check.md @@ -186,7 +186,7 @@ kubectl get cm runai-public -oyaml ### Resources not deployed / System unavailable / Reconciliation failed -1. Run the [Preinstall diagnostic script](cluster-prerequisites.md#pre-install-script) and check for issues. +1. Run the [Preinstall diagnostic script](../runai-setup/cluster-setup/cluster-prerequisites.md#pre-install-script) and check for issues. 2. Run ``` diff --git a/docs/admin/workloads/README.md b/docs/admin/workloads/README.md index 556b945104..125df62201 100644 --- a/docs/admin/workloads/README.md +++ b/docs/admin/workloads/README.md @@ -121,8 +121,8 @@ To get the full experience of Run:ai’s environment and platform use the follow * [Workspaces](../../Researcher/user-interface/workspaces/overview.md#getting-familiar-with-workspaces) * [Trainings](../../Researcher/user-interface/trainings.md#trainings) (Only available when using the *Jobs* view) -* [Distributed trainings](../../Researcher/user-interface/trainings.md#trainings) -* [Deployment](../admin-ui-setup/deployments.md#viewing-and-submitting-deployments) +* [Distributed training](../../Researcher/user-interface/trainings.md#trainings) +* Deployments. ## Workload-related Integrations diff --git a/docs/admin/workloads/inference-overview.md b/docs/admin/workloads/inference-overview.md index 5c84085b91..5bf8e4e147 100644 --- a/docs/admin/workloads/inference-overview.md +++ b/docs/admin/workloads/inference-overview.md @@ -30,13 +30,12 @@ Run:ai provides *Inference* services as an equal part together with the other tw * Multiple replicas will appear in Run:ai as a single *Inference* workload. The workload will appear in all Run:ai dashboards and views as well as the Command-line interface. -* Inference workloads can be submitted via Run:ai [user interface](../admin-ui-setup/deployments.md) as well as [Run:ai API](../../developer/cluster-api/workload-overview-dev.md). Internally, spawning an Inference workload also creates a Kubernetes *Service*. The service is an end-point to which clients can connect. +* Inference workloads can be submitted via Run:ai user interface as well as [Run:ai API](../../developer/cluster-api/workload-overview-dev.md). Internally, spawning an Inference workload also creates a Kubernetes *Service*. The service is an end-point to which clients can connect. ## Autoscaling To withstand SLA, *Inference* workloads are typically set with *auto scaling*. Auto-scaling is the ability to add more computing power (Kubernetes pods) when the load increases and shrink allocated resources when the system is idle. - -There are a number of ways to trigger autoscaling. Run:ai supports the following: +There are several ways to trigger autoscaling. Run:ai supports the following: | Metric | Units | Run:ai name | |-----------------|--------------|-----------------| @@ -45,7 +44,7 @@ There are a number of ways to trigger autoscaling. Run:ai supports the following The Minimum and Maximum number of replicas can be configured as part of the autoscaling configuration. -Autoscaling also supports a scale to zero policy with *Throughput* and *Concurrency* metrics, meaning that given enough time under the target threshold, the number of replicas will be scaled down to 0. +Autoscaling also supports a scale-to-zero policy with *Throughput* and *Concurrency* metrics, meaning that given enough time under the target threshold, the number of replicas will be scaled down to 0. This has the benefit of conserving resources at the risk of a delay from "cold starting" the model when traffic resumes. diff --git a/mkdocs.yml b/mkdocs.yml index dd0620c3f3..1cea279e31 100644 --- a/mkdocs.yml +++ b/mkdocs.yml @@ -113,9 +113,6 @@ plugins: 'admin/runai-setup/cluster-setup/researcher-authentication.md' : 'admin/runai-setup/authentication/sso.md' 'admin/researcher-setup/cli-troubleshooting.md' : 'admin/troubleshooting/troubleshooting.md' 'developer/deprecated/inference/submit-via-yaml.md' : 'developer/cluster-api/other-resources.md' - 'Researcher/researcher-library/rl-hpo-support.md' : 'Researcher/scheduling/hpo.md' - 'Researcher/researcher-library/researcher-library-overview.md' : 'Researcher/scheduling/hpo.md' - nav: - Home: - 'Overview': 'index.md' @@ -217,7 +214,6 @@ nav: - 'Dashboard Analysis' : 'admin/admin-ui-setup/dashboard-analysis.md' - 'Jobs' : 'admin/admin-ui-setup/jobs.md' - 'Credentials' : 'admin/admin-ui-setup/credentials-setup.md' - - 'Deployments' : 'admin/admin-ui-setup/deployments.md' - 'Templates': 'admin/admin-ui-setup/templates.md' - 'Troubleshooting' : - 'Cluster Health' : 'admin/troubleshooting/cluster-health-check.md' From 61be7dca0450e91a61e3187ffe70af53a9b7a5b9 Mon Sep 17 00:00:00 2001 From: Yaron Date: Wed, 31 Jul 2024 13:27:13 +0300 Subject: [PATCH 13/17] Merge pull request #890 from run-ai/managing-ai-initiatives aiinitiatives --- docs/admin/aiinitiatives/img/assigning.png | Bin 0 -> 35467 bytes docs/admin/aiinitiatives/img/bu.png | Bin 0 -> 11904 bytes .../aiinitiatives/img/groupbyhardware.png | Bin 0 -> 18887 bytes .../aiinitiatives/img/groupbytopology.png | Bin 0 -> 14870 bytes docs/admin/aiinitiatives/img/individuals.png | Bin 0 -> 7966 bytes docs/admin/aiinitiatives/img/org.png | Bin 0 -> 15876 bytes docs/admin/aiinitiatives/overview.md | 98 ++++++++++++++++++ mkdocs.yml | 2 + 8 files changed, 100 insertions(+) create mode 100644 docs/admin/aiinitiatives/img/assigning.png create mode 100644 docs/admin/aiinitiatives/img/bu.png create mode 100644 docs/admin/aiinitiatives/img/groupbyhardware.png create mode 100644 docs/admin/aiinitiatives/img/groupbytopology.png create mode 100644 docs/admin/aiinitiatives/img/individuals.png create mode 100644 docs/admin/aiinitiatives/img/org.png create mode 100644 docs/admin/aiinitiatives/overview.md diff --git a/docs/admin/aiinitiatives/img/assigning.png b/docs/admin/aiinitiatives/img/assigning.png new file mode 100644 index 0000000000000000000000000000000000000000..3a9daa05bb4cc68afb147c8dd5a359e94cfc9201 GIT binary patch literal 35467 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

`LWl_fD!VNx73=3Q>gm3kC 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 LsXZ!?G4=l+m|AM+ literal 0 HcmV?d00001 diff --git a/docs/admin/aiinitiatives/img/bu.png b/docs/admin/aiinitiatives/img/bu.png new file mode 100644 index 0000000000000000000000000000000000000000..252c5674ddeefc4cd0ef1f7fe52a17ac4c0dfefb GIT binary patch literal 11904 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 Ud4e&bz{i7(FPQ6N&O68a7X~A6g8%>k literal 0 HcmV?d00001 diff --git a/docs/admin/aiinitiatives/img/groupbyhardware.png b/docs/admin/aiinitiatives/img/groupbyhardware.png new file mode 100644 index 0000000000000000000000000000000000000000..f4290225fea169462049efd4c1a75d48d66f09a6 GIT binary patch literal 18887 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 N@O1TaS?83{1OO@HcgFw# literal 0 HcmV?d00001 diff --git a/docs/admin/aiinitiatives/img/groupbytopology.png b/docs/admin/aiinitiatives/img/groupbytopology.png new file mode 100644 index 0000000000000000000000000000000000000000..8bdbacc5129a5ef6d5135d667741da656c369fdc GIT binary patch literal 14870 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

Fu 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 literal 0 HcmV?d00001 diff --git a/docs/admin/aiinitiatives/img/org.png b/docs/admin/aiinitiatives/img/org.png new file mode 100644 index 0000000000000000000000000000000000000000..5a566d05d50b5937f134d9897ab7cf7f22abc3bd GIT binary patch literal 15876 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 Date: Thu, 1 Aug 2024 10:06:35 +0300 Subject: [PATCH 14/17] Merge pull request #889 from run-ai/system-monitoring system-monitoring --- .../maintenance/alert-monitoring.md | 460 ++++++++++++------ .../maintenance/img/monitoring-webhook.png | Bin 0 -> 54091 bytes mkdocs.yml | 19 +- 3 files changed, 311 insertions(+), 168 deletions(-) create mode 100644 docs/admin/runai-setup/maintenance/img/monitoring-webhook.png diff --git a/docs/admin/runai-setup/maintenance/alert-monitoring.md b/docs/admin/runai-setup/maintenance/alert-monitoring.md index bbe9d54937..4616c259eb 100644 --- a/docs/admin/runai-setup/maintenance/alert-monitoring.md +++ b/docs/admin/runai-setup/maintenance/alert-monitoring.md @@ -1,156 +1,316 @@ ---- -title: Setting up Alert Monitoring for Run:ai Using Alertmanager in Prometheus -summary: This article describes how to set up and configure Alertmanager in Prometheus. -authors: - - Jason Novich - - Viktor Koukouliev -date: 2024-Jan-15 ---- +This article explains how to configure Run:ai to generate health alerts and to connect these alerts to alert-management systems within your organization. Alerts are generated for Run:ai clusters. -## Introduction +## Alert infrastructure -This documentation outlines the steps required to set up Alertmanager within the Prometheus Operator ecosystem. It also provides guidance on configuring Prometheus to send alerts to Alertmanager and customizing Alertmanager to trigger alerts based on specific **Run.ai** conditions. +Run:ai uses Prometheus for externalizing metrics and providing visibility to end-users. The Run:ai Cluster installation includes Prometheus or can connect to an existing Prometheus instance used in your organization. The alerts are based on the Prometheus AlertManager. Once installed, it is enabled by default. + +This document explains how to: + +* Configure alert destinations - triggered alerts send data to specified destinations +* Understand the out-of-the-box cluster alerts, provided by Run:ai +* Add additional custom alerts ## Prerequisites -* A Kubernetes cluster with the necessary permissions and manage resources. -* `kubectl` command-line tool installed and configured to interact with the cluster. -* Basic knowledge of Kubernetes resources and manifests. -* up and running Prometheus Operator -* Up and running Run.ai environment +* A Kubernetes cluster with the necessary permissions +* Up and running Run:ai environment, including Prometheus Operator +* [kubectl](https://kubernetes.io/docs/reference/kubectl/) command-line tool installed and configured to interact with the cluster + +## Set-up + +Use the steps below to set up monitoring alerts. + +### Validating Prometheus operator installed + +1. Verify that the Prometheus Operator Deployment is running + Copy the following command and paste it in your terminal, where you have access to the Kubernetes cluster: + `kubectl get deployment kube-prometheus-stack-operator -n monitoring` + In your terminal, you can see an output indicating the deployment's status, including the number of replicas and their current state. +1. Verify that Prometheus instances are running + Copy the following command and paste it in your terminal: + `kubectl get prometheus -n runai` + You can see the Prometheus instance(s) listed along with their status. + +### Enabling Prometheus AlertManager + +In each of the steps in this section, copy the content of the code snippet to a new YAML file (e.g., `step1.yaml`). + +* Copy the following command to your terminal, to apply the YAML file to the cluster: + +kubectl apply -f step1.yaml +Copy the following command to your terminal to create the AlertManager CustomResource, to enable AlertManager: + +``` yaml +apiVersion: monitoring.coreos.com/v1 +kind: Alertmanager +metadata: + name: runai + namespace: runai +spec: + replicas: 1 + alertmanagerConfigSelector: + matchLabels: + alertmanagerConfig: runai +``` + +* Copy the following command to your terminal to validate that the AlertManager instance has started: + `kubectl get alertmanager -n runai` +* Copy the following command to your terminal to validate that the Prometheus operator has created a Service for AlertManager: + `kubectl get svc alertmanager-operated -n runai` + +### Configuring Prometheus to send alerts + +1. Open the terminal on your local machine or another machine that has access to your Kubernetes cluster +1. Copy and paste the following command in your terminal to edit the Prometheus configuration for the `runai` Namespace: +``` +kubectl edit prometheus runai -n runai +``` +This command opens the Prometheus configuration file in your default text editor (usually `vi` or `nano`). + +3. Copy and paste the following text to your terminal to change the configuration file: +``` yaml +alerting: + alertmanagers: + - namespace: runai + name: alertmanager-operated + port: web +``` +4. Save the changes and exit the text editor. + +!!! Note + To save changes using `vi`, type `:wq` and press Enter. + The changes are applied to the Prometheus configuration in the cluster. + +## Alert destinations + +Set out below are the various alert destinations. + +### Configuring AlertManager for custom email alerts + +In each step, copy the contents of the code snippets to a new file and apply it to the cluster using `kubectl apply -f`. + +Add your smtp password as a secret: + +``` yaml +apiVersion: v1 +kind: Secret +metadata: + name: alertmanager-smtp-password + namespace: runai +stringData: + password: "your_smtp_password" +``` + +Replace the relevant smtp details with your own, then apply the `alertmanagerconfig` using `kubectl apply`. + +``` yaml + apiVersion: monitoring.coreos.com/v1alpha1 + kind: AlertmanagerConfig + metadata: + name: runai + namespace: runai + labels: + alertmanagerConfig: runai + spec: + route: + continue: true + groupBy: + - alertname + + groupWait: 30s + groupInterval: 5m + repeatInterval: 1h + + matchers: + - matchType: =~ + name: alertname + value: Runai.* + + receiver: email + + receivers: + - name: 'email' + emailConfigs: + - to: '' + from: '' + smarthost: 'smtp.gmail.com:587' + authUsername: '' + authPassword: + name: alertmanager-smtp-password + key: password +``` + +Save and exit the editor. The configuration is automatically reloaded. + +### Third-party alert destinations + +Prometheus AlertManager provides a structured way to connect to alert-management systems. There are built-in plugins for popular systems such as PagerDuty and OpsGenie, including a generic Webhook. + +#### Example: Integrating Run:ai with a Webhook + +1. Use [webhook.site](https://webhook.site/) to get a unique URL. +1. Use the upgrade cluster instructions to modify the values file: + Edit the values file to add the following, and replace `` with the URL from [webhook.site](http://webhook.site). + +``` yaml +codekube-prometheus-stack: + ... + alertmanager: + enabled: true + config: + global: + resolve_timeout: 5m + receivers: + - name: "null" + - name: webhook-notifications + webhook_configs: + - url: + send_resolved: true + route: + group_by: + - alertname + group_interval: 5m + group_wait: 30s + receiver: 'null' + repeat_interval: 10m + routes: + - receiver: webhook-notifications +``` +3. Verify that you are receiving alerts on the [webhook.site](https://webhook.site/), in the left pane: + +![](img/monitoring-webhook.png) + +### Built-in alerts + +A Run:ai cluster comes with several built-in alerts. Each alert notifies on a specific functionality of a Run:ai’s entity. There is also a single, inclusive alert: `Run:ai Critical Problems`, which aggregates all component-based alerts into a single cluster health test. + +Runai agent cluster info push rate low + +| Meaning | The `cluster-sync` Pod in the `runai` namespace might not be functioning properly | +| :---- | :---- | +| **Impact** | Possible impact - no info/partial info from the cluster is being synced back to the control-plane | +| **Severity** | Critical | +| **Diagnosis** | `kubectl get pod -n runai` to see if the `cluster-sync` pod is running | +| **Troubleshooting/Mitigation** | To diagnose issues with the `cluster-sync` pod, follow these steps: **Paste the following command to your terminal, to receive detailed information about the** `cluster-sync` deployment:`kubectl describe deployment cluster-sync -n runai` **Check the Logs**: Use the following command to view the logs of the `cluster-sync` deployment:`kubectl logs deployment/cluster-sync -n runai` **Analyze the Logs and Pod Details**: From the information provided by the logs and the deployment details, attempt to identify the reason why the `cluster-sync` pod is not functioning correctly **Check Connectivity**: Ensure there is a stable network connection between the cluster and the Run:ai Control Plane. A connectivity issue may be the root cause of the problem. **Contact Support**: If the network connection is stable and you are still unable to resolve the issue, contact Run:ai support for further assistance | + +Runai agent pull rate low + +| Meaning | The `runai-agent` pod may be too loaded, is slow in processing data (possible in very big clusters), or the `runai-agent` pod itself in the `runai` namespace may not be functioning properly. | +| :---- | :---- | +| **Impact** | Possible impact - no info/partial info from the control-plane is bein[g synced i](http://running.To)n the cluster | +| **Severity** | Critical | +| **Diagnosis** | Run: `kubectl get pod -n runai` And see if the `runai-agent` pod is running. | +| **Troubleshooting/Mitigation** | To diagnose issues with the `runai-agent` pod, follow these steps: **Describe the Deployment**: Run the following command to get detailed information about the `runai-agent` deployment:`kubectl describe deployment runai-agent -n runai` **Check the Logs**: Use the following command to view the logs of the `runai-agent` deployment:`kubectl logs deployment/runai-agent -n runai` **Analyze the Logs and Pod Details**: From the information provided by the logs and the deployment details, attempt to identify the reason why the `runai-agent` pod is not functioning correctly. There may be a connectivity issue with the control plane. **Check Connectivity**: Ensure there is a stable network connection between the `runai-agent` and the control plane. A connectivity issue may be the root cause of the problem. **Consider Cluster Load**: If the `runai-agent` appears to be functioning properly but the cluster is very large and heavily loaded, it may take more time for the agent to process data from the control plane. **Adjust Alert Threshold**: If the cluster load is causing the alert to fire, you can adjust the threshold at which the alert triggers. The default value is 0.05. You can try changing it to a lower value (e.g., 0.045 or 0.04).To edit the value, paste the following in your terminal:`kubectl edit runaiconfig -n runai`In the editor, navigate to:spec: prometheus: agentPullPushRateMinForAlert: If the `agentPullPushRateMinForAlert` value does not exist, add it under `spec -> prometheus` | + +Runai container memory usage critical + +| Meaning | `Runai` container is using more than 90% of its Memory limit | +| :---- | :---- | +| **Impact** | The container might run out of memory and crash. | +| **Severity** | Critical | +| **Diagnosis** | Calculate the memory usage, this is performed by pasting the following to your terminal: `container_memory_usage_bytes{namespace=~"runai|runai-backend"}` | +| **Troubleshooting/Mitigation** | Add more memory resources to the container. If the issue persists, contact Run:ai | + +Runai container memory usage warning + +| Meaning | Runai container is using more than 80% of its memory limit | +| :---- | :---- | +| **Impact** | The container might run out of memory and crash | +| **Severity** | Warning | +| **Diagnosis** | Calculate the memory usage, this can be done by pasting the following to your terminal: `container_memory_usage_bytes{namespace=~"runai|runai-backend"}` | +| **Troubleshooting/Mitigation** | Add more memory resources to the container. If the issue persists, contact Run:ai | + +Runai container restarting + +| Meaning | `Runai` container has restarted more than twice in the last 10 min | +| :---- | :---- | +| **Impact** | The container might become unavailable and impact the Run:ai system | +| **Severity** | Warning | +| **Diagnosis** | To diagnose the issue and identify the problematic pods, paste this into your terminal: `kubectl get pods -n runai kubectl get pods -n runai-backend`One or more of the pods have a restart count >= 2. | +| **Troubleshooting/Mitigation** | Paste this into your terminal:`kubectl logs -n NAMESPACE POD_NAME`Replace `NAMESPACE` and `POD_NAME` with the relevant pod information from the previous step. Check the logs for any standout issues and verify that the container has sufficient resources. If you need further assistance, contact Run:ai | + +Runai CPU usage warning + +| Meaning | `runai` container is using more than 80% of its CPU limit | +| :---- | :---- | +| **Impact** | This might cause slowness in the operation of certain Run:ai features. | +| **Severity** | Warning | +| **Diagnosis** | Paste the following query to your terminal in order to calculate the CPU usage: `rate(container_cpu_usage_seconds_total{namespace=~"runai|runai-backend"}[2m])` | +| **Troubleshooting/Mitigation** | Add more CPU resources to the container. If the issue persists, please contact Run:ai. | + +Runai critical problem + +| Meaning | One of the critical Run:ai alerts is currently active | +| :---- | :---- | +| **Impact** | Impact is based on the active alert | +| **Severity** | Critical | +| **Diagnosis** | Check Run:ai alerts in Prometheus to identify any active critical alerts | + +Runai daemonSet rollout stuck / Runai DaemonSet unavailable on nodes + +| Meaning | There are currently 0 available pods for the `runai` daemonset on the relevant node | +| :---- | :---- | +| **Impact** | No fractional GPU workloads support | +| **Severity** | Critical | +| **Diagnosis** | Paste the following command to your terminal: `kubectl get daemonset -n runai-backend` In the result of this command, identify the daemonset(s) that don’t have any running pods | +| **Troubleshooting/Mitigation** | Paste the following command to your terminal, where `daemonsetX` is the problematic daemonset from the pervious step: `kubectl describe daemonsetX -n runai` on the relevant deamonset(s) from the previous step. The next step is to look for the specific error which prevents it from creating pods. Possible reasons might be:**Node Resource Constraints**: The nodes in the cluster may lack sufficient resources (CPU, memory, etc.) to accommodate new pods from the daemonset. **Node Selector or Affinity Rules**: The daemonset may have node selector or affinity rules that are not matching with any nodes currently available in the cluster, thus preventing pod creation. | + +Runai deployment insufficient replicas / Runai deployment no available replicas /RunaiDeploymentUnavailableReplicas + +| Meaning | `Runai` deployment has one or more unavailable pods | +| :---- | :---- | +| **Impact** | When this happens, there may be scale issues. Additionally, new versions cannot be deployed, potentially resulting in missing features. | +| **Severity** | Critical | +| **Diagnosis** | Paste the following commands to your terminal, in order to get the status of the deployments in the `runai` and `runai-backend` namespaces:`kubectl get deployment -n runai kubectl get deployment -n runai-backend`Identify any deployments that have missing pods. Look for discrepancies in the `DESIRED` and `AVAILABLE` columns. If the number of `AVAILABLE` pods is less than the `DESIRED` pods, it indicates that there are missing pods. | +| **Troubleshooting/Mitigation** | Paste the following commands to your terminal, to receive detailed information about the problematic deployment:`kubectl describe deployment -n runai kubectl describe deployment -n runai-backend` Paste the following commands to your terminal, to check the replicaset details associated with the deployment:`kubectl describe replicaset -n runai kubectl describe replicaset -n runai-backend` Paste the following commands to your terminal to retrieve the logs for the deployment to identify any errors or issues:`kubectl logs deployment/ -n runai kubectl logs deployment/ -n runai-backend` From the logs and the detailed information provided by the `describe` commands, analyze the reasons why the deployment is unable to create pods. Look for common issues such as: Resource constraints (CPU, memory) Misconfigured deployment settings or replicasets Node selector or affinity rules preventing pod schedulingIf the issue persists, contact Run:ai. | + +Runai project controller reconcile failure + +| Meaning | The `project-controller` in `runai` namespace had errors while reconciling projects | +| :---- | :---- | +| **Impact** | Some projects might not be in the “Ready” state. This means that they are not fully operational and may not have all the necessary components running or configured correctly. | +| **Severity** | Critical | +| **Diagnosis** | Retrieve the logs for the `project-controller` deployment by pasting the following command in your terminal:`kubectl logs deployment/project-controller -n runai` Carefully examine the logs for any errors or warning messages. These logs help you understand what might be going wrong with the project controller. | +| **Troubleshooting/Mitigation** | Once errors in the log have been identified, follow these steps to mitigate the issue: The error messages in the logs should provide detailed information about the problem. Read through them to understand the nature of the issue. If the logs indicate which project failed to reconcile, you can further investigate by checking the status of that specific project. Run the following command, replacing `` with the name of the problematic project:`kubectl get project -o yaml` Review the status section in the YAML output. This section describes the current state of the project and provide insights into what might be causing the failure.If the issue persists, contact Run:ai. | + +Runai StatefulSet insufficient replicas / Runai StatefulSet no available replicas + +| Meaning | `Runai` statefulset has no available pods | +| :---- | :---- | +| **Impact** | Absence of Metrics Database Unavailability | +| **Severity** | Critical | +| **Diagnosis** | To diagnose the issue, follow these steps: Check the status of the stateful sets in the `runai-backend` namespace by running the following command:`kubectl get statefulset -n runai-backend` Identify any stateful sets that have no running pods. These are the ones that might be causing the problem. | +| **Troubleshooting/Mitigation** | Once you've identified the problematic stateful sets, follow these steps to mitigate the issue: Describe the stateful set to get detailed information on why it cannot create pods. Replace `X` with the name of the stateful set:`kubectl describe statefulset X -n runai-backend` Review the description output to understand the root cause of the issue. Look for events or error messages that explain why the pods are not being created. If you're unable to resolve the issue based on the information gathered, contact Run:ai support for further assistance. | + +### Adding a custom alert + +You can add additional alerts from Run:ai. Alerts are triggered by using the Prometheus query language with any Run:ai metric. + +To create an alert, follow these steps using Prometheus query language with Run:ai Metrics: + +* **Modify Values File:** Use the upgrade cluster instructions to modify the values file. +* **Add Alert Structure:** Incorporate alerts according to the structure outlined below. Replace placeholders ``, ``, ``, ``, and `` with appropriate values for your alert, as described below. + +``` yaml +kube-prometheus-stack: + additionalPrometheusRulesMap: + custom-runai: + groups: + - name: custom-runai-rules + rules: + - alert: + annotations: + summary: + expr: + for: + labels: + severity: +``` +* ``: Choose a descriptive name for your alert, such as `HighCPUUsage` or `LowMemory`. +* ``: Provide a brief summary of what the alert signifies, for example, `High CPU usage detected` or `Memory usage below threshold`. +* ``: Construct a Prometheus query (PROMQL) that defines the conditions under which the alert should trigger. This query should evaluate to a boolean value (`1` for alert, `0` for no alert). +* ``: Optionally, specify a duration in seconds (`s`), minutes (`m`), or hours (`h`) that the alert condition should persist before triggering an alert. If not specified, the alert triggers as soon as the condition is met. +* ``: Assign a severity level to the alert, indicating its importance. Choose between `critical` for severe issues requiring immediate attention, or `warning` for less critical issues that still need monitoring. + +You can find an example in the [Prometheus documentation](https://prometheus.io/docs/prometheus/latest/querying/examples/). -## Validate Prometheus Operator Installed - -1. Verify that the Prometheus Operator deployment is running: - - `kubectl get deployment prometheus-operator -n runai` - - You should see output indicating the deployment's status, including the number of replicas and their current state. - -2. Check if Prometheus instances are running: - - `kubectl get prometheus -n runai` - - You should see the Prometheus instance(s) listed along with their status. - -## Enabling Alertmanager - -1. Create an `AlertmanagerConfig` file that triggers alerts on Run.ai events: - - cat <mX+j2+Q633L7aSK3kMG36 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 S(VG|WkDQdUWVN{Q*Z%=q*KN%J literal 0 HcmV?d00001 diff --git a/mkdocs.yml b/mkdocs.yml index 04f6519042..d3b55256cb 100644 --- a/mkdocs.yml +++ b/mkdocs.yml @@ -186,7 +186,7 @@ nav: - 'Email and System Notifications': 'admin/runai-setup/notifications/notifications.md' - 'Maintenance' : - 'Node Downtime' : 'admin/runai-setup/maintenance/node-downtime.md' - - 'Monitoring Cluster Health' : 'admin/runai-setup/maintenance/alert-monitoring.md' + - 'System Monitoring' : 'admin/runai-setup/maintenance/alert-monitoring.md' - 'Audit Log' : 'admin/runai-setup/maintenance/audit-log.md' - 'Researcher Setup' : - 'Introduction' : 'admin/researcher-setup/researcher-setup-intro.md' @@ -221,23 +221,6 @@ nav: - 'Cluster Health' : 'admin/troubleshooting/cluster-health-check.md' - 'Troubleshooting' : 'admin/troubleshooting/troubleshooting.md' - 'Diagnostics' : 'admin/troubleshooting/diagnostics.md' - - 'Alert Manager Alerts' : - - 'admin/troubleshooting/alertmanager/README.md' - - 'Runai Agent Cluster Info Push Rate Low' : 'admin/troubleshooting/alertmanager/RunaiAgentClusterInfoPushRateLow.md' - - 'Runai Agent Pull Rate Low' : 'admin/troubleshooting/alertmanager/RunaiAgentPullRateLow.md' - - 'Runai Container Memory Usage Critical' : 'admin/troubleshooting/alertmanager/RunaiContainerMemoryUsageCritical.md' - - 'Runai Container Memory Usage Warning' : 'admin/troubleshooting/alertmanager/RunaiContainerMemoryUsageWarning.md' - - 'Runai Container Restarting' : 'admin/troubleshooting/alertmanager/RunaiContainerRestarting.md' - - 'Runai Cpu Usage Warning' : 'admin/troubleshooting/alertmanager/RunaiCpuUsageWarning.md' - - 'Runai Critical Problem' : 'admin/troubleshooting/alertmanager/RunaiCriticalProblem.md' - - 'Runai DaemonSet Rollout Stuck' : 'admin/troubleshooting/alertmanager/RunaiDaemonSetRolloutStuck.md' - - 'Runai DaemonSet Unavailable On Nodes' : 'admin/troubleshooting/alertmanager/RunaiDaemonSetUnavailableOnNodes.md' - - 'Runai Deployment Insufficient Replicas' : 'admin/troubleshooting/alertmanager/RunaiDeploymentInsufficientReplicas.md' - - 'Runai Deployment NoAvailable Replicas' : 'admin/troubleshooting/alertmanager/RunaiDeploymentNoAvailableReplicas.md' - - 'Runai Deployment Unavailable Replicas' : 'admin/troubleshooting/alertmanager/RunaiDeploymentUnavailableReplicas.md' - - 'Runai Project Controller Reconcile Failure' : 'admin/troubleshooting/alertmanager/RunaiProjectControllerReconcileFailure.md' - - 'Runai StatefulSet Insufficient Replicas' : 'admin/troubleshooting/alertmanager/RunaiStatefulSetInsufficientReplicas.md' - - 'Runai StatefulSet No Available Replicas' : 'admin/troubleshooting/alertmanager/RunaiStatefulSetNoAvailableReplicas.md' - 'Best Practices' : - 'From Docker to Run:ai ' : 'admin/researcher-setup/docker-to-runai.md' - 'Researcher' : From 3271e3f5fad2a6a1ecc4c0908a64e6e440810198 Mon Sep 17 00:00:00 2001 From: JamieWeider72 <147967555+JamieWeider72@users.noreply.github.com> Date: Thu, 1 Aug 2024 13:17:24 +0300 Subject: [PATCH 15/17] Update backend.md --- docs/admin/runai-setup/self-hosted/k8s/backend.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/admin/runai-setup/self-hosted/k8s/backend.md b/docs/admin/runai-setup/self-hosted/k8s/backend.md index defdfff957..19d4ad2563 100644 --- a/docs/admin/runai-setup/self-hosted/k8s/backend.md +++ b/docs/admin/runai-setup/self-hosted/k8s/backend.md @@ -13,7 +13,7 @@ Run the helm command below: ``` bash helm repo add runai-backend https://runai.jfrog.io/artifactory/cp-charts-prod helm repo update - helm upgrade -i runai-backend -n runai-backend runai-backend/control-plane --version "~2.17.0" \ + helm upgrade -i runai-backend -n runai-backend runai-backend/control-plane --version "~2.18.0" \ --set global.domain= # (1) ``` From 8bda4f5de1033cb378df3fc33761f6da1934e959 Mon Sep 17 00:00:00 2001 From: JamieWeider72 <147967555+JamieWeider72@users.noreply.github.com> Date: Thu, 1 Aug 2024 13:17:59 +0300 Subject: [PATCH 16/17] Update backend.md --- docs/admin/runai-setup/self-hosted/ocp/backend.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/admin/runai-setup/self-hosted/ocp/backend.md b/docs/admin/runai-setup/self-hosted/ocp/backend.md index 03b2754906..b87392b3e2 100644 --- a/docs/admin/runai-setup/self-hosted/ocp/backend.md +++ b/docs/admin/runai-setup/self-hosted/ocp/backend.md @@ -12,7 +12,7 @@ Run the helm command below: ``` bash helm repo add runai-backend https://runai.jfrog.io/artifactory/cp-charts-prod helm repo update - helm upgrade -i runai-backend -n runai-backend runai-backend/control-plane --version "~2.17.0" \ + helm upgrade -i runai-backend -n runai-backend runai-backend/control-plane --version "~2.18.0" \ --set global.domain=runai.apps. \ # (1) --set global.config.kubernetesDistribution=openshift ``` From e16e216b807835158a8ecf27996ff513b7e27be2 Mon Sep 17 00:00:00 2001 From: JamieWeider72 <147967555+JamieWeider72@users.noreply.github.com> Date: Thu, 1 Aug 2024 13:34:11 +0300 Subject: [PATCH 17/17] Add files via upload --- .../workspaces/blocks/Existing PVC.md | 90 +++++++++++++++++++ 1 file changed, 90 insertions(+) create mode 100644 docs/Researcher/user-interface/workspaces/blocks/Existing PVC.md diff --git a/docs/Researcher/user-interface/workspaces/blocks/Existing PVC.md b/docs/Researcher/user-interface/workspaces/blocks/Existing PVC.md new file mode 100644 index 0000000000..2dbc829f56 --- /dev/null +++ b/docs/Researcher/user-interface/workspaces/blocks/Existing PVC.md @@ -0,0 +1,90 @@ +# Persistent volume claim (PVCs) + +# Persistent Volumes (PVs) & Persistent Volume Claims (PVCs) + +Persistent Volumes (PVs) and Persistent Volume Claims (PVCs) are concepts in Kubernetes for managing storage. A PV is a piece of storage in the cluster, provisioned by an administrator or dynamically by Kubernetes using a StorageClass. It is a resource in the cluster, just like a node is a cluster resource. + +PVCs are requests for storage by a user. They are similar to pods, in that pods consume node resources and PVCs consume PV resources. PVCs allow users to request specific sizes and access modes (for example, read/write once, read-only many) without needing to know the details of the underlying storage infrastructure. + +Using PVs and PVCs in Kubernetes is essential for AI workloads as they provide a reliable and consistent way to manage storage that persists beyond the lifecycle of individual pods. This ensures that data generated by AI workloads is not lost when pods are rescheduled or updated, providing a seamless and efficient storage solution that can handle the large datasets typically associated with AI projects. + +## Data source of type Persistent Volume Claim (PVC) + +At Run:ai, a data source of type PVC is an abstraction, mapping directly to a Kubernetes PVC. This type of integration allows you to specify and manage your data storage requirements within the Run:ai platform, while using familiar Kubernetes storage concepts. + +By leveraging PVCs as data sources, Run:ai enables access to persistent storage for workloads, ensuring that data remains consistent and accessible across different compute resources and workload executions. + +## Creating a data source of type PVC via the UI + +Like any other asset, when creating a data source, the user can select the scope of the data source, based on their permissions set in Run:ai’s Role Based Access Control (RBAC) system. + +For example: By selecting Department B as the scope of the asset, any user with a role which allows them to view the data source in Department A or any of its subordinate units (current and future) can view this PVC. +![][image1] + +There are two different ways of creating data source of type PVC: + +1. **Existing PVC** \- Data source of type PVC using an existing PVC in the cluster +1. **New PVC** \- Data source of type PVC by creating a new pvc in the cluster![][image2] + +**NOTE**: If there are no existing PVCs that Run:ai has visibility or authorization to use, this option is disabled in the Run:ai platform. For details on providing visibility and authorization, see below Existing PVC. + +## Existing PVC + +To select an existing PVC in the Run:ai platform, the admin is responsible for performing a number of actions prior to creating the data source via the Run:ai UI (or API). These actions provide Run:ai with access to the existing PVC, authorization to share across the selected scope and eventually result in exposing the existing PVC in the UI for the user to select. + +Click the link for more information on [creating a data source of type PVC via API](https://envinaclickstaging.staging.run.ai/api/docs\#tag/PVC/operation/create\_pvc\_asset). + +The actions taken by the admin are based on the scope (cluster, department or project) that the admin wants for data source of type PVC. + +### For a cluster scope + +1. Locate the PVC in the runai namespace +1. Provide Run:ai with visibility and authorization to share the PVC to your selected scope by implementing the following label: + [run.ai/cluster-wide](http://run.ai/cluster-wide): "true" + **NOTE:** This step is also relevant for creating the data source of type PVC via API. + + In the Run:ai platform finish creating the data source of type PVC: + +1. Select your cluster as a scope + 1. Select the existing PVC + 1. Complete all mandatory fields + 1. Click Create + +### For a department scope: + +1. Locate the PVC in the runai namespace +1. Provide Run:ai with visibility and authorization to share the PVC to your selected scope by implementing the following label: + [run.ai/department](http://run.ai/department): "\" +1. In the Run:ai platform finish creating the data source of type PVC: + 1. Select you department as a scope (the same one as in the label) + 1. Select the existing PVC + 1. Complete all mandatory fields + 1. Click Create + +### For a project scope: + +**NOTE**: For project scope, no labels are required. + +1. In the Run:ai platform finish creating the data source of type PVC: + 1. Select your project as a scope + 1. Select the existing PVC + 1. Complete all mandatory fields + 1. Click Create + +## Creating a new PVC + +When creating a data source of type PVC using a new PVC, Run:ai creates the PVC for you in the cluster. + +1. Select your scope of choice +1. Select new PVC +1. Complete all mandatory fields +1. Click Create + +**NOTES**: + +* When creating data source of type PVC using a new PVC, the PVC is created immediately in the cluster runai namespace (even if no workload has requested to use this PVC) +* A PVC created in the cluster by selecting the option “New PVC” never appears as a PVC in the “Existing PVC“ option. + +[image1]: + +[image2]: \ No newline at end of file