onediff icon indicating copy to clipboard operation
onediff copied to clipboard

关于加速后生成图像质量变差的问题

Open lovejing0306 opened this issue 11 months ago • 22 comments

Describe the bug

使用 onediff 加速之后,生成图像质量变差。请问有什么解决的办法吗?详细对比如下:

加速前生成图像 base-0_0

加速后生成图像 base-0_0-onediff

生成变差的区域(红色圈中的地方) Xnip2024-03-22_16-51-30

lovejing0306 avatar Mar 22 '24 08:03 lovejing0306

可以提供下复现问题的代码么,这个需要能复现才好办

strint avatar Mar 22 '24 08:03 strint

可以设置环境变量ONEFLOW_CONV_ALLOW_HALF_PRECISION_ACCUMULATION=0和ONEFLOW_MATMUL_ALLOW_HALF_PRECISION_ACCUMULATION=0再试试,设置之后对于conv和linear,onediff会采用更高精度的计算方式

hjchen2 avatar Mar 22 '24 08:03 hjchen2

可以设置环境变量ONEFLOW_CONV_ALLOW_HALF_PRECISION_ACCUMULATION=0和ONEFLOW_MATMUL_ALLOW_HALF_PRECISION_ACCUMULATION=0再试试,设置之后对于conv和linear,onediff会采用更高精度的计算方式

但这样设置之后,后影响推理速度吗?

lovejing0306 avatar Mar 22 '24 11:03 lovejing0306

可以设置环境变量ONEFLOW_CONV_ALLOW_HALF_PRECISION_ACCUMULATION=0和ONEFLOW_MATMUL_ALLOW_HALF_PRECISION_ACCUMULATION=0再试试,设置之后对于conv和linear,onediff会采用更高精度的计算方式

但这样设置之后,后影响推理速度吗?

预估影响 5% 的性能,可以试下,看能否解决问题。

strint avatar Mar 22 '24 11:03 strint

可以设置环境变量ONEFLOW_CONV_ALLOW_HALF_PRECISION_ACCUMULATION=0和ONEFLOW_MATMUL_ALLOW_HALF_PRECISION_ACCUMULATION=0再试试,设置之后对于conv和linear,onediff会采用更高精度的计算方式

但这样设置之后,后影响推理速度吗?

预估影响 5% 的性能,可以试下,看能否解决问题。

试了你说的这种方案,得到了改善,但还会有一些差异。这个还有进一步的提升方案吗?

没有添加环境变量的结果: base-0_0-onediff-before

添加环境变量之后的结果: base-0_0-onediff

lovejing0306 avatar Mar 22 '24 12:03 lovejing0306

确实改善了,现在哪里还有差异呢

strint avatar Mar 22 '24 12:03 strint

确实改善了,现在哪里还有差异呢

现在就剩下颜色上的差异了,可以把我上传的 “加速前生成图像”图像和 “添加环境变量之后的结果”图像 下载到本地,切换着看下,就能发现差异了。

lovejing0306 avatar Mar 22 '24 12:03 lovejing0306

质量评估:https://github.com/siliconflow/OneDiffGenMetrics

strint avatar Apr 01 '24 04:04 strint

另外因为 torch 不同版本的 conv 也会带来写差异,比如 conv kernel cuda v8 api

pytorch的cudnn_convolution计算函数从v7(调用cudnnConvolutionForward,与oneflow一致)更新到了v8(调用cudnnBackendExecute),默认为v8版本

image

设置TORCH_CUDNN_V8_API_DISABLED=1后pytorch和oneflow的计算结果一致

