如何在AzureML同一GPU/节点提交多个训练运行以节省成本
解决方案
1. 调整计算集群的每节点最大运行数
你遇到的MPI报错核心原因是AzureML计算集群默认配置了每个节点仅允许运行1个任务,对应参数max_runs_per_node默认为1,和你设置的slots参数冲突。
你可以通过两种方式修改该配置:
- 代码创建集群时指定参数:
from azureml.core.compute import ComputeTarget, AmlCompute compute_config = AmlCompute.provisioning_configuration( vm_size="你当前使用的GPU实例规格", min_nodes=0, max_nodes=你需要的最大节点数, max_runs_per_node=4 # 可根据GPU显存和单模型占用调整,比如16G显存+1G模型可设为6~8 ) gpu_cluster = ComputeTarget.create(workspace, "gpu_cluster", compute_config) gpu_cluster.wait_for_completion(show_output=True)
- 网页端修改已有集群:进入AzureML工作室的「计算」-「计算集群」页面,找到对应集群点击编辑,直接修改「每个节点的最大运行数」参数即可,无需重建集群。
2. 正常提交超参数搜索任务
调整集群配置后,不需要再给ScriptRunConfig传入distributed_job_config参数,也不需要修改你的训练脚本:
- 单任务提交:用你原有方式提交ScriptRunConfig即可,多个任务会被自动调度到同一个节点共享GPU资源。
- 超参数搜索:正常配置HyperDriveConfig即可,HyperDrive会自动将多个超参数子Run调度到同一节点,每个子Run的日志、检查点完全独立存储,不会出现混乱,也不需要重构现有训练Pipeline。
可选:显存占用控制
如果担心多个任务同时运行出现显存溢出,可以在训练脚本开头加入框架级别的显存限制,单卡单进程仅需增加1~2行代码即可:
- PyTorch 示例:
import torch # 限制单进程最多使用20%显存,对应max_runs_per_node=4的场景 torch.cuda.set_per_process_memory_fraction(0.2, device=0)
- TensorFlow 示例:
import tensorflow as tf gpus = tf.config.list_physical_devices('GPU') if gpus: tf.config.set_logical_device_configuration( gpus[0], [tf.config.LogicalDeviceConfiguration(memory_limit=3072)] # 限制单进程最多用3G显存 )
内容的提问来源于stack exchange,提问作者Prook
相关产品推荐
相关产品推荐

