百度商业AI 技术创新大赛赛道二:AIGC推理性能优化TOP10之经验分享

朋友们,AIGC性能优化大赛已经结束了,看新闻很多队员已经完成了答辩和领奖环节,我根据内幕人了解到,比赛的最终代码及结果是不会分享出来的,因为办比赛的目的就是吸引最优秀的代码然后给公司节省自己开发的成本,相当于外包出去了,应该是不会公开的。抱着技术共享及开放的精神,我今天把以自己复赛排名top10的经验分享出来,希望可以给参赛的朋友提供一些有帮助的信息(个人账号:我是你的狼哥)。

首先,我把比赛的草稿版本分享出来:文本生成:AIGC推理性能优化比赛_复赛及初赛第10名经验分享 - 飞桨AI Studio

这个版本省略了很多内容,因为最原始的版本里面存在大量的临时文件、测试文件和个人代码,这个版本相当于阉割了一部分,但是我会先把具体内容给大家介绍下,这样理解起来也容易。

1、方法探索 

优化模型推理,官方已经给了一些基础建议,其实最开始大家就可以按照官方去做,就有提升,这中间我也踩了很多坑,同样分享出来。

(1)调节超参数,可行

调节超参数,是最快,最便捷的一个方法,但是要注意方式方法,如果你无厘头瞎jb调,会出现一会高一会低,你要想办法去接近极限,这个可以参考用到网格搜索,下面是项目中一个简单案例,在new/new.ipynb项目中

上面的代码可以自行完善,我有一个predict.py 文件,你可以挨个for循环,然后记录下最佳参数的推理速度,固化参数即可,原来我记得官方base的成绩,不调优大概是460s,如果仅通过这一项大概能优化到200s以上,但是你想再优化,那就非常难了,需要别的办法。

 (2)直接调用静态库,可行

调节超参数,是挺简单的,但是他有瓶颈,你再优化可就难了,这个时候,你需要去翻paddlepaddle的源码,他推理里面就带有一些优化方法,比如

官方的run_infer.py里面,如果你在model.generate最后面三行加上这个东西,你就会发现,速度突然飞起来了,大概是能优化100s左右,好快啊!

不久,你又发现一个很奇葩的问题,你加了这个use_fast=True以后,虽然快了,但是每次第一次推理的时候,都需要重新下载、编译这个模块的静态库文件,贼慢,起码40-50s,太耗时了,不过,你翻官方文件,你会发现他只有第一次推理的时候很慢,后面就直接调用编译好的那个库文件了,会非常快!那怎么办呢?好办,我们直接把编译好的库文件找到直接调用不得了,结果证明非常可行,速度提高30-50s。

有人问了,我如何找这个so库文件,其实也很简单,你第一次推理让他原来的方式推理,推理完成后,它会自动生成这个libdecoding_op.so,直接用find全局搜就找到了,其实这是一个cpp编写的推理算子,可见cpp在这方面效率远高于python,这里还埋了一个点,后面讲。 

  (3)动态图转静态图推理,不可行

我估计,90%的人第一次尝试都会想着把编码阶段的动态图推理转为静态图推理,我也这么干了,并且忙活了半天,发现一个真相,速度更慢了~,没办法,试了好几次还是不行,这条路放弃了。

 下面是转换代码