(https://github.com/Oneflow-Inc/OneTeam/issues/2198)

strint avatar Apr 01 '24 04:04 strint

conv kernel diff: oneflow vs torch cuda v8 api

👌,感谢回复

lovejing0306 avatar Apr 01 '24 04:04 lovejing0306

另外因为 torch 不同版本的 conv 也会带来写差异,比如 conv kernel cuda v8 api

pytorch的cudnn_convolution计算函数从v7(调用cudnnConvolutionForward,与oneflow一致)更新到了v8(调用cudnnBackendExecute),默认为v8版本

image

设置TORCH_CUDNN_V8_API_DISABLED=1后pytorch和oneflow的计算结果一致

(https://github.com/Oneflow-Inc/OneTeam/issues/2198)

辛苦再给看下这个问题 https://github.com/siliconflow/onediff/issues/762

lovejing0306 avatar Apr 01 '24 05:04 lovejing0306

20240412-174323 求问为什么使用onediff生图效果很模糊

csdY123 avatar Apr 12 '24 09:04 csdY123

20240412-174323 求问为什么使用onediff生图效果很模糊

能否提供可以复现的代码以及 prompt(可用于对比)?

lixiang007666 avatar Apr 12 '24 11:04 lixiang007666

20240412-174323 求问为什么使用onediff生图效果很模糊

能否提供可以复现的代码以及 prompt(可用于对比)? @lixiang007666 from compel import Compel, ReturnedEmbeddingsType import time from onediffx import compile_pipe, save_pipe, load_pipe from onediffx.deep_cache import StableDiffusionXLPipeline from compel import Compel, ReturnedEmbeddingsType base_model_path = "playground-v2.5-1024px-aesthetic" base_model_name = base_model_path.split("/")[-1]

pipe = StableDiffusionXLPipeline.from_pretrained( base_model_path, torch_dtype=torch.float16, variant="fp16", ).to("cuda")

compel = Compel( tokenizer=[pipe.tokenizer, pipe.tokenizer_2], text_encoder=[pipe.text_encoder, pipe.text_encoder_2], returned_embeddings_type=ReturnedEmbeddingsType.PENULTIMATE_HIDDEN_STATES_NON_NORMALIZED, requires_pooled=[False, True], truncate_long_prompts=False, )

pipe = compile_pipe(pipe) if os.path.exists(f"cached_pipe_{base_model_name}"): load_pipe(pipe, f"cached_pipe_{base_model_name}") else: prompt = "A photo of a cat. Focus light and create sharp, defined edges." # Warmup for i in range(1): deepcache_output = pipe( prompt, cache_interval=3, cache_layer_id=0, cache_block_id=0, output_type="pil", ).images[0]

if not os.path.exists(f"cached_pipe_{base_model_name}"): save_pipe(pipe, dir=f"cached_pipe_{base_model_name}") logger.info("Pipeline compiled successfully.")

images = pipe( prompt=prompt, negative_prompt=negative_prompt, height=height, width=width, num_images_per_prompt=num_images_per_prompt, num_inference_steps=30, guidance_scale=3, cache_interval=3, cache_layer_id=0, cache_block_id=0, ).images

另外,我试了SDXL Base出现了模糊,但是使用playground-v2.5-1024px-aesthetic不会出现模糊。 使用的版本是2.2.0+cu118

csdY123 avatar Apr 15 '24 03:04 csdY123

另外,我尝试了SDXL Base出现了模糊,但是使用playground-v2.5-1024px-aesthetic不会出现模糊。 使用的版本是2.2.0+cu118

@strint 您好,方便的话能把pytorch版本、cuda版本等关键配置信息分享一下吗? 我们希望至少能跑通SDXL Base

csdY123 avatar Apr 16 '24 06:04 csdY123

另外,我尝试了SDXL Base出现了模糊,但是使用playground-v2.5-1024px-aesthetic不会出现模糊。 使用的版本是2.2.0+cu118

@strint 您好,方便的话能把pytorch版本、cuda版本等关键配置信息分享一下吗? 我们希望至少能跑通SDXL Base

你用的 prompt 和种子是什么,我们看能否复现你这个问题。如果有代码更好

strint avatar Apr 16 '24 06:04 strint

torch.version '2.1.1' CUDA Version: 12.2

@csdY123

strint avatar Apr 16 '24 06:04 strint

deepcache是有损的,可能导致模糊的问题,请去掉下面这些参数关掉deepcache关掉再试。

cache_interval=3,
cache_layer_id=0,
cache_block_id=0,

hjchen2 avatar Apr 16 '24 06:04 hjchen2

torch.version '2.1.1' CUDA Version: 12.2

@strint

非常感谢!!!另外,请问deepcache是使用了int8推理吗

csdY123 avatar Apr 18 '24 05:04 csdY123

有损的,可能导致模糊的问题,请去掉下面这些参数关掉

非常感谢,deepcache是使用了int8推理吗

csdY123 avatar Apr 18 '24 05:04 csdY123

另外,我尝试了SDXL Base出现了模糊,但是使用playground-v2.5-1024px-aesthetic不会出现模糊。 使用的版本是2.2.0+cu118

@strint 您好,方便的话能把pytorch版本、cuda版本等关键配置信息分享一下吗? 我们希望至少能跑通SDXL Base

你用的 prompt 和种子是什么,我们看能否复现你这个问题。如果有代码更好

prompt="silhouette style manga style "A cluttered garage with a worn-out couch where a muscular college student, identified as Dante, is seated, strumming an untuned bass guitar. His expression is focused yet frustrated. The side door of the garage is slightly ajar. He seems to have missed noticing a departing figure - suggested by a retreating back view of a character just outside the side door." . vibrant, high-energy, detailed, iconic, Japanese comic style . colorful, high contrast, minimalistic, stark, dramatic " 种子是随机的,没记录,但是都挺模糊; 该prompt效果是: 1713418336682 代码上面已经提到

csdY123 avatar Apr 18 '24 05:04 csdY123

torch.version '2.1.1' CUDA Version: 12.2 @strint

非常感谢!!!另外,请问deepcache是使用了int8推理吗

社区版默认是没有开 int8 推理的。int8 推理属于企业版的功能,只对少量模型做了 int8 量化。

strint avatar Apr 18 '24 07:04 strint

有损的,可能导致模糊的问题,请去掉下面这些参数关掉

非常感谢,deepcache是使用了int8推理吗

deepcache会跳步

CuddleSabe avatar Jun 18 '24 12:06 CuddleSabe