在 AKS 上使用 Ray 微调 Aurora 天气模型

在本文中,你将提交一个 RayJob,使用 LoRA 基于区域 WeatherBench2 数据对 Microsoft Aurora 天气基础模型进行微调。 作业在单个 A100 GPU 上运行,Kueue 负责准入控制,并将适配器检查点和训练指标写入 Azure Blob 存储。

Important

AKS 文档和示例中都提到了开源软件。 您部署的软件被排除在 AKS 服务级别协议、有限保修和 Azure 支持之外。 将开源技术与 AKS 一起使用时,请查阅相应社区和项目维护者提供的支持选项来制定计划。

Microsoft 将负责生成我们在 AKS 上部署的开源包。 该责任包括拥有构建、扫描、签名、验证和快速修复流程的完整所有权,并掌控容器镜像中的二进制文件。 如需了解详细信息,请参阅 AKS 漏洞管理AKS 支持范围

先决条件

设置环境变量。

前往已克隆的代码库中的 Aurora 微调示例,并配置所需的环境变量:

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

文件 env.example 设置默认值,包括 Ray 图像、队列名称和训练参数。 变量 JOB_NAME 是使用时间戳自动生成的。

注释

如果您配置了团队队列(选项 B),请在运行 export QUEUE_NAME=team-a 之前设置 export QUEUE_NAME=team-bsource env.example。 默认值 QUEUE_NAME=default 仅适用于单队列配置(选项 A)。

提交工作负载

将 RayJob 提交到群集:

./submit.sh

该脚本根据 Python 训练脚本创建 ConfigMap,通过 envsubst 渲染清单模板,并将其应用到集群。 当配置的队列中有可用的 GPU 配额时,Kueue 会准入该作业。

Tip

运行 ./submit.sh --dry-run 以验证呈现的清单,而不将其应用到群集。

监视进度

如果你当前处于新的 shell 中,请先查找并导出作业名称:

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

查看 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
aurora-finetune-xxxxxxxxxx   SUCCEEDED    Complete            2026-01-01T00:00:00Z   2026-01-01T00:08:00Z   8m
NAME                                      QUEUE     RESERVED IN     ADMITTED   FINISHED   AGE
rayjob-aurora-finetune-xxxxxxxxxx-xxxxx   default   cluster-queue   True       True       8m

尾部工作器日志:

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

验证结果

检查 Blob 存储中上传的项目:

az storage blob list -c aurora --prefix checkpoints/${JOB_NAME}/ \
  --account-name ${AZURE_STORAGE_ACCOUNT_NAME} --auth-mode login -o table

预期输出:

Name                                                    Blob Type    Blob Tier    Length    Content Type
------------------------------------------------------  -----------  -----------  --------  ------------------------
checkpoints/<job-name>/last.safetensors                 BlockBlob    Hot          11432328  application/octet-stream
checkpoints/<job-name>/train-metrics.json               BlockBlob    Hot          985       application/json

下载并检查训练指标:

az storage blob download -c aurora \
  -n checkpoints/${JOB_NAME}/train-metrics.json \
  --account-name ${AZURE_STORAGE_ACCOUNT_NAME} --auth-mode login \
  --file /tmp/train-metrics.json
cat /tmp/train-metrics.json | python3 -m json.tool

预期输出:

{
    "final_loss": 24051.97,
    "initial_loss": 24183.10,
    "loss_history": [24183.10],
    "loss_improvement": 131.13,
    "max_steps": 1,
    "trainable_parameters": 2850816,
    "gpu_name": "NVIDIA A100-SXM4-80GB",
    ...
}

数组 loss_history 应包含有限值(而不是 NaN),确认数据路径和模型训练正常工作。

配置参考

Variable 默认 Description
AZURE_STORAGE_ACCOUNT_NAME (必填) 模块 1 中的存储帐户
AURORA_INPUT_CONTAINER aurora 输入数据的容器
AURORA_OUTPUT_CONTAINER aurora 检查点容器
AURORA_INIT_FILE init-2021-01-01-00z.npz 初始化 NPZ 文件名
AURORA_TRUTH_FILE truth-2021-01-01-06z.npz 真实 NPZ 文件名
AURORA_MAX_STEPS 1 培训步骤
AURORA_LORA_RANK 8 LoRA 排名
AURORA_LEAD_HOURS 6 预测提前期(必须为 6 小时的倍数)
AURORA_REQUIRE_GPU_NAME A100 GPU 名称子字符串防护
QUEUE_NAME default Kueue LocalQueue 名称
CONFIGMAP_NAME aurora-finetune-scripts 包含训练脚本的 ConfigMap 的名称

清理资源

删除 RayJob 及其 ConfigMap:

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

后续步骤