深度学习模型,通常,都很复杂,参数很多,数据量也很大,所以,训练和推理,都很慢,有时候,训练一个模型,要几天,甚至几周,推理的时候,响应时间,也很长,满足不了,业务的需求,所以,性能优化,是深度学习,非常重要的一环。

我们团队,做深度学习项目,也遇到了,很多性能问题,训练慢,推理慢,成本高,后来,我们做了,一系列的优化,从,几天训练完,到,几个小时,从,推理几百毫秒,到,几十毫秒,效果,提升很明显,也积累了,一些经验。

今天,就来分享一下,深度学习神经网络性能优化的实战经验,从慢到快,希望,能给大家一些参考。

一、为什么要做性能优化

先说说,为什么,要做性能优化。

1. 缩短训练时间,提高迭代效率: 深度学习模型,训练,通常,都很慢,特别是,大数据集,大模型,可能,要几天,甚至几周,才能训练完,这么长的时间,迭代效率,很低,调一个参数,要等几天,才能看到结果,很影响,开发效率。

通过性能优化,能大大缩短,训练时间,比如,从几天,缩短到,几个小时,这样,迭代效率,就高很多,能更快地,调参,优化模型,提高,模型的效果。

2. 降低推理延迟,满足业务需求: 很多,深度学习应用,对推理延迟,要求很高,比如,图像识别,语音识别,推荐系统,等等,要求,几十毫秒,甚至,几毫秒,就要返回结果,如果,推理太慢,几百毫秒,甚至几秒,就满足不了,业务的需求,用户体验,也很差。

通过性能优化,能大大降低,推理延迟,比如,从几百毫秒,降低到,几十毫秒,甚至,几毫秒,满足,业务的需求,提高,用户体验。

3. 提高吞吐量,降低成本: 深度学习,不管是训练,还是推理,都很耗资源,GPU,很贵,云服务的GPU,更贵,如果,性能不好,就需要,更多的GPU,更高的成本。

通过性能优化,能提高,吞吐量,同样的GPU,能处理,更多的请求,训练,更快,这样,就能,减少GPU的数量,降低成本。

4. 支持更大的模型和数据: 性能优化之后,就能,支持,更大的模型,更多的数据,比如,原来,只能,训练,小模型,小数据集,优化之后,就能,训练,大模型,大数据集,模型的效果,也会,更好。

所以,性能优化,还是,很有必要的,不管是,从效率,成本,还是,效果的角度,都值得,去做。

二、性能优化的思路

在讲,具体的优化方法之前,先说说,性能优化的思路,也就是,怎么,去做性能优化。

1. 先测量,再优化: 性能优化,第一步,不是,直接优化,而是,测量,找到,瓶颈在哪里,是,数据加载慢?还是,训练慢?还是,推理慢?是,CPU瓶颈?还是,GPU瓶颈?还是,内存瓶颈?还是,网络瓶颈?

只有,找到了,瓶颈,才能,针对性地优化,不然,就是,盲目优化,可能,花了很多时间,优化了,不是瓶颈的地方,效果,不大。

所以,性能优化,第一步,就是,测量,用工具,比如,TensorFlow的Timeline,nvprof,nvidia-smi,等等,找到,瓶颈在哪里。

2. 从易到难,从大到小: 性能优化,要,从易到难,从大到小,先做,简单的,效果大的优化,再做,复杂的,效果小的优化,这样,能用,最少的时间,获得,最大的提升。

比如,先优化,数据加载,批量大小,学习率,这些,简单的,效果大的,再做,模型量化,剪枝,分布式训练,这些,复杂的。

3. 综合优化,多个层面: 性能优化,是一个,系统工程,不是,只优化,一个地方,就行,需要,从数据、模型、代码、硬件,多个层面,综合优化,才能,达到最好的效果。

比如,数据层面,优化,数据加载,预处理;模型层面,优化,模型结构,批量大小,学习率;代码层面,优化,代码效率,用,更高效的API;硬件层面,用,更好的GPU,分布式训练,等等。

4. 不断迭代,持续优化: 性能优化,不是,一次,就能完成的,需要,不断迭代,持续优化,优化了,一个地方,再测量,再找瓶颈,再优化,直到,达到,满意的效果。

而且,随着,模型,数据,硬件的变化,瓶颈,也会,变化,所以,性能优化,是一个,持续的过程。

三、训练优化

首先,说说,训练的优化,训练,是深度学习,最耗时的环节,优化训练,能大大提高,开发效率。

