写点什么

解密美图云端图片美化技术

  • 2020-02-20
  • 本文字数:3226 字

    阅读完需:约 11 分钟

解密美图云端图片美化技术

导语:本文将结合美图公司现状为大家分享了在大规模的场景及其需要支撑全球用户的场景下,美图如何运用面向未来的云端流程处理系统,从根本上解决处理时长、可用性和成本等问题。

云端图片美化技术架构


美图绘画机器人“Andy”的成果


上面是美图绘画机器人“Andy”根据照片绘制的图片,Andy 是美图云端图像处理的核心技术之一。

本地图片处理的局限

一部分图片处理从本地迁移到云端是必然的路径。以往美图秀秀的图片处理功能大多在设备端,但随着时间推移遇到很多问题:


1、研发链条长。算法研发出来后需要为设备适配、测试、更新版本,速度较慢。


2、客户端体积膨胀。每加一项算法客户端体积都要增加,久而久之客户端膨胀很厉害,在海外市场用户对包体积比较敏感,这一点影响很大。


3、客户端性能不足。一些低端设备难以提供很好的用户体验。


4、AI 训练数据不足。本地处理的图片很难为云端提供数据训练。


此外,4G 网络的发展、带宽和延迟的改进等客观环境改善,加上图片美化流行潮流迭代加快等因素,促使美图开始研发云端图片美化架构。

云端图片美化架构

云端处理图片有三大基础要求:速度快、成功率高、质量全面监控。


基于三大要求,美图设计了如下架构:



上图是一个简化的方案:客户端先上传到存储服务,再调用 API 服务进行处理,API 服务到客户端服务是同步的,超时的话会有一个轮询机制。


为了解决隐私顾虑,用户上传到云端的图片后,6 个月后会全部删除,在此期间进行人工智能的训练。



为了保证速度和成功率,美图做了一些优化措施。


1、客户端:效果列表的预加载;上传服务采用 token 预获取;调节参数减少图片体积。


2、上传图片时会有两个源站服务,如果上传我们自身的源站有问题,则自动切换到公有云上面,两个服务会产生同步;图片、视频会切片上传减小压力。


3、API 服务和处理服务保持长连接,对于处理服务会进行弹性调度。它根据现在 CPU 使用率来自动弹性调度,自动扩缩容,从而提升处理速度,降低成本。

美图全球部署的问题

美图秀秀、美颜相机、B+等产品在国外用户量非常大,所以云美化不仅要考虑国内,也要考虑国外市场。


因为美图的存储服务和处理服务是两个不同的域名,可能会出现存储服务是在中国的 region,但处理服务的 DNS 解析到新加坡去了,导致图片处理失败。



目前美图采用的解决方案是,在存储服务和 API 服务方面有一个特定的字段定位 region,这样在上传一个图片到存储服务时就会知道下一次图片处理应该到哪个 region。这个方案还会显著提升容灾切换能力,通过业务端切换备份机房速度更快。

全面质量监控

1、美图有一个专门的文件上传 SDK;产品有一个通道上报一些指标数据,包括用户处理的效果 ID、上传时间、处理时间、下载时间、失败环节等等。


2、文件上传的 SDK 也有监控,包括上传时间,失败率,速度等等


3、API 服务的监控。监控请求 API 服务之后,处理服务花了多长时间。API 服务监控能单独看到处理服务器的情况,给出最后的报表。



美图根据详细的监控数据可以做针对性优化,根据地区维度和效果维度监控反馈数据。

边缘计算

运煤化准备演进的方向是边缘计算。



边缘计算的目标:数据上传的时候上传到 CDN 的边缘节点,处理也是在边缘节点处理,处理完成后,异步上传到源站,减少相关步骤,节省时间,提升用户体验。

大规模视频处理架构

图片视频处理需求传统上有几点:打水印;给视频截帧;转码服务;为内容加入特效。


传统处理方式下,给视频要打一个水印,打一个水印就调一段脚本,相当于是业务方是命令的决策者;处理服务则是一个命令的提供者。


