From ea1e5b733c999db1d4da3d06611bd2506f20c29c Mon Sep 17 00:00:00 2001 From: Fortuna Zhang Date: Tue, 21 Jan 2025 13:04:20 -0800 Subject: [PATCH] Add NeMo Retriever NIM on GCP VertexAI --- .../vertexai/{python => llm}/README.md | 0 .../{python => llm}/imgs/vertexai_01.png | Bin .../{python => llm}/imgs/vertexai_02.png | Bin .../{python => llm}/nim-vertexai.ipynb | 0 .../vertexai/{python => llm}/requirements.txt | 0 .../{python => llm}/samples/request.json | 0 .../samples/request_stream.json | 0 .../vertexai/nemo-retriever/README.md | 188 +++ .../nemo-retriever/imgs/vertexai_01.png | Bin 0 -> 64324 bytes .../nemo-retriever/imgs/vertexai_02.png | Bin 0 -> 101733 bytes .../nemo-retriever/nrem-nim-vertexai.ipynb | 1369 +++++++++++++++++ .../vertexai/nemo-retriever/requirements.txt | 8 + .../nemo-retriever/samples/request_nrem.json | 1 + 13 files changed, 1566 insertions(+) rename cloud-service-providers/google-cloud/vertexai/{python => llm}/README.md (100%) rename cloud-service-providers/google-cloud/vertexai/{python => llm}/imgs/vertexai_01.png (100%) rename cloud-service-providers/google-cloud/vertexai/{python => llm}/imgs/vertexai_02.png (100%) rename cloud-service-providers/google-cloud/vertexai/{python => llm}/nim-vertexai.ipynb (100%) rename cloud-service-providers/google-cloud/vertexai/{python => llm}/requirements.txt (100%) rename cloud-service-providers/google-cloud/vertexai/{python => llm}/samples/request.json (100%) rename cloud-service-providers/google-cloud/vertexai/{python => llm}/samples/request_stream.json (100%) create mode 100644 cloud-service-providers/google-cloud/vertexai/nemo-retriever/README.md create mode 100644 cloud-service-providers/google-cloud/vertexai/nemo-retriever/imgs/vertexai_01.png create mode 100644 cloud-service-providers/google-cloud/vertexai/nemo-retriever/imgs/vertexai_02.png create mode 100644 cloud-service-providers/google-cloud/vertexai/nemo-retriever/nrem-nim-vertexai.ipynb create mode 100644 cloud-service-providers/google-cloud/vertexai/nemo-retriever/requirements.txt create mode 100644 cloud-service-providers/google-cloud/vertexai/nemo-retriever/samples/request_nrem.json diff --git a/cloud-service-providers/google-cloud/vertexai/python/README.md b/cloud-service-providers/google-cloud/vertexai/llm/README.md similarity index 100% rename from cloud-service-providers/google-cloud/vertexai/python/README.md rename to cloud-service-providers/google-cloud/vertexai/llm/README.md diff --git a/cloud-service-providers/google-cloud/vertexai/python/imgs/vertexai_01.png b/cloud-service-providers/google-cloud/vertexai/llm/imgs/vertexai_01.png similarity index 100% rename from cloud-service-providers/google-cloud/vertexai/python/imgs/vertexai_01.png rename to cloud-service-providers/google-cloud/vertexai/llm/imgs/vertexai_01.png diff --git a/cloud-service-providers/google-cloud/vertexai/python/imgs/vertexai_02.png b/cloud-service-providers/google-cloud/vertexai/llm/imgs/vertexai_02.png similarity index 100% rename from cloud-service-providers/google-cloud/vertexai/python/imgs/vertexai_02.png rename to cloud-service-providers/google-cloud/vertexai/llm/imgs/vertexai_02.png diff --git a/cloud-service-providers/google-cloud/vertexai/python/nim-vertexai.ipynb b/cloud-service-providers/google-cloud/vertexai/llm/nim-vertexai.ipynb similarity index 100% rename from cloud-service-providers/google-cloud/vertexai/python/nim-vertexai.ipynb rename to cloud-service-providers/google-cloud/vertexai/llm/nim-vertexai.ipynb diff --git a/cloud-service-providers/google-cloud/vertexai/python/requirements.txt b/cloud-service-providers/google-cloud/vertexai/llm/requirements.txt similarity index 100% rename from cloud-service-providers/google-cloud/vertexai/python/requirements.txt rename to cloud-service-providers/google-cloud/vertexai/llm/requirements.txt diff --git a/cloud-service-providers/google-cloud/vertexai/python/samples/request.json b/cloud-service-providers/google-cloud/vertexai/llm/samples/request.json similarity index 100% rename from cloud-service-providers/google-cloud/vertexai/python/samples/request.json rename to cloud-service-providers/google-cloud/vertexai/llm/samples/request.json diff --git a/cloud-service-providers/google-cloud/vertexai/python/samples/request_stream.json b/cloud-service-providers/google-cloud/vertexai/llm/samples/request_stream.json similarity index 100% rename from cloud-service-providers/google-cloud/vertexai/python/samples/request_stream.json rename to cloud-service-providers/google-cloud/vertexai/llm/samples/request_stream.json diff --git a/cloud-service-providers/google-cloud/vertexai/nemo-retriever/README.md b/cloud-service-providers/google-cloud/vertexai/nemo-retriever/README.md new file mode 100644 index 00000000..268e826f --- /dev/null +++ b/cloud-service-providers/google-cloud/vertexai/nemo-retriever/README.md @@ -0,0 +1,188 @@ +# NVIDIA NeMo Retriever NIM on GCP Vertex AI + +**NVIDIA NeMo Retriever NIM** provides easy access to state-of-the-art models that are foundational building blocks for enterprise semantic search applications, delivering accurate answers quickly at scale. Developers can use these APIs to create robust copilots, chatbots, and AI assistants from start to finish. Text Retriever NIM models are built on the NVIDIA software platform, incorporating CUDA, TensorRT, and Triton to offer out-of-the-box GPU acceleration. + +Leveraging NVIDIA’s GPU acceleration on Google Cloud Platform, NeMo Retriever NIM offers an efficient and scalable path to inference with unparalleled performance. + +This repository demonstrates NeMo Retriever Text Embedding NIM (NREM NIM) [nv-embedqa-e5-v5](https://build.nvidia.com/nvidia/nv-embedqa-e5-v5) deploy and inference on **GCP Vertex AI** with NVIDIA GPUs. + +## Prerequisites +* [NGC API KEY](https://org.ngc.nvidia.com/setup/personal-keys) +* [NGC CLI](https://org.ngc.nvidia.com/setup/installers/cli) +* [Vertex AI Workbench](https://cloud.google.com/vertex-ai/docs/workbench/introduction) +* [gcloud CLI](https://cloud.google.com/sdk/docs/install) + +## Run NREM NIM on Vertex AI Workbench Instance + +To deploy NREM NIM on Vertex AI, start by obtaining the required credentials and completing the prerequisite setup. + +Next, create a Vertex AI Workbench instance with GPU support. + +Once your instance is ready, follow the instructions provided in the Jupyter notebook to complete the deployment process. + +The steps are outlined below: + +* Pull NREM NIM container from NGC. +* Push NREM NIM container to Artifact Registry. +* Run NREM NIM container to make inference within interface. +* Upload NIM container as a Vertex AI Model Resource. +* Create a Vertex AI Endpoint Resource. +* Deploy the Model Resource to the Endpoint Resource. +* Generate prediction responses from Endpoint Resource. + +Finally, NREM NIM will be capable of performing inferences both locally within the notebook interface and through the Vertex AI endpoint, which can be accessed via Vertex AI `Model Registry` and `Online prediction`. + +### 1. Create a Vertex AI Workbench Instance +Create a new Vertex AI Workbench instance and select `ADVANCED OPTIONS`. Choose NVIDIA GPUs (e.g. L4 for G2 machine series) and recommended [Disk Space](https://docs.nvidia.com/nim/nemo-retriever/text-embedding/latest/support-matrix.html) for specific NREM NIM. + +[](HighLevelArch) + +### 2. Run NREM NIM on JupyterLab Notebook +`OPEN JUPYTERLAB` of the instance, and install required packages per `requirements.txt`. + +Run `nrem-nim-vertexai.ipynb` Python jupyter notebook, which provides step-to-step guidance on how to deploy and inference the NREM NIM container within notebook interface or via Vertex AI endpoint resource. + +If NREM NIM container has been successfully launched, you will see below output in cell or deployment log: + +```shell +========================================= +== NVIDIA Retriever Text Embedding NIM == +========================================= + +NVIDIA Release 1.0.1 (build 0cf1c7ad8e51bdffc4e4d4226735dbb7f59d70d4) +Model: nvidia/nv-embedqa-e5-v5 + +Container image Copyright (c) 2016-2024, NVIDIA CORPORATION & AFFILIATES. All rights reserved. +This NIM container is governed by the NVIDIA AI Product Agreement here: +https://www.nvidia.com/en-us/data-center/products/nvidia-ai-enterprise/eula/. +A copy of this license can be found under /opt/nim/LICENSE. + +The use of this model is governed by the AI Foundation Models Community License +here: https://docs.nvidia.com/ai-foundation-models-community-license.pdf. +``` + +### 3. Inference in Online prediction +After deploying NREM NIM container to endpoint, check Vertex AI `Model Registry` and `Online prediction` for model/endpoint version details and event logs. + +[](HighLevelArch) + +Perform endpoint inference using the OpenAI Python API or CLI. + +> [!IMPORTANT] +> Please use `rawPredict` to make endpoint inference, as `predict` method will need additional formatting. +> +Sample request and response: + +* Payload +```shell +payload_model = "nvidia/nv-embedqa-e5-v5" + +inputs = ["Hello world"] + +payload = { + "model": payload_model, + "input": inputs, + "input_type": "query" +} + +with open("request_nrem.json", "w") as outfile: + json.dump(payload, outfile) +``` + +* Python Inference +```shell +import json +from pprint import pprint +from google.api import httpbody_pb2 +from google.cloud import aiplatform_v1 + +http_body = httpbody_pb2.HttpBody( + data=json.dumps(payload).encode("utf-8"), + content_type="application/json", +) + +req = aiplatform_v1.RawPredictRequest( + http_body=http_body, endpoint=endpoint.resource_name +) + +print("Request") +print(req) +pprint(json.loads(req.http_body.data)) +print() + +API_ENDPOINT = "{}-aiplatform.googleapis.com".format(region) +client_options = {"api_endpoint": API_ENDPOINT} + +pred_client = aiplatform.gapic.PredictionServiceClient(client_options=client_options) + +response = pred_client.raw_predict(req) +print("--------------------------------------------------------------------------------------") +print("Response") +print("Length of Embeddings:", len(json.loads(response.data)['data'][0]['embedding'])) +pprint(json.loads(response.data)) +``` + + +```shell +Request +endpoint: "projects/$project_id/locations/us-central1/endpoints/$ENDPOINT_ID" +http_body { + content_type: "application/json" + data: "{\"model\": \"nvidia/nv-embedqa-e5-v5\", \"input\": [\"Hello world\"], \"input_type\": \"query\"}" +} + +{'input': ['Hello world'], + 'input_type': 'query', + 'model': 'nvidia/nv-embedqa-e5-v5'} + +-------------------------------------------------------------------------------------- +Response +Length of Embeddings: 4096 +{'data': [{'embedding': [0.0145416259765625, + 0.0167388916015625, + ... + 0.0050506591796875], + 'index': 0, + 'object': 'embedding'}], + 'model': 'nvidia/nv-embedqa-e5-v5', + 'object': 'list', + 'usage': {'prompt_tokens': 5, 'total_tokens': 5}} + ``` + + * CLI Inference +```shell +! curl \ + --request POST \ + --header "Authorization: Bearer $(gcloud auth print-access-token)" \ + --header "Content-Type: application/json" \ + https://$region-prediction-aiplatform.googleapis.com/v1/projects/$project_id/locations/$region/endpoints/$ENDPOINT_ID:rawPredict \ + --data "@request_nrem.json" +``` +```shell +{ + "object": "list", + "data": [ + { + "index": 0, + "embedding": [ + 0.0145416259765625, + 0.0167388916015625, + ... + 0.0050506591796875 + ], + "object": "embedding" + } + ], + "model": "nvidia/nv-embedqa-e5-v5", + "usage": { + "prompt_tokens": 5, + "total_tokens": 5 + } +} +``` + + ## Reference + For more information about NIM, please refer to + * [NGC User Guide](https://docs.nvidia.com/ngc/gpu-cloud/ngc-user-guide/index.html) + * [NVIDIA Text Embedding NIM](https://docs.nvidia.com/nim/nemo-retriever/text-embedding/latest/index.html) + * [NeMo Text Embedding NIM API](https://docs.nvidia.com/nim/nemo-retriever/text-embedding/latest/reference.html) diff --git a/cloud-service-providers/google-cloud/vertexai/nemo-retriever/imgs/vertexai_01.png b/cloud-service-providers/google-cloud/vertexai/nemo-retriever/imgs/vertexai_01.png new file mode 100644 index 0000000000000000000000000000000000000000..3bfbd14a0c3e77d910ca7d2905fc82e443c99581 GIT binary patch literal 64324 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 Xe^QGwjpZF0_&cwrqgtqZ!}osxFcirn literal 0 HcmV?d00001 diff --git a/cloud-service-providers/google-cloud/vertexai/nemo-retriever/imgs/vertexai_02.png b/cloud-service-providers/google-cloud/vertexai/nemo-retriever/imgs/vertexai_02.png new file mode 100644 index 0000000000000000000000000000000000000000..54eeec7f1840b2dcafb1dca0356f057f98c25758 GIT binary patch literal 101733 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
4p}{ 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 literal 0 HcmV?d00001 diff --git a/cloud-service-providers/google-cloud/vertexai/nemo-retriever/nrem-nim-vertexai.ipynb b/cloud-service-providers/google-cloud/vertexai/nemo-retriever/nrem-nim-vertexai.ipynb new file mode 100644 index 00000000..777a51ff --- /dev/null +++ b/cloud-service-providers/google-cloud/vertexai/nemo-retriever/nrem-nim-vertexai.ipynb @@ -0,0 +1,1369 @@ +{ + "cells": [ + { + "cell_type": "code", + "execution_count": null, + "id": "f72c67a4", + "metadata": {}, + "outputs": [], + "source": [ + "# SPDX-FileCopyrightText: Copyright (c) 2024 NVIDIA CORPORATION & AFFILIATES. All rights reserved.\n", + "# SPDX-License-Identifier: Apache-2.0\n", + "#\n", + "# Licensed under the Apache License, Version 2.0 (the \"License\");\n", + "# you may not use this file except in compliance with the License.\n", + "# You may obtain a copy of the License at\n", + "#\n", + "# http://www.apache.org/licenses/LICENSE-2.0\n", + "#\n", + "# Unless required by applicable law or agreed to in writing, software\n", + "# distributed under the License is distributed on an \"AS IS\" BASIS,\n", + "# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n", + "# See the License for the specific language governing permissions and\n", + "# limitations under the License." + ] + }, + { + "cell_type": "markdown", + "id": "ab89d38c-6977-4c6f-9a0f-79676a820fa1", + "metadata": {}, + "source": [ + "## Deploy NVIDIA Nemo Retriever NIM to GCP Vertex AI" + ] + }, + { + "cell_type": "markdown", + "id": "9bc36ce1-5671-470b-83b9-92a7450eefa9", + "metadata": {}, + "source": [ + "### Objective\n", + "\n", + "NVIDIA NeMo Text Retriever NIM APIs provide easy access to state-of-the-art models that are foundational building blocks for enterprise semantic search applications, delivering accurate answers quickly at scale. Developers can use these APIs to create robust copilots, chatbots, and AI assistants from start to finish. Text Retriever NIM models are built on the NVIDIA software platform, incorporating CUDA, TensorRT, and Triton to offer out-of-the-box GPU acceleration.\n", + "\n", + "- NeMo Retriever Text Embedding NIM - Boosts text question-answering retrieval performance, providing high quality embeddings for many downstream NLP tasks.\n", + "- NeMo Retriever Text Reranking NIM - Enhances the retrieval performance further with a fine-tuned reranker, finding the most relevant passages to provide as context when querying an LLM.\n", + "\n", + "In this notebook, you learn to how to run NVIDIA NeMo Retriever Text Embedding NIM (NREM NIM) container on Google Cloud Vertex AI, make inference to get customized responses, and deploy model to Vertex AI endpoint.\n", + "\n", + "This tutorial uses the following NVIDIA NREM NIM and Vertex AI services:\n", + "\n", + "- NVIDIA NREM NIM Container\n", + "- Vertex AI Model Resource\n", + "- Vertex AI Model Registry\n", + "- Vertex AI Endpoint Resource\n", + "- Vertex AI Prediction\n", + "- Vertex AI Artifact Registry\n", + "- Vertex AI Cloud Storage\n", + "\n", + "The steps performed include:\n", + "\n", + "- Pull NVIDIA NREM NIM container from NGC.\n", + "- Push NVIDIA NREM NIM container to Artifact Registry.\n", + "- Run NREM NIM container to make inference within interface.\n", + "- Upload NREM NIM container as a Vertex AI Model Resource.\n", + "- Create a Vertex AI Endpoint Resource.\n", + "- Deploy the Model Resource to the Endpoint Resource.\n", + "- Generate prediction responses from Endpoint Resource.\n" + ] + }, + { + "cell_type": "markdown", + "id": "925a8a7f-d92b-443e-984b-0902742cf5aa", + "metadata": { + "tags": [] + }, + "source": [ + "### Install and Import packages" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "9765a47d-d7e9-4f00-acda-5c5aedfc9698", + "metadata": { + "tags": [] + }, + "outputs": [], + "source": [ + "! pip3 install -r requirements.txt" + ] + }, + { + "cell_type": "markdown", + "id": "6c5ed933-7d29-4a53-9a59-5d8bc1956153", + "metadata": {}, + "source": [ + "Restart kernel after installs so that the environment can access the new packages" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "11544c12-8d8b-47a2-a32a-8129affab5a6", + "metadata": {}, + "outputs": [], + "source": [ + "import IPython\n", + "\n", + "app = IPython.Application.instance()\n", + "app.kernel.do_shutdown(True)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "oHkv14VRimlG", + "metadata": { + "executionInfo": { + "elapsed": 2680, + "status": "ok", + "timestamp": 1721243802293, + "user": { + "displayName": "", + "userId": "" + }, + "user_tz": 240 + }, + "id": "oHkv14VRimlG", + "tags": [] + }, + "outputs": [], + "source": [ + "import google.cloud.aiplatform_v1beta1 as aip_beta\n", + "from google.cloud.aiplatform import Endpoint, Model\n", + "from google.api_core.exceptions import InvalidArgument\n", + "import requests" + ] + }, + { + "cell_type": "markdown", + "id": "84772f30-4f4c-4356-93be-4d60b17d0437", + "metadata": {}, + "source": [ + "### Authenticate to Google Cloud\n", + "Please run the following commands in a separate **Terminal** window." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "df20441a-e684-4bf5-b6da-496f9664ede9", + "metadata": { + "tags": [] + }, + "outputs": [], + "source": [ + "! gcloud auth login\n", + "! gcloud auth application-default login" + ] + }, + { + "cell_type": "markdown", + "id": "b8ed8ff4-2deb-45af-ad9f-ccbd7d801a8f", + "metadata": {}, + "source": [ + "### Set Up\n", + "\n", + "The example provided is NVIDIA Retrieval QA E5 Embedding v5 NIM (`nv-embedqa-e5-v5` container from NGC), on Vertex AI Workbench Notebook `g2-standard-12` instance with NVIDIA L4 GPU.\n", + "The solution is also applicable to other NeMo Retriever models, including `llama-3.2-nv-embedqa-1b-v2`, `nv-yolox-page-elements-v1`, `llama-3.2-nv-rerankqa-1b-v2`, `llama-3.2-nv-rerankqa-1b-v2`.\n", + "\n", + "\n", + "IAM role requirements:\n", + "* Vertex AI Users `(roles/aiplatform.user)` \n", + "* Artifact Registry Repository Administrator `(roles/artifactregistry.repoAdmin)` \n", + "* Storage Admin `(roles/storage.admin)`" + ] + }, + { + "cell_type": "markdown", + "id": "6ef1c574-90ae-44de-83c0-f03274959b0d", + "metadata": {}, + "source": [ + "Get account name" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "vn6KU7wfjew5", + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "executionInfo": { + "elapsed": 970, + "status": "ok", + "timestamp": 1721238645640, + "user": { + "displayName": "", + "userId": "" + }, + "user_tz": 240 + }, + "id": "vn6KU7wfjew5", + "outputId": "ca54be92-1d89-43cf-96e8-25d28f7577b2", + "tags": [] + }, + "outputs": [], + "source": [ + "import requests\n", + "gcloud_token = !gcloud auth print-access-token\n", + "gcloud_tokeninfo = requests.get('https://www.googleapis.com/oauth2/v3/tokeninfo?access_token=' + gcloud_token[0]).json()\n", + "account_email = gcloud_tokeninfo['email']\n", + "account_name = gcloud_tokeninfo['email'].split('@')[0]\n", + "print(account_email)\n", + "print(account_name)" + ] + }, + { + "cell_type": "markdown", + "id": "300579f4-c262-4516-a1e5-a2ea0e3d7414", + "metadata": {}, + "source": [ + "Please set the value of the following variables" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "7d43b7fe-0d54-4c64-a87f-8a2ddbdb72ee", + "metadata": {}, + "outputs": [], + "source": [ + "region = None # please set here, e.g. us-central1\n", + "project_id = None # please set here\n", + "public_repository = None # please set here any value to name the public Artifact Registry" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "g7chyrzCF9yoWk9IFyfdOe4W", + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/", + "height": 35 + }, + "executionInfo": { + "elapsed": 196, + "status": "ok", + "timestamp": 1721251321866, + "user": { + "displayName": "", + "userId": "" + }, + "user_tz": 240 + }, + "id": "g7chyrzCF9yoWk9IFyfdOe4W", + "outputId": "e2090fb2-bca8-46c9-c79b-d2369a53377f", + "tags": [] + }, + "outputs": [], + "source": [ + "private_repository = account_name\n", + "bucket_url = f\"gs://{account_name}\"\n", + "\n", + "nim_model = \"nrem:embedqa-e5-v5-1.1.1\"\n", + "# NIM in NGC\n", + "ngc_nim_image = \"nvcr.io/nim/nvidia/nv-embedqa-e5-v5:1.1.1\"\n", + "container_name = \"nv-embedqa-e5-v5\"\n", + "# NIM in Artifact Registry (AR)\n", + "public_nim_image = f\"{region}-docker.pkg.dev/{project_id}/{public_repository}/{nim_model}\"\n", + "private_nim_image = f\"{region}-docker.pkg.dev/{project_id}/{private_repository}/{nim_model}\"\n", + "\n", + "va_model_name = \"nrem-embedqa-e5-v5\"\n", + "\n", + "machine_type = \"g2-standard-12\"\n", + "accelerator_type = \"NVIDIA_L4\"\n", + "accelerator_count = 1\n", + "\n", + "endpoint_name = va_model_name+\"_endpoint\"\n", + "payload_model = \"nvidia/nv-embedqa-e5-v5\"" + ] + }, + { + "cell_type": "markdown", + "id": "53e0b9ab-8a24-4bbf-866e-fa7f9e77c70e", + "metadata": {}, + "source": [ + "Grant required IAM roles to the service account\n", + "\n", + "*Note: If \"Use default Compute Engine service account\" is selected when creating the workbench instance, Vertex AI service account is the same as Compute Engine, as example below.*" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "02232b9b-0735-4803-8d8a-64d5fbca9344", + "metadata": {}, + "outputs": [], + "source": [ + "project_number = !gcloud projects describe {project_id} --format=\"value(projectNumber)\"\n", + "service_account = \"serviceAccount:\" + project_number[0] + \"-compute@developer.gserviceaccount.com\"\n", + "role1 = \"roles/aiplatform.user\"\n", + "role2 = \"roles/artifactregistry.repoAdmin\"\n", + "role3 = \"roles/storage.admin\"\n", + "\n", + "! gcloud projects add-iam-policy-binding {project_id} --member={service_account} --role={role1}\n", + "! gcloud projects add-iam-policy-binding {project_id} --member={service_account} --role={role2}\n", + "! gcloud projects add-iam-policy-binding {project_id} --member={service_account} --role={role3}" + ] + }, + { + "cell_type": "markdown", + "id": "4563bc1e-4ccf-4210-ab57-bacf08bb204f", + "metadata": {}, + "source": [ + "If Cloud Storage Bucket or Artifact Registry repository doesn't already exist: Run the following cell to create your bucket or repository.\n", + "\n", + "- Private Artifact Registry is to securely store NIM containers with minimum user access, for testing, validation, and maintaining a version-controlled, auditable copy.\n", + "\n", + "- Public Artifact Registry is optional, enabling more selected users to access the NIM containers, while adhering to the Principle of Least Privilege." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "8c6463ab-cc0e-4222-8382-4aed34455831", + "metadata": {}, + "outputs": [], + "source": [ + "! gsutil mb -l {region} -p {project_id} {bucket_url}\n", + "! gcloud artifacts repositories create {public_repository} --repository-format=docker --location={region}\n", + "! gcloud artifacts repositories create {private_repository} --repository-format=docker --location={region}" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "e5ff1ea3-6111-4e37-b5d5-daaa97f7339f", + "metadata": {}, + "outputs": [], + "source": [ + "# (Optional) Create public AR if needed\n", + "user = 'serviceAccount:test123@example.iam.gserviceaccount.com' # Please set member to grant AR read access to, e.g. user:test-user@gmail.com, group:admins@example.com, \n", + " # serviceAccount:test123@example.domain.com, or domain:example.domain.com\n", + "! gcloud artifacts repositories add-iam-policy-binding {public_repository} --location={region} --member={user} --role=roles/artifactregistry.reader" + ] + }, + { + "cell_type": "markdown", + "id": "73d3d2c3-92ad-49c5-85a5-229602c25e06", + "metadata": {}, + "source": [ + "Initialize Vertex AI SDK for Python" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "uYMNxGozkZyj", + "metadata": { + "executionInfo": { + "elapsed": 1, + "status": "ok", + "timestamp": 1721251252748, + "user": { + "displayName": "", + "userId": "" + }, + "user_tz": 240 + }, + "id": "uYMNxGozkZyj", + "tags": [] + }, + "outputs": [], + "source": [ + "from google.cloud import aiplatform\n", + "\n", + "aiplatform.init(project=project_id, location=region, staging_bucket=bucket_url)" + ] + }, + { + "cell_type": "markdown", + "id": "43c98fc3-d8a2-4abd-bd86-b1e120f07c4a", + "metadata": {}, + "source": [ + "GCP Configuration" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "455fad6a-e213-4e7e-baab-84f78b17fbe4", + "metadata": {}, + "outputs": [], + "source": [ + "def run_bash_cmd(cmd):\n", + " import subprocess\n", + "\n", + " if isinstance(cmd, str):\n", + " process = subprocess.Popen(cmd, stdout=subprocess.PIPE, stderr=subprocess.STDOUT, shell=True, text=True)\n", + " elif isinstance(cmd, list):\n", + " process = subprocess.Popen(cmd, stdout=subprocess.PIPE, stderr=subprocess.STDOUT, shell=False, text=True)\n", + " \n", + " output, error = process.communicate()\n", + " if error:\n", + " raise Exception(error)\n", + " else:\n", + " print(output)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "5d570257-69fd-48e3-a558-8d861db11818", + "metadata": { + "tags": [] + }, + "outputs": [], + "source": [ + "bash_cmd = f\"\"\"\n", + " export region={region}\n", + " gcloud config set ai_platform/region {region}\n", + " gcloud config set project {project_id}\n", + " gcloud auth configure-docker {region}-docker.pkg.dev\n", + " \"\"\"\n", + "run_bash_cmd(bash_cmd)" + ] + }, + { + "cell_type": "markdown", + "id": "4cb66464-949b-4998-b9fc-620acba7fd8a", + "metadata": { + "tags": [] + }, + "source": [ + "### NIM Container\n", + "\n", + "* **NGC_API_KEY**\n", + "\n", + "To access NIM container from NGC catalog, `NGC_API_KEY` is required.\n", + "\n", + "The credentail will be used in Vertex AI as an environment variable during model uploading, and will show on Model Registry Version Details UI. **Attention: the credential will be visible for all Vertex AI users in the same project.**\n", + "\n", + "Please upload a json file to Cloud Storage Bucket to use `read_key()` function below, format `\"{NGC_API_KEY\": Your Key}\"`.\n", + "\n", + "Reference: [NGC User Guide](https://docs.nvidia.com/ngc/gpu-cloud/ngc-user-guide/index.html)\n", + "\n", + "* **Artifact Registry**\n", + "\n", + "We will pull NIM container from NGC, then push to a private AR repository. \n", + "\n", + "(Optional) Then we pull NIM container from the private AR and push to a public AR repository, which allows more users in the project able to access NIM. \n" + ] + }, + { + "cell_type": "markdown", + "id": "e3d023de-30f9-4922-80ba-d9ffce1d74d4", + "metadata": {}, + "source": [ + "#### Set NGC API KEY" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "X0s70ghC-gY_", + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "executionInfo": { + "elapsed": 383, + "status": "ok", + "timestamp": 1721238662144, + "user": { + "displayName": "", + "userId": "" + }, + "user_tz": 240 + }, + "id": "X0s70ghC-gY_", + "outputId": "7ef6b24a-ca64-44b9-ecdb-8c3c5af7c47f", + "tags": [] + }, + "outputs": [], + "source": [ + "NGC_API_KEY = None # please set here" + ] + }, + { + "cell_type": "markdown", + "id": "6b460cda-e7f7-4e14-83c5-4707e2b3770c", + "metadata": {}, + "source": [ + "#### Pull NIM from NGC and Push to GCP AR" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "kI-V4mFQF0DW", + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "executionInfo": { + "elapsed": 3277, + "status": "ok", + "timestamp": 1721243311334, + "user": { + "displayName": "", + "userId": "" + }, + "user_tz": 240 + }, + "id": "kI-V4mFQF0DW", + "outputId": "ce78f943-0702-482c-bc83-a53ef531920e", + "tags": [] + }, + "outputs": [], + "source": [ + "# Login to NGC\n", + "from pathlib import Path\n", + "local_nim_cache=str(Path(\".cache/nim\").absolute())\n", + "\n", + "bash_cmd = f\"\"\"\n", + " sudo apt-get install -y nvidia-docker2\n", + " export NGC_API_KEY={NGC_API_KEY}\n", + " echo \"export NGC_API_KEY={NGC_API_KEY}\" >> ~/.bashrc\n", + " echo \"$NGC_API_KEY\" | docker login nvcr.io --username '$oauthtoken' --password-stdin\n", + "\n", + " export LOCAL_NIM_CACHE={local_nim_cache}\n", + " mkdir -p \"$LOCAL_NIM_CACHE\"\n", + " echo \"Local NIM cache created\"\n", + " \"\"\"\n", + "\n", + "run_bash_cmd(bash_cmd)\n", + "\n", + "# Pull NIM container from NGC and run container\n", + "docker_cmd = [\n", + " \"docker\", \"run\", \"-d\", \"--rm\",\n", + " f\"--name={container_name}\",\n", + " \"--gpus\", \"all\",\n", + " \"-e\", f\"{NGC_API_KEY}\",\n", + " \"-v\", f\"{local_nim_cache}:/opt/nim/.cache\",\n", + " \"-p\", \"8000:8000\",\n", + " ngc_nim_image\n", + "]\n", + "\n", + "print(f\"NIM container {ngc_nim_image} pulled from NGC successfully, running container is\")\n", + "run_bash_cmd(docker_cmd)\n", + "\n", + "# Push NIM container to private AR repository\n", + "bash_cmd = f\"\"\"\n", + " docker tag {ngc_nim_image} {private_nim_image}\n", + "\n", + " docker push {private_nim_image}\n", + " \"\"\"\n", + "\n", + "run_bash_cmd(bash_cmd)\n", + "print(f\"NIM container {ngc_nim_image} pushed to Artifact Registry {private_nim_image} successfully\")" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "c8afe765-f66a-44eb-83a0-30c27b6403c7", + "metadata": { + "tags": [] + }, + "outputs": [], + "source": [ + "# Optional\n", + "# Push NIM container to public AR repository\n", + "bash_cmd = f\"\"\"\n", + " docker tag {private_nim_image} {public_nim_image}\n", + "\n", + " docker push {public_nim_image}\n", + " \"\"\"\n", + "\n", + "run_bash_cmd(bash_cmd)\n", + "print(f\"NIM container {private_nim_image} pushed to Artifact Registry {public_nim_image} successfully\")" + ] + }, + { + "cell_type": "markdown", + "id": "5b3a6114-4105-4c86-88e9-246d6b43ed09", + "metadata": {}, + "source": [ + "### Run NIM Container Within Interface" + ] + }, + { + "cell_type": "markdown", + "id": "e2932919-6f68-449c-8184-571036a6798e", + "metadata": {}, + "source": [ + "Run NREM NIM container locally in **Terminal** or **Another notebook**, keep the container active, then inference with Python OpenAI API or CLI command to get model responses in the Notebook interface." + ] + }, + { + "cell_type": "markdown", + "id": "a62fcae6-e470-4fc4-9409-d4cef67a1cf1", + "metadata": {}, + "source": [ + "Terminal" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "3b3ab906-9047-4af0-8016-a29302950df1", + "metadata": { + "tags": [] + }, + "outputs": [], + "source": [ + "# Run this command here, used for the following variable definition\n", + "print(private_nim_image)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "d35fb809-3f7f-44ba-a97f-4121564c646d", + "metadata": {}, + "outputs": [], + "source": [ + "# If Terminal, use $variable_name, add export commands\n", + "export container_name=nv-embedqa-e5-v5\n", + "export NGC_API_KEY=None # please set here\n", + "export local_nim_cache=~/.cache/nim \n", + "export private_nim_image=None # please set here\n", + "\n", + "docker run -it --rm --name=$container_name \\\n", + " --runtime=nvidia \\\n", + " --gpus all \\\n", + " --shm-size=16GB \\\n", + " -e NGC_API_KEY=$NGC_API_KEY \\\n", + " -v $local_nim_cache\":/opt/nim/.cache\" \\\n", + " -u $(id -u) \\\n", + " -p 8000:8000 \\\n", + " $private_nim_image" + ] + }, + { + "cell_type": "markdown", + "id": "92e77562-277e-41a6-8d44-5d178d3922a5", + "metadata": {}, + "source": [ + "Notebook" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "29a3c57f-6388-491b-b42e-a773a32017aa", + "metadata": { + "tags": [] + }, + "outputs": [], + "source": [ + "# If Notebook, use {variable_name}, add variables definition\n", + "container_name = \"nv-embedqa-e5-v5\"\n", + "NGC_API_KEY = None # please set here\n", + "local_nim_cache = \"~/.cache/nim\" \n", + "private_nim_image = None # please set here\n", + "\n", + "! docker run -it --rm --name={container_name} \\\n", + " --runtime=nvidia \\\n", + " --gpus all \\\n", + " --shm-size=16GB \\\n", + " -e NGC_API_KEY={NGC_API_KEY} \\\n", + " -v {local_nim_cache}\":/opt/nim/.cache\" \\\n", + " -u $(id -u) \\\n", + " -p 8000:8000 \\\n", + " {private_nim_image}" + ] + }, + { + "cell_type": "markdown", + "id": "d9a971c7-be58-4fad-8739-1b58515a0489", + "metadata": {}, + "source": [ + "Run below commands in the current notebook interface." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "ce051b0f-5d8d-4183-a601-b51781459db3", + "metadata": { + "tags": [] + }, + "outputs": [], + "source": [ + "! docker images | grep nrem" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "94a0672d-5c48-4a6b-a47c-9f97c6f30908", + "metadata": { + "tags": [] + }, + "outputs": [], + "source": [ + "! docker ps \n", + "! echo \"\"\n", + "CONTAINER_ID = !docker ps | awk 'NR>1 {print $1}'\n", + "CONTAINER_ID = CONTAINER_ID[0]\n", + "! echo 'Running Container is' $CONTAINER_ID\n", + "! echo 'IP Address'\n", + "# ! docker inspect $CONTAINER_ID\n", + "IPAddress= !docker exec $CONTAINER_ID sh -c \"hostname --ip-address\" \n", + "IPAddress=IPAddress[0]\n", + "! echo $IPAddress\n", + "! echo \"\"\n", + "! echo \"NIM Model and Profile\"\n", + "! docker inspect $CONTAINER_ID |grep -i model" + ] + }, + { + "cell_type": "markdown", + "id": "0ca20056-db4e-44aa-902a-ce76da8f38fe", + "metadata": {}, + "source": [ + "#### Make Inference within Interface\n", + "After running NREM NIM container and keeping it active, we could make inference to model and get response. NREM NIM on Vertex AI Workbench supports both OpenAI Python API and CLI.\n", + "\n", + "With the `embeddings` endpoint, `input` could be set as input text to be transformed into vectors by the model. `input_type` could be adjusted for Embedding models such as NV-Embed-QA, E5, as they operate in `passage` or `query` mode, where `passage` is used when generating embeddings during indexing, `query` is used when generating embeddings during querying.\n", + "\n", + "Since the OpenAI API does not accept `input_type` as a parameter, it is possible to add the `-query` or `-passage` suffix to the model parameter like `nv-embedqa-e5-v5-query` and not use the `input_type` field at all for OpenAI API compliance.\n", + "\n", + "*Note: May need to change IP address of URL when make request (e.g. http://172.18.0.2:8000/v1/embeddings)*\n", + "\n", + "Reference: [NVIDIA Embedding API](https://docs.api.nvidia.com/nim/reference/nvidia-nv-embedqa-e5-v5), [Text Embedding NIM](https://docs.nvidia.com/nim/nemo-retriever/text-embedding/latest/reference.html) " + ] + }, + { + "cell_type": "markdown", + "id": "14cb0f8b-cb49-4c9d-816c-f1fd6cff5a5c", + "metadata": {}, + "source": [ + "CLI" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "5b992c69-c4df-47ef-b6ab-d5e0c41889ae", + "metadata": { + "tags": [] + }, + "outputs": [], + "source": [ + "# Confirm the service is ready to handle inference requests\n", + "! curl -X 'GET' 'http://localhost:8000/v1/health/ready'" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "41d68c90-d684-4c18-8265-bf56b3e28925", + "metadata": { + "tags": [] + }, + "outputs": [], + "source": [ + "# Generate Embeddings\n", + "! curl -X \"POST\" \\\n", + " \"http://localhost:8000/v1/embeddings\" \\ \n", + " -H 'accept: application/json' \\\n", + " -H 'Content-Type: application/json' \\\n", + " -d '{ \"input\": [\"Hello world\"],\n", + " \"model\": \"nvidia/nv-embedqa-e5-v5\",\n", + " \"input_type\": \"query\"\n", + " }'" + ] + }, + { + "cell_type": "markdown", + "id": "4b22514c-e7ab-4147-af03-59a2e70d101a", + "metadata": {}, + "source": [ + "Python" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "1f63ae01-1f27-4205-be64-e1d05f81662a", + "metadata": { + "tags": [] + }, + "outputs": [], + "source": [ + "# Generate Embeddings\n", + "from openai import OpenAI\n", + "client = OpenAI(base_url=\"http://localhost:8000/v1\", api_key=\"not-used\")\n", + "inputs = [\"Hello World\", \"Once upon a time\"]\n", + "input_type=\"-query\" #-passage\n", + "\n", + "response = client.embeddings.create(\n", + " model=payload_model+input_type,\n", + " input=inputs,\n", + ")\n", + "embeddings = response.data[0].embedding\n", + "print(len(embeddings))" + ] + }, + { + "cell_type": "markdown", + "id": "817da080-24b6-46a5-a6c5-4e1ee9aa72cd", + "metadata": {}, + "source": [ + "Stop NIM container" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "2d45275c-e271-4c45-ae3c-e5904547a83b", + "metadata": {}, + "outputs": [], + "source": [ + "! docker stop $CONTAINER_ID" + ] + }, + { + "cell_type": "markdown", + "id": "086c88a7-94b3-407d-ada1-4c049efb92f4", + "metadata": {}, + "source": [ + "### Endpoint Deployment\n", + "\n", + "Then we could proceed to endpoint deloyment, this will allow the model endpoint available on Vertex AI Online Prediction.\n", + "\n", + "Steps are as follows:\n", + "\n", + "* Upload NIM container as a Vertex AI Model resource.\n", + "* Create a Vertex AI Endpoint resource.\n", + "* Deploy the Model resource to the Endpoint resource.\n", + "* Generate raw prediction requests and get responses." + ] + }, + { + "cell_type": "markdown", + "id": "VADQagSOfSgN", + "metadata": { + "id": "VADQagSOfSgN" + }, + "source": [ + "#### Upload NIM as a Vertex AI Model Resource" + ] + }, + { + "cell_type": "markdown", + "id": "ZR0xiIeGfQmY", + "metadata": { + "id": "ZR0xiIeGfQmY" + }, + "source": [ + "First, we upload the NREM NIM image as a Vertex AI model resource using the `upload()` method, with the following parameters:\n", + "\n", + "* `display_name`: The human readable name for the Model resource.\n", + "* `artifact_uri`: The Cloud Storage location of the model artifacts. If the container image includes the model artifacts that you need to serve predictions, there is no need to load files from Cloud Storage.\n", + "* `parent_model`: The parent resource name of an existing model.\n", + "* `model_version_aliases`: The aliases of the model version to create.\n", + "* `model_version_description`: The description of the model version.\n", + "* `is_default_version`: Whether the model version is the default version.\n", + "\n", + "* `serving_container_image`: The serving container image to use when the model is deployed to a Vertex AI\n", + "\n", + "* `serving_container_command`: The serving binary (HTTP Server) to start up.\n", + "\n", + "* `serving_container_shared_memory_size_mb`: The shared memory is an Inter-process communication (IPC) mechanism that allows multiple processes to access and manipulate a common block of memory. The default shared memory size is 64MB. Model servers such as vLLM or NVIDIA Triton, use shared memory to cache internal data during model inferences. Also, because shared memory can be used for cross GPU communication, using more shared memory can improve performance for accelerators without NVLink capabilities (for example, L4), if the model container requires communication across GPUs. NIM generally requires a larger shared memory size than default. \n", + "\n", + "* `serving_container_environment_variables`: The environment variables specify container required settings such as authentication key. \n", + "\n", + "* `serving_container_args`: The arguments to pass to the serving binary. For example:\n", + "\n", + " -- `model_name`: The human readable name to assign to the model.\n", + "\n", + " -- `model_base_name`: Where to store the model artifacts in the container. The Vertex service sets the variable `AIP_STORAGE_URI` to where the service installed the model artifacts in the container.\n", + "\n", + " -- `rest_api_port`: The port to which to send REST based prediction requests. NREM NIM uses `8000`.\n", + "\n", + " -- `port`: The port to which to send gRPC based prediction requests. NREM NIM uses `8000`.\n", + "\n", + "* `serving_container_health_route`: The URL for the service to periodically ping for a response to verify that the serving binary is running. For NREM NIM, this will be `/v1/health/ready`.\n", + "\n", + "* `serving_container_predict_route`: The URL for the service to route REST-based prediction requests to. For NREM NIM, this will be `/v1/embeddings`.\n", + "\n", + "* `serving_container_ports`: A list of ports for the HTTP server to listen for requests. \n", + "\n", + "* `sync`: Whether to wait for the process to complete, or return immediately (async).\n", + "\n", + "Uploading a model into a Vertex Model resource may take a few moments. After completion, model will show up in Vertex AI Model Registry." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "HVFcXzZZs1Gp", + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "executionInfo": { + "elapsed": 374, + "status": "ok", + "timestamp": 1721244274689, + "user": { + "displayName": "", + "userId": "" + }, + "user_tz": 240 + }, + "id": "HVFcXzZZs1Gp", + "outputId": "064db104-e272-456e-d377-39ebbce664f7", + "tags": [] + }, + "outputs": [], + "source": [ + "from google.api_core.future.polling import DEFAULT_POLLING\n", + "from google.cloud.aiplatform import Endpoint, Model\n", + "DEFAULT_POLLING._timeout = 360000\n", + "\n", + "print(\"NREM NIM Container:\",private_nim_image)\n", + "\n", + "models = Model.list(filter=f'displayName=\"{va_model_name}\"')\n", + "\n", + "if models:\n", + " model = models[0]\n", + "else:\n", + " model = aiplatform.Model.upload(\n", + " display_name=va_model_name,\n", + " # parent_model=\"3585596478619385856\",\n", + " is_default_version=True,\n", + " # version_aliases=[\"v2\"], \n", + " # version_description=\"This is the second version of the model\",\n", + " serving_container_image_uri=private_nim_image,\n", + " serving_container_predict_route=\"/v1/embeddings\",\n", + " serving_container_health_route=\"/v1/health/ready\",\n", + " serving_container_environment_variables={\"NGC_API_KEY\": NGC_API_KEY, \"PORT\": \"8000\", \"shm-size\":\"16GB\"},\n", + " serving_container_shared_memory_size_mb=16000,\n", + " serving_container_ports=[8000],\n", + " sync=True,\n", + " )\n", + "model.wait()\n", + "\n", + "print(\"Model:\")\n", + "print(f\"\\tDisplay name: {model.display_name}\")\n", + "print(f\"\\tResource name: {model.resource_name}\")" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "43a64dfb-010c-4967-8a10-561e166d5553", + "metadata": { + "tags": [] + }, + "outputs": [], + "source": [ + "! gcloud ai models list --region=$region --filter=\"DISPLAY_NAME ~ .*nrem.*\"" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "3b5214c6-db87-4736-a076-94d6919ef5ae", + "metadata": { + "tags": [] + }, + "outputs": [], + "source": [ + "MODEL_ID = !gcloud ai models list --region=$region --filter=\"DISPLAY_NAME ~ .*nrem.*\" | awk 'NR>1 {print $1}'\n", + "MODEL_ID = MODEL_ID[1]\n", + "MODEL_ID" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "f6ed15ce-05f1-4813-b9b2-0264926ce581", + "metadata": { + "tags": [] + }, + "outputs": [], + "source": [ + "def list_model_version(model_id: str, project: str, location: str):\n", + " \"\"\"\n", + " List all model versions of a model.\n", + " Args:\n", + " model_id: The ID of the model to list. Parent resource name of the model is also accepted.\n", + " project: The project ID.\n", + " location: The region name.\n", + " Returns:\n", + " versions: List of model versions.\n", + " \"\"\"\n", + " # Initialize the client.\n", + " aiplatform.init(project=project, location=location)\n", + "\n", + " # Initialize the Model Registry resource with the ID 'model_id'.The parent_name of Model resource can be also\n", + " # 'projects//locations//models/'\n", + " model_registry = aiplatform.models.ModelRegistry(model=model_id)\n", + "\n", + " # List all model versions of the model.\n", + " versions = model_registry.list_versions()\n", + "\n", + " return versions\n", + "\n", + "list_model_version(MODEL_ID, project_id, region)" + ] + }, + { + "cell_type": "markdown", + "id": "d98b2276-e633-4d03-8fc0-6256083e9ccc", + "metadata": {}, + "source": [ + "#### Create a Vertex AI Endpoint Resource" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "4e6c60f1-5741-4d72-ba15-b38440ea5d90", + "metadata": { + "tags": [] + }, + "outputs": [], + "source": [ + "endpoints = Endpoint.list(filter=f'displayName=\"{endpoint_name}\"')\n", + "if endpoints:\n", + " endpoint = endpoints[0]\n", + "else:\n", + " print(f\"Endpoint {endpoint_name} doesn't exist, creating...\")\n", + " endpoint = aiplatform.Endpoint.create(display_name=endpoint_name)\n", + "print(\"Endpoint:\")\n", + "print(f\"\\tDisplay name: {endpoint.display_name}\")\n", + "print(f\"\\tResource name: {endpoint.resource_name}\")" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "8162ce0f-4aa7-4117-b880-d712ba803546", + "metadata": { + "tags": [] + }, + "outputs": [], + "source": [ + "! gcloud ai endpoints list --region=$region --filter=\"DISPLAY_NAME ~ .*nrem.*\"" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "682ab40a-3b35-4380-ad1e-5aa123bdbe84", + "metadata": { + "tags": [] + }, + "outputs": [], + "source": [ + "ENDPOINT_ID = !gcloud ai endpoints list --region=$region --filter=\"DISPLAY_NAME ~ .*nrem.*\" | awk 'NR>1 {print $1}'\n", + "ENDPOINT_ID = ENDPOINT_ID[1]\n", + "ENDPOINT_ID" + ] + }, + { + "cell_type": "markdown", + "id": "a45fc29c-6940-4cec-930e-f3303e5bc804", + "metadata": {}, + "source": [ + "#### Deploy Model Resource to Endpoint Resource" + ] + }, + { + "cell_type": "markdown", + "id": "82e8a803-a784-471a-86a0-d989df1ef85e", + "metadata": {}, + "source": [ + "Next, deploy the Vertex AI model resource to the endpoint resource with the following parameters:\n", + "\n", + "* `deploy_model_display`: The human reable name for the deployed model.\n", + "\n", + "* `traffic_split`: Percent of traffic at the endpoint that goes to this model, which is specified as a dictionary of one or more key/value pairs.\n", + " * If only one model, then specify `{ \"0\": 100 }`, where \"0\" refers to this model being uploaded and 100 means 100% of the traffic.\n", + " * If there are existing models on the endpoint, for which the traffic is split, then use model_id to specify `{ \"0\": percent, model_id: percent, ... }`, where model_id is the ID of an existing deployed model on the endpoint. The percentages must add up to 100.\n", + "\n", + "* `machine_type`: The machine type for each VM node instance.\n", + "\n", + "* `min_replica_count`: The minimum number of nodes to provision for auto-scaling.\n", + "\n", + "* `max_replica_count`: The maximum number of nodes to provision for auto-scaling.\n", + "\n", + "* `accelerator_type`: The type, if any, of GPU accelators per provisioned node.\n", + "\n", + "* `accelrator_count`: The number, if any, of GPU accelators per provisioned node.\n", + "\n", + "After successful deployment, the endpoint and associated deloyed model will be available on Vertex AI Online Prediction." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "7j5UICB4DSXZ", + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/", + "height": 461 + }, + "executionInfo": { + "elapsed": 1364148, + "status": "error", + "timestamp": 1721245643103, + "user": { + "displayName": "", + "userId": "" + }, + "user_tz": 240 + }, + "id": "7j5UICB4DSXZ", + "outputId": "470f4ccc-2fb6-4c74-9141-21da5c2f56d8", + "tags": [] + }, + "outputs": [], + "source": [ + "model.deploy(\n", + " endpoint=endpoint,\n", + " deployed_model_display_name=va_model_name,\n", + " traffic_percentage=100,\n", + " machine_type=machine_type,\n", + " min_replica_count=1,\n", + " max_replica_count=1,\n", + " accelerator_type=accelerator_type,\n", + " accelerator_count=accelerator_count,\n", + " enable_access_logging=True,\n", + " sync=True,\n", + ")\n", + "\n", + "print(f\"Model {model.display_name} deployed at endpoint {endpoint.display_name}.\")" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "8rLOVGXHIVbF", + "metadata": { + "id": "8rLOVGXHIVbF" + }, + "outputs": [], + "source": [ + "print(endpoint.gca_resource)\n", + "endpoint_name = endpoint.resource_name\n", + "print(endpoint_name)\n", + "print(endpoint.list_models())" + ] + }, + { + "cell_type": "markdown", + "id": "7ac1e9d1-ddf0-4fdd-b0f0-66f67fa543fb", + "metadata": {}, + "source": [ + "#### Endpoint Inference" + ] + }, + { + "cell_type": "markdown", + "id": "969ed41d-fa6a-4919-8625-a1a45fff2131", + "metadata": {}, + "source": [ + "Use the Endpoint object's `rawPredict` function to get responses from the deployed model, which accepts request that matches directly the input format of the model.\n", + "\n", + "If use the alternative `Predict` function, it will take the following parameters:\n", + "\n", + "* `instances`: A list of messages or prompts instances. Each instance should be an array of strings. \n", + "* `parameters`: A list of LLM model parameteres, e.g. temperature, max_tokens, top_p, stream.\n", + "\n", + "NREM NIM on Vertex AI Workbench supports both OpenAI Python API and CLI. " + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "ea11e507-54f9-4204-9422-590117ca6ec8", + "metadata": { + "tags": [] + }, + "outputs": [], + "source": [ + "# Create payload request\n", + "inputs = [\"Hello world\"]\n", + "\n", + "payload = {\n", + " \"model\": payload_model,\n", + " \"input\": inputs,\n", + " \"input_type\": \"query\"\n", + "}\n", + "\n", + "with open(\"request_nrem.json\", \"w\") as outfile: \n", + " json.dump(payload, outfile)" + ] + }, + { + "cell_type": "markdown", + "id": "2be7abd1-1ee0-47a1-8a09-27ac071d7511", + "metadata": {}, + "source": [ + "Python SDK" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "e331a4fc-988a-4907-9213-fffc4236e1a7", + "metadata": { + "tags": [] + }, + "outputs": [], + "source": [ + "import json\n", + "from pprint import pprint\n", + "from google.api import httpbody_pb2\n", + "from google.cloud import aiplatform_v1\n", + "\n", + "http_body = httpbody_pb2.HttpBody(\n", + " data=json.dumps(payload).encode(\"utf-8\"),\n", + " content_type=\"application/json\",\n", + ")\n", + "\n", + "req = aiplatform_v1.RawPredictRequest(\n", + " http_body=http_body, endpoint=endpoint.resource_name\n", + ")\n", + "\n", + "print(\"Request\")\n", + "print(req)\n", + "pprint(json.loads(req.http_body.data))\n", + "print()\n", + "\n", + "API_ENDPOINT = \"{}-aiplatform.googleapis.com\".format(region)\n", + "client_options = {\"api_endpoint\": API_ENDPOINT}\n", + "\n", + "pred_client = aiplatform.gapic.PredictionServiceClient(client_options=client_options)\n", + "\n", + "response = pred_client.raw_predict(req)\n", + "print(\"--------------------------------------------------------------------------------------\")\n", + "print(\"Response\")\n", + "print(\"Length of Embeddings:\", len(json.loads(response.data)['data'][0]['embedding']))\n", + "pprint(json.loads(response.data))" + ] + }, + { + "cell_type": "markdown", + "id": "2784d83f-6daa-4b69-8602-5fe829960a3f", + "metadata": {}, + "source": [ + "CLI" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "57ea7b8c-286f-4e1b-b810-431982e57ebb", + "metadata": { + "tags": [] + }, + "outputs": [], + "source": [ + "! curl \\\n", + " --request POST \\\n", + " --header \"Authorization: Bearer $(gcloud auth print-access-token)\" \\\n", + " --header \"Content-Type: application/json\" \\\n", + " https://$region-prediction-aiplatform.googleapis.com/v1/projects/$project_id/locations/$region/endpoints/$ENDPOINT_ID:rawPredict \\\n", + " --data \"@request_nrem.json\"" + ] + }, + { + "cell_type": "markdown", + "id": "iMk921f1QKeK", + "metadata": { + "id": "iMk921f1QKeK" + }, + "source": [ + "### Clean Up" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "Y_YbwDwxQJ1G", + "metadata": { + "id": "Y_YbwDwxQJ1G" + }, + "outputs": [], + "source": [ + "delete_endpoint = True\n", + "delete_model = True\n", + "delete_image = True\n", + "delete_art_repo = False\n", + "delete_bucket = False\n", + "\n", + "# Undeploy model and delete endpoint\n", + "try:\n", + " if delete_endpoint:\n", + " endpoint.undeploy_all(sync=True)\n", + " endpoint.delete()\n", + " print(f\"Deleted endpoint {endpoint.display_name}\")\n", + "except Exception as e:\n", + " print(e)\n", + "\n", + "# Delete the model resource\n", + "try:\n", + " if delete_model:\n", + " model.delete()\n", + " print(f\"Deleted model {model.display_name}\")\n", + "except Exception as e:\n", + " print(e)\n", + "\n", + "# Delete the container image from Artifact Registry\n", + "if delete_image:\n", + " !gcloud artifacts docker images delete --quiet --delete-tags {private_nim_image}\n", + "\n", + "# Delete the Artifact Repository\n", + "if delete_art_repo:\n", + " ! gcloud artifacts repositories delete {private_repository} --location={region} -q\n", + "\n", + "# Delete the Cloud Storage bucket\n", + "if delete_bucket:\n", + " ! gsutil rm -rf {bucket_url}" + ] + } + ], + "metadata": { + "colab": { + "name": "VertexAI NIM Deployment", + "provenance": [] + }, + "environment": { + "kernel": "conda-base-py", + "name": "workbench-notebooks.m123", + "type": "gcloud", + "uri": "us-docker.pkg.dev/deeplearning-platform-release/gcr.io/workbench-notebooks:m123" + }, + "kernelspec": { + "display_name": "Python 3 (ipykernel)", + "language": "python", + "name": "conda-base-py" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.10.14" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} diff --git a/cloud-service-providers/google-cloud/vertexai/nemo-retriever/requirements.txt b/cloud-service-providers/google-cloud/vertexai/nemo-retriever/requirements.txt new file mode 100644 index 00000000..80aa6635 --- /dev/null +++ b/cloud-service-providers/google-cloud/vertexai/nemo-retriever/requirements.txt @@ -0,0 +1,8 @@ +google-api-core==2.23.0 +google-api-python-client==2.154.0 +google-auth==2.36.0 +google-cloud-aiplatform==1.73.0 +google-cloud-artifact-registry==1.13.1 +google-cloud-storage==2.18.2 +openai==1.55.2 +requests diff --git a/cloud-service-providers/google-cloud/vertexai/nemo-retriever/samples/request_nrem.json b/cloud-service-providers/google-cloud/vertexai/nemo-retriever/samples/request_nrem.json new file mode 100644 index 00000000..a79b4c36 --- /dev/null +++ b/cloud-service-providers/google-cloud/vertexai/nemo-retriever/samples/request_nrem.json @@ -0,0 +1 @@ +{"model": "nvidia/nv-embedqa-e5-v5", "input": ["Hello word"], "input_type": "query"} \ No newline at end of file