京喜APP - 图片库优化 | 京东云技术团队

news2024/11/30 8:54:24

作者:京东零售 何骁

介绍

京喜APP早期开发主要是快速原生化迭代替代原有H5,提高用户体验,在这期间也积累了不少性能问题。之后我们开始进行一些性能优化相关的工作,本文主要是介绍京喜图片库相关优化策略以及关于图片相关的一些关联知识。

图片性能问题

作为电商APP,图片在各个业务场景被大量使用。我们需要做到尽可能降低网络消耗/内存消耗/硬盘消耗,同时不降低图片质量,提高图片加载速度,给用户带来更好的使用体验。基于这些性能目标,我们也通过初步性能评估梳理出了一些性能问题:

图片加载慢/流量消耗高

图片链接主要由后台接口下发,下发图片格式尺寸由每个业务后台指定。部分业务没有使用更小的图片格式比如WebP,或图片尺寸过大,都会使图片过大导致网络消耗高。特别是网络状况不佳的场景,图片加载过慢给用户带来不好的体验。同时也会导致更多的I/O读写解码耗时,造成更多的电量消耗。

图片内存占用高

经过初步的APP内存使用评估,图片内存消耗占APP总内存消耗的比例最高,特别是大尺寸图片会占用很多内存。一方面APP占用太高内存退到后台容易被系统杀死,导致下次打开重新启动影响体验。另一方面APP大量使用内存,容易被系统杀死产生OOM。特别是我们目前有大量的低端设备用户,设备内存相对比较低。

优化方向

基于上面分析出的一些性能问题,我们对图片框架进行了整体重构优化。一方面是降低图片网络传输,提高图片加载速度。另一方面是减少图片内存消耗。

图片优化.png

最小化网络传输

京东图片服务器提供了多种处理功能,例如图片格式转换,图片降质,图片缩放,图片圆角等功能。这些功能通过在图片URL中添加特定参数实现,图片服务器会根据参数设置提前将图片处理完成并保存到CDN服务器。我们可以通过添加图片处理参数,减少图片传输大小。

虽然后台可以提前进行URL预处理,下发已添加过图片参数的图片URL。但是由于对接后台业务很多,每个业务图片参数设置差异很大无法统一,而且可能会造成性能影响,例如没有使用webP图片格式,下发太大的图片尺寸。同时考虑到推动各业务后台修改成本也很高,并且前端机型多,不同机型需要使用不同的图片尺寸。另外也不方便灰度降级功能,后续功能修改也不方便。所以在客户端进行图片URL预处理是更好的方式,可以统一控制,也方便之后功能更新。

图片URL预处理

URL预处理

图片库在网络图片加载前,检测是否是京东域名的图片URL。如果域名匹配,图片框架先对图片URL进行预处理,预处理包括域名统一添加缩放参数添加webP参数添加降质参数的方式减少图片网络传输大小。

提示:因为后台返回的图片URL可能会带有一部分图片处理参数,例如https://img11.360buyimg.com/img/pingou-head/25.jpg!webp,直接追加图片参数可能会导致图片处理参数不生效,或格式错误导致加载失败。所以转换时会先将所有图片参数提前计算出来,之后一起处理,避免添加重复参数。

域名统一

目前图片服务器提供了多个图片域名可使用,例如m.360buyimg.comimg10.360buyimg.com等多个域名。m.360buyimg.com主要提供给移动端使用。但是由于对接了各种业务后台,导致接口会下发不同的域名图片。图片使用不同域名可能会导致以下问题:

  • 不利于缓存复用- 图片框架通常默认以URL字符串生成图片缓存key,不同域名导致生成不同的缓存key硬盘缓存无法复用会导致图片重复下载,内存缓存无法复用导致同样的图片占用多份内存。
  • 不利于HTTP/2连接复用- 大部分界面图片比较多,很多场景都会同时加载多张图片,特别是首屏通常会加载几十张图片。当加载多个图片时,每个域名都需要重新建立HTTPS连接,经历DNS解析/TCP连接/TLS握手过程(目前一次HTTPS请求创建过程大概耗时50-150ms)。如果利用HTTP/2链接复用就只需要创建一次HTTPS请求,之后的图片请求可以减少这部分的耗时。

所以在预处理时,如果是京东域名的图片,将图片URL域名统一替换为m.360buyimg.com

追加图片参数

图片缩放