问题

这样会存在一个问题,当业务方数量增多后,逻辑会非常混乱。假设,把水印的代码稍微改一改,10 个业务方就都要按照这个参数来改,这样改一个流程大概要半个月。


还有一些问题,首先决策方的业务代码全是业务方决定,很难把控;其次这套服务没有流程化;第三在于资源没有办法弹性调度。

解决方案


第一,业务方只要提交需求,比如需要对这个视频进行处理,处理的决策过程放到处理服务,把决策下移到处理服务来。


第二,原来有很多的命令,里面都是一个 shell 脚本或者是一个开源代码。以前每次上线都是先把这一类命令放到物理机的某一个目录上去统一放好,上线就把它配置上去。但是,当命令没有放到那个文件夹里面,调不到就会失败。假设每次都要重复写这样一套流程,那么新加一个业务写一套流程,因此我们希望处理命令方能够通过配置来做,处理命令写好一次放在这个地方就 OK,当别人想要用服务的时候,就可以把这套东西配置起来,把钟点工式的服务变成管家式的服务,把命令配置好。poseidon 是一段代码,第一步先接收消息,第二步下载图片,第三步是处理,处理结束后就回调业务方,只有处理这个步骤需要变化,其他步骤都是固定的,因此采用模板方法的设计模式来做。


第三,处理的逻辑用 trident 来补充。工程师会写上这个函数,把这个函数到底怎么样配置、参数是什么样子等全部列下来,后面增加任何服务的时候只要写一个 shell 脚本就行,中间接收消息、下载、回调、处理的过程等已经全部模板化,通过组装的方式在界面上就能组装出来。


处理原来是在物理机上,我们改造后放到 K8s 上进行,可以做弹性调度。最下面一层是云存储。


业务和处理


例如美拍的一个视频处理规则要求视频短边小于 540 时做一些事,这是一个规则引擎以及一个工作引擎负责下一步的处理,处理完之后要回调也无妨,告诉它回调业务方哪一个接口、什么格式,回调之后整个流程结束。那么我们只要通过配置的方式,就可以完成业务规则的定义。


poseidon 和 trident 的工作核心定义是,写好了一个函数是一个 python 脚本,调用一下它才能处理这个视频。这里提供三种方式调用,第一个是 HTTP 的同步调用;第二个是队列的方式;第三个是跟 kafka 类似的 kaproyx。


代码写好之后首先要提供该配置数据,或者从 kafka 读消息。读完消息之后把图片或者视频下载下来,拿这个函数处理。处理完之后上传到存储服务,上传完之后再回调到规则引擎。


把这个函数写好之后,trident 能够把函数配置和写好的模板方法(poseidon 的方法)打包成一个 docker-image,放到 docker 里面服务就 OK 了。


美图的大规模图片视频处理架构主要由 3 大特性,第一是通过决策下移,从业务方下移到处理服务提升控制力;第二是处理流程化;第三是通过 K8s 等能够做到大幅度的弹性调度。

Q&A

提问:APM 的部分,监控获取信息是用一些商业的方案,还是用开源的方案?有没有考虑到 APM 对自己本身业务性能的评审?


王静波:APM 是一个通道,是一个被动旁路的行为。业务方主动把这些信息收集好之后发给它,它只是通过一个 HTTP 的接口把数据上传。我们通过 IP 服务判断用户是在美国,或者是在中国福建厦门;是用的电信、联通,还是长城宽带?


我们还有一个比较强悍的武器是哈勃。比如我们的秀秀加一个哈勃的 SDK 之后,秀秀所有的 HTTP 请求,只要在白名单里面的都会上报 TCP 时间、DNS 时间、成功还是失败、整个处理时间……大概有几十个指标全部会上报。这个过程相当于做了一个代理一样,所有的行为发到哈勃的 SDK,SDK 再代理出去,效果非常好。


因为哈勃能够知道完整的所有指标,所以哈勃系统能帮助我们进行优化,包括我们做了 DNS 的 SDK,通过哈勃系统数据发现,有一些用户的 DNS 的时间非常长,那么我们可以根据用户需求做一个 DNS 的缓存 SDK- FastDNS。


