ℹ️ Skipped - page is already crawled
| Filter | Status | Condition | Details |
|---|---|---|---|
| HTTP status | PASS | download_http_code = 200 | HTTP 200 |
| Age cutoff | PASS | download_stamp > now() - 6 MONTH | 7.5 months ago (distributed domain, exempt) |
| History drop | PASS | isNull(history_drop_reason) | No drop reason |
| Spam/ban | PASS | fh_dont_index != 1 AND ml_spam_score = 0 | ml_spam_score=0 |
| Canonical | PASS | meta_canonical IS NULL OR = '' OR = src_unparsed | Not set |
| Property | Value |
|---|---|
| URL | https://learn.microsoft.com/zh-cn/azure/synapse-analytics/machine-learning/tutorial-horovod-pytorch |
| Last Crawled | 2025-09-12 19:47:49 (7 months ago) |
| First Indexed | not set |
| HTTP Status Code | 200 |
| Content | |
| Meta Title | 教程:使用 Horovod 和 PyTorch 进行分布式训练(已弃用) - Azure Synapse Analytics | Microsoft Learn |
| Meta Description | 有关如何使用 Horovod 估算器和 PyTorch 运行分布式训练的教程 |
| Meta Canonical | null |
| Boilerpipe Text | Horovod 是一个分布式训练框架,适用于 TensorFlow 和 PyTorch 等库。 使用 Horovod,用户只需几行代码即可纵向扩展现有训练脚本,以在数百个 GPU 上运行。 在 Azure Synapse Analytics 中,用户可以使用默认的 Apache Spark 3 运行时快速开始使用 Horovod。 对于使用 PyTorch 的 Spark ML 管道应用程序,用户可以使用 horovod.spark 估算器 API。 此笔记本使用 Apache Spark 数据帧在 MNIST 数据集上执行分布式神经网络 (DNN) 模型的分布式训练。 本教程使用 PyTorch 和 Horovod 估算器运行训练过程。 先决条件 注意 已启用 Azure Synapse GPU 的池的预览版现已弃用。 配置 Apache Spark 会话 在会话开始时,我们需要配置一些 Apache Spark 设置。 在大多数情况下,只需设置 numExecutors 和 spark.rapids.memory.gpu.reserve。 对于大型模型,用户可能还需要配置 spark.kryoserializer.buffer.max 设置。 对于 TensorFlow 模型,用户需要将 spark.executorEnv.TF_FORCE_GPU_ALLOW_GROWTH 设置为 true。 在此示例中,你可以看到如何使用 %%configure 命令传递 Spark 配置。
Apache Spark 配置文档 中详细解释了每个参数的含义。 提供的值是建议用于 Azure Synapse GPU 大型池的最佳做法值。
%%configure -f
{
"driverMemory": "30g",
"driverCores": 4,
"executorMemory": "60g",
"executorCores": 12,
"numExecutors": 3,
"conf":{
"spark.rapids.memory.gpu.reserve": "10g",
"spark.executorEnv.TF_FORCE_GPU_ALLOW_GROWTH": "true",
"spark.kryoserializer.buffer.max": "2000m"
}
}
在本教程中,我们将使用以下配置:
%%configure -f
{
"numExecutors": 3,
"conf":{
"spark.rapids.memory.gpu.reserve": "10g"
}
}
注意 使用 Horovod 进行训练时,用户应将 numExecutors 的 Spark 配置设置为小于或等于节点数。 导入依赖项 在本教程中,我们使用 PySpark 读取和处理数据集。 然后使用 PyTorch 和 Horovod 构建分布式神经网络 (DNN) 模型并运行训练过程。 若要开始操作,需要导入以下依赖项: # base libs
import sys
import uuid
# numpy
import numpy as np
# pyspark related
import pyspark
import pyspark.sql.types as T
from pyspark.ml.evaluation import MulticlassClassificationEvaluator
from pyspark.sql import SparkSession
from pyspark.sql.functions import udf
# pytorch related
import torch.nn as nn
import torch.nn.functional as F
import torch.optim as optim
# horovod related
import horovod.spark.torch as hvd
from horovod.spark.common.backend import SparkBackend
from horovod.spark.common.store import Store
# azure related
from azure.synapse.ml.horovodutils import AdlsStore
连接到备用存储帐户 需要使用 Azure Data Lake Storage (ADLS) 帐户来存储中间数据和模型数据。 如果使用备用存储帐户,请确保设置 链接服务 以自动对帐户进行身份验证和读取。 此外,还需要修改以下属性: remote_url 、 account_name 和 linked_service_name 。 num_proc = 3 # equal to numExecutors
batch_size = 128
epochs = 3
lr_single_node = 0.01 # learning rate for single node code
uuid_str = str(uuid.uuid4()) # with uuid, each run will use a new directory
work_dir = '/tmp/' + uuid_str
# create adls store for model training, use your own adls account info
remote_url = "<<ABFS path to storage account>>"
account_name = "<<name of storage account>>"
linked_service_name = "<<name of linked service>>"
sas_token = TokenLibrary.getConnectionString(linked_service_name)
adls_store_path = remote_url + work_dir
store = AdlsStore.create(adls_store_path,
storage_options={
'account_name': account_name,
'sas_token': sas_token
},
save_runs=True)
print(adls_store_path)
准备数据集 接下来,我们将准备用于训练的数据集。 在本教程中,我们将使用 Azure 开放数据集 中的 MNIST 数据集。 # Initialize SparkSession
spark = SparkSession.builder.getOrCreate()
# Download MNIST dataset from Azure Open Datasets
from azureml.opendatasets import MNIST
mnist = MNIST.get_tabular_dataset()
mnist_df = mnist.to_pandas_dataframe()
mnist_df.info()
# Preprocess dataset
mnist_df['features'] = mnist_df.iloc[:, :784].values.tolist()
mnist_df.drop(mnist_df.iloc[:, :784], inplace=True, axis=1)
mnist_df.head()
使用 Apache Spark 处理数据 现在,我们将创建 Apache Spark 数据帧。 此数据框将与 HorovodEstimator 一起用于训练。 # Create Spark DataFrame for training
df = spark.createDataFrame(mnist_df)
# repartition DataFrame for training
train_df = df.repartition(num_proc)
# Train/test split
train_df, test_df = train_df.randomSplit([0.9, 0.1])
# show the dataset
train_df.show()
train_df.count()
定义 DNN 模型 完成数据集处理后,现在可以定义 PyTorch 模型。 同一代码还可用于训练单节点 PyTorch 模型。 # Define the PyTorch model without any Horovod-specific parameters
class Net(nn.Module):
def __init__(self):
super(Net, self).__init__()
self.conv1 = nn.Conv2d(1, 10, kernel_size=5)
self.conv2 = nn.Conv2d(10, 20, kernel_size=5)
self.conv2_drop = nn.Dropout2d()
self.fc1 = nn.Linear(320, 50)
self.fc2 = nn.Linear(50, 10)
def forward(self, x):
x = x.float()
x = F.relu(F.max_pool2d(self.conv1(x), 2))
x = F.relu(F.max_pool2d(self.conv2_drop(self.conv2(x)), 2))
x = x.view(-1, 320)
x = F.relu(self.fc1(x))
x = F.dropout(x, training=self.training)
x = self.fc2(x)
return F.log_softmax(x)
model = Net()
optimizer = optim.SGD(model.parameters(),
lr=lr_single_node * num_proc,
momentum=0.5) # notice the lr is scaled up
loss = nn.NLLLoss()
定型模型 现在,我们可以在 Apache Spark 数据帧的基础上训练 Horovod Spark 估算器。 # Train a Horovod Spark Estimator on the DataFrame
backend = SparkBackend(num_proc=num_proc,
stdout=sys.stdout,
stderr=sys.stderr,
prefix_output_with_timestamp=True)
torch_estimator = hvd.TorchEstimator(
backend=backend,
store=store,
partitions_per_process=1, # important for GPU training
model=model,
optimizer=optimizer,
loss=lambda input, target: loss(input, target.long()),
input_shapes=[[-1, 1, 28, 28]],
feature_cols=['features'],
label_cols=['label'],
batch_size=batch_size,
epochs=epochs,
validation=0.1,
verbose=2)
torch_model = torch_estimator.fit(train_df).setOutputCols(['label_prob'])
评估已训练的模型 训练过程完成后,可以在测试数据集上评估模型。 # Evaluate the model on the held-out test DataFrame
pred_df = torch_model.transform(test_df)
argmax = udf(lambda v: float(np.argmax(v)), returnType=T.DoubleType())
pred_df = pred_df.withColumn('label_pred', argmax(pred_df.label_prob))
evaluator = MulticlassClassificationEvaluator(predictionCol='label_pred',
labelCol='label',
metricName='accuracy')
print('Test accuracy:', evaluator.evaluate(pred_df))
清理资源 为了确保关闭 Spark 实例,请结束任何已连接的会话(笔记本)。 达到 Apache Spark 池中指定的 空闲时间 时,池将会关闭。 也可以从笔记本右上角的状态栏中选择“停止会话”。 后续步骤 |
| Markdown | [跳转至主内容](https://learn.microsoft.com/zh-cn/azure/synapse-analytics/machine-learning/tutorial-horovod-pytorch#main) [跳到 Ask Learn 聊天体验](https://learn.microsoft.com/zh-cn/azure/synapse-analytics/machine-learning/tutorial-horovod-pytorch)
此浏览器不再受支持。
请升级到 Microsoft Edge 以使用最新的功能、安全更新和技术支持。
[下载 Microsoft Edge](https://go.microsoft.com/fwlink/p/?LinkID=2092881%20) [有关 Internet Explorer 和 Microsoft Edge 的详细信息](https://learn.microsoft.com/en-us/lifecycle/faq/internet-explorer-microsoft-edge)
目录
Exit editor mode
询问 Learn
询问 Learn
Focus mode
目录
[使用英语阅读](https://learn.microsoft.com/zh-cn/azure/synapse-analytics/machine-learning/tutorial-horovod-pytorch)
添加
添加到计划
***
#### 通过
[Facebook](https://learn.microsoft.com/zh-cn/azure/synapse-analytics/machine-learning/tutorial-horovod-pytorch) [x.com 共享](https://learn.microsoft.com/zh-cn/azure/synapse-analytics/machine-learning/tutorial-horovod-pytorch) [LinkedIn](https://learn.microsoft.com/zh-cn/azure/synapse-analytics/machine-learning/tutorial-horovod-pytorch) [电子邮件](https://learn.microsoft.com/zh-cn/azure/synapse-analytics/machine-learning/tutorial-horovod-pytorch)
***
打印
你当前正在访问 Microsoft Azure Global Edition 技术文档网站。 如果需要访问由世纪互联运营的 Microsoft Azure 中国技术文档网站,请访问 <https://docs.azure.cn>。
***
备注
访问此页面需要授权。 可以尝试[登录](https://learn.microsoft.com/zh-cn/azure/synapse-analytics/machine-learning/tutorial-horovod-pytorch)或[更改目录]()。
访问此页面需要授权。 可以尝试[更改目录]()。
# 教程:使用 Horovod 估算器和 PyTorch 进行分布式训练(已弃用)
- 2025-06-05
反馈
## 本文内容
[Horovod](https://github.com/horovod/horovod) 是一个分布式训练框架,适用于 TensorFlow 和 PyTorch 等库。 使用 Horovod,用户只需几行代码即可纵向扩展现有训练脚本,以在数百个 GPU 上运行。
在 Azure Synapse Analytics 中,用户可以使用默认的 Apache Spark 3 运行时快速开始使用 Horovod。 对于使用 PyTorch 的 Spark ML 管道应用程序,用户可以使用 horovod.spark 估算器 API。 此笔记本使用 Apache Spark 数据帧在 MNIST 数据集上执行分布式神经网络 (DNN) 模型的分布式训练。 本教程使用 PyTorch 和 Horovod 估算器运行训练过程。
## 先决条件
- [Azure Synapse Analytics 工作区](https://learn.microsoft.com/zh-cn/azure/synapse-analytics/get-started-create-workspace),其中 Azure Data Lake Storage Gen2 存储帐户配置为默认存储。 你需要成为所使用的 Data Lake Storage Gen2 文件系统的存储 Blob 数据参与者。
- 在 Azure Synapse Analytics 工作区中创建支持 GPU 的 Apache Spark 池。 有关详细信息,请参阅[在 Azure Synapse 中创建支持 GPU 的 Apache Spark 池](https://learn.microsoft.com/zh-cn/azure/synapse-analytics/spark/apache-spark-gpu-concept)。 对于本教程,建议使用具有 3 个节点的大型 GPU 群集。
注意
已启用 Azure Synapse GPU 的池的预览版现已弃用。
## 配置 Apache Spark 会话
在会话开始时,我们需要配置一些 Apache Spark 设置。 在大多数情况下,只需设置 numExecutors 和 spark.rapids.memory.gpu.reserve。 对于大型模型,用户可能还需要配置 `spark.kryoserializer.buffer.max` 设置。 对于 TensorFlow 模型,用户需要将 `spark.executorEnv.TF_FORCE_GPU_ALLOW_GROWTH` 设置为 true。
在此示例中,你可以看到如何使用 `%%configure` 命令传递 Spark 配置。 [Apache Spark 配置文档](https://spark.apache.org/docs/latest/configuration.html)中详细解释了每个参数的含义。 提供的值是建议用于 Azure Synapse GPU 大型池的最佳做法值。
```
%%configure -f
{
"driverMemory": "30g",
"driverCores": 4,
"executorMemory": "60g",
"executorCores": 12,
"numExecutors": 3,
"conf":{
"spark.rapids.memory.gpu.reserve": "10g",
"spark.executorEnv.TF_FORCE_GPU_ALLOW_GROWTH": "true",
"spark.kryoserializer.buffer.max": "2000m"
}
}
```
在本教程中,我们将使用以下配置:
```
%%configure -f
{
"numExecutors": 3,
"conf":{
"spark.rapids.memory.gpu.reserve": "10g"
}
}
```
注意
使用 Horovod 进行训练时,用户应将 `numExecutors` 的 Spark 配置设置为小于或等于节点数。
## 导入依赖项
在本教程中,我们使用 PySpark 读取和处理数据集。 然后使用 PyTorch 和 Horovod 构建分布式神经网络 (DNN) 模型并运行训练过程。 若要开始操作,需要导入以下依赖项:
```
# base libs
import sys
import uuid
# numpy
import numpy as np
# pyspark related
import pyspark
import pyspark.sql.types as T
from pyspark.ml.evaluation import MulticlassClassificationEvaluator
from pyspark.sql import SparkSession
from pyspark.sql.functions import udf
# pytorch related
import torch.nn as nn
import torch.nn.functional as F
import torch.optim as optim
# horovod related
import horovod.spark.torch as hvd
from horovod.spark.common.backend import SparkBackend
from horovod.spark.common.store import Store
# azure related
from azure.synapse.ml.horovodutils import AdlsStore
```
## 连接到备用存储帐户
需要使用 Azure Data Lake Storage (ADLS) 帐户来存储中间数据和模型数据。 如果使用备用存储帐户,请确保设置 [链接服务](https://learn.microsoft.com/zh-cn/azure/data-factory/concepts-linked-services) 以自动对帐户进行身份验证和读取。 此外,还需要修改以下属性:`remote_url`、`account_name` 和 `linked_service_name`。
```
num_proc = 3 # equal to numExecutors
batch_size = 128
epochs = 3
lr_single_node = 0.01 # learning rate for single node code
uuid_str = str(uuid.uuid4()) # with uuid, each run will use a new directory
work_dir = '/tmp/' + uuid_str
# create adls store for model training, use your own adls account info
remote_url = "<<ABFS path to storage account>>"
account_name = "<<name of storage account>>"
linked_service_name = "<<name of linked service>>"
sas_token = TokenLibrary.getConnectionString(linked_service_name)
adls_store_path = remote_url + work_dir
store = AdlsStore.create(adls_store_path,
storage_options={
'account_name': account_name,
'sas_token': sas_token
},
save_runs=True)
print(adls_store_path)
```
## 准备数据集
接下来,我们将准备用于训练的数据集。 在本教程中,我们将使用 [Azure 开放数据集](https://learn.microsoft.com/zh-cn/azure/open-datasets/dataset-mnist?tabs=azureml-opendatasets)中的 MNIST 数据集。
```
# Initialize SparkSession
spark = SparkSession.builder.getOrCreate()
# Download MNIST dataset from Azure Open Datasets
from azureml.opendatasets import MNIST
mnist = MNIST.get_tabular_dataset()
mnist_df = mnist.to_pandas_dataframe()
mnist_df.info()
# Preprocess dataset
mnist_df['features'] = mnist_df.iloc[:, :784].values.tolist()
mnist_df.drop(mnist_df.iloc[:, :784], inplace=True, axis=1)
mnist_df.head()
```
## 使用 Apache Spark 处理数据
现在,我们将创建 Apache Spark 数据帧。 此数据框将与 `HorovodEstimator` 一起用于训练。
```
# Create Spark DataFrame for training
df = spark.createDataFrame(mnist_df)
# repartition DataFrame for training
train_df = df.repartition(num_proc)
# Train/test split
train_df, test_df = train_df.randomSplit([0.9, 0.1])
# show the dataset
train_df.show()
train_df.count()
```
## 定义 DNN 模型
完成数据集处理后,现在可以定义 PyTorch 模型。 同一代码还可用于训练单节点 PyTorch 模型。
```
# Define the PyTorch model without any Horovod-specific parameters
class Net(nn.Module):
def __init__(self):
super(Net, self).__init__()
self.conv1 = nn.Conv2d(1, 10, kernel_size=5)
self.conv2 = nn.Conv2d(10, 20, kernel_size=5)
self.conv2_drop = nn.Dropout2d()
self.fc1 = nn.Linear(320, 50)
self.fc2 = nn.Linear(50, 10)
def forward(self, x):
x = x.float()
x = F.relu(F.max_pool2d(self.conv1(x), 2))
x = F.relu(F.max_pool2d(self.conv2_drop(self.conv2(x)), 2))
x = x.view(-1, 320)
x = F.relu(self.fc1(x))
x = F.dropout(x, training=self.training)
x = self.fc2(x)
return F.log_softmax(x)
model = Net()
optimizer = optim.SGD(model.parameters(),
lr=lr_single_node * num_proc,
momentum=0.5) # notice the lr is scaled up
loss = nn.NLLLoss()
```
## 定型模型
现在,我们可以在 Apache Spark 数据帧的基础上训练 Horovod Spark 估算器。
```
# Train a Horovod Spark Estimator on the DataFrame
backend = SparkBackend(num_proc=num_proc,
stdout=sys.stdout,
stderr=sys.stderr,
prefix_output_with_timestamp=True)
torch_estimator = hvd.TorchEstimator(
backend=backend,
store=store,
partitions_per_process=1, # important for GPU training
model=model,
optimizer=optimizer,
loss=lambda input, target: loss(input, target.long()),
input_shapes=[[-1, 1, 28, 28]],
feature_cols=['features'],
label_cols=['label'],
batch_size=batch_size,
epochs=epochs,
validation=0.1,
verbose=2)
torch_model = torch_estimator.fit(train_df).setOutputCols(['label_prob'])
```
## 评估已训练的模型
训练过程完成后,可以在测试数据集上评估模型。
```
# Evaluate the model on the held-out test DataFrame
pred_df = torch_model.transform(test_df)
argmax = udf(lambda v: float(np.argmax(v)), returnType=T.DoubleType())
pred_df = pred_df.withColumn('label_pred', argmax(pred_df.label_prob))
evaluator = MulticlassClassificationEvaluator(predictionCol='label_pred',
labelCol='label',
metricName='accuracy')
print('Test accuracy:', evaluator.evaluate(pred_df))
```
## 清理资源
为了确保关闭 Spark 实例,请结束任何已连接的会话(笔记本)。 达到 Apache Spark 池中指定的**空闲时间**时,池将会关闭。 也可以从笔记本右上角的状态栏中选择“停止会话”。

## 后续步骤
- [查看 Synapse 示例笔记本](https://github.com/Azure-Samples/Synapse/tree/main/MachineLearning)
- [详细了解支持 GPU 的 Apache Spark 池](https://learn.microsoft.com/zh-cn/azure/synapse-analytics/spark/apache-spark-gpu-concept)
***
## 反馈
此页面是否有帮助?
是
否
***
## 其他资源
### 本文内容
此页面是否有帮助?
是
否
[zh-cn](https://learn.microsoft.com/zh-cn/azure/synapse-analytics/machine-learning/tutorial-horovod-pytorch)
[你的隐私选择](https://aka.ms/yourcaliforniaprivacychoices)
主题
- 亮
- 暗
- 高对比度
- [AI Disclaimer](https://learn.microsoft.com/zh-cn/principles-for-ai-generated-content)
- [早期版本](https://learn.microsoft.com/zh-cn/previous-versions/)
- [博客](https://techcommunity.microsoft.com/t5/microsoft-learn-blog/bg-p/MicrosoftLearnBlog)
- [参与](https://learn.microsoft.com/zh-cn/contribute)
- [隐私](https://go.microsoft.com/fwlink/?LinkId=521839)
- [使用条款](https://learn.microsoft.com/zh-cn/legal/termsofuse)
- [商标](https://www.microsoft.com/legal/intellectualproperty/Trademarks/)
- © Microsoft 2025 |
| Readable Markdown | null |
| ML Classification | |
| ML Categories | null |
| ML Page Types | null |
| ML Intent Types | null |
| Content Metadata | |
| Language | zh-cn |
| Author | null |
| Publish Time | not set |
| Original Publish Time | 2025-09-12 19:47:49 (7 months ago) |
| Republished | No |
| Word Count (Total) | 762 |
| Word Count (Content) | 598 |
| Links | |
| External Links | 6 |
| Internal Links | 20 |
| Technical SEO | |
| Meta Nofollow | No |
| Meta Noarchive | No |
| JS Rendered | No |
| Redirect Target | null |
| Performance | |
| Download Time (ms) | 601 |
| TTFB (ms) | 465 |
| Download Size (bytes) | 47,707 |
| Shard | 168 (laksa) |
| Root Hash | 14615152987638977768 |
| Unparsed URL | com,microsoft!learn,/zh-cn/azure/synapse-analytics/machine-learning/tutorial-horovod-pytorch s443 |