




个人介绍
我是程序员客栈的yohannxu,一名计算机视觉算法工程师; 我毕业于武汉理工大学,担任过武汉唯理科技有限公司和共达地创新技术(深圳)有限公司的算法工程师; 负责过多个模型量化和模型部署项目的开发; 熟悉NVIDIA芯片、RK1808芯片、RK3588芯片上的模型量化和部署流程; 如果我能帮上您的忙,请点击“立即预约”或“发布需求”!
工作经历
2020-11-18 -2023-07-24共达地创新技术(深圳)有限公司算法工程师
1. 参与了公司内部yolov5 nas项目的开发 2. 主导了公司内部yolov5在NVIDIA、RK1808、RK3588、寒武纪MLU220、海思3559、君正t40芯片上的模型量化和部署。 3. 主导了公司内部ddrnet分割模型在NVIDIA、RK1808、RK3588芯片上的模型量化和部署。 4. 主导了公司内部yolox-pose关键点检测模型在NVIDIA、RK1808、RK3588、寒武纪MLU220芯片上的模型量化和部署。 5. 主导了公司内部OCR模型在NVIDIA、RK1808芯片上的模型量化和部署。
2018-07-01 -2019-10-31武汉唯理科技有限公司算法工程师
负责公司内部数据筛选和标注、模型选型和模型训练,做过有路面裂缝检查、道路异常检测、OCR识别等项目。
教育经历
2016-09-01 - 2018-06-30武汉理工大学电子科学与技术硕士
2012-09-01 - 2016-06-30武汉理工大学通信工程本科
技能

1. 使用 pytorch fx 模块对 llama2-7b 模型进行 trace,对模型中的 Linear 算子、Add 算子、Mul 算子、Matmul 算子和 Concat 算子添加量化模块。 2. 对 Linear 算子的权重和全部激活值均采用 per-tensor 对称量化,模型的输出质量大幅下降,检查发现 llama2-7b 模型的部分激活值存在离群异常值,对这些异常值进行量化后会全部截断,从而导致模型性能下降。 3. 异常值出现在第 2 个 TransformerBlock 的 FeedForward 模块的 Linear 算子的输出中,会影响后续所有的 RMSNorm 算子和 Add 算子的输入。 4. 将这些异常值保留为 fp16,不进行 int8 量化,使用这种混合精度量化方案后,模型的性能下降得到缓解,能够生成正常的语句。 5. 使用 CUDA 实现了浮点推理和混合精度推理,算子使用相同的逻辑实现,混合精度推理中的量化算子的输入权重、输入激活值和输出激活值均为 int8 类型,混合精度算子的部分输入和输出为int8 类型,其他输入和输出为 fp16 类型,最大程度上降低需要传输的数据量。 6. 混合精度推理的速度是浮点推理的 10 倍 ~ 12 倍。


1. 在 NVIDIA 芯片上,对 Conv 算子的权重使用 per-channel 对称量化,对激活值使用 per-tensor 对称量化。对所有的 Conv 算子进行 int8 量化后,mAP 掉点情况比较严重,将输出层中预测 Box 和 Keypoint 的 Conv 算子使用 fp32 计算,其他的 Conv 算子进行 int8 量化,mAP 的掉点情况从 5 个点降低到 1 个点以内。将量化感知训练后的模型导出为 onnx,量化参数存储在 QuantizeLinear 和 DequantizeLinear算子中,使用 TensorRT 进行转换和推理。 2. 在瑞芯微 rk1808 芯片上,对 Conv 算子的权重和激活值均使用 per-tensor 非对称量化。将量化感知训练后的模型导出为 onnx,将 Conv 算子、BN 算子和 ReLU 算子进行融合,融合后的新算子为 QConv 算子,将量化参数存储在该算子中;将 Conv 算子和 BN 算子的权重进行合并,得到QConv 算子的 weight 和 bias,并将 weight 计算为 uint8 格式,bias 计算为 int16 格式;将 Add 算子替换为 QAdd 算子,将量化参数存储在该算子中。使用 rknn-toolkit 进行模型转换和推理。 3. 在瑞芯微 rk1808 芯片上,对所有的 Conv 算子进行 int8 量化后,mAP 掉点情况仍然比较严重,这是由于 rk1808 对权重使用的是 per-tensor 量化,而 NVIDIA 使用 per-channel 量化;由于瑞芯微rk1808 的浮点算力有限,每有一个 Conv 算子使用 fp32 进行计算时,推理耗时增长会比较多,因此需要尽量控制使用 fp32 计算的 Conv 算子数量;对于高分辨率的输出层,对预测 Box 和 Keypoint的 Conv 算子进行 fp32 计算,对于低分辨率的输出层,除了对预测 Box 和 Keypoint 的 Conv 算子进行 fp32 计算,还要对 Head 部分的最后一个 Conv 算子进行 fp32 计算,通过使用这种混合精度量化方案,mAP 的掉点情况能够保持在 1 个点以内,并且推理耗时增长不会增加很多。


1. 对 yolov5 进行算子替换,使用 Conv 算子替换 Focus 算子,使用 ReLU 算子替换 SiLU 算子,提高 硬件利用率。 2. 对 yolov5 进行算子优化,调整 BottleneckCSP 模块中 Conv 算子、Concat 算子、BN 算子和 ReLU 算子的顺序,进行算子融合,提高推理速度。 3. 在 NVIDIA 芯片上,对 Conv 算子的权重使用 per-channel 对称量化,对激活值使用 per-tensor 对称 量化。将量化感知训练后的模型导出为 onnx,量化参数存储在 QuantizeLinear 和 DequantizeLinear 算子中,使用 TensorRT 进行转换和推理。 4. 在瑞芯微 rk1808 芯片上,对 Conv 算子的权重和激活值均使用 per-tensor 非对称量化。将量化感 知训练后的模型导出为 onnx,将 Conv 算子、BN 算子和 ReLU 算子进行融合,融合后的新算子 为 QConv 算子,将量化参数存储在该算子中;将 Conv 算子和 BN 算子的权重进行合并,得到 QConv 算子的 weight 和 bias,并将 weight 计算为 uint8 格式,bias 计算为 int16 格式;将 Add 算子 替换为 QAdd 算子,将量化参数存储在该算子中;将 kernel size 为 13 的 MaxPool 算子分解为 3 个 kernel size 为 5 的 MaxPool 算子,将 kernel size 为 9 的 MaxPool 算子分解为 2 个 kernel size 为 5 的 MaxPool 算子,加快推理速度;使用 rknn-toolkit 进行模型转换和推理。 5. yolov5 检测模型在 NVIDIA、瑞芯微 rk1808芯片上进行 int8 量化部署后,mAP 掉点情况均在 1 个点以内。
