From 411b6e4a9ca50ad649304196b001b38749b4d895 Mon Sep 17 00:00:00 2001 From: Rajesh Thallam Date: Wed, 9 Apr 2025 05:41:21 +0000 Subject: [PATCH 1/5] DeepSeek V3/R1 inference recipe on JetStream + MaxText + Pathways --- .../DeepSeek-V3-671B/README.md | 563 ++++++++++++++++++ .../convert-to-unscanned/batch_job.yaml | 38 ++ .../DeepSeek-V3-671B/docker/Dockerfile | 57 ++ .../DeepSeek-V3-671B/docker/cloudbuild.yml | 25 + .../DeepSeek-V3-671B/pathways.png | Bin 0 -> 132152 bytes .../DeepSeek-V3-671B/serve-model/Chart.yaml | 20 + .../templates/model-serve-configmap.yaml | 23 + .../templates/model-serve-launcher.yaml | 196 ++++++ .../templates/model-serve-svc.yaml | 26 + .../DeepSeek-V3-671B/values.yaml | 82 +++ 10 files changed, 1030 insertions(+) create mode 100644 inference/trillium/JetStream-Maxtext/DeepSeek-V3-671B/README.md create mode 100644 inference/trillium/JetStream-Maxtext/DeepSeek-V3-671B/convert-checkpoint/convert-to-unscanned/batch_job.yaml create mode 100644 inference/trillium/JetStream-Maxtext/DeepSeek-V3-671B/docker/Dockerfile create mode 100644 inference/trillium/JetStream-Maxtext/DeepSeek-V3-671B/docker/cloudbuild.yml create mode 100644 inference/trillium/JetStream-Maxtext/DeepSeek-V3-671B/pathways.png create mode 100644 inference/trillium/JetStream-Maxtext/DeepSeek-V3-671B/serve-model/Chart.yaml create mode 100644 inference/trillium/JetStream-Maxtext/DeepSeek-V3-671B/serve-model/templates/model-serve-configmap.yaml create mode 100644 inference/trillium/JetStream-Maxtext/DeepSeek-V3-671B/serve-model/templates/model-serve-launcher.yaml create mode 100644 inference/trillium/JetStream-Maxtext/DeepSeek-V3-671B/serve-model/templates/model-serve-svc.yaml create mode 100644 inference/trillium/JetStream-Maxtext/DeepSeek-V3-671B/values.yaml diff --git a/inference/trillium/JetStream-Maxtext/DeepSeek-V3-671B/README.md b/inference/trillium/JetStream-Maxtext/DeepSeek-V3-671B/README.md new file mode 100644 index 0000000..8db5236 --- /dev/null +++ b/inference/trillium/JetStream-Maxtext/DeepSeek-V3-671B/README.md @@ -0,0 +1,563 @@ +# DeepSeek R1/V3 Multi-host Inference on TPU v6e with JetStream, MaxText and Pathways on Cloud with GKE Cluster + +This recipe outlines the steps to benchmark [DeepSeek-V3](https://huggingface.co/deepseek-ai/DeepSeek-V3) or [DeepSeek-R1](https://huggingface.co/deepseek-ai/DeepSeek-R1) 671B model using [JetStream](https://github.com/AI-Hypercomputer/JetStream/tree/main) \+ [MaxText](https://github.com/AI-Hypercomputer/maxtext) inference engine deployed on a GKE cluster with multi-host [TPU v6e slices](https://cloud.google.com/kubernetes-engine) utilizing Pathways on Cloud. + +* [Jetstream](https://github.com/AI-Hypercomputer/JetStream) is a throughput and memory-optimized engine for LLM inference on XLA devices, primarily TPUs written in JAX. +* [MaxText](https://github.com/AI-Hypercomputer/maxtext) is an open-source LLM project by Google, written in JAX and designed to be highly performant and scalable, running efficiently on Google Cloud TPUs and GPUs. +* Pathways is a system that simplifies large-scale ML computations by enabling a single JAX client to orchestrate workloads across multiple large TPU slices, spanning thousands of TPU chips. +* [TPUs](https://cloud.google.com/tpu/docs/v6e) are Google's custom-developed accelerator for ML and AI models built using frameworks such as TensorFlow, PyTorch, and JAX. TPU v6e is Cloud TPU's latest generation AI accelerator. + +## Outline + +- [DeepSeek R1/V3 Multi-host Inference on TPU v6e with JetStream, MaxText and Pathways on Cloud with GKE Cluster](#deepseek-r1v3-multi-host-inference-on-tpu-v6e-with-jetstream-maxtext-and-pathways-on-cloud-with-gke-cluster) + - [Outline](#outline) + - [Prerequisites](#prerequisites) + - [Setup your local environment](#setup-your-local-environment) + - [Clone the recipe](#clone-the-recipe) + - [Configure environment settings](#configure-environment-settings) + - [Create GKE Cluster with TPU v6e nodepool using xpk](#create-gke-cluster-with-tpu-v6e-nodepool-using-xpk) + - [Create a Cloud Storage bucket to store checkpoints and temporary files](#create-a-cloud-storage-bucket-to-store-checkpoints-and-temporary-files) + - [Configure a service account for access {#configure-a-service-account-for-access}](#configure-a-service-account-for-access-configure-a-service-account-for-access) + - [Build JetStream/MaxText container image to deploy the workload {#build-jetstream/maxtext-container-image-to-deploy-the-workload}](#build-jetstreammaxtext-container-image-to-deploy-the-workload-build-jetstreammaxtext-container-image-to-deploy-the-workload) + - [Create Artifact Registry repository to store Docker images](#create-artifact-registry-repository-to-store-docker-images) + - [Configure Docker to authenticate to Artifact Registry](#configure-docker-to-authenticate-to-artifact-registry) + - [Build and push the Docker container image to Artifact Registry](#build-and-push-the-docker-container-image-to-artifact-registry) + - [Checkpoint conversion](#checkpoint-conversion) + - [Convert Hugging Face checkpoint from FP8 to BF16 {#convert-hugging-face-checkpoint-from-fp8-to-bf16}](#convert-hugging-face-checkpoint-from-fp8-to-bf16-convert-hugging-face-checkpoint-from-fp8-to-bf16) + - [Convert Hugging Face BF16 checkpoint to MaxText compatible checkpoint](#convert-hugging-face-bf16-checkpoint-to-maxtext-compatible-checkpoint) + - [Deploy JetStream and Pathways](#deploy-jetstream-and-pathways) + - [Deploy LeaderWorkerSet (LWS) API](#deploy-leaderworkerset-lws-api) + - [Deploy the workload manifest](#deploy-the-workload-manifest) + - [Run MMLU benchmark](#run-mmlu-benchmark) + - [Cleanup](#cleanup) + +## Prerequisites + +1. Verify that your project has enough quota in your region of choice for: + * A Cloud TPU slice, for example v6e-64 (`TPUS_PER_TPU_FAMILY`) + * A GCE VM with the M1 machine configuration for 160 chips (`M1_CPUS`) +2. Required IAM Permissions + Make sure that you have the following roles on the project: + * Compute Admin (`roles/compute.admin`) + * Kubernetes Engine Admin (`roles/container.admin`) + * Storage Admin (`roles/storage.admin`) + * Logging Admin (`roles/logging.admin`) + * Monitoring Admin (`roles/monitoring.admin`) + * Artifact Registry Writer (`roles/artifactregistry.writer`) + * Service Account Admin (`roles/iam.serviceAccountAdmin`) + * Project IAM Admin (`roles/resourcemanager.projectIamAdmin`) +3. Access to Pathways Container Images + You run a Pathways cluster on GKE in one of the Pathways container images. To access the Pathways container images, the service account used by the cluster must be allowlisted. Reach out to your GCP account team to request access. +4. Access to DeepSeek models on Hugging Face. + To access the [DeepSeek-V3](https://huggingface.co/deepseek-ai/DeepSeek-V3) or [DeepSeek-R1](https://huggingface.co/deepseek-ai/DeepSeek-R1) model through Hugging Face, you'll need a Hugging Face token. Follow these steps to generate a new token if you don't have one already: + * Create a [Hugging Face account](https://huggingface.co/), if you don't already have one. + * Click Your **Profile \> Settings \> Access Tokens**. + * Select **New Token**. + * Specify a Name and a Role of at least Read. + * Select **Generate a token**. + * Copy the generated token to your clipboard. + +## Setup your local environment + +We recommend running this recipe from [Cloud Shell](https://console.cloud.google.com/?cloudshell=true) or a client workstation with the following pre-installed: + +* [Google Cloud SDK](https://cloud.google.com/sdk/docs/install) +* [Helm](https://helm.sh/docs/intro/install/) +* [kubectl](https://kubernetes.io/docs/tasks/tools/install-kubectl-linux/) + +Install [xpk](https://github.com/AI-Hypercomputer/xpk) toolkit that lets you create pre-configured GKE clusters that support Pathways-based workloads + +``` bash +git clone https://github.com/AI-Hypercomputer/xpk.git ~/xpk +cd ~/xpk +make install && export PATH=$PATH:$PWD/bin +``` + +### Clone the recipe + +From your client, clone the [`tpu-recipes`](https://github.com/AI-Hypercomputer/tpu-recipes) repository and set a reference to the recipe folder. + +``` bash +git clone https://github.com/ai-hypercomputer/tpu-recipes.git +cd tpu-recipes +export REPO_ROOT=`git rev-parse --show-toplevel` +export RECIPE_ROOT=$REPO_ROOT/inference/trillium/JetStream-Maxtext/DeepSeek-V3-671B +``` + +### Configure environment settings + +Define the following environment variables with values appropriate to your workload: + +``` bash +# Required variables to be set +export PROJECT_ID= +export REGION= +export CLUSTER_NAME= +export CLUSTER_ZONE= +export GCS_BUCKET= +export TPU_RESERVATION= + +# Required variables with default values +export TPU_TYPE=v6e-64 +export NUM_SLICES=1 +export CLUSTER_CPU_MACHINE_TYPE=n2d-standard-32 +export CLUSTER_CKPT_NODEPOOL_NAME=ckpt-conversion-node-pool-0 +export CLUSTER_CKPT_NODE_MACHINE_TYPE=m1-ultramem-160 +export CLUSTER_CKPT_NODE_REGION=us-east4 +export CLUSTER_CKPT_NODE_DISK_SIZE=3000 +export CLUSTER_CKPT_NUM_NODES=1 +export ARTIFACT_REGISTRY_REPO_NAME=jetstream-maxtext-ar +export ARTIFACT_REGISTRY=${REGION}-docker.pkg.dev/${PROJECT_ID}/${ARTIFACT_REGISTRY_REPO_NAME} +export JETSTREAM_MAXTEXT_IMAGE=jetstream-maxtext +export JETSTREAM_MAXTEXT_VERSION=latest +export MODEL_NAME=deepseek3-671b +export GCS_CKPT_PATH_BF16=gs://${GCS_BUCKET}/models/${MODEL_NAME}/bf16 +export GCS_CKPT_PATH_UNSCANNED=gs://${GCS_BUCKET}/models/${MODEL_NAME}/unscanned +``` + +Following are required variables that must be set: + +- ``: your Google Cloud project ID +- ``: the region where you want to run Cloud Build +- ``: the name of your GKE cluster +- ``: the zone where your cluster is located +- ``: the name of your Cloud Storage bucket. Do not include the gs:// prefix +- ``: the name of the TPU reservation + +Following are required variables with default values already set: + +- `TPU_TYPE`: TPU accelerator type supported by TPU v6e. Refer to the [supported list](https://cloud.google.com/tpu/docs/v6e#configurations). +- `NUM_SLICES`: The number of slices to use +- `CLUSTER_CPU_MACHINE_TYPE`: The CPU nodepool machine type +- `CLUSTER_CKPT_NODEPOOL_NAME`: The name of CPU nodepool used for checkpoint conversion +- `CLUSTER_CKPT_NODE_MACHINE_TYPE`: The machine type of CPU nodepool used for checkpoint conversion +- `CLUSTER_CKPT_NODE_DISK_SIZE`: The disk size of CPU nodepool used for checkpoint conversion. For this recipe, a minimum of 3TB disk size is suggested. +- CLUSTER\_CKPT\_NUM\_NODES +- `ARTIFACT_REGISTRY`: the full name of your Artifact Registry in the following format: *LOCATION*\-docker.pkg.dev/*PROJECT\_ID*/*REPOSITORY* +- `JETSTREAM_MAXTEXT_IMAGE`: the name of the JetStream MaxText image +- `JETSTREAM_MAXTEXT_VERSION`: the version of the JetStream MaxText image + +Set the default project: + +``` bash +gcloud config set project $PROJECT_ID +``` + +## Create GKE Cluster with TPU v6e nodepool using xpk + +Use a custom network for better performance as well as to avoid having the default network becoming overloaded. Please refer to the [network performance optimizations](https://cloud.google.com/tpu/docs/v6e-intro/#network_performance_optimizations) for more details. + +``` bash +export NETWORK_NAME_1=${CLUSTER_NAME}-mtu9k-1 +export NETWORK_FW_NAME_1=${NETWORK_NAME_1}-fw-1 + +# Use a custom network for better performance as well as avoid the default network to be overloaded. +gcloud compute networks create ${NETWORK_NAME_1} --mtu=8896 --project=${PROJECT_ID} --subnet-mode=auto --bgp-routing-mode=regional +gcloud compute firewall-rules create ${NETWORK_FW_NAME_1} --network ${NETWORK_NAME_1} --allow tcp,icmp,udp --project=${PROJECT_ID} + +# Secondary subnet for multinic experience. Need custom ip routing to be different from first network’s subnet. +export NETWORK_NAME_2=${CLUSTER_NAME}-privatenetwork-4 +export SUBNET_NAME_2=${CLUSTER_NAME}-privatesubnet-4 +export FIREWALL_RULE_NAME=${CLUSTER_NAME}-privatefirewall-4 +export ROUTER_NAME=${CLUSTER_NAME}-network-4 +export NAT_CONFIG=${CLUSTER_NAME}-natconfig-4 + +# Create networks +gcloud compute networks create "${NETWORK_NAME_2}" --mtu=8896 --bgp-routing-mode=regional --subnet-mode=custom --project=${PROJECT_ID} + +# Create subnets +gcloud compute networks subnets create "${SUBNET_NAME_2}" --network="${NETWORK_NAME_2}" --range=10.10.0.0/18 --region="${REGION}" --project=${PROJECT_ID} + +# Create Firewall rules +gcloud compute firewall-rules create "${FIREWALL_RULE_NAME}" --network "${NETWORK_NAME_2}" --allow tcp,icmp,udp --project="${PROJECT_ID}" + +# Create router +gcloud compute routers create "${ROUTER_NAME}" \ + --project="${PROJECT_ID}" \ + --network="${NETWORK_NAME_2}" \ + --region="${REGION}" + +# Create NAT +gcloud compute routers nats create "${NAT_CONFIG}" \ + --router="${ROUTER_NAME}" \ + --region="${REGION}" \ + --auto-allocate-nat-external-ips \ + --nat-all-subnet-ip-ranges \ + --project="${PROJECT_ID}" \ + --enable-logging +``` + +Create GKE cluster using xpk toolkit with custom network and TPU v6e nodepool + +``` bash +export CLUSTER_ARGUMENTS="--enable-dataplane-v2 --enable-ip-alias --enable-multi-networking --network=${NETWORK_NAME_1} --subnetwork=${NETWORK_NAME_1} --scopes cloud-platform" + +export NODE_POOL_ARGUMENTS="--additional-node-network network=${NETWORK_NAME_2},subnetwork=${SUBNET_NAME_2} --scopes cloud-platform --workload-metadata=GCE_METADATA --placement-type=COMPACT" + +python3 ~/xpk/xpk.py cluster create \ + --cluster $CLUSTER_NAME \ + --default-pool-cpu-machine-type=$CLUSTER_CPU_MACHINE_TYPE \ + --num-slices=$NUM_SLICES \ + --tpu-type=$TPU_TYPE \ + --zone=${CLUSTER_ZONE} \ + --project=${PROJECT_ID} \ + --reservation=${TPU_RESERVATION} \ + --custom-cluster-arguments="${CLUSTER_ARGUMENTS}" \ + --custom-nodepool-arguments="${NODE_POOL_ARGUMENTS}" +``` + +## Create a Cloud Storage bucket to store checkpoints and temporary files + +Create a Cloud Storage bucket to store model checkpoint, Pathways temporary files like compilation cache. It's recommended to create a bucket in the same region as the TPU nodepool is located. + +``` bash +gcloud storage buckets create gs://$GCS_BUCKET --location=$REGION +``` + +## Configure a service account for access {#configure-a-service-account-for-access} + +Configure a Kubernetes service account to act as an IAM service account. + +* Create an IAM service account for your application: + +``` bash +gcloud iam service-accounts create jetstream-pathways +``` + +* Add an IAM policy binding for your IAM service account to manage Cloud Storage. This is to access the storage bucket where your checkpoint will be stored: + +``` bash +gcloud projects add-iam-policy-binding ${PROJECT_ID} \ + --member "serviceAccount:jetstream-pathways@${PROJECT_ID}.iam.gserviceaccount.com" \ + --role roles/storage.objectUser + +gcloud projects add-iam-policy-binding ${PROJECT_ID} \ + --member "serviceAccount:jetstream-pathways@${PROJECT_ID}.iam.gserviceaccount.com" \ + --role roles/storage.insightsCollectorService +``` + +* Annotate the Kubernetes service account with the email address of the IAM service account. + +``` bash +kubectl annotate serviceaccount default \ +iam.gke.io/gcp-service-account=jetstream-pathways@${PROJECT_ID}.iam.gserviceaccount.com +``` + +## Build JetStream/MaxText container image to deploy the workload {#build-jetstream/maxtext-container-image-to-deploy-the-workload} + +### Create Artifact Registry repository to store Docker images + +``` bash +gcloud artifacts repositories create ${ARTIFACT_REGISTRY_REPO_NAME} \ + --repository-format=docker \ + --location=${REGION} \ + --description="Repository for JetStream/MaxText container images" \ + --project=${PROJECT_ID} +``` + +### Configure Docker to authenticate to Artifact Registry + +[Configure Docker](https://cloud.google.com/artifact-registry/docs/docker/authentication#gcloud-helper) to authenticate to Artifact Registry to pull the allowlisted Pathways images + +``` bash +gcloud auth configure-docker ${REGION}-docker.pkg.dev +``` + +### Build and push the Docker container image to Artifact Registry + +To build the container, submit a Cloud Build job to build and push the container image running the following command from your client: + +``` bash +cd $RECIPE_ROOT/docker +gcloud builds submit \ + --project=${PROJECT_ID} \ + --region=${REGION} \ + --config cloudbuild.yml \ + --substitutions _ARTIFACT_REGISTRY=$ARTIFACT_REGISTRY,_JETSTREAM_MAXTEXT_IMAGE=$JETSTREAM_MAXTEXT_IMAGE,_JETSTREAM_MAXTEXT_VERSION=$JETSTREAM_MAXTEXT_VERSION \ + --timeout "2h" \ + --machine-type=e2-highcpu-32 \ + --disk-size=1000 \ + --quiet \ + --async +``` + +This command outputs the `BUILD ID`. You can monitor the build progress by streaming the logs for the `BUILD ID`. To do this, run the following command with `` replaced with your build ID. + +``` bash +BUILD_ID= +gcloud beta builds log $BUILD_ID --region=$REGION +``` + +## Checkpoint conversion + +### Convert Hugging Face checkpoint from FP8 to BF16 {#convert-hugging-face-checkpoint-from-fp8-to-bf16} + +Run the following steps for conversion: + +* Download DeepSeek V3 or DeepSeek R1 weights from HuggingFace + +``` bash +mkdir -p /models/deepseek_fp8 +huggingface-cli download deepseek-ai/DeepSeek-R1 --local-dir /models/deepseek_fp8 +``` + +* Clone DeepSeek-V3 github repo to setup the environment for FP8 to BF16 conversion + +``` bash +git clone https://github.com/deepseek-ai/DeepSeek-V3.git && \ +cd DeepSeek-V3/inference && \ +pip install -r requirements.txt +``` + +* Run the FP8 to BF16 conversion + +``` bash +python3 fp8_cast_bf16.py \ + --input-fp8-hf-path /models/deepseek_fp8 \ + --output-bf16-hf-path /models/deepseek_fp16 +``` + +* Upload converted checkpoints to Cloud Storage bucket + +``` bash +gcloud storage cp -r /models/deepseek_fp16 ${GCS_CKPT_PATH_BF16} +``` + +### Convert Hugging Face BF16 checkpoint to MaxText compatible checkpoint + +This step requires an `m1-ultramem-160` (memory-optimized) machine with 3TB of storage that can be run. The recipe uses Cloud Batch job to run the conversion. + +Run the checkpoint conversion from BF16 weights to MaxText compatible format (unscanned checkpoint) for efficient serving. This step can take \~1-2 hours. + +``` bash +cd $RECIPE_ROOT/convert-checkpoint/convert-to-unscanned +gcloud batch jobs submit convert-ckpt-to-unscanned-$(date +%Y%m%d-%H%M%S) \ + --location ${CLUSTER_CKPT_NODE_REGION} \ + --config batch_job.yaml +``` + +## Deploy JetStream and Pathways + +Get cluster credentials and connect to the GKE cluster + +``` bash +gcloud container clusters get-credentials $CLUSTER_NAME --region $REGION --project $PROJECT_ID +``` + +### Deploy LeaderWorkerSet (LWS) API + +LWS is a custom resource designed for deploying and managing stateful, distributed applications, particularly those with a leader-worker architecture. It's especially well-suited for AI/ML workloads where a large model is sharded and served across multiple devices on multiple nodes. + +``` bash +VERSION=v0.6.0 +kubectl apply --server-side -f "https://github.com/kubernetes-sigs/lws/releases/download/${VERSION}/manifests.yaml" +``` + +Validate that the LeaderWorkerSet controller is running in the lws-system namespace: + +``` bash +kubectl get pod -n lws-system +``` + +The output should be similar to the following: + +``` bash +NAME READY STATUS RESTARTS AGE +lws-controller-manager-abcd 2/2 Running 0 12d +lws-controller-manager-efgh 2/2 Running 0 12d +``` + +### Deploy the workload manifest + +This step starts the JetStream inference engine and Pathways. + +![](./pathways.png) + +Note: Each Host corresponds to a TPU VM + +Install the helm chart to serve the unscanned model checkpoint and bring up the JetStream MaxText Engine server on Pathways system + +``` bash +cd $RECIPE_ROOT +helm install -f values.yaml \ +--set volumes.gcsMounts[0].bucketName=${GCS_BUCKET} \ +--set clusterName=$CLUSTER_NAME \ +--set job.jax_tpu_image.repository=${ARTIFACT_REGISTRY}/${JETSTREAM_MAXTEXT_IMAGE} \ +--set job.jax_tpu_image.tag=${JETSTREAM_MAXTEXT_VERSION} \ +--set maxtext_config.load_parameters_path=${GCS_CKPT_PATH_UNSCANNED}/0/items \ +jetstream-pathways \ +$RECIPE_ROOT/serve-model +``` + +You can check the status of the job via: + +``` bash +kubectl get pods +``` + +``` bash +NAME READY STATUS RESTARTS AGE +jetstream-pathways-0 4/4 Running 0 11h +jetstream-pathways-0-1 1/1 Running 0 11h +jetstream-pathways-0-10 1/1 Running 0 11h +jetstream-pathways-0-11 1/1 Running 0 11h +jetstream-pathways-0-12 1/1 Running 0 11h +jetstream-pathways-0-13 1/1 Running 0 11h +jetstream-pathways-0-14 1/1 Running 0 11h +jetstream-pathways-0-15 1/1 Running 0 11h +jetstream-pathways-0-16 1/1 Running 0 11h +jetstream-pathways-0-2 1/1 Running 0 11h +jetstream-pathways-0-3 1/1 Running 0 11h +jetstream-pathways-0-4 1/1 Running 0 11h +jetstream-pathways-0-5 1/1 Running 0 11h +jetstream-pathways-0-6 1/1 Running 0 11h +jetstream-pathways-0-7 1/1 Running 0 11h +jetstream-pathways-0-8 1/1 Running 0 11h +jetstream-pathways-0-9 1/1 Running 0 11h +``` + +To view the logs for the deployment, run + +``` bash +kubectl logs -f jetstream-pathways-0 -c jax-tpu +``` + +You should see the following in the logs When the server is up and running: + +``` bash +INFO: Started server process [1] +INFO: Waiting for application startup. +INFO: Application startup complete. +INFO: Uvicorn running on http://0.0.0.0:9999 (Press CTRL+C to quit) +``` + +After the server is up and running, you can now prompt the model + +``` bash +curl --request POST --header "Content-type: application/json" -s localhost:8000/generate --data '{ + "prompt": "What are the top 5 programming languages", + "max_tokens": 200 +}' +``` + +## Run MMLU benchmark + +After the JetStream server is up and running, SSH into one of the \`jax-tpu\` workers + +``` bash +kubectl exec -it jetstream-pathways-0 -c jax-tpu -- /bin/bash +``` + +Download full MMLU set + +``` bash +LOCAL_DIR=/data +mkdir -p ${LOCAL_DIR}/mmlu +cd ${LOCAL_DIR}/mmlu +wget https://people.eecs.berkeley.edu/~hendrycks/data.tar -P ${LOCAL_DIR}/mmlu +tar -xvf data.tar +``` + +Run the benchmarking script + +``` bash +python3 /JetStream/benchmarks/benchmark_serving.py \ + --use-hf-tokenizer=True \ + --use-chat-template=False \ + --hf-access-token=$HF_TOKEN \ + --tokenizer=deepseek-ai/DeepSeek-R1 \ + --num-prompts 14037 \ + --dataset mmlu \ + --dataset-path ${LOCAL_DIR}/mmlu/data/test \ + --request-rate 0 \ + --warmup-mode sampled \ + --save-request-outputs \ + --num-shots=5 \ + --run-eval True \ + --model=deepseek3-671b \ + --save-result +``` + +The results will be printed at the end and the accuracy and throughput numbers will be saved by default to `JetStream-0.0qps-deepseek3-671b-*.json` and inputs, model predictions, and outputs will be saved by default to `$HOME/tmp/request-outputs.json` + +You can also run a lighter weight experiment to quickly confirm the numbers are good by changing: + +``` bash +python3 /JetStream/benchmarks/benchmark_serving.py \ + --use-hf-tokenizer=True \ + --use-chat-template=False \ + --tokenizer=deepseek-ai/DeepSeek-R1 \ + --dataset mmlu \ + --dataset-path /JetStream/benchmarks/mmlu_test_dataset \ + --num-prompts 200 \ + --request-rate 0 \ + --warmup-mode sampled \ + --save-request-outputs \ + --num-shots=5 \ + --run-eval True \ + --model=deepseek3-671b \ + --save-result +``` + +## Cleanup + +* Delete GKE cluster with v6e TPU nodepool + +``` bash +gcloud container clusters delete $CLUSTER_NAME --zone $CLUSTER_ZONE +``` + +* Delete Cloud Storage buckets + +``` bash +gcloud storage buckets delete ${GCS_BUCKET} +``` + +* Delete VPC networks, subnets, routers, gateways and firewall policies used by the GKE cluster + +``` bash +# --- Delete Resources for Network 2 (${NETWORK_NAME_2}) --- +# Order: NAT -> Router -> Firewall Rule -> Subnet -> Network + +echo "Deleting NAT Gateway: ${NAT_CONFIG}..." +gcloud compute routers nats delete ${NAT_CONFIG} \ + --router=${ROUTER_NAME} \ + --region=${REGION} \ + --project=${PROJECT_ID} \ + --quiet || echo "Warning: Failed to delete NAT ${NAT_CONFIG} (may already be deleted or dependencies exist)." + +echo "Deleting Router: ${ROUTER_NAME}..." +gcloud compute routers delete ${ROUTER_NAME} \ + --region=${REGION} \ + --project=${PROJECT_ID} \ + --quiet || echo "Warning: Failed to delete Router ${ROUTER_NAME} (may already be deleted or dependencies exist)." + +echo "Deleting Firewall Rule: ${FIREWALL_RULE_NAME}..." +gcloud compute firewall-rules delete ${FIREWALL_RULE_NAME} \ + --project=${PROJECT_ID} \ + --quiet || echo "Warning: Failed to delete Firewall Rule ${FIREWALL_RULE_NAME} (may already be deleted)." + +echo "Deleting Subnet: ${SUBNET_NAME_2}..." +gcloud compute networks subnets delete ${SUBNET_NAME_2} \ + --region=${REGION} \ + --project=${PROJECT_ID} \ + --quiet || echo "Warning: Failed to delete Subnet ${SUBNET_NAME_2} (may already be deleted or dependencies exist)." + +echo "Deleting Network: ${NETWORK_NAME_2}..." +gcloud compute networks delete ${NETWORK_NAME_2} \ + --project=${PROJECT_ID} \ + --quiet || echo "Warning: Failed to delete Network ${NETWORK_NAME_2} (may already be deleted or dependencies exist)." + +# --- Delete Resources for Network 1 (${NETWORK_NAME_1}) --- +# Order: Firewall Rule -> Network (Auto-created subnets are deleted with the network if empty) + +echo "Deleting Firewall Rule: ${NETWORK_FW_NAME_1}..." +gcloud compute firewall-rules delete ${NETWORK_FW_NAME_1} \ + --project=${PROJECT_ID} \ + --quiet || echo "Warning: Failed to delete Firewall Rule ${NETWORK_FW_NAME_1} (may already be deleted)." + +echo "Deleting Network: ${NETWORK_NAME_1}..." +gcloud compute networks delete ${NETWORK_NAME_1} \ + --project=${PROJECT_ID} \ + --quiet || echo "Warning: Failed to delete Network ${NETWORK_NAME_1} (may already be deleted or dependencies exist)." +``` \ No newline at end of file diff --git a/inference/trillium/JetStream-Maxtext/DeepSeek-V3-671B/convert-checkpoint/convert-to-unscanned/batch_job.yaml b/inference/trillium/JetStream-Maxtext/DeepSeek-V3-671B/convert-checkpoint/convert-to-unscanned/batch_job.yaml new file mode 100644 index 0000000..9f5ff7c --- /dev/null +++ b/inference/trillium/JetStream-Maxtext/DeepSeek-V3-671B/convert-checkpoint/convert-to-unscanned/batch_job.yaml @@ -0,0 +1,38 @@ +# Copyright 2025 Google LLC +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +taskGroups: + - taskSpec: + runnables: + - container: + imageUri: ${ARTIFACT_REGISTRY}/${JETSTREAM_MAXTEXT_IMAGE}:${JETSTREAM_MAXTEXT_VERSION} + entrypoint: "/bin/sh" + commands: + - "-c" + - mkdir -p /workspace/models/ && gcloud storage cp -r ${GCS_CKPT_PATH_BF16} /workspace/models/ && JAX_PLATFORMS='' python3 /maxtext/MaxText/convert_deepseek_unscanned_ckpt.py --base_model_path /workspace/models --maxtext_model_path ${GCS_CKPT_PATH_UNSCANNED} --model_size $MODEL_NAME --use-zarr3 false --use-ocdbt false + computeResource: + cpuMilli: 160000 + memoryMib: 3936256 +# Define the allocation policy for provisioning VMs +allocationPolicy: + location: + allowedLocations: ["regions/${CLUSTER_CKPT_NODE_REGION}"] + instances: + - policy: + machineType: ${CLUSTER_CKPT_NODE_MACHINE_TYPE} + bootDisk: + type: pd-ssd + sizeGb: 3000 +logsPolicy: + destination: CLOUD_LOGGING \ No newline at end of file diff --git a/inference/trillium/JetStream-Maxtext/DeepSeek-V3-671B/docker/Dockerfile b/inference/trillium/JetStream-Maxtext/DeepSeek-V3-671B/docker/Dockerfile new file mode 100644 index 0000000..bde93ef --- /dev/null +++ b/inference/trillium/JetStream-Maxtext/DeepSeek-V3-671B/docker/Dockerfile @@ -0,0 +1,57 @@ +# Copyright 2025 Google LLC +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +FROM ubuntu:22.04 + +ENV DEBIAN_FRONTEND=noninteractive + +# Install dependencies +RUN apt -y update && apt install -y --no-install-recommends \ + apt-transport-https ca-certificates gnupg git wget \ + python3.10 python3-pip curl nano vim + +RUN update-alternatives --install /usr/bin/python3 python3 /usr/bin/python3.10 1 + +# Install google cloud sdk +RUN echo "deb [signed-by=/usr/share/keyrings/cloud.google.gpg] https://packages.cloud.google.com/apt cloud-sdk main" \ + | tee -a /etc/apt/sources.list.d/google-cloud-sdk.list \ + && curl https://packages.cloud.google.com/apt/doc/apt-key.gpg \ + | gpg --dearmor -o /usr/share/keyrings/cloud.google.gpg \ + && apt-get update -y \ + && apt-get install google-cloud-sdk -y + +# Install pip +RUN python3 -m pip install --upgrade pip + +# Set environment variables +ENV JAX_PLATFORMS=proxy +ENV JAX_BACKEND_TARGET=grpc://localhost:38681 +ENV XCLOUD_ENVIRONMENT=GCP + +# Install JetStream and MaxText + +RUN git clone https://github.com/AI-Hypercomputer/JetStream.git && \ +git clone https://github.com/AI-Hypercomputer/maxtext.git && \ +git clone https://github.com/google/aqt.git + +RUN cd /maxtext && bash setup.sh && pip install torch --index-url https://download.pytorch.org/whl/cpu + +RUN pip install setuptools fastapi uvicorn rouge_score scikit-learn + +RUN cd /JetStream && pip install -e . + +RUN apt -y update && apt-get -y install python3-dev && apt-get -y install build-essential +RUN cp -r /aqt/aqt/* /usr/local/lib/python3.10/dist-packages/aqt/ + +ENTRYPOINT [ "/bin/bash" ] \ No newline at end of file diff --git a/inference/trillium/JetStream-Maxtext/DeepSeek-V3-671B/docker/cloudbuild.yml b/inference/trillium/JetStream-Maxtext/DeepSeek-V3-671B/docker/cloudbuild.yml new file mode 100644 index 0000000..7a4c060 --- /dev/null +++ b/inference/trillium/JetStream-Maxtext/DeepSeek-V3-671B/docker/cloudbuild.yml @@ -0,0 +1,25 @@ +# Copyright 2025 Google LLC +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +steps: +- name: 'gcr.io/cloud-builders/docker' + args: + - 'build' + - '--tag=${_ARTIFACT_REGISTRY}/${_JETSTREAM_MAXTEXT_IMAGE}:${_JETSTREAM_MAXTEXT_VERSION}' + - '--file=Dockerfile' + - '.' + automapSubstitutions: true + +images: +- ${_ARTIFACT_REGISTRY}/${_JETSTREAM_MAXTEXT_IMAGE}:${_JETSTREAM_MAXTEXT_VERSION} \ No newline at end of file diff --git a/inference/trillium/JetStream-Maxtext/DeepSeek-V3-671B/pathways.png b/inference/trillium/JetStream-Maxtext/DeepSeek-V3-671B/pathways.png new file mode 100644 index 0000000000000000000000000000000000000000..720cba0a9fa5b9744e3dcb986bcc545745cf8232 GIT binary patch literal 132152 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 z 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