很多业务后台返回的原始图片URLsize都比客户端实际显示的size要大。一方面导致使用更多的网络流量造成浪费。另一方面会导致占用更多内存。同时因为图片size和实际显示size不一致导致像素不对齐GPU需要做额外的插值处理,也会一定的影响渲染性能。所以我们通过添加缩放参数的方式,指定图片服务器下发更小和更匹配实际显示size的图片尺寸。

动态scale计算尺寸

因为iOS设备主要使用2x/3x的分辨率,所以业务方使用API时需要传入对应的ptsize大小,图片库内部根据设备的scale进行动态计算出真实的像素宽高。

提示:android设备因为屏幕差异比较大,更适合使用固定的scale。太多的图片尺寸不利于CDN缓存,无缓存的时候需要对图片进行相关参数处理,图片处理本身是耗时操作。

Scale降级

  • 低端机降级- 对于部分3xscale的低端设备,因为机器本身内存比较低,使用3x分辨率计算出来的图片像素宽高比较大,会造成更多的内存消耗以及解码/渲染更多的性能消耗。所以对于宽高超过一定要求的图片,降级到使用2x分辨率来计算像素宽高,减少设备性能消耗。
  • iPad降级- 因为目前APP并没有针对iPad做特定优化,所以iPad设备下默认是放大显示。这会导致在iPad下图片尺寸计算出来特别大。所以也是针对iPad图片尺寸做了特定限制,防止下发图片尺寸过大。
  • 大图片降级- 正常情况下图片宽/高不应该超过屏幕宽/高。为了防止部分业务使用过大的图片size,所以添加了一个限制,最终生成的图片像素尺寸不能超过屏幕宽/高

降质

图片服务器支持0-100的图片质量参数设置,通过降低图片质量可以减少图片大小,但是质量降低太多也会影响图片的观看体验。我们将图片质量参数设置为q70,指定图片服务器下发70%质量的图片。对于大部分业务,一方面可以大幅减少图片下载大小,同时也可以保证观看体验。通过添加图片降质参数至少可以减少30-40%的图片大小。

使用WebP

按照Google官方的数据,与PNG相比,WebP无损图像的字节数要少26%WebP有损图像比同类JPG图像字节数少25-34%。图片服务器支持转换webP格式,可以减少图片大小。针对png/jpg图片格式,添加webP参数,指定图片服务器下发webp格式。虽然webP相比png/jpg图片解码需要更长时间,但相对网络传输速度提升还是很大。

提示:由于目前图片服务器并不支持GIFwebP,GIF并没有做处理。

URL预处理缓存

添加轻量缓存,提高URL转换性能。因为URL转换本身有一定的耗时,而且单个图片URL可能会多次加载/多次转换。转换后的URL会直接保存到缓存中,下次使用可以直接返回。缓存keyURL+相关图片转换参数拼接组成。

图片API设计

图片处理参数通过options设置,默认使用q70图片质量以及webP格式。业务方在调用加载图片方法时传入,下面是iOS端的API:

imageView6.jx.setImage(url: URL(string: "https://img11.360buyimg.com/img/pingou-head/25.jpg"), 
                       placeholder: nil, options: [.imageSize(CGSize(width: 40, height: 40))])


磁盘缓存优化

图片缓存查找优化

设置图片不同的size参数会导致更多的图片下载和磁盘缓存,例如同样一张图片100px200px300px尺寸因为URL不同会下载3次,同时缓存也无法不同。由于图片库通常默认使用URL作为图片缓存key,所以我们需要针对图片缓存key查找图片进行优化改造。简单来讲,相同的图片小size的图片可以直接复用更大size的缓存,这样当存在更大尺寸图片时,可以避免图片直接下载并且复用磁盘缓存。

降低图片内存消耗

png/jpg等图片格式在显示之前都需要经过解码生成一张位图,之后根据位图创建纹理传给GPU做渲染。一张位图的内存消耗大概是像素宽x像素高x位深。通常图片使用的是RGBA,位深为32位。一张500px_500px的大概1MB内存。对于GIF图片因为本身有多帧,所以最终的内存消耗为单帧内存x帧数

我们的优化方向一方面是通过图片缩放的方式,减少图片位图的内存消耗。另一方面限制图片缓存上限避免缓存使用过高。

图片缩放