1. 数据预处理和加载优化

数据加载,经常,是,训练的瓶颈,特别是,大数据集,复杂的预处理,如果,数据加载慢,GPU,就会,等数据,利用率,很低,训练,就慢。

优化方法:

  • 提前预处理: 把,数据预处理,比如,图片resize,归一化,等等,提前,做好,保存成,二进制文件,比如,TFRecord,LMDB,HDF5,等等,训练的时候,直接读取,不用,每次,都做预处理,这样,能大大提高,数据加载的速度。
  • 用高效的数据格式: 用,TFRecord,LMDB,HDF5,这些,高效的二进制格式,比,直接读图片,文本,快很多,因为,这些格式,是,为,快速读取,设计的,支持,随机读取,批量读取,等等。
  • 多线程数据加载: 用,多线程,或者,多进程,加载数据,比如,TensorFlow的tf.data,numparallelcalls参数,设置,多线程,并行加载数据,这样,数据加载,和,GPU训练,能,并行执行,GPU,不用,等数据。
  • 预取数据: 用,tf.data的prefetch,预取数据,也就是,GPU,训练当前batch的时候,CPU,提前,加载下一个batch,这样,GPU,训练完当前batch,就能,立刻,拿到下一个batch,不用,等数据。
  • 缓存数据: 如果,数据集,不大,能,放进内存,就用,tf.data的cache,把数据,缓存到内存里,这样,第二个epoch开始,就能,直接从内存读数据,不用,再从磁盘读,速度,快很多。
  • 数据增强,用GPU做: 如果,数据增强,很复杂,比如,图片的,随机裁剪,翻转,颜色抖动,等等,可以,把,数据增强,放到GPU上做,用,TensorFlow的操作,或者,专门的库,比如,DALI,这样,能减轻CPU的负担,提高,数据加载的速度。

2. 批量大小(Batch Size)优化

批量大小,对训练速度,影响很大,批量太小,GPU利用率低,训练慢;批量太大,可能,内存不够,或者,模型效果,不好。

优化方法:

  • 尽量用大的批量大小: 在,GPU内存,允许的情况下,尽量用,大的批量大小,这样,GPU的利用率,更高,训练,更快,因为,大的批量,GPU,能,并行计算,更多的数据,效率,更高。
  • 梯度累积: 如果,GPU内存,不够,用不了,大的批量,可以用,梯度累积,也就是,多个小批量,累积梯度,然后,再更新参数,这样,效果,和,大的批量,差不多,但是,不需要,那么大的内存。
  • 学习率,跟着批量大小调整: 批量大小,变了,学习率,也要,跟着调整,一般,批量大小,扩大n倍,学习率,也,扩大n倍,或者,用,线性缩放规则,这样,模型的效果,才不会,受影响。

3. 学习率和优化器优化

学习率和优化器,对训练的收敛速度,影响很大,合适的学习率和优化器,能让模型,收敛更快,训练,更少的epoch,就能,达到,好的效果。

优化方法:

  • 用合适的优化器: 不同的优化器,收敛速度,不一样,一般,Adam,Adagrad,RMSProp,这些,自适应学习率的优化器,收敛,比,普通的SGD,快,但是,最终的效果,可能,SGD+动量,更好,所以,可以,先用Adam,快速收敛,再用,SGD+动量,微调,这样,既能,快速收敛,又能,达到,好的效果。
  • 学习率调度: 用,学习率调度,比如,学习率衰减,余弦退火,warmup,等等,这样,能让模型,收敛更快,效果更好,比如,一开始,用,大的学习率,快速下降,后来,用,小的学习率,精细调整,这样,收敛更快,效果更好。
  • 梯度裁剪: 用,梯度裁剪,防止,梯度爆炸,特别是,RNN,LSTM,这些,循环神经网络,很容易,梯度爆炸,用,梯度裁剪,能让训练,更稳定,收敛更快。
  • 提前停止: 用,提前停止,也就是,验证集的效果,连续,几个epoch,没有提升,就,停止训练,这样,能避免,过拟合,也能,节省,训练时间,不用,训练,不必要的epoch。

4. 模型和算法优化

模型本身,对训练速度,影响也很大,合适的模型结构,能让训练,更快,效果,更好。

