Oneflow-Inc / oneflow

OneFlow is a deep learning framework designed to be user-friendly, scalable and efficient.
http://www.oneflow.org
Apache License 2.0
5.9k stars 666 forks source link

[Question]: 静态库运行时更新某些节点 #10240

Open yh8899 opened 1 year ago

yh8899 commented 1 year ago

Description

静态图是否支持运行时更新指定节点权重?类似根据节点名更新权重,load_runtime_state_dict耗时有点大,而且load_graph的静态图调用runtime_state_dict还会报错:AttributeError: 'UNetGraph' object has no attribute '_eager_state_op_names'

Alternatives

No response

strint commented 1 year ago

静态图是否支持运行时更新指定节点权重?

一般情况下是支持的。因为 Graph 和 eager Module 是共享参数 tensor的,所以修改 eager Module 中的 tensor 的值就好。

但是如果是 SD 的任务,大概率会没法更新。因为 oneflow 的 SD 里面打开了对参数的优化(常量折叠),一些权重估计被常量折叠给消除了。只能关闭这个常量折叠的优化才能支持更新,但是这样会损失一些性能。

load_runtime_state_dict耗时有点大

在您那边的开销是多少呢?我们之前做过测评,还是比直接编译少很多的。

Through optimization, when using graph loading, stable diffusion UNet can load 9 graphs, each less than 1s, a total of about 8s, while it took 150s before.

https://github.com/Oneflow-Inc/diffusers/wiki/Optimization-for-Multi-Resolution-Picture#optimization-significance

load_graph的静态图调用runtime_state_dict还会报错

是的,load_graph 后再调用 runtime_state_dict 做保存,这个行为是未定义的。

常规的做法是一台机器做离线的编译和 graph save,在线的所有机器做 graph load。 所以之前就没有做 graph load 后的 save。可以说下您在什么场景下需要这么使用么。

另外,我们最近会完善下这个用法。

yh8899 commented 1 year ago

感谢解答,我们的使用场景是SD模型在graph load之前保存的静态图,在运行过程中需要根据 eager module里面的tensor动态更新load之后的graph权重,因此load_runtime_state_dict不满足需求

strint commented 1 year ago

这样的话,可以尝试下关掉常量折叠优化。 text to image 的常量折叠的优化开关在:https://github.com/Oneflow-Inc/diffusers/blob/main/src/onediff/pipeline_stable_diffusion_oneflow.py#L86

这时 unet graph 中使用的参数就是 eager unet module 中的参数。所以可以通过更新 unet module 中的参数,就能更新 graph 的的参数。

yh8899 commented 1 year ago

我还有两个疑问:

  1. 关掉常量折叠优化,graph compile之后,unet graph中使用的参数还是eager unet module 中的参数吗?此时graph使用的不应该是compile之后的plan(graph编译的二进制)吗?
  2. 关掉之后对性能会不会有很大的影响?
strint commented 1 year ago

关掉常量折叠优化,unet graph中使用的参数还是eager unet module 中的参数吗

还是的

关掉之后对性能会不会有很大的影响?

会有负面影响,可以试验下影响的百分比是否可以接受

yh8899 commented 1 year ago

好的,感谢解答