Jak wykonywać zbiorcze wnioskowanie w przypadku zadań Cloud Run

1. Wprowadzenie

Omówienie

W tym ćwiczeniu użyjesz zadań Cloud Run do wykonywania zbiorczego wnioskowania za pomocą modelu Llama 3.2-1b LLM firmy Meta i vLLM, który korzysta z karty graficznej w zadaniach Cloud Run. Wyniki zostaną zapisane bezpośrednio w Cloud Storage za pomocą montowania woluminów Cloud Run.

Czego się nauczysz

  • Jak przeprowadzić zbiorcze wnioskowanie za pomocą usługi Cloud Run Jobs GPU
  • Jak zapisywać w Cloud Storage za pomocą zamontowanych woluminów Cloud Run

2. Zanim zaczniesz

Włącz interfejsy API

Zanim zaczniesz korzystać z tego ćwiczenia, włącz te interfejsy API:

gcloud services enable run.googleapis.com \
    cloudbuild.googleapis.com \
    secretmanager.googleapis.com \
    artifactregistry.googleapis.com

Limit GPU

Poproś o zwiększenie limitu w obsługiwanym regionie. Limit to nvidia_l4_gpu_allocation_no_zonal_redundancy w Cloud Run Admin API.

Uwaga: jeśli używasz nowego projektu, może minąć kilka minut od włączenia interfejsu API do pojawienia się limitów na tej stronie.

Hugging Face

To ćwiczenie korzysta z modelu hostowanego w Hugging Face. Aby uzyskać ten model, poproś o token dostępu użytkownika Hugging Face z uprawnieniem „Czytaj”. Zasobnik ten będzie później nazywany YOUR_HF_TOKEN.

Aby korzystać z modelu, musisz też zaakceptować warunki użytkowania: https://huggingface.co/meta-llama/Llama-3.2-1B.

3. Konfiguracja i wymagania

Ta sekcja zawiera instrukcje konfigurowania tych zasobów:

  • Konto usługi uprawnień i powiązane z nim uprawnienia.
  • obiekt tajny menedżera obiektów tajnych do przechowywania tokenu Hugging Face.
  • Zasobnik Cloud Storage do przechowywania wyników wnioskowania.

Aby skonfigurować wymagane zasoby:

  1. Ustaw zmienne środowiskowe na potrzeby tego ćwiczenia:
    export PROJECT_ID=<your_project_id>
    export REGION=<your_region>
    export HF_TOKEN=<YOUR_HF_TOKEN>
    
    export SERVICE_ACCOUNT=inference-service-account
    export SERVICE_ACCOUNT_EMAIL=${SERVICE_ACCOUNT}@${PROJECT_ID}.iam.gserviceaccount.com
    export SECRET_ID=hugging-face-token
    export BUCKET_NAME=inference-codelab-${PROJECT_ID}
    
  2. Utwórz konto usługi, uruchamiając:
    gcloud iam service-accounts create ${SERVICE_ACCOUNT} \
      --display-name="Service account for batch inference codelab"
    
  3. Aby przechowywać token dostępu Hugging Face, użyj usługi Secret Manager:
    gcloud secrets create $SECRET_ID \
          --replication-policy="automatic"
    
    printf $HF_TOKEN | gcloud secrets versions add $SECRET_ID --data-file=-
    
  4. Przypisz do konta usługi rolę uzyskujący dostęp do obiektów tajnych w Menedżerze obiektów tajnych:
    gcloud secrets add-iam-policy-binding $SECRET_ID \
      --member serviceAccount:$SERVICE_ACCOUNT_EMAIL \
      --role='roles/secretmanager.secretAccessor'
    
  5. Utwórz zasobnik do hostowania modelu dostrojonego:
    gcloud storage buckets create -l us-central1 gs://${BUCKET_NAME}
    
  6. Przyznaj swojemu kontu usługi dostęp do zasobnika:
    gcloud storage buckets add-iam-policy-binding gs://$BUCKET_NAME \
      --member=serviceAccount:$SERVICE_ACCOUNT_EMAIL \
      --role=roles/storage.objectAdmin
    
  7. Utwórz repozytorium Artifact Registry, w którym będziesz przechowywać obraz kontenera. Jeśli wdrożenia źródła Cloud Run były już używane w Twoim projekcie, pomiń ten krok.
    gcloud artifacts repositories create cloud-run-source-deploy \
        --repository-format=docker \
        --location=$REGION \
        --project=$PROJECT_ID
    