优化方法:

  • 用合适的模型结构: 不要,盲目用,大模型,复杂的模型,根据,任务的难度,选择,合适的模型结构,简单的任务,用,小模型,就够了,训练,更快,效果,也不会,差。
  • 用,更高效的层: 用,更高效的层,比如,用,深度可分离卷积,代替,普通卷积,计算量,小很多,训练,更快,用,GRU,代替,LSTM,计算量,小一些,训练,更快。
  • 正则化,不要过度: 正则化,比如,Dropout,L2正则,能防止过拟合,但是,也会,减慢训练,所以,不要,过度正则化,根据,实际情况,用,合适的正则化,不要,为了,防止过拟合,加,太多的正则化,影响,训练速度。
  • 批归一化(Batch Normalization): 用,批归一化,能让训练,更稳定,收敛更快,因为,批归一化,能,规范化,每层的输入,减少,内部协变量偏移,这样,能用,更大的学习率,收敛更快。

5. 混合精度训练(Mixed Precision Training)

混合精度训练,就是,用,半精度(FP16),和,单精度(FP32),混合,训练模型,大部分的计算,用FP16,少量的,用FP32,这样,能,大大提高,训练速度,减少,内存占用,而且,模型的效果,基本,不受影响。

原理: FP16,只有,16位,比FP32的32位,小一半,所以,计算,更快,内存占用,更小,GPU,对FP16的计算,也有,专门的优化,比如,NVIDIA的Tensor Core,计算FP16,比FP32,快很多。

但是,FP16的精度,比FP32低,可能,会有,精度损失,所以,用,混合精度,大部分计算,用FP16,但是,权重,梯度,损失,这些,重要的,用FP32,或者,用,损失缩放,防止,梯度下溢,这样,既能,提高速度,又能,保证,精度。

使用方法: TensorFlow里,用混合精度训练,很简单,设置一下,就行:

# 启用混合精度训练
tf.keras.mixed_precision.set_global_policy('mixed_float16')

或者,用,TensorFlow的,AMP(Automatic Mixed Precision),自动,混合精度训练。

混合精度训练,通常,能提高,30%-50%的训练速度,减少,一半的内存占用,效果,基本,和FP32,一样,非常推荐,大家,都用起来。

6. 分布式训练和多GPU训练

如果,有多个GPU,或者,多台机器,可以用,分布式训练,把,训练任务,分到,多个GPU,多台机器,并行执行,这样,能大大提高,训练速度。

分布式训练的方式:

  • 数据并行(Data Parallelism): 把,数据,分成,多份,每个GPU,处理,一份数据,计算,梯度,然后,同步,梯度,更新,模型,这是,最常用的,分布式训练方式,适合,数据量大的情况。
  • 模型并行(Model Parallelism): 把,模型,分成,多份,每个GPU,处理,模型的一部分,适合,模型太大,一个GPU,放不下的情况。

TensorFlow的分布式训练: TensorFlow里,用分布式训练,很简单,用,tf.distribute.Strategy,就行:

# 多GPU训练
strategy = tf.distribute.MirroredStrategy()
with strategy.scope():
    model = create_model()
    model.compile(...)
model.fit(...)

这样,就能,自动,用,多个GPU,并行训练,很方便。

分布式训练,通常,能,接近,线性扩展,比如,4个GPU,训练速度,接近,单GPU的4倍,当然,会有,一些,通信开销,所以,实际,可能,是3倍多,但是,提升,还是,很明显的。

7. 检查点和恢复

训练,大模型,大数据集,可能,要,很长时间,这时候,一定要,用,检查点,定期,保存,模型的参数,这样,如果,训练,中途,断了,比如,机器重启,程序崩溃,就能,从,检查点,恢复,不用,从头开始,节省,很多时间。

使用方法: TensorFlow里,用,ModelCheckpoint回调,定期,保存模型:

checkpoint = tf.keras.callbacks.ModelCheckpoint(
    'model_{epoch:02d}.h5',
    save_weights_only=True,
    save_freq='epoch'
)
model.fit(..., callbacks=[checkpoint])

这样,每个epoch,都会,保存,模型的参数,训练断了,就能,加载,最近的检查点,继续训练。

建议,不仅,保存,模型参数,还要,保存,优化器的状态,学习率,epoch,等等,这样,恢复的时候,能,完全,恢复,训练的状态,不会,影响,模型的效果。

四、推理优化

训练完了,模型,要上线,推理,推理的性能,也很重要,特别是,线上服务,对延迟和吞吐量,要求很高。

1. 模型量化(Quantization)

