百万级代码工业软件的云端综合实战
随着5G技术的广泛应用,各种云端产品层出不穷,深刻地改变了整个IT行业的技术形态。面对“卡脖子”问题,国产自研的工业软件需要适应这股浪潮,从云端为用户重塑产品。优秀的工业软件通过长期的技术沉淀形成专业优势,如何将优势迅速地转移到云端,结合并吸收云端的种种优势,是我们工业软件上云重点考虑的因素。在刚刚过去的QCon全球软件开发大会(北京站)中,三维家技术研究院基础平台负责人陈江豪带来了题为《百万级代码工业软件的云端综合实战》的演讲,他从实际业务场景出发,结合三维家工业软件云CAD、渲染引擎等的业务应用,阐述云端基础架构、3D云设计架构、AI架构设计等技术方案和选型思考,以及核心关键技术问题的解决办法,为工业软件上云提供借鉴。本文由此整理。
大家好,我叫陈江豪,来自广东三维家信息科技有限公司,我的主要技术方向是前端后端平台技术、侧重于渲染和AI。今天要和大家分享的是三维家在百万级代码工业软件的一些云端实战经验,内容主要有三部分,第一是工业软件上云的挑战,第二部分是关于工业软件云端的一些实战架构经验,最后一部分和大家一起展望下未来AI、Web3D等技术浪潮下的工业软件。
工业软件的前世今生
“工业软件是工业技术/知识、流程的程序化封装与复用,能够在数字空间和物理空间定义工业产品和生产设备的形状、结构,控制其运动状态,预测其变化规律,优化制造和管理流程,变革生产方式,提升全要素生产率,是现代工业的灵魂。”
这是2020年中国工业技术软件化产业联盟发布的《中国工业软件产业白皮书》给工业软件的定义。参考业界常规分类方法,按照所服务的业务环节,工业软件通常可以分为四大类,分别是研发设计类(如CAD)、生产制造类(如MES)、经营管理类(如ERP)和运维服务类。
工业软件的特点十分鲜明,我大概总结为以下三点。
管理软件强,工程软件弱,低端软件多,高端软件少。大家都用过有金蝶的产品,比如ERP、CRM这一类的,在国内有蛮多产品,但是CAD等卡脖子的工程软件国内却很少见。为什么会这样?我认为,首先是管理类软件的技术门槛较低,而工程软件的技术门槛和投入时间成本都比较高,长期下来,追赶不易。
专业性强而易用性差。企业累积了所在行业的工业知识,形成了一系列算法,从而打造出工业软件,但很容易出现一些架构问题,比如在追求功能的时候忽略了它的易用性。
源码庞大,历史债务重,学习成本高,迭代速度慢。以上问题同时也导致它的代码整体上缺乏一个整体的架构,代码逻辑会容易出现一种混乱的状态,长期下来它会容易出现技术债,使得企业积累不够,且新人学习成本过高,进而导致研发团队迭代速度相对较慢。
而这样的软件上云,会面临哪些挑战?又要如何解决?接下来我将结合三维家的实践案例进行讲解。
百万级代码工业软件的“上云”挑战
首先,为让各位更好地理解后面的内容,我需要对三维家的业务背景做一个简单的介绍。
三维家是一家深耕大家居产业的云工业软件服务商,基于AI、大数据、CAD建模、渲染等技术,打造了3D云设计、3D云制造、数控系统三大产品矩阵,并推出“内容即广告”的数字化营销解决方案和“模型即商品”的数字化供应链解决方案,帮助家居产业实现C2M全链路高效协同的产业互联。
多年以来,三维家一直在云工业软件上深耕,云端技术不断升级,在AI、建模、渲染、数控领域积累百万行以上的代码,这些代码上云的过程中我们遇到了很多挑战,最核心的可以概括为三个词语——快速、稳定、迭代。
展开来讲就是如何在保证快速集成原始工业积累,快速完成云化部署的同时,还要保证代码性能内存稳定高效,产品能够平稳过渡到新的云端代码,最后还要保证后续的迭代速度。
首先,三维家的代码量达到百万级以上,涉及AI、建模、渲染等前后端领域。这意味复杂性高,各个库、应用间关系复杂,甚至耦合到需要重构的程度,当中还存在多种编程语言,学习成本不是一般的高。部分代码一旦要重构解耦,更会反过来影响产品的稳定性。另外,我们的技术链路也比较长,从前端的好多层调用到后端的N层调用,相对比较脆弱。一旦它出现了问题,我们溯源都会查询起来都会比较麻烦,所以无法快速地迭代起来。
其次,在软件重构上云期间,旧的业务还在持续迭代,旧的代码还在膨胀,如何稳定过渡又是一个难题。
最后,解决迭代问题还需要解决不同业务团队DevOps不一致的问题,每个团队的认知不一样,技术水平不一样,管理水平也不一样,这会影响到团队间的协同性,最终影响迭代速度。如果还缺乏有效的协同工具,这是问题会呈几倍甚至几十倍的放大。
我们在整个云端架构上云的时候踩了很多坑,最后总结了一些方法论,在分享具体的踩坑经验之前,我要先介绍一下这些方法论,它主要分为战略和战术两个角度。
战略层面,我们需要坚持三点——
知己知彼:知己是了解目前产品和代码现状,梳理目前产品涉及的技术和痛点。
磨刀不误砍柴工:做好顶层设计,做好体系建设,做好协作方式。
柿子挑软的捏:先做最小闭环MVP验证项目的可行性,再不断迭代优化。
战术层面则需要——
• 基础体系建设:云原生Paas体系、项目质量管理体系、技术团队体系。
• 统一技术栈:梳理公司技术栈,统一公司大的技术栈,终止百家齐放,各自为政的局面。
• 确定新旧业务交互方式及数据流转:新旧业务既要做好隔离,也要做好兼容,对旧业务逐步替换。
• 拒绝重复造轮子:有意识地积极使用现有的成熟技术方案和工具,阿里云,腾讯云有的梯子可以使用,开源的工具如性能内存分析工具、语言转换工具也可以用。
下面我们来看看三维家是怎么应用这些方法论解决这百万行代码工业软件上线问题。
工业软件云端实战
搭建整体云端架构
这是三维家整体技术架构图的演变效果。
我们的技术架构分为元数据层,核心服务层,应用层。
数据层根据产品形态和技术要求,从最初采用阿里云演变到目前的混合云。从最初的SQL数据库,演变到目前SQL、NoSQL、文档数据库、图数据库多种数据源。我们认定未来3-5年里大数据是我们的核心技术方向之一。因此,我们建立了大数据平台,统一管理数据,提供高可用分布式集群服务,进行相关的大数据挖掘,为客户提供更加精准的服务。
核心服务层里,我们的3D云设计、3D云制造、3D建模等都是云原生的服务,根据业务特点,采用了Serverless、Service Mesh、边缘服务等服务形式。
应用层,三维家从一开始重前端,到现在重后端,始终贯彻着云工业软件的理念。对外提供WebAssembly应用、Node.js插件、API、小程序插件等等即插即用,独立发版的服务或应用。
在这演变过程中,三维家把公司的技术栈划分后端技术栈、前端技术栈、渲染技术栈、AI技术栈、建模技术栈,完成团队体系搭建。同时搭建自己的项目质量管理体系PMS,建立自己的研发双流模型。建立自己的DevOps,提供敏捷统一的迭代发版服务。
3D云设计
架构设计
3D云设计是三维家的核心产品,我们的核心业务都在云端的聚合服务层。而核心服务层聚合了三维家在大家居行业积累的许多工业知识,以API、Node.js、SDK的方式为应用提供专业的行业服务,其中插件都是能够动态加载聚合,且这些业务服务都是能够按照自己的节奏,走统一的DevOps独立地进行更新迭代。
我们的应用也可以在聚合服务层和核心服务层基础上进行二次开发,定制出自己的产品。比如我们的3D云设计就是采用的React前端脚手架,前端主要负责交互,UI显示和数据分离,核心数据都是在后端完成处理和存储,用户鉴权、行为记录也是在后端的基础服务模块中完成。这一切的基础就是我们技术研究院推出的AI引擎、3D建模引擎和渲染引擎组成的引擎层。
其中的渲染引擎,我们提供了实时的以C++为基础的自研跨平台3D引擎;在效果侧,基于物理渲染,配合后期处理效果,让家居场景呈现更加真实;在性能侧,基于ECS和Data-Oriented的数据结构设计,得益于多线程机制,可实现大场景绘制。
另外基于AI技术,我们还提供超分辨率渲染等。
WebAssembly落地难点
3D云设计演变成这个结构的过程中,我特别想分享一个WebAssembly相关的踩坑经验,因为我们3D云设计采用的是WebAssembly和JavaScript结合的一个方式。
首先是关于WebAssembly的多线程限制问题,WebAssembly是支持多线程的,我们编译时指定一些编译参数就行。但WebAssembly的多线程是有限制的,因为WebAssembly多线程设计的共享线性内存与sharedArraybuffer有关,而shareArraybuffer因为目前存在Spectre和Meltdown安全漏洞而被一些浏览器禁用的,谷歌也要参数设置后才能开启。因此WebAssembly多线程的广泛应用还需要等待一些大厂支持。
第二点,WebAssembly的初始化耗时一般较长,比如我们引擎的WebAssembly加载就达到秒级,这时候我们可以尝试利用WebAssembly的异步加载机制来提高速度,使用onRuntimeInitialized函数完成回调。
第三点,关于WebAssembly的内存和垃圾回收这个老大难问题。目前,WebAssembly能使用的最大内存是有限制的,各个浏览器的限制都不同,一般为2G,最多支持4G。而且它的垃圾回收机制还在Roadmap里,仍然遥不可及。所以,对内存要求高的工业软件,需要考虑降低内存的要求和采取一些优化方法,比如严格的内存管理机制,大内存的转移或及时释放都是可行的手段。但需要注意一点是WebAssembly数据内存转移到浏览器JavaScript这层的是有巨大的性能开销的。
第四点,包体过大。这个主要是复杂应用遇到的问题,因为我们的代码量太大了,百万级的代码量,编译出来的WebAssembly大小达到了80-100多兆。我们采取的措施有调整Emscripten的编译参数,提前编译.a库利用llvm本身的优化管线,编译进行抖动和分步加载,最终达到我们可以接受的大小。
第五点,SIMD指令的使用,这个对三维家这种存在高密度计算的工业软件来说,是一个福音。我们在CAD高密度计算上进行了一些尝试,有着不错的实验性能的提升。但这个特性也是还没有被广泛支持,需要谨慎使用。
3D云设计的架构,我就分享到这里。接下来,我给大家分享下,我们在AI方面的架构设计。
AI架构
应用场景诉求
讲架构前,先讲下我们整个AI的应用场景诉求。从图上可以看到,我们从用户、设计师和市场营销中进行需求挖掘,提取专家经验、户型特征等等,通过知识抽取融合,形成设计知识图谱、空间搭配知识图谱、风格知识图谱等相关知识图谱,然后在知识图谱上使用AI算法或知识推理进行布置推荐,为前端设计提供智能布置、全屋设计、套系应用、风格搭配等等AI功能,最后把用户对这些功能的使用行为的数据反馈到后端,作为AI算法的下一次迭代或强化学习的数据,来提高AI算法的精准度。这样整个AI场景形成了一个良性的闭环,这是我们AI架构的核心理念。
AI架构设计
三维家基于管理AI资产,提高AI深度学习效率的核心诉求和上述理念,从深度学习和知识图谱两个层面搭建了AI架构。在此基础之上我们构建了许多微服务和边缘服务,最后聚合成业务服务。
在AI支撑层,我们主要做深度学习和知识图谱的数据和训练支撑,AI基础服务层基于支撑层,使用算法代理的方式对外提供服务。算法代理模式使得我们基础算法能够独立迭代,能够集成到公司的DevOps里进行编排、AB测试、召回等。
需要特别指出的是,AI支撑层中深度学习的数据集除了常规的图像、文本之外,还加入三维家的素材数据集、方案数据集和大数据等。此外,我们会通过知识抽取,从大数据平台中的结构化数据抽取出各种知识图谱数据,与现有的知识图谱融合,形成企业专属的风格、布局、灯光、衣柜等层面的知识图谱,并进行知识推理对外提供AI服务。
深度学习如何与知识图谱结合,有很多途径。用深度学习为知识图谱推理求得初解,用深度学习进行知识抽取和融合,用知识图谱为深度学习做后处理等,这样两者的能力就能得到提升。
在算法模型的评估反馈方面,我们按照业务效果或算法要求,划分3级别,L1,L2,L3。类似于自动驾驶,我们对AI能力进行量化评估,形成闭环基础。使用神策对用户行为进行埋点,同时AI后与用户简单交互获取反馈,形成最终的闭环。
通过这个架构,我们达到了什么效果呢?首先,效果图方案的套用复用率能高达90%,高于行业水平,也就是说当设计师设计出一个精美的效果图,方案中90%的素材都能套用在其他的户型上。其次,三维家的聚合服务比较完整,使得整家设计能力覆盖面广,能实现全空间出图、定制柜补全、整家自动设计、自动打光等效果。另外我们也定义好与旧业务的数据格式和回传方式,使得整家设计能力兼容性强,能够无缝对接三维家3D云设计、3D秀、梦想家、方案岛等产品线,形成跨模块聚合效应。
AI落地过程中的问题
最后说一下我们在做AI的过程中遇到一些问题,主要有四点。
• 没有统一的技术架构
• 过度依赖深度学习
• 与业务过于耦合
• AI资产管理
首先我们当初做AI的时候,也是从0到1的一个过程。其实最开始我们是没有一个统一的技术架构,迭代效率是偏慢的。刚开始也没有统一的训练平台,每个开发人员都各自搞一套。别人维护起来很困难。
其次,我们前期过渡依赖深度学习,深度学习有一个特点就是它的结果无法解释,也无法控制,导致模型的准确性很依赖训练数据和标注,而且出现不正确结果时,无法向客户解释为什么会出现这样的结果,也无法定向修复。所以,后面我们改用深度学习+知识图谱解决了这个问题。比如我们的布局使用深度学习求得初始解,再用知识图谱进行推理得到最终布局。
第三点,AI算法人员与业务过于耦合,也就是AI算法人员既要写算法也要管工程化落地。这就涉及我们之前提过的一点战术,搞好技术团队建设。我们后期将AI工程化落地团队和算法团队分开,采用业务架构师的方式完成两个团队间的整合,让专业的人干专业的事,这样,我们公司去年的AI还是取得了不错的成绩。
最后一点,AI资产管理。这点很重要。公司是需要积累的,AI资产也是积累和管理。什么是AI资产,我认为数据集、AI算法模型、数据清洗算法、知识抽取算法等等都是AI资产,将来是可能形成市场生态的。我们原来的AI资产是散乱地放在各个开发的硬盘里,没有版本管理,没有备份,甚至人走了,这资产也跟着没了。当我们想对原算法进行重新训练迭代的时候,有时候我们竟然找不到原来的数据集,或者找到但已经被改得面目全非的数据集。可想这是多大的一种损失。所以,后期我们就在云端把AI资产管理起来,设置版本,存放备份等等。这些都有成熟的平台,我们尽量不要重新造轮子。华为、腾讯、百度这些大厂都有。
这些就是,我们AI遇到的主要问题。关于架构问题我们也分享到这。下面和大家一起展望下工业软件的未来。
展望:新浪潮下,工业软件如何拥抱四大技术?
未来的工业软件有什么特征?我认为有四个关键词可以简单概括——云化、AI化、一体化和虚实结合。
首先是云化。云化不仅让企业从硬件资源和运维部署中解放出来,还让企业从完善的云基础设施中获得产品迭代的提速,为集成化服务提供良好条件。同时,产品程序也将更加稳定。
工业软件云化有两种核心形式,一是WebAssembly方式云化,一是云原生化。WebAssembly满足工业软件对高精度、高性能的核心诉求。同时WebAssembly的性能也优于同等算法下JavaScript版本。经过测算,三维家 3D云设计纯JavaScript版和WebAssembly版的性能在同等复杂场景下相差5-7倍。
第二是AI化。最近,AIGC、ChatGPT等概念大热。随着AI技术的高速发展,AI与工业互联网也将更深度融合,推进工业设计、制造、物流、营销、决策等产品全生命周期的变革。
以家居行业为例,以前设计师做一张设计图需要几天时间。现在通过AI算法,三维家软件能进行户型识别,自动完成户型绘制,选择风格就能一键布置全屋,并完成精美的打灯效果。设计师在AI技术的赋能下,几分钟就可完成方案设计,效率提高几十倍,这就是AI带来的生产力变革。
在生产环节,三维家通过AI学习审拆单规则,能够一键完成审拆单,出错率远远低于人工,并帮助家居企业提高效率。
第三是一体化。未来的工业软件是一体化的,提升企业效率需要一体化的工业软件。这是我从三维家全新的前后端一体化解决方案得到的启示。前后端一体化,指从设计到生产全链路一体化,数据和行业标准一体化,CAD/CAE/CAM等流程一体化。
以三维家为例子,相比传统的前后端对接方式,前后端一体化能帮助企业在设计、下单效率,审拆单精准度、效率等方面都有明显提升。
最后是虚实结合。随着VR/AR技术的进一步成熟,它将为工业领域提供数字化呈现、交互及协同支持,通过Web3D技术将虚拟空间和Web结合,将能让用户获取更真实的交互体验和更逼真的表现效果。而WebGPU的深化,可让工业软件在3D以及计算方面的能力大大的增强,虚实映射、虚实叠加、虚实联动构建起工业元宇宙,将会为我们展开更具想象力的未来图景。
嘉宾简介
陈江豪,广东三维家信息科技有限公司技术研究院基础平台负责人&高级平台技术专家。主要技术方向为前端底层平台技术及后端微服务和云原生技术。先后从事教育、游戏及家居行业,对互联网和工业软件有独特见解,负责过公司百万级前端代码的技术转型项目及公司前沿产品的平台支持。现负责三维家渲染及AI基础平台支持。