通过上面URL预处理过程让图片服务器下发更小的图片格式,已经降低了一部分内存。但是URL预处理只处理了jd域名的jpg/png图片,对于GIF京东域名外的图片没有处理,包括一部分URL转换后加载失败的图片。所以对于这部分图片,我们会在端侧做图片缩放的处理,降低内存消耗。例如一张300px_300px包含100帧的GIF图片,实际显示区域只有50px_50px,优化后总内存消耗可从30MB+内存降低到3MB

GIF动态帧率播放

之前根据线上监控数据发现,部分页面场景偶尔会配置尺寸大/帧数多GIF图片,导致内存占用极高。例如一张500x400px播放200帧的GIF图片会占用100MB+内存消耗。所以针对这种场景,我们针对GIF做了减帧播放改造。当GIF图片总内存消耗大于一定量级时(例如图片内存缓存上线的20%),将GIF播放的帧数适当减少,每一帧的播放时间增加,这样可以将内存控制在一定范围之内。

提示:这里也可以通过 GIF 图片缓存 Buffer 控制内存总量,但是会导致更频繁的解码造成更多的 CPU 消耗。

图片内存缓存上限

图片缓存的设计目的是减少图片解码消耗。图片第一次使用的时候,将图片进行解码后的位图保存在内存中,这样可以避免下次使用时避免重复解码。虽然图片内存高可以尽量避免图片重复解码,但是占用太高内存也会导致APP后台被系统杀掉或产生OOM等问题。所以我们应该将内存缓存控制在一定范围内。

例如iOS的第三方图片库SDWebImage/Kingfisher默认都使用系统库NSCache来实现内存缓存。虽然NSCache会在设备内存紧张时回收内存,但是默认并不限制可保存内存最大字节数,所以在设备内存可用的情况下内存可以一直增加。所以通过设置图片缓存上限,防止图片缓存占用太高内存。图片缓存定义了一个默认的初始值上限,之后对于3x大屏幕设备和高端设备(内存比较高),适当增加更多内存上限。

优化成果

图片优化成果

其他收益

  • 域名统一- 减少了10%+的重复图片下载和内存消耗。同时减少之前多域名图片加载时重复创建HTTPS请求的过程,减少图片加载时间。

其他策略

加载异常处理

因为少量图片通过URL预处理转换后,可能会存在图片不存在的异常场景导致加载失败。所以当发生图片加载失败时,我们还是需要加载原始图片URL。但是这里需要屏蔽一些特殊的加载错误,避免非必要的加载,例如无网络/网络超时/主动取消加载等错误。之后会将错误图片URL上报到后台,方便之后调整URL转换策略,也可以发现一部分错误的图片URL推动业务修改。同时将这部分连接加入到错误连接缓存中,避免下次重复执行预处理和重复上报。

线上配置

目前存在的一些功能,例如URL预处理/统一域名/WebP使用等功能,都添加了线上配置,方便灰度/降级。一在出现问题时可以降级某些功能,新功能上线时也可以进行灰度测试。

大图检测

需要有一个机制及时发现图片不符合规范的问题。一方面我们通过线上灰度检测的方式,当发现大图片时会进行上报,后续推动业务方进行优化。另一方面我们在日常测试阶段,会开启Debug检测工具,当检测到大图片时,通过图片翻转/高亮背景颜色的方式提醒业务开发同学进行优化。

Flutter图片库优化

目前京喜APP有10+个二级界面是基于Flutter开发,所以我们也针对Flutter图片加载做了一些优化。

对接原生图片库

因为Flutter框架自带图片库只提供内存图片缓存,并不支持硬盘缓存,所以会导致图片重复下载。所以我们通过重写ImageProvider,当加载网络图片时,通过Channel调用原生图片库,原生图片库下载图片到本地磁盘后,返回图片文件目录。之后Flutter通过文件目录加载解码图片显示。这样一方面可以利用原生图片库相关优化能力,同时也可以复用图片硬盘缓存避免重复下载。

减少内存消耗

使用Image组件时,通过设置cacheHeight/cacheWidth,将图片解码为置顶像素宽高的位图尺寸,减少内存消耗。同时因为Flutter内存消耗相对原生更高,所以在Flutter界面关闭时,通过调用imageCache方法清除图片内存消耗降低内存消耗。

