使用 Azure ML SDK 完成云端 AutoML 模型训练、部署与消费:Data Science for Beginners 实战指南
本指南围绕 Data-Science-For-Beginners 课程第 19 课(5-Data-Science-In-Cloud/19-Azure)的实战作业展开,讲解如何用代码(而非图形界面)在 Azure Machine Learning 平台上完成"训练 → 部署 → 消费"的完整模型生命周期:以 Heart Failure 心力衰竭预测数据集为例,使用 Azure ML SDK 创建工作区对象与实验、配置并提交 AutoML 任务、注册最佳模型、将其部署为 Azure Container Instances 上的 REST 端点,最后通过 SDK 发送真实样本完成在线推理。学完本指南,你将掌握 AutoMLConfig 各核心参数的实际含义、AutoMLRun 的模型检索与注册方法,以及独立完成"找数据 → 训模型 → 部署 → 消费"闭环作业的能力。
一、作业解读:从"看懂演示"到"独立复现"
课程正文(5-Data-Science-In-Cloud/19-Azure/README.md)演示了如何使用 Azure ML SDK 完成一次完整的模型训练、部署与消费;而本课的 assignment.md 则要求你脱离现成演示,独立完成同样的事情:
环顾四周,找一份你感兴趣的数据(可从 Kaggle、Azure Open Datasets 等公开数据集目录获取),用 Azure ML SDK 训练另一个模型、部署它并消费它。
这意味着作业的核心交付物不是"看懂"课程代码,而是把课程里出现的 Workspace / Experiment / AmlCompute / AutoMLConfig / AutoMLRun / InferenceConfig / AciWebservice 这条 SDK 调用链,迁移到一份全新数据集上并跑通全流程。评分标准(Rubric)按三个等级递进:
| 等级 | 达成标准 |
|---|---|
| Exemplary(优秀) | 配置 AutoML 时真正翻阅过 SDK 文档、理解了各参数含义;用 Azure ML SDK 在数据集上跑通 AutoML 训练并查看模型解释(explanations);部署最佳模型并能通过 Azure ML SDK 消费它 |
| Adequate(合格) | 用 Azure ML SDK 跑通 AutoML 训练并查看模型解释;部署最佳模型并能通过 SDK 消费 |
| Needs Improvement(待改进) | 仅用 Azure ML SDK 跑通 AutoML 训练并部署、消费了最佳模型 |
三个等级的差别集中在两点:是否理解参数(对应下文 AutoMLConfig 参数详解)与是否查看模型解释(对应下文的 get_output() / 模型属性检视)。本文后续章节将完整覆盖这两点所需的全部代码与原理。
二、前置知识:Heart Failure 数据集与两种实现路线
课程将"心力衰竭预测"项目用两种方式实现:一种是上一课 18-Low-Code 讲解的 Low code/No code(图形界面)路线,另一种就是本课讲解的 Azure ML SDK(代码)路线。两者输入同一份数据集、完成同样的四步流程:训练模型、选择最佳模型、部署模型、消费端点,区别只在于操作手段:
| 维度 | Low code/No code | Azure ML SDK |
|---|---|---|
| 编码能力要求 | 不需要 | 需要 |
| 开发速度 | 快、易上手 | 取决于编码熟练度 |
| 生产化程度 | 否 | 是 |
随着项目成长并需要生产化时,通过 GUI 逐一手工创建资源不可行,必须用代码把"资源创建 → 模型部署"全流程自动化——这正是掌握 Azure ML SDK 的价值所在,也是本作业的训练目标。
作业与课程共用的数据集为 Kaggle 公开的 Heart Failure Clinical Records(心力衰竭临床记录):一份 13 列(12 个特征 + 1 个目标变量)、299 行的表格数据,各字段如下(源自 18-Low-Code/README.md 的数据集说明表):
| 变量名 | 类型 | 含义 | 示例 |
|---|---|---|---|
| age | 数值 | 患者年龄 | 25 |
| anaemia | 布尔 | 是否贫血(红细胞或血红蛋白减少) | 0 或 1 |
| creatinine_phosphokinase | 数值 | 血液中 CPK 酶水平 | 542 |
| diabetes | 布尔 | 是否患糖尿病 | 0 或 1 |
| ejection_fraction | 数值 | 每次收缩时离开心脏的血液百分比 | 45 |
| high_blood_pressure | 布尔 | 是否患高血压 | 0 或 1 |
| platelets | 数值 | 血液中血小板数量 | 149000 |
| serum_creatinine | 数值 | 血液中血清肌酐水平 | 0.5 |
| serum_sodium | 数值 | 血液中血清钠水平 | 140 |
| sex | 布尔 | 性别 | 0 或 1 |
| smoking | 布尔 | 是否吸烟 | 0 或 1 |
| time | 数值 | 随访期(天) | 4 |
| DEATH_EVENT(目标) | 布尔 | 随访期内患者是否死亡 | 0 或 1 |
注意:作业要求你更换数据集,但课程示例以 DEATH_EVENT 作为标签列名。你换用新数据时,只需把代码中的数据集 key(heart-failure-records)与标签列名替换成自己的即可,SDK 调用流程完全一致。
三、环境准备:工作区、计算实例与 Notebook
3.1 创建 Azure ML 工作区(Workspace)
作业以 Jupyter Notebook 作为载体,因此你需要一个 Azure ML 工作区(Workspace,Azure Machine Learning 的顶层资源,集中管理数据、计算资源、代码、模型与各类工件)和一台计算实例。若尚未创建工作区,请按照上一课 18-Low-Code/README.md 中"2.1 Create an Azure ML workspace"的步骤在 Azure 门户创建(涉及订阅、资源组、工作区名称、区域,以及随附的存储账户、Key Vault、Application Insights 等关联资源)。
3.2 创建计算实例(Compute Instance)
进入 Azure ML 工作区(ml.azure.com)后,点击左侧 Compute 菜单,即可看到各类计算资源(计算实例、计算集群、推理集群、附加计算)。本作业只需一个计算实例(数据科学家进行数据探索与模型开发的开发工作站,本质是一台承载 Jupyter Notebook 的虚拟机):
创建步骤:
- 点击 + New 按钮;
- 为计算实例命名;
- 选择配置:CPU 或 GPU、VM 规格与核数;
- 点击 Create 按钮,等待其启动。
计算实例创建完成后,在 Compute instances 列表中可看到其状态变为 Running,并列出 JupyterLab、Jupyter 等可用应用:
3.3 加载数据集(Dataset)
如果尚未把数据集上传到工作区,请参照上一课 18-Low-Code/README.md 的"2.3 Loading the Dataset":在 Studio 中点击 Datasets → + Create dataset → From local files,上传本地 CSV;命名并设置类型;在 Schema 页将 anaemia、diabetes、high_blood_pressure、sex、smoking、DEATH_EVENT 等特征的数据类型改为 Boolean,然后创建。
本作业的代码通过
ws.datasets['heart-failure-records']按**数据集名称(key)**取用数据,因此上传时务必确保数据集名称与代码中的 key 一致。
3.4 创建 Notebook
数据科学过程中 Notebook 承担着 Exploratory Data Analysis(EDA)、调用计算集群训练模型、调用推理集群部署端点等职责。在计算实例的 Applications 区域点击 Jupyter,勾选确认框继续,即可在新浏览器标签页打开 Jupyter 实例:
点击 New 创建 Python Notebook。当然,你也可以直接复用课程仓库中现成的可运行 Notebook:notebook.ipynb(其在 Azure ML Studio 的 Notebook 菜单中上传即可,配套参考实现位于 solution/notebook.ipynb)。该 Notebook 完整覆盖了从初始化工作区到消费端点的全部代码单元,是本节作业最直接的"脚手架"。
四、用 Azure ML SDK 训练模型
训练阶段按四步推进:初始化工作区 → 创建实验 → 准备计算集群 → 加载数据集,最后配置并提交 AutoML 任务。
4.1 SDK 导入与工作区初始化
课程 Notebook 首先集中导入所需模块(见 notebook.ipynb):
from azureml.core import Workspace, Experiment
from azureml.core.compute import AmlCompute
from azureml.train.automl import AutoMLConfig
from azureml.widgets import RunDetails
from azureml.core.model import InferenceConfig, Model
from azureml.core.webservice import AciWebservice
然后从持久化配置文件初始化工作区对象:
ws = Workspace.from_config()
print(ws.name, ws.resource_group, ws.location, ws.subscription_id, sep = '\n')
Workspace.from_config() 读取当前目录下的 config.json(内含订阅 ID、资源组、工作区名等),返回代表工作区的 Workspace 对象。若代码运行在 Azure ML 计算实例上且已关联工作区,配置文件会自动就位;在本地运行时,则需要把从 Studio 下载的 config.json 放在工作目录。
4.2 创建实验(Experiment)
experiment_name = 'aml-experiment'
experiment = Experiment(ws, experiment_name)
Experiment 是工作区中一系列运行(run)的容器,用于组织训练日志、指标、输出与脚本快照。命名规则:3–36 个字符,以字母或数字开头,只能包含字母、数字、下划线和连字符。若工作区中不存在同名实验,SDK 会自动创建。
4.3 创建计算集群(AmlCompute)
AutoML 训练需要一个计算集群(可弹性伸缩的 VM 集群,按需处理实验代码)。以下代码采用"先尝试获取、不存在则创建"的幂等写法,集群创建与就绪可能需要几分钟:
aml_name = "heart-f-cluster"
try:
aml_compute = AmlCompute(ws, aml_name)
print('Found existing AML compute context.')
except:
print('Creating new AML compute context.')
aml_config = AmlCompute.provisioning_configuration(vm_size = "Standard_D2_v2", min_nodes=1, max_nodes=3)
aml_compute = AmlCompute.create(ws, name = aml_name, provisioning_configuration = aml_config)
aml_compute.wait_for_completion(show_output = True)
cts = ws.compute_targets
compute_target = cts[aml_name]
关键参数说明:
vm_size:虚拟机规格。示例使用Standard_D2_v2(2 vCPU 的通用型实例),可按预算与算力需求调整;min_nodes/max_nodes:集群最少/最多节点数。min_nodes=1保证有节点随时可用;max_nodes=3限制自动扩缩容上限(上一课提示最大节点数建议不超过 3,节点越多训练越快但成本越高);AmlCompute.create(...).wait_for_completion(show_output=True):同步等待集群创建完成并打印进度;- 最后通过
ws.compute_targets[aml_name]取出计算目标对象,供 AutoML 配置引用。
4.4 加载数据集
key = 'heart-failure-records'
dataset = ws.datasets[key]
df = dataset.to_pandas_dataframe()
df.describe()
通过数据集 key 从工作区取回已上传的数据集对象,再用 to_pandas_dataframe() 转成 Pandas DataFrame 进行快速描述性统计(EDA 起点)。
4.5 AutoML 配置与训练提交
自动化机器学习(AutoML)自动迭代算法与超参数组合,替你把"调参试模型"的耗时工作自动化。配置的核心是 AutoMLConfig 类,课程对所用参数给出了明确语义(见 README.md 2.5.2 节):
| 参数 | 含义 |
|---|---|
experiment_timeout_minutes |
实验允许运行的最大时长(分钟),超时自动停止并产出可用结果 |
max_concurrent_iterations |
允许的最大并发训练迭代数 |
primary_metric |
用于评判实验状态的主指标 |
compute_target |
AutoML 实验运行的计算目标 |
task |
任务类型,可取 classification、regression 或 forecasting |
training_data |
实验使用的训练数据,应包含训练特征与标签列(可选样本权重列) |
label_column_name |
标签列名 |
path |
Azure ML 项目文件夹的完整路径 |
enable_early_stopping |
短期指标未改善时是否提前终止 |
featurization |
是否自动执行特征化,或使用自定义特征化 |
debug_log |
写入调试信息的日志文件 |
实际配置代码如下:
project_folder = './aml-project'
automl_settings = {
"experiment_timeout_minutes": 20,
"max_concurrent_iterations": 3,
"primary_metric" : 'AUC_weighted'
}
automl_config = AutoMLConfig(compute_target=compute_target,
task = "classification",
training_data=dataset,
label_column_name="DEATH_EVENT",
path = project_folder,
enable_early_stopping= True,
featurization= 'auto',
debug_log = "automl_errors.log",
**automl_settings
)
对本示例含义的拆解:
task="classification":DEATH_EVENT是二分类布尔标签,故选择分类任务(回归/预测任务需相应调整);primary_metric='AUC_weighted':以加权 AUC(ROC 曲线下面积)作为模型优劣的评判主指标,适合类别可能不均衡的分类问题;enable_early_stopping=True:若指标短期内不再改善,AutoML 提前停止,节省计算费用;featurization='auto':自动执行缺失值处理、编码、缩放等特征化步骤;debug_log="automl_errors.log":调试信息落盘,便于排错;**automl_settings:把上述超参字典展开传入,保持配置集中可读。
作业加分点(对应 Rubric 的 Exemplary 等级):完成作业时,请针对你的数据集重新审视这些参数——例如新数据集的标签是回归目标就应把
task改为regression、指标改为 RMSE 等;experiment_timeout_minutes、max_concurrent_iterations直接决定训练时长与并发成本。去 SDK 文档中确认你所选参数的可取值与默认值,是达到"优秀"等级的关键。
配置就绪后提交实验。这一步会异步在远端计算集群上执行,时长可能从十几分钟到一小时,取决于集群规模:
remote_run = experiment.submit(automl_config)
随后可用 RunDetails 控件在 Notebook 中内嵌展示各轮迭代的运行详情:
from azureml.widgets import RunDetails
RunDetails(remote_run).show()
五、保存最佳模型:get_output 与模型注册
remote_run 是 AutoMLRun 类型的对象,其 get_output() 方法返回最佳运行与对应的已拟合模型:
best_run, fitted_model = remote_run.get_output()
打印 fitted_model 可查看最佳模型的算法与参数;用 get_properties() 可查看该运行记录的属性(如模型名、指标等):
best_run.get_properties()
注册模型是部署的前提——register_model 把模型写入工作区的模型注册表,赋予其版本与元数据:
model_name = best_run.properties['model_name']
script_file_name = 'inference/score.py'
best_run.download_file('outputs/scoring_file_v_1_0_0.py', 'inference/score.py')
description = "aml heart failure project sdk"
model = best_run.register_model(model_name = model_name,
model_path = './outputs/',
description = description,
tags = None)
这里发生了两件重要的事:
- 下载推理脚本:AutoML 在运行输出
outputs/中生成开箱即用的评分脚本scoring_file_v_1_0_0.py,download_file将其保存为本地inference/score.py,稍后作为部署的入口脚本(entry script); - 注册模型:
register_model返回注册后的Model对象,model_path='./outputs/'指向模型工件所在目录,description用于备注,tags可附加自定义标签(此处为None)。
六、部署模型:InferenceConfig 与 ACI Web 服务
模型注册后即可部署。部署涉及两个配置类:
InferenceConfig:表示部署所用自定义环境的配置(入口脚本 + 运行环境),此处环境直接取自 AutoML 最佳运行:environment=best_run.get_environment(),保证评分脚本与训练时的依赖环境一致;AciWebservice:代表部署在 Azure Container Instances(ACI) 上的 Web 服务端点。部署服务由模型、脚本与关联文件构成,最终呈现为一个负载均衡、带 REST API 的 HTTP 端点,可向其发送数据并接收模型预测。
部署代码如下(使用 Model.deploy 方法):
inference_config = InferenceConfig(entry_script=script_file_name, environment=best_run.get_environment())
aciconfig = AciWebservice.deploy_configuration(cpu_cores = 1,
memory_gb = 1,
tags = {'type': "automl-heart-failure-prediction"},
description = 'Sample service for AutoML Heart Failure Prediction')
aci_service_name = 'automl-hf-sdk'
aci_service = Model.deploy(ws, aci_service_name, [model], inference_config, aciconfig)
aci_service.wait_for_deployment(True)
print(aci_service.state)
参数要点:
entry_script:评分脚本路径,即上一步下载的inference/score.py;cpu_cores/memory_gb:为端点分配的计算资源(此处 1 核 1 GB,可据请求量调整);tags/description:端点的元数据标识;Model.deploy(ws, aci_service_name, [model], inference_config, aciconfig):把模型列表(此处单个模型)连同推理配置、部署配置发布为命名服务;wait_for_deployment(True):阻塞等待部署完成并输出进度;aci_service.state可查询服务状态(部署通常需要几分钟,可同时在 Azure ML 门户观察)。
七、消费端点:发送样本并解读预测
端点就绪后即可消费。先构造一条患者样本输入(字段与数据集特征一一对应,均为字符串形式):
data = {
"data":
[
{
'age': "60",
'anaemia': "false",
'creatinine_phosphokinase': "500",
'diabetes': "false",
'ejection_fraction': "38",
'high_blood_pressure': "false",
'platelets': "260000",
'serum_creatinine': "1.40",
'serum_sodium': "137",
'sex': "false",
'smoking': "false",
'time': "130",
},
],
}
test_sample = str.encode(json.dumps(data))
把样本序列化为 JSON 字符串后再编码为字节,通过服务的 run() 方法发送给端点进行在线预测:
response = aci_service.run(input_data=test_sample)
response
预期输出为 '{"result": [false]}':false 表示该输入样本对应患者在随访期内发生心力衰竭死亡的风险不高(若为 true 则表示风险高)。至此,"训练 → 部署 → 消费"的 SDK 闭环已完整跑通。
八、收尾:清理资源与延伸挑战
8.1 清理资源
注意:项目结束后务必删除所有资源(计算实例、计算集群、部署的服务、工作区及其关联的存储账户等),否则 Azure 订阅会持续产生费用——课程在 Low code 一课中同样提示:只要工作区存在于订阅中,数据存储就会产生小额费用。
8.2 延伸挑战:探索 Pipeline 类
课程给出的进阶挑战是:翻阅 Azure ML SDK 文档,找到 Pipeline 类。Pipeline 是"可由多个步骤组成的、作为工作流执行"的集合,可将数据准备、训练、评估、部署等步骤串联成可复用的自动化流水线。SDK 文档中搜索 Pipeline 关键字即可定位到 azureml.pipeline.core.Pipeline 类——这是把本课单步流程升级为生产级 MLOps 工作流的自然下一步。
8.3 作业完成清单
对照 assignment.md 的评分标准,一份完整的作业应包含:
- 选定一份新数据集(Kaggle、Azure Open Datasets 或其他来源),理解其字段含义与目标变量;
- 用
Workspace/Experiment/AmlCompute完成环境初始化,把数据集上传至工作区并通过ws.datasets[key]取用; - 依据新数据集重新审视
AutoMLConfig参数(任务类型、主指标、超时与并发、标签列名等),提交 AutoML 训练; - 通过
remote_run.get_output()检视最佳模型,查看模型解释/属性; - 注册模型并用
InferenceConfig+AciWebservice部署,最后用aci_service.run()完成消费并解读预测结果; - 使用完毕后清理全部资源。
完成以上六步,即达到 Rubric 中 Exemplary 的标准——不仅"会用",而且"懂参数、能解释、可迁移"。
九、可继续深入阅读的仓库资源
- 课程正文(含全部代码与注释):5-Data-Science-In-Cloud/19-Azure/README.md
- 可运行 Notebook(作业脚手架):notebook.ipynb 与配套参考 solution/notebook.ipynb
- 上一课(Low code/No code 路线、数据集与工作区创建细节):5-Data-Science-In-Cloud/18-Low-Code/README.md
- 作业原文与评分标准:assignment.md
- 云端数据科学课程总览:5-Data-Science-In-Cloud/README.md
atomcodeClaude Code 的开源替代方案。连接任意大模型,编辑代码,运行命令,自动验证 — 全自动执行。用 Rust 构建,极致性能。 | An open-source alternative to Claude Code. Connect any LLM, edit code, run commands, and verify changes — autonomously. Built in Rust for speed. Get StartedRust0629
MiniCPM5-2BMiniCPM5-2B 是一款面向端侧、本地部署和资源受限场景的 2B 稠密 Transformer,能够达到同尺寸开源模型 SOTA 水平。Markdown00
GLM-5.3GLM-5.3 与 GLM-5.2 使用相同的基座模型——所有提升均来自后训练。与 GLM-5.2 相比,它在复杂编程和长程任务上的表现显著提升。Jinja00
HivisionIDPhotos⚡️HivisionIDPhotos: a lightweight and efficient AI ID photos tools. 一个轻量级的AI证件照制作算法。Python07
DragonOSDragonOS is an operating system developed from scratch using Rust, with Linux compatibility. It is designed for **Serverless** scenarios. 使用Rust从0自研内核,具有Linux兼容性的操作系统,面向云计算Serverless场景而设计。Rust00
Spark-X2.5-1.7BSpark-X2.5-1.7B 旨在让强大的 AI 更加实用、高效且易于获取。这些模型在广泛的日常任务中表现出色,涵盖对话、写作、翻译、推理、编程、工具调用和智能体工作流,并在同等规模的开源模型中取得领先结果。Spark-X2.5 将面向效率的架构与最高 1M tokens 的原生上下文窗口相结合,并支持 200 多种语言。Python00