Выполнение пакетного вывода с помощью Ray в AKS

В этой статье вы отправите задание RayJob, которое запускает пакетный инференс vLLM в автономном режиме с использованием адаптера LoRA, созданного в примере обучения LLM. Задача считывает тестовый сплит Viggo и адаптер LoRA из Хранилище BLOB-объектов Azure, генерирует предсказания на одном GPU и загружает результаты.

Important

Программное обеспечение с открытым кодом упоминается во всей документации и примерах AKS. Программное обеспечение, которое вы развертываете, не подпадает под действие соглашений об уровне обслуживания AKS, ограниченной гарантии и поддержки Azure. При использовании технологии с открытым исходным кодом вместе с AKS ознакомьтесь с вариантами поддержки, доступными от соответствующих сообществ и обслуживающих проектов для разработки плана.

Корпорация Майкрософт несет ответственность за создание пакетов с открытым кодом, которые мы развертываем в AKS. Эта ответственность включает полное управление процессами сборки, сканирования, подписывания, проверки и исправления ошибок, а также контроль над двоичными файлами в образах контейнеров. Для получения дополнительной информации см. Управление уязвимостями в AKS и Покрытие поддержки AKS.

Предварительные условия

Настройка переменных среды

Перейдите к примеру пакетного вывода в клонированном репозитории и настройте необходимые переменные среды:

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

Если вы настроили очереди групп (параметр B), установите export QUEUE_NAME=team-a или export QUEUE_NAME=team-b перед выполнением source env.example. QUEUE_NAME=default по умолчанию работает только с конфигурацией с одной очередью (вариант A).

Отправка рабочей нагрузки

Отправьте RayJob для пакетного вывода:

./submit.sh

Скрипт создает ConfigMap из скрипта вывода, отрисовывает шаблон манифеста с помощью envsubstи применяет его. Kueue признает задание, если 1 GPU доступен в настроенной очереди.

Tip

Запустите ./submit.sh --dry-run, чтобы проверить сгенерированный манифест, не применяя его к кластеру.

Мониторинг прогресса

Найдите и экспортируйте имя задания, если вы находитесь в новой оболочке:

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

Отслеживайте состояние RayJob и допуск Kueue:

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

Ожидаемые выходные данные после завершения задания:

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

Хвост журналов рабочих ролей:

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

Проверка результатов

Список файлов прогнозов в хранилище BLOB-объектов:

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

Ожидаемые выходные данные:

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

Скачайте и проверьте прогнозы:

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

Ожидаемые выходные данные:

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

Справочник по конфигурации

Переменная По умолчанию Description
AZURE_STORAGE_ACCOUNT_NAME (обязательно) Учетная запись хранения из модуля 1
JOB_NAME batch-inference-<timestamp> Уникальное имя RayJob
QUEUE_NAME default Имя Kueue LocalQueue
LLM_DATA_CONTAINER llm-pipeline Контейнер BLOB-объектов с данными теста viggo
LLM_LORA_CONTAINER llm-pipeline BLOB-контейнер с адаптерами LoRA
CONFIGMAP_NAME batch-inference-scripts Имя ConfigMap, содержащего скрипт инференса

Очистите ресурсы

Удалите RayJob и его ConfigMap:

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

Чтобы удалить всю инфраструктуру, см. раздел "Развертывание инфраструктуры— очистка ресурсов".

Дальнейшие действия