这个问题讲的非常到位,管理学上有一句话,如果你不能度量它就不能管理它。我们很多时候不知道它的性能怎么样的时候,是没有办法去优化的。所以我们 APM 也好,我们哈勃系统也好,都是这样做的。

作者介绍:

王静波,美图技术总监,2015 年 9 月加入美图,主要负责的项目有:图片云美化、流媒体融合调度、直播弹幕系统、Feed 服务、质量监控体系等。


曾任职于网易和新浪微博,微博工作期间负责开放平台业务和技术体系建设。十余年的后端研发经历,拥有丰富的后端研发经验,对于构建高可用、高并发的系统有较多实践经验。


本文转载自美图技术公众号。


原文链接:https://mp.weixin.qq.com/s/hb4zHTqiVrXDe26iUNp4cw


2020-02-20 22:411163

评论

发布
暂无评论
发现更多内容

MySQL 到 ClickHouse 的高速公路

青云技术社区

MySQL 数据库 Clickhouse

这个云原生开发的痛点你遇到了吗?

阿里巴巴中间件

【图片旋转】十五分钟挑战鸿蒙Codelab组件

liuzhen007

鸿蒙 5月日更

网络协议之HTTP:HTTP 1.1与HTTP 2

程序员架构进阶

HTTP2.0 28天写作 HTTP协议 5月日更

防治肥胖,AI转向

脑极体

Spring Cloud Alibaba 生态学习

风翱

spring cloud alibaba 5月日更

将自媒体玩得风生水起的不一定是前总统,还有可能是艺术家

zhoo299

艺术 自媒体 5月日更

人证一体机产品设计

lenka

5月日更

【LeetCode】子数组异或查询Java题解

Albert

算法 LeetCode 5月日更

Ansible AD-Hoc

耳东@Erdong

ansible 5月日更

再学习一个 Golang 专栏

escray

学习 极客时间 Go 语言 5月日更

NumPy之:理解广播

程序那些事

Python Numpy 程序那些事

流量变现业务概论——Linkedmall流量变现业务初步分析及系统设计概要

关贺宇

华为云PB级数据库GaussDB(for Redis)揭秘第十期:GaussDB(for Redis)迁移系列(上)

华为云开发者联盟

数据仓库 华为云 数据迁移 GaussDB(for Redis) PB级数据库

微软为什么要对jdk下手?阿里对JDK的理解又是什么样的?

Java架构师迁哥

网络攻防学习笔记 Day11

穿过生命散发芬芳

5月日更 网络攻防

你认识镜子里的那个自己吗?

小天同学

原则 认知 5月日更

学习笔记:02 | 第一个程序:教你输出彩色的文字

Nydia

学习

传统BI如何转大数据数仓

数据社

大数据 BI 5月日更

由高频护网设备漏洞引发的供应链浅思

Thrash

安全

零基础学习NLP-DAY2

Qien Z.

nlp 5月日更

Gradle学习笔记

ES_her0

5月日更

⚓【Java知识晚餐】精心准备的JVM分析工具⚓

洛神灬殇

Java JVM 5月日更 JVM分析工具

快速搭建接口自动化测试框架

夏兮。

Java JUnit 接口测试 rest-assured

客制化:定制专属于你的产品和服务

石云升

产品 用户 职场经验 5月日更

技术笔记(语音识别-语音噪声分类)

攻城先森

噪声 5月日更 技术笔记

Windows自带的功能这么好用,还装什么第三方软件?

彭宏豪95

windows 5月日更

编程思考路径2条

顿晓

5月日更 思考路径

GitLab Webhooks 使用

夏兮。

gitlab jenkins CI/CD WEBHOOKS

「技术人生」专题第1篇:什么是技术一号位?

阿里巴巴中间件

关于组件,你真的了解么?

架构精进之路

组件化 5月日更

解密美图云端图片美化技术_文化 & 方法_王静波_InfoQ精选文章