Azure ML多实例训练异常:双节点集群仅单节点运行
排查AML集群单节点空闲的并行训练问题
我来帮你梳理下为什么你的AML集群只有一个节点在工作——核心问题大概率是训练步骤没配置分布式运行,加上训练脚本本身没启用多节点并行逻辑,导致即使集群有2个节点,也只会用其中一个。
下面分步骤给你解决思路:
1. 先修正管道步骤的分布式配置
你的PythonScriptStep默认是单实例运行的,必须显式告诉AML要在多个节点上启动进程。需要在run_config里添加MPI分布式配置(TensorFlow多节点训练通常依赖MPI):
from azureml.core.runconfig import MpiConfiguration # 给你的run_config补充分布式运行设置 run_config.run_config.mpi = MpiConfiguration(node_count=2, process_count_per_node=1) # 指定框架类型为Python run_config.run_config.framework = 'python'
这样修改后,提交管道时AML会在2个节点上各启动一个训练进程,为多节点并行打下基础。
2. 改造训练脚本(Train.py)支持多节点Keras训练
Keras/TensorFlow不会自动利用多节点算力,必须用分布式策略包裹模型构建和训练逻辑。在你的Train.py里添加以下核心代码:
import os import json import tensorflow as tf from azureml.core import Run run = Run.get_context() # 读取AML自动注入的TF_CONFIG环境变量,获取集群节点信息 if 'TF_CONFIG' in os.environ: tf_config = json.loads(os.environ['TF_CONFIG']) print(f"集群节点配置: {tf_config}") # 初始化多Worker镜像策略,这是TensorFlow多节点训练的核心 strategy = tf.distribute.MultiWorkerMirroredStrategy() # 所有模型构建、编译、训练的代码都要放在strategy.scope()上下文里 with strategy.scope(): # 替换成你自己的模型定义 model = tf.keras.Sequential([ tf.keras.layers.Dense(64, activation='relu', input_shape=(10,)), tf.keras.layers.Dense(64, activation='relu'), tf.keras.layers.Dense(10, activation='softmax') ]) model.compile(optimizer='adam', loss='sparse_categorical_crossentropy', metrics=['accuracy']) # 加载数据集并开始训练(注意数据集要能被所有节点访问,比如用AML数据集或Blob存储挂载) train_dataset = tf.data.Dataset.from_tensor_slices((x_train, y_train)).batch(32) val_dataset = tf.data.Dataset.from_tensor_slices((x_val, y_val)).batch(32) model.fit(train_dataset, epochs=10, validation_data=val_dataset)
3. 额外检查点
- 确认集群节点状态:在AML工作室的集群页面查看,确保两个节点都处于Ready状态,如果有节点处于Provisioning,需要等待节点初始化完成;
- 验证数据集访问:确保所有节点都能读取训练数据(不要用本地路径,优先用AML数据集或Blob存储挂载);
- 查看运行日志:在实验运行的「Logs」标签下,检查
azureml-logs/70_driver_log.txt,确认是否有分布式初始化的日志,或者有没有报错信息。
按照上面的步骤修改后,再提交管道,应该就能看到两个节点都开始忙碌了~
内容的提问来源于stack exchange,提问作者webber
相关产品推荐
相关产品推荐

