From fbb4dd4ea1af7e35ce718c57e1f14fc1e1abc428 Mon Sep 17 00:00:00 2001 From: Ignas Baranauskas Date: Thu, 9 May 2024 11:14:40 +0100 Subject: [PATCH] Add new quickstart doc --- docs/Quick-Start.md | 220 ++++++++++++++++++++++++++++++++ docs/images/rhoai-dashboard.png | Bin 0 -> 21949 bytes 2 files changed, 220 insertions(+) create mode 100644 docs/Quick-Start.md create mode 100644 docs/images/rhoai-dashboard.png diff --git a/docs/Quick-Start.md b/docs/Quick-Start.md new file mode 100644 index 000000000..d3ece1244 --- /dev/null +++ b/docs/Quick-Start.md @@ -0,0 +1,220 @@ +# Quick Start Guide for Distributed Workloads with the CodeFlare Stack + + +- [Quick Start Guide for Distributed Workloads with the CodeFlare Stack](#quick-start-guide-for-distributed-workloads-with-the-codeflare-stack) + - [Prerequisites](#prerequisites) + - [Resources](#resources) + - [GPU Worker Node](#gpu-worker-node) + - [Automatic deployment for developers (optional - skip to run steps manually)](#automatic-deployment-for-developers-optional-skip-to-run-steps-manually) + - [Next Steps After Automatic Deployment](#next-steps-after-automatic-deployment) + - [Red Hat OpenShift AI](#red-hat-openshift-ai) + - [Configure Data Science Components](#configure-data-science-components) + - [Preparing Your Cluster for GPU Workloads](#preparing-your-cluster-for-gpu-workloads) + - [Installing the Operators](#installing-the-operators) + - [Configure the Node Feature Discovery Operator](#configure-the-node-feature-discovery-operator) + - [Configure the NVIDIA GPU Operator](#configure-the-nvidia-gpu-operator) + - [Configure Kueue for Task Scheduling](#configure-kueue-for-task-scheduling) + - [Launch a Jupyter Notebook Instance](#launch-a-jupyter-notebook-instance) + - [Submit your first job](#submit-your-first-job) + - [Clone the demo code](#clone-the-demo-code) + - [Run the Guided Demo Notebooks](#run-the-guided-demo-notebooks) + - [Cleaning up the AI Platform Install](#cleaning-up-the-ai-platform-install) + - [Manual Cleanup Steps](#manual-cleanup-steps) + - [Next Steps](#next-steps) + + +This quick start guide is intended to walk users through installation of the CodeFlare stack and an initial demo using the CodeFlare-SDK from within a Jupyter notebook environment. This will enable users to run and submit distributed workloads. + +The CodeFlare-SDK was built to make managing distributed compute infrastructure in the cloud easy and intuitive for Data Scientists. However, that means there +needs to be some cloud infrastructure on the backend for users to get the benefit of using the SDK. Currently, we support the CodeFlare stack. + +This stack integrates well with Red Hat OpenShift AI and [Open Data Hub](https://opendatahub.io/), and helps to bring batch workloads, jobs, and queuing to the Data Science platform. Although this document will guide you through setting up with Red Hat OpenShift AI (RHOAI), the steps are also applicable if you are using Open Data Hub (ODH). Both platforms are available in the OperatorHub, and the installation and configuration steps are quite similar. This guide will proceed with RHOAI, but feel free to apply the instructions to ODH as needed. + +## Prerequisites + +### Resources + +In addition to the resources required by default Red Hat OpenShift AI deployments, you will need the following to deploy the Distributed Workloads stack infrastructure pods: + +```text +Total: + CPU: 1600m (1.6 vCPU) + Memory: 2048Mi (2 GiB) +``` + +> [!NOTE] +> The above resources are just for the infrastructure pods. To be able to run actual +> workloads on your cluster you will need additional resources based on the size +> and type of workload. + +### GPU Worker Node + +> [!IMPORTANT] +> This step is necessary only if you require GPU capabilities for your workloads and your OpenShift cluster does not already include GPU-equipped nodes, follow these steps: + +1. **Open the OpenShift Cluster Console.** +2. Navigate to **your-cluster** -> **Machine pools**. +3. Click on **“Add machine pool”**. +4. Provide a **name** for the new machine pool. +5. In the **“Compute node instance type”** dropdown, scroll all the way down and search for the GPU instance type `g4dn.xlarge` or similar. +6. Click on **Add machine pool** to finalize the creation of your new GPU-enabled machine pool. + +After adding the machine pool, OpenShift will begin provisioning the new GPU worker +node. This process can take a few minutes. Once completed, the new node will be ready to handle GPU-accelerated workloads. + +> [!NOTE] +> The `g4dn.xlarge` instance type is used for GPU worker nodes. Ensure this instance type meets your application needs or select another as required. + +## Automatic deployment for developers (optional - skip to run steps manually) + +As a quick alternative to the following manual deployment steps an automatic _Makefile_ script can be used to deploy the CodeFlare stack. This script also deploys the prerequisite operators and the entire CodeFlare stack. + +1. Clone the Repository + +```bash +git clone https://github.com/project-codeflare/codeflare-operator.git +cd codeflare-operator +``` + +2. Run the Makefile script + +```bash +make all-in-one +``` + +> [!TIP] +> Execute `make help` to list additional available operations. + +### Next Steps After Automatic Deployment + +After the automatic deployment is complete, you can proceed directly to the section [Configure Kueue for Task Scheduling](#configure-kueue-for-task-scheduling) to finish setting up your environment. + +## Red Hat OpenShift AI + +This Quick Start guide assumes that you have administrator access to an OpenShift cluster and an existing Red Hat OpenShift AI (RHOAI) installation with version **>2.9** is present on your cluster. But the quick step to install RHOAI is as follows: + +1. Using the OpenShift web console, navigate to **Operators** -> **OperatorHub**. +2. Search for `Red Hat OpenShift AI`. +3. Install it using the `fast` channel. + +### Configure Data Science Components + +After the installation of the Red Hat OpenShift AI Operator, proceed to configure the necessary components for data science work: + +1. From the OpenShift web console, navigate to the installed RHOAI Operator. +2. Look for tab labeled DSC Initialization. +3. If it has not already been created - Locate `Create DSCInitialization` and create one. +4. Look for tab labeled Data Science Cluster. +5. Locate `Create DataScienceCluster` and create one. + +## Preparing Your Cluster for GPU Workloads + +To leverage GPU-enabled workloads on your OpenShift cluster, you need to install both the Node Feature Discovery (NFD) Operator and the NVIDIA GPU Operator. + +### Installing the Operators + +Both the NFD and the NVIDIA GPU Operators can be installed from the OperatorHub. +Detailed steps for installation and configuration are provided in the NVIDIA +documentation, which can be accessed [here](https://docs.nvidia.com/datacenter/cloud-native/gpu-operator/openshift/steps-overview.html#high-level-steps). + +1. **Open the OpenShift dashboard.** +2. Navigate to **OperatorHub**. +3. Search for and install the following operators (default settings are fine): + - **Node Feature Discovery Operator** + - **NVIDIA GPU Operator** + +### Configure the Node Feature Discovery Operator + +After installing the Node Feature Discovery Operator, you need to create a Node Feature Discovery Custom Resource (CR). You can use the default settings for this CR: + +1. Create the Node Feature Discovery CR in the dashboard. +2. Several pods will start in the `openshift-nfd` namespace (which is the default). + Wait for all these pods to become operational. Once active, your nodes will be + labeled with numerous feature flags, indicating that the operator is functioning + correctly. + +### Configure the NVIDIA GPU Operator + +After installing the NVIDIA GPU Operator, proceed with creating a GPU ClusterPolicy Custom Resource (CR): + +1. Create the GPU ClusterPolicy CR through the dashboard. +2. This action will trigger several pods to start in the NVIDIA GPU namespace. + +> [!NOTE] +> These pods may take some time to become operational as they compile the necessary drivers. + +## Configure Kueue for Task Scheduling + +Kueue is used for managing and scheduling task workflows in your cluster. To configure Kueue in your environment, follow the detailed steps provided + +1. Install Kueue resources, namely Cluster Queue, Resource Flavor, and Local Queue: + - Visit [Kueue Resources configuration](https://github.com/project-codeflare/codeflare-sdk/blob/main/docs/setup-kueue.md) + +## Launch a Jupyter Notebook Instance + +After setting up the Data Science Cluster components, you can start using the Jupyter notebooks for your data science projects. Here’s how to launch a Jupyter notebook: + +1. Access the RHOAI Dashboard: + - ![RHOAI Dashboard](./images/rhoai-dashboard.png) + - Navigate to the Red Hat OpenShift AI dashboard within your OpenShift web console. +2. Create a Data Science Project: + - Go to the Data Science Projects section from the dashboard menu. + - Click on `Create data science project` and follow the prompts to set up a new project. +3. Launch Jupyter Workbench: + - Inside your newly created project, find and click on the "Create Workbench" button. + - On the Workbench creation page, select "Standard Data Science" from the list of available notebook images. This image will include common data science libraries and tools that you might need. + - Configure any additional settings such as compute resources or environment variables as needed and `Create workbench` +4. Access Your Notebook: + - Once the workbench is ready, click on the provided link or button to open your Jupyter notebook. +## Submit your first job + +We can now go ahead and submit our first distributed model training job to our cluster. + +This can be done from any python based environment, including a script or a jupyter notebook. For this guide, we'll assume you've selected the "Jupyter Data Science" from the list of available images on your notebook spawner page. + +### Clone the demo code + +Once your notebook environment is ready, in order to test our CodeFlare stack we will want to run through some of the demo notebooks provided by the CodeFlare community. So let's start by cloning their repo into our working environment. + +```bash +git clone https://github.com/project-codeflare/codeflare-sdk +cd codeflare-sdk +``` + +For further development guidelines and instructions on setting up your development environment for codeflare-sdk, please refer to the [CodeFlare SDK README](https://github.com/project-codeflare/codeflare-sdk?tab=readme-ov-file#development). + +### Run the Guided Demo Notebooks + +Get started with the guided demo notebooks for the CodeFlare-SDK by following these steps: + +1. Access Your Jupyter Notebook Server: +2. Update Your Notebook with Access Token and Server Details: + - Retrieve your OpenShift access token by selecting your username in the console, choosing "Copy Login Command", and then "Display Token". + - Open your desired demo notebook from the `codeflare-sdk/demo-notebooks/guided-demos` directory. + - Update the notebook with your access token and server details and run the demos. + +## Cleaning up the AI Platform Install + +To completely clean up all the components after an install, follow these steps: + +```bash +make delete-all-in-one +``` +### Manual Cleanup Steps + +If you prefer to manually clean up the installation or need to manually remove individual components and operators, follow these steps: + +1. Uninstall Operators + - Open the OpenShift dashboard. + - Go to Installed Operators. + - Look for any operators you have installed, such as the NVIDIA GPU Operator, Node Feature Discovery Operator, and Red Hat OpenShift AI Operator. + - Click on the operator and then click Uninstall Operator. Follow the prompts to remove the operator and its associated resources. + +## Next Steps + +And with that you have gotten started using the CodeFlare stack alongside your Red Hat OpenShift AI Deployment to add distributed workloads and batch computing to your machine learning platform. + +You are now ready to try out the stack with your own machine learning workloads. If you'd like some more examples, you can also run through the existing demo code provided by the Codeflare-SDK community. + +- [Submit basic job](https://github.com/project-codeflare/codeflare-sdk/blob/main/demo-notebooks/guided-demos/1_cluster_job_client.ipynb) +- [Run an interactive session](https://github.com/project-codeflare/codeflare-sdk/blob/main/demo-notebooks/guided-demos/2_basic_interactive.ipynb) diff --git a/docs/images/rhoai-dashboard.png b/docs/images/rhoai-dashboard.png new file mode 100644 index 0000000000000000000000000000000000000000..c56a9553a51f4c441ec1551a9e09cbf21acd52b0 GIT binary patch literal 21949 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 Ef1zCvk^lez literal 0 HcmV?d00001