模型量化,就是,把,模型的参数,从,FP32,变成,INT8,或者,FP16,这样,模型,更小,推理,更快,内存占用,更小,而且,精度,损失,很小。

原理: INT8,只有,8位,比FP32的32位,小4倍,所以,模型,更小,计算,更快,GPU,对INT8的计算,也有,专门的优化,推理速度,能提高,2-4倍。

当然,INT8的精度,比FP32低,所以,需要,用,校准数据,校准,量化的参数,尽量,减少,精度损失,一般,量化后,精度,只会,下降,1%以内,大部分场景,都能接受。

使用方法: TensorFlow里,用,TensorFlow Lite,或者,TensorRT,就能,量化模型:

# TensorFlow Lite量化
converter = tf.lite.TFLiteConverter.from_saved_model(saved_model_dir)
converter.optimizations = [tf.lite.Optimize.DEFAULT]
tflite_model = converter.convert()

这样,就能,生成,量化后的模型,更小,推理更快。

模型量化,通常,能提高,2-4倍的推理速度,模型大小,减少,3/4,精度损失,很小,非常推荐,线上推理,都用起来。

2. 模型剪枝(Pruning)

模型剪枝,就是,把,模型里,不重要的,参数,或者,神经元,去掉,减少,模型的参数,和,计算量,这样,模型,更小,推理,更快,而且,精度,损失,很小。

原理: 神经网络里,很多参数,其实,是,冗余的,不重要的,去掉它们,对模型的精度,影响,很小,但是,能,大大减少,计算量,和,参数数量。

模型剪枝,有,很多种,比如,权重剪枝,神经元剪枝,通道剪枝,等等,通道剪枝,是,最实用的,因为,剪完之后,模型,还是,稠密的,不需要,特殊的,推理框架,就能,加速。

使用方法: TensorFlow里,用,TensorFlow Model Optimization Toolkit,就能,剪枝模型:

import tensorflow_model_optimization as tfmot

prune_low_magnitude = tfmot.sparsity.keras.prune_low_magnitude
model = prune_low_magnitude(model, **pruning_params)
model.compile(...)
model.fit(..., callbacks=[tfmot.sparsity.keras.UpdatePruningStep()])

这样,就能,在训练的过程中,剪枝模型,减少,参数。

模型剪枝,通常,能减少,30%-70%的参数,推理速度,也能,提高,不少,精度损失,很小,适合,模型大,需要,压缩的场景。

3. 知识蒸馏(Knowledge Distillation)

知识蒸馏,就是,用,一个,大的,复杂的模型(教师模型),来,指导,一个,小的,简单的模型(学生模型),训练,这样,学生模型,能,学到,教师模型的知识,效果,接近,教师模型,但是,模型,更小,推理,更快。

原理: 教师模型,效果好,但是,大,慢,学生模型,小,快,但是,效果,可能,差一些,知识蒸馏,让,学生模型,不仅,学习,真实的标签,还学习,教师模型的输出(软标签),这样,学生模型,能,学到,教师模型的,泛化能力,效果,接近,教师模型。

使用方法: 知识蒸馏,实现起来,也不复杂,定义,教师模型,和,学生模型,然后,训练学生模型的时候,损失函数,包含,两部分,一部分,是,和真实标签的损失,一部分,是,和教师模型输出的损失,这样,就能,蒸馏。

知识蒸馏,通常,能让,小模型,效果,接近,大模型,但是,推理速度,快很多,适合,线上推理,需要,小模型,快速度的场景。

4. 模型融合(Model Ensemble)

模型融合,就是,训练,多个模型,然后,把,它们的输出,融合起来,这样,效果,会比,单个模型,更好,但是,推理的时候,要,跑多个模型,会慢一些。

但是,如果,用,知识蒸馏,把,融合后的模型,蒸馏到,一个小模型,就能,既有,融合的效果,又有,小模型的速度。

模型融合,通常,能提高,1%-5%的精度,适合,对精度要求高的场景。

5. 用高效的推理框架

推理框架,对推理速度,影响很大,用,高效的推理框架,能,大大提高,推理速度。

常用的推理框架:

  • TensorRT: NVIDIA推出的,高性能推理框架,支持,量化,剪枝,算子融合,等等,推理速度,非常快,比,原生的TensorFlow,快,2-10倍,非常推荐,NVIDIA GPU,用TensorRT推理。
  • ONNX Runtime: 微软推出的,跨平台推理框架,支持,ONNX格式的模型,优化,也很好,速度,很快,跨平台,支持,CPU,GPU,等等。
  • TensorFlow Lite: Google推出的,轻量级推理框架,主要,用于,移动端,嵌入式设备,支持,量化,模型很小,推理很快。
  • OpenVINO: Intel推出的,推理框架,主要,用于,Intel的CPU,GPU,VPU,等等,优化,很好,速度,很快。

