模型训练 准确率下降_没有最快,只有更快!富士通74.7秒在ImageNet上训练完ResNet-50...

5091b19800b687c85f446930624cc7d6.png

大数据文摘出品

编译:林安安、蒋宝尚

74.7秒!

根据日本富士通实验室最新研究。他们应用了一种优化方法,在ABCI 集群上,实现了74.7秒的训练时间。训练吞吐量为173万图像/秒,top-1验证准确率为75.08%。

当然,如此快的速度也依赖于巨量的算力——使用了2,048个GPU。

目前此论文已经放在了arxiv上面供大家免费下载。

02ab2b938790ee3f53b7eb2f7ef08042.png

论文下载地址:

https://arxiv.org/abs/1903.12650

论文中提到,深度学习在过去的两年内迅速发展,发展速度加快了三十倍,人们对于能够高效执行机器学习的算法的需求越来越大。使用大规模mini batch的分布式深度学习是解决这个需求的关键技术,但很难准确地在大型集群上实现很高的可扩展性。

在大型数据集上训练的深度神经网络(DNN)模型在各领域(如物体检测,语言翻译等)都取得了令人瞩目的成果。然而,随着DNN模型和数据集的增多,DNN训练的计算成本也增加了。

众所周知,具有数据并行性的分布式深度学习能快速进行群集训练。此方法中,在群集上进行的所有进程都具有相同的DNN模型和权重。每个进程使用不同的mini batch训练模型,但是所有进程的权重梯度通过组合来更新。

这种通信开销(communication overhead)成为大型集群的重要问题。为了减少大型集群的开销,研究团队增加了DNN的mini batch并且同时进行DNN训练。然而,使用大型mini-batch训练通常会导致DNN模型的验证准确性更差。因此,他们使用几种方法来增加mini-batch的大小,这代表在迭代中计算的输入图像的数量,而且不会影响验证准确性。

关于使用的计算资源,他们在ABCI 集群和优化的MXNet深度学习框架上使用2,048个GPU。在ImageNet上使用81,920 mini-batch,74.7秒内就训练好 ResNet-50,达到了75.08%验证准确度。

具体方法

根据论文介绍,具体的研究方法分为3个部分,准确率提升、框架优化以及通信优化(Communication Optimizations)

关于准确率提升,其使用了通常用于深度学习优化的随机梯度下降(SGD)。当使用 large mini-batch 训练时,SGD 更新数量会随着小批量的增加而减少。所以,提高 large mini-batch 上最终验证准确率是一个很大的挑战,他们采用了学习速率控制:由于更新次数少,需要使用较高的学习速度来加速训练。然而,高的学习率使模型的训练在早期阶段变得不稳定。因此,我们通过使用热身(warmup)来稳定SGD,从而逐渐提高学习率。此外,对于某些层次来说,所有层的学习速度都太高,使用分层自适应率来稳定训练。

243613d6b5a87edda39d4a085f037ba1.png

ImageNet 上 ResNet-50 的训练时间和 top-1 验证准确率。

关于框架。其使用了MXNet,这是一个用C ++和CUDA C语言编写的开源深度学习框架。MXNet具有灵活性和可扩展性,可以在集群上高效地训练模型。然而,在中小型集群环境中只占总时间的一小部分的处理可能成为大规模集群环境中的瓶颈。他们分析了CPU和GPU的性能,并找出了瓶颈。 优化了瓶颈,提高训练吞吐量如下。采用的方法包括:并行DNN模型初始化( Parallel DNN model initialization)、在GPU上的批量规范计算(Batched norm computations on the GPU)

分布式并行深度学习需要所有减少通信以在所有进程之间交换每层的梯度,由于每个GPU的batch规模小,因此通信时间变长,而计算时间变短,所以减少通信开销在大型集群环境中是不可忽略的。 为了克服这些问题,他们采用的方法包括:调节通信的数据大小(Adjusting data size of communication),即研究人员收集了各层的梯度,然后将 allreduce 的数据大小调整为几兆字节;最佳的通信调度(Optimal scheduling of communications)即预先以统计的方式将所有层分为好几组。一旦每个进程完成一组中所有层的反向处理,就计划开始 allreduce 操作。

最后,训练准确度以及验证准确度结果如下

