<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
  <channel>
    <title>GKE AI Labs</title>
    <link>https://gke-ai-labs.dev/</link>
    <description>Recent content on GKE AI Labs</description>
    <generator>Hugo</generator>
    <language>en-us</language>
    <atom:link href="https://gke-ai-labs.dev/index.xml" rel="self" type="application/rss+xml" />
    <item>
      <title>Deploying a containerized agent built with the Google Agent Development Kit (ADK) that uses VertexAI API</title>
      <link>https://gke-ai-labs.dev/docs/agentic/adk-vertex/</link>
      <pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate>
      <guid>https://gke-ai-labs.dev/docs/agentic/adk-vertex/</guid>
      <description>&lt;p&gt;This page was moved to &lt;a href=&#34;https://cloud.google.com/kubernetes-engine/docs/tutorials/agentic-adk-vertex&#34;&gt;https://cloud.google.com/kubernetes-engine/docs/tutorials/agentic-adk-vertex&lt;/a&gt;&lt;/p&gt;&#xA;&lt;p&gt;You will be redirected in &lt;span id=&#34;countdown&#34;&gt;5&lt;/span&gt; seconds...&lt;/p&gt;&#xA;&lt;script&gt;&#xA;    setTimeout(function() {&#xA;        window.location.href = &#34;https:\/\/cloud.google.com\/kubernetes-engine\/docs\/tutorials\/agentic-adk-vertex&#34;;&#xA;    },  &#34;5000&#34; );&#xA;&#xA;    const countdownElement = document.getElementById(&#39;countdown&#39;);&#xA;    let secondsLeft = &#34;5&#34;;&#xA;&#xA;    const interval = setInterval(function() {&#xA;        secondsLeft--;&#xA;        countdownElement.textContent = secondsLeft;&#xA;        if (secondsLeft &lt;= 0) {&#xA;            clearInterval(interval);&#xA;        }&#xA;    }, 1000);&#xA;&lt;/script&gt;</description>
    </item>
    <item>
      <title>Building Agents with Agent Development Kit (ADK) on GKE Autopilot cluster using Self-Hosted LLM</title>
      <link>https://gke-ai-labs.dev/docs/agentic/adk-llama-vllm/</link>
      <pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate>
      <guid>https://gke-ai-labs.dev/docs/agentic/adk-llama-vllm/</guid>
      <description>&lt;p&gt;This page was moved to &lt;a href=&#34;https://cloud.google.com/kubernetes-engine/docs/tutorials/agentic-adk-vllm&#34;&gt;https://cloud.google.com/kubernetes-engine/docs/tutorials/agentic-adk-vllm&lt;/a&gt;&lt;/p&gt;&#xA;&lt;p&gt;You will be redirected in &lt;span id=&#34;countdown&#34;&gt;5&lt;/span&gt; seconds...&lt;/p&gt;&#xA;&lt;script&gt;&#xA;    setTimeout(function() {&#xA;        window.location.href = &#34;https:\/\/cloud.google.com\/kubernetes-engine\/docs\/tutorials\/agentic-adk-vllm&#34;;&#xA;    },  &#34;5000&#34; );&#xA;&#xA;    const countdownElement = document.getElementById(&#39;countdown&#39;);&#xA;    let secondsLeft = &#34;5&#34;;&#xA;&#xA;    const interval = setInterval(function() {&#xA;        secondsLeft--;&#xA;        countdownElement.textContent = secondsLeft;&#xA;        if (secondsLeft &lt;= 0) {&#xA;            clearInterval(interval);&#xA;        }&#xA;    }, 1000);&#xA;&lt;/script&gt;</description>
    </item>
    <item>
      <title>GKE at 65,000 Nodes: Simulated AI Workload Benchmark</title>
      <link>https://gke-ai-labs.dev/docs/benchmarking/cpu-based-benchmark/</link>
      <pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate>
      <guid>https://gke-ai-labs.dev/docs/benchmarking/cpu-based-benchmark/</guid>
      <description>&lt;p&gt;This guide describes the benchmark of Google Kubernetes Engine (GKE) at a massive scale (65,000 nodes) with simulated AI workloads, using Terraform for infrastructure automation and ClusterLoader2 for performance testing.&lt;/p&gt;&#xA;&lt;p&gt;The findings from this benchmark were published on the &lt;a href=&#34;https://cloud.google.com/blog/products/containers-kubernetes/benchmarking-a-65000-node-gke-cluster-with-ai-workloads&#34;&gt;Google Cloud Blog&lt;/a&gt;.&lt;/p&gt;&#xA;&lt;h2 id=&#34;introduction&#34;&gt;Introduction&lt;a class=&#34;td-heading-self-link&#34;&#xA;  onclick=&#34;copyHeadingLink(this, &#39;introduction&#39;); event.preventDefault();&#34;&#xA;  onmousedown=&#34;this.classList.add(&#39;active-link&#39;);&#34;&#xA;  onmouseup=&#34;this.classList.remove(&#39;active-link&#39;);&#34;&#xA;  onmouseleave=&#34;this.classList.remove(&#39;active-link&#39;);&#34;&#xA;  href=&#34;#introduction&#34; aria-label=&#34;Heading self-link&#34;&#xA;  title=&#34;Copy link to this section: Introduction&#34;&gt;&lt;i class=&#34;fa-solid fa-link&#34;&gt;&lt;/i&gt;&lt;/a&gt;&#xA;&lt;style&gt;&#xA;  .td-heading-self-link {&#xA;    transition: background 0.2s;&#xA;    border-radius: 4px;&#xA;    padding: 2px;&#xA;  }&#xA;  .td-heading-self-link.active-link {&#xA;    background: #e0e7ef;&#xA;    transition: background 0.2s;&#xA;  }&#xA;&lt;/style&gt;&#xA;&lt;script&gt;&#xA;  function copyHeadingLink(anchor, anchorId) {&#xA;    navigator.clipboard.writeText(location.origin + location.pathname + &#39;#&#39; + anchorId);&#xA;    let popup = document.getElementById(&#39;global-copy-popup&#39;);&#xA;    if (!popup) {&#xA;      &#xA;      popup = document.createElement(&#39;span&#39;);&#xA;      popup.id = &#39;global-copy-popup&#39;;&#xA;      popup.className = &#39;copy-popup&#39;;&#xA;      popup.textContent = &#39;Copied to clipboard&#39;;&#xA;      popup.setAttribute(&#39;style&#39;, &#39;position:fixed; bottom:24px; left:24px; background:#222; color:#fff; padding:8px 18px; border-radius:6px; font-size:0.8em; white-space:nowrap; z-index:9999; box-shadow:0 2px 8px rgba(0,0,0,0.15); transform:translateY(100px); opacity:0; transition:transform 0.3s cubic-bezier(.4,0,.2,1), opacity 0.3s cubic-bezier(.4,0,.2,1);&#39;);&#xA;      document.body.appendChild(popup);&#xA;    }&#xA;    popup.style.display = &#39;block&#39;;&#xA;    &#xA;    void popup.offsetWidth;&#xA;    popup.style.transform = &#39;translateY(0)&#39;;&#xA;    popup.style.opacity = &#39;1&#39;;&#xA;    clearTimeout(window.__copyPopupTimeout);&#xA;    window.__copyPopupTimeout = setTimeout(() =&gt; {&#xA;      popup.style.transform = &#39;translateY(100px)&#39;;&#xA;      popup.style.opacity = &#39;0&#39;;&#xA;      setTimeout(() =&gt; { popup.style.display = &#39;none&#39;; }, 300);&#xA;    }, 1200);&#xA;  }&#xA;&lt;/script&gt;&lt;/h2&gt;&#xA;&lt;p&gt;This benchmark simulates mixed AI workloads, specifically AI training and AI inference, on a 65,000-node GKE cluster. It focuses on evaluating the performance and scalability of the Kubernetes control plane under demanding conditions, characterized by a high number of nodes and dynamic workload changes.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Building Agents with Agent Development Kit (ADK) on GKE using Ray Serve for Self-Hosted LLMs</title>
      <link>https://gke-ai-labs.dev/docs/agentic/ray-serve/</link>
      <pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate>
      <guid>https://gke-ai-labs.dev/docs/agentic/ray-serve/</guid>
      <description>&lt;p&gt;This tutorial demonstrates how to deploy the Llama-3.1-8B-Instruct model on Google Kubernetes Engine (GKE) using Ray Serve and vLLM for efficient inference. Additionally, it shows how to integrate an ADK agent to interact with the model, supporting both basic chat completions and tool usage. The setup leverages a GKE Standard cluster with GPU-enabled nodes to handle the computational requirements.&lt;/p&gt;&#xA;&lt;p&gt;By the end of this tutorial, you will:&lt;/p&gt;&#xA;&lt;ol&gt;&#xA;&lt;li&gt;Set up a GKE Autopilot cluster with a GPU node pool.&lt;/li&gt;&#xA;&lt;li&gt;Deploy the Llama-3.1-8B-Instruct model using Ray Serve and vLLM.&lt;/li&gt;&#xA;&lt;li&gt;Deploy an ADK agent that communicates with the Ray Serve endpoint.&lt;/li&gt;&#xA;&lt;li&gt;Test the setup with basic chat completion and tool usage scenarios.&lt;/li&gt;&#xA;&lt;li&gt;Monitor and debug the deployment using Ray Dashboard and Kubernetes logs.&lt;/li&gt;&#xA;&lt;/ol&gt;&#xA;&lt;h2 id=&#34;prerequisites&#34;&gt;Prerequisites&lt;a class=&#34;td-heading-self-link&#34;&#xA;  onclick=&#34;copyHeadingLink(this, &#39;prerequisites&#39;); event.preventDefault();&#34;&#xA;  onmousedown=&#34;this.classList.add(&#39;active-link&#39;);&#34;&#xA;  onmouseup=&#34;this.classList.remove(&#39;active-link&#39;);&#34;&#xA;  onmouseleave=&#34;this.classList.remove(&#39;active-link&#39;);&#34;&#xA;  href=&#34;#prerequisites&#34; aria-label=&#34;Heading self-link&#34;&#xA;  title=&#34;Copy link to this section: Prerequisites&#34;&gt;&lt;i class=&#34;fa-solid fa-link&#34;&gt;&lt;/i&gt;&lt;/a&gt;&#xA;&lt;style&gt;&#xA;  .td-heading-self-link {&#xA;    transition: background 0.2s;&#xA;    border-radius: 4px;&#xA;    padding: 2px;&#xA;  }&#xA;  .td-heading-self-link.active-link {&#xA;    background: #e0e7ef;&#xA;    transition: background 0.2s;&#xA;  }&#xA;&lt;/style&gt;&#xA;&lt;script&gt;&#xA;  function copyHeadingLink(anchor, anchorId) {&#xA;    navigator.clipboard.writeText(location.origin + location.pathname + &#39;#&#39; + anchorId);&#xA;    let popup = document.getElementById(&#39;global-copy-popup&#39;);&#xA;    if (!popup) {&#xA;      &#xA;      popup = document.createElement(&#39;span&#39;);&#xA;      popup.id = &#39;global-copy-popup&#39;;&#xA;      popup.className = &#39;copy-popup&#39;;&#xA;      popup.textContent = &#39;Copied to clipboard&#39;;&#xA;      popup.setAttribute(&#39;style&#39;, &#39;position:fixed; bottom:24px; left:24px; background:#222; color:#fff; padding:8px 18px; border-radius:6px; font-size:0.8em; white-space:nowrap; z-index:9999; box-shadow:0 2px 8px rgba(0,0,0,0.15); transform:translateY(100px); opacity:0; transition:transform 0.3s cubic-bezier(.4,0,.2,1), opacity 0.3s cubic-bezier(.4,0,.2,1);&#39;);&#xA;      document.body.appendChild(popup);&#xA;    }&#xA;    popup.style.display = &#39;block&#39;;&#xA;    &#xA;    void popup.offsetWidth;&#xA;    popup.style.transform = &#39;translateY(0)&#39;;&#xA;    popup.style.opacity = &#39;1&#39;;&#xA;    clearTimeout(window.__copyPopupTimeout);&#xA;    window.__copyPopupTimeout = setTimeout(() =&gt; {&#xA;      popup.style.transform = &#39;translateY(100px)&#39;;&#xA;      popup.style.opacity = &#39;0&#39;;&#xA;      setTimeout(() =&gt; { popup.style.display = &#39;none&#39;; }, 300);&#xA;    }, 1200);&#xA;  }&#xA;&lt;/script&gt;&lt;/h2&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;A terminal with &lt;code&gt;kubectl&lt;/code&gt;, &lt;code&gt;helm&lt;/code&gt; and &lt;code&gt;gcloud&lt;/code&gt; and &lt;code&gt;terraform 1.12.1&lt;/code&gt; installed.&lt;/li&gt;&#xA;&lt;li&gt;A &lt;a href=&#34;https://huggingface.co/&#34;&gt;Hugging Face&lt;/a&gt; account with a token that has &lt;code&gt;Read&lt;/code&gt; permission to access the Llama-3.1-8B-Instruct model.&lt;/li&gt;&#xA;&lt;li&gt;Sufficient GPU quota in your Google Cloud project. You need at least 2 NVIDIA L4 GPUs in the region (us-central1) to deploy the tutorial&amp;rsquo;s setup without quota-related errors. See &lt;a href=&#34;https://cloud.google.com/kubernetes-engine/docs/concepts/gpus#gpu_quota&#34;&gt;About GPUs&lt;/a&gt; and &lt;a href=&#34;https://cloud.google.com/compute/resource-usage#gpu_quota&#34;&gt;Allocation quotas&lt;/a&gt;.&lt;/li&gt;&#xA;&lt;li&gt;Access to the code repository: &lt;a href=&#34;https://github.com/ai-on-gke/tutorials-and-examples&#34;&gt;https://github.com/ai-on-gke/tutorials-and-examples&lt;/a&gt;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h3 id=&#34;filesystem-structure&#34;&gt;Filesystem structure&lt;a class=&#34;td-heading-self-link&#34;&#xA;  onclick=&#34;copyHeadingLink(this, &#39;filesystem-structure&#39;); event.preventDefault();&#34;&#xA;  onmousedown=&#34;this.classList.add(&#39;active-link&#39;);&#34;&#xA;  onmouseup=&#34;this.classList.remove(&#39;active-link&#39;);&#34;&#xA;  onmouseleave=&#34;this.classList.remove(&#39;active-link&#39;);&#34;&#xA;  href=&#34;#filesystem-structure&#34; aria-label=&#34;Heading self-link&#34;&#xA;  title=&#34;Copy link to this section: Filesystem structure&#34;&gt;&lt;i class=&#34;fa-solid fa-link&#34;&gt;&lt;/i&gt;&lt;/a&gt;&#xA;&lt;style&gt;&#xA;  .td-heading-self-link {&#xA;    transition: background 0.2s;&#xA;    border-radius: 4px;&#xA;    padding: 2px;&#xA;  }&#xA;  .td-heading-self-link.active-link {&#xA;    background: #e0e7ef;&#xA;    transition: background 0.2s;&#xA;  }&#xA;&lt;/style&gt;&#xA;&lt;script&gt;&#xA;  function copyHeadingLink(anchor, anchorId) {&#xA;    navigator.clipboard.writeText(location.origin + location.pathname + &#39;#&#39; + anchorId);&#xA;    let popup = document.getElementById(&#39;global-copy-popup&#39;);&#xA;    if (!popup) {&#xA;      &#xA;      popup = document.createElement(&#39;span&#39;);&#xA;      popup.id = &#39;global-copy-popup&#39;;&#xA;      popup.className = &#39;copy-popup&#39;;&#xA;      popup.textContent = &#39;Copied to clipboard&#39;;&#xA;      popup.setAttribute(&#39;style&#39;, &#39;position:fixed; bottom:24px; left:24px; background:#222; color:#fff; padding:8px 18px; border-radius:6px; font-size:0.8em; white-space:nowrap; z-index:9999; box-shadow:0 2px 8px rgba(0,0,0,0.15); transform:translateY(100px); opacity:0; transition:transform 0.3s cubic-bezier(.4,0,.2,1), opacity 0.3s cubic-bezier(.4,0,.2,1);&#39;);&#xA;      document.body.appendChild(popup);&#xA;    }&#xA;    popup.style.display = &#39;block&#39;;&#xA;    &#xA;    void popup.offsetWidth;&#xA;    popup.style.transform = &#39;translateY(0)&#39;;&#xA;    popup.style.opacity = &#39;1&#39;;&#xA;    clearTimeout(window.__copyPopupTimeout);&#xA;    window.__copyPopupTimeout = setTimeout(() =&gt; {&#xA;      popup.style.transform = &#39;translateY(100px)&#39;;&#xA;      popup.style.opacity = &#39;0&#39;;&#xA;      setTimeout(() =&gt; { popup.style.display = &#39;none&#39;; }, 300);&#xA;    }, 1200);&#xA;  }&#xA;&lt;/script&gt;&lt;/h3&gt;&#xA;&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;ray-serve/&#xA;├── adk_agent/                 # ADK agent deployment and cloudbuild configuration&#xA;| ├── example_agent/           # Agent code&#xA;|   ├── _init_.py&#xA;|   ├── agent-deployment.yaml&#xA;|   ├── agent.py&#xA;| ├── cloudbuild.yml&#xA;| ├── Dockerfile&#xA;| ├── main.py&#xA;| ├── requirements.txt&#xA;| ├── ray-serve-vllm/           # Ray image cloudbuild and service manifest&#xA;|   ├── cloudbuild.yml&#xA;|   ├── Dockerfile&#xA;|   ├── ray-service.yaml&#xA;|   ├── requirements.txt&#xA;|   ├── serve-chat-completion.py&#xA;| ├── terarform/&#xA;|   ├── artifact_registry.tf&#xA;|   ├── default_env.tfvars&#xA;|   ├── main.tf&#xA;|   ├── network.tf&#xA;|   ├── outputs.tf&#xA;|   ├── providers.tf&#xA;|   ├── variables.tf&#xA;|   └── workdload_identity.tf&#xA;&lt;/code&gt;&lt;/pre&gt;&lt;h2 id=&#34;step-1-set-up-the-infrastructure-with-terraform&#34;&gt;Step 1: Set Up the Infrastructure with Terraform&lt;a class=&#34;td-heading-self-link&#34;&#xA;  onclick=&#34;copyHeadingLink(this, &#39;step-1-set-up-the-infrastructure-with-terraform&#39;); event.preventDefault();&#34;&#xA;  onmousedown=&#34;this.classList.add(&#39;active-link&#39;);&#34;&#xA;  onmouseup=&#34;this.classList.remove(&#39;active-link&#39;);&#34;&#xA;  onmouseleave=&#34;this.classList.remove(&#39;active-link&#39;);&#34;&#xA;  href=&#34;#step-1-set-up-the-infrastructure-with-terraform&#34; aria-label=&#34;Heading self-link&#34;&#xA;  title=&#34;Copy link to this section: Step 1: Set Up the Infrastructure with Terraform&#34;&gt;&lt;i class=&#34;fa-solid fa-link&#34;&gt;&lt;/i&gt;&lt;/a&gt;&#xA;&lt;style&gt;&#xA;  .td-heading-self-link {&#xA;    transition: background 0.2s;&#xA;    border-radius: 4px;&#xA;    padding: 2px;&#xA;  }&#xA;  .td-heading-self-link.active-link {&#xA;    background: #e0e7ef;&#xA;    transition: background 0.2s;&#xA;  }&#xA;&lt;/style&gt;&#xA;&lt;script&gt;&#xA;  function copyHeadingLink(anchor, anchorId) {&#xA;    navigator.clipboard.writeText(location.origin + location.pathname + &#39;#&#39; + anchorId);&#xA;    let popup = document.getElementById(&#39;global-copy-popup&#39;);&#xA;    if (!popup) {&#xA;      &#xA;      popup = document.createElement(&#39;span&#39;);&#xA;      popup.id = &#39;global-copy-popup&#39;;&#xA;      popup.className = &#39;copy-popup&#39;;&#xA;      popup.textContent = &#39;Copied to clipboard&#39;;&#xA;      popup.setAttribute(&#39;style&#39;, &#39;position:fixed; bottom:24px; left:24px; background:#222; color:#fff; padding:8px 18px; border-radius:6px; font-size:0.8em; white-space:nowrap; z-index:9999; box-shadow:0 2px 8px rgba(0,0,0,0.15); transform:translateY(100px); opacity:0; transition:transform 0.3s cubic-bezier(.4,0,.2,1), opacity 0.3s cubic-bezier(.4,0,.2,1);&#39;);&#xA;      document.body.appendChild(popup);&#xA;    }&#xA;    popup.style.display = &#39;block&#39;;&#xA;    &#xA;    void popup.offsetWidth;&#xA;    popup.style.transform = &#39;translateY(0)&#39;;&#xA;    popup.style.opacity = &#39;1&#39;;&#xA;    clearTimeout(window.__copyPopupTimeout);&#xA;    window.__copyPopupTimeout = setTimeout(() =&gt; {&#xA;      popup.style.transform = &#39;translateY(100px)&#39;;&#xA;      popup.style.opacity = &#39;0&#39;;&#xA;      setTimeout(() =&gt; { popup.style.display = &#39;none&#39;; }, 300);&#xA;    }, 1200);&#xA;  }&#xA;&lt;/script&gt;&lt;/h2&gt;&#xA;&lt;p&gt;Start by setting up the GKE cluster, service account, IAM roles, and Artifact Registry using Terraform.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Building a Movie Recommendation RAG with Agentic LlamaIndex on GKE</title>
      <link>https://gke-ai-labs.dev/docs/agentic/agentic-llamaindex/</link>
      <pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate>
      <guid>https://gke-ai-labs.dev/docs/agentic/agentic-llamaindex/</guid>
      <description>&lt;p&gt;&lt;a href=&#34;https://docs.llamaindex.ai/en/stable/&#34;&gt;LlamaIndex&lt;/a&gt; bridges the gap between LLMs and domain-specific datasets, enabling efficient indexing and querying of unstructured data for intelligent, data-driven responses. When deployed on a &lt;a href=&#34;https://cloud.google.com/kubernetes-engine/docs/concepts/kubernetes-engine-overview&#34;&gt;GKE&lt;/a&gt; cluster, it ensures scalability and security by leveraging containerized workloads, GPU-based nodes, and seamless cloud-native integrations, making it ideal for ML-powered applications like RAG systems.&lt;/p&gt;&#xA;&lt;h1 id=&#34;overview&#34;&gt;Overview&lt;a class=&#34;td-heading-self-link&#34;&#xA;  onclick=&#34;copyHeadingLink(this, &#39;overview&#39;); event.preventDefault();&#34;&#xA;  onmousedown=&#34;this.classList.add(&#39;active-link&#39;);&#34;&#xA;  onmouseup=&#34;this.classList.remove(&#39;active-link&#39;);&#34;&#xA;  onmouseleave=&#34;this.classList.remove(&#39;active-link&#39;);&#34;&#xA;  href=&#34;#overview&#34; aria-label=&#34;Heading self-link&#34;&#xA;  title=&#34;Copy link to this section: Overview&#34;&gt;&lt;i class=&#34;fa-solid fa-link&#34;&gt;&lt;/i&gt;&lt;/a&gt;&#xA;&lt;style&gt;&#xA;  .td-heading-self-link {&#xA;    transition: background 0.2s;&#xA;    border-radius: 4px;&#xA;    padding: 2px;&#xA;  }&#xA;  .td-heading-self-link.active-link {&#xA;    background: #e0e7ef;&#xA;    transition: background 0.2s;&#xA;  }&#xA;&lt;/style&gt;&#xA;&lt;script&gt;&#xA;  function copyHeadingLink(anchor, anchorId) {&#xA;    navigator.clipboard.writeText(location.origin + location.pathname + &#39;#&#39; + anchorId);&#xA;    let popup = document.getElementById(&#39;global-copy-popup&#39;);&#xA;    if (!popup) {&#xA;      &#xA;      popup = document.createElement(&#39;span&#39;);&#xA;      popup.id = &#39;global-copy-popup&#39;;&#xA;      popup.className = &#39;copy-popup&#39;;&#xA;      popup.textContent = &#39;Copied to clipboard&#39;;&#xA;      popup.setAttribute(&#39;style&#39;, &#39;position:fixed; bottom:24px; left:24px; background:#222; color:#fff; padding:8px 18px; border-radius:6px; font-size:0.8em; white-space:nowrap; z-index:9999; box-shadow:0 2px 8px rgba(0,0,0,0.15); transform:translateY(100px); opacity:0; transition:transform 0.3s cubic-bezier(.4,0,.2,1), opacity 0.3s cubic-bezier(.4,0,.2,1);&#39;);&#xA;      document.body.appendChild(popup);&#xA;    }&#xA;    popup.style.display = &#39;block&#39;;&#xA;    &#xA;    void popup.offsetWidth;&#xA;    popup.style.transform = &#39;translateY(0)&#39;;&#xA;    popup.style.opacity = &#39;1&#39;;&#xA;    clearTimeout(window.__copyPopupTimeout);&#xA;    window.__copyPopupTimeout = setTimeout(() =&gt; {&#xA;      popup.style.transform = &#39;translateY(100px)&#39;;&#xA;      popup.style.opacity = &#39;0&#39;;&#xA;      setTimeout(() =&gt; { popup.style.display = &#39;none&#39;; }, 300);&#xA;    }, 1200);&#xA;  }&#xA;&lt;/script&gt;&lt;/h1&gt;&#xA;&lt;p&gt;This tutorial will guide you through creating a Intelligent Agent &amp;amp; robust Retrieval-Augmented Generation (RAG) system using LlamaIndex and deploying it on Google Kubernetes Engine (GKE). The system indexes a dataset of 1000 top-rated movies and uses an LLM to generate recommendations based on user queries (e.g., &amp;ldquo;best drama movies&amp;rdquo; or &amp;ldquo;movies like Inception&amp;rdquo;).&lt;/p&gt;</description>
    </item>
    <item>
      <title>Creating Inference Checkpoints</title>
      <link>https://gke-ai-labs.dev/docs/tutorials/inference-servers/checkpoints/</link>
      <pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate>
      <guid>https://gke-ai-labs.dev/docs/tutorials/inference-servers/checkpoints/</guid>
      <description>&lt;h2 id=&#34;overview&#34;&gt;Overview&lt;a class=&#34;td-heading-self-link&#34;&#xA;  onclick=&#34;copyHeadingLink(this, &#39;overview&#39;); event.preventDefault();&#34;&#xA;  onmousedown=&#34;this.classList.add(&#39;active-link&#39;);&#34;&#xA;  onmouseup=&#34;this.classList.remove(&#39;active-link&#39;);&#34;&#xA;  onmouseleave=&#34;this.classList.remove(&#39;active-link&#39;);&#34;&#xA;  href=&#34;#overview&#34; aria-label=&#34;Heading self-link&#34;&#xA;  title=&#34;Copy link to this section: Overview&#34;&gt;&lt;i class=&#34;fa-solid fa-link&#34;&gt;&lt;/i&gt;&lt;/a&gt;&#xA;&lt;style&gt;&#xA;  .td-heading-self-link {&#xA;    transition: background 0.2s;&#xA;    border-radius: 4px;&#xA;    padding: 2px;&#xA;  }&#xA;  .td-heading-self-link.active-link {&#xA;    background: #e0e7ef;&#xA;    transition: background 0.2s;&#xA;  }&#xA;&lt;/style&gt;&#xA;&lt;script&gt;&#xA;  function copyHeadingLink(anchor, anchorId) {&#xA;    navigator.clipboard.writeText(location.origin + location.pathname + &#39;#&#39; + anchorId);&#xA;    let popup = document.getElementById(&#39;global-copy-popup&#39;);&#xA;    if (!popup) {&#xA;      &#xA;      popup = document.createElement(&#39;span&#39;);&#xA;      popup.id = &#39;global-copy-popup&#39;;&#xA;      popup.className = &#39;copy-popup&#39;;&#xA;      popup.textContent = &#39;Copied to clipboard&#39;;&#xA;      popup.setAttribute(&#39;style&#39;, &#39;position:fixed; bottom:24px; left:24px; background:#222; color:#fff; padding:8px 18px; border-radius:6px; font-size:0.8em; white-space:nowrap; z-index:9999; box-shadow:0 2px 8px rgba(0,0,0,0.15); transform:translateY(100px); opacity:0; transition:transform 0.3s cubic-bezier(.4,0,.2,1), opacity 0.3s cubic-bezier(.4,0,.2,1);&#39;);&#xA;      document.body.appendChild(popup);&#xA;    }&#xA;    popup.style.display = &#39;block&#39;;&#xA;    &#xA;    void popup.offsetWidth;&#xA;    popup.style.transform = &#39;translateY(0)&#39;;&#xA;    popup.style.opacity = &#39;1&#39;;&#xA;    clearTimeout(window.__copyPopupTimeout);&#xA;    window.__copyPopupTimeout = setTimeout(() =&gt; {&#xA;      popup.style.transform = &#39;translateY(100px)&#39;;&#xA;      popup.style.opacity = &#39;0&#39;;&#xA;      setTimeout(() =&gt; { popup.style.display = &#39;none&#39;; }, 300);&#xA;    }, 1200);&#xA;  }&#xA;&lt;/script&gt;&lt;/h2&gt;&#xA;&lt;p&gt;This document outlines the process for converting inference checkpoints for use with various model servers, such as Jetstream with MaxText or Pytorch/XLA backends. The core of this process utilizes the &lt;code&gt;checkpoint_entrypoint.sh&lt;/code&gt; script, packaged within a Docker container, to handle the specific conversion steps required by different server configurations. The goal is to prepare your trained model checkpoints for efficient deployment and inference serving.&lt;/p&gt;</description>
    </item>
    <item>
      <title>GKE cross region capacity chasing with SkyPilot</title>
      <link>https://gke-ai-labs.dev/docs/tutorials/workflow-orchestration/skypilot/cross-region-capacity-chasing/</link>
      <pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate>
      <guid>https://gke-ai-labs.dev/docs/tutorials/workflow-orchestration/skypilot/cross-region-capacity-chasing/</guid>
      <description>&lt;p&gt;Due to the limited availability of accelerator resources, customers face significant challenges in securing sufficient capacity to run their AI/ML workloads. They often require:&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;Preferences for VM families and accelerators, with the ability to automatically fail over to alternative configurations if their preferred resources are unavailable.&lt;/li&gt;&#xA;&lt;li&gt;Automatic capacity acquisition across regions to address scenarios where a specific region lacks sufficient resources.&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;In this tutorial, we will demonstrate how to leverage the open-source software &lt;a href=&#34;https://skypilot.readthedocs.io/en/latest/docs/index.html&#34;&gt;SkyPilot&lt;/a&gt; to help GKE customers efficiently obtain accelerators across regions, ensuring workload continuity and optimized resource utilization.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Deploying MCP Servers on GKE: Building AI Agents with ADK and Ray-Served Models</title>
      <link>https://gke-ai-labs.dev/docs/agentic/ray-mcp/</link>
      <pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate>
      <guid>https://gke-ai-labs.dev/docs/agentic/ray-mcp/</guid>
      <description>&lt;h2 id=&#34;introduction&#34;&gt;Introduction&lt;a class=&#34;td-heading-self-link&#34;&#xA;  onclick=&#34;copyHeadingLink(this, &#39;introduction&#39;); event.preventDefault();&#34;&#xA;  onmousedown=&#34;this.classList.add(&#39;active-link&#39;);&#34;&#xA;  onmouseup=&#34;this.classList.remove(&#39;active-link&#39;);&#34;&#xA;  onmouseleave=&#34;this.classList.remove(&#39;active-link&#39;);&#34;&#xA;  href=&#34;#introduction&#34; aria-label=&#34;Heading self-link&#34;&#xA;  title=&#34;Copy link to this section: Introduction&#34;&gt;&lt;i class=&#34;fa-solid fa-link&#34;&gt;&lt;/i&gt;&lt;/a&gt;&#xA;&lt;style&gt;&#xA;  .td-heading-self-link {&#xA;    transition: background 0.2s;&#xA;    border-radius: 4px;&#xA;    padding: 2px;&#xA;  }&#xA;  .td-heading-self-link.active-link {&#xA;    background: #e0e7ef;&#xA;    transition: background 0.2s;&#xA;  }&#xA;&lt;/style&gt;&#xA;&lt;script&gt;&#xA;  function copyHeadingLink(anchor, anchorId) {&#xA;    navigator.clipboard.writeText(location.origin + location.pathname + &#39;#&#39; + anchorId);&#xA;    let popup = document.getElementById(&#39;global-copy-popup&#39;);&#xA;    if (!popup) {&#xA;      &#xA;      popup = document.createElement(&#39;span&#39;);&#xA;      popup.id = &#39;global-copy-popup&#39;;&#xA;      popup.className = &#39;copy-popup&#39;;&#xA;      popup.textContent = &#39;Copied to clipboard&#39;;&#xA;      popup.setAttribute(&#39;style&#39;, &#39;position:fixed; bottom:24px; left:24px; background:#222; color:#fff; padding:8px 18px; border-radius:6px; font-size:0.8em; white-space:nowrap; z-index:9999; box-shadow:0 2px 8px rgba(0,0,0,0.15); transform:translateY(100px); opacity:0; transition:transform 0.3s cubic-bezier(.4,0,.2,1), opacity 0.3s cubic-bezier(.4,0,.2,1);&#39;);&#xA;      document.body.appendChild(popup);&#xA;    }&#xA;    popup.style.display = &#39;block&#39;;&#xA;    &#xA;    void popup.offsetWidth;&#xA;    popup.style.transform = &#39;translateY(0)&#39;;&#xA;    popup.style.opacity = &#39;1&#39;;&#xA;    clearTimeout(window.__copyPopupTimeout);&#xA;    window.__copyPopupTimeout = setTimeout(() =&gt; {&#xA;      popup.style.transform = &#39;translateY(100px)&#39;;&#xA;      popup.style.opacity = &#39;0&#39;;&#xA;      setTimeout(() =&gt; { popup.style.display = &#39;none&#39;; }, 300);&#xA;    }, 1200);&#xA;  }&#xA;&lt;/script&gt;&lt;/h2&gt;&#xA;&lt;p&gt;This guide shows how to host a &lt;a href=&#34;https://modelcontextprotocol.io/introduction&#34;&gt;Model Context Protocol (MCP)&lt;/a&gt; server with Server Sent Events (SSE) transport on Google Kubernetes Engine (GKE). MCP is an open protocol that standardizes how AI agents interact with their environment and external data sources. MCP clients can communicate with the MCP servers using two distinct transport mechanisms:&lt;/p&gt;</description>
    </item>
    <item>
      <title>DWS</title>
      <link>https://gke-ai-labs.dev/docs/tutorials/workflow-orchestration/dws/</link>
      <pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate>
      <guid>https://gke-ai-labs.dev/docs/tutorials/workflow-orchestration/dws/</guid>
      <description>&lt;p&gt;The repository contains examples on how to use DWS in GKE. More information about DWS is&#xA;available &lt;a href=&#34;https://cloud.google.com/kubernetes-engine/docs/how-to/provisioningrequest&#34;&gt;here&lt;/a&gt;.&lt;/p&gt;&#xA;&lt;h1 id=&#34;setup-and-usage&#34;&gt;Setup and Usage&lt;a class=&#34;td-heading-self-link&#34;&#xA;  onclick=&#34;copyHeadingLink(this, &#39;setup-and-usage&#39;); event.preventDefault();&#34;&#xA;  onmousedown=&#34;this.classList.add(&#39;active-link&#39;);&#34;&#xA;  onmouseup=&#34;this.classList.remove(&#39;active-link&#39;);&#34;&#xA;  onmouseleave=&#34;this.classList.remove(&#39;active-link&#39;);&#34;&#xA;  href=&#34;#setup-and-usage&#34; aria-label=&#34;Heading self-link&#34;&#xA;  title=&#34;Copy link to this section: Setup and Usage&#34;&gt;&lt;i class=&#34;fa-solid fa-link&#34;&gt;&lt;/i&gt;&lt;/a&gt;&#xA;&lt;style&gt;&#xA;  .td-heading-self-link {&#xA;    transition: background 0.2s;&#xA;    border-radius: 4px;&#xA;    padding: 2px;&#xA;  }&#xA;  .td-heading-self-link.active-link {&#xA;    background: #e0e7ef;&#xA;    transition: background 0.2s;&#xA;  }&#xA;&lt;/style&gt;&#xA;&lt;script&gt;&#xA;  function copyHeadingLink(anchor, anchorId) {&#xA;    navigator.clipboard.writeText(location.origin + location.pathname + &#39;#&#39; + anchorId);&#xA;    let popup = document.getElementById(&#39;global-copy-popup&#39;);&#xA;    if (!popup) {&#xA;      &#xA;      popup = document.createElement(&#39;span&#39;);&#xA;      popup.id = &#39;global-copy-popup&#39;;&#xA;      popup.className = &#39;copy-popup&#39;;&#xA;      popup.textContent = &#39;Copied to clipboard&#39;;&#xA;      popup.setAttribute(&#39;style&#39;, &#39;position:fixed; bottom:24px; left:24px; background:#222; color:#fff; padding:8px 18px; border-radius:6px; font-size:0.8em; white-space:nowrap; z-index:9999; box-shadow:0 2px 8px rgba(0,0,0,0.15); transform:translateY(100px); opacity:0; transition:transform 0.3s cubic-bezier(.4,0,.2,1), opacity 0.3s cubic-bezier(.4,0,.2,1);&#39;);&#xA;      document.body.appendChild(popup);&#xA;    }&#xA;    popup.style.display = &#39;block&#39;;&#xA;    &#xA;    void popup.offsetWidth;&#xA;    popup.style.transform = &#39;translateY(0)&#39;;&#xA;    popup.style.opacity = &#39;1&#39;;&#xA;    clearTimeout(window.__copyPopupTimeout);&#xA;    window.__copyPopupTimeout = setTimeout(() =&gt; {&#xA;      popup.style.transform = &#39;translateY(100px)&#39;;&#xA;      popup.style.opacity = &#39;0&#39;;&#xA;      setTimeout(() =&gt; { popup.style.display = &#39;none&#39;; }, 300);&#xA;    }, 1200);&#xA;  }&#xA;&lt;/script&gt;&lt;/h1&gt;&#xA;&lt;h2 id=&#34;prerequisites&#34;&gt;Prerequisites&lt;a class=&#34;td-heading-self-link&#34;&#xA;  onclick=&#34;copyHeadingLink(this, &#39;prerequisites&#39;); event.preventDefault();&#34;&#xA;  onmousedown=&#34;this.classList.add(&#39;active-link&#39;);&#34;&#xA;  onmouseup=&#34;this.classList.remove(&#39;active-link&#39;);&#34;&#xA;  onmouseleave=&#34;this.classList.remove(&#39;active-link&#39;);&#34;&#xA;  href=&#34;#prerequisites&#34; aria-label=&#34;Heading self-link&#34;&#xA;  title=&#34;Copy link to this section: Prerequisites&#34;&gt;&lt;i class=&#34;fa-solid fa-link&#34;&gt;&lt;/i&gt;&lt;/a&gt;&#xA;&lt;style&gt;&#xA;  .td-heading-self-link {&#xA;    transition: background 0.2s;&#xA;    border-radius: 4px;&#xA;    padding: 2px;&#xA;  }&#xA;  .td-heading-self-link.active-link {&#xA;    background: #e0e7ef;&#xA;    transition: background 0.2s;&#xA;  }&#xA;&lt;/style&gt;&#xA;&lt;script&gt;&#xA;  function copyHeadingLink(anchor, anchorId) {&#xA;    navigator.clipboard.writeText(location.origin + location.pathname + &#39;#&#39; + anchorId);&#xA;    let popup = document.getElementById(&#39;global-copy-popup&#39;);&#xA;    if (!popup) {&#xA;      &#xA;      popup = document.createElement(&#39;span&#39;);&#xA;      popup.id = &#39;global-copy-popup&#39;;&#xA;      popup.className = &#39;copy-popup&#39;;&#xA;      popup.textContent = &#39;Copied to clipboard&#39;;&#xA;      popup.setAttribute(&#39;style&#39;, &#39;position:fixed; bottom:24px; left:24px; background:#222; color:#fff; padding:8px 18px; border-radius:6px; font-size:0.8em; white-space:nowrap; z-index:9999; box-shadow:0 2px 8px rgba(0,0,0,0.15); transform:translateY(100px); opacity:0; transition:transform 0.3s cubic-bezier(.4,0,.2,1), opacity 0.3s cubic-bezier(.4,0,.2,1);&#39;);&#xA;      document.body.appendChild(popup);&#xA;    }&#xA;    popup.style.display = &#39;block&#39;;&#xA;    &#xA;    void popup.offsetWidth;&#xA;    popup.style.transform = &#39;translateY(0)&#39;;&#xA;    popup.style.opacity = &#39;1&#39;;&#xA;    clearTimeout(window.__copyPopupTimeout);&#xA;    window.__copyPopupTimeout = setTimeout(() =&gt; {&#xA;      popup.style.transform = &#39;translateY(100px)&#39;;&#xA;      popup.style.opacity = &#39;0&#39;;&#xA;      setTimeout(() =&gt; { popup.style.display = &#39;none&#39;; }, 300);&#xA;    }, 1200);&#xA;  }&#xA;&lt;/script&gt;&lt;/h2&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://cloud.google.com/&#34;&gt;Google Cloud&lt;/a&gt; account set up.&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://pypi.org/project/gcloud/&#34;&gt;gcloud&lt;/a&gt; command line tool installed and configured to use your GCP project.&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://kubernetes.io/docs/tasks/tools/&#34;&gt;kubectl&lt;/a&gt; command line utility is installed.&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://developer.hashicorp.com/terraform/install&#34;&gt;terraform&lt;/a&gt; command line installed.&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h2 id=&#34;check-out-the-necessary-code-files&#34;&gt;Check out the necessary code files:&lt;a class=&#34;td-heading-self-link&#34;&#xA;  onclick=&#34;copyHeadingLink(this, &#39;check-out-the-necessary-code-files&#39;); event.preventDefault();&#34;&#xA;  onmousedown=&#34;this.classList.add(&#39;active-link&#39;);&#34;&#xA;  onmouseup=&#34;this.classList.remove(&#39;active-link&#39;);&#34;&#xA;  onmouseleave=&#34;this.classList.remove(&#39;active-link&#39;);&#34;&#xA;  href=&#34;#check-out-the-necessary-code-files&#34; aria-label=&#34;Heading self-link&#34;&#xA;  title=&#34;Copy link to this section: Check out the necessary code files:&#34;&gt;&lt;i class=&#34;fa-solid fa-link&#34;&gt;&lt;/i&gt;&lt;/a&gt;&#xA;&lt;style&gt;&#xA;  .td-heading-self-link {&#xA;    transition: background 0.2s;&#xA;    border-radius: 4px;&#xA;    padding: 2px;&#xA;  }&#xA;  .td-heading-self-link.active-link {&#xA;    background: #e0e7ef;&#xA;    transition: background 0.2s;&#xA;  }&#xA;&lt;/style&gt;&#xA;&lt;script&gt;&#xA;  function copyHeadingLink(anchor, anchorId) {&#xA;    navigator.clipboard.writeText(location.origin + location.pathname + &#39;#&#39; + anchorId);&#xA;    let popup = document.getElementById(&#39;global-copy-popup&#39;);&#xA;    if (!popup) {&#xA;      &#xA;      popup = document.createElement(&#39;span&#39;);&#xA;      popup.id = &#39;global-copy-popup&#39;;&#xA;      popup.className = &#39;copy-popup&#39;;&#xA;      popup.textContent = &#39;Copied to clipboard&#39;;&#xA;      popup.setAttribute(&#39;style&#39;, &#39;position:fixed; bottom:24px; left:24px; background:#222; color:#fff; padding:8px 18px; border-radius:6px; font-size:0.8em; white-space:nowrap; z-index:9999; box-shadow:0 2px 8px rgba(0,0,0,0.15); transform:translateY(100px); opacity:0; transition:transform 0.3s cubic-bezier(.4,0,.2,1), opacity 0.3s cubic-bezier(.4,0,.2,1);&#39;);&#xA;      document.body.appendChild(popup);&#xA;    }&#xA;    popup.style.display = &#39;block&#39;;&#xA;    &#xA;    void popup.offsetWidth;&#xA;    popup.style.transform = &#39;translateY(0)&#39;;&#xA;    popup.style.opacity = &#39;1&#39;;&#xA;    clearTimeout(window.__copyPopupTimeout);&#xA;    window.__copyPopupTimeout = setTimeout(() =&gt; {&#xA;      popup.style.transform = &#39;translateY(100px)&#39;;&#xA;      popup.style.opacity = &#39;0&#39;;&#xA;      setTimeout(() =&gt; { popup.style.display = &#39;none&#39;; }, 300);&#xA;    }, 1200);&#xA;  }&#xA;&lt;/script&gt;&lt;/h2&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;git clone https://github.com/ai-on-gke/tutorials-and-examples.git&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;cd tutorials-and-examples/workflow-orchestration/dws-example&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id=&#34;create-clusters&#34;&gt;Create Clusters&lt;a class=&#34;td-heading-self-link&#34;&#xA;  onclick=&#34;copyHeadingLink(this, &#39;create-clusters&#39;); event.preventDefault();&#34;&#xA;  onmousedown=&#34;this.classList.add(&#39;active-link&#39;);&#34;&#xA;  onmouseup=&#34;this.classList.remove(&#39;active-link&#39;);&#34;&#xA;  onmouseleave=&#34;this.classList.remove(&#39;active-link&#39;);&#34;&#xA;  href=&#34;#create-clusters&#34; aria-label=&#34;Heading self-link&#34;&#xA;  title=&#34;Copy link to this section: Create Clusters&#34;&gt;&lt;i class=&#34;fa-solid fa-link&#34;&gt;&lt;/i&gt;&lt;/a&gt;&#xA;&lt;style&gt;&#xA;  .td-heading-self-link {&#xA;    transition: background 0.2s;&#xA;    border-radius: 4px;&#xA;    padding: 2px;&#xA;  }&#xA;  .td-heading-self-link.active-link {&#xA;    background: #e0e7ef;&#xA;    transition: background 0.2s;&#xA;  }&#xA;&lt;/style&gt;&#xA;&lt;script&gt;&#xA;  function copyHeadingLink(anchor, anchorId) {&#xA;    navigator.clipboard.writeText(location.origin + location.pathname + &#39;#&#39; + anchorId);&#xA;    let popup = document.getElementById(&#39;global-copy-popup&#39;);&#xA;    if (!popup) {&#xA;      &#xA;      popup = document.createElement(&#39;span&#39;);&#xA;      popup.id = &#39;global-copy-popup&#39;;&#xA;      popup.className = &#39;copy-popup&#39;;&#xA;      popup.textContent = &#39;Copied to clipboard&#39;;&#xA;      popup.setAttribute(&#39;style&#39;, &#39;position:fixed; bottom:24px; left:24px; background:#222; color:#fff; padding:8px 18px; border-radius:6px; font-size:0.8em; white-space:nowrap; z-index:9999; box-shadow:0 2px 8px rgba(0,0,0,0.15); transform:translateY(100px); opacity:0; transition:transform 0.3s cubic-bezier(.4,0,.2,1), opacity 0.3s cubic-bezier(.4,0,.2,1);&#39;);&#xA;      document.body.appendChild(popup);&#xA;    }&#xA;    popup.style.display = &#39;block&#39;;&#xA;    &#xA;    void popup.offsetWidth;&#xA;    popup.style.transform = &#39;translateY(0)&#39;;&#xA;    popup.style.opacity = &#39;1&#39;;&#xA;    clearTimeout(window.__copyPopupTimeout);&#xA;    window.__copyPopupTimeout = setTimeout(() =&gt; {&#xA;      popup.style.transform = &#39;translateY(100px)&#39;;&#xA;      popup.style.opacity = &#39;0&#39;;&#xA;      setTimeout(() =&gt; { popup.style.display = &#39;none&#39;; }, 300);&#xA;    }, 1200);&#xA;  }&#xA;&lt;/script&gt;&lt;/h2&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;terraform -chdir&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;tf init&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;terraform -chdir&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;tf plan&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;terraform -chdir&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;tf apply -var project_id&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;&amp;lt;YOUR PROJECT ID&amp;gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id=&#34;install-kueue&#34;&gt;Install Kueue&lt;a class=&#34;td-heading-self-link&#34;&#xA;  onclick=&#34;copyHeadingLink(this, &#39;install-kueue&#39;); event.preventDefault();&#34;&#xA;  onmousedown=&#34;this.classList.add(&#39;active-link&#39;);&#34;&#xA;  onmouseup=&#34;this.classList.remove(&#39;active-link&#39;);&#34;&#xA;  onmouseleave=&#34;this.classList.remove(&#39;active-link&#39;);&#34;&#xA;  href=&#34;#install-kueue&#34; aria-label=&#34;Heading self-link&#34;&#xA;  title=&#34;Copy link to this section: Install Kueue&#34;&gt;&lt;i class=&#34;fa-solid fa-link&#34;&gt;&lt;/i&gt;&lt;/a&gt;&#xA;&lt;style&gt;&#xA;  .td-heading-self-link {&#xA;    transition: background 0.2s;&#xA;    border-radius: 4px;&#xA;    padding: 2px;&#xA;  }&#xA;  .td-heading-self-link.active-link {&#xA;    background: #e0e7ef;&#xA;    transition: background 0.2s;&#xA;  }&#xA;&lt;/style&gt;&#xA;&lt;script&gt;&#xA;  function copyHeadingLink(anchor, anchorId) {&#xA;    navigator.clipboard.writeText(location.origin + location.pathname + &#39;#&#39; + anchorId);&#xA;    let popup = document.getElementById(&#39;global-copy-popup&#39;);&#xA;    if (!popup) {&#xA;      &#xA;      popup = document.createElement(&#39;span&#39;);&#xA;      popup.id = &#39;global-copy-popup&#39;;&#xA;      popup.className = &#39;copy-popup&#39;;&#xA;      popup.textContent = &#39;Copied to clipboard&#39;;&#xA;      popup.setAttribute(&#39;style&#39;, &#39;position:fixed; bottom:24px; left:24px; background:#222; color:#fff; padding:8px 18px; border-radius:6px; font-size:0.8em; white-space:nowrap; z-index:9999; box-shadow:0 2px 8px rgba(0,0,0,0.15); transform:translateY(100px); opacity:0; transition:transform 0.3s cubic-bezier(.4,0,.2,1), opacity 0.3s cubic-bezier(.4,0,.2,1);&#39;);&#xA;      document.body.appendChild(popup);&#xA;    }&#xA;    popup.style.display = &#39;block&#39;;&#xA;    &#xA;    void popup.offsetWidth;&#xA;    popup.style.transform = &#39;translateY(0)&#39;;&#xA;    popup.style.opacity = &#39;1&#39;;&#xA;    clearTimeout(window.__copyPopupTimeout);&#xA;    window.__copyPopupTimeout = setTimeout(() =&gt; {&#xA;      popup.style.transform = &#39;translateY(100px)&#39;;&#xA;      popup.style.opacity = &#39;0&#39;;&#xA;      setTimeout(() =&gt; { popup.style.display = &#39;none&#39;; }, 300);&#xA;    }, 1200);&#xA;  }&#xA;&lt;/script&gt;&lt;/h2&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;VERSION&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;v0.12.0&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;kubectl apply --server-side -f https://github.com/kubernetes-sigs/kueue/releases/download/$VERSION/manifests.yaml&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h1 id=&#34;create-kueue-resources&#34;&gt;Create Kueue resources&lt;a class=&#34;td-heading-self-link&#34;&#xA;  onclick=&#34;copyHeadingLink(this, &#39;create-kueue-resources&#39;); event.preventDefault();&#34;&#xA;  onmousedown=&#34;this.classList.add(&#39;active-link&#39;);&#34;&#xA;  onmouseup=&#34;this.classList.remove(&#39;active-link&#39;);&#34;&#xA;  onmouseleave=&#34;this.classList.remove(&#39;active-link&#39;);&#34;&#xA;  href=&#34;#create-kueue-resources&#34; aria-label=&#34;Heading self-link&#34;&#xA;  title=&#34;Copy link to this section: Create Kueue resources&#34;&gt;&lt;i class=&#34;fa-solid fa-link&#34;&gt;&lt;/i&gt;&lt;/a&gt;&#xA;&lt;style&gt;&#xA;  .td-heading-self-link {&#xA;    transition: background 0.2s;&#xA;    border-radius: 4px;&#xA;    padding: 2px;&#xA;  }&#xA;  .td-heading-self-link.active-link {&#xA;    background: #e0e7ef;&#xA;    transition: background 0.2s;&#xA;  }&#xA;&lt;/style&gt;&#xA;&lt;script&gt;&#xA;  function copyHeadingLink(anchor, anchorId) {&#xA;    navigator.clipboard.writeText(location.origin + location.pathname + &#39;#&#39; + anchorId);&#xA;    let popup = document.getElementById(&#39;global-copy-popup&#39;);&#xA;    if (!popup) {&#xA;      &#xA;      popup = document.createElement(&#39;span&#39;);&#xA;      popup.id = &#39;global-copy-popup&#39;;&#xA;      popup.className = &#39;copy-popup&#39;;&#xA;      popup.textContent = &#39;Copied to clipboard&#39;;&#xA;      popup.setAttribute(&#39;style&#39;, &#39;position:fixed; bottom:24px; left:24px; background:#222; color:#fff; padding:8px 18px; border-radius:6px; font-size:0.8em; white-space:nowrap; z-index:9999; box-shadow:0 2px 8px rgba(0,0,0,0.15); transform:translateY(100px); opacity:0; transition:transform 0.3s cubic-bezier(.4,0,.2,1), opacity 0.3s cubic-bezier(.4,0,.2,1);&#39;);&#xA;      document.body.appendChild(popup);&#xA;    }&#xA;    popup.style.display = &#39;block&#39;;&#xA;    &#xA;    void popup.offsetWidth;&#xA;    popup.style.transform = &#39;translateY(0)&#39;;&#xA;    popup.style.opacity = &#39;1&#39;;&#xA;    clearTimeout(window.__copyPopupTimeout);&#xA;    window.__copyPopupTimeout = setTimeout(() =&gt; {&#xA;      popup.style.transform = &#39;translateY(100px)&#39;;&#xA;      popup.style.opacity = &#39;0&#39;;&#xA;      setTimeout(() =&gt; { popup.style.display = &#39;none&#39;; }, 300);&#xA;    }, 1200);&#xA;  }&#xA;&lt;/script&gt;&lt;/h1&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;kubectl apply -f dws-queues.yaml &#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id=&#34;validate-installation&#34;&gt;Validate installation&lt;a class=&#34;td-heading-self-link&#34;&#xA;  onclick=&#34;copyHeadingLink(this, &#39;validate-installation&#39;); event.preventDefault();&#34;&#xA;  onmousedown=&#34;this.classList.add(&#39;active-link&#39;);&#34;&#xA;  onmouseup=&#34;this.classList.remove(&#39;active-link&#39;);&#34;&#xA;  onmouseleave=&#34;this.classList.remove(&#39;active-link&#39;);&#34;&#xA;  href=&#34;#validate-installation&#34; aria-label=&#34;Heading self-link&#34;&#xA;  title=&#34;Copy link to this section: Validate installation&#34;&gt;&lt;i class=&#34;fa-solid fa-link&#34;&gt;&lt;/i&gt;&lt;/a&gt;&#xA;&lt;style&gt;&#xA;  .td-heading-self-link {&#xA;    transition: background 0.2s;&#xA;    border-radius: 4px;&#xA;    padding: 2px;&#xA;  }&#xA;  .td-heading-self-link.active-link {&#xA;    background: #e0e7ef;&#xA;    transition: background 0.2s;&#xA;  }&#xA;&lt;/style&gt;&#xA;&lt;script&gt;&#xA;  function copyHeadingLink(anchor, anchorId) {&#xA;    navigator.clipboard.writeText(location.origin + location.pathname + &#39;#&#39; + anchorId);&#xA;    let popup = document.getElementById(&#39;global-copy-popup&#39;);&#xA;    if (!popup) {&#xA;      &#xA;      popup = document.createElement(&#39;span&#39;);&#xA;      popup.id = &#39;global-copy-popup&#39;;&#xA;      popup.className = &#39;copy-popup&#39;;&#xA;      popup.textContent = &#39;Copied to clipboard&#39;;&#xA;      popup.setAttribute(&#39;style&#39;, &#39;position:fixed; bottom:24px; left:24px; background:#222; color:#fff; padding:8px 18px; border-radius:6px; font-size:0.8em; white-space:nowrap; z-index:9999; box-shadow:0 2px 8px rgba(0,0,0,0.15); transform:translateY(100px); opacity:0; transition:transform 0.3s cubic-bezier(.4,0,.2,1), opacity 0.3s cubic-bezier(.4,0,.2,1);&#39;);&#xA;      document.body.appendChild(popup);&#xA;    }&#xA;    popup.style.display = &#39;block&#39;;&#xA;    &#xA;    void popup.offsetWidth;&#xA;    popup.style.transform = &#39;translateY(0)&#39;;&#xA;    popup.style.opacity = &#39;1&#39;;&#xA;    clearTimeout(window.__copyPopupTimeout);&#xA;    window.__copyPopupTimeout = setTimeout(() =&gt; {&#xA;      popup.style.transform = &#39;translateY(100px)&#39;;&#xA;      popup.style.opacity = &#39;0&#39;;&#xA;      setTimeout(() =&gt; { popup.style.display = &#39;none&#39;; }, 300);&#xA;    }, 1200);&#xA;  }&#xA;&lt;/script&gt;&lt;/h3&gt;&#xA;&lt;p&gt;Verify the Kueue installation in your GKE cluster&lt;/p&gt;</description>
    </item>
    <item>
      <title>Fine-tuning Gemma 3-1B-it on L4</title>
      <link>https://gke-ai-labs.dev/docs/tutorials/finetuning/finetuning-gemma-3-1b-it-on-l4/</link>
      <pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate>
      <guid>https://gke-ai-labs.dev/docs/tutorials/finetuning/finetuning-gemma-3-1b-it-on-l4/</guid>
      <description>&lt;p&gt;We’ll walk through fine-tuning a Gemma 3-1B-it model using GKE using L4 GPU. L4 GPU are suitable for many use cases beyond serving models. We will demonstrate how the L4 GPU is a great option for fine tuning LLMs such as Gemma 3, at a fraction of the cost of using a higher end GPU.&lt;/p&gt;&#xA;&lt;p&gt;Let’s get started and fine-tune Gemma 3-1B-it on the &lt;a href=&#34;https://huggingface.co/datasets/b-mc2/sql-create-context&#34;&gt;b-mc2/sql-create-context&lt;/a&gt; dataset using GKE.&#xA;Parameter Efficient Fine Tuning (PEFT) and LoRA is used so fine-tuning is posible&#xA;on GPUs with less GPU memory.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Running Flyte on GKE</title>
      <link>https://gke-ai-labs.dev/docs/tutorials/workflow-orchestration/flyte/</link>
      <pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate>
      <guid>https://gke-ai-labs.dev/docs/tutorials/workflow-orchestration/flyte/</guid>
      <description>&lt;h2 id=&#34;overview&#34;&gt;Overview&lt;a class=&#34;td-heading-self-link&#34;&#xA;  onclick=&#34;copyHeadingLink(this, &#39;overview&#39;); event.preventDefault();&#34;&#xA;  onmousedown=&#34;this.classList.add(&#39;active-link&#39;);&#34;&#xA;  onmouseup=&#34;this.classList.remove(&#39;active-link&#39;);&#34;&#xA;  onmouseleave=&#34;this.classList.remove(&#39;active-link&#39;);&#34;&#xA;  href=&#34;#overview&#34; aria-label=&#34;Heading self-link&#34;&#xA;  title=&#34;Copy link to this section: Overview&#34;&gt;&lt;i class=&#34;fa-solid fa-link&#34;&gt;&lt;/i&gt;&lt;/a&gt;&#xA;&lt;style&gt;&#xA;  .td-heading-self-link {&#xA;    transition: background 0.2s;&#xA;    border-radius: 4px;&#xA;    padding: 2px;&#xA;  }&#xA;  .td-heading-self-link.active-link {&#xA;    background: #e0e7ef;&#xA;    transition: background 0.2s;&#xA;  }&#xA;&lt;/style&gt;&#xA;&lt;script&gt;&#xA;  function copyHeadingLink(anchor, anchorId) {&#xA;    navigator.clipboard.writeText(location.origin + location.pathname + &#39;#&#39; + anchorId);&#xA;    let popup = document.getElementById(&#39;global-copy-popup&#39;);&#xA;    if (!popup) {&#xA;      &#xA;      popup = document.createElement(&#39;span&#39;);&#xA;      popup.id = &#39;global-copy-popup&#39;;&#xA;      popup.className = &#39;copy-popup&#39;;&#xA;      popup.textContent = &#39;Copied to clipboard&#39;;&#xA;      popup.setAttribute(&#39;style&#39;, &#39;position:fixed; bottom:24px; left:24px; background:#222; color:#fff; padding:8px 18px; border-radius:6px; font-size:0.8em; white-space:nowrap; z-index:9999; box-shadow:0 2px 8px rgba(0,0,0,0.15); transform:translateY(100px); opacity:0; transition:transform 0.3s cubic-bezier(.4,0,.2,1), opacity 0.3s cubic-bezier(.4,0,.2,1);&#39;);&#xA;      document.body.appendChild(popup);&#xA;    }&#xA;    popup.style.display = &#39;block&#39;;&#xA;    &#xA;    void popup.offsetWidth;&#xA;    popup.style.transform = &#39;translateY(0)&#39;;&#xA;    popup.style.opacity = &#39;1&#39;;&#xA;    clearTimeout(window.__copyPopupTimeout);&#xA;    window.__copyPopupTimeout = setTimeout(() =&gt; {&#xA;      popup.style.transform = &#39;translateY(100px)&#39;;&#xA;      popup.style.opacity = &#39;0&#39;;&#xA;      setTimeout(() =&gt; { popup.style.display = &#39;none&#39;; }, 300);&#xA;    }, 1200);&#xA;  }&#xA;&lt;/script&gt;&lt;/h2&gt;&#xA;&lt;p&gt;This guide illustrates the deployment of Flyte on Google Kubernetes Engine (GKE) using Helm, utilizing Google Cloud Storage for scalable data storage and Cloud SQL PostgreSQL for a reliable metadata store. By the end of this tutorial, you will have a fully functional Flyte instance on GKE, offering businesses seamless integration with the GCP ecosystem, improved resource efficiency, and cost-effectiveness. ML platform engineers will benefit from the simplified deployment and management provided by GKE, along with the enhanced security achieved by enabling authentication using Google OAuth.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Hugging Face TGI</title>
      <link>https://gke-ai-labs.dev/docs/tutorials/inference-servers/hf-tgi/</link>
      <pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate>
      <guid>https://gke-ai-labs.dev/docs/tutorials/inference-servers/hf-tgi/</guid>
      <description>&lt;h2 id=&#34;overview&#34;&gt;Overview&lt;a class=&#34;td-heading-self-link&#34;&#xA;  onclick=&#34;copyHeadingLink(this, &#39;overview&#39;); event.preventDefault();&#34;&#xA;  onmousedown=&#34;this.classList.add(&#39;active-link&#39;);&#34;&#xA;  onmouseup=&#34;this.classList.remove(&#39;active-link&#39;);&#34;&#xA;  onmouseleave=&#34;this.classList.remove(&#39;active-link&#39;);&#34;&#xA;  href=&#34;#overview&#34; aria-label=&#34;Heading self-link&#34;&#xA;  title=&#34;Copy link to this section: Overview&#34;&gt;&lt;i class=&#34;fa-solid fa-link&#34;&gt;&lt;/i&gt;&lt;/a&gt;&#xA;&lt;style&gt;&#xA;  .td-heading-self-link {&#xA;    transition: background 0.2s;&#xA;    border-radius: 4px;&#xA;    padding: 2px;&#xA;  }&#xA;  .td-heading-self-link.active-link {&#xA;    background: #e0e7ef;&#xA;    transition: background 0.2s;&#xA;  }&#xA;&lt;/style&gt;&#xA;&lt;script&gt;&#xA;  function copyHeadingLink(anchor, anchorId) {&#xA;    navigator.clipboard.writeText(location.origin + location.pathname + &#39;#&#39; + anchorId);&#xA;    let popup = document.getElementById(&#39;global-copy-popup&#39;);&#xA;    if (!popup) {&#xA;      &#xA;      popup = document.createElement(&#39;span&#39;);&#xA;      popup.id = &#39;global-copy-popup&#39;;&#xA;      popup.className = &#39;copy-popup&#39;;&#xA;      popup.textContent = &#39;Copied to clipboard&#39;;&#xA;      popup.setAttribute(&#39;style&#39;, &#39;position:fixed; bottom:24px; left:24px; background:#222; color:#fff; padding:8px 18px; border-radius:6px; font-size:0.8em; white-space:nowrap; z-index:9999; box-shadow:0 2px 8px rgba(0,0,0,0.15); transform:translateY(100px); opacity:0; transition:transform 0.3s cubic-bezier(.4,0,.2,1), opacity 0.3s cubic-bezier(.4,0,.2,1);&#39;);&#xA;      document.body.appendChild(popup);&#xA;    }&#xA;    popup.style.display = &#39;block&#39;;&#xA;    &#xA;    void popup.offsetWidth;&#xA;    popup.style.transform = &#39;translateY(0)&#39;;&#xA;    popup.style.opacity = &#39;1&#39;;&#xA;    clearTimeout(window.__copyPopupTimeout);&#xA;    window.__copyPopupTimeout = setTimeout(() =&gt; {&#xA;      popup.style.transform = &#39;translateY(100px)&#39;;&#xA;      popup.style.opacity = &#39;0&#39;;&#xA;      setTimeout(() =&gt; { popup.style.display = &#39;none&#39;; }, 300);&#xA;    }, 1200);&#xA;  }&#xA;&lt;/script&gt;&lt;/h2&gt;&#xA;&lt;p&gt;This guide demonstrates how to deploy a Hugging Face Text Generation Inference (TGI) server on Google Kubernetes Engine (GKE) using NVIDIA L4 GPUs, enabling you to serve large language models like Mistral-7b-instruct. It walks you through creating a GKE cluster, deploying the TGI application, sending prompts to the model, and monitoring the service&amp;rsquo;s performance using metrics, while also providing instructions for cleaning up the cluster.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Load Hugging Face Models into Cloud Storage</title>
      <link>https://gke-ai-labs.dev/docs/tutorials/storage/hf-gcs-transfer/</link>
      <pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate>
      <guid>https://gke-ai-labs.dev/docs/tutorials/storage/hf-gcs-transfer/</guid>
      <description>&lt;h2 id=&#34;overview&#34;&gt;Overview&lt;a class=&#34;td-heading-self-link&#34;&#xA;  onclick=&#34;copyHeadingLink(this, &#39;overview&#39;); event.preventDefault();&#34;&#xA;  onmousedown=&#34;this.classList.add(&#39;active-link&#39;);&#34;&#xA;  onmouseup=&#34;this.classList.remove(&#39;active-link&#39;);&#34;&#xA;  onmouseleave=&#34;this.classList.remove(&#39;active-link&#39;);&#34;&#xA;  href=&#34;#overview&#34; aria-label=&#34;Heading self-link&#34;&#xA;  title=&#34;Copy link to this section: Overview&#34;&gt;&lt;i class=&#34;fa-solid fa-link&#34;&gt;&lt;/i&gt;&lt;/a&gt;&#xA;&lt;style&gt;&#xA;  .td-heading-self-link {&#xA;    transition: background 0.2s;&#xA;    border-radius: 4px;&#xA;    padding: 2px;&#xA;  }&#xA;  .td-heading-self-link.active-link {&#xA;    background: #e0e7ef;&#xA;    transition: background 0.2s;&#xA;  }&#xA;&lt;/style&gt;&#xA;&lt;script&gt;&#xA;  function copyHeadingLink(anchor, anchorId) {&#xA;    navigator.clipboard.writeText(location.origin + location.pathname + &#39;#&#39; + anchorId);&#xA;    let popup = document.getElementById(&#39;global-copy-popup&#39;);&#xA;    if (!popup) {&#xA;      &#xA;      popup = document.createElement(&#39;span&#39;);&#xA;      popup.id = &#39;global-copy-popup&#39;;&#xA;      popup.className = &#39;copy-popup&#39;;&#xA;      popup.textContent = &#39;Copied to clipboard&#39;;&#xA;      popup.setAttribute(&#39;style&#39;, &#39;position:fixed; bottom:24px; left:24px; background:#222; color:#fff; padding:8px 18px; border-radius:6px; font-size:0.8em; white-space:nowrap; z-index:9999; box-shadow:0 2px 8px rgba(0,0,0,0.15); transform:translateY(100px); opacity:0; transition:transform 0.3s cubic-bezier(.4,0,.2,1), opacity 0.3s cubic-bezier(.4,0,.2,1);&#39;);&#xA;      document.body.appendChild(popup);&#xA;    }&#xA;    popup.style.display = &#39;block&#39;;&#xA;    &#xA;    void popup.offsetWidth;&#xA;    popup.style.transform = &#39;translateY(0)&#39;;&#xA;    popup.style.opacity = &#39;1&#39;;&#xA;    clearTimeout(window.__copyPopupTimeout);&#xA;    window.__copyPopupTimeout = setTimeout(() =&gt; {&#xA;      popup.style.transform = &#39;translateY(100px)&#39;;&#xA;      popup.style.opacity = &#39;0&#39;;&#xA;      setTimeout(() =&gt; { popup.style.display = &#39;none&#39;; }, 300);&#xA;    }, 1200);&#xA;  }&#xA;&lt;/script&gt;&lt;/h2&gt;&#xA;&lt;p&gt;This guide uses a Kubernetes Job to load &lt;a href=&#34;https://huggingface.co/meta-llama/Meta-Llama-3-8B&#34;&gt;meta-llama/Meta-Llama-3-8B&lt;/a&gt; model weights hosted on Hugging Face, into a Cloud Storage Bucket, which is used in a vLLM model deployment.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Jupyter on GKE</title>
      <link>https://gke-ai-labs.dev/docs/blueprints/jupyter-on-gke/</link>
      <pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate>
      <guid>https://gke-ai-labs.dev/docs/blueprints/jupyter-on-gke/</guid>
      <description>&lt;p&gt;This repository contains a Terraform template for running &lt;a href=&#34;https://jupyter.org/hub&#34;&gt;JupyterHub&lt;/a&gt; on Google Kubernetes Engine.&lt;/p&gt;&#xA;&lt;p&gt;This module deploys the following resources, once per user:&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;JupyterHub deployment&lt;/li&gt;&#xA;&lt;li&gt;User namespace&lt;/li&gt;&#xA;&lt;li&gt;Kubernetes service accounts&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h2 id=&#34;prerequisites&#34;&gt;Prerequisites&lt;a class=&#34;td-heading-self-link&#34;&#xA;  onclick=&#34;copyHeadingLink(this, &#39;prerequisites&#39;); event.preventDefault();&#34;&#xA;  onmousedown=&#34;this.classList.add(&#39;active-link&#39;);&#34;&#xA;  onmouseup=&#34;this.classList.remove(&#39;active-link&#39;);&#34;&#xA;  onmouseleave=&#34;this.classList.remove(&#39;active-link&#39;);&#34;&#xA;  href=&#34;#prerequisites&#34; aria-label=&#34;Heading self-link&#34;&#xA;  title=&#34;Copy link to this section: Prerequisites&#34;&gt;&lt;i class=&#34;fa-solid fa-link&#34;&gt;&lt;/i&gt;&lt;/a&gt;&#xA;&lt;style&gt;&#xA;  .td-heading-self-link {&#xA;    transition: background 0.2s;&#xA;    border-radius: 4px;&#xA;    padding: 2px;&#xA;  }&#xA;  .td-heading-self-link.active-link {&#xA;    background: #e0e7ef;&#xA;    transition: background 0.2s;&#xA;  }&#xA;&lt;/style&gt;&#xA;&lt;script&gt;&#xA;  function copyHeadingLink(anchor, anchorId) {&#xA;    navigator.clipboard.writeText(location.origin + location.pathname + &#39;#&#39; + anchorId);&#xA;    let popup = document.getElementById(&#39;global-copy-popup&#39;);&#xA;    if (!popup) {&#xA;      &#xA;      popup = document.createElement(&#39;span&#39;);&#xA;      popup.id = &#39;global-copy-popup&#39;;&#xA;      popup.className = &#39;copy-popup&#39;;&#xA;      popup.textContent = &#39;Copied to clipboard&#39;;&#xA;      popup.setAttribute(&#39;style&#39;, &#39;position:fixed; bottom:24px; left:24px; background:#222; color:#fff; padding:8px 18px; border-radius:6px; font-size:0.8em; white-space:nowrap; z-index:9999; box-shadow:0 2px 8px rgba(0,0,0,0.15); transform:translateY(100px); opacity:0; transition:transform 0.3s cubic-bezier(.4,0,.2,1), opacity 0.3s cubic-bezier(.4,0,.2,1);&#39;);&#xA;      document.body.appendChild(popup);&#xA;    }&#xA;    popup.style.display = &#39;block&#39;;&#xA;    &#xA;    void popup.offsetWidth;&#xA;    popup.style.transform = &#39;translateY(0)&#39;;&#xA;    popup.style.opacity = &#39;1&#39;;&#xA;    clearTimeout(window.__copyPopupTimeout);&#xA;    window.__copyPopupTimeout = setTimeout(() =&gt; {&#xA;      popup.style.transform = &#39;translateY(100px)&#39;;&#xA;      popup.style.opacity = &#39;0&#39;;&#xA;      setTimeout(() =&gt; { popup.style.display = &#39;none&#39;; }, 300);&#xA;    }, 1200);&#xA;  }&#xA;&lt;/script&gt;&lt;/h2&gt;&#xA;&lt;ol&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;GCP Project with following APIs enabled&lt;/p&gt;</description>
    </item>
    <item>
      <title>Kserve</title>
      <link>https://gke-ai-labs.dev/docs/tutorials/inference-servers/kserve/</link>
      <pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate>
      <guid>https://gke-ai-labs.dev/docs/tutorials/inference-servers/kserve/</guid>
      <description>&lt;p&gt;KServe is a highly scalable, standards-based platform for model inference on Kubernetes. Installing KServe on GKE Autopilot can be challenging due to the security policies enforced by Autopilot. This tutorial will guide you step by step through the process of installing KServe in a GKE Autopilot cluster.&lt;/p&gt;&#xA;&lt;p&gt;Additionally, this tutorial includes an example of serving Gemma2 with vLLM in KServe, demonstrating how to utilize GPU resources in KServe on Google Kubernetes Engine (GKE).&lt;/p&gt;</description>
    </item>
    <item>
      <title>Deploying a Persistent Chatbot on Google Cloud Platform with LangChain, Streamlit, and IAP</title>
      <link>https://gke-ai-labs.dev/docs/tutorials/frameworks-and-pipelines/langchain-chatbot/</link>
      <pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate>
      <guid>https://gke-ai-labs.dev/docs/tutorials/frameworks-and-pipelines/langchain-chatbot/</guid>
      <description>&lt;ul&gt;&#xA;&lt;li&gt;&lt;a href=&#34;#introduction&#34;&gt;Introduction&lt;/a&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&lt;a href=&#34;#architecture-overview&#34;&gt;Architecture overview&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;#what-is-langchain&#34;&gt;What is LangChain&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;#what-is-streamlit&#34;&gt;What is Streamlit&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;#what-is-identity-aware-proxy-iap&#34;&gt;What is Identity Aware Proxy (IAP)&lt;/a&gt;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;#prerequisites&#34;&gt;Prerequisites&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;#optional-build-and-run-the-application-locally&#34;&gt;Optional: Build and Run the Application Locally&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;#provision-gke-cluster&#34;&gt;Provision GKE Cluster&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;#prepare-the-application-for-deployment&#34;&gt;Prepare the Application for Deployment&lt;/a&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&lt;a href=&#34;#1-create-google-artifact-registry&#34;&gt;1. Create Google Artifact Registry&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;#2-build-the-application-using-cloud-build&#34;&gt;2. Build the Application Using Cloud Build&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;#3-enable-iap-and-create-oauth-client&#34;&gt;3. Enable IAP and create OAuth client&lt;/a&gt;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;#manual-deployment&#34;&gt;Manual Deployment&lt;/a&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&lt;a href=&#34;#1-create-cloud-sql-instance&#34;&gt;1. Create Cloud SQL Instance&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;#2-deploy-the-application-to-gke&#34;&gt;2. Deploy the application to GKE&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;#3-expose-the-application-to-the-internet&#34;&gt;3. Expose the application to the internet&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;#4-configure-iap-for-the-application&#34;&gt;4. Configure IAP for the application&lt;/a&gt;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;#automated-deployment&#34;&gt;Automated Deployment&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;#interaction-with-the-chatbot&#34;&gt;Interaction with the Chatbot&lt;/a&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&lt;a href=&#34;#basic-troubleshooting-and-debugging-tips&#34;&gt;Basic Troubleshooting and Debugging Tips&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;#common-errors-and-resolutions&#34;&gt;Common Errors and Resolutions&lt;/a&gt;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;#conclusion&#34;&gt;Conclusion&lt;/a&gt;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h2 id=&#34;introduction&#34;&gt;Introduction&lt;a class=&#34;td-heading-self-link&#34;&#xA;  onclick=&#34;copyHeadingLink(this, &#39;introduction&#39;); event.preventDefault();&#34;&#xA;  onmousedown=&#34;this.classList.add(&#39;active-link&#39;);&#34;&#xA;  onmouseup=&#34;this.classList.remove(&#39;active-link&#39;);&#34;&#xA;  onmouseleave=&#34;this.classList.remove(&#39;active-link&#39;);&#34;&#xA;  href=&#34;#introduction&#34; aria-label=&#34;Heading self-link&#34;&#xA;  title=&#34;Copy link to this section: Introduction&#34;&gt;&lt;i class=&#34;fa-solid fa-link&#34;&gt;&lt;/i&gt;&lt;/a&gt;&#xA;&lt;style&gt;&#xA;  .td-heading-self-link {&#xA;    transition: background 0.2s;&#xA;    border-radius: 4px;&#xA;    padding: 2px;&#xA;  }&#xA;  .td-heading-self-link.active-link {&#xA;    background: #e0e7ef;&#xA;    transition: background 0.2s;&#xA;  }&#xA;&lt;/style&gt;&#xA;&lt;script&gt;&#xA;  function copyHeadingLink(anchor, anchorId) {&#xA;    navigator.clipboard.writeText(location.origin + location.pathname + &#39;#&#39; + anchorId);&#xA;    let popup = document.getElementById(&#39;global-copy-popup&#39;);&#xA;    if (!popup) {&#xA;      &#xA;      popup = document.createElement(&#39;span&#39;);&#xA;      popup.id = &#39;global-copy-popup&#39;;&#xA;      popup.className = &#39;copy-popup&#39;;&#xA;      popup.textContent = &#39;Copied to clipboard&#39;;&#xA;      popup.setAttribute(&#39;style&#39;, &#39;position:fixed; bottom:24px; left:24px; background:#222; color:#fff; padding:8px 18px; border-radius:6px; font-size:0.8em; white-space:nowrap; z-index:9999; box-shadow:0 2px 8px rgba(0,0,0,0.15); transform:translateY(100px); opacity:0; transition:transform 0.3s cubic-bezier(.4,0,.2,1), opacity 0.3s cubic-bezier(.4,0,.2,1);&#39;);&#xA;      document.body.appendChild(popup);&#xA;    }&#xA;    popup.style.display = &#39;block&#39;;&#xA;    &#xA;    void popup.offsetWidth;&#xA;    popup.style.transform = &#39;translateY(0)&#39;;&#xA;    popup.style.opacity = &#39;1&#39;;&#xA;    clearTimeout(window.__copyPopupTimeout);&#xA;    window.__copyPopupTimeout = setTimeout(() =&gt; {&#xA;      popup.style.transform = &#39;translateY(100px)&#39;;&#xA;      popup.style.opacity = &#39;0&#39;;&#xA;      setTimeout(() =&gt; { popup.style.display = &#39;none&#39;; }, 300);&#xA;    }, 1200);&#xA;  }&#xA;&lt;/script&gt;&lt;/h2&gt;&#xA;&lt;p&gt;In this tutorial, you will learn how to deploy a chatbot application using &lt;a href=&#34;https://python.langchain.com/&#34;&gt;LangChain&lt;/a&gt; and &lt;a href=&#34;https://streamlit.io/&#34;&gt;Streamlit&lt;/a&gt; on Google Cloud Platform (GCP).&lt;/p&gt;</description>
    </item>
    <item>
      <title>Llamaindex in GKE cluster</title>
      <link>https://gke-ai-labs.dev/docs/tutorials/frameworks-and-pipelines/llamaindex/</link>
      <pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate>
      <guid>https://gke-ai-labs.dev/docs/tutorials/frameworks-and-pipelines/llamaindex/</guid>
      <description>&lt;p&gt;&lt;a href=&#34;https://docs.llamaindex.ai/en/stable/&#34;&gt;LlamaIndex&lt;/a&gt; bridges the gap between LLMs and domain-specific datasets, enabling efficient indexing and querying of unstructured data for intelligent, data-driven responses. When deployed on a &lt;a href=&#34;https://cloud.google.com/kubernetes-engine/docs/concepts/kubernetes-engine-overview&#34;&gt;GKE&lt;/a&gt; cluster, it ensures scalability and security by leveraging containerized workloads, GPU-based nodes, and seamless cloud-native integrations, making it ideal for ML-powered applications like RAG systems.&lt;/p&gt;&#xA;&lt;h2 id=&#34;overview&#34;&gt;Overview&lt;a class=&#34;td-heading-self-link&#34;&#xA;  onclick=&#34;copyHeadingLink(this, &#39;overview&#39;); event.preventDefault();&#34;&#xA;  onmousedown=&#34;this.classList.add(&#39;active-link&#39;);&#34;&#xA;  onmouseup=&#34;this.classList.remove(&#39;active-link&#39;);&#34;&#xA;  onmouseleave=&#34;this.classList.remove(&#39;active-link&#39;);&#34;&#xA;  href=&#34;#overview&#34; aria-label=&#34;Heading self-link&#34;&#xA;  title=&#34;Copy link to this section: Overview&#34;&gt;&lt;i class=&#34;fa-solid fa-link&#34;&gt;&lt;/i&gt;&lt;/a&gt;&#xA;&lt;style&gt;&#xA;  .td-heading-self-link {&#xA;    transition: background 0.2s;&#xA;    border-radius: 4px;&#xA;    padding: 2px;&#xA;  }&#xA;  .td-heading-self-link.active-link {&#xA;    background: #e0e7ef;&#xA;    transition: background 0.2s;&#xA;  }&#xA;&lt;/style&gt;&#xA;&lt;script&gt;&#xA;  function copyHeadingLink(anchor, anchorId) {&#xA;    navigator.clipboard.writeText(location.origin + location.pathname + &#39;#&#39; + anchorId);&#xA;    let popup = document.getElementById(&#39;global-copy-popup&#39;);&#xA;    if (!popup) {&#xA;      &#xA;      popup = document.createElement(&#39;span&#39;);&#xA;      popup.id = &#39;global-copy-popup&#39;;&#xA;      popup.className = &#39;copy-popup&#39;;&#xA;      popup.textContent = &#39;Copied to clipboard&#39;;&#xA;      popup.setAttribute(&#39;style&#39;, &#39;position:fixed; bottom:24px; left:24px; background:#222; color:#fff; padding:8px 18px; border-radius:6px; font-size:0.8em; white-space:nowrap; z-index:9999; box-shadow:0 2px 8px rgba(0,0,0,0.15); transform:translateY(100px); opacity:0; transition:transform 0.3s cubic-bezier(.4,0,.2,1), opacity 0.3s cubic-bezier(.4,0,.2,1);&#39;);&#xA;      document.body.appendChild(popup);&#xA;    }&#xA;    popup.style.display = &#39;block&#39;;&#xA;    &#xA;    void popup.offsetWidth;&#xA;    popup.style.transform = &#39;translateY(0)&#39;;&#xA;    popup.style.opacity = &#39;1&#39;;&#xA;    clearTimeout(window.__copyPopupTimeout);&#xA;    window.__copyPopupTimeout = setTimeout(() =&gt; {&#xA;      popup.style.transform = &#39;translateY(100px)&#39;;&#xA;      popup.style.opacity = &#39;0&#39;;&#xA;      setTimeout(() =&gt; { popup.style.display = &#39;none&#39;; }, 300);&#xA;    }, 1200);&#xA;  }&#xA;&lt;/script&gt;&lt;/h2&gt;&#xA;&lt;p&gt;This tutorial will guide you through creating a robust Retrieval-Augmented Generation (RAG) system using LlamaIndex and deploying it on Google Kubernetes Engine (GKE).&lt;/p&gt;</description>
    </item>
    <item>
      <title>Fine-Tuning Gemma 2-9B on GKE using Metaflow and Argo Workflows</title>
      <link>https://gke-ai-labs.dev/docs/tutorials/frameworks-and-pipelines/metaflow/</link>
      <pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate>
      <guid>https://gke-ai-labs.dev/docs/tutorials/frameworks-and-pipelines/metaflow/</guid>
      <description>&lt;p&gt;This tutorial will provide instructions on how to deploy and use the &lt;a href=&#34;https://docs.metaflow.org/&#34;&gt;Metaflow&lt;/a&gt; framework on GKE (Google Kubernetes Engine) and operate AI/ML workloads using &lt;a href=&#34;https://argo-workflows.readthedocs.io/en/latest/&#34;&gt;Argo-Workflows&lt;/a&gt;.&#xA;The tutorial is designed for ML Platform engineers who plan to use Metaflow for ML workloads on top of GKE by offloading resource-intensive tasks to a managed cluster.&lt;/p&gt;&#xA;&lt;h2 id=&#34;overview&#34;&gt;Overview&lt;a class=&#34;td-heading-self-link&#34;&#xA;  onclick=&#34;copyHeadingLink(this, &#39;overview&#39;); event.preventDefault();&#34;&#xA;  onmousedown=&#34;this.classList.add(&#39;active-link&#39;);&#34;&#xA;  onmouseup=&#34;this.classList.remove(&#39;active-link&#39;);&#34;&#xA;  onmouseleave=&#34;this.classList.remove(&#39;active-link&#39;);&#34;&#xA;  href=&#34;#overview&#34; aria-label=&#34;Heading self-link&#34;&#xA;  title=&#34;Copy link to this section: Overview&#34;&gt;&lt;i class=&#34;fa-solid fa-link&#34;&gt;&lt;/i&gt;&lt;/a&gt;&#xA;&lt;style&gt;&#xA;  .td-heading-self-link {&#xA;    transition: background 0.2s;&#xA;    border-radius: 4px;&#xA;    padding: 2px;&#xA;  }&#xA;  .td-heading-self-link.active-link {&#xA;    background: #e0e7ef;&#xA;    transition: background 0.2s;&#xA;  }&#xA;&lt;/style&gt;&#xA;&lt;script&gt;&#xA;  function copyHeadingLink(anchor, anchorId) {&#xA;    navigator.clipboard.writeText(location.origin + location.pathname + &#39;#&#39; + anchorId);&#xA;    let popup = document.getElementById(&#39;global-copy-popup&#39;);&#xA;    if (!popup) {&#xA;      &#xA;      popup = document.createElement(&#39;span&#39;);&#xA;      popup.id = &#39;global-copy-popup&#39;;&#xA;      popup.className = &#39;copy-popup&#39;;&#xA;      popup.textContent = &#39;Copied to clipboard&#39;;&#xA;      popup.setAttribute(&#39;style&#39;, &#39;position:fixed; bottom:24px; left:24px; background:#222; color:#fff; padding:8px 18px; border-radius:6px; font-size:0.8em; white-space:nowrap; z-index:9999; box-shadow:0 2px 8px rgba(0,0,0,0.15); transform:translateY(100px); opacity:0; transition:transform 0.3s cubic-bezier(.4,0,.2,1), opacity 0.3s cubic-bezier(.4,0,.2,1);&#39;);&#xA;      document.body.appendChild(popup);&#xA;    }&#xA;    popup.style.display = &#39;block&#39;;&#xA;    &#xA;    void popup.offsetWidth;&#xA;    popup.style.transform = &#39;translateY(0)&#39;;&#xA;    popup.style.opacity = &#39;1&#39;;&#xA;    clearTimeout(window.__copyPopupTimeout);&#xA;    window.__copyPopupTimeout = setTimeout(() =&gt; {&#xA;      popup.style.transform = &#39;translateY(100px)&#39;;&#xA;      popup.style.opacity = &#39;0&#39;;&#xA;      setTimeout(() =&gt; { popup.style.display = &#39;none&#39;; }, 300);&#xA;    }, 1200);&#xA;  }&#xA;&lt;/script&gt;&lt;/h2&gt;&#xA;&lt;ol&gt;&#xA;&lt;li&gt;Provision &lt;a href=&#34;https://cloud.google.com/kubernetes-engine/docs/concepts/kubernetes-engine-overview&#34;&gt;GKE&lt;/a&gt; cluster and install &lt;a href=&#34;https://argoproj.github.io/workflows/&#34;&gt;Argo Workflows&lt;/a&gt; using &lt;a href=&#34;https://developer.hashicorp.com/terraform/intro&#34;&gt;Terraform&lt;/a&gt;.&lt;/li&gt;&#xA;&lt;li&gt;Deploy and configure &lt;a href=&#34;https://docs.metaflow.org/getting-started/infrastructure&#34;&gt;Metaflow’s Metadata Service&lt;/a&gt;.&lt;/li&gt;&#xA;&lt;li&gt;Set up Metaflow to work with Argo Workflows.&lt;/li&gt;&#xA;&lt;li&gt;Build a fine-tuning image with &lt;a href=&#34;https://cloud.google.com/build/docs/overview&#34;&gt;Cloud Build&lt;/a&gt;.&lt;/li&gt;&#xA;&lt;li&gt;Fine-tune the model using Metaflow and Argo Workflow and GKE.&lt;/li&gt;&#xA;&lt;li&gt;Deploy the fine-tuned model on GKE for inference.&lt;/li&gt;&#xA;&lt;/ol&gt;&#xA;&lt;h2 id=&#34;before-you-begin&#34;&gt;Before you begin&lt;a class=&#34;td-heading-self-link&#34;&#xA;  onclick=&#34;copyHeadingLink(this, &#39;before-you-begin&#39;); event.preventDefault();&#34;&#xA;  onmousedown=&#34;this.classList.add(&#39;active-link&#39;);&#34;&#xA;  onmouseup=&#34;this.classList.remove(&#39;active-link&#39;);&#34;&#xA;  onmouseleave=&#34;this.classList.remove(&#39;active-link&#39;);&#34;&#xA;  href=&#34;#before-you-begin&#34; aria-label=&#34;Heading self-link&#34;&#xA;  title=&#34;Copy link to this section: Before you begin&#34;&gt;&lt;i class=&#34;fa-solid fa-link&#34;&gt;&lt;/i&gt;&lt;/a&gt;&#xA;&lt;style&gt;&#xA;  .td-heading-self-link {&#xA;    transition: background 0.2s;&#xA;    border-radius: 4px;&#xA;    padding: 2px;&#xA;  }&#xA;  .td-heading-self-link.active-link {&#xA;    background: #e0e7ef;&#xA;    transition: background 0.2s;&#xA;  }&#xA;&lt;/style&gt;&#xA;&lt;script&gt;&#xA;  function copyHeadingLink(anchor, anchorId) {&#xA;    navigator.clipboard.writeText(location.origin + location.pathname + &#39;#&#39; + anchorId);&#xA;    let popup = document.getElementById(&#39;global-copy-popup&#39;);&#xA;    if (!popup) {&#xA;      &#xA;      popup = document.createElement(&#39;span&#39;);&#xA;      popup.id = &#39;global-copy-popup&#39;;&#xA;      popup.className = &#39;copy-popup&#39;;&#xA;      popup.textContent = &#39;Copied to clipboard&#39;;&#xA;      popup.setAttribute(&#39;style&#39;, &#39;position:fixed; bottom:24px; left:24px; background:#222; color:#fff; padding:8px 18px; border-radius:6px; font-size:0.8em; white-space:nowrap; z-index:9999; box-shadow:0 2px 8px rgba(0,0,0,0.15); transform:translateY(100px); opacity:0; transition:transform 0.3s cubic-bezier(.4,0,.2,1), opacity 0.3s cubic-bezier(.4,0,.2,1);&#39;);&#xA;      document.body.appendChild(popup);&#xA;    }&#xA;    popup.style.display = &#39;block&#39;;&#xA;    &#xA;    void popup.offsetWidth;&#xA;    popup.style.transform = &#39;translateY(0)&#39;;&#xA;    popup.style.opacity = &#39;1&#39;;&#xA;    clearTimeout(window.__copyPopupTimeout);&#xA;    window.__copyPopupTimeout = setTimeout(() =&gt; {&#xA;      popup.style.transform = &#39;translateY(100px)&#39;;&#xA;      popup.style.opacity = &#39;0&#39;;&#xA;      setTimeout(() =&gt; { popup.style.display = &#39;none&#39;; }, 300);&#xA;    }, 1200);&#xA;  }&#xA;&lt;/script&gt;&lt;/h2&gt;&#xA;&lt;ol&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;Ensure you have a gcp project with billing enabled and &lt;a href=&#34;https://cloud.google.com/kubernetes-engine/docs/how-to/enable-gkee&#34;&gt;enabled the GKE API&lt;/a&gt;.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Fine-tune gemma-2-9b and track as an experiment in MLFlow</title>
      <link>https://gke-ai-labs.dev/docs/tutorials/frameworks-and-pipelines/mlflow/</link>
      <pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate>
      <guid>https://gke-ai-labs.dev/docs/tutorials/frameworks-and-pipelines/mlflow/</guid>
      <description>&lt;p&gt;Data scientists often run a lot of experiments and it&amp;rsquo;s essential to be sure that the best run won&amp;rsquo;t be lost in numerous experiments. MLFlow helps to track experiments, datasets, metrics, and other data. GKE clusters can provide a lot of resources on demand.&lt;/p&gt;&#xA;&lt;h2 id=&#34;the-tutorial-overview&#34;&gt;The tutorial overview&lt;a class=&#34;td-heading-self-link&#34;&#xA;  onclick=&#34;copyHeadingLink(this, &#39;the-tutorial-overview&#39;); event.preventDefault();&#34;&#xA;  onmousedown=&#34;this.classList.add(&#39;active-link&#39;);&#34;&#xA;  onmouseup=&#34;this.classList.remove(&#39;active-link&#39;);&#34;&#xA;  onmouseleave=&#34;this.classList.remove(&#39;active-link&#39;);&#34;&#xA;  href=&#34;#the-tutorial-overview&#34; aria-label=&#34;Heading self-link&#34;&#xA;  title=&#34;Copy link to this section: The tutorial overview&#34;&gt;&lt;i class=&#34;fa-solid fa-link&#34;&gt;&lt;/i&gt;&lt;/a&gt;&#xA;&lt;style&gt;&#xA;  .td-heading-self-link {&#xA;    transition: background 0.2s;&#xA;    border-radius: 4px;&#xA;    padding: 2px;&#xA;  }&#xA;  .td-heading-self-link.active-link {&#xA;    background: #e0e7ef;&#xA;    transition: background 0.2s;&#xA;  }&#xA;&lt;/style&gt;&#xA;&lt;script&gt;&#xA;  function copyHeadingLink(anchor, anchorId) {&#xA;    navigator.clipboard.writeText(location.origin + location.pathname + &#39;#&#39; + anchorId);&#xA;    let popup = document.getElementById(&#39;global-copy-popup&#39;);&#xA;    if (!popup) {&#xA;      &#xA;      popup = document.createElement(&#39;span&#39;);&#xA;      popup.id = &#39;global-copy-popup&#39;;&#xA;      popup.className = &#39;copy-popup&#39;;&#xA;      popup.textContent = &#39;Copied to clipboard&#39;;&#xA;      popup.setAttribute(&#39;style&#39;, &#39;position:fixed; bottom:24px; left:24px; background:#222; color:#fff; padding:8px 18px; border-radius:6px; font-size:0.8em; white-space:nowrap; z-index:9999; box-shadow:0 2px 8px rgba(0,0,0,0.15); transform:translateY(100px); opacity:0; transition:transform 0.3s cubic-bezier(.4,0,.2,1), opacity 0.3s cubic-bezier(.4,0,.2,1);&#39;);&#xA;      document.body.appendChild(popup);&#xA;    }&#xA;    popup.style.display = &#39;block&#39;;&#xA;    &#xA;    void popup.offsetWidth;&#xA;    popup.style.transform = &#39;translateY(0)&#39;;&#xA;    popup.style.opacity = &#39;1&#39;;&#xA;    clearTimeout(window.__copyPopupTimeout);&#xA;    window.__copyPopupTimeout = setTimeout(() =&gt; {&#xA;      popup.style.transform = &#39;translateY(100px)&#39;;&#xA;      popup.style.opacity = &#39;0&#39;;&#xA;      setTimeout(() =&gt; { popup.style.display = &#39;none&#39;; }, 300);&#xA;    }, 1200);&#xA;  }&#xA;&lt;/script&gt;&lt;/h2&gt;&#xA;&lt;p&gt;In this tutorial we will fine-tune gemma-2-9b using LoRA as an experiment in MLFlow. We will deploy MLFlow on a GKE cluster and set up MLFlow to store artifacts inside a GCS bucket. In the end, we will deploy a fine-tuned model using KServe.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Models as OCI</title>
      <link>https://gke-ai-labs.dev/docs/tutorials/storage/models-as-oci/</link>
      <pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate>
      <guid>https://gke-ai-labs.dev/docs/tutorials/storage/models-as-oci/</guid>
      <description>&lt;h2 id=&#34;package-and-deploy-from-hugging-face-to-artifact-registry-and-gke&#34;&gt;Package and Deploy from Hugging Face to Artifact Registry and GKE&lt;a class=&#34;td-heading-self-link&#34;&#xA;  onclick=&#34;copyHeadingLink(this, &#39;package-and-deploy-from-hugging-face-to-artifact-registry-and-gke&#39;); event.preventDefault();&#34;&#xA;  onmousedown=&#34;this.classList.add(&#39;active-link&#39;);&#34;&#xA;  onmouseup=&#34;this.classList.remove(&#39;active-link&#39;);&#34;&#xA;  onmouseleave=&#34;this.classList.remove(&#39;active-link&#39;);&#34;&#xA;  href=&#34;#package-and-deploy-from-hugging-face-to-artifact-registry-and-gke&#34; aria-label=&#34;Heading self-link&#34;&#xA;  title=&#34;Copy link to this section: Package and Deploy from Hugging Face to Artifact Registry and GKE&#34;&gt;&lt;i class=&#34;fa-solid fa-link&#34;&gt;&lt;/i&gt;&lt;/a&gt;&#xA;&lt;style&gt;&#xA;  .td-heading-self-link {&#xA;    transition: background 0.2s;&#xA;    border-radius: 4px;&#xA;    padding: 2px;&#xA;  }&#xA;  .td-heading-self-link.active-link {&#xA;    background: #e0e7ef;&#xA;    transition: background 0.2s;&#xA;  }&#xA;&lt;/style&gt;&#xA;&lt;script&gt;&#xA;  function copyHeadingLink(anchor, anchorId) {&#xA;    navigator.clipboard.writeText(location.origin + location.pathname + &#39;#&#39; + anchorId);&#xA;    let popup = document.getElementById(&#39;global-copy-popup&#39;);&#xA;    if (!popup) {&#xA;      &#xA;      popup = document.createElement(&#39;span&#39;);&#xA;      popup.id = &#39;global-copy-popup&#39;;&#xA;      popup.className = &#39;copy-popup&#39;;&#xA;      popup.textContent = &#39;Copied to clipboard&#39;;&#xA;      popup.setAttribute(&#39;style&#39;, &#39;position:fixed; bottom:24px; left:24px; background:#222; color:#fff; padding:8px 18px; border-radius:6px; font-size:0.8em; white-space:nowrap; z-index:9999; box-shadow:0 2px 8px rgba(0,0,0,0.15); transform:translateY(100px); opacity:0; transition:transform 0.3s cubic-bezier(.4,0,.2,1), opacity 0.3s cubic-bezier(.4,0,.2,1);&#39;);&#xA;      document.body.appendChild(popup);&#xA;    }&#xA;    popup.style.display = &#39;block&#39;;&#xA;    &#xA;    void popup.offsetWidth;&#xA;    popup.style.transform = &#39;translateY(0)&#39;;&#xA;    popup.style.opacity = &#39;1&#39;;&#xA;    clearTimeout(window.__copyPopupTimeout);&#xA;    window.__copyPopupTimeout = setTimeout(() =&gt; {&#xA;      popup.style.transform = &#39;translateY(100px)&#39;;&#xA;      popup.style.opacity = &#39;0&#39;;&#xA;      setTimeout(() =&gt; { popup.style.display = &#39;none&#39;; }, 300);&#xA;    }, 1200);&#xA;  }&#xA;&lt;/script&gt;&lt;/h2&gt;&#xA;&lt;p&gt;This repository contains a Google Cloud Build configuration for building and pushing Docker images of Hugging Face models to Google Artifact Registry.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Multikueue, DWS and GKE Autopilot</title>
      <link>https://gke-ai-labs.dev/docs/tutorials/workflow-orchestration/multikueue-dws/</link>
      <pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate>
      <guid>https://gke-ai-labs.dev/docs/tutorials/workflow-orchestration/multikueue-dws/</guid>
      <description>&lt;p&gt;This repository provides the files needed to demonstrate how to use &lt;a href=&#34;https://kueue.sigs.k8s.io/docs/concepts/multikueue/&#34;&gt;MultiKueue&lt;/a&gt; with &lt;a href=&#34;https://cloud.google.com/blog/products/compute/introducing-dynamic-workload-scheduler?e=48754805&#34;&gt;Dynamic Workload Scheduler&lt;/a&gt; (DWS) and &lt;a href=&#34;https://cloud.google.com/kubernetes-engine/docs/concepts/autopilot-overview&#34;&gt;GKE Autopilot&lt;/a&gt;.  This setup allows you to run workloads across multiple GKE clusters in different regions, automatically leveraging available GPU resources thanks to DWS.&lt;/p&gt;&#xA;&lt;h2 id=&#34;prerequisites&#34;&gt;Prerequisites&lt;a class=&#34;td-heading-self-link&#34;&#xA;  onclick=&#34;copyHeadingLink(this, &#39;prerequisites&#39;); event.preventDefault();&#34;&#xA;  onmousedown=&#34;this.classList.add(&#39;active-link&#39;);&#34;&#xA;  onmouseup=&#34;this.classList.remove(&#39;active-link&#39;);&#34;&#xA;  onmouseleave=&#34;this.classList.remove(&#39;active-link&#39;);&#34;&#xA;  href=&#34;#prerequisites&#34; aria-label=&#34;Heading self-link&#34;&#xA;  title=&#34;Copy link to this section: Prerequisites&#34;&gt;&lt;i class=&#34;fa-solid fa-link&#34;&gt;&lt;/i&gt;&lt;/a&gt;&#xA;&lt;style&gt;&#xA;  .td-heading-self-link {&#xA;    transition: background 0.2s;&#xA;    border-radius: 4px;&#xA;    padding: 2px;&#xA;  }&#xA;  .td-heading-self-link.active-link {&#xA;    background: #e0e7ef;&#xA;    transition: background 0.2s;&#xA;  }&#xA;&lt;/style&gt;&#xA;&lt;script&gt;&#xA;  function copyHeadingLink(anchor, anchorId) {&#xA;    navigator.clipboard.writeText(location.origin + location.pathname + &#39;#&#39; + anchorId);&#xA;    let popup = document.getElementById(&#39;global-copy-popup&#39;);&#xA;    if (!popup) {&#xA;      &#xA;      popup = document.createElement(&#39;span&#39;);&#xA;      popup.id = &#39;global-copy-popup&#39;;&#xA;      popup.className = &#39;copy-popup&#39;;&#xA;      popup.textContent = &#39;Copied to clipboard&#39;;&#xA;      popup.setAttribute(&#39;style&#39;, &#39;position:fixed; bottom:24px; left:24px; background:#222; color:#fff; padding:8px 18px; border-radius:6px; font-size:0.8em; white-space:nowrap; z-index:9999; box-shadow:0 2px 8px rgba(0,0,0,0.15); transform:translateY(100px); opacity:0; transition:transform 0.3s cubic-bezier(.4,0,.2,1), opacity 0.3s cubic-bezier(.4,0,.2,1);&#39;);&#xA;      document.body.appendChild(popup);&#xA;    }&#xA;    popup.style.display = &#39;block&#39;;&#xA;    &#xA;    void popup.offsetWidth;&#xA;    popup.style.transform = &#39;translateY(0)&#39;;&#xA;    popup.style.opacity = &#39;1&#39;;&#xA;    clearTimeout(window.__copyPopupTimeout);&#xA;    window.__copyPopupTimeout = setTimeout(() =&gt; {&#xA;      popup.style.transform = &#39;translateY(100px)&#39;;&#xA;      popup.style.opacity = &#39;0&#39;;&#xA;      setTimeout(() =&gt; { popup.style.display = &#39;none&#39;; }, 300);&#xA;    }, 1200);&#xA;  }&#xA;&lt;/script&gt;&lt;/h2&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://cloud.google.com/&#34;&gt;Google Cloud&lt;/a&gt; account set up.&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://pypi.org/project/gcloud/&#34;&gt;gcloud&lt;/a&gt; command line tool installed and configured to use your GCP project.&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://kubernetes.io/docs/tasks/tools/&#34;&gt;kubectl&lt;/a&gt; command line utility is installed.&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://developer.hashicorp.com/terraform/install&#34;&gt;terraform&lt;/a&gt; command line installed.&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h2 id=&#34;check-out-the-necessary-code-files&#34;&gt;Check out the necessary code files:&lt;a class=&#34;td-heading-self-link&#34;&#xA;  onclick=&#34;copyHeadingLink(this, &#39;check-out-the-necessary-code-files&#39;); event.preventDefault();&#34;&#xA;  onmousedown=&#34;this.classList.add(&#39;active-link&#39;);&#34;&#xA;  onmouseup=&#34;this.classList.remove(&#39;active-link&#39;);&#34;&#xA;  onmouseleave=&#34;this.classList.remove(&#39;active-link&#39;);&#34;&#xA;  href=&#34;#check-out-the-necessary-code-files&#34; aria-label=&#34;Heading self-link&#34;&#xA;  title=&#34;Copy link to this section: Check out the necessary code files:&#34;&gt;&lt;i class=&#34;fa-solid fa-link&#34;&gt;&lt;/i&gt;&lt;/a&gt;&#xA;&lt;style&gt;&#xA;  .td-heading-self-link {&#xA;    transition: background 0.2s;&#xA;    border-radius: 4px;&#xA;    padding: 2px;&#xA;  }&#xA;  .td-heading-self-link.active-link {&#xA;    background: #e0e7ef;&#xA;    transition: background 0.2s;&#xA;  }&#xA;&lt;/style&gt;&#xA;&lt;script&gt;&#xA;  function copyHeadingLink(anchor, anchorId) {&#xA;    navigator.clipboard.writeText(location.origin + location.pathname + &#39;#&#39; + anchorId);&#xA;    let popup = document.getElementById(&#39;global-copy-popup&#39;);&#xA;    if (!popup) {&#xA;      &#xA;      popup = document.createElement(&#39;span&#39;);&#xA;      popup.id = &#39;global-copy-popup&#39;;&#xA;      popup.className = &#39;copy-popup&#39;;&#xA;      popup.textContent = &#39;Copied to clipboard&#39;;&#xA;      popup.setAttribute(&#39;style&#39;, &#39;position:fixed; bottom:24px; left:24px; background:#222; color:#fff; padding:8px 18px; border-radius:6px; font-size:0.8em; white-space:nowrap; z-index:9999; box-shadow:0 2px 8px rgba(0,0,0,0.15); transform:translateY(100px); opacity:0; transition:transform 0.3s cubic-bezier(.4,0,.2,1), opacity 0.3s cubic-bezier(.4,0,.2,1);&#39;);&#xA;      document.body.appendChild(popup);&#xA;    }&#xA;    popup.style.display = &#39;block&#39;;&#xA;    &#xA;    void popup.offsetWidth;&#xA;    popup.style.transform = &#39;translateY(0)&#39;;&#xA;    popup.style.opacity = &#39;1&#39;;&#xA;    clearTimeout(window.__copyPopupTimeout);&#xA;    window.__copyPopupTimeout = setTimeout(() =&gt; {&#xA;      popup.style.transform = &#39;translateY(100px)&#39;;&#xA;      popup.style.opacity = &#39;0&#39;;&#xA;      setTimeout(() =&gt; { popup.style.display = &#39;none&#39;; }, 300);&#xA;    }, 1200);&#xA;  }&#xA;&lt;/script&gt;&lt;/h2&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;git clone https://github.com/ai-on-gke/tutorials-and-examples.git&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;cd tutorials-and-examples/workflow-orchestration/multikueue-dws&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id=&#34;repository-contents&#34;&gt;Repository Contents&lt;a class=&#34;td-heading-self-link&#34;&#xA;  onclick=&#34;copyHeadingLink(this, &#39;repository-contents&#39;); event.preventDefault();&#34;&#xA;  onmousedown=&#34;this.classList.add(&#39;active-link&#39;);&#34;&#xA;  onmouseup=&#34;this.classList.remove(&#39;active-link&#39;);&#34;&#xA;  onmouseleave=&#34;this.classList.remove(&#39;active-link&#39;);&#34;&#xA;  href=&#34;#repository-contents&#34; aria-label=&#34;Heading self-link&#34;&#xA;  title=&#34;Copy link to this section: Repository Contents&#34;&gt;&lt;i class=&#34;fa-solid fa-link&#34;&gt;&lt;/i&gt;&lt;/a&gt;&#xA;&lt;style&gt;&#xA;  .td-heading-self-link {&#xA;    transition: background 0.2s;&#xA;    border-radius: 4px;&#xA;    padding: 2px;&#xA;  }&#xA;  .td-heading-self-link.active-link {&#xA;    background: #e0e7ef;&#xA;    transition: background 0.2s;&#xA;  }&#xA;&lt;/style&gt;&#xA;&lt;script&gt;&#xA;  function copyHeadingLink(anchor, anchorId) {&#xA;    navigator.clipboard.writeText(location.origin + location.pathname + &#39;#&#39; + anchorId);&#xA;    let popup = document.getElementById(&#39;global-copy-popup&#39;);&#xA;    if (!popup) {&#xA;      &#xA;      popup = document.createElement(&#39;span&#39;);&#xA;      popup.id = &#39;global-copy-popup&#39;;&#xA;      popup.className = &#39;copy-popup&#39;;&#xA;      popup.textContent = &#39;Copied to clipboard&#39;;&#xA;      popup.setAttribute(&#39;style&#39;, &#39;position:fixed; bottom:24px; left:24px; background:#222; color:#fff; padding:8px 18px; border-radius:6px; font-size:0.8em; white-space:nowrap; z-index:9999; box-shadow:0 2px 8px rgba(0,0,0,0.15); transform:translateY(100px); opacity:0; transition:transform 0.3s cubic-bezier(.4,0,.2,1), opacity 0.3s cubic-bezier(.4,0,.2,1);&#39;);&#xA;      document.body.appendChild(popup);&#xA;    }&#xA;    popup.style.display = &#39;block&#39;;&#xA;    &#xA;    void popup.offsetWidth;&#xA;    popup.style.transform = &#39;translateY(0)&#39;;&#xA;    popup.style.opacity = &#39;1&#39;;&#xA;    clearTimeout(window.__copyPopupTimeout);&#xA;    window.__copyPopupTimeout = setTimeout(() =&gt; {&#xA;      popup.style.transform = &#39;translateY(100px)&#39;;&#xA;      popup.style.opacity = &#39;0&#39;;&#xA;      setTimeout(() =&gt; { popup.style.display = &#39;none&#39;; }, 300);&#xA;    }, 1200);&#xA;  }&#xA;&lt;/script&gt;&lt;/h3&gt;&#xA;&lt;p&gt;This repository contains the following files:&lt;/p&gt;</description>
    </item>
    <item>
      <title>NVIDIA NeMo</title>
      <link>https://gke-ai-labs.dev/docs/blueprints/nemo/</link>
      <pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate>
      <guid>https://gke-ai-labs.dev/docs/blueprints/nemo/</guid>
      <description>&lt;h1 id=&#34;nemo-framework-on-google-kubernetes-engine-gke-to-train-megatron-lm&#34;&gt;NeMo Framework on Google Kubernetes Engine (GKE) to train Megatron LM&lt;a class=&#34;td-heading-self-link&#34;&#xA;  onclick=&#34;copyHeadingLink(this, &#39;nemo-framework-on-google-kubernetes-engine-gke-to-train-megatron-lm&#39;); event.preventDefault();&#34;&#xA;  onmousedown=&#34;this.classList.add(&#39;active-link&#39;);&#34;&#xA;  onmouseup=&#34;this.classList.remove(&#39;active-link&#39;);&#34;&#xA;  onmouseleave=&#34;this.classList.remove(&#39;active-link&#39;);&#34;&#xA;  href=&#34;#nemo-framework-on-google-kubernetes-engine-gke-to-train-megatron-lm&#34; aria-label=&#34;Heading self-link&#34;&#xA;  title=&#34;Copy link to this section: NeMo Framework on Google Kubernetes Engine (GKE) to train Megatron LM&#34;&gt;&lt;i class=&#34;fa-solid fa-link&#34;&gt;&lt;/i&gt;&lt;/a&gt;&#xA;&lt;style&gt;&#xA;  .td-heading-self-link {&#xA;    transition: background 0.2s;&#xA;    border-radius: 4px;&#xA;    padding: 2px;&#xA;  }&#xA;  .td-heading-self-link.active-link {&#xA;    background: #e0e7ef;&#xA;    transition: background 0.2s;&#xA;  }&#xA;&lt;/style&gt;&#xA;&lt;script&gt;&#xA;  function copyHeadingLink(anchor, anchorId) {&#xA;    navigator.clipboard.writeText(location.origin + location.pathname + &#39;#&#39; + anchorId);&#xA;    let popup = document.getElementById(&#39;global-copy-popup&#39;);&#xA;    if (!popup) {&#xA;      &#xA;      popup = document.createElement(&#39;span&#39;);&#xA;      popup.id = &#39;global-copy-popup&#39;;&#xA;      popup.className = &#39;copy-popup&#39;;&#xA;      popup.textContent = &#39;Copied to clipboard&#39;;&#xA;      popup.setAttribute(&#39;style&#39;, &#39;position:fixed; bottom:24px; left:24px; background:#222; color:#fff; padding:8px 18px; border-radius:6px; font-size:0.8em; white-space:nowrap; z-index:9999; box-shadow:0 2px 8px rgba(0,0,0,0.15); transform:translateY(100px); opacity:0; transition:transform 0.3s cubic-bezier(.4,0,.2,1), opacity 0.3s cubic-bezier(.4,0,.2,1);&#39;);&#xA;      document.body.appendChild(popup);&#xA;    }&#xA;    popup.style.display = &#39;block&#39;;&#xA;    &#xA;    void popup.offsetWidth;&#xA;    popup.style.transform = &#39;translateY(0)&#39;;&#xA;    popup.style.opacity = &#39;1&#39;;&#xA;    clearTimeout(window.__copyPopupTimeout);&#xA;    window.__copyPopupTimeout = setTimeout(() =&gt; {&#xA;      popup.style.transform = &#39;translateY(100px)&#39;;&#xA;      popup.style.opacity = &#39;0&#39;;&#xA;      setTimeout(() =&gt; { popup.style.display = &#39;none&#39;; }, 300);&#xA;    }, 1200);&#xA;  }&#xA;&lt;/script&gt;&lt;/h1&gt;&#xA;&lt;p&gt;This repository contains an end-to-end walkthrough of training NVIDIA&amp;rsquo;s NeMo Megatron Large Language Model (LLM) using NeMo framework on Google Kubernetes Engine.&lt;/p&gt;</description>
    </item>
    <item>
      <title>RAG on GKE</title>
      <link>https://gke-ai-labs.dev/docs/blueprints/rag-on-gke/</link>
      <pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate>
      <guid>https://gke-ai-labs.dev/docs/blueprints/rag-on-gke/</guid>
      <description>&lt;p&gt;This is a sample to deploy a Retrieval Augmented Generation (RAG) application on GKE.&lt;/p&gt;&#xA;&#xA;&#xA;&lt;div class=&#34;alert alert-note&#34;&gt;&#xA;  &lt;div style=&#34;display: flex;&#34;&gt;&lt;span class=&#34;material-symbols-outlined&#34;&gt;&#xA;    star&#xA;    &lt;/span&gt;&lt;/div&gt;&#xA;  &lt;div class=&#34;alert-body&#34;&gt;&#xA;    &lt;span class=&#34;title-note&#34;&gt;&lt;p&gt;The latest recommended release is branch release-1.1.&lt;/p&gt;&lt;/span&gt;&#xA;  &lt;/div&gt;&#xA;&lt;/div&gt;&#xA;&lt;h2 id=&#34;what-is-rag&#34;&gt;What is RAG?&lt;a class=&#34;td-heading-self-link&#34;&#xA;  onclick=&#34;copyHeadingLink(this, &#39;what-is-rag&#39;); event.preventDefault();&#34;&#xA;  onmousedown=&#34;this.classList.add(&#39;active-link&#39;);&#34;&#xA;  onmouseup=&#34;this.classList.remove(&#39;active-link&#39;);&#34;&#xA;  onmouseleave=&#34;this.classList.remove(&#39;active-link&#39;);&#34;&#xA;  href=&#34;#what-is-rag&#34; aria-label=&#34;Heading self-link&#34;&#xA;  title=&#34;Copy link to this section: What is RAG?&#34;&gt;&lt;i class=&#34;fa-solid fa-link&#34;&gt;&lt;/i&gt;&lt;/a&gt;&#xA;&lt;style&gt;&#xA;  .td-heading-self-link {&#xA;    transition: background 0.2s;&#xA;    border-radius: 4px;&#xA;    padding: 2px;&#xA;  }&#xA;  .td-heading-self-link.active-link {&#xA;    background: #e0e7ef;&#xA;    transition: background 0.2s;&#xA;  }&#xA;&lt;/style&gt;&#xA;&lt;script&gt;&#xA;  function copyHeadingLink(anchor, anchorId) {&#xA;    navigator.clipboard.writeText(location.origin + location.pathname + &#39;#&#39; + anchorId);&#xA;    let popup = document.getElementById(&#39;global-copy-popup&#39;);&#xA;    if (!popup) {&#xA;      &#xA;      popup = document.createElement(&#39;span&#39;);&#xA;      popup.id = &#39;global-copy-popup&#39;;&#xA;      popup.className = &#39;copy-popup&#39;;&#xA;      popup.textContent = &#39;Copied to clipboard&#39;;&#xA;      popup.setAttribute(&#39;style&#39;, &#39;position:fixed; bottom:24px; left:24px; background:#222; color:#fff; padding:8px 18px; border-radius:6px; font-size:0.8em; white-space:nowrap; z-index:9999; box-shadow:0 2px 8px rgba(0,0,0,0.15); transform:translateY(100px); opacity:0; transition:transform 0.3s cubic-bezier(.4,0,.2,1), opacity 0.3s cubic-bezier(.4,0,.2,1);&#39;);&#xA;      document.body.appendChild(popup);&#xA;    }&#xA;    popup.style.display = &#39;block&#39;;&#xA;    &#xA;    void popup.offsetWidth;&#xA;    popup.style.transform = &#39;translateY(0)&#39;;&#xA;    popup.style.opacity = &#39;1&#39;;&#xA;    clearTimeout(window.__copyPopupTimeout);&#xA;    window.__copyPopupTimeout = setTimeout(() =&gt; {&#xA;      popup.style.transform = &#39;translateY(100px)&#39;;&#xA;      popup.style.opacity = &#39;0&#39;;&#xA;      setTimeout(() =&gt; { popup.style.display = &#39;none&#39;; }, 300);&#xA;    }, 1200);&#xA;  }&#xA;&lt;/script&gt;&lt;/h2&gt;&#xA;&lt;p&gt;&lt;a href=&#34;https://cloud.google.com/blog/products/ai-machine-learning/rag-with-databases-on-google-cloud&#34;&gt;RAG&lt;/a&gt; is a popular approach for boosting the accuracy of LLM responses, particularly for domain specific or private data sets.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Ray on GKE</title>
      <link>https://gke-ai-labs.dev/docs/tutorials/workflow-orchestration/ray-on-gke/</link>
      <pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate>
      <guid>https://gke-ai-labs.dev/docs/tutorials/workflow-orchestration/ray-on-gke/</guid>
      <description>&lt;p&gt;This directory contains examples, guides and best practices for running &lt;a href=&#34;https://www.ray.io/&#34;&gt;Ray&lt;/a&gt; on Google Kubernetes Engine.&#xA;Most examples use the &lt;a href=&#34;https://github.com/ai-on-gke/quick-start-guides/tree/main/ray-on-gke&#34;&gt;&lt;code&gt;ray-on-gke&lt;/code&gt;&lt;/a&gt; terraform module to install KubeRay and deploy RayCluster resources.&lt;/p&gt;&#xA;&lt;h2 id=&#34;getting-started&#34;&gt;Getting Started&lt;a class=&#34;td-heading-self-link&#34;&#xA;  onclick=&#34;copyHeadingLink(this, &#39;getting-started&#39;); event.preventDefault();&#34;&#xA;  onmousedown=&#34;this.classList.add(&#39;active-link&#39;);&#34;&#xA;  onmouseup=&#34;this.classList.remove(&#39;active-link&#39;);&#34;&#xA;  onmouseleave=&#34;this.classList.remove(&#39;active-link&#39;);&#34;&#xA;  href=&#34;#getting-started&#34; aria-label=&#34;Heading self-link&#34;&#xA;  title=&#34;Copy link to this section: Getting Started&#34;&gt;&lt;i class=&#34;fa-solid fa-link&#34;&gt;&lt;/i&gt;&lt;/a&gt;&#xA;&lt;style&gt;&#xA;  .td-heading-self-link {&#xA;    transition: background 0.2s;&#xA;    border-radius: 4px;&#xA;    padding: 2px;&#xA;  }&#xA;  .td-heading-self-link.active-link {&#xA;    background: #e0e7ef;&#xA;    transition: background 0.2s;&#xA;  }&#xA;&lt;/style&gt;&#xA;&lt;script&gt;&#xA;  function copyHeadingLink(anchor, anchorId) {&#xA;    navigator.clipboard.writeText(location.origin + location.pathname + &#39;#&#39; + anchorId);&#xA;    let popup = document.getElementById(&#39;global-copy-popup&#39;);&#xA;    if (!popup) {&#xA;      &#xA;      popup = document.createElement(&#39;span&#39;);&#xA;      popup.id = &#39;global-copy-popup&#39;;&#xA;      popup.className = &#39;copy-popup&#39;;&#xA;      popup.textContent = &#39;Copied to clipboard&#39;;&#xA;      popup.setAttribute(&#39;style&#39;, &#39;position:fixed; bottom:24px; left:24px; background:#222; color:#fff; padding:8px 18px; border-radius:6px; font-size:0.8em; white-space:nowrap; z-index:9999; box-shadow:0 2px 8px rgba(0,0,0,0.15); transform:translateY(100px); opacity:0; transition:transform 0.3s cubic-bezier(.4,0,.2,1), opacity 0.3s cubic-bezier(.4,0,.2,1);&#39;);&#xA;      document.body.appendChild(popup);&#xA;    }&#xA;    popup.style.display = &#39;block&#39;;&#xA;    &#xA;    void popup.offsetWidth;&#xA;    popup.style.transform = &#39;translateY(0)&#39;;&#xA;    popup.style.opacity = &#39;1&#39;;&#xA;    clearTimeout(window.__copyPopupTimeout);&#xA;    window.__copyPopupTimeout = setTimeout(() =&gt; {&#xA;      popup.style.transform = &#39;translateY(100px)&#39;;&#xA;      popup.style.opacity = &#39;0&#39;;&#xA;      setTimeout(() =&gt; { popup.style.display = &#39;none&#39;; }, 300);&#xA;    }, 1200);&#xA;  }&#xA;&lt;/script&gt;&lt;/h2&gt;&#xA;&lt;p&gt;It is highly recommended to use the &lt;a href=&#34;https://github.com/ai-on-gke/common-infra/tree/main/common/infrastructure&#34;&gt;infrastructure&lt;/a&gt; terraform module to create your GKE cluster.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Using TPUs with KubeRay on GKE</title>
      <link>https://gke-ai-labs.dev/docs/tutorials/gpu-tpu/ray-gke-tpus/</link>
      <pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate>
      <guid>https://gke-ai-labs.dev/docs/tutorials/gpu-tpu/ray-gke-tpus/</guid>
      <description>&lt;p&gt;This directory contains instructions for running &lt;a href=&#34;https://github.com/ray-project/kuberay&#34;&gt;KubeRay&lt;/a&gt; with &lt;a href=&#34;https://cloud.google.com/tpu?hl=en&#34;&gt;TPUs&lt;/a&gt; on Google Kubernetes Engine. This includes instructions for installing the &lt;a href=&#34;https://github.com/ai-on-gke/kuberay-tpu-webhook/tree/main&#34;&gt;KubeRay TPU webhook&lt;/a&gt; to enable multi-host TPU workloads.&lt;/p&gt;&#xA;&lt;h2 id=&#34;prerequisites&#34;&gt;Prerequisites&lt;a class=&#34;td-heading-self-link&#34;&#xA;  onclick=&#34;copyHeadingLink(this, &#39;prerequisites&#39;); event.preventDefault();&#34;&#xA;  onmousedown=&#34;this.classList.add(&#39;active-link&#39;);&#34;&#xA;  onmouseup=&#34;this.classList.remove(&#39;active-link&#39;);&#34;&#xA;  onmouseleave=&#34;this.classList.remove(&#39;active-link&#39;);&#34;&#xA;  href=&#34;#prerequisites&#34; aria-label=&#34;Heading self-link&#34;&#xA;  title=&#34;Copy link to this section: Prerequisites&#34;&gt;&lt;i class=&#34;fa-solid fa-link&#34;&gt;&lt;/i&gt;&lt;/a&gt;&#xA;&lt;style&gt;&#xA;  .td-heading-self-link {&#xA;    transition: background 0.2s;&#xA;    border-radius: 4px;&#xA;    padding: 2px;&#xA;  }&#xA;  .td-heading-self-link.active-link {&#xA;    background: #e0e7ef;&#xA;    transition: background 0.2s;&#xA;  }&#xA;&lt;/style&gt;&#xA;&lt;script&gt;&#xA;  function copyHeadingLink(anchor, anchorId) {&#xA;    navigator.clipboard.writeText(location.origin + location.pathname + &#39;#&#39; + anchorId);&#xA;    let popup = document.getElementById(&#39;global-copy-popup&#39;);&#xA;    if (!popup) {&#xA;      &#xA;      popup = document.createElement(&#39;span&#39;);&#xA;      popup.id = &#39;global-copy-popup&#39;;&#xA;      popup.className = &#39;copy-popup&#39;;&#xA;      popup.textContent = &#39;Copied to clipboard&#39;;&#xA;      popup.setAttribute(&#39;style&#39;, &#39;position:fixed; bottom:24px; left:24px; background:#222; color:#fff; padding:8px 18px; border-radius:6px; font-size:0.8em; white-space:nowrap; z-index:9999; box-shadow:0 2px 8px rgba(0,0,0,0.15); transform:translateY(100px); opacity:0; transition:transform 0.3s cubic-bezier(.4,0,.2,1), opacity 0.3s cubic-bezier(.4,0,.2,1);&#39;);&#xA;      document.body.appendChild(popup);&#xA;    }&#xA;    popup.style.display = &#39;block&#39;;&#xA;    &#xA;    void popup.offsetWidth;&#xA;    popup.style.transform = &#39;translateY(0)&#39;;&#xA;    popup.style.opacity = &#39;1&#39;;&#xA;    clearTimeout(window.__copyPopupTimeout);&#xA;    window.__copyPopupTimeout = setTimeout(() =&gt; {&#xA;      popup.style.transform = &#39;translateY(100px)&#39;;&#xA;      popup.style.opacity = &#39;0&#39;;&#xA;      setTimeout(() =&gt; { popup.style.display = &#39;none&#39;; }, 300);&#xA;    }, 1200);&#xA;  }&#xA;&lt;/script&gt;&lt;/h2&gt;&#xA;&lt;p&gt;Please follow the official &lt;a href=&#34;https://cloud.google.com/tpu/docs/tpus-in-gke&#34;&gt;Google Cloud documentation&lt;/a&gt; for an introduction to TPUs. In particular, please ensure that your GCP project has sufficient quotas to provision the cluster, see &lt;a href=&#34;https://cloud.google.com/tpu/docs/tpus-in-gke#ensure-quotas&#34;&gt;this link&lt;/a&gt; for details.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Efficient GPU Resource Management for ML Workloads using SkyPilot, Kueue on GKE</title>
      <link>https://gke-ai-labs.dev/docs/tutorials/workflow-orchestration/skypilot/resource-management-using-kueue/</link>
      <pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate>
      <guid>https://gke-ai-labs.dev/docs/tutorials/workflow-orchestration/skypilot/resource-management-using-kueue/</guid>
      <description>&lt;p&gt;This tutorial expands on the &lt;a href=&#34;https://github.com/GoogleCloudPlatform/ai-on-gke/tree/main/tutorials-and-examples/skypilot&#34;&gt;SkyPilot Tutorial&lt;/a&gt; by leveraging &lt;a href=&#34;https://cloud.google.com/blog/products/compute/introducing-dynamic-workload-scheduler&#34;&gt;Dynamic Workload Scheduler&lt;/a&gt; with the help of an open-source project called &lt;a href=&#34;https://kueue.sigs.k8s.io/&#34;&gt;Kueue&lt;/a&gt;&#xA;Different from the SkyPilot tutorial, this guide shows how to use SkyPilot with Kueue on GKE to efficiently manage ML workloads with dynamic GPU provisioning.&lt;/p&gt;&#xA;&lt;h2 id=&#34;overview&#34;&gt;Overview&lt;a class=&#34;td-heading-self-link&#34;&#xA;  onclick=&#34;copyHeadingLink(this, &#39;overview&#39;); event.preventDefault();&#34;&#xA;  onmousedown=&#34;this.classList.add(&#39;active-link&#39;);&#34;&#xA;  onmouseup=&#34;this.classList.remove(&#39;active-link&#39;);&#34;&#xA;  onmouseleave=&#34;this.classList.remove(&#39;active-link&#39;);&#34;&#xA;  href=&#34;#overview&#34; aria-label=&#34;Heading self-link&#34;&#xA;  title=&#34;Copy link to this section: Overview&#34;&gt;&lt;i class=&#34;fa-solid fa-link&#34;&gt;&lt;/i&gt;&lt;/a&gt;&#xA;&lt;style&gt;&#xA;  .td-heading-self-link {&#xA;    transition: background 0.2s;&#xA;    border-radius: 4px;&#xA;    padding: 2px;&#xA;  }&#xA;  .td-heading-self-link.active-link {&#xA;    background: #e0e7ef;&#xA;    transition: background 0.2s;&#xA;  }&#xA;&lt;/style&gt;&#xA;&lt;script&gt;&#xA;  function copyHeadingLink(anchor, anchorId) {&#xA;    navigator.clipboard.writeText(location.origin + location.pathname + &#39;#&#39; + anchorId);&#xA;    let popup = document.getElementById(&#39;global-copy-popup&#39;);&#xA;    if (!popup) {&#xA;      &#xA;      popup = document.createElement(&#39;span&#39;);&#xA;      popup.id = &#39;global-copy-popup&#39;;&#xA;      popup.className = &#39;copy-popup&#39;;&#xA;      popup.textContent = &#39;Copied to clipboard&#39;;&#xA;      popup.setAttribute(&#39;style&#39;, &#39;position:fixed; bottom:24px; left:24px; background:#222; color:#fff; padding:8px 18px; border-radius:6px; font-size:0.8em; white-space:nowrap; z-index:9999; box-shadow:0 2px 8px rgba(0,0,0,0.15); transform:translateY(100px); opacity:0; transition:transform 0.3s cubic-bezier(.4,0,.2,1), opacity 0.3s cubic-bezier(.4,0,.2,1);&#39;);&#xA;      document.body.appendChild(popup);&#xA;    }&#xA;    popup.style.display = &#39;block&#39;;&#xA;    &#xA;    void popup.offsetWidth;&#xA;    popup.style.transform = &#39;translateY(0)&#39;;&#xA;    popup.style.opacity = &#39;1&#39;;&#xA;    clearTimeout(window.__copyPopupTimeout);&#xA;    window.__copyPopupTimeout = setTimeout(() =&gt; {&#xA;      popup.style.transform = &#39;translateY(100px)&#39;;&#xA;      popup.style.opacity = &#39;0&#39;;&#xA;      setTimeout(() =&gt; { popup.style.display = &#39;none&#39;; }, 300);&#xA;    }, 1200);&#xA;  }&#xA;&lt;/script&gt;&lt;/h2&gt;&#xA;&lt;p&gt;This tutorial is designed for ML Platform engineers who plan to use SkyPilot to train or serve LLM models on Google Kubernetes Engine (GKE) while utilizing Dynamic Workload Scheduler (DWS) to acquire GPU resources as they become available. It covers installing Kueue and Skypilot, creating a GKE cluster with queue processing enabled GPU node pools, and deploying and running a LLM model. This setup enhances resource efficiency and reduces cost for ML workloads through dynamic GPU provisioning.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Slurm on Google Kubernetes Engine (GKE)</title>
      <link>https://gke-ai-labs.dev/docs/tutorials/job-schedulers/slurm-on-gke/</link>
      <pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate>
      <guid>https://gke-ai-labs.dev/docs/tutorials/job-schedulers/slurm-on-gke/</guid>
      <description>&lt;h2 id=&#34;introduction&#34;&gt;Introduction&lt;a class=&#34;td-heading-self-link&#34;&#xA;  onclick=&#34;copyHeadingLink(this, &#39;introduction&#39;); event.preventDefault();&#34;&#xA;  onmousedown=&#34;this.classList.add(&#39;active-link&#39;);&#34;&#xA;  onmouseup=&#34;this.classList.remove(&#39;active-link&#39;);&#34;&#xA;  onmouseleave=&#34;this.classList.remove(&#39;active-link&#39;);&#34;&#xA;  href=&#34;#introduction&#34; aria-label=&#34;Heading self-link&#34;&#xA;  title=&#34;Copy link to this section: Introduction&#34;&gt;&lt;i class=&#34;fa-solid fa-link&#34;&gt;&lt;/i&gt;&lt;/a&gt;&#xA;&lt;style&gt;&#xA;  .td-heading-self-link {&#xA;    transition: background 0.2s;&#xA;    border-radius: 4px;&#xA;    padding: 2px;&#xA;  }&#xA;  .td-heading-self-link.active-link {&#xA;    background: #e0e7ef;&#xA;    transition: background 0.2s;&#xA;  }&#xA;&lt;/style&gt;&#xA;&lt;script&gt;&#xA;  function copyHeadingLink(anchor, anchorId) {&#xA;    navigator.clipboard.writeText(location.origin + location.pathname + &#39;#&#39; + anchorId);&#xA;    let popup = document.getElementById(&#39;global-copy-popup&#39;);&#xA;    if (!popup) {&#xA;      &#xA;      popup = document.createElement(&#39;span&#39;);&#xA;      popup.id = &#39;global-copy-popup&#39;;&#xA;      popup.className = &#39;copy-popup&#39;;&#xA;      popup.textContent = &#39;Copied to clipboard&#39;;&#xA;      popup.setAttribute(&#39;style&#39;, &#39;position:fixed; bottom:24px; left:24px; background:#222; color:#fff; padding:8px 18px; border-radius:6px; font-size:0.8em; white-space:nowrap; z-index:9999; box-shadow:0 2px 8px rgba(0,0,0,0.15); transform:translateY(100px); opacity:0; transition:transform 0.3s cubic-bezier(.4,0,.2,1), opacity 0.3s cubic-bezier(.4,0,.2,1);&#39;);&#xA;      document.body.appendChild(popup);&#xA;    }&#xA;    popup.style.display = &#39;block&#39;;&#xA;    &#xA;    void popup.offsetWidth;&#xA;    popup.style.transform = &#39;translateY(0)&#39;;&#xA;    popup.style.opacity = &#39;1&#39;;&#xA;    clearTimeout(window.__copyPopupTimeout);&#xA;    window.__copyPopupTimeout = setTimeout(() =&gt; {&#xA;      popup.style.transform = &#39;translateY(100px)&#39;;&#xA;      popup.style.opacity = &#39;0&#39;;&#xA;      setTimeout(() =&gt; { popup.style.display = &#39;none&#39;; }, 300);&#xA;    }, 1200);&#xA;  }&#xA;&lt;/script&gt;&lt;/h2&gt;&#xA;&lt;p&gt;This guide shows you how to deploy &lt;a href=&#34;https://slurm.schedmd.com/documentation.html&#34;&gt;Slurm&lt;/a&gt; on a Google Kubernetes Engine (GKE) cluster.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Time slicing of GPUs with DRA</title>
      <link>https://gke-ai-labs.dev/docs/tutorials/dynamic-resource-allocation/gpu-time-slicing/</link>
      <pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate>
      <guid>https://gke-ai-labs.dev/docs/tutorials/dynamic-resource-allocation/gpu-time-slicing/</guid>
      <description>&lt;h2 id=&#34;background&#34;&gt;&lt;strong&gt;Background&lt;/strong&gt;&lt;a class=&#34;td-heading-self-link&#34;&#xA;  onclick=&#34;copyHeadingLink(this, &#39;background&#39;); event.preventDefault();&#34;&#xA;  onmousedown=&#34;this.classList.add(&#39;active-link&#39;);&#34;&#xA;  onmouseup=&#34;this.classList.remove(&#39;active-link&#39;);&#34;&#xA;  onmouseleave=&#34;this.classList.remove(&#39;active-link&#39;);&#34;&#xA;  href=&#34;#background&#34; aria-label=&#34;Heading self-link&#34;&#xA;  title=&#34;Copy link to this section: Background&#34;&gt;&lt;i class=&#34;fa-solid fa-link&#34;&gt;&lt;/i&gt;&lt;/a&gt;&#xA;&lt;style&gt;&#xA;  .td-heading-self-link {&#xA;    transition: background 0.2s;&#xA;    border-radius: 4px;&#xA;    padding: 2px;&#xA;  }&#xA;  .td-heading-self-link.active-link {&#xA;    background: #e0e7ef;&#xA;    transition: background 0.2s;&#xA;  }&#xA;&lt;/style&gt;&#xA;&lt;script&gt;&#xA;  function copyHeadingLink(anchor, anchorId) {&#xA;    navigator.clipboard.writeText(location.origin + location.pathname + &#39;#&#39; + anchorId);&#xA;    let popup = document.getElementById(&#39;global-copy-popup&#39;);&#xA;    if (!popup) {&#xA;      &#xA;      popup = document.createElement(&#39;span&#39;);&#xA;      popup.id = &#39;global-copy-popup&#39;;&#xA;      popup.className = &#39;copy-popup&#39;;&#xA;      popup.textContent = &#39;Copied to clipboard&#39;;&#xA;      popup.setAttribute(&#39;style&#39;, &#39;position:fixed; bottom:24px; left:24px; background:#222; color:#fff; padding:8px 18px; border-radius:6px; font-size:0.8em; white-space:nowrap; z-index:9999; box-shadow:0 2px 8px rgba(0,0,0,0.15); transform:translateY(100px); opacity:0; transition:transform 0.3s cubic-bezier(.4,0,.2,1), opacity 0.3s cubic-bezier(.4,0,.2,1);&#39;);&#xA;      document.body.appendChild(popup);&#xA;    }&#xA;    popup.style.display = &#39;block&#39;;&#xA;    &#xA;    void popup.offsetWidth;&#xA;    popup.style.transform = &#39;translateY(0)&#39;;&#xA;    popup.style.opacity = &#39;1&#39;;&#xA;    clearTimeout(window.__copyPopupTimeout);&#xA;    window.__copyPopupTimeout = setTimeout(() =&gt; {&#xA;      popup.style.transform = &#39;translateY(100px)&#39;;&#xA;      popup.style.opacity = &#39;0&#39;;&#xA;      setTimeout(() =&gt; { popup.style.display = &#39;none&#39;; }, 300);&#xA;    }, 1200);&#xA;  }&#xA;&lt;/script&gt;&lt;/h2&gt;&#xA;&lt;p&gt;This tutorial guides you through how to do device sharing of NVIDIA GPUs with Dynamic Resource Allocation on Google Kubernetes Engine (GKE). This guide covers time slicing, with separate guides covering the other device sharing modes, MIG and Multi-Process Service (MPS).&lt;/p&gt;</description>
    </item>
    <item>
      <title>vLLM GPU/TPU Fungibility</title>
      <link>https://gke-ai-labs.dev/docs/tutorials/gpu-tpu/fungibility-recipes/</link>
      <pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate>
      <guid>https://gke-ai-labs.dev/docs/tutorials/gpu-tpu/fungibility-recipes/</guid>
      <description>&lt;h2 id=&#34;background&#34;&gt;&lt;strong&gt;Background&lt;/strong&gt;&lt;a class=&#34;td-heading-self-link&#34;&#xA;  onclick=&#34;copyHeadingLink(this, &#39;background&#39;); event.preventDefault();&#34;&#xA;  onmousedown=&#34;this.classList.add(&#39;active-link&#39;);&#34;&#xA;  onmouseup=&#34;this.classList.remove(&#39;active-link&#39;);&#34;&#xA;  onmouseleave=&#34;this.classList.remove(&#39;active-link&#39;);&#34;&#xA;  href=&#34;#background&#34; aria-label=&#34;Heading self-link&#34;&#xA;  title=&#34;Copy link to this section: Background&#34;&gt;&lt;i class=&#34;fa-solid fa-link&#34;&gt;&lt;/i&gt;&lt;/a&gt;&#xA;&lt;style&gt;&#xA;  .td-heading-self-link {&#xA;    transition: background 0.2s;&#xA;    border-radius: 4px;&#xA;    padding: 2px;&#xA;  }&#xA;  .td-heading-self-link.active-link {&#xA;    background: #e0e7ef;&#xA;    transition: background 0.2s;&#xA;  }&#xA;&lt;/style&gt;&#xA;&lt;script&gt;&#xA;  function copyHeadingLink(anchor, anchorId) {&#xA;    navigator.clipboard.writeText(location.origin + location.pathname + &#39;#&#39; + anchorId);&#xA;    let popup = document.getElementById(&#39;global-copy-popup&#39;);&#xA;    if (!popup) {&#xA;      &#xA;      popup = document.createElement(&#39;span&#39;);&#xA;      popup.id = &#39;global-copy-popup&#39;;&#xA;      popup.className = &#39;copy-popup&#39;;&#xA;      popup.textContent = &#39;Copied to clipboard&#39;;&#xA;      popup.setAttribute(&#39;style&#39;, &#39;position:fixed; bottom:24px; left:24px; background:#222; color:#fff; padding:8px 18px; border-radius:6px; font-size:0.8em; white-space:nowrap; z-index:9999; box-shadow:0 2px 8px rgba(0,0,0,0.15); transform:translateY(100px); opacity:0; transition:transform 0.3s cubic-bezier(.4,0,.2,1), opacity 0.3s cubic-bezier(.4,0,.2,1);&#39;);&#xA;      document.body.appendChild(popup);&#xA;    }&#xA;    popup.style.display = &#39;block&#39;;&#xA;    &#xA;    void popup.offsetWidth;&#xA;    popup.style.transform = &#39;translateY(0)&#39;;&#xA;    popup.style.opacity = &#39;1&#39;;&#xA;    clearTimeout(window.__copyPopupTimeout);&#xA;    window.__copyPopupTimeout = setTimeout(() =&gt; {&#xA;      popup.style.transform = &#39;translateY(100px)&#39;;&#xA;      popup.style.opacity = &#39;0&#39;;&#xA;      setTimeout(() =&gt; { popup.style.display = &#39;none&#39;; }, 300);&#xA;    }, 1200);&#xA;  }&#xA;&lt;/script&gt;&lt;/h2&gt;&#xA;&lt;p&gt;This user guide shows you how to optimize AI inference by configuring Google Kubernetes Engine (GKE) to dynamically scale workloads across TPU &amp;amp; GPUs, which helps you better manage demand fluctuations and capacity constraints. In this example we show you how to prioritize high-performance TPU nodes so you deliver optimal speed and responsiveness to your application while ensuring continuous service under peak demand by seamlessly transitioning workloads with additional TPU and GPU nodes, as needed.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Device sharing of GPUs with DRA using MIG</title>
      <link>https://gke-ai-labs.dev/docs/tutorials/dynamic-resource-allocation/gpu-dynamic-mig/</link>
      <pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate>
      <guid>https://gke-ai-labs.dev/docs/tutorials/dynamic-resource-allocation/gpu-dynamic-mig/</guid>
      <description>&lt;h2 id=&#34;background&#34;&gt;&lt;strong&gt;Background&lt;/strong&gt;&lt;a class=&#34;td-heading-self-link&#34;&#xA;  onclick=&#34;copyHeadingLink(this, &#39;background&#39;); event.preventDefault();&#34;&#xA;  onmousedown=&#34;this.classList.add(&#39;active-link&#39;);&#34;&#xA;  onmouseup=&#34;this.classList.remove(&#39;active-link&#39;);&#34;&#xA;  onmouseleave=&#34;this.classList.remove(&#39;active-link&#39;);&#34;&#xA;  href=&#34;#background&#34; aria-label=&#34;Heading self-link&#34;&#xA;  title=&#34;Copy link to this section: Background&#34;&gt;&lt;i class=&#34;fa-solid fa-link&#34;&gt;&lt;/i&gt;&lt;/a&gt;&#xA;&lt;style&gt;&#xA;  .td-heading-self-link {&#xA;    transition: background 0.2s;&#xA;    border-radius: 4px;&#xA;    padding: 2px;&#xA;  }&#xA;  .td-heading-self-link.active-link {&#xA;    background: #e0e7ef;&#xA;    transition: background 0.2s;&#xA;  }&#xA;&lt;/style&gt;&#xA;&lt;script&gt;&#xA;  function copyHeadingLink(anchor, anchorId) {&#xA;    navigator.clipboard.writeText(location.origin + location.pathname + &#39;#&#39; + anchorId);&#xA;    let popup = document.getElementById(&#39;global-copy-popup&#39;);&#xA;    if (!popup) {&#xA;      &#xA;      popup = document.createElement(&#39;span&#39;);&#xA;      popup.id = &#39;global-copy-popup&#39;;&#xA;      popup.className = &#39;copy-popup&#39;;&#xA;      popup.textContent = &#39;Copied to clipboard&#39;;&#xA;      popup.setAttribute(&#39;style&#39;, &#39;position:fixed; bottom:24px; left:24px; background:#222; color:#fff; padding:8px 18px; border-radius:6px; font-size:0.8em; white-space:nowrap; z-index:9999; box-shadow:0 2px 8px rgba(0,0,0,0.15); transform:translateY(100px); opacity:0; transition:transform 0.3s cubic-bezier(.4,0,.2,1), opacity 0.3s cubic-bezier(.4,0,.2,1);&#39;);&#xA;      document.body.appendChild(popup);&#xA;    }&#xA;    popup.style.display = &#39;block&#39;;&#xA;    &#xA;    void popup.offsetWidth;&#xA;    popup.style.transform = &#39;translateY(0)&#39;;&#xA;    popup.style.opacity = &#39;1&#39;;&#xA;    clearTimeout(window.__copyPopupTimeout);&#xA;    window.__copyPopupTimeout = setTimeout(() =&gt; {&#xA;      popup.style.transform = &#39;translateY(100px)&#39;;&#xA;      popup.style.opacity = &#39;0&#39;;&#xA;      setTimeout(() =&gt; { popup.style.display = &#39;none&#39;; }, 300);&#xA;    }, 1200);&#xA;  }&#xA;&lt;/script&gt;&lt;/h2&gt;&#xA;&lt;p&gt;This tutorial guides you through how to do device sharing of NVIDIA GPUs with Dynamic Resource Allocation on Google Kubernetes Engine (GKE). This guide covers Multi-Instance GPU (MIG), with separate guides covering the other device sharing modes, time slicing and Multi-Process Service (MPS).&lt;/p&gt;</description>
    </item>
    <item>
      <title>Building a Multi-Agent Code Development Flow with Flowise on GKE</title>
      <link>https://gke-ai-labs.dev/docs/agentic/flowise/</link>
      <pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate>
      <guid>https://gke-ai-labs.dev/docs/agentic/flowise/</guid>
      <description>&lt;p&gt;This tutorial will provide instructions on how to deploy and use &lt;a href=&#34;https://flowiseai.com/&#34;&gt;Flowise&lt;/a&gt; on GKE (Google Kubernetes Engine) to build and operate AI applications using a low-code/no-code approach.&lt;/p&gt;&#xA;&lt;h2 id=&#34;overview&#34;&gt;Overview&lt;a class=&#34;td-heading-self-link&#34;&#xA;  onclick=&#34;copyHeadingLink(this, &#39;overview&#39;); event.preventDefault();&#34;&#xA;  onmousedown=&#34;this.classList.add(&#39;active-link&#39;);&#34;&#xA;  onmouseup=&#34;this.classList.remove(&#39;active-link&#39;);&#34;&#xA;  onmouseleave=&#34;this.classList.remove(&#39;active-link&#39;);&#34;&#xA;  href=&#34;#overview&#34; aria-label=&#34;Heading self-link&#34;&#xA;  title=&#34;Copy link to this section: Overview&#34;&gt;&lt;i class=&#34;fa-solid fa-link&#34;&gt;&lt;/i&gt;&lt;/a&gt;&#xA;&lt;style&gt;&#xA;  .td-heading-self-link {&#xA;    transition: background 0.2s;&#xA;    border-radius: 4px;&#xA;    padding: 2px;&#xA;  }&#xA;  .td-heading-self-link.active-link {&#xA;    background: #e0e7ef;&#xA;    transition: background 0.2s;&#xA;  }&#xA;&lt;/style&gt;&#xA;&lt;script&gt;&#xA;  function copyHeadingLink(anchor, anchorId) {&#xA;    navigator.clipboard.writeText(location.origin + location.pathname + &#39;#&#39; + anchorId);&#xA;    let popup = document.getElementById(&#39;global-copy-popup&#39;);&#xA;    if (!popup) {&#xA;      &#xA;      popup = document.createElement(&#39;span&#39;);&#xA;      popup.id = &#39;global-copy-popup&#39;;&#xA;      popup.className = &#39;copy-popup&#39;;&#xA;      popup.textContent = &#39;Copied to clipboard&#39;;&#xA;      popup.setAttribute(&#39;style&#39;, &#39;position:fixed; bottom:24px; left:24px; background:#222; color:#fff; padding:8px 18px; border-radius:6px; font-size:0.8em; white-space:nowrap; z-index:9999; box-shadow:0 2px 8px rgba(0,0,0,0.15); transform:translateY(100px); opacity:0; transition:transform 0.3s cubic-bezier(.4,0,.2,1), opacity 0.3s cubic-bezier(.4,0,.2,1);&#39;);&#xA;      document.body.appendChild(popup);&#xA;    }&#xA;    popup.style.display = &#39;block&#39;;&#xA;    &#xA;    void popup.offsetWidth;&#xA;    popup.style.transform = &#39;translateY(0)&#39;;&#xA;    popup.style.opacity = &#39;1&#39;;&#xA;    clearTimeout(window.__copyPopupTimeout);&#xA;    window.__copyPopupTimeout = setTimeout(() =&gt; {&#xA;      popup.style.transform = &#39;translateY(100px)&#39;;&#xA;      popup.style.opacity = &#39;0&#39;;&#xA;      setTimeout(() =&gt; { popup.style.display = &#39;none&#39;; }, 300);&#xA;    }, 1200);&#xA;  }&#xA;&lt;/script&gt;&lt;/h2&gt;&#xA;&lt;p&gt;This tutorial is designed for developers and platform engineers interested in leveraging Flowise on GKE for building customized LLM flows and AI agents, offloading resource-intensive tasks to a managed cluster. Managed clusters automatically handle the complex infrastructure requirements of AI applications like scaling GPU nodes for model inference, managing variable workloads, allowing developers to focus on building AI solutions rather than managing servers.&#xA;Flowise is a low-code/no-code platform that enables developers to build and deploy AI applications and multi-agent systems through a visual drag-and-drop interface without extensive programming. As an example for this tutorial, we will create a multi-agent application that acts as a software development team with a software developer and a code reviewer which are coordinated by a supervisor. The example demonstrates Flowise&amp;rsquo;s core multi-agent coordination capabilities. This showcases how AI agents can collaborate on complex tasks—with a supervisor orchestrating between a code writer and reviewer.&#xA;For more info, you may want to read the &lt;a href=&#34;https://docs.flowiseai.com/using-flowise/agentflowv2&#34;&gt;docs&lt;/a&gt;.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Deploying n8n with agent and tool workflow</title>
      <link>https://gke-ai-labs.dev/docs/agentic/n8n/</link>
      <pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate>
      <guid>https://gke-ai-labs.dev/docs/agentic/n8n/</guid>
      <description>&lt;p&gt;This tutorial will provide instructions on how to deploy and use &lt;a href=&#34;httpshttps://n8n.io/&#34;&gt;n8n&lt;/a&gt; on GKE (Google Kubernetes Engine) to build and operate AI applications using a low-code/no-code approach.&lt;/p&gt;&#xA;&lt;h2 id=&#34;overview&#34;&gt;Overview&lt;a class=&#34;td-heading-self-link&#34;&#xA;  onclick=&#34;copyHeadingLink(this, &#39;overview&#39;); event.preventDefault();&#34;&#xA;  onmousedown=&#34;this.classList.add(&#39;active-link&#39;);&#34;&#xA;  onmouseup=&#34;this.classList.remove(&#39;active-link&#39;);&#34;&#xA;  onmouseleave=&#34;this.classList.remove(&#39;active-link&#39;);&#34;&#xA;  href=&#34;#overview&#34; aria-label=&#34;Heading self-link&#34;&#xA;  title=&#34;Copy link to this section: Overview&#34;&gt;&lt;i class=&#34;fa-solid fa-link&#34;&gt;&lt;/i&gt;&lt;/a&gt;&#xA;&lt;style&gt;&#xA;  .td-heading-self-link {&#xA;    transition: background 0.2s;&#xA;    border-radius: 4px;&#xA;    padding: 2px;&#xA;  }&#xA;  .td-heading-self-link.active-link {&#xA;    background: #e0e7ef;&#xA;    transition: background 0.2s;&#xA;  }&#xA;&lt;/style&gt;&#xA;&lt;script&gt;&#xA;  function copyHeadingLink(anchor, anchorId) {&#xA;    navigator.clipboard.writeText(location.origin + location.pathname + &#39;#&#39; + anchorId);&#xA;    let popup = document.getElementById(&#39;global-copy-popup&#39;);&#xA;    if (!popup) {&#xA;      &#xA;      popup = document.createElement(&#39;span&#39;);&#xA;      popup.id = &#39;global-copy-popup&#39;;&#xA;      popup.className = &#39;copy-popup&#39;;&#xA;      popup.textContent = &#39;Copied to clipboard&#39;;&#xA;      popup.setAttribute(&#39;style&#39;, &#39;position:fixed; bottom:24px; left:24px; background:#222; color:#fff; padding:8px 18px; border-radius:6px; font-size:0.8em; white-space:nowrap; z-index:9999; box-shadow:0 2px 8px rgba(0,0,0,0.15); transform:translateY(100px); opacity:0; transition:transform 0.3s cubic-bezier(.4,0,.2,1), opacity 0.3s cubic-bezier(.4,0,.2,1);&#39;);&#xA;      document.body.appendChild(popup);&#xA;    }&#xA;    popup.style.display = &#39;block&#39;;&#xA;    &#xA;    void popup.offsetWidth;&#xA;    popup.style.transform = &#39;translateY(0)&#39;;&#xA;    popup.style.opacity = &#39;1&#39;;&#xA;    clearTimeout(window.__copyPopupTimeout);&#xA;    window.__copyPopupTimeout = setTimeout(() =&gt; {&#xA;      popup.style.transform = &#39;translateY(100px)&#39;;&#xA;      popup.style.opacity = &#39;0&#39;;&#xA;      setTimeout(() =&gt; { popup.style.display = &#39;none&#39;; }, 300);&#xA;    }, 1200);&#xA;  }&#xA;&lt;/script&gt;&lt;/h2&gt;&#xA;&lt;p&gt;This tutorial is designed for developers and platform engineers interested in leveraging &lt;a href=&#34;https://n8n.io/&#34;&gt;n8n&lt;/a&gt; on GKE for building and hosting powerful workflow automations. By deploying n8n on a managed GKE cluster, you can offload resource-intensive automation tasks, ensure high availability, and scale your automation capabilities without managing underlying server infrastructure.&lt;/p&gt;</description>
    </item>
  </channel>
</rss>
