七六启网

mysql大量数据插入慢的问题,batch和batchsize

admin

本文目录一览

增加Batch_Size的优点

适当的增加Batch_Size的优点:

1.通过并行化提高内存利用率。

2.单次epoch的迭代次数减少,提高运行速度。(单次epoch=(全部训练样本/batchsize)/iteration=1)

3.适当的增加Batch_Size,梯度下降方向准确度增加,训练震动的幅度减小。

对于正常数据集,如果Batch_Size过小,训练数据就会非常难收敛,从而导致underfitting。

增大Batch_Size,相对处理速度加快。

增大Batch_Size,所需内存容量增加(epoch的次数需要增加以达到最好的结果)

这里我们发现上面两个矛盾的问题,因为当epoch增加以后同样也会导致耗时增加从而速度下降。因此我们需要寻找最好的Batch_Size。

再次重申:Batch_Size的正确选择是为了在内存效率和内存容量之间寻找最佳平衡。

iteration:中文翻译为迭代。

迭代是重复反馈的动作,神经网络中我们希望通过迭代进行多次的训练以达到所需的目标或结果。

每一次迭代得到的结果都会被作为下一次迭代的初始值。

一个迭代=一个正向通过+一个反向通过。

epoch:中文翻译为时期。

一个时期=所有训练样本的一个正向传递和一个反向传递。

深度学习中经常看到epoch、iteration和batchsize,下面按照自己的理解说说这三个区别:

(1)batchsize:批大小。在深度学习中,一般采用SGD训练,即每次训练在训练集中取batchsize个样本训练;

(2)iteration:1个iteration等于使用batchsize个样本训练一次;

(3)epoch:1个epoch等于使用训练集中的全部样本训练一次;

举个例子,训练集有1000个样本,batchsize=10,那么:

训练完整个样本集需要:

100次iteration,1次epoch。

mysql大量数据插入慢的问题

这个是需要做一些设置的。主要设置 rewriteBatchedStatements参数。原理如下:

MySQL Jdbc驱动在默认情况下会无视executeBatch()语句,把我们期望批量执行的一组sql语句拆散,一条一条地发给MySQL数据库,直接造成较低的性能。

