随着 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 基础平台支持。
今年 5 月,QCon全球软件开发大会即将落地广州,从下一代软件架构、金融分布式核心系统、现代编程语言、AIGC、现代数据架构、新型数据库、业务出海的思考、大前端变革等角度与你探讨。
活动推荐:
2023年9月3-5日,「QCon全球软件开发大会·北京站」 将在北京•富力万丽酒店举办。此次大会以「启航·AIGC软件工程变革」为主题,策划了大前端融合提效、大模型应用落地、面向 AI 的存储、AIGC 浪潮下的研发效能提升、LLMOps、异构算力、微服务架构治理、业务安全技术、构建未来软件的编程语言、FinOps 等近30个精彩专题。咨询购票可联系票务经理 18514549229(微信同手机号)。
评论