# Copyright (c) 2022 PaddlePaddle Authors. All Rights Reserved.
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
#     http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.import argparse
import os
from pprint import pprintimport paddlefrom paddlenlp.ops import FasterUNIMOText
from paddlenlp.transformers import UNIMOLMHeadModel, UNIMOTokenizer
from paddlenlp.utils.log import loggerdef parse_args():parser = argparse.ArgumentParser()parser.add_argument("--model_name_or_path",default="/home/aistudio/ad_generator/model_final",type=str,help="The model name to specify the Pegasus to use. ",)parser.add_argument("--export_output_dir", default="./inference_model", type=str, help="Path to save inference model of Pegasus. ")parser.add_argument("--topk", default=80, type=int, help="The number of candidate to procedure top_k sampling. ")parser.add_argument("--topp", default=0.8, type=float, help="The probability threshold to procedure top_p sampling. ")parser.add_argument("--max_out_len", default=128, type=int, help="Maximum output length. ")parser.add_argument("--min_out_len", default=6, type=int, help="Minimum output length. ")parser.add_argument("--num_return_sequence", default=1, type=int, help="The number of returned sequence. ")parser.add_argument("--temperature", default=0.8, type=float, help="The temperature to set. ")parser.add_argument("--num_return_sequences", default=2, type=int, help="The number of returned sequences. ")parser.add_argument("--use_fp16_decoding", action="store_true", help="Whether to use fp16 decoding to predict. ")parser.add_argument("--decoding_strategy",default="beam_search",choices=["beam_search"],type=str,help="The main strategy to decode. ",)parser.add_argument("--num_beams", default=2, type=int, help="The number of candidate to procedure beam search. ")parser.add_argument("--diversity_rate", default=0.0, type=float, help="The diversity rate to procedure beam search. ")parser.add_argument("--length_penalty",default=1.2,type=float,help="The exponential penalty to the sequence length in the beam_search strategy. ",)args = parser.parse_args()return argsdef do_predict(args):place = "gpu:0"place = paddle.set_device(place)model_name_or_path = args.model_name_or_pathmodel = UNIMOLMHeadModel.from_pretrained(model_name_or_path)tokenizer = UNIMOTokenizer.from_pretrained(model_name_or_path)unimo_text = FasterUNIMOText(model=model, use_fp16_decoding=args.use_fp16_decoding, trans_out=True)# Set evaluate modeunimo_text.eval()# Convert dygraph model to static graph modelunimo_text = paddle.jit.to_static(unimo_text,input_spec=[# input_idspaddle.static.InputSpec(shape=[None, None], dtype="int64"),# token_type_idspaddle.static.InputSpec(shape=[None, None], dtype="int64"),# attention_maskpaddle.static.InputSpec(shape=[None, 1, None, None], dtype="float32"),# seq_lenpaddle.static.InputSpec(shape=[None], dtype="int64"),args.max_out_len,args.min_out_len,args.topk,args.topp,args.num_beams,  # num_beams. Used for beam_search.args.decoding_strategy,tokenizer.cls_token_id,  # cls/bostokenizer.mask_token_id,  # mask/eostokenizer.pad_token_id,  # padargs.diversity_rate,  # diversity rate. Used for beam search.args.temperature,args.num_return_sequences,],)# Save converted static graph modelpaddle.jit.save(unimo_text, os.path.join(args.export_output_dir, "unimo_text"))logger.info("UNIMOText has been saved to {}.".format(args.export_output_dir))if __name__ == "__main__":args = parse_args()pprint(args)do_predict(args)

(4)系统参数优化,可行

还是那句话,看paddlepaddle源码,你会有很多惊喜,源码里面有系统调优的方法,主要是对显卡调优的,于是,你可以加上下面这段神代码。

于是,你又可以提高1-3s,又是个小里程碑进步。 

(5)推理代码全部改写cpp,可行但不会

在(2)的时候我埋了个点,我说后面讲,其实就是你可以把整个推理的代码也就是model.generate,全部改写为cpp,这个肯定会有大幅度提高,但是呢,我不会!我不会写cpp啊,这个只能留着自己私下尝试了,并且我问了内幕人,这个肯定可行的,私下自己试试吧,这个跟模型没关系了,是个工程的活,展开讲也没啥意思,就是个翻译过程,自己搞吧!

(6)tensorRT优化,未知

其实还有个tensorRT优化的办法,这个我试了个demo,代码里面可能有些demo尝试,效果不明显,就没往下尝试,这个效果未知,自己试试吧。

 2、整体总结

上面是我整个项目的尝试,具体细节信息各位赛友自己跑一跑我的代码才知道,里面有很多错误尝试,包括我甚至还尝试了内存共享技术、多线程技术、多进程技术和异步处理等等,都不是很理想,可能你们尝试后会有提高,这里面提升最大的还得是超参优化和so库调用。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/48461.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

怎样做好数字营销呢?

2023 年,数字营销将随着新技术、趋势和消费者行为的不断发展而不断发展。要在 2023 年在数字营销领域取得成功,请考虑以下策略: 1.内容质量和个性化: 专注于制作与目标受众产生共鸣的高质量且相关的内容。 根据用户偏好、行为和…

k8s ingress (二)

k8s ingress (二) Ingress介绍 在前面课程中已经提到,Service对集群之外暴露服务的主要方式有两种:NodePort和LoadBalancer,但是这两种方式,都有一定的缺点: NodePort方式的缺点是会占用很多集群机器的端口&#xff0…

【高危】Apache Airflow Spark Provider 任意文件读取漏洞 (CVE-2023-40272)

漏洞描述 Apache Airflow Spark Provider是Apache Airflow项目的一个插件,用于在Airflow中管理和调度Apache Spark作业。 受影响版本中,在JDBC连接时,由于没有对conn_prefix参数做验证,允许输入"?"来指定参数。攻击者…

2023 网络建设与运维 X86架构计算机操作系统安装与管理题解

任务描述: 随着信息技术的快速发展,集团计划2023年把部分业务由原有的X86架构服务器上迁移到ARM架构服务器上,同时根据目前的部分业务需求进行了部分调整和优化。 一、X86架构计算机操作系统安装与管理 1.PC1系统为ubuntu-desktop-amd64系统(已安装,语言为英文),登录用户…

Java调用高德地图API根据详细地址获取经纬度

步骤一:注册高德开发者账号并创建应用 访问高德开放平台https://lbs.amap.com/ 登录后,在控制台中创建一个应用,获取生成的应用key。这个key将用于访问高德地图API。 步骤二:使用Java发送HTTP请求获取经纬度 您可以使用Java…

kafka-python 消费者消费不到消息