1e44d6300891df5bf6eb21c1a47e5677.png
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
首先,导入必要的库和读取数据集: ```python import pandas as pd import numpy as np import matplotlib.pyplot as plt import seaborn as sns from sklearn.linear_model import LinearRegression from sklearn.model_selection import train_test_split from sklearn.metrics import r2_score df = pd.read_csv('housing_price.csv') ``` 接着,对数据进行简单的探索性分析: ```python print(df.head()) print(df.describe()) print(df.info()) sns.pairplot(df[['price', 'area', 'income', 'age', 'rooms']]) plt.show() ``` 可以发现,数据集中共有5个变量:`price`(房价)、`area`(房屋面积)、`income`(周围家庭收入)、`age`(房龄)和`rooms`(房间数)。并且,没有缺失值。 接下来,我们分别建立单因子模型和多因子模型。 ## 单因子模型 我们首先以面积为输入量,建立单因子模型。为了可视化模型,我们将训练数据中的面积和房价画出来: ```python plt.scatter(df['area'], df['price']) plt.xlabel('Area') plt.ylabel('Price') plt.show() ``` ![image-20211102225556123](https://i.loli.net/2021/11/02/1q5KvzB2WlLj6Yw.png) 可以看出,面积与房价呈正相关关系。 接下来,我们将数据集分为训练集和测试集,并建立线性回归模型: ```python X = df[['area']] y = df['price'] X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42) lr = LinearRegression() lr.fit(X_train, y_train) ``` 我们可以输出回归模型的系数和截距: ```python print(lr.coef_) print(lr.intercept_) ``` 输出结果为: ``` [174.97017715] 15153.555288121032 ``` 因此,我们的单因子模型为: $$ \text{Price} = 174.97 \times \text{Area} + 15153.56 $$ 接下来,我们对模型进行评估。首先,我们可以输出模型在测试集上的R平方值: ```python y_pred = lr.predict(X_test) print(r2_score(y_test, y_pred)) ``` 输出结果为: ``` 0.6346974057775175 ``` 这说明模型可以解释测试集上63.5%的方差。 接下来,我们可视化模型: ```python plt.scatter(X_test, y_test) plt.plot(X_test, y_pred, color='red') plt.xlabel('Area') plt.ylabel('Price') plt.show() ``` ![image-20211102225707470](https://i.loli.net/2021/11/02/1jz4sGJ7e8y6hmp.png) 可以看出,模型的拟合效果还不错。 ## 多因子模型 我们接下来以收入、房龄、房间数和面积为输入变量,建立多因子模型。 首先,我们将数据集分为训练集和测试集: ```python X = df[['area', 'income', 'age', 'rooms']] y = df['price'] X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42) ``` 然后,我们建立线性回归模型: ```python lr = LinearRegression() lr.fit(X_train, y_train) ``` 我们可以输出回归模型的系数和截距: ```python print(lr.coef_) print(lr.intercept_) ``` 输出结果为: ``` [ 166.08167552 -1609.20087802 -66.55952222 8106.34349669] 35524.1816835563 ``` 因此,我们的多因子模型为: $$ \text{Price} = 166.08 \times \text{Area} - 1609.20 \times \text{Income} - 66.56 \times \text{Age} + 8106.34 \times \text{Rooms} + 35524.18 $$ 接下来,我们对模型进行评估。首先,我们可以输出模型在测试集上的R平方值: ```python y_pred = lr.predict(X_test) print(r2_score(y_test, y_pred)) ``` 输出结果为: ``` 0.7474287482409482 ``` 这说明模型可以解释测试集上74.7%的方差。 接下来,我们可视化模型: ```python sns.pairplot(df[['price', 'area', 'income', 'age', 'rooms']]) plt.show() plt.scatter(y_test, y_pred) plt.xlabel('True Values') plt.ylabel('Predictions') plt.show() ``` 第一张图是变量之间的散点图,第二张图是真实值与预测值之间的图,应该接近于一条直线。 ![image-20211102225815851](https://i.loli.net/2021/11/02/9R6MgHvzLJ7fC8b.png) ![image-20211102225843125](https://i.loli.net/2021/11/02/3fW8gkTMGt7HnbL.png) 可以看出,模型的拟合效果还不错。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值