只有把rewriteBatchedStatements参数置为true, 驱动才会帮你批量执行SQL (jdbc:mysql://ip:port/db?rewriteBatchedStatements=true)。不过,驱动具体是怎么样批量执行的? 你是不是需要看一下内幕,才敢放心地使用这个选项? 下文会给出答案。

另外,有人说rewriteBatchedStatements只对INSERT有效,有人说它对UPDATE/DELETE也有效。为此我做了一些实验(详见下文),结论是: 这个选项对INSERT/UPDATE/DELETE都有效,只不过对INSERT它为会预先重排一下SQL语句。

注:本文使用的mysql驱动版本是5.1.12

实验记录:未打开rewriteBatchedStatements时

未打开rewriteBatchedStatements时,根据wireshark嗅探出的mysql报文可以看出,
batchDelete(10条记录) = 发送10次delete 请求
batchUpdate(10条记录) = 发送10次update 请求
batchInsert(10条记录) = 发送10次insert 请求

也就是说,batchXXX()的确不起作用

实验记录:打开了rewriteBatchedStatements后

打开rewriteBatchedStatements后,根据wireshark嗅探出的mysql报文可以看出

batchDelete(10条记录) = 发送一次请求,内容为”delete from t where id = 1; delete from t where id = 2; delete from t where id = 3; ….”
batchUpdate(10条记录) = 发送一次请求,内容为”update t set … where id = 1; update t set … where id = 2; update t set … where id = 3 …”
batchInsert(10条记录) = 发送一次请求,内容为”insert into t (…) values (…) , (…), (…)”

对delete和update,驱动所做的事就是把多条sql语句累积起来再一次性发出去;而对于insert,驱动则会把多条sql语句重写成一条风格很酷的sql语句,然后再发出去。 文档说,这种insert写法可以提高性能(”This is considerably faster (many times faster in some cases) than using separate single-row INSERT statements”)

一个注意事项

需要注意的是,即使rewriteBatchedStatements=true, batchDelete()和batchUpdate()也不一定会走批量: 当batchSize = 3时,驱动会宁愿一条一条地执行SQL。所以,如果你想验证rewriteBatchedStatements在你的系统里是否已经生效,记得要使用较大的batch.

更多细节看这个帖子:
blog.yemou.net/article/query/info/tytfjhfascvhzxcyt397

Communication-Efficient Learning of Deep Networks from Decentralized Data

mysql大量数据插入慢的问题,batch和batchsize-第1张-游戏相关-七六启网

之前被论文里的 FedSGD 和 FedAvg (两个都是非常重要的算法)搞混,现在对他们总结一下。

FederatedSGD (or FedSGD)是指只有一个batch(a single batch)和Epoch数为1的算法。
令 B 和 E 分别对应与本地客户(lcoal client)的Batch-Size和Epoch数,那么FedSGD对应于 B=∞ 和 E=1 。
直观理解:传统的SGD算法可以看成是梯度更新速度最快的优化算法,因为每一个sample就更新一次梯度了,这里也是一样,FedSGD是应用FL时梯度或模型更新速度最快的算法,它只要求每个local client计算一次平均梯度就可以上传到central server进行加权平均了,所以它需要的 computation power 是最少的(the lowest)。这也是论文把他当做基线(baseline)的原因。

由此可知,只要 B≠∞ 和 E≠1 ,那么此时的算法就叫做 FedAvg 。而 FedAvg(FederatedAveraging ) 算法是指local client先在本地计算多次梯度并且更新权值,这时的计算成本是提升的。

或者说,该等式使得从原先的 上传梯度值( ) 模式变成了 上传模型( ) 模式了。

这就引出了上图的下半部分,即每个local client可以先在本地多次迭代更新模型 ,然后再上传到server上执行averaging step
即当我们使用 FedAvg 算法时,假设在 时刻,每个local client的模型为 (注意如果不加右上角的 则代表 时刻的全局模型),则在 Epoch=E , Batchsize=B 时,local client k的模型更新为
意思是模型 在将模型上传到server前本地更新了 次。
接着有 和 。
最后将在 时刻的全局模型 赋值给每个local client作为 时刻的新模型

有意思的是 ,可以把 FedAvg 算法看成是I/O过程中的缓冲机制(Buffer),与其一点一点往上传,还不如收集多一点再网上传,这样可以有效减小I/O次数。

sqlserver sqlbulkcopy.batchsize设置多少合适

C#:用SqlBulkCopy来实现批量插入数据 VB也应会有这个类SqlBulkCopy?

SqlBulkCopy是.net2.0的新特性,平时用的很少,但是其功能却是非常强大,对于批量插入数据性能非常优越

代码

///?summary
????///?bulk插入
????///?/summary
????private?void?BulkInsert()
????{
????????SqlConnection?sqlcon?=?new?SqlConnection("Data?Source=LocalHost;Integrated?Security=SSPI;Initial?Catalog=xiaotest;");
?????????DateTime?beginTime?=?DateTime.Now;
???????
????????DataTable?dt?=?new?DataTable();
????????dt.Columns.Add("n",?typeof(string));
????????dt.Columns.Add("name",?typeof(string));
????????for?(int?i?=?1;?i??1000;?i++)
????????{
????????????DataRow?r?=?dt.NewRow();
????????????r["n"]?=?i;
????????????r["name"]?=?"xiao";
????????????dt.Rows.Add(r);
????????}
???????
????????sqlcon.Open();
????????using?(SqlBulkCopy?bulk?=?new?SqlBulkCopy("Data?Source=LocalHost;Integrated?Security=SSPI;Initial?Catalog=xiaotest;"))
????????{
????????????bulk.BatchSize?=?1000;
????????????bulk.DestinationTableName?=?"test2";
????????????bulk.ColumnMappings.Add("n",?"n");
????????????bulk.ColumnMappings.Add("name",?"name");
????????????bulk.WriteToServer(dt);
????????}
????????
????????DateTime?endTime?=?DateTime.Now;
????????TimeSpan?useTime?=?endTime?-?beginTime;
????????dt.Dispose();
????????time?=?"使用时间"?+?useTime.TotalSeconds.ToString()?+?"秒";
????????sqlcon.Close();
????????sqlcon.Dispose();
?}

神经网络中epoch与iteration相等吗

神经网络中epoch与iteration是不相等的

batchsize:中文翻译为批大小(批尺寸)。在深度学习中,一般采用SGD训练,即每次训练在训练集中取batchsize个样本训练;


iteration:中文翻译为迭代,1个iteration等于使用batchsize个样本训练一次;一个迭代 = 一个正向通过+一个反向通过


epoch:迭代次数,1个epoch等于使用训练集中的全部样本训练一次;一个epoch = 所有训练样本的一个正向传递和一个反向传递


举个例子,训练集有1000个样本,batchsize=10,那么:训练完整个样本集需要:100次iteration,1次epoch。

扩展资料

神经网络工作原理

人工神经网络首先要以一定的学习准则进行学习,然后才能工作。现以人工神经网络对于写“A”、“B”两个字母的识别为例进行说明,规定当“A”输入网络时,应该输出“1”,而当输入为“B”时,输出为“0”。

所以网络学习的准则应该是:如果网络作出错误的判决,则通过网络的学习,应使得网络减少下次犯同样错误的可能性。首先,给网络的各连接权值赋予(0,1)区间内的随机值,将“A”所对应的图象模式输入给网络。

网络将输入模式加权求和、与门限比较、再进行非线性运算,得到网络的输出。在此情况下,网络输出为“1”和“0”的概率各为50%,也就是说是完全随机的。这时如果输出为“1”(结果正确),则使连接权值增大,以便使网络再次遇到“A”模式输入时,仍然能作出正确的判断。

普通计算机的功能取决于程序中给出的知识和能力。显然,对于智能活动要通过总结编制程序将十分困难。

人工神经网络也具有初步的自适应与自组织能力。在学习或训练过程中改变突触权重值,以适应周围环境的要求。同一网络因学习方式及内容不同可具有不同的功能。人工神经网络是一个具有学习能力的系统,可以发展知识,以致超过设计者原有的知识水平。

通常,它的学习训练方式可分为两种,一种是有监督或称有导师的学习,这时利用给定的样本标准进行分类或模仿;另一种是无监督学习或称无为导师学习,这时,只规定学习方式或某些规则,则具体的学习内容随系统所处环境 (即输入信号情况)而异,系统可以自动发现环境特征和规律性,具有更近似人脑的功能。

神经网络就像是一个爱学习的孩子,您教她的知识她是不会忘记而且会学以致用的。我们把学习集(Learning Set)中的每个输入加到神经网络中,并告诉神经网络输出应该是什么分类。在全部学习集都运行完成之后,神经网络就根据这些例子总结出她自己的想法,到底她是怎么归纳的就是一个黑盒了。

之后我们就可以把测试集(Testing Set)中的测试例子用神经网络来分别作测试,如果测试通过(比如80%或90%的正确率),那么神经网络就构建成功了。我们之后就可以用这个神经网络来判断事务的分类了。

神经网络是通过对人脑的基本单元——神经元的建模和联接,探索模拟人脑神经系统功能的模型,并研制一种具有学习、联想、记忆和模式识别等智能信息处理功能的人工系统。神经网络的一个重要特性是它能够从环境中学习,并把学习的结果分布存储于网络的突触连接中。

神经网络的学习是一个过程,在其所处环境的激励下,相继给网络输入一些样本模式,并按照一定的规则(学习算法)调整网络各层的权值矩阵,待网络各层权值都收敛到一定值,学习过程结束。然后我们就可以用生成的神经网络来对真实数据做分类。

参考资料:百度百科——神经网络

TensorRT 调用onnx后的批量处理(上)

pytorch经onnx转tensorrt初体验 上 、 下 中学习了tensorrt如何调用onnx模型,但其中遇到的问题是tensorrt7没有办法直接输入动态batchsize的数据,当batchsize1时只有第一个sample的结果是正确的,而其后的samples的输出都为0. 本文主要是探索如何进行批量化的处理。

这是 TensorRT/samples/sampleDynamicReshape/sampleDynamicReshape.cpp 中给出的一个解决方案,其主要思路是在原有的INetwork 之前再创建一个用于input resize的Network, 该Network的主要功能是对可变的输入进行resize,以及设置配置文件和参数绑定。

其中,最主要的部分如下:

其中配置器 profile 指定了输入的最小尺寸、最优尺寸和最大尺寸。那么真实输入时,处在最小和最大尺寸中都行。

参考: # TensorRT 7 ONNX models with variable batch size

测试 trtexec -h 发现

再次 trtexec -h 即正确显示帮助信息。其中给出了 model options、build options、 inference options和system options等。
a. 从固定尺寸的onnx转cudaEngine
···
trtexec --explicitBatch --onnx=./resnet18.onnx --saveEngine=resnet18.engine
···
b.从可变尺寸的onnx转cudaEngine,需要指定profile。

c. 接下来看一下python API的调用

主函数:

下表给出的是V100上resnet18的前向推断时间(ms)

总结一下,dynamic batchsize的处理流程:

标签: #mysql大量数据插入慢的问题#batch和batchsize