排除步骤1: 使用group_id”consumer_group_id_001“ 和 auto_offset_reset"earliest" from kafka import KafkaConsumerconsumer KafkaConsumer(bootstrap_servers["dev-kafka01.test.xxx.cloud:9092"],enable_auto_commitTrue, auto_commit…

什么是雨量气象站?

过多的强降水会造成重大自然灾害,给我们的生活带来很大影响,实时监测降雨信息,能够及时发布气象预警,防范可能因强降水引起的山洪、泥石流等自然灾害,保护人民群众生命财产安全,提高防灾减灾能力。 雨量气…

Python搭建http文件服务器实现手机电脑文件传输功能

第一种代码的界面如下:(有缺点,中文乱码) # !/usr/bin/env python3 # -*- coding:utf-8 _*-"""Simple HTTP Server With Upload. python -V3.6 This module builds on http.server by implementing the standard G…

华为星闪,一项将 “ 更稳 WiFi ” 和 “ 更好蓝牙 ” 融合起来的通信标准

兼顾多用途和专业化的 AI 大模型、移除安卓代码的 HarmonyOS NEXT 、给折叠屏应用提供适配方向的《 折叠屏/平板应用体验评估标准 》。。。 不过除了这些比较贴近我们普通用户,容易讲清楚的东西,华为还官宣了一个大家可能没注意的黑科技: 星…

TCP性能机制

延迟应答 为什么有延迟应答 发送方如果长时间没有收到ACK应答,则会触发超时重传机制,重新发送数据包。但如果接收数据的主机立刻返回ACK应答, 这时候返回的窗口可能比较小,发送方一次只能发少量数据,效率较低。 举个例子理解一…

【深度学习-图像识别】使用fastai对Caltech101数据集进行图像多分类(50行以内的代码就可达到很高准确率)

文章目录 前言fastai介绍数据集介绍 一、环境准备二、数据集处理1.数据目录结构2.导入依赖项2.读入数据3.模型构建3.1 寻找合适的学习率3.2 模型调优 4.模型保存与应用 总结人工智能-图像识别 系列文章目录 前言 fastai介绍 fastai 是一个深度学习库,它为从业人员…

Spring Boot实践八--用户管理系统

一,技术介绍 技术选型功能说明springboot是一种基于 Spring 框架的快速开发应用程序的框架,它的主要作用是简化 Spring 应用程序的配置和开发,同时提供一系列开箱即用的功能和组件,如内置服务器、数据访问、安全、监控等&#xf…

[oneAPI] 基于BERT预训练模型的SWAG问答任务

[oneAPI] 基于BERT预训练模型的SWAG问答任务 基于Intel DevCloud for oneAPI下的Intel Optimization for PyTorch基于BERT预训练模型的SWAG问答任务数据集下载和描述数据集构建问答选择模型训练 结果参考资料 比赛:https://marketing.csdn.net/p/f3e44fbfe46c465f4d…

方案:AI边缘计算智慧工地解决方案

一、方案背景 在工程项目管理中,工程施工现场涉及面广,多种元素交叉,状况较为复杂,如人员出入、机械运行、物料运输等。特别是传统的现场管理模式依赖于管理人员的现场巡查。当发现安全风险时,需要提前报告&#xff0…

合宙Air724UG LuatOS-Air LVGL API--对象

对象 概念 在 LVGL 中,用户界面的基本构建块是对象。例如,按钮,标签,图像,列表,图表或文本区域。 属性 基本属性 所有对象类型都共享一些基本属性: Position (位置) Size (尺寸) Parent (父母…

linux 免交互

Linux 免交互 1、免交互概念2、基本免交互的例子2.1命令行免交互统计2.2使用脚本免交互统计2.3使用免交互命令打印2.4免交互修改密码2.5重定向查看2.6重定向到指定文件2.7重定向直接指定文件2.8使用脚本完成重定向输入2.9免交互脚本完成赋值变量2.10关闭变量替换功能&#xff0…

云计算在IT领域的发展和应用

文章目录 云计算的发展历程云计算的核心概念云计算在IT领域的应用1. 基础设施即服务(IaaS):2. 平台即服务(PaaS):3. 软件即服务(SaaS): 云计算的拓展应用结论 &#x1f3…

如何进行在线pdf转ppt?在线pdf转ppt的方法

在当今数字化时代,PDF文件的广泛应用为我们的工作和学习带来了巨大的便利。然而,有时候我们可能需要将PDF转换为PPT文件,以便更好地展示和分享内容。在线PDF转PPT工具因其操作简便、高效而备受欢迎。如何进行在线pdf转ppt呢?接下来&#xff…

fatal: not a git repository (or any of the parent directories): .git

提示说没有.git这样一个目录 在命令行 输入 git init 然后回车就好了 git remote add origin https:/.git git push -u origin "master"

《Java极简设计模式》第04章:建造者模式(Builder)

作者:冰河 星球:http://m6z.cn/6aeFbs 博客:https://binghe.gitcode.host 文章汇总:https://binghe.gitcode.host/md/all/all.html 源码地址:https://github.com/binghe001/java-simple-design-patterns/tree/master/j…