阿里妹导读
本文介绍了图像生成技术在AIGC领域的发展历程、关键技术和当前趋势,以及这些技术如何应用于新能源汽车行业的车联网服务中。
一、前言
1.1AIGC发展背景
根据图像构成的类型,图像按照颜色和灰度的多少可以分为二值图、灰度图、索引图和RGB图,图像生成模型可实现不同图像类型的转换。
在实际应用中,模型的效果表现主要体现在生成图像的质量和图像的多样性,其在平面设计、游戏制作、动画制作等领域均有广泛的应用,另外,在医学影像合成与分析,化合物合成和药物发现等方面,图像生成也具有很大的应用潜力。
1.2技术发展的关键阶段
作为计算机视觉领域的重要组成部分,图像生成的技术发展大致经历了三个关键阶段:
GAN生成阶段:
生成对抗网络(GAN)是上一代主流图像生成模型,GAN通过生成器和判别器进行博弈训练来不断提升生成能力和鉴别能力,使生成式网络的数据愈发趋近真实数据,从而达到生成逼真图像的目的。但在发展过程中,GAN也存在稳定性较差、生成图像缺乏多样性、模式崩溃等问题。
自回归生成阶段:
自回归模型进行图像生成的灵感得益于NLP预训练方式的成功经验,利用Transformer结构中的自注意力机制能够优化GAN的训练方式,提高了模型的稳定性和生成图像的合理性,但基于自回归模型的图像生成在推理速度和训练成本方面的问题,使其实际应用受限。
扩散模型生成阶段:
对于前代模型在性能方面的局限性,扩散模型(DiffusionModel)已经使这些问题得到解决,其在训练稳定性和结果准确性的效果提升明显,因此迅速取代了GAN的应用。而对于产业应用中的大量跨模态图像生成需求,则需要结合CLIP进行,CLIP基于文本-图像对的训练方式能够建立跨模态的连接,显著提升生成图像的速度和质量。
目前,业内主流且生成效果优秀的图像生成产品主要是基于扩散模型和CLIP实现的。
1.3主流模型实现原理及优缺点
扩散模型(DiffusionModel)
1、实现原理:扩散模型是通过定义一个扩散步骤的马尔可夫链,通过连续向数据添加随机噪声,直到得到一个纯高斯噪声数据,然后再学习逆扩散的过程,经过反向降噪推断来生成图像。扩散模型通过系统地扰动数据中的分布,再恢复数据分布,使整个过程呈现一种逐步优化的性质,确保了模型的稳定性和可控度。
2、模型优缺点:扩散模型的优点在于其基于马尔可夫链的正向及反向扩散过程能够更加准确地还原真实数据,对图像细节的保持能力更强,因此生成图像的写实性更好。特别是在图像补全修复、分子图生成等应用上扩散模型都能取得很好的效果。但由于计算步骤的繁杂,相应地,扩散模型也存在采样速度较慢的问题,以及对数据类型的泛化能力较弱。
CLIP(ContrastiveLanguage-imagePre-training)
1、原理:CLIP是基于对比学习的文本-图像跨模态预训练模型,其训练原理是通过编码器分别对文本和图像进行特征提取,将文本和图像映射到同一表示空间,通过文本-图像对的相似度和差异度计算来训练模型,从而能够根据给定的文本生成符合描述的图像。
2、模型优缺点:CLIP模型的优点在于其基于多模态的对比学习和预训练的过程,能够将文本特征和图像特征进行对齐,因此无需事先标注数据,使其在零样本图像文本分类任务中表现出色;同时对文本描述和图像风格的把握更加准确,并能够在不改变准确性的同时对图像的非必要细节进行变化,因此在生成图像的多样性方面表现更佳。
由于CLIP本质上属于一种图像分类模型,因此对于复杂和抽象场景的表现存在局限性,例如可能在包含时间序列数据和需要推理计算的任务中生成图像的效果不佳。另外,CLIP的训练效果依赖大规模的文本-图像对数据集,对训练资源的消耗比较大。
1.4当前AIGC行业发展趋势
基于扩散模型和CLIP模型的基础架构,衍生出一些列可悲开发者使用的工具平台,加速AIGC生图的生产力和商业化进程。目前行业主流AIGC工作流工具,基本就是ComfyUI和WebUI两个。从Midjourney和SD的官方社区文档,可以查看到下列两个工具的比较:
二、应用场景
对于新能源汽车行业,车联网的互动能力和趣味性,会成为行业内竞争堡垒。而且新能源企业面向车主的服务方式会更贴近于互联网企业,内容交互的引流已经变成各家车企重点攻坚的方向。典型场景如下:
1)车主节假日中短途游之后,基于车联网和车载芯片,会记录如下旅程信息:
2)基于旅程信息,期望大模型在汽车内容社区,自动生成如下的风格化素材,并推送
同时为了最大化的c端引流,车企对AIGC的能力提出了极高的要求,尤其注重生图细节的下列部分:
生图的风格化,是否能完全遵从指令
汽车logo和边缘的色差
背景车型无违和拼装等
三、实践落地
3.1AIGC生图工具选型
总体来看,面向toc场景的生产环境使用,ComfyUI的学习曲线虽然较陡,但相较于其他的StableDiffusionruntime有以下优势:
在SDXL模型推理上相较于其他UI有很大的性能优化,图片生成速度相较于webui有10%~25%的提升。
高度自定义,可以让用户更加精准和细粒度控制整个图片生成过程,深度用户可以通过ComfyUI更简单地生成更好的图片。
Workflow以json或者图片的形式更易于分享传播,可以更好地提高效率。
开发者友好,Workflow的API调用可以通过简单加载相同的API格式json文件,以任何语言来调用生成图片。
当然,还有一个关键点是,PAIEAS基于场景化部署,对于ComfyUI的版本选择更多样,更便捷。
ComfyUI的工作流配置页面
3.2业务流程确认
往往容易被忽视的第1步,就是基于业务需求设计完整的工作流。
因为aigc最后的效果是要求比较高,所以为了实现目标,往往需要大语言模型,大视觉模型,NLP,VAE,CLIP等一系列模型组合才能达到效果,而且ComfyUI的生图时间普遍较长,所以节点的编排和选择,串行还是并行,哪个节点加图层,都很有讲究。
3.3自定义节点开发
完成工作流的设计之后,下一步就是基于开源社区,确认可被使用的开发节点,以及需要后续自开发的节点。
目前通过github所能获取的标准ComfyUI节点,都是开源模型节点,所以完成上边链路所需要的文生文和文生图,就需要对通义千问和通义万相节点进行定制化编写后,才能挂载到ComfyUI上。下边是基于ComfyUI社区介绍,整理的《ComfyUI自定义节点开发规范》:
ComfyUI自定义节点开发规范
classExample:"""AexamplenodeClassmethods-------------INPUT_TYPES(dict):_CHANGED:_TYPES(`tuple`):_NAMES(`tuple`):Optional:(`str`):,if`FUNCTION="execute"`thenitwillrunExample().execute()OUTPUT_NODE([`bool`]):Ifthisnodeisanoutputnodethatoutputsaresult/(`str`):(`bool`):,(`bool`):(s)-tuple||None:`FUNCTION`.Forexample,if`FUNCTION="execute"`thenthismethod'snamemustbe`execute`,if`FUNCTION="foo"`thenitmustbe`foo`."""def__init__(self):pass@classmethoddefINPUT_TYPES(s):"""(string):"MODEL","VAE","CLIP","CONDITIONING","LATENT","IMAGE","INT","STRING","FLOAT".Inputtypes"INT","STRING"or"FLOAT":`dict`:-Keyinput_fields_group(`string`):Canbeeitherrequired,`required`-Valueinput_fields(`dict`):Containsinputfieldsconfig:*Keyfield_name(`string`):Nameofaentry-pointmethod'sargument*Valuefield_config(`tuple`):+Firstvalueisastringindicatethetypeoffieldoralistforselection.+Secondvalueisaconfigfortype"INT","STRING"or"FLOAT"."""return{"required":{"image":("IMAGE",),"int_field":("INT",{"default":0,"min":0,Maximumvalue"step":64,Cosmeticonly:displayas"number"or"slider""lazy":TrueThevaluerepresentingtheprecisiontoroundto,"display":"number","lazy":True}),"print_to_screen":(["enable","disable"],),"string_field":("STRING",{"multiline":False,RETURN_NAMES=("image_output_name",)FUNCTION="test"dosomeprocessingontheimage,inthisexampleIjustinvertitimage=1.0-imagereturn(image,)"""Thenodewillalwaysbereexecutedifanyoftheinputschangebutthismethodcanbeusedtoforcethenodetoexecuteagainevenwhentheinputsdon'cuted,theimagehashasastring,iftheimagehashchangesbetweenexecutionstheLoadImagenodeisexecutedagain."""defIS_CHANGED(s,image,string_field,int_field,float_field,print_to_screen):Setthewebdirectory,ionAddcustomAPIroutes,usingrouterfromaiohttpimportwebfromserverimportPromptServer@("/hello")asyncdefget_hello(request):_response("hello")NOTE:namesshouldbegloballyuniqueNODE_CLASS_MAPPINGS={"Example":Example}_key=""@classmethoddefINPUT_TYPES(s):return{"required":{"system_prompt":("STRING",{"default":"""请根据我输入的中文描述,生成符合主题的完整提示词。生成后的内容服务于一个绘画AI,它只能理解具象的提示词而非抽象的概念。请严格遵守以下规则,规则如下:风格真实、高清、写实Assumingtheresponsecontainsthegeneratedpromptinthe'output'fieldpainting_prompt=[0].:raiseException('Requestfailed:Requestid:%s,Statuscode:%s,errorcode:%s,errormessage:%s'%(_id,_code,,))return(painting_prompt,)Adictionarythatcontainsthefrily/humanlyreadabletitlesforthenodesNODE_DISPLAY_NAME_MAPPINGS={"旅行文本生成":"生成旅行本文提示词"}万相2.0的plugin节点,unquotefrompathlibimportPurePosixPathimportrequestsimportdashscopefromdashscopeimportImageSynthesisimportrandomclassImageSynthesisNode:"""_TYPES(dict):_CHANGED:_TYPES(`tuple`):(`str`):(`str`):ThecategorythenodeshouldappearintheUI."""@classmethoddefINPUT_TYPES(s):return{"required":{"prompt":("STRING",{"default":"","multiline":True})},}RETURN_TYPES=("STRING",)FUNCTION="generate_image_url"CATEGORY="ImageSynthesis"def__init__(self):获取生成的图片URLimage_url=[0].urlelse:raiseException('Requestfailed:Statuscode:%s,code:%s,message:%s'%(_code,,))return(image_url,)Adictionarythatcontainsthefrily/humanlyreadabletitlesforthenodesNODE_DISPLAY_NAME_MAPPINGS={"ImageSynthesisNode":"ImageSynthesisNode"}prompt="Abeautifulandrealistichigh-definitionlandscapescene,featuringthefamouslandmarkofWuxi,theTurtleHeadIslePark,,sunnydayinthestartingpoint,Shanghai,toacloudyskyatthedestination,,experiencedbyanewdriveronaMayDaytrip,spansfromtheeveningofMay2,2024,tothelateafternoonofMay5,2024,,withtheteamnamed\"OuYang'sHappyTeam\",cheerfulstarttoamoreserene,calmatmosphere,w,alongwiththechangingweather,createsapicturesqueandtranquilsetting."prompt="Abeautifulandrealistichigh-definitionlandscapescene,featuringthefamouslandmarkofWuxi,theTurtleHeadIslePark,,sunnydayinthestartingpoint,Shanghai,toacloudyskyatthedestination,,cheerfulstarttoamoreserene,calmatmosphere,w,alongwiththechangingweather,createsapicturesqueandtranquilsetting"node=ImageSynthesisNode()image_url=_image_url(prompt)print(f"GeneratedImageURL:{image_url}")3.4PAI服务部署增加算力选择
目前对比了几家主流云厂商,阿里云的PAI和AWS的Bedrock是比较好的支持ComfyUI多版本的部署,同时对于资源挂载的适配也比较好。这里注意通过PA对ComfyUI部署,会涉及到两个版本:
API版:系统自动转换服务为异步模式,适用于高并发场景。仅支持通过API进行调用。如果需要多台实例时,建议选用API版。
官方文档从性价比考虑,资源规格推荐使用GU30、A10或T4卡型。系统默认选择。
实际测试结果看,建议部署L20卡,生图速度相比GU30快一些。基于性价比考虑,选择的是单卡L20,16核128G。
服务配置{"cloud":{"computing":{"instance_type":""},"networking":{"security_group_id":"sg-uf626dg02ts498gqoa2n","vpc_id":"vpc-uf6usys7jvf2p7ugcyq1j","vswitch_id":"vsw-uf6lv36zo7kkzyq9blyc6"}},"containers":[{"image":"/pai-eas/comfyui:1.7-beta","port":8000,"script":"/deta-code-oss"}],"metadata":{"cpu":32,"enable_webservice":true,"gpu":2,"instance":1,"memory":256000,"name":"jiashu16"},"name":"jiashu16","options":{"enable_cache":true},"storage":[{"mount_path":"/deta-code-oss","oss":{"path":"oss://ai4d-k4kulrqkyt37jhz1mv/482832/data-2053858/","readOnly":false},"properties":{"resource_type":"model"}}]}3.5节点和模型挂载
服务部署后,系统会自动在已挂载的OSS或NAS存储空间中创建以下目录结构:
/custom_nodes:该目录用来存储ComfyUI插件。编写之后的qwen-max的plugin节点和万相2.0的plugin节点,需要上传到本文件夹。
/models:该目录用来存放模型文件。
/output:工作流最后的输出结果的存储地址。
3.6基于workflowjson的服务接口建设
工作流workflowapijson样例
工作流workflowapijson样例{"4":{"inputs":{"ckpt_name":"基础模型XL_xl_1.0.safetensors"},"class_type":"CheckpointLoaderSimple","_meta":{"title":"Checkpoint加载器(简易)"}},"6":{"inputs":{"text":["149",0],"speak_and_recognation":true,"clip":["145",1]},"class_type":"CLIPTextEncode","_meta":{"title":"CLIP文本编码器"}},"7":{"inputs":{"text":"*I**Do**Not**Use**Negative**Prompts*","speak_and_recognation":true,"clip":["145",1]},"class_type":"CLIPTextEncode","_meta":{"title":"CLIP文本编码器"}}3.7工程架构和稳定性保障
重点展示基于PAIComfyUI+百炼qwen+百炼万相部分的架构设计和稳定性保障,上层应用部署在ACS或者ecs,可以基于客户真实环境和利旧情况进行调整。
同时,所有生图需要紧贴用户最新的旅程时间,所以图片都有季节性【旅游旺季和淡季】。因此,整个系统架构,从模型层到应用层,都具备高QPS和弹性伸缩的能力。
四、技术服务避坑点
避坑点1:测试和生产环境下,ComfyUI的版本切换
对于生产和测试不同环境,部署的版本选择需要特别注意,不同版的api调用效果差异明显
同步调用【标准版】:标准版服务仅支持同步调用方式,即客户端发送一个请求,同步等待结果返回。
异步调用【API版】:API版服务仅支持异步调用方式,即客户端使用EAS的队列服务向输入队列发送请求,并通过订阅的方式从输出队列查询结果。
从POC向商用调用,往往会涉及ComfyUI服务的切换,相对应的OSS的挂载,必须对不同环境做隔离,否则oss/temp文件会将不同服务的中间节点产物存储在一起,产生相互干涉。
避坑点2:提前规划工作流涉及的资源互访和授权
通常完整的工作流会涉及到千问,万相,可图和FLUX等一些列模型,每个模型的生成文本和图片,都会在上下游中作为入参和出参,因此在每一步流程中,对应的EIP,NAT网关,OSS挂载授权尽量做提前规划,尤其是千问和万相输出内容都会在一个默认的region中,最好提前考虑跨region的问题。