用,这些,专门的推理框架,比,用,原生的,训练框架,推理,快很多,因为,它们,做了,很多,推理相关的优化,比如,算子融合,内存优化,量化,等等。

6. 批处理和缓存

线上推理,还可以,用,批处理,和,缓存,提高,吞吐量,降低,延迟。

批处理: 把,多个请求,攒成,一个batch,一起推理,这样,GPU的利用率,更高,吞吐量,更大,当然,会增加,一些,延迟,因为,要攒请求,所以,要,根据,业务的需求,平衡,吞吐量,和,延迟,设置,合适的,最大等待时间,和,最大批量大小。

缓存: 对于,重复的请求,或者,热点请求,可以,缓存,推理结果,这样,下次,同样的请求,直接,返回缓存的结果,不用,再推理,大大降低,延迟,提高,吞吐量。

比如,推荐系统,热门商品的推荐结果,可以,缓存一段时间,不用,每次都推理。

7. GPU优化

推理,通常,用GPU,GPU的优化,也很重要。

优化方法:

  • 用,合适的GPU: 根据,业务的需求,选择,合适的GPU,比如,推理,用,T4,A10,就够了,不需要,用,A100,这样,成本,更低,性价比,更高。
  • GPU共享: 如果,模型不大,一个GPU,能跑,多个模型,或者,多个实例,可以,用,GPU共享,提高,GPU的利用率,降低,成本。
  • CUDA优化: 用,最新的CUDA版本,和,cuDNN版本,通常,新版本,会有,性能优化,推理,更快。
  • GPU内存优化: 优化,GPU内存的使用,避免,内存碎片,用,更高效的,内存分配,这样,能,跑,更大的batch,或者,更多的实例。

五、代码优化

除了,模型和算法,代码本身,也有,很多,可以优化的地方。

1. 用,向量化的操作: 深度学习,尽量用,向量化的操作,不要,用,循环,因为,向量化的操作,能,利用,GPU的并行计算,快很多,而,循环,是,串行的,很慢。

比如,不要,用,for循环,遍历,每个样本,处理,而是,用,TensorFlow的操作,批量处理,所有样本,这样,快很多。

2. 用,更高效的API: TensorFlow里,不同的API,性能,不一样,尽量用,更高效的API,比如,用,tf.data,做数据加载,比,用,placeholder,feed_dict,快很多,用,tf.function,把,Python函数,编译成,TensorFlow的图,执行,更快。

3. 避免,不必要的操作: 代码里,不要有,不必要的操作,比如,不必要的,类型转换,形状变换,数据拷贝,等等,这些,都会,浪费时间,尽量,减少,这些操作。

4. 用,多线程,多进程: CPU的操作,比如,数据加载,预处理,可以,用,多线程,多进程,并行执行,提高,CPU的利用率,避免,CPU,成为瓶颈。

5. 内存优化: 优化,内存的使用,避免,内存泄漏,及时,释放,不需要的内存,用,更高效的,数据结构,这样,能,减少,内存占用,避免,因为,内存不够,导致,速度慢,或者,OOM。

六、硬件优化

最后,硬件,也很重要,合适的硬件,能,大大提高,性能。

1. 用,更好的GPU: 深度学习,主要,靠GPU,更好的GPU,训练和推理,都更快,比如,A100,比,V100,快很多,V100,比,T4,快很多,根据,需求和预算,选择,合适的GPU。

2. 用,SSD,不用,机械硬盘: 数据加载,磁盘的速度,很重要,用,SSD,比,机械硬盘,快很多,特别是,大数据集,随机读取,差距,很大,所以,尽量,用,SSD,存数据。

3. 足够的内存: 内存,要足够,特别是,大数据集,大模型,需要,很多内存,如果,内存不够,就会,用,swap,速度,很慢,所以,要,配置,足够的内存。

4. 高速网络: 分布式训练,多机训练,网络的速度,很重要,用,高速网络,比如,InfiniBand,或者,万兆以太网,能,减少,通信开销,提高,分布式训练的效率。

七、踩过的坑

