在 AKS 集群上部署 Azure 机器学习扩展
要使 AKS 群集能够运行训练作业或推理工作负载,必须先在 AKS 群集上部署 AzureML 扩展。 AzureML 扩展基于 AKS 群集扩展构建,其生命周期可以通过 Azure CLI k8s 扩展轻松管理。
本文介绍以下内容:
- 先决条件
- 限制
- 查看 Azure 机器学习扩展配置设置
- Azure 机器学习扩展部署方案
- 验证 Azure 机器学习扩展部署
- 查看 Azure 机器学习扩展组件
- 管理 Azure 机器学习扩展
先决条件
- 在 Azure 中运行的 AKS 群集。 如果以前没有使用过群集扩展,则需要注册 KubernetesConfiguration 服务提供程序。
- 出于生产目的,Kubernetes 群集必须至少具有 4 个 vCPU 核心和 14 GB 内存。 有关资源及群集大小建议的详细信息,请参阅建议的资源计划。
- 在出站代理服务器或防火墙后面运行的群集需要额外的网络配置。
- 安装或升级 Azure CLI,确保其版本为 2.24.0 或更高版本。
- 安装或升级 Azure CLI 扩展
k8s-extension
,确保其版本为 1.2.3 或更高版本。
限制
- Azure 机器学习不支持将服务主体与 AKS 配合使用。 AKS 群集必须改用托管标识。 同时支持系统分配的托管标识和用户分配的托管标识。 有关详细信息,请参阅在 Azure Kubernetes 服务中使用托管标识。
- Azure 机器学习不支持为 AKS 禁用本地帐户。 部署 AKS 群集时,本地帐户默认处于启用状态。
- 如果 AKS 群集已启用授权 IP 范围以访问 API 服务器,请为该 AKS 群集启用 Azure 机器学习控制平面 IP 范围。 Azure 机器学习控制平面跨配对区域部署。 如果没有 API 服务器的访问权限,则无法部署机器学习 Pod。 在 AKS 群集中启用 IP 范围时,请对两个配对区域都使用 IP 范围。
- Azure 机器学习不保证支持 AKS 中的所有预览阶段功能。 例如,不支持 Microsoft Entra Pod 标识。
- 如果已按照 Azure 机器学习 AKS v1 文档中的步骤创建或附加 AKS 作为推理群集,请在继续下一步之前使用以下链接清理旧版 azureml-fe 相关资源。
查看 Azure 机器学习扩展配置设置
可以使用 Azure 机器学习 CLI 命令 k8s-extension create
来部署 Azure 机器学习扩展。 借助 CLI k8s-extension create
,你可以使用 --config
或 --config-protected
参数以 key=value
格式指定一组配置设置。 以下列出了 Azure 机器学习扩展部署期间要指定的可用配置设置。
配置设置键名 | 说明 | 培训 | 推理 | 训练和推理 |
---|---|---|---|---|
enableTraining |
True 或 False ,默认为 False 。 对于支持机器学习模型训练和批量评分的 Azure 机器学习扩展部署,此项必须设置为 True 。 |
✓ | 空值 | ✓ |
enableInference |
True 或 False ,默认为 False 。 对于支持机器学习推理的 Azure 机器学习扩展部署,此项必须设置为 True 。 |
空值 | ✓ | ✓ |
allowInsecureConnections |
True 或 False ,默认为 False 。 可以设置为 True 以将推理 HTTP 终结点用于开发或测试。 |
空值 | 可选 | 可选 |
inferenceRouterServiceType |
loadBalancer 、nodePort 或 clusterIP 。 必需(如果 enableInference=True )。 |
空值 | ✓ | ✓ |
internalLoadBalancerProvider |
此配置目前仅适用于 Azure Kubernetes 服务 (AKS) 群集。 设置为 azure 以允许推理路由器使用内部负载均衡器。 |
空值 | 可选 | 可选 |
sslSecret |
Kubernetes 机密在 azureml 命名空间中的名称。 此配置用于存储 cert.pem (PEM 编码的 TLS/SSL 证书)和 key.pem (PEM 编码的 TLS/SSL 密钥),当 allowInsecureConnections 设置为 False 时,这是支持推理 HTTPS 终结点所必需的。 有关 sslSecret 的示例 YAML 定义,请参阅配置 sslSecret。 使用此配置或 sslCertPemFile 和 sslKeyPemFile 保护的配置设置的组合。 |
空值 | 可选 | 可选 |
sslCname |
推理 HTTPS 终结点使用 TLS/SSL CNAME。 必需(如果 allowInsecureConnections=False ) |
空值 | 可选 | 可选 |
inferenceRouterHA |
True 或 False ,默认为 True 。 默认情况下,Azure 机器学习扩展会部署 3 个推理路由器副本来实现高可用性,这需要在群集中至少提供 3 个工作器节点。 如果群集的工作器节点少于 3 个,则将此项设置为 False 。在这种情况下只会部署一个推理路由器服务。 |
空值 | 可选 | 可选 |
nodeSelector |
默认情况下,部署的 Kubernetes 资源和机器学习工作负载将随机部署到群集的一个或多个节点,而 DaemonSet 资源将部署到所有节点。 若要将扩展部署和训练/推理工作负载限制为具有标签 key1=value1 和 key2=value2 的特定节点,请相应地使用 nodeSelector.key1=value1 、nodeSelector.key2=value2 。 |
可选 | 可选 | 可选 |
installNvidiaDevicePlugin |
True 或 False ,默认为 False 。 NVIDIA GPU 硬件上的 ML 工作负载需要 NVIDIA 设备插件。 默认情况下,无论 Kubernetes 群集是否包含 GPU 硬件,Azure 机器学习扩展部署都会安装 NVIDIA 设备插件。 用户可以将此设置指定为 True 以进行安装,但请确保满足先决条件。 |
可选 | 可选 | 可选 |
installPromOp |
True 或 False ,默认为 True 。 Azure 机器学习扩展需要 prometheus 运算符来管理 prometheus。 设置为 False 以重用现有的 prometheus operator。 有关重用现有 prometheus operator 的详细信息,请参阅重用 prometheus operator |
可选 | 可选 | 可选 |
installVolcano |
True 或 False ,默认为 True 。 Azure 机器学习扩展需要使用 volcano 计划程序来计划作业。 请设置为 False 以重用现有的 volcano 计划程序。 有关重用现有 volcano scheduler 的详细信息,请参阅重用 volcano scheduler |
可选 | 空值 | 可选 |
installDcgmExporter |
True 或 False ,默认为 False 。 Dcgm-exporter 可以公开 Azure 机器学习工作负载的 GPU 指标,可以在 Azure 门户中对其进行监视。 将 installDcgmExporter 设置为 True 以安装 dcgm-exporter。 但若要使用自己的 dcgm-exporter,请参阅 DCGM 导出程序 |
可选 | 可选 | 可选 |
受保护配置设置键名称 | 说明 | 培训 | 推理 | 训练和推理 |
---|---|---|---|---|
sslCertPemFile ,sslKeyPemFile |
当 allowInsecureConnections 设置为 False 时,TLS/SSL 证书和密钥文件(经过 PEM 编码)的路径是支持推理 HTTPS 终结点的 Azure 机器学习扩展部署所必需的。 注意:不支持带有密码保护的 PEM 文件 |
空值 | 可选 | 可选 |
如配置设置表所示,不同配置设置的组合支持针对不同的 ML 工作负载场景部署 Azure 机器学习扩展:
- 对于训练作业和批处理推理工作负载,请指定
enableTraining=True
- 对于仅推理工作负载,请指定
enableInference=True
- 对于所有类型的 ML 工作负载,请同时指定
enableTraining=True
和enableInference=True
如果计划为实时推理工作负载部署 Azure 机器学习扩展并想要指定 enableInference=True
,请注意以下与实时推理工作负载相关的配置设置:
- 实时推理支持需要
azureml-fe
路由器服务,并需要为azureml-fe
指定inferenceRouterServiceType
配置设置。azureml-fe
可以采用以下inferenceRouterServiceType
之一部署:- 键入
LoadBalancer
。 使用云提供商的负载均衡器在外部公开azureml-fe
。 若要指定此值,请确保群集支持负载均衡器预配。 请注意,大多数本地 Kubernetes 群集可能不支持外部负载均衡器。 - 键入
NodePort
。 在静态端口上的每个节点 IP 中公开azureml-fe
。 可以通过请求<NodeIP>:<NodePort>
从群集外部联系azureml-fe
。 使用NodePort
还可为azureml-fe
设置你自己的负载均衡解决方案和 TLS/SSL 终止。 - 键入
ClusterIP
。 在群集内部 IP 中公开azureml-fe
,这样就只能从群集内部访问azureml-fe
。 若要让azureml-fe
为来自群集外部的推理请求提供服务,你需要为azureml-fe
设置自己的负载均衡解决方案和 TLS/SSL终止。
- 键入
- 为确保
azureml-fe
路由服务的高可用性,Azure 机器学习扩展部署默认将为包含 3 个或更多节点的群集创建 3 个azureml-fe
副本。 如果群集的节点数少于 3 个,请设置inferenceRouterHA=False
。 - 还需要考虑使用 HTTPS 来限制对模型终结点的访问,以及保护客户端提交的数据。 为此,需要指定
sslSecret
配置设置或者sslKeyPemFile
和sslCertPemFile
配置保护设置的组合。 - 默认情况下,Azure 机器学习扩展部署要求为 HTTPS 支持提供配置设置。 对于开发或测试,可以通过配置设置
allowInsecureConnections=True
方便地提供 HTTP 支持。
Azure 机器学习扩展部署 - CLI 示例和 Azure 门户
若要使用 CLI 部署 Azure 机器学习扩展,请使用 az k8s-extension create
命令传入强制参数的值。
我们列出了 4 种典型的扩展部署场景以供参考。 若要为生产用途部署扩展,请仔细阅读配置设置的完整列表。
将 Azure 中的 AKS 群集用于快速进行概念证明,以运行各种 ML 工作负载,即运行训练作业或将模型部署为联机/批处理终结点
对于 AKS 群集上的 Azure 机器学习扩展部署,请确保为
--cluster-type
参数指定managedClusters
值。 运行以下 Azure CLI 命令以部署 Azure 机器学习扩展:az k8s-extension create --name <extension-name> --extension-type Microsoft.AzureML.Kubernetes --config enableTraining=True enableInference=True inferenceRouterServiceType=LoadBalancer allowInsecureConnections=True InferenceRouterHA=False --cluster-type managedClusters --cluster-name <your-AKS-cluster-name> --resource-group <your-RG-name> --scope cluster
在 Azure 中为生产训练和推理工作负载启用 AKS 群集 对于 AKS 上的 Azure 机器学习扩展部署,请确保为
--cluster-type
参数指定managedClusters
值。 假设群集包含 3 个以上的节点,并且你需要使用 Azure 公共负载均衡器和 HTTPS 来提供推理工作负载支持。 运行以下 Azure CLI 命令以部署 Azure 机器学习扩展:az k8s-extension create --name <extension-name> --extension-type Microsoft.AzureML.Kubernetes --config enableTraining=True enableInference=True inferenceRouterServiceType=LoadBalancer sslCname=<ssl cname> --config-protected sslCertPemFile=<file-path-to-cert-PEM> sslKeyPemFile=<file-path-to-cert-KEY> --cluster-type managedClusters --cluster-name <your-AKS-cluster-name> --resource-group <your-RG-name> --scope cluster
验证 Azure 机器学习扩展部署
运行以下 CLI 命令来检查 Azure 机器学习扩展详细信息:
az k8s-extension show --name <extension-name> --cluster-type connectedClusters --cluster-name <your-connected-cluster-name> --resource-group <resource-group>
在响应中,查找 "name" 和 "provisioningState": "Succeeded"。 请注意,前几分钟的响应可能显示 "provisioningState": "Pending"。
如果 provisioningState 显示 Succeeded,请在将 kubeconfig 文件指向你的群集的情况下,在计算机上运行以下命令,以检查 azureml 命名空间下的所有 pod 是否都处于“Running”状态:
kubectl get pods -n azureml
查看 Azure 机器学习扩展组件
Azure 机器学习扩展部署完成后,可以使用 kubectl get deployments -n azureml
查看群集中创建的资源列表。 其中通常包含每个指定配置设置的以下资源的子集。
资源名称 | 资源类型 | 培训 | 推理 | 训练和推理 | 说明 | 与云通信 |
---|---|---|---|---|---|---|
gateway | Kubernetes 部署 | ✓ | ✓ | ✓ | 网关用于来回通信和发送数据。 | 将节点和群集资源信息发送到云服务。 |
aml-operator | Kubernetes 部署 | ✓ | 空值 | ✓ | 管理训练作业的生命周期。 | 与云令牌服务交换令牌,以便对 Azure 容器注册表进行身份验证和授权。 |
metrics-controller-manager | Kubernetes 部署 | ✓ | ✓ | ✓ | 管理 Prometheus 的配置 | 空值 |
{EXTENSION-NAME}-kube-state-metrics | Kubernetes 部署 | ✓ | ✓ | ✓ | 将群集相关的指标导出到 Prometheus。 | 空值 |
{EXTENSION-NAME}-prometheus-operator | Kubernetes 部署 | 可选 | 可选 | 可选 | 提供 Prometheus 和相关监视组件的 Kubernetes 本机部署和管理。 | 空值 |
azureml-fe-v2 | Kubernetes 部署 | 空值 | ✓ | ✓ | 用于将传入推理请求路由到已部署服务的前端组件。 | 将服务日志发送到 Azure 存储。 |
inference-operator-controller-manager | Kubernetes 部署 | 空值 | ✓ | ✓ | 管理推理终结点的生命周期。 | 空值 |
volcano-admission | Kubernetes 部署 | 可选 | 空值 | 可选 | Volcano 许可 Webhook。 | 空值 |
volcano-controllers | Kubernetes 部署 | 可选 | 空值 | 可选 | 管理 Azure 机器学习训练作业 pod 的生命周期。 | 空值 |
volcano-scheduler | Kubernetes 部署 | 可选 | 空值 | 可选 | 用于执行群集内作业计划。 | 空值 |
fluent-bit | Kubernetes daemonset | ✓ | ✓ | ✓ | 收集组件的系统日志。 | 将组件的系统日志上传到云。 |
{EXTENSION-NAME}-dcgm-exporter | Kubernetes daemonset | 可选 | 可选 | 可选 | dcgm-exporter 公开 Prometheus 的 GPU 指标。 | 空值 |
nvidia-device-plugin-daemonset | Kubernetes daemonset | 可选 | 可选 | 可选 | nvidia-device-plugin-daemonset 在群集的每个节点上公开 GPU | 空值 |
prometheus-prom-prometheus | Kubernetes statefulset | ✓ | ✓ | ✓ | 收集作业指标并将其发送到云。 | 将 CPU/GPU/内存利用率等作业指标发送到云。 |
重要
- 默认情况下,Kubernetes 部署资源将随机部署到群集上的 1 个或多个节点,而守护程序集资源将部署到所有节点。 若要将扩展部署限制为特定的节点,请按配置设置表所述使用
nodeSelector
配置设置。
注意
- {EXTENSION-NAME}: 是由
az k8s-extension create --name
CLI 命令指定的扩展名。