Resumo da pesquisa e prática da solução de aceleração de inferência SD de difusores





Recentemente, o número de serviços implantados em nossa plataforma de computação inteligente média (MVAP) de tecnologia de conteúdo aumentou rapidamente e alguns cenários de negócios têm certos requisitos para a velocidade de inferência dos modelos da série SD. Portanto, conduzimos pesquisas e testes nos métodos de aceleração SD atualmente populares e tomamos o cenário de negócios adequado à IA como exemplo para testar uma variedade de soluções de aceleração. O que se segue é um resumo e partilha dos resultados do inquérito e dos efeitos reais da implementação.



Introdução ao plano de aceleração


As ideias atuais de aceleração convencionais incluem otimização de operador, compilação de modelo, cache de modelo, destilação de modelo, etc. A seguir, apresentaremos brevemente várias soluções representativas de código aberto usadas em testes.


▐Otimização do operador : FlashAttention2  


Otimizado principalmente para o módulo de atenção no transformador. FlashAttention altera o método convencional de cálculo de atenção, integra o cálculo completo de atenção em um único kernel cuda e combina técnicas de avanço e recomputação reversa nesta base. FlashAttention2 reduz ainda mais os cálculos redundantes e fortalece o cálculo paralelo direto com o processo reverso, reduzindo assim; uso de memória e tempo de cálculo. Devido ao seu bom efeito e uso generalizado, FlashAttention2 foi integrado ao pytorch2.2 e versões posteriores.

▐Compilação do modelo : oneflow/stable-fast  


oneflow acelera a inferência do modelo compilando o modelo em um gráfico estático e combinando-o com a fusão de operadores integrada do oneflow.nn.Graph e outras estratégias de aceleração. A vantagem é que o modelo SD básico precisa apenas de uma linha de código compilado para completar a aceleração, o efeito de aceleração é óbvio, a diferença no efeito de geração é pequena, pode ser usado em combinação com outras soluções de aceleração (como deepcache) , e a frequência de atualização oficial é alta. As deficiências serão discutidas posteriormente.


Stable-fast também é uma biblioteca de aceleração baseada na compilação de modelos e combina uma série de métodos de aceleração de fusão de operadores, mas sua otimização de desempenho depende de ferramentas como xformer, triton e torch.jit.


▐Cache de modelo : deepcache  


O processo de inferência convencional do modelo SD contém muitas etapas de cálculo da unet (o número de etapas que definimos no teste do modelo básico é 50), e o autor do deepcache descobriu que a unet das etapas adjacentes tem apenas mudanças extremamente pequenas nos recursos profundos Para evitar duplicação, para calcular esses recursos profundos redundantes, o deepcache apenas executa cálculos completos em algumas etapas e armazena em cache os resultados do cálculo dos recursos profundos para as etapas restantes, apenas os recursos superficiais são calculados e combinados com os resultados dos recursos armazenados em cache mais recentes; Este processo equivale a pular a maioria das camadas da rede unet, podendo reduzir significativamente a quantidade de cálculo.

O uso de deepcache na estrutura de difusores é muito conveniente, e a camada mais profunda do cache e o intervalo de etapas do cache podem ser definidos de acordo com a situação real (uma estratégia de distribuição não uniforme também pode ser usada aqui, e diferentes etapas pode ser definido de acordo com a redundância de diferentes intervalos), você mesmo compensa entre velocidade de inferência e qualidade de geração.



▐Modelo de destilação: lcm-lora  


Combinando lcm (Modelo de Consistência Latente) e lora, o lcm destilará todo o modelo sd para obter raciocínio em poucas etapas, enquanto lcm-lora usa a forma de lora para otimizar apenas a parte lora, que também pode ser combinada diretamente. com uso regular de lora.


Teste de aceleração SD1.5


Com base na estrutura de difusores amplamente utilizada, os principais métodos de aceleração testados incluem oneflow, stable-fast, deepcache e alguns métodos oficialmente recomendados por difusores. Ao mesmo tempo, também foi testado o efeito de aceleração em cenários de utilização da controlnet.

Ambiente de teste  


A10 + cu118 + py310 + tocha2.0.1 + difusores0.26.3
文生图, prompt: "Uma foto de um gato. Concentre a luz e crie bordas nítidas e definidas."


▐Resultados do teste  


  1. Ao comparar as imagens geradas com uma semente fixa, podemos descobrir que a compilação oneflow pode reduzir o rt em mais de 40% quase sem perda de precisão. No entanto, ao usar um novo pipeline para gerar imagens pela primeira vez, são necessárias dezenas de vezes. segundos de tempo de compilação como aquecimento.
  2. Deepcache pode reduzir o rt em mais 15% a 25% nesta base, mas ao mesmo tempo, à medida que o intervalo de cache aumenta, a diferença no efeito de geração torna-se cada vez mais óbvia.
  3. oneflow também é eficaz para o modelo SD1.5 usando controlnet
  4. Stable-fast depende muito de pacotes externos e está sujeito a vários problemas de versão e erros de ferramentas externas. Semelhante ao oneflow, leva um certo tempo de compilação para gerar imagens pela primeira vez e o efeito de aceleração final é ligeiramente inferior ao. fluxo único.