GIF优化

  • 动画优化- 因为通常使用Flutter都是混合栈的机制,原生Flutter界面在页面导航中相互跳转。所以当Flutter界面存在GIF图片时,跳转到原生以后GIF动画还会一直执行。所以我们通过在Image组件内监听Flutter engine发送的生命周期通知,当Flutter界面不在栈顶时,停止GIF动画执行,减少内存和CPU消耗。
  • 减少解码次数- Flutter框架内部对GIF渲染的处理方式,在屏幕每一帧判断当前需要显示的GIF帧,之后对该GIF帧进行解码之后渲染。因为并不会把解码过的帧保存,所以会导致频繁解码导致内存波动大。经过优化,对已经解码过的帧进行保存,避免重复解码的消耗,同时避免内存的波动。

优化前内存波动很明显
优化前
优化后内存倾于平稳
优化后
提示:保存每一帧也会导致更多的内存消耗。目前APP中通常是小尺寸的GIF所以整体可控。可以考虑设置缓冲区上限来控制缓存的图片帧数避免内存过高。

后续优化方向

更优的缓存算法

  • 优先移除最大内存- iOS系统NSCache实现。通过设置最大内存数,当内存不足时优先移除最大的值。
  • LRU缓存- 优先淘汰最久未使用的图片内存。对于很多二级界面的场景,用户打开界面后并不会再次打开。但是因为这些图片缓存是最后使用,所以清除内存时也会最后移除,但是在这种场景下就不太合适。
  • 界面栈管理- 当界面关闭时将该界面的所有的图片内存移除,但是对于经常会打开的界面会导致频繁图片编解码也不太合适。

所以针对不同的业务场景使用不同的回收方式可能更加合适:

  • 对于购物车/我的订单这类界面,用户每次加载的图片基本固定,所以更适合在内存中常驻,当内存消耗过高时再回收。
  • 对于商详/搜索商品列表这类界面,通常商品列表展示的图片不一样并且用户也不会频繁进某一个特定的商详,所以更适合优先移除这部分的内存。
  • 对于部分弹窗功能,图片显示后并不会再次使用,可以考虑不添加到内存中。

使用更好的图片格式

使用更好的图片格式通常可以带来更小的图片字节大小。同时因为压缩率的提高,可以在减少大小的同时提高图片质量。

提示:使用系统支持硬解码的图片格式更有优势。硬解码就是使用GPU进行解码,相比使用CPU软解码性能更好更省电。

  • APNG/动画WebP代替GIF- 按照Google官方的说法,GIF转换为有损WebP的字节数缩小了64%,而无损WebP字节数缩小了19%。所以使用动画WebP可以减少更多的网络流量传输。APNGMozilla推出的基于PNG的动图格式并且完全支持RGBA,相比GIF可以减少20%+的图片大小。而且GIF本身只支持256色索引颜色以及1位alpha(加上透明度后,边缘会出现明显的锯齿),使用APNG/WebP也可以带来相比GIF更好的显示效果。

提示:相比GIFWebP的解码比GIF占用更多的CPU资源。有损WebP的解码时间是GIF的2.2倍,而无损WebP的解码时间是GIF的1.5倍。

  • HEIC-HEIC是基于H.265视频编码格式推出的图片格式。HEIC相比WebP可以减少20%+的图片大小,并且编解码性能更好。在系统兼容性上,Android 9.0以上的系统支持HEIC。苹果在iOS14以上系统才提供了WebP硬解码,之前的系统只能使用软解码,而HEICiOS11之后的机器上都已经支持硬解码,不过并不支持浏览器
  • AVIF-AVIF是基于AV1编码格式推出的图片格式。AVIF相比WebP可以减少30%+的图片大小。不过目前只有Android 12以上的版本支持。

提示:这里主要是以VP8编码格式的WebPVP9编码格式的WebP整体性能和HEIC差异不大。
不过这些图片格式需要图片服务器支持之后才能使用。

Flutter

虽然我们对Flutter图片库做了一些优化,但总体上还有很多优化空间。包括业界有在使用的基于纹理的图片方案。在原生侧将图片解码后,通过Flutter引擎创建纹理。之后讲图片纹理id传递给Flutter进行渲染。这样可以统一在原生侧管理图片内存缓存,优化之前Flutter原生都分别有一份内存缓存的方式。而且针对于混合栈的导航栈方式,也可以更好的进行图片内存回收。另外针对Flutter,需要提供更灵活的图片内存回收策略,避免内存消耗过高。

