10 月 23 - 25 日,QCon 上海站即将召开,现在大会已开始正式报名,可以享受 8 折优惠 了解详情
写点什么

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

  • 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:411639

评论

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

12 堂干货直播课,8 位 Serverless 大咖带你零基础晋级 Serverless 高手

阿里巴巴中间件

阿里云 Serverless 云原生 中间件

2021下半年全新京东商城亿级并发架构设计,不学习你就OUT了!!

Java 程序员 面试 计算机 京东

Micro Focus 发布年度安全运营报告,洞察后疫情时代企业安全运营新趋势

首个RISC-V计算机芯片现身欧洲处理器计划

BeeWorks

自建开源Cassandra与GaussDB(for Cassandra)性能对比测试报告

华为云数据库小助手

性能分析 GaussDB 华为云数据库 GaussDB(for Cassandra) 开源Cassandra

残疾人大学生就业难?「低代码」应用,让就业更简单!

优秀

低代码

大众汽车迟到的软件优先思维

SOA开发者

直播报名 | 超低延时直播架构解析

百度开发者中心

最佳实践 方法论 活动 直播

F5 Networks收购云安全初创公司Threat Stack

BeeWorks

「技术人生」第6篇:技术同学应该如何理解业务?

阿里巴巴中间件

阿里云 云原生 技术人生

漫画 | 一口气搞懂 Serverless !

阿里巴巴中间件

阿里云 云原生 中间件

工业互联网的两种极端想法和两点反思

iNeuOS工业互联网操作系统

大数据 物联网 智能制造 iNeuOS工业互联网

DPDK分析学习之全网唯一的DPDK教学课程丨虚拟化高性能专家之路

Linux服务器开发

网络协议 虚拟化 Linux服务器开发 DPDK 高性能网络

秀出新天际的 SpringBoot 笔记,让开发像搭积木一样简单

Java 架构 面试 Spring Boot

Nebula Graph 源码解读系列 | Vol.01 Nebula Graph Overview

NebulaGraph

redis--数据库实现

en

一朵云、一张网、一体化 ——GRTN 打造最佳流媒体场景实践

阿里云CloudImagine

云计算 阿里云 边缘计算 视频云 流媒体传输

云信小课堂 | 聊天室内容审核很头疼?3步解决!

网易云信

人工智能 AI 视频

如何高效掌控K8s资源变化?K8s Informer实现机制浅析

腾源会

云原生 k8s

如何加速云原生数据应用?这个开源项目备受关注

阿里巴巴中间件

阿里云 开源 云原生 中间件

Vite + Vue3 + OpenLayers 同步两个地图基础操作

德育处主任

大前端 Web 地图 vite openlayers

Webrtc ICE 框架

webrtc developer

WebRTC p2p ICE

这本Alibaba“绝密”SpringBoot精髓到底厉害在哪里

Java 程序员 面试 springboot 计算机

T-BOX专业分享

SOA开发者

被 Docker 日志坑惨了

AlwaysBeta

Docker 容器 运维

丧心病狂!阿里内部Spring Cloud高薪笔记流失,GitHub夜获星百万

Java 程序员 面试 计算机 阿里巴巴‘

从技术到商业:2021 DEMO CHINA创新中国峰会正式开启

创业邦

与顶级互联网公司技术大佬面对面聊聊RocketMQ吧!

阿里巴巴中间件

阿里云 开源 RocketMQ 云原生 中间件

Dubbo 和 HSF 在阿里巴巴的实践:携手走向下一代云原生微服务

阿里巴巴中间件

阿里云 云原生 中间件

Go 语言网络库 getty 的那些事

阿里巴巴中间件

开源 云原生 Go 语言

Serverless Devs 2.0 开箱测评:Serverless 开发最佳实践

阿里巴巴中间件

阿里云 Serverless 云原生 中间件

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