最后,分享一下,我们,踩过的坑,希望,大家,不要,再踩。

坑1:盲目优化,不测量: 一开始,我们,优化性能,不测量,凭感觉,觉得,哪里慢,就优化哪里,结果,花了很多时间,优化了,不是瓶颈的地方,效果,不大,后来,我们,先测量,找到瓶颈,再优化,效率,高很多。

经验: 性能优化,一定要,先测量,找到瓶颈,再针对性地优化,不要,盲目优化。

坑2:只优化训练,不优化推理: 一开始,我们,只关注,训练的优化,训练,很快,但是,推理,很慢,上线后,满足不了,业务的需求,后来,我们,才重视,推理的优化,用,量化,TensorRT,等等,推理,才快起来。

经验: 训练和推理,都要,优化,特别是,线上服务,推理的性能,更重要。

坑3:优化后,精度下降太多: 有一次,我们,用量化,剪枝,优化模型,推理,确实,快了很多,但是,精度,下降了,很多,上线后,效果,不好,只能,回滚,后来,我们,用,校准数据,微调,才把,精度,提上来。

经验: 性能优化,不能,只看速度,还要,关注,精度,优化后,要,充分测试,确保,精度,满足,业务需求,再上线。

坑4:分布式训练,通信开销大: 一开始,我们,用,多机分布式训练,但是,网络,不好,通信开销,很大,结果,4台机器,还不如,1台机器,快,后来,我们,优化了,网络,用,高速网络,并且,调整,批量大小,减少,通信次数,分布式训练,才快起来。

经验: 分布式训练,网络,很重要,要用,高速网络,并且,调整,参数,减少,通信开销,不然,可能,还不如,单机训练。

坑5:混合精度训练,梯度下溢: 一开始,我们,用混合精度训练,没有,用,损失缩放,结果,梯度,下溢,变成0,模型,不收敛,后来,我们,加了,损失缩放,模型,才,正常收敛。

经验: 混合精度训练,一定要,用,损失缩放,防止,梯度下溢,不然,模型,可能,不收敛,或者,收敛很慢。

八、经验总结和最佳实践

最后,总结一下,深度学习性能优化的,经验和最佳实践。

1. 先测量,再优化,找到瓶颈: 性能优化,第一步,就是,测量,找到瓶颈,再针对性地优化,不要,盲目优化。

2. 从易到难,从大到小: 先做,简单的,效果大的优化,比如,数据加载,批量大小,混合精度,再做,复杂的,比如,分布式训练,量化,剪枝,等等。

3. 训练和推理,都要优化: 不要,只优化训练,不优化推理,线上服务,推理的性能,更重要,要,都优化。

4. 性能和精度,平衡: 性能优化,不能,只看速度,还要,关注,精度,要,在,性能和精度之间,找到平衡,确保,精度,满足,业务需求。

5. 综合优化,多个层面: 性能优化,是一个,系统工程,要,从数据、模型、代码、硬件,多个层面,综合优化,才能,达到最好的效果。

6. 不断迭代,持续优化: 性能优化,不是,一次,就能完成的,要,不断迭代,持续优化,直到,达到,满意的效果。

7. 善用工具,提高效率: 用,好的工具,比如,TensorRT,ONNX Runtime,TensorFlow Model Optimization Toolkit,等等,能,大大提高,优化的效率,不用,自己,从零开始,写优化代码。

写在最后

深度学习神经网络性能优化实战:从慢到快。

深度学习性能优化,是一个,系统工程,需要,从数据、模型、代码、硬件,多个层面,综合优化,才能,达到最好的效果,掌握,这些优化技巧,能让你的模型,训练更快,推理更快,成本更低,效果更好。

本文,分享了,训练优化(数据预处理、批量大小、学习率、混合精度、分布式训练、检查点)、推理优化(量化、剪枝、知识蒸馏、推理框架、批处理、缓存)、代码优化、硬件优化,以及,踩过的坑,经验总结,希望,能给大家一些参考。

当然,性能优化,没有,最好,只有,更好,随着,技术的发展,新的,优化方法,和工具,会,不断出现,我们,也要,不断学习,不断优化,让模型,越来越快,越来越好。

最后,用一句话结尾:

"性能优化,不是,一蹴而就的,而是,一个,不断测量,不断优化,不断迭代的过程,只要,找对方法,持续优化,就能,让模型,从慢到快,越来越好。"

祝大家,都能,优化出,又快又好的,深度学习模型,工作顺利,项目成功!