参考:https://developer.nvidia.com/blog/accelerating-ai-training-with-tf32-tensor-cores/
在深度学习中,范围比精度更重要。
FP64
双精度
FP32
单精度
TF32
用于A100架构TensorCore,指数范围i与FP32相同,尾数范围与FP16相同。兼容FP32和FP16,只需截断就可相互转换。先截断为TF32计算再转为FP32对历史工作无影响,且无需更改代码即可使用。
小于 1 分钟
参考:https://developer.nvidia.com/blog/accelerating-ai-training-with-tf32-tensor-cores/
在深度学习中,范围比精度更重要。
双精度
单精度
用于A100架构TensorCore,指数范围i与FP32相同,尾数范围与FP16相同。兼容FP32和FP16,只需截断就可相互转换。先截断为TF32计算再转为FP32对历史工作无影响,且无需更改代码即可使用。
论文配套代码:https://github.com/bgshih/crnn/tree/master
pytorch复现代码:https://github.com/meijieru/crnn.pytorch
loss 不收敛
欠拟合
特征:训练集上loss始终和初始大小相当,accuracy很低
网络拟合能力不足
网络配置问题
权重初始化是否合理
初始化方式 | 备注 |
---|---|
全零初始化 Zeros | 造成网络对称,所有神经元进行相同参数更新 |
全1初始化 Ones | 造成网络对称,所有神经元进行相同参数更新 |
初始化为固定值value Constant | 造成网络对称,所有神经元进行相同参数更新 |
随机正态分布初始化 RandomNormal | |
随机均匀分布初始化 RandomUniform | |
截尾高斯分布初始化 TruncatedNormal | |
VarianceScaling | |
用随机正交矩阵初始化Orthogonal | |
使用单位矩阵初始化 Identiy | |
LeCun均匀分布初始化方法 lecun_uniform | |
LeCun正态分布初始化方法 lecun_normal | |
Glorot正态分布初始化方法 glorot_normal | |
Glorot均匀分布初始化 glorot_uniform | 一种均值为0,以0为中心的对称区间均匀分布的随机数;接近于0的均匀分布会导致梯度消失 |
He正态分布初始化 he_normal | |
He均匀分布初始化 he_uniform |
使用适当的激活函数
激活函数 | 备注 |
---|---|
ReLU | 一般用于卷积层、全连接层 |
tanh | 一般用于循环层 |
softmax | 一般用于全连接层做输出层 |
sigmoid | 不常用 |
使用适当的优化器和学习率
未进行归一化导致尺度不平衡,误差增大
人工构造少量数据反复训练,看是否下降。若不下降,则可能脚本有问题,若下降,则超参可能有问题
梯度检查
loss 为nan,inf
optimizer.zero_grad
loss 为负
各类评估指标整理汇总,影响因素,提升方法
基本概念
名称 | 内容 | 备注 |
---|---|---|
NVLink | 节点内device连接方式之一 | |
PCIe | 高速串行计算机扩展总线标准 | 节点内device连接方式之一 |
Infinit Band (IB) | 节点间device连接方式(多机) | |
ASIC | 专用集成电路 | |
FPGA | 现场可编辑门阵列 | |
SHArP | 软硬结合的通信协议,实现在了NVIDIA Quantum HDR Switch的ASIC里 | 把聚合计算(reduce)从节点卸载到网络(交换机)中进行,相比tree和ring算法收发数据量大幅减少参考:https://www.zhihu.com/question/63219175/answer/206697974 |
性能指标
名称 | 内容 | 备注 |
---|---|---|
Size(Bytes) | 数据大小 | |
Description | 测试描述(数据量*字节数) | |
Duration | 耗时 | |
Throughput(Gbps, fps, ...) | 吞吐,每秒处理的图片/samples/文本/...数 | 一般用iter e2e时间来计算:$thoughput = \frac{n_{card}*batchsize}{e2e_time}$ |
BusBW(Gbps) | 带宽 | |
扩展率 | 网络训练效率与卡数关系的衡量指标 | $扩展率=\frac{throghput_{n card}}{n*throughput_{1card}}*100%=\frac{e2e_time_{1card}}{e2e_time_{ncard}}*100%$ |
性能测试