▐Dados de comparação detalhados  


Otimização

Tempo médio de geração (segundos)

512*512,50 passos

efeito de aceleração

Gerar efeito 1

Gerar efeito 2

Gerar efeito 3

difusores

3.3701

0


difusores+bf16

3.3669

≈0


difusores+controlnet

4.7452




difusores + compilação oneflow

1.9857

41,08%


difusores + compilação oneflow + controlnet

2.8017




difusores + compilação oneflow + deepcache

intervalo=2:1,4581

56,73%(15,65%)


intervalo=3:1,3027

61,35%(20,27%)


intervalo=5:1,1583

65,63%(24,55%)


difusores+rápido

2.3799

29,38%





Teste acelerado SDXL

Diferente do SD1.5, esta parte testa principalmente o efeito de otimização de oneflow, deepcache e lcm-lora em cenários de uso de lora.

Ambiente de teste  


A10 + cu118 + py310 + tocha2.0.1 + difusores0.26.3
文生图, prompt: "Uma foto de um gato. Concentre a luz e crie bordas nítidas e definidas."

▐Resultados do teste  


Modelo sdxl básico:

  1. Sob a condição de semente fixa, o modelo sdxl parece ter maior probabilidade de afetar o efeito de geração de imagens usando diferentes esquemas de aceleração.

  2. O Oneflow só pode reduzir o rt em 24%, mas ainda pode garantir a precisão das imagens geradas.

  3. Deepcache pode fornecer aceleração extremamente significativa Quando o intervalo é 2 (ou seja, o cache é usado apenas uma vez), o rt é reduzido em 42%. Quando o intervalo é 5, o rt é reduzido em 69%. imagens também é óbvio.

  4. lcm-lora reduz significativamente o número de etapas necessárias para gerar gráficos e pode atingir grande aceleração de inferência. No entanto, ao usar pesos pré-treinados, a estabilidade é extremamente baixa e é muito sensível ao número de etapas. garantir uma saída estável consistente com a imagem solicitada

  5. oneflow e deepcache/lcm-lora podem ser usados ​​bem juntos


lora:

  1. Após o carregamento da lora, a velocidade de inferência dos difusores é significativamente reduzida, e o grau de redução está relacionado ao tipo e quantidade de lora utilizada.

  2. deepcache ainda funciona e ainda há problemas de precisão, mas a diferença não é grande em intervalos de cache mais baixos

  3. Ao usar lora, a compilação oneflow não pode corrigir a semente para permanecer consistente com a versão original.

  4. A compilação Oneflow otimiza a velocidade de inferência após o carregamento de lora. Quando vários loras são carregados, o rt de inferência é quase o mesmo de quando nenhum lora é carregado, e o efeito de aceleração é extremamente significativo. Por exemplo, usando fio + aquarela duas loras ao mesmo tempo, o rt pode ser reduzido em cerca de 65%

  5. oneflow otimizou ligeiramente o tempo de carregamento do lora, mas o tempo de operação de configuração após o carregamento do lora aumentou.


▐Dados de comparação detalhados  


Otimização

Lora

Tempo médio de geração (segundos) 512*512, 50 passos

Tempo de carregamento de Lora (segundos)

tempo de modificação de lora (segundos)

Efeito 1

Efeito 2

Efeito 3

difusores

nenhum

4.5713





fio

7.6641

13.9235

11.0447

0.06~0.09

根据配置的lora数量




watercolor

7.0263




yarn+watercolor

10.1402



diffusers+bf16

4.6610





yarn

7.6367

12.6095

11.1033

0.06~0.09

根据配置的lora数量




watercolor

7.0192




yarn+ watercolor

10.0729




diffusers+deepcache

interval=2:2.6402





yarn

interval=2:4.6076






watercolor

interval=2:4.3953




yarn+ watercolor

interval=2:5.9759



interval=5:

1.4068



yarn

interval=5:2.7706




watercolor

interval=5:2.8226




yarn+watercolor

interval=5:3.4852



diffusers+oneflow编译

3.4745





yarn

3.5109

11.7784

10.3166

0.5左右

移除lora 0.17




watercolor

3.5483




yarn+watercolor

3.5559



diffusers+oneflow编译+deepcache

interval=2:1.8972



yarn

interval=2:1.9149




watercolor

interval=2:1.9474




yarn+watercolor

interval=2:1.9647



interval=5:0.9817



yarn

interval=5:0.9915




watercolor

interval=5:1.0108