提示:纹理可以复用内存中的位图缓存,所以并不会导致更多的内存占用。纹理方式大概能减少30%的内存消耗相比Flutter引擎图片库,主要是一些其他对象使用导致。

优化H5图片加载

我们可以通过拦截WebView图片加载的方式,让原生图片库来下载图片之后传递图片二进制数据给WebView显示。

减少流量消耗

通过这种方式,我们可以将原生图片库URL预处理相关功能支持到H5图片,减少H5加载过程中图片流量消耗,提高图片加载速度。同时因为APP原生WebView图片缓存机制是相互独立的,所以通过统一在原生侧管理图片缓存,可以减少相同图片的重复下载。

支持更多图片格式

例如在iOS系统上,WKWebView目前只支持PNG/JPG/GIF图片格式。所以我们可以通过在原生端实现下载WebP/HEIC图片,之后对图片进行解码再传给WebView,这样就可以支持其他图片格式的显示。

提示:因为WebView不支持直接传递位图二进制数据显示,所以需要提前转换为PNG/JPG二进制数据传递。所以对于其他图片格式增加一次PNG/JPG编码过程会造成更多的性能消耗。不过对于Android系统应该可以在web内核层优化减少这块消耗。

总结

本文并没有讲底层图片加载库的具体实现,目前图片库不管是直接用第三方库还是自研图片库实现方式通常差异不大。我们更多是关注自身业务以及如何利用图片服务器能力最大化改善网络图片加载性能。所以部分策略可能不一定针对所有APP都合适,应该针对自身业务场景仔细评估优化方案。

扩展链接

  • WebP
  • 手淘图片库HEIC使用
  • 动画WebP和GIF比较
  • WebP支持
  • APNG支持
  • AVIF

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

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

相关文章

es 7.0.8 常用DSL语句进行索引crud操作(windows es7.x)

一 es7.x的核心 1.1 es的核心概念 1.ES 里的 Index 可以看做一个库(名称必须为小写),而 Types 相当于表,Documents 则相当于表的行。 2.这里 Types 的概念已经被逐渐弱化,Elasticsearch 6.X 中,一个 index 下已经只能包含一个…

postgresql数据库linux centos7 安装

简介 (百度百科) PostgreSQL是一种特性非常齐全的自由软件的对象-关系型数据库管理系统(ORDBMS),是以加州大学计算机系开发的POSTGRES,4.2版本为基础的对象关系型数据库管理系统。POSTGRES的许多领先概念只…

Linux基础学习---1、目录结构、Vim编辑器、网络配置和远程登录

1、Linux目录结构 1.1 /bin 是Binary的缩写,这个目录存放着最经常使用的命令。1.2 /sbin s是Super User的意思,这里存放的是系统管理员使用的系统管理程序。1.3 /home 存放普通用户的主目录,在Linux中每个用户都有一个自己的目录&#xff…

海睿思分享 | 浅谈智能数据治理

随着大数据和AI技术的发展,利用企业内外部海量数据进行融合、治理、分析和应用,已成为企业经营管理越来越重要的手段。如何构建企业大数据分析平台发挥数据价值正成为企业数字化转型的核心战略任务。 基于大数据平台进行数据分析的完整流程分为&#xf…

MyBatis--映射关系一对一和MyBatis--映射关系多对一 -都有基于xml和注解的教程

目录 MyBatis--映射关系一对一 映射关系-官方文档 映射关系1 对1-基本介绍 注意细节 映射方式 方式1 创建idencardv 表 创建person表 创建新的 module(mybatis-mapping), 相关配置文件可以从上一个 module 拷贝 创建IdenCard.java对应表类 创建Person.java对应表类…

Vue2相关面试题(持续更新)

前言 目前这套面试题只适合 初级前端,后面会进行深层次补充和拓展以及Vue2源代码的讲解(虽然Vue2今年开始不维护了,但是我的面试题不会止步,冲冲冲)。在面试的过程中,一定要清楚哪些该说哪些不该说&#x…

云剪辑-B端在线剪辑⼯具架构设计与演进

腾讯云音视频的云剪辑致力于让客户在自己的应用(Web、小程序)中快速集成剪辑能力,同时强大的模板能力能够极大地提升视频生产效率。我们在探索B端在线剪辑产品的过程中遇到不少挑战:如何满足快速与定制两种集成场景?如…

Linux性能监控