4. Tworzenie zadania Cloud Run

W tej sekcji utworzysz kod, który:

  • Importuje model Llama z Hugging Face.
  • Wykonywanie zbiorczego wnioskowania na modelu. W tym procesie zadanie używa jednego procesora graficznego L4.
  • Zapisywanie wyników na dysku lokalnym. Jest on zapisywany w Cloud Storage przez podłączanie woluminów.

Aby utworzyć zadanie Cloud Run i plik Dockerfile, wykonaj te czynności:

  1. Utwórz katalog na kod zadania dokładnego dostrajania:
    mkdir codelab-inference-job
    cd codelab-inference-job
    
  2. Utwórz plik o nazwie main.py.
    # SPDX-License-Identifier: Apache-2.0
    from vllm import LLM, SamplingParams
    
    # Sample prompts.
    prompts = [
        "Cloud Run is",
        "The future of AI is",
        "The capital of Germany is",
        "python as a programming language is",
    ]
    # Create a sampling params object.
    sampling_params = SamplingParams(temperature=0.8, top_p=0.95)
    
    # Create an LLM.
    llm = LLM(model="meta-llama/Llama-3.2-1B")
    # Generate texts from the prompts. The output is a list of RequestOutput objects
    # that contain the prompt, generated text, and other information.
    outputs = llm.generate(prompts, sampling_params)
    
    # Save the outputs to disk
    with open("/results/output.txt", "w") as f:
        for output in outputs:
            prompt = output.prompt
            generated_text = output.outputs[0].text
            f.write(f"Prompt: {prompt!r}, Generated text: {generated_text!r}\n")
    
    print(f"Wrote {len(outputs)} to disk.")
    
  3. Utwórz Dockerfile:
    FROM python:3.12
    ADD main.py .
    RUN python -m pip install --upgrade pip setuptools
    RUN pip install vllm
    CMD ["python", "./main.py"]
    

5. Wdrażanie i wykonywanie zadania

W tym kroku utworzysz zadanie Cloud Run za pomocą wdrożenia źródła Cloud Run, a następnie je wykonasz. Ten krok obejmuje też flagi montowania woluminu Cloud Run do przechowywania wyników.

  1. Utwórz zadanie Cloud Run:
    gcloud beta run jobs deploy inference-job \
      --region $REGION \
      --source . \
      --gpu=1 \
      --set-secrets HF_TOKEN=${SECRET_ID}:latest \
      --add-volume name=results,type=cloud-storage,bucket=${BUCKET_NAME} \
      --add-volume-mount volume=results,mount-path=/results \
      --service-account $SERVICE_ACCOUNT_EMAIL
    
    To polecenie tworzy obraz na podstawie źródła i wdraża zadanie. Może to zająć trochę czasu.
  2. Wykonaj zadanie:
    gcloud run jobs execute inference-job --region $REGION --async
    
    Wykonanie zadania zajmie kilka minut. Stan możesz sprawdzić, korzystając z linku podanego w wyjściu ostatniego polecenia.

Potwierdzenie powodzenia

Aby sprawdzić, czy zadanie zostało wykonane, wyświetl jego dzienniki, korzystając z wyników ostatniego polecenia.

Sprawdź wyniki w zasobniku Cloud Storage:

W konsoli:

  1. Otwórz Cloud Storage.
  2. Wybierz zasobnik rozpoczynający się od inference-codelab.
  3. Wybierz output.txt.
  4. Kliknij Uwierzytelniony adres URL, aby wyświetlić zawartość w przeglądarce.

Treść pliku powinna zawierać 4 prompty i ich wyniki.

6. Gratulacje!

Gratulujemy ukończenia ćwiczeń.

Zalecamy zapoznanie się z dokumentacją Cloud Run.

Omówione zagadnienia

  • Jak przeprowadzić zbiorcze wnioskowanie za pomocą usługi Cloud Run Jobs GPU
  • Jak zapisywać w Cloud Storage za pomocą zamontowanych woluminów Cloud Run

7. Czyszczenie danych

Aby usunąć zadanie Cloud Run, otwórz Cloud Console Cloud Run na stronie https://console.cloud.google.com/run i usuń zadanie inference-job.

Aby usunąć cały projekt, kliknij Zarządzaj zasobami, wybierz projekt utworzony w kroku 2 i kliknij Usuń. Jeśli usuniesz projekt, musisz zmienić projekty w Cloud SDK. Aby wyświetlić listę wszystkich dostępnych projektów, uruchom gcloud projects list.