Jak wykonywać zbiorcze wnioskowanie w przypadku zadań Cloud Run

1. Wprowadzenie

Przegląd

W tym laboratorium użyjesz zadań Cloud Run do uruchamiania wnioskowania wsadowego za pomocą modelu LLM Llama 3.2-1b od Mety i vLLM zasilanych przez procesor GPU zadań Cloud Run. Wyniki zapiszesz bezpośrednio w Cloud Storage za pomocą montowania woluminów Cloud Run.

Czego się nauczysz

  • Jak przeprowadzać wnioskowanie wsadowe za pomocą GPU w Cloud Run Jobs
  • Jak zapisywać dane w Cloud Storage za pomocą montowania woluminów Cloud Run

2. Zanim zaczniesz

Włącz interfejsy API

Zanim zaczniesz korzystać z tego laboratorium, włącz te interfejsy API, uruchamiając to polecenie:

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 wynosi nvidia_l4_gpu_allocation_no_zonal_redundancy w sekcji Cloud Run Admin API.

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

Hugging Face

W tym ćwiczeniu w Codelabs używamy modelu hostowanego na platformie Hugging Face. Aby uzyskać ten model, poproś o token dostępu użytkownika Hugging Face z uprawnieniami do odczytu. Będzie on dalej występować jako 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

W tej sekcji znajdziesz instrukcje konfigurowania tych zasobów:

  • Konto usługi uprawnień i powiązane z nim uprawnienia.
  • Secret Manager secret (obiekt tajny usługi Secret Manager) do przechowywania tokena Hugging Face.
  • Zasobnik Cloud Storage, w którym będą przechowywane wyniki wnioskowania.

Aby skonfigurować wymagane zasoby, wykonaj te czynności:

  1. Ustaw zmienne środowiskowe na potrzeby tych ćwiczeń z programowania:
    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 to polecenie:
    gcloud iam service-accounts create ${SERVICE_ACCOUNT} \
      --display-name="Service account for batch inference codelab"
    
  3. Użyj Secret Managera do przechowywania tokena dostępu Hugging Face:
    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ącego 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 dostrojonego modelu:
    gcloud storage buckets create -l us-central1 gs://${BUCKET_NAME}
    
  6. Przyznaj 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 zapiszesz obraz kontenera. Jeśli w projekcie były już wcześniej używane wdrożenia z kodu źródłowego w Cloud Run, 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 wykonuje te czynności:

  • Importuje model Llama z Hugging Face.
  • Przeprowadza wnioskowanie zbiorcze na modelu. Zadanie wykorzystuje w tym procesie pojedynczy procesor graficzny L4.
  • Zapisuje wyniki na dysku lokalnym. Dane te są zapisywane w Cloud Storage za pomocą zamontowanych woluminów.

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

  1. Utwórz katalog na kod zadania 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 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 ze źródła i wdraża zadanie. Może to trochę potrwać.
  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 danych wyjściowych ostatniego polecenia.

Potwierdzanie powodzenia

Aby sprawdzić, czy zadanie zostało wykonane, wyświetl logi zadania, tak jak w danych wyjściowych 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. Aby wyświetlić zawartość w przeglądarce, kliknij Uwierzytelniony adres URL.

Plik powinien zawierać 4 prompty i ich wyniki.

6. Gratulacje!

Gratulujemy ukończenia ćwiczenia!

Zalecamy zapoznanie się z dokumentacją Cloud Run.

Omówione zagadnienia

  • Jak przeprowadzać wnioskowanie wsadowe za pomocą GPU w Cloud Run Jobs
  • Jak zapisywać dane w Cloud Storage za pomocą montowania woluminów Cloud Run

7. Czyszczenie danych

Aby usunąć zadanie Cloud Run, otwórz Cloud Run w konsoli Google Cloud pod adresem https://console.cloud.google.com/run i usuń zadanie inference-job.

Aby usunąć cały projekt, otwórz stronę Zarządzaj zasobami, wybierz projekt utworzony w kroku 2 i kliknij Usuń. Jeśli usuniesz projekt, musisz zmienić projekty w Cloud SDK. Listę wszystkich dostępnych projektów możesz wyświetlić, uruchamiając polecenie gcloud projects list.