超出认知的数据压缩 用1-bit数据来表示32-bit的梯度 语音识别分布式机器学习 梯度压缩 论文精读
说明
介绍1−bit1-bit1−bit论文内容。
原文链接:1-bit stochastic gradient descent and its application to data-parallel distributed training of speech DNNs | Semantic Scholar
ABS
实验证明在分布式机器学习的过程中能够通过将同步所传递的梯度进行量化(从323232位到111位),同时加上量化容错机制能够很好的加快整个训练过程。最值得注意的时,模型的收敛情况并没有收到影响。
本文将该发现与SGD,AdaGradSGD,AdaGradSGD,AdaGrad, 自动批量选择, 双缓冲区,模型并行技术相结合设计了。意料之外的是,量化甚至能让精度有一个很小的提升。
不同的模型在使用该方法后加速效果明显。
1 Introduction and Related Work
现在上下文相关的深度神经网络模型基本都是通过反向传播进行训练(常用的例如SGDSGDSGD),而上述的模型的训练是非常耗时的。
注:上下文相关的神经网络应该是指类似与解决翻译问题所用的模型。
使用分布式训练上述的模型已经取得了一定成功。(这里介绍了一部分相关工作,这里不进行赘述)
在分布式训练中,一个非常重要的问题就是带宽瓶颈的问题:即各个节点训练一定时间之后需要进行数据的发送(这不管是模型并行还是数据并行都会发生),而这个过程交换的数据量往往取决于模型的大小,而现在使用的模型一般都比较大,所以网络的带宽成为了分布式机器学习的一个瓶颈。
缓解这个方法一般有两类方法:
- 增加批量大小,这样每轮会进行的计算会增加,而参与通信的时间会相对减少;
- 减少每一次通信的数据交换量。
本文提出的方法属于第二种,同时本文更多关注的是将量化方法应用于数据并行的分布式训练中。
2 Data-Parallel Deterministically Distributed SGD Training
通常采用BPBPBP进行模型的训练,过程可以被概述为下列的两个方程:
KaTeX parse error: Undefined control sequence: \part at position 114: …^{t+N-1}\frac {\̲p̲a̲r̲t̲ ̲F_{\lambda}(o(\…
上述过程对应反向传播求导和梯度下降进行更新。
2.1 Data-Parallel Distributed SGD
上述的方程可以进行分布式计算,只需要将方程(2)(2)(2)的梯度计算部分按照节点的个数,让每个处理一部分数据,然后进行梯度的计算,计算完成后,相加即可得到某个时刻的梯度。
perfectoverlapperfect\ overlapperfect overlap:选取合适的工作节点个数能够让计算和数据交换进行最优的并行化,也就是通信资源和计算资源同时饱和。
Tcalc(K^)=Tcomm(K^)T_{calc}(\hat K)=T_{comm}(\hat K) Tcalc(K^)=Tcomm(K^)
也就是选取KKK让每轮的通信时间和计算时间相等,这样当通信完成是下一轮的计算也完成可以继续进行通信。
计算时间可以被分解成固定的计算时间和可变的计算时间两部分。固定的计算时间一般是完成一些必要的操作时间所花费的时间,而可变计算时间往往会根据模型的大小,批量大小发生改变。
Figure1Figure\ 1Figure 1展示了当节点个数下降到通信时间与计算时间相等时获得的加速。
K^\hat KK^可以通过如下公式进行计算:
K^=N/2∗Tcalcfrm+C∗Tcalcpost1ZTcommfloat−Tcalcupd\hat K = \frac {N/2*T^{frm}_{calc}+C*T^{post}_{calc}}{\frac 1 ZT^{float}_{comm}-T^{upd}_{calc}} K^=Z1Tcommfloat−TcalcupdN/2∗Tcalcfrm+C∗Tcalcpost
各参数的含义:(设模型的大小为MMM)
- NNN:批量的大小。
- TcalcfrmT^{frm}_{calc}Tcalcfrm:计算梯度所花费的时间,大约为MFLOPS\frac M {FLOPS}FLOPSM。
- CCC:一个常量,使用特殊方法处理所携带的常数。
- TcalcpostT^{post}_{calc}Tcalcpost:后续进行处理所需要的时间,例如使用AdaGrad,momentumAdaGrad, momentumAdaGrad,momentum需要花费的额外时间(需要和CCC相乘才能获取实际时间),大约为Mr\frac M rrM,rrr为内存的带宽。
- ZZZ:数据传输之前的压缩率,在本文中将323232位压缩成111位,那么Z=32Z=32Z=32。
- TcommfloatT_{comm}^{float}Tcommfloat:不压缩梯度进行通信所需要花费的时间,大约为Mb\frac M bbM,bbb为两个结点之间的网络带宽。
- TcalcupdT^{upd}_{calc}Tcalcupd:参数服务器将受到的梯度用于更新所需要的时间,大约为Mr\frac M rrM。
上面的公式的理解:
分母是实际进行通信的时间,分子计算所有NNN个数据会花费的时间,而前面的推断需要让每个结点的计算时间和通信时间相等,由于在分布式机器学习中每个结点拥有的数据量是相同的,所以分子的计算时间除以KKK就是每个结点的计算时间,让两者相等并将KKK移到方程的一边即可得到上面的公式。上面计算时间的计算出现了一个除以222,这在下一小节会解释。
2.2 Double Buffering with Half Batches
上一节的公式里面出现了除以222是因为使用了双缓冲区。整个过程将每一个批量会分成大小相等的两部分放入缓冲区中,当前一部分计算完成后,开始计算后一部分,这个时候前一部分即可进行通信,当后一部分计算完成的时候,即可进行通信,此时又可以从缓冲区读取下一个批量的前一部分,所以每次实际上只计算了整个批量的一半,所以上面会出现除以222。
2.3 Potential Faster-Than-Fixed-Cost Communication
当通信时间降到固定计算时间之下时,那么此时上面的计算公式将不再适用。此时整个系统的限制在于固定的计算时间,通信很难饱和。此时在使用双缓冲区就没有什么意义了,因为此时的通信带宽是足够的,而双缓冲区是为了缓解通信的压力。
2.4 Relation to Hogwild/ASGD
异步更新能够增加并行度,但是并没有改变基础性的东西。
3 1-Bit SGD with Error Feedback
将需要交换的数据进行压缩,将其压缩为一位的数据,这样能够减少数据的交换量,从而减少通信的瓶颈。
不过如果只是简单的将数据压缩成一位,然后任由SGDSGDSGD进行缺失数据的修正,那么这是很容易导致模型发散的。
为了防止模型的发散提出了错误反馈机制,该机制并不会将丢失的精度给丢弃掉,而是会对其进行记录下一次更新的时候需要同时考虑之前丢失的精度。
整个过程可以用下面的公式来表述:
Gquant(t)=Q(G(t)+Δ(t−N))Δ(t)=G(t)−Q−1(Gquant(t))\begin{aligned} &G^{quant}(t) = Q(G(t)+\Delta(t-N))\\ &\Delta(t)=G(t)-Q^{-1}(G^{quant}(t)) \end{aligned} Gquant(t)=Q(G(t)+Δ(t−N))Δ(t)=G(t)−Q−1(Gquant(t))
参数说明:
- GGG:本轮计算出来的梯度。
- QQQ:量化函数,具体的,如果输入大于000,则量化成111,输出小于000,则量化成000,这样就可以将原本需要用323232位表示的梯度只用111位进行表示。
- GquantG^{quant}Gquant:量化后的梯度。
- Q−1Q^{-1}Q−1:反量化函数,输入只能是000或者111,当输入是111的时候输出是111,当输入是000的时候,输出是−1-1−1。
- Δ\DeltaΔ:梯度误差。
上述的过程就是压缩之后会记录压缩误差,压缩误差在下一轮的时候继续参与压缩。
3.1 Aggregating the Gradients
本文使用的聚合算法的复杂度关于结点个数是O(1)O(1)O(1)(这里的描述有一点奇怪,但是大概的意思就是每个结点聚合的数据量为所有梯度的一部分)。
具体的过程如下:
- 如果有KKK个结点,那么每个结点会处理1K\frac 1 KK1的梯度。
- 每个结点会从其他的K−1K-1K−1个结点接收属于自己处理的梯度部分。
- 收到后结点聚合自己负责的这一部分梯度。
- 聚合完成后分发给其他所有结点。
4 System Description
根据最佳节点个数的计算公式,至少存在三种方法能够提升并行度:(也就是通过改变变量让公式的结果变大)
- 提升NNN:增加每轮处理的批量个数。
- 增加ZZZ:增加压缩度。
- 减少固定计算时间(固定计算时间减少意味着相同的计算时间中有更多的时间用于了梯度的计算)
本文的压缩算法属于第二种方法。
对于方法一本文的实验发现NNN的增加是有一个限制的,当增大的太多时,整个模型可能会发散。同时本文发现一个成熟的模型能够处理的NNN的值要大一些。
为了防止模型发散的情况,本文后面的实验会隔一定的时间增大NNN而不是一开始就将NNN设置的很大,这样能够防止模型发散或是准确率下降严重。
除了这些之外,学习率也是采用递减的方式。
最后使用了AdaGradAdaGradAdaGrad进行优化,这样模型会收敛的更快,同时这也使得批量大小能够进一步的增加。
本文的系统可以在三个不同的地方使用AdaGradAdaGradAdaGrad:
- 在本地梯度量化之前;(可能会导致不一致性,但是可能对量化有益)
- 聚合结束后的数据交换期间;(可能会与量化冲突)
- 使用动量平滑后;(可以减少内存的使用和固定计算时间但是效果不好,因为峰值被动量磨平了)
作者发现AdaGradAdaGradAdaGrad在量化后动量平滑前使用效果最好。
为了也利用方法333,本文在使用数据并行的同时,在多GPUGPUGPU上做了模型并行。
5 Experimental Results
实验的细节可以在原文中找到。
论文的实验做的都是语音识别相关的,所以并没有证明所有方面都适合该方法。
5.1 Cost Measurements
这一部分主要测量几个耗时。
TcommfloatT^{float}_{comm}Tcommfloat大约为3−10ms3-10ms3−10ms$。
Tcalcpost+Tcalcupd=18.2msT^{post}_{calc}+T^{upd}_{calc}=18.2msTcalcpost+Tcalcupd=18.2ms。
Tcalcupd≈9T^{upd}_{calc}\approx9Tcalcupd≈9。
Table1Table\ 1Table 1给出了TcalcfrmT^{frm}_{calc}Tcalcfrm与批量大小的关系。
5.2 Effect of 1-Bit Quantization
Table2Table\ 2Table 2展示了不同的模式下的三种方式的对比,可以看出1−bit1-bit1−bit的效果并没有受到太大的影响。
5.3 When to do AdaGrad?
Table3Table\ 3Table 3展示了在不同环节使用AdaGradAdaGradAdaGrad进行优化对于准确率的影响,可以看出应该在动量平衡之前使用错误率会更低,作者指出这可能是因为动量平滑减少了梯度的标准差从而导致AdaGradAdaGradAdaGrad的效果不好。
partialgradientspartial\ gradientspartial gradients代表量化前各个结点自身的梯度,aggregategradientaggregate\ gradientaggregate gradient代表量化后聚合的梯度。
5.4 Impact of MB-Size Selection and Double Buffering
这一部分讲的是选取特别大的批量的时间耗时。从Table3Table\ 3Table 3中每一栏花费的时间可以得到一些信息。
第二行的时间比第一行小主要是因为:第一行的实验选取了较大的批量大小。
第四行增加到了四个结点进行数据进行,同时每个结点进行两个GPUGPUGPU的模型并行导致整个的时间下降到8.1h8.1h8.1h.
第五行相比于第四行的下降则是因为第四行的实验每24h24h24h选择一次新的批量大小,而第五行每72h72h72h选择一次。
第六行与第五行对比可以发现在这种情况下并没有进一步带来速度的提升,不过当使用双重缓冲区了之后自动选择的批量大小将会有所下降。
第七行代表的是什么意思本人并没有看懂。
Table4Table\ 4Table 4展示了固定不同的批量大小下双重缓冲对于速度的影响。
5.5 Combination with Model Parallelism
下图展示了不同的数据并行与模型并行的速率,可以发现在显卡数量相同的情况下,只有8×28\times28×2的时候模型并行提升了速率,在大多数情况下模型并并没有提升速率,这代表着在大多数情况下模型并行没有数据并行高效,这是因为如果使用模型并行则不能很好的利用缓存机制,模型并行的时候,每交换一次数据缓冲就会失效,而如果是更多的使用数据并行,那么就会减少一定缓存失效的次数。
5.6 Training a Production-Scale Model
表格中的realignrealignrealign代表将数据进行对齐。
6 Conclusion
将通信传播的通信量从323232位降为111位,同时提出误差反馈机制保证模型的收敛。
一位的量化能够大大降低通信量从而减少通信所带来的瓶颈。
相关文章:
超出认知的数据压缩 用1-bit数据来表示32-bit的梯度 语音识别分布式机器学习 梯度压缩 论文精读
说明 介绍1−bit1-bit1−bit论文内容。 原文链接:1-bit stochastic gradient descent and its application to data-parallel distributed training of speech DNNs | Semantic Scholar ABS 实验证明在分布式机器学习的过程中能够通过将同步所传递的梯度进行量化…...
深度剖析指针(上)——“C”
各位CSDN的uu们你们好呀,今天,小雅兰的内容是指针噢,在学习C语言的过程中,指针算是一个比较重要的内容,当然,难度也是比较大的,那么现在就让小雅兰来带大家进入指针的世界吧 字符指针 数组指针…...
学习 Python 之 Pygame 开发魂斗罗(六)
学习 Python 之 Pygame 开发魂斗罗(六)继续编写魂斗罗1. 创建碰撞类2. 给地图添加碰撞体3. 让人物可以掉下去4. 实现人物向下跳跃5. 完整的代码继续编写魂斗罗 在上次的博客学习 Python 之 Pygame 开发魂斗罗(五)中,我…...
LeetCode题解:1238. 循环码排列,归纳法,详细注释
原题链接: https://leetcode.cn/problems/circular-permutation-in-binary-representation/ 前置条件: 在解题之前,请先一定要阅读89.格雷编码的题解格雷编码可以满足题目的条件“p[i] 和 p[i1] 的二进制表示形式只有一位不同”,…...
全新后门文件Nev-3.exe分析
一、 样本发现: 蜜罐 二、 内容简介: 通过公司的蜜罐告警发现一个Nev-3.exe可执行文件文件,对该样本文件进行分析发现,该可执行程序执行后会从远程服务器http://194.146.84.2:4395/下载一个名为“3”的压缩包,解压后…...
线性回归系数解释
线性回归系数解释线性回归系数1、R2R^2R2(R方,R-Square)2、Adj−R2Adj-R^2Adj−R2(调整后的 R 方)3、标准误差4、FFF 值5、FFF 显著度6、置信区间7、PPP 值线性回归系数 回归模型得到后会有多个系数,这些系…...
22.2.27打卡 Codeforces Round #852 (Div. 2) A~D
A Yet Another Promotion 题面翻译 题目描述 共 ttt 组数据,每组数据中,你需要买 nnn 公斤苹果,第一天单价为 aaa ,但每买 mmm 公斤赠送一公斤;第二天单价为 bbb 。求最小花费。 输入输出格式 第一行一个正整数 …...
如何查看Spring Boot各版本的变化
目录 1.版本 2.基础特性和使用 3.新增特性和Bug修复 1.版本 打开Spring官网,点进Spring Boot项目我们会发现在不同版本后面会跟着不同的标签: 这些标签对应不同的版本,其意思如下: GA正式版本,通常意味着该版本已…...
程序员是否要加入创业公司?
我从1月份入职到2月份离职,历时一个半月。短暂的体验了一段创业生活,更准确的说是一段“待在”创业团队的生活,因为我发现创业本身跟我关系不大。一个半月的就业经历,对任何人来说都不是一个好选择,当然也不是我所期望…...
2023软件测试工程师全新技术栈,吃透这些,起薪就是25k~
相信每个准备软件测试面试的同学,不管你是大学刚毕业,满心憧憬着进入公司实习、非计算机行业转行软件测试、自学测试就业还是培训后就业,都会面临着众多的疑问和不解,那就是该怎么走出着第一步,今天本文一次性告诉你&a…...
【ChatGPT情商大考验】ChatGPT教我谈恋爱
❤️觉得内容不错的话,欢迎点赞收藏加关注😊😊😊,后续会继续输入更多优质内容❤️👉有问题欢迎大家加关注私戳或者评论(包括但不限于NLP算法相关,linux学习相关,读研读博…...
C++类内存结构模型
内存分区 内存全局数据区,代码区,栈区,堆区。 定义一个类 类的成员函数被放在代码区 类的静态成员变量被放在全局数据区(不占用类的存储空间) 非静态成员在类的实例内,实例在栈区或者堆区 虚函数指针&…...
HTML#4超链接标签,列表标签,表格标签和布局标签
一. 超链接标签介绍<a> 定义超链接,用于连接到另一个资源herf: 指定访问资源的URLtarget: 指定打开资源的方式代码<!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><title>超链接标签</title> <…...
本科课程【数字图像处理】实验汇总
文章目录 实验1 - 腐蚀与膨胀实验2 - 图像增强实验3 - 图像的几何变换实验4 - 图像的蒙纱效果实验5 - 空洞填充实验6 - 取阈值的邻域平均算法实验7 - 图像的平移与伸缩变换实验1 - 腐蚀与膨胀 实验目的 分析掌握腐蚀与膨胀的基本原理,编写腐蚀与膨胀的算法,并掌握开闭运算的规…...
nginx安装lua、jwt模块,通过lua验证jwt实现蓝绿发布样例
文章目录前言一、基础组件下载二、组件安装1.luajit安装2.lua-nginx-module安装3.lua-resty-core安装4.lua-resty-lrucache安装5.ngx_devel_kit安装6.nginx加载lua模块7.lua-cjson安装8.lua-resty-string安装9.lua-resty-jwt安装10.lua-resty-hmac安装三、验证jwt中属性实现蓝绿…...
【redis的几种数据结构及在Java里的应用案例】
Redis是一款高性能的key-value存储系统,支持多种数据结构,包括字符串、列表、哈希表、集合和有序集合等。下面是Redis的几种数据结构及在Java中的应用案例: string 字符串(String) 字符串是Redis中最基本的数据类型,用于存储字符…...
【mybatis】 01- mybatis快速入门
数据库创建(注意:最好先创建好数据库设置utf8再进行表创建) create database mybatis; use mybatis;drop table if exists tb_user;create table tb_user(id int primary key auto_increment,username varchar(20),password varchar(20),gender char(1),addr varch…...
【C语言每日一题】杨氏矩阵(源码以及改进源码)
【C语言每日一题】—— 杨氏矩阵😎😎😎 目录 💡前言🌞: 💛杨氏矩阵题目💛 💪 解题思路的分享💪 😊题目源码的分享😊 Ǵ…...
JavaScript 面向对象【快速掌握知识点】
目录 类和对象 属性和方法 继承 多态 封装 类和对象 类是用于定义对象的模板或蓝图;它包含对象的属性和方法,我们可以使用class关键字来定义类。 class Person {constructor(name, age) {this.name name;this.age age;}sayHello() {console.log(H…...
Qt——自定义Model
众所周知,Qt提供了一套Model/View框架供开发者使用,Model用来提供数据, View则用来提供视觉层的显示。实际上这是一套遵循MVC设计模式的GUI框架,因为Qt还提供了默认的Delegate作为Controller来作为控制器。 MVC的好处这里就不多说…...
用 .NET 启动你的 DJI Ryze Tello 无人机
大疆的 DJI Ryze Tello 是入门级的无人机,不仅在 STEM 教育中有非常广泛的应用,也可以作为编程入门的首选。通过 UDP 协议调用 DJI Ryze Tello SDK 可以让 DJI Ryze Tello 无人机执行起飞,降落,转向以及不同的花式动作。本文将会通…...
sed 功能详解
介绍sedsed是一种流编辑器,它一次处理一行内容,把当前处理的行存储在临时缓冲区中(buffer),称为"模式空间",接着sed命令处理缓冲区中的内容,处理完成后,把缓冲区的内容送往屏幕&#…...
整数二分思路详解
题目描述 给定一个按照升序排列的长度为n的整数数组,以及 q 个查询。 对于每个查询,返回一个元素k的起始位置和终止位置(位置从0开始计数)。 如果数组中不存在该元素,则返回“-1 -1”。 输入格式 第一行包含整数n和q&a…...
基于java的进销库存管理系统(Vue+Springboot+Mysql)前后端分离项目,附万字课设论文
1.3 系统实现的功能 本次设计任务是要设计一个超市进销存系统,通过这个系统能够满足超市进销存系统的管理及员工的超市进销存管理功能。系统的主要功能包括:首页、个人中心、员工管理、客户管理、供应商管理、承运商管理、仓库信息管理、商品类别管理、 …...
手动添加 Grub 启动项
1. 问题背景 自己的台式机上装了好几块硬盘,因为自己又菜又喜欢折腾,几乎每块上都有一个操作系统,其中两个 m.2 的硬盘上分别装着一个 windows11 和一个 Ubuntu20.04。但在另外一块机械硬盘中还装着更早的一个 Ubuntu18.04,我电脑…...
工人搬砖-课后程序(JAVA基础案例教程-黑马程序员编著-第八章-课后作业)
【案例8-4】 工人搬砖 【案例介绍】 1.任务描述 在某个工地,需要把100块砖搬运到二楼,现在有工人张三和李四,张三每次搬运3块砖,每趟需要10分钟,李四每次搬运5块砖,每趟需要12分钟。本案例要求编写程序分…...
深度学习中backbone、head、neck等概念
1.backbone 翻译为主干网络的意思,既然说是主干网络,就代表其是网络的一部分。这个主干网络大多时候指的是提取特征的网络,其作用就是提取图片中的信息,供后面的网络使用。这些网络经常使用的是ResNet VGG等,而不是我…...
华为OD机试用Python实现 -【Linux 发行版的数量】(2023-Q1 新题)
华为OD机试题 华为OD机试300题大纲Linux 发行版的数量题目描述输入描述输出描述说明示例一输入输出说明Python 代码实现代码编写逻辑华为OD机试300题大纲 参加华为od机试,一定要注意不要完全背诵代码,需要理解之后模仿写出,通过率才会高。 华为 OD 清单查看地址:blog.csd…...
Http报文解析
http通信流程浏览器->已监听的web服务器->read->write->close http请求报文: a.请求方法: POST GET DELETE HEAD OPTIONS PUT TRACE b.请求地址: /xxx/yyy/zzz c.报文协议: HTTP/1.1 d.请求报文头: Accept Referer Accept-Language Content-Type Host Content-Len…...
Vue下载安装步骤的详细教程(亲测有效) 2 安装与创建默认项目
上篇请移步到Vue下载安装步骤的详细教程(亲测有效) 1_水w的博客-CSDN博客 上一篇博文已经对Node.js的安装与配置进行了详细介绍。 另外:文中项目存放的路径及项目名称可根据自身实际情况进行更改。 目录 三、Vue安装配置 1、搭建Vue脚手架 2、通过NPM安装Vue …...
佛山网站建站推广/网络营销推广方案3篇
题目链接:P6320 [COCI2006-2007#4] SIBICE - 洛谷 | 计算机科学教育新生态 (luogu.com.cn) 题目背景 年轻的 Mirko 把火柴扔的到处都是。他的母亲希望他将火柴放入盒子中。 题目描述 Mirko 现在要放置 n 根火柴,他有一个 wh 的矩形盒子。 他现在想请…...
好女人生活常识网站建设/windows7优化大师官方下载
文章目录参考资料1.介绍2. 泛型和子类继承3. 通配符(Wildcards)4. 泛型方法参考资料 https://www.bilibili.com/video/BV1Kb411W75N?p562 1.介绍 不使用泛型下的用法: List myIntList new ArrayList();// 1 myIntList.add(new Integer(0));// 2 Integer x (Int…...
专业网站建设搭建/广州市口碑seo推广
打印机用久了难免会出现故障,在打印过程中可能会遇到各种各样的迷惑行为,比如:打印乱码、条纹、黑点、阴影等。今天小编就来给大家说说激光打印机的迷惑行为:打印一半如何解决。原图打印一半01检查打印机 检查打印机查看是否是打印…...
手机网站微信链接怎么做的/国际新闻网
这里是修真院前端小课堂,每篇分享文从 【背景介绍】【知识剖析】【常见问题】【解决方案】【编码实战】【扩展思考】【更多讨论】【参考文献】 八个方面深度解析前端知识/技能,本篇分享的是: 【响应式的优点和缺点??…...
网站上的报名表链接是怎么做的/抖音广告怎么投放
模板介绍 本套管理好自己的健康下载PPT模板,模板编号:P87161,大小10MB,共27页,比例为16:9,由封面、目录、转场页、内容、结尾5个部分构成。 内含青色,橙色,灰色多种配色,精美风格设计,动态播放效果,精美实用。 一份设…...
用卡通人物做网站属于侵权吗/百度提交网址多久才会收录
满意答案nico402013.08.18采纳率:53% 等级:12已帮助:6620人200分是一个诱惑!-------------------------------------------------------你的问题描述有问题。回答者“tbsoo_com ”的计算这里$i-1是错误的,应该加上括…...