百度商业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.rhkb.cn/news/106287.html

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

相关文章

Java“牵手”天猫店铺所有商品API接口数据,通过店铺ID获取整店商品详情数据,天猫API申请指南

天猫商城是一个网上购物平台,售卖各类商品,包括服装、鞋类、家居用品、美妆产品、电子产品等。天猫商品详情可以帮助消费者更好的了解宝贝信息,从而做出购买决策。同时,消费者也可以通过商品详情了解其他买家对宝贝的评价&#xf…

工具--录屏软件

记录下录屏软件 ScreenToGif 官网 :https://www.screentogif.com/downloads 我下载的是 Installer 版本。 录屏,默认输出为 gif 。录制的 gif 清晰,且容量低。需要录gif的话主推! 录制后输出为 mp4 的话提示要下载 FFmpeg &a…

【python】Leetcode(primer-pointer)

文章目录 26. 删除有序数组中的重复项(快慢指针)88. 合并两个有序数组(双指针)167. 两数之和 II - 输入有序数组(双指针) 更多 leetcode 题解可参考:【Programming】 26. 删除有序数组中的重复项…

0基础入门代码审计-2 Fortify初探

0x01 序言 目前又加入一位新童鞋了,最近将会再加入cs相关的专栏,都是以基础为主,毕竟太复杂的东西,能看懂的人太少。 0x02 准备工具 1、Fortify 2、需要审计的源码 0x03 Fortify的简单使用 1、 1、在开始菜单栏中找到Audit Wo…

盛最多水的容器——力扣11

int maxArea(vector<int>& height) {int l=0, r=height.size()

leetcode503. 下一个更大元素 II 单调栈

思路&#xff1a; 与之前 739、1475 单调栈的问题如出一辙&#xff0c;唯一不同的地方就是对于遍历完之后。栈中元素的处理&#xff0c;之前的栈中元素因无法找到符合条件的值&#xff0c;直接加入vector中。而这里需要再重头遍历一下数组&#xff0c;找是否有符合条件的&…

element-ui table中使用type=‘selection‘ 实现禁用,勾选,默认选中不可修改 三种状态显示问题

element-ui table中使用type‘selection’ 实现禁用&#xff0c;勾选&#xff0c;默认选中不可修改 三种状态显示问题 实现效果 需求 1.status‘CheckOk 时 勾选框默认选中但不可修改勾选状态 2.status‘CheckFail 时 勾选框禁用 3.status‘ 时 勾选框可以勾选 实现思路 采…

SwiftUI 中限制任意视图为指定的屏幕旋转方向

功能需求 在 SwiftUI 开发中,我们有时需要限制 App 中某些视图为特定的屏幕旋转方向,而另一些视图不做限制(或做其它限制),这可以做到吗? 如上图所示:我们成功的限制了 SwiftUI 中不同视图对应于不同的屏幕旋转方向(Interface Orientations)。 在本篇博文中,您将学到…

Spring Cloud 2022.x版本使用gateway和nacos实现动态路由和负载均衡

文章目录 1、nacos下载安装1.1、启动服务器1.2、关闭服务器1.3、服务注册&发现和配置管理接口 2、代码示例2.1、app1工程代码2.2、app2工程代码2.3、gateway网关工程代码 3、动态配置网关路由3.1、配置动态路由3.2、配置为负载模式 4、gateway配置规则4.1、请求转发&#x…

JAVAEE免费工程师教程之springboot综合案例

day04_springboot综合案例 用户管理 查询用户 查询所有用户执行流程 编写UserMapper接口 public interface UserMapper {// 查询所有用户List<UserInfo> findAllUsers(); }编写UserService public interface UserService extends UserDetailsService {/*** 查询所有…

C语言入门 Day_10 判断的进阶

目录 前言 1.多重判断 2.代码块 3.条件运算符 3.易错点 4.思维导图 前言 if和else能够处理两种不同的情况&#xff0c;如果&#xff08;if&#xff09;满足条件&#xff0c;我们就执行这几行代码&#xff1b;否则&#xff08;else&#xff09;的话&#xff0c;我们就执行…

LEADTOOLS V22 for Python -Crack

LEAD Technologies Inc 是面向所有主要平台和编程语言的应用程序开发的人工智能 SDK 的领先提供商&#xff0c;很高兴地宣布在其最新的 LEADTOOLS 版本 22 更新中添加了完整的 Python 支持。 Python是一种动态的高级编程语言&#xff0c;广泛应用于科学计算、数据分析、人工智…

element 下拉组件获取对象

// 选择数据user:[{name:"小白",id:1,money:"100",love:"蛋糕"},{name:"小黑",id:2,money:"200",love:"奶茶"},{name:"小红",id:3,money:"300",love:"烧烤"},] <div><el…

激活函数总结(十九):激活函数补充(ISRU、ISRLU)

激活函数总结&#xff08;十九&#xff09;&#xff1a;激活函数补充 1 引言2 激活函数2.1 Inverse Square Root Unit &#xff08;ISRU&#xff09;激活函数2.2 Inverse Square Root Linear Unit (ISRLU)激活函数 3. 总结 1 引言 在前面的文章中已经介绍了介绍了一系列激活函…

Python科研数据可视化

在过去的20 年中&#xff0c;随着社会产生数据的大量增加&#xff0c;对数据的理解、解释与决策的需求也随之增加。而固定不变是人类本身&#xff0c;所以我们的大脑必须学会理解这些日益增加的数据信息。所谓“一图胜千言”&#xff0c;对于数量、规模与复杂性不断增加的数据&…

基础论文学习(5)——MAE

MAE&#xff1a;Masked Autoencoders Are Scalable Vision Learners Self-Supervised Learning step1&#xff1a;先用无标签数据集&#xff0c;把参数从一张白纸训练到初步预训练模型&#xff0c;可以得到数据的 Visual Representationstep2&#xff1a;再从初步成型&#x…

Linux(Ubuntu)安装docker

2017年的3月1号之后&#xff0c;Docker 的版本命名开始发生变化&#xff0c;同时将 CE 版本和 EE 版本进行分开。 Docker社区版&#xff08;CE&#xff09;&#xff1a;为了开发人员或小团队创建基于容器的应用,与团队成员分享和自动化的开发管道。docker-ce 提供了简单的安装…

行式存储与列式存储

1.概述 数据处理大致可分为两大类&#xff0c;联机事务处理OLTP(on-line transaction processing) 和联机分析处理OLAP(on-line analytical processing)。 OLTP是传统关系型数据库的主要应用&#xff0c;用来执行一些基本的、日常的事务处理&#xff0c;比如数据库记录的增、删…

Vue2-快速搭建pc端后台管理系统

一.推荐二次开发框架 vue-element-admin Star(84k)vue-antd-admin Star(3.5k) 二.vue-element-admin 官网链接:https://panjiachen.github.io/vue-element-admin-site/zh/ 我这里搭建的是基础模版vue-admin-template(推荐) # 克隆项目 git clone https://github.com/PanJi…

html-dom核心内容--四要素

1、结构 HTML DOM (文档对象模型) 当网页被加载时&#xff0c;浏览器会创建页面的文档对象模型&#xff08;Document Object Model&#xff09;。 2、核心关注的内容&#xff1a;“元素”&#xff0c;“属性”&#xff0c;“修改样式”&#xff0c;“事件反应”。>四要素…