yarn+watercolor

interval=5:1.0107



diffusers+lcm-lora


4step:0.6113






diffusers+oneflow编译+lcm-lora


4step:0.4488







应用:AI试衣加速


AI试衣业务场景使用了算法在diffusers框架基础上改造的专用pipeline,功能为根据待替换服饰图对原模特图进行换衣,基础模型为SD2.1。


根据调研的结果,deepcache与oneflow是优先考虑的加速方案,同时,由于pytorch版本较低,也可以尝试使用较新版本的pytorch进行加速。


  测试环境


A10 + cu118 + py310 + torch2.0.1 + diffusers0.21.4


图生图(示意图,仅供参考):

待替换服饰

原模特图


  测试结果


  1. pytorch2.2版本集成了FlashAttention2,更新版本后,推理加速效果明显

  2. deepcache仍然有效,为了尽量不损失精度,可设置interval为2或3

  3. 对于被“魔改”的pipeline和子模型,oneflow的图转换功能无法处理部分操作,如使用闭包函数替换forward、使用布尔索引等,而且很多错误原因较难通过报错信息来定位。在进行详细的排查之后,我们尝试了改造原模型代码,对其中不被支持的操作进行替换,虽然成功地在没有影响常规生成效果的前提下完成了改造,通过了oneflow编译,但编译后的生成效果很差,可以看出oneflow对pytorch的支持仍然不够完善

  4. 最终采取pytorch2.2.1+deepcache的结合作为加速方案,能够实现rt降低40%~50%、生成效果基本一致且不需要过多改动原服务代码


  详细对比数据


优化方法

平均生成耗时(秒)

576*768,25step

生成效果

diffusers

22.7289

diffusers+torch2.2.1

15.5341

diffusers+torch2.2.1+deepcache

11.7734

diffusers+oneflow编译

17.5857

diffusers+deepcache

interval=2:18.0031

interval=3:16.5286

interval=5:15.0359


总结


目前市面上有很多非常好用的开源模型加速工具,pytorch官方也不断将各种广泛采纳的优化技术整合到最新的版本中。


我们在初期的调研与测试环节尝试了很多加速方案,在排除了部分优化效果不明显、限制较大或效果不稳定的加速方法之后,初步认为deepcache和oneflow是多数情况下的较优解。


但在解决实际线上服务的加速问题时,oneflow表现不太令人满意,虽然oneflow团队针对SD系列模型开发了专用的加速工具包onediff,且一直保持高更新频率,但当前版本的onediff仍存在不小的限制。


如果使用的SD pipeline没有对unet的各种子模块进行复杂修改,oneflow仍然值得尝试;否则,确保pytorch版本为最新的稳定版本以及适度使用deepcache可能是更省心且有效的选择。


相关资料


  1. FlashAttention:

    • https://github.com/Dao-AILab/flash-attention

    • https://courses.cs.washington.edu/courses/cse599m/23sp/notes/flashattn.pdf

  2. oneflow

    • https://github.com/Oneflow-Inc/oneflow

    • https://github.com/siliconflow/onediff

  3. stable-fast

    • https://github.com/chengzeyi/stable-fast

  4. deepcache

    • https://github.com/horseee/DeepCache

  5. lcm-lora

    • https://latent-consistency-models.github.io/

  6. pytorch 2.2

  7. https://pytorch.org/blog/pytorch2-2/


团队介绍


我们是淘天集团内容技术AI工程团队,通过搭建完善的算法工程化一站式平台,辅助上千个淘宝图文、视频、直播等泛内容领域算法的工程落地、部署和优化,承接每日上亿级别的数字内容数据,支撑并推动AI技术在淘宝内容社交生态中的广泛应用。


本文分享自微信公众号 - 大淘宝技术(AlibabaMTT)。
如有侵权,请联系 [email protected] 删除。
本文参与“OSC源创计划”,欢迎正在阅读的你也加入,一起分享。

90后程序员开发视频搬运软件、不到一年获利超 700 万,结局很刑! 高中生自创开源编程语言作为成人礼——网友锐评:依托答辩 RustDesk 由于诈骗猖獗,暂停国内服务 淘宝 (taobao.com) 重启网页版优化工作 Java 17 是最常用的 Java LTS 版本 Windows 10 市场份额达 70%,Windows 11 持续下滑 开源日报 | 谷歌扶持鸿蒙上位;开源Rabbit R1;Docker加持的安卓手机;微软的焦虑和野心;海尔电器把开放平台关了 Apple 发布 M4 芯片 谷歌删除 Android 通用内核 (ACK) 对 RISC-V 架构的支持 云风从阿里离职,未来计划制作 Windows 平台的独立游戏
{{o.name}}
{{m.name}}

Acho que você gosta

Origin my.oschina.net/u/4662964/blog/11104137
Recomendado
Clasificación