Uruchamianie wnioskowania wsadowego za pomocą narzędzia Ray w usłudze AKS

W tym artykule przesyłasz zadanie RayJob, które uruchamia inferencję wsadową offline vLLM przy użyciu adaptera LoRA utworzonego przez przykład trenowania modelu LLM. Zadanie odczytuje zbiór testowy Viggo i adapter LoRA z usługi Azure Blob Storage, generuje predykcje na pojedynczym GPU i przesyła wyniki.

Important

Oprogramowanie typu open source jest wymienione w dokumentacji i przykładach usługi AKS. Oprogramowanie, które wdrażasz, jest wykluczone z umów dotyczących poziomu usług AKS, ograniczonej gwarancji i wsparcia technicznego platformy Azure. W miarę korzystania z technologii open source wraz z usługą AKS zapoznaj się z opcjami pomocy technicznej dostępnymi w odpowiednich społecznościach i opiekunami projektów, aby opracować plan.

Firma Microsoft ponosi odpowiedzialność za tworzenie pakietów typu open source wdrażanych w usłudze AKS. Ta odpowiedzialność obejmuje posiadanie pełnej kontroli nad procesem kompilacji, skanowania, podpisywania, weryfikacji i szybkich poprawek, a także nad plikami binarnymi w obrazach kontenerów. Aby uzyskać więcej informacji, zobacz zarządzanie podatnościami dla AKS i zakres wsparcia dla AKS.

Prerequisites

Ustawianie zmiennych środowiskowych

Przejdź do przykładu wnioskowania wsadowego w sklonowanym repozytorium i skonfiguruj wymagane zmienne środowiskowe:

cd <path-to-cloned-repo>/AKS/examples/kueue-and-ray-on-aks/3-workloads/batch-inference
export AZURE_STORAGE_ACCOUNT_NAME=$(terraform -chdir=../../1-infrastructure/terraform output -raw storage_account_name)
source env.example

Note

Jeśli skonfigurowano kolejki zespołowe (opcja B), ustaw wartość export QUEUE_NAME=team-a lub export QUEUE_NAME=team-b przed uruchomieniem polecenia source env.example. Wartość domyślna QUEUE_NAME=default działa tylko z konfiguracją pojedynczej kolejki (opcja A).

Prześlij zadanie

Prześlij wnioskowanie wsadowe RayJob:

./submit.sh

Skrypt tworzy obiekt ConfigMap ze skryptu wnioskowania, renderuje szablon manifestu za pomocą envsubstmetody i stosuje go. Kueue przyznaje zadanie, gdy 1 procesor GPU jest dostępny w skonfigurowanej kolejce.

Wskazówka

Uruchom polecenie ./submit.sh --dry-run , aby zweryfikować renderowany manifest bez stosowania go do klastra.

Monitorowanie postępu

Znajdź i wyeksportuj nazwę zadania, jeśli jesteś w nowej powłoce:

export JOB_NAME=$(kubectl -n ray get rayjob --no-headers -o custom-columns=":metadata.name" | grep batch-inference)

Obserwuj stan RayJob i dopuszczenie przez Kueue:

kubectl -n ray get rayjob ${JOB_NAME} -w
kubectl -n ray get workload -w

Oczekiwane dane wyjściowe po zakończeniu zadania:

NAME                         JOB STATUS   DEPLOYMENT STATUS   START TIME             END TIME               AGE
batch-inference-xxxxxxxxxx   SUCCEEDED    Complete            2026-01-01T00:00:00Z   2026-01-01T00:09:00Z   9m
NAME                                      QUEUE     RESERVED IN     ADMITTED   FINISHED   AGE
rayjob-batch-inference-xxxxxxxxxx-xxxxx   default   cluster-queue   True       True       9m

Ujmij dzienniki procesów roboczych:

kubectl -n ray logs -l ray.io/cluster=$(kubectl -n ray get rayjob ${JOB_NAME} -o jsonpath='{.status.rayClusterName}') -f --tail=100

Weryfikowanie wyników

Wyświetl listę plików predykcji w magazynie blob:

az storage blob list -c llm-pipeline --prefix "inference/${JOB_NAME}/" \
  --account-name ${AZURE_STORAGE_ACCOUNT_NAME} --auth-mode login -o table

Oczekiwane dane wyjściowe:

Name                                                 Blob Type    Blob Tier    Length    Content Type
---------------------------------------------------  -----------  -----------  --------  ------------------------
inference/<job-name>/metrics.json                    BlockBlob    Hot          128       application/octet-stream
inference/<job-name>/predictions.jsonl               BlockBlob    Hot          411777    application/octet-stream

Pobierz i sprawdź przewidywania:

az storage blob download -c llm-pipeline \
  -n "inference/${JOB_NAME}/predictions.jsonl" \
  --account-name ${AZURE_STORAGE_ACCOUNT_NAME} --auth-mode login \
  --file /tmp/predictions.jsonl
head -1 /tmp/predictions.jsonl | python3 -m json.tool

Oczekiwane dane wyjściowe:

{
    "input": "I'm wondering, have you played any games you found genuinely shocking?",
    "expected": "request(specifier[shocking])",
    "generated": "request_explanation"
}

Dokumentacja konfiguracji

Zmienna Default Description
AZURE_STORAGE_ACCOUNT_NAME (wymagane) Konto usługi Storage z modułu 1
JOB_NAME batch-inference-<timestamp> Unikalna nazwa RayJob
QUEUE_NAME default Nazwa kolejki lokalnej Kueue
LLM_DATA_CONTAINER llm-pipeline Kontener obiektów blob z testowymi danymi viggo
LLM_LORA_CONTAINER llm-pipeline Kontener obiektów blob z adapterami LoRA
CONFIGMAP_NAME batch-inference-scripts Nazwa obiektu ConfigMap zawierającego skrypt wnioskowania

Uprzątnij zasoby

Usuń obiekt RayJob i jego ConfigMap:

kubectl -n ray delete rayjob ${JOB_NAME}
kubectl -n ray delete configmap ${CONFIGMAP_NAME}

Aby usunąć całą infrastrukturę, zobacz Wdrażanie infrastruktury — czyszczenie zasobów.

Następne kroki