A@20F$n+nx=jaU3cb})!A<;J* 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 Date: Wed, 9 Apr 2025 05:51:51 +0000 Subject: [PATCH 2/5] DeepSeek V3/R1 inference recipe on Trillium with JetStream + MaxText + Pathways --- .../DeepSeek-V3-671B/README.md | 38 +++++++------------ 1 file changed, 14 insertions(+), 24 deletions(-) diff --git a/inference/trillium/JetStream-Maxtext/DeepSeek-V3-671B/README.md b/inference/trillium/JetStream-Maxtext/DeepSeek-V3-671B/README.md index 8db5236..aa33036 100644 --- a/inference/trillium/JetStream-Maxtext/DeepSeek-V3-671B/README.md +++ b/inference/trillium/JetStream-Maxtext/DeepSeek-V3-671B/README.md @@ -9,27 +9,17 @@ This recipe outlines the steps to benchmark [DeepSeek-V3](https://huggingface.co ## Outline -- [DeepSeek R1/V3 Multi-host Inference on TPU v6e with JetStream, MaxText and Pathways on Cloud with GKE Cluster](#deepseek-r1v3-multi-host-inference-on-tpu-v6e-with-jetstream-maxtext-and-pathways-on-cloud-with-gke-cluster) - - [Outline](#outline) - - [Prerequisites](#prerequisites) - - [Setup your local environment](#setup-your-local-environment) - - [Clone the recipe](#clone-the-recipe) - - [Configure environment settings](#configure-environment-settings) - - [Create GKE Cluster with TPU v6e nodepool using xpk](#create-gke-cluster-with-tpu-v6e-nodepool-using-xpk) - - [Create a Cloud Storage bucket to store checkpoints and temporary files](#create-a-cloud-storage-bucket-to-store-checkpoints-and-temporary-files) - - [Configure a service account for access {#configure-a-service-account-for-access}](#configure-a-service-account-for-access-configure-a-service-account-for-access) - - [Build JetStream/MaxText container image to deploy the workload {#build-jetstream/maxtext-container-image-to-deploy-the-workload}](#build-jetstreammaxtext-container-image-to-deploy-the-workload-build-jetstreammaxtext-container-image-to-deploy-the-workload) - - [Create Artifact Registry repository to store Docker images](#create-artifact-registry-repository-to-store-docker-images) - - [Configure Docker to authenticate to Artifact Registry](#configure-docker-to-authenticate-to-artifact-registry) - - [Build and push the Docker container image to Artifact Registry](#build-and-push-the-docker-container-image-to-artifact-registry) - - [Checkpoint conversion](#checkpoint-conversion) - - [Convert Hugging Face checkpoint from FP8 to BF16 {#convert-hugging-face-checkpoint-from-fp8-to-bf16}](#convert-hugging-face-checkpoint-from-fp8-to-bf16-convert-hugging-face-checkpoint-from-fp8-to-bf16) - - [Convert Hugging Face BF16 checkpoint to MaxText compatible checkpoint](#convert-hugging-face-bf16-checkpoint-to-maxtext-compatible-checkpoint) - - [Deploy JetStream and Pathways](#deploy-jetstream-and-pathways) - - [Deploy LeaderWorkerSet (LWS) API](#deploy-leaderworkerset-lws-api) - - [Deploy the workload manifest](#deploy-the-workload-manifest) - - [Run MMLU benchmark](#run-mmlu-benchmark) - - [Cleanup](#cleanup) +1. [Ensure prerequisites are met.](#prerequisites) +2. [Setup development environment.](#setup-your-local-environment) +3. [Provision a GKE Cluster with TPU v6e and CPU nodepools](#create-gke-cluster-with-tpu-v6e-nodepool-using-xpk) +4. [Configure service account for access](#configure-a-service-account-for-access) +5. [Create container image with dependencies](#build-jetstreammaxtext-container-image-to-deploy-the-workload) +6. [Checkpoint conversion](#checkpoint-conversion) + - Download model weights from HuggingFace + - [Convert Hugging Face checkpoint from FP8 to BF16](#convert-hugging-face-checkpoint-from-fp8-to-bf16) + - [Convert Hugging Face BF16 checkpoint to MaxText compatible checkpoint](#convert-hugging-face-bf16-checkpoint-to-maxtext-compatible-checkpoint) +7. [Deploy JetStream and Pathways](#deploy-jetstream-and-pathways) +8. [Run MMLU benchmark](#run-mmlu-benchmark) ## Prerequisites @@ -214,7 +204,7 @@ Create a Cloud Storage bucket to store model checkpoint, Pathways temporary file gcloud storage buckets create gs://$GCS_BUCKET --location=$REGION ``` -## Configure a service account for access {#configure-a-service-account-for-access} +## Configure a service account for access Configure a Kubernetes service account to act as an IAM service account. @@ -243,7 +233,7 @@ kubectl annotate serviceaccount default \ iam.gke.io/gcp-service-account=jetstream-pathways@${PROJECT_ID}.iam.gserviceaccount.com ``` -## Build JetStream/MaxText container image to deploy the workload {#build-jetstream/maxtext-container-image-to-deploy-the-workload} +## Build JetStream/MaxText container image to deploy the workload ### Create Artifact Registry repository to store Docker images @@ -290,7 +280,7 @@ gcloud beta builds log $BUILD_ID --region=$REGION ## Checkpoint conversion -### Convert Hugging Face checkpoint from FP8 to BF16 {#convert-hugging-face-checkpoint-from-fp8-to-bf16} +### Convert Hugging Face checkpoint from FP8 to BF16 Run the following steps for conversion: From af2dc5ef35086016e0b23941555d04f21850363b Mon Sep 17 00:00:00 2001 From: Rajesh Thallam Date: Mon, 14 Apr 2025 23:27:30 +0000 Subject: [PATCH 3/5] Update to sync with MaxText changes --- .../convert-checkpoint/convert-to-unscanned/batch_job.yaml | 2 +- .../serve-model/templates/model-serve-launcher.yaml | 3 ++- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/inference/trillium/JetStream-Maxtext/DeepSeek-V3-671B/convert-checkpoint/convert-to-unscanned/batch_job.yaml b/inference/trillium/JetStream-Maxtext/DeepSeek-V3-671B/convert-checkpoint/convert-to-unscanned/batch_job.yaml index 9f5ff7c..36334b9 100644 --- a/inference/trillium/JetStream-Maxtext/DeepSeek-V3-671B/convert-checkpoint/convert-to-unscanned/batch_job.yaml +++ b/inference/trillium/JetStream-Maxtext/DeepSeek-V3-671B/convert-checkpoint/convert-to-unscanned/batch_job.yaml @@ -20,7 +20,7 @@ taskGroups: entrypoint: "/bin/sh" commands: - "-c" - - mkdir -p /workspace/models/ && gcloud storage cp -r ${GCS_CKPT_PATH_BF16} /workspace/models/ && JAX_PLATFORMS='' python3 /maxtext/MaxText/convert_deepseek_unscanned_ckpt.py --base_model_path /workspace/models --maxtext_model_path ${GCS_CKPT_PATH_UNSCANNED} --model_size $MODEL_NAME --use-zarr3 false --use-ocdbt false + - mkdir -p /workspace/models/ && gcloud storage cp -r ${GCS_CKPT_PATH_BF16} /workspace/models/ && cd /maxtext && JAX_PLATFORMS='' python3 -m Maxtext.convert_deepseek_unscanned_ckp --base_model_path /workspace/models --maxtext_model_path ${GCS_CKPT_PATH_UNSCANNED} --model_size $MODEL_NAME --use-zarr3 false --use-ocdbt false computeResource: cpuMilli: 160000 memoryMib: 3936256 diff --git a/inference/trillium/JetStream-Maxtext/DeepSeek-V3-671B/serve-model/templates/model-serve-launcher.yaml b/inference/trillium/JetStream-Maxtext/DeepSeek-V3-671B/serve-model/templates/model-serve-launcher.yaml index 7162e8c..582f8d1 100644 --- a/inference/trillium/JetStream-Maxtext/DeepSeek-V3-671B/serve-model/templates/model-serve-launcher.yaml +++ b/inference/trillium/JetStream-Maxtext/DeepSeek-V3-671B/serve-model/templates/model-serve-launcher.yaml @@ -127,7 +127,8 @@ spec: echo "===== MaxText Configuration =====" echo "${OPTIONS[@]}" - python3 /maxtext/MaxText/maxengine_server.py \ + cd /maxtext + python3 -m MaxText.maxengine_server \ /maxtext/MaxText/configs/base.yml \ "${OPTIONS[@]}" From dcf1ff69c4330dde9d616e5fcb300509cf6c3a72 Mon Sep 17 00:00:00 2001 From: Rajesh Thallam Date: Fri, 2 May 2025 20:34:33 +0000 Subject: [PATCH 4/5] Update checkpoint conversion steps --- .../DeepSeek-V3-671B/README.md | 90 ++++++++----------- .../DeepSeek-V3-671B/docker/Dockerfile | 4 +- .../batch_job.yaml | 13 ++- .../DeepSeek-V3-671B/serve-model/Chart.yaml | 2 +- 4 files changed, 50 insertions(+), 59 deletions(-) rename inference/trillium/JetStream-Maxtext/DeepSeek-V3-671B/{convert-checkpoint/convert-to-unscanned => prepare-model}/batch_job.yaml (52%) diff --git a/inference/trillium/JetStream-Maxtext/DeepSeek-V3-671B/README.md b/inference/trillium/JetStream-Maxtext/DeepSeek-V3-671B/README.md index aa33036..710b16e 100644 --- a/inference/trillium/JetStream-Maxtext/DeepSeek-V3-671B/README.md +++ b/inference/trillium/JetStream-Maxtext/DeepSeek-V3-671B/README.md @@ -1,10 +1,10 @@ # DeepSeek R1/V3 Multi-host Inference on TPU v6e with JetStream, MaxText and Pathways on Cloud with GKE Cluster -This recipe outlines the steps to benchmark [DeepSeek-V3](https://huggingface.co/deepseek-ai/DeepSeek-V3) or [DeepSeek-R1](https://huggingface.co/deepseek-ai/DeepSeek-R1) 671B model using [JetStream](https://github.com/AI-Hypercomputer/JetStream/tree/main) \+ [MaxText](https://github.com/AI-Hypercomputer/maxtext) inference engine deployed on a GKE cluster with multi-host [TPU v6e slices](https://cloud.google.com/kubernetes-engine) utilizing Pathways on Cloud. +This recipe outlines the steps to benchmark [DeepSeek-V3](https://huggingface.co/deepseek-ai/DeepSeek-V3) or [DeepSeek-R1](https://huggingface.co/deepseek-ai/DeepSeek-R1) 671B model using [JetStream](https://github.com/AI-Hypercomputer/JetStream/tree/main) \+ [MaxText](https://github.com/AI-Hypercomputer/maxtext) inference engine deployed on a GKE cluster with multi-host [TPU v6e slices](https://cloud.google.com/kubernetes-engine) utilizing [Pathways on Cloud](https://cloud.google.com/ai-hypercomputer/docs/workloads/pathways-on-cloud/pathways-intro). * [Jetstream](https://github.com/AI-Hypercomputer/JetStream) is a throughput and memory-optimized engine for LLM inference on XLA devices, primarily TPUs written in JAX. * [MaxText](https://github.com/AI-Hypercomputer/maxtext) is an open-source LLM project by Google, written in JAX and designed to be highly performant and scalable, running efficiently on Google Cloud TPUs and GPUs. -* Pathways is a system that simplifies large-scale ML computations by enabling a single JAX client to orchestrate workloads across multiple large TPU slices, spanning thousands of TPU chips. +* [Pathways](https://cloud.google.com/ai-hypercomputer/docs/workloads/pathways-on-cloud/pathways-intro) is a system that simplifies large-scale ML computations by enabling a single JAX client to orchestrate workloads across multiple large TPU slices, spanning thousands of TPU chips. * [TPUs](https://cloud.google.com/tpu/docs/v6e) are Google's custom-developed accelerator for ML and AI models built using frameworks such as TensorFlow, PyTorch, and JAX. TPU v6e is Cloud TPU's latest generation AI accelerator. ## Outline @@ -15,9 +15,9 @@ This recipe outlines the steps to benchmark [DeepSeek-V3](https://huggingface.co 4. [Configure service account for access](#configure-a-service-account-for-access) 5. [Create container image with dependencies](#build-jetstreammaxtext-container-image-to-deploy-the-workload) 6. [Checkpoint conversion](#checkpoint-conversion) - - Download model weights from HuggingFace - - [Convert Hugging Face checkpoint from FP8 to BF16](#convert-hugging-face-checkpoint-from-fp8-to-bf16) - - [Convert Hugging Face BF16 checkpoint to MaxText compatible checkpoint](#convert-hugging-face-bf16-checkpoint-to-maxtext-compatible-checkpoint) + - Download model weights from HuggingFace + - Convert Hugging Face checkpoint from FP8 to BF16 + - Convert Hugging Face BF16 checkpoint to MaxText compatible checkpoint 7. [Deploy JetStream and Pathways](#deploy-jetstream-and-pathways) 8. [Run MMLU benchmark](#run-mmlu-benchmark) @@ -25,19 +25,19 @@ This recipe outlines the steps to benchmark [DeepSeek-V3](https://huggingface.co 1. Verify that your project has enough quota in your region of choice for: * A Cloud TPU slice, for example v6e-64 (`TPUS_PER_TPU_FAMILY`) - * A GCE VM with the M1 machine configuration for 160 chips (`M1_CPUS`) + * Compute Engine API quota for M1 machine configuration for 160 chips (`M1_CPUS`) 2. Required IAM Permissions Make sure that you have the following roles on the project: - * Compute Admin (`roles/compute.admin`) - * Kubernetes Engine Admin (`roles/container.admin`) - * Storage Admin (`roles/storage.admin`) - * Logging Admin (`roles/logging.admin`) - * Monitoring Admin (`roles/monitoring.admin`) - * Artifact Registry Writer (`roles/artifactregistry.writer`) - * Service Account Admin (`roles/iam.serviceAccountAdmin`) - * Project IAM Admin (`roles/resourcemanager.projectIamAdmin`) -3. Access to Pathways Container Images - You run a Pathways cluster on GKE in one of the Pathways container images. To access the Pathways container images, the service account used by the cluster must be allowlisted. Reach out to your GCP account team to request access. + * Compute Admin (`roles/compute.admin`) + * Kubernetes Engine Admin (`roles/container.admin`) + * Storage Admin (`roles/storage.admin`) + * Logging Admin (`roles/logging.admin`) + * Monitoring Admin (`roles/monitoring.admin`) + * Artifact Registry Writer (`roles/artifactregistry.writer`) + * Service Account Admin (`roles/iam.serviceAccountAdmin`) + * Project IAM Admin (`roles/resourcemanager.projectIamAdmin`) +3. Access to Pathways Container Images. + * You run a Pathways cluster on GKE in one of the [Pathways container images](https://cloud.google.com/ai-hypercomputer/docs/workloads/pathways-on-cloud/pathways-intro#pathways-components). 4. Access to DeepSeek models on Hugging Face. To access the [DeepSeek-V3](https://huggingface.co/deepseek-ai/DeepSeek-V3) or [DeepSeek-R1](https://huggingface.co/deepseek-ai/DeepSeek-R1) model through Hugging Face, you'll need a Hugging Face token. Follow these steps to generate a new token if you don't have one already: * Create a [Hugging Face account](https://huggingface.co/), if you don't already have one. @@ -100,6 +100,7 @@ export ARTIFACT_REGISTRY_REPO_NAME=jetstream-maxtext-ar export ARTIFACT_REGISTRY=${REGION}-docker.pkg.dev/${PROJECT_ID}/${ARTIFACT_REGISTRY_REPO_NAME} export JETSTREAM_MAXTEXT_IMAGE=jetstream-maxtext export JETSTREAM_MAXTEXT_VERSION=latest +export HF_MODEL_NAME="deepseek-ai/DeepSeek-R1" export MODEL_NAME=deepseek3-671b export GCS_CKPT_PATH_BF16=gs://${GCS_BUCKET}/models/${MODEL_NAME}/bf16 export GCS_CKPT_PATH_UNSCANNED=gs://${GCS_BUCKET}/models/${MODEL_NAME}/unscanned @@ -280,52 +281,27 @@ gcloud beta builds log $BUILD_ID --region=$REGION ## Checkpoint conversion -### Convert Hugging Face checkpoint from FP8 to BF16 +This step requires an `m1-ultramem-160` (memory-optimized) machine with 3TB of storage that can be run. The recipe uses a [Cloud Batch job](https://cloud.google.com/batch/docs/get-started) to run the conversion. -Run the following steps for conversion: +The following job performs following steps: +- Downloads DeepSeek V3 or DeepSeek R1 (defined by `HF_MODEL_NAME`) weights from HuggingFace. +- Convert Hugging Face checkpoint weights from FP8 to BF16. +- Convert BF16 weights to MaxText compatible format (unscanned checkpoint) for efficient serving. -* Download DeepSeek V3 or DeepSeek R1 weights from HuggingFace +Submit Cloud Batch job. This step can take >2 hours. ``` bash -mkdir -p /models/deepseek_fp8 -huggingface-cli download deepseek-ai/DeepSeek-R1 --local-dir /models/deepseek_fp8 -``` - -* Clone DeepSeek-V3 github repo to setup the environment for FP8 to BF16 conversion - -``` bash -git clone https://github.com/deepseek-ai/DeepSeek-V3.git && \ -cd DeepSeek-V3/inference && \ -pip install -r requirements.txt -``` - -* Run the FP8 to BF16 conversion - -``` bash -python3 fp8_cast_bf16.py \ - --input-fp8-hf-path /models/deepseek_fp8 \ - --output-bf16-hf-path /models/deepseek_fp16 -``` - -* Upload converted checkpoints to Cloud Storage bucket - -``` bash -gcloud storage cp -r /models/deepseek_fp16 ${GCS_CKPT_PATH_BF16} -``` - -### Convert Hugging Face BF16 checkpoint to MaxText compatible checkpoint - -This step requires an `m1-ultramem-160` (memory-optimized) machine with 3TB of storage that can be run. The recipe uses Cloud Batch job to run the conversion. - -Run the checkpoint conversion from BF16 weights to MaxText compatible format (unscanned checkpoint) for efficient serving. This step can take \~1-2 hours. - -``` bash -cd $RECIPE_ROOT/convert-checkpoint/convert-to-unscanned +cd $RECIPE_ROOT/prepare-model gcloud batch jobs submit convert-ckpt-to-unscanned-$(date +%Y%m%d-%H%M%S) \ + --project ${PROJECT_ID} \ --location ${CLUSTER_CKPT_NODE_REGION} \ - --config batch_job.yaml + --config - < Date: Fri, 2 May 2025 20:49:43 +0000 Subject: [PATCH 5/5] Rename folder --- .../README.md | 2 +- .../docker/Dockerfile | 0 .../docker/cloudbuild.yml | 0 .../pathways.png | Bin .../prepare-model/batch_job.yaml | 0 .../serve-model/Chart.yaml | 0 .../templates/model-serve-configmap.yaml | 0 .../serve-model/templates/model-serve-launcher.yaml | 0 .../serve-model/templates/model-serve-svc.yaml | 0 .../values.yaml | 0 10 files changed, 1 insertion(+), 1 deletion(-) rename inference/trillium/JetStream-Maxtext/{DeepSeek-V3-671B => DeepSeek-R1-671B}/README.md (99%) rename inference/trillium/JetStream-Maxtext/{DeepSeek-V3-671B => DeepSeek-R1-671B}/docker/Dockerfile (100%) rename inference/trillium/JetStream-Maxtext/{DeepSeek-V3-671B => DeepSeek-R1-671B}/docker/cloudbuild.yml (100%) rename inference/trillium/JetStream-Maxtext/{DeepSeek-V3-671B => DeepSeek-R1-671B}/pathways.png (100%) rename inference/trillium/JetStream-Maxtext/{DeepSeek-V3-671B => DeepSeek-R1-671B}/prepare-model/batch_job.yaml (100%) rename inference/trillium/JetStream-Maxtext/{DeepSeek-V3-671B => DeepSeek-R1-671B}/serve-model/Chart.yaml (100%) rename inference/trillium/JetStream-Maxtext/{DeepSeek-V3-671B => DeepSeek-R1-671B}/serve-model/templates/model-serve-configmap.yaml (100%) rename inference/trillium/JetStream-Maxtext/{DeepSeek-V3-671B => DeepSeek-R1-671B}/serve-model/templates/model-serve-launcher.yaml (100%) rename inference/trillium/JetStream-Maxtext/{DeepSeek-V3-671B => DeepSeek-R1-671B}/serve-model/templates/model-serve-svc.yaml (100%) rename inference/trillium/JetStream-Maxtext/{DeepSeek-V3-671B => DeepSeek-R1-671B}/values.yaml (100%) diff --git a/inference/trillium/JetStream-Maxtext/DeepSeek-V3-671B/README.md b/inference/trillium/JetStream-Maxtext/DeepSeek-R1-671B/README.md similarity index 99% rename from inference/trillium/JetStream-Maxtext/DeepSeek-V3-671B/README.md rename to inference/trillium/JetStream-Maxtext/DeepSeek-R1-671B/README.md index 710b16e..e0b977d 100644 --- a/inference/trillium/JetStream-Maxtext/DeepSeek-V3-671B/README.md +++ b/inference/trillium/JetStream-Maxtext/DeepSeek-R1-671B/README.md @@ -71,7 +71,7 @@ From your client, clone the [`tpu-recipes`](https://github.com/AI-Hypercomputer/ git clone https://github.com/ai-hypercomputer/tpu-recipes.git cd tpu-recipes export REPO_ROOT=`git rev-parse --show-toplevel` -export RECIPE_ROOT=$REPO_ROOT/inference/trillium/JetStream-Maxtext/DeepSeek-V3-671B +export RECIPE_ROOT=$REPO_ROOT/inference/trillium/JetStream-Maxtext/DeepSeek-R1-671B ``` ### Configure environment settings diff --git a/inference/trillium/JetStream-Maxtext/DeepSeek-V3-671B/docker/Dockerfile b/inference/trillium/JetStream-Maxtext/DeepSeek-R1-671B/docker/Dockerfile similarity index 100% rename from inference/trillium/JetStream-Maxtext/DeepSeek-V3-671B/docker/Dockerfile rename to inference/trillium/JetStream-Maxtext/DeepSeek-R1-671B/docker/Dockerfile diff --git a/inference/trillium/JetStream-Maxtext/DeepSeek-V3-671B/docker/cloudbuild.yml b/inference/trillium/JetStream-Maxtext/DeepSeek-R1-671B/docker/cloudbuild.yml similarity index 100% rename from inference/trillium/JetStream-Maxtext/DeepSeek-V3-671B/docker/cloudbuild.yml rename to inference/trillium/JetStream-Maxtext/DeepSeek-R1-671B/docker/cloudbuild.yml diff --git a/inference/trillium/JetStream-Maxtext/DeepSeek-V3-671B/pathways.png b/inference/trillium/JetStream-Maxtext/DeepSeek-R1-671B/pathways.png similarity index 100% rename from inference/trillium/JetStream-Maxtext/DeepSeek-V3-671B/pathways.png rename to inference/trillium/JetStream-Maxtext/DeepSeek-R1-671B/pathways.png diff --git a/inference/trillium/JetStream-Maxtext/DeepSeek-V3-671B/prepare-model/batch_job.yaml b/inference/trillium/JetStream-Maxtext/DeepSeek-R1-671B/prepare-model/batch_job.yaml similarity index 100% rename from inference/trillium/JetStream-Maxtext/DeepSeek-V3-671B/prepare-model/batch_job.yaml rename to inference/trillium/JetStream-Maxtext/DeepSeek-R1-671B/prepare-model/batch_job.yaml diff --git a/inference/trillium/JetStream-Maxtext/DeepSeek-V3-671B/serve-model/Chart.yaml b/inference/trillium/JetStream-Maxtext/DeepSeek-R1-671B/serve-model/Chart.yaml similarity index 100% rename from inference/trillium/JetStream-Maxtext/DeepSeek-V3-671B/serve-model/Chart.yaml rename to inference/trillium/JetStream-Maxtext/DeepSeek-R1-671B/serve-model/Chart.yaml diff --git a/inference/trillium/JetStream-Maxtext/DeepSeek-V3-671B/serve-model/templates/model-serve-configmap.yaml b/inference/trillium/JetStream-Maxtext/DeepSeek-R1-671B/serve-model/templates/model-serve-configmap.yaml similarity index 100% rename from inference/trillium/JetStream-Maxtext/DeepSeek-V3-671B/serve-model/templates/model-serve-configmap.yaml rename to inference/trillium/JetStream-Maxtext/DeepSeek-R1-671B/serve-model/templates/model-serve-configmap.yaml diff --git a/inference/trillium/JetStream-Maxtext/DeepSeek-V3-671B/serve-model/templates/model-serve-launcher.yaml b/inference/trillium/JetStream-Maxtext/DeepSeek-R1-671B/serve-model/templates/model-serve-launcher.yaml similarity index 100% rename from inference/trillium/JetStream-Maxtext/DeepSeek-V3-671B/serve-model/templates/model-serve-launcher.yaml rename to inference/trillium/JetStream-Maxtext/DeepSeek-R1-671B/serve-model/templates/model-serve-launcher.yaml diff --git a/inference/trillium/JetStream-Maxtext/DeepSeek-V3-671B/serve-model/templates/model-serve-svc.yaml b/inference/trillium/JetStream-Maxtext/DeepSeek-R1-671B/serve-model/templates/model-serve-svc.yaml similarity index 100% rename from inference/trillium/JetStream-Maxtext/DeepSeek-V3-671B/serve-model/templates/model-serve-svc.yaml rename to inference/trillium/JetStream-Maxtext/DeepSeek-R1-671B/serve-model/templates/model-serve-svc.yaml diff --git a/inference/trillium/JetStream-Maxtext/DeepSeek-V3-671B/values.yaml b/inference/trillium/JetStream-Maxtext/DeepSeek-R1-671B/values.yaml similarity index 100% rename from inference/trillium/JetStream-Maxtext/DeepSeek-V3-671B/values.yaml rename to inference/trillium/JetStream-Maxtext/DeepSeek-R1-671B/values.yaml