哪些策略和形式的并行化是可行且可用于训练和服务神经网络的?:
我也在寻找有关它们如何用于 TensorFlow、PyTorch 或 MXNet 等的证据。
据我所知,在大型数据集上训练大型神经网络时,至少可以有:
什么时候每种策略更适合哪种类型的问题或神经网络?现代图书馆支持哪些模式?并且可以结合所有四种(2x2)策略吗?
最重要的是,我已经阅读了:
但我不知道到底是什么,指的,例如:Is it的计算梯度的不同批次的数据或计算梯度不同的子图?或者它可能完全指的是其他东西?
如果网络很大,预测/推理也可能很慢,并且模型在服务时可能不适合内存中的单个机器。是否有任何已知的多核和多节点预测解决方案可以处理此类模型?
distributed-computing deep-learning tensorflow mxnet pytorch
有很多方法可以保存模型及其权重。当有如此多的方法但没有任何来源可以读取和比较它们的属性时,这是令人困惑的。
我知道的一些格式是:
1. YAML 文件 - 仅结构
2. JSON 文件 - 仅结构
3. H5 完整模型 - Keras
4. 仅 H5 权重 - Keras
5. ProtoBuf - 使用 TensorFlow 服务进行部署
6. Pickle - Scikit-学习
7. Joblib - Scikit-learn - Pickle 的替代品,用于包含大数据的对象。
讨论:
与 scikit-learn 不同,Keras 不建议您使用 pickle 保存模型。相反,模型将保存为 HDF5 文件。HDF5 文件包含加载模型进行预测(即架构和训练参数)以及重新启动训练(即损失和优化器设置以及当前状态)所需的一切。
用于保存 Scikit-learn、Keras、Tensorflow 和 Mxnet 模型的其他格式还有哪些?另外,关于上述每种格式,我还缺少哪些信息?
我想知道是否有人可以建议如何在4 GPU设置中从张力流中获得最佳性能.
作为测试,我在32x32输入上创建了两个相同的网络(18个ish层剩余网络,带有小型滤波器组(范围从16-128).批量大小512,每个GPU 128个.).一个在MXNet和一个我已经模仿了初始示例.
我的MXNet网络每秒可以训练大约7k个示例,其中张量流仅能够使用虚拟数据4.2k,而3.7才能使用实际数据.
(在1 GPU上运行时,数字是每秒1.2k的例子,而2.1k)
在我的实验中,我有几个问题希望加快速度.
训练时GPU利用率似乎很低.我注意到在tensorflow白皮书中支持在同一GPU上运行多个流.这在公开发布中是否可行?
无论如何在一次执行中执行多个列车操作session.run()?还是有异步执行?这将允许在下一批次向前通过的同时进行重量更新?我尝试使用2个线程(系统和使用QueueRunnerss),但这只会导致速度减慢.MXNet能够通过在CPU上运行重量更新来提高速度,以便gpu可以用于下一批.
通过让我在一台机器上运行多个工作程序,新的分布式运行时是否会解决其中一些问题?
还有其他事情可以做吗?
我知道堆栈溢出有很多类似的问题,但是我的搜索无法找到我尚未尝试的问题的解决方案.
编辑:
我做了一些CUDA分析,看看昂贵的内核是什么.根据我的运行,21.4%的时间花在内部:
void Eigen::internal::EigenMetaKernel_NonVectorizable<Eigen::TensorEvaluator
<Eigen::TensorAssignOp<Eigen::TensorMap<Eigen::Tensor<float, int=4, int=1, long>, int=16>,
Eigen::TensorPaddingOp<Eigen::array<std::pair<int, int>,
unsigned long=4> const, Eigen::TensorMap<Eigen::Tensor<float const,
int=4, int=1, long>, int=16> const > const > const, Eigen::GpuDevice>, long>(float, int=4)
Run Code Online (Sandbox Code Playgroud)
20.0%的时间花在了
void Eigen::internal::EigenMetaKernel_NonVectorizable<Eigen::TensorEvaluator
<Eigen::TensorAssignOp<Eigen::TensorMap<Eigen::Tensor<float, int=4, int=1, long>, int=16>,
Eigen::TensorBroadcastingOp<Eigen::array<int, unsigned long=4>
const, Eigen::TensorMap<Eigen::Tensor<float const, int=4, int=1, long>,
int=16> const > const > const, Eigen::GpuDevice>, long>(float, int=4)
Run Code Online (Sandbox Code Playgroud)
关闭签名我不确定这些是做什么的.这些有意义吗?
除此之外,分析还报告了低内核并发性,0%,如预期的那样.低计算利用率34.9%(授予此项包括启动时间和火车循环中的一点python.大约32秒,总共91个.这在tensorflow内部利用率约为50%.)
编辑2:
我附上了修剪过的源代码的副本.总的来说,虽然我更关心问题1-3,并且不想花费太多的身体时间.
另外我运行的tensorflow来自:f07234db2f7b316b08f7df25417245274b63342a …
我正在使用mxnet来训练一个11级的图像分类器.我观察到一种奇怪的行为训练准确性正在缓慢增加并且上升到39%,并且在下一个时期它下降到9%然后在其余的训练中保持接近9%.我用保存的模型重新开始训练(训练精度为39%),保持所有其他参数相同.现在训练准确性再次提高.这可能是什么原因?我无法理解它.而且通过这种方式训练模型变得越来越困难,因为它需要我不断地看到训练精度值.
学习率恒定为0.01
由于Adam Optimizer保持一对平均值,如渐变的均值/方差,我想知道它应该如何正确处理重量衰减.我已经看到了两种实现它的方法.
仅根据客观损失,每个小批量明确的衰减权重更新梯度的均值/方差.(以下代码摘自https://github.com/dmlc/mxnet/blob/v0.7.0/python/mxnet/optimizer.py)
weight[:] -= lr*mean/(sqrt(variance) + self.epsilon)
wd = self._get_wd(index)
if wd > 0.:
weight[:] -= (lr * wd) * weight
Run Code Online (Sandbox Code Playgroud)根据客观损失+正则化损失更新梯度的均值/方差,并像往常一样更新权重.(以下代码摘自https://github.com/dmlc/mxnet/blob/master/src/operator/optimizer_op-inl.h#L210)
grad = scalar<DType>(param.rescale_grad) * grad +
scalar<DType>(param.wd) * weight;
// stuff
Assign(out, req[0],
weight -
scalar<DType>(param.lr) * mean /
(F<square_root>(var) + scalar<DType>(param.epsilon)));
Run Code Online (Sandbox Code Playgroud)这两种方法有时在训练结果上显示出显着差异.而我实际上认为第一个更有意义(并且发现它会不时地提供更好的结果).Caffe和旧版本的mxnet遵循第一种方法,而火炬,tensorflow和新版本的mxnet遵循第二种方法.
真的很感谢你的帮助!
我可以使用预构建的高级函数来创建模型FullyConnected.例如:
X = mx.sym.Variable('data')
P = mx.sym.FullyConnected(data = X, name = 'fc1', num_hidden = 2)
Run Code Online (Sandbox Code Playgroud)
通过这种方式,我得到一个P依赖于符号变量的符号变量X.换言之,我有可用于定义模型并执行这样的操作的计算如图表fit和predict.
现在,我想表达的P,通过X不同的方式.更详细地说,FullyConnected我不想使用高级功能(如),而是使用低级张量运算(如矩阵乘法)和表示模型参数的符号变量(湖权矩阵)来指定P和X"明确" 之间的关系..
例如为了实现与上述相同,我尝试了以下内容:
W = mx.sym.Variable('W')
B = mx.sym.Variable('B')
P = mx.sym.broadcast_plus(mx.sym.dot(X, W), B)
Run Code Online (Sandbox Code Playgroud)
但是,P这种方式获得的不等同于P之前获得的.我不能以同样的方式使用它.特别是,据我所知,MXNet抱怨W并且B没有价值观(这是有道理的).
我也曾尝试申报W,并B以另一种方式(这样它们就具有值):
w = np.array([[1.0, 2.0], [3.0, 4.0], [5.0, 6.0]])
b = np.array([7.0, 8.0])
W = mx.nd.array(w)
B …Run Code Online (Sandbox Code Playgroud) I've recently downloaded all packages from PyPI. One interesting observation was that of the Top-15 of the biggest packages, all execept one are deep learning packages:
我看了mxnet-cu90。它只有一个巨大的文件:libmxnet.so(936.7MB)。该文件包含什么内容?有什么办法可以让它变小吗?
我特别惊讶的是,这些库是如此之大,考虑到人们通常在 CUDA + cuDNN 之上使用它们,我认为这会完成繁重的工作。
作为比较,我查看了相关库,您也可以使用它们构建深度学习库:
假设我在MXNet中有一个Resnet34预备模型,我想在其中添加API中包含的预制ROIPooling层:
https://mxnet.incubator.apache.org/api/python/ndarray/ndarray.html#mxnet.ndarray.ROIPooling
如果初始化Resnet的代码如下,如何在分类器之前的Resnet功能的最后一层添加ROIPooling?
实际上,我如何在我的模型中一般使用ROIPooling功能?
如何在ROIpooling层中合并多个不同的ROI?它们应该如何存储?如何更改数据迭代器以便为ROIPooling函数提供所需的批处理索引?
让我们假设我将此与VOC 2012数据集一起用于行动识别任务
batch_size = 40
num_classes = 11
init_lr = 0.001
step_epochs = [2]
train_iter, val_iter, num_samples = get_iterators(batch_size,num_classes)
resnet34 = vision.resnet34_v2(pretrained=True, ctx=ctx)
net = vision.resnet34_v2(classes=num_classes)
class ROIPOOLING(gluon.HybridBlock):
def __init__(self):
super(ROIPOOLING, self).__init__()
def hybrid_forward(self, F, x):
#print(x)
a = mx.nd.array([[0, 0, 0, 7, 7]]).tile((40,1))
return F.ROIPooling(x, a, (2,2), 1.0)
net_cl = nn.HybridSequential(prefix='resnetv20')
with net_cl.name_scope():
for l in xrange(4):
net_cl.add(resnet34.classifier._children[l])
net_cl.add(nn.Dense(num_classes, in_units=resnet34.classifier._children[-1]._in_units))
net.classifier = net_cl
net.classifier[-1].collect_params().initialize(mx.init.Xavier(rnd_type='gaussian', factor_type="in", magnitude=2), ctx=ctx)
net.features = resnet34.features
net.features._children.append(ROIPOOLING())
net.collect_params().reset_ctx(ctx)
Run Code Online (Sandbox Code Playgroud) 我正在尝试构建一个包含13000个训练图像和3000个验证图像的11级图像分类器.我正在使用深度神经网络,正在使用mxnet进行训练.训练准确度正在提高并达到80%以上,但验证准确度达到54-57%且不会增加.这可能是什么问题?我应该增加图像的数量吗?
有谁知道我在哪里可以通过MXNet(R包)找到LSTM的例子?基本任务是通过x [1 ... t]序列预测x [t + 1]值.