一、htop 安装:yum install htop -ytop是linux下常用的监控程序,htop相当于其加强版,颜色显示不同参数,且支持鼠标操作,相对于top简单和人性化!第一行与第二行,显示CPU当前的运行负载&#xff…

F407标准库之时钟系统

主要参考正点原子数据手册和源码资料等。 第19讲 STM32时钟系统精讲_哔哩哔哩_bilibili 此处记录较为重要或者较易出错的一些遗漏之处,作为补充。 一般而言,时钟越高,速度越快,但同时抗干扰能力也越差,功耗也越高&am…

java入门学习

输入 数字输入(为什么类型的数字就是sc.next类型)float sumsc.nextFloat() int xsc.nextInt(); import java.util.Scanner;public class 相加问题 {public static void main(String[] args){Scanner scnew Scanner(System.in);int xsc.nextInt();int …

AMB300系列母线槽红外测温解决方案某锂电厂房项目案例分享

安科瑞 耿敏花 一、 行业背景 近年来,在国家政策引导与技术革新驱动的双重作用下,锂电产业保持快速增长态势,产业规模持续扩大,同时新能源产业工厂锂电池生产线对于电的依赖性很高,因而对供电设备的可靠性提出…

php+vue网上培训课程直播授课学习平台

运行环境:phpstudy/wamp/xammp等 开发语言:php 后端框架:Thinkphp5 前端框架:vue.js 服务器:apache 数据库:mysql 1、优智学在线授课平台主要是针对 疫情期间高校对在线教学直播的需求,为在校师生提供高质量…

TOGAF® 基本内容—架构开发方法—E阶段:机会和解决方案

本章描述识别有效交付的交付工具(项目、项目群或项目组合)的过程 在前面阶段确定的目标体系结构。 一、目标 E阶段的目标是: 根据差距分析和候选架构生成架构路线图的初始完整版本 阶段 B、C 和 D 的路线图组件确定是否需要增量方法&#xf…

WooCommerce电商开发:高性能订单存储HPOS性能基准测试

自去年以来,我们一直致力于构建和推出 HPOS(高性能订单存储)作为一项可选功能。这改变了我们在数据库中存储订单数据的方式,从自定义帖子类型 wp_post和wp_postmeta表到专门用于存储订单数据的自定义表。我们还发布了这些表的详细…

六、Spring Cloud Alibaba-nacos配置中心

一、Nacos配置中心 前面说了三、Spring Cloud Alibaba组件nacos,主要介绍的是服务发现。该篇主要介绍配置中心的功能。 官方地址: https://github.com/alibaba/spring-cloud-alibaba/wiki/Nacos-config。 Nacos 提供用于存储配置和其他元数据的 key/val…

tomcat集群下的session共享和负载均衡(memcache实现)

环境 操作系统:windows tomcat1:Apache Tomcat/7.0.52(8085) tomcat2:Apache Tomcat/7.0.52(8086) jdk:1.8.0_251 nginx:nginx-1.20.1(8070) memc…

美颜SDK的算法分析:探究其背后的机器学习模型

美颜SDK作为常见的美颜工具,其使用的算法也备受关注。本文将从机器学习的角度,深入分析美颜SDK的算法模型与实现原理。 一、算法模型 美颜SDK主要采用的算法模型是卷积神经网络(Convolutional Neural Network,CNN)。…

网卡名称排序

udev是一种动态设备管理系统,用于在Linux系统中自动管理设备的插拔、识别、配置等操作。它的主要作用是监视系统中的设备事件,并根据设备事件动态地创建、删除或修改系统中的设备节点。 udev的工作原理是通过读取系统中的硬件信息、驱动程序和设备特征信…

AI天后,在线飙歌,人工智能AI孙燕姿模型应用实践,复刻《遥远的歌》,原唱晴子(Python3.10)

忽如一夜春风来,亚洲天后孙燕姿独特而柔美的音色再度响彻华语乐坛,只不过这一次,不是因为她出了新专辑,而是人工智能AI技术对于孙燕姿音色的完美复刻,以大江灌浪之势对华语歌坛诸多经典作品进行了翻唱,还原…

李沐论文精度系列之九:InstructGPT

文章目录 一、背景1.1 时间线1.2 ChatGPT功能展示1.3 指示学习(Instruct Learning)和提示(Prompt Learning)学习1.4 人工反馈的强化学习(RLHF) 二、摘要三、导言3.1 算法3.2 结论 四、方法和实验细节4.1 数…