Open yh8899 opened 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.
load_graph的静态图调用runtime_state_dict还会报错
是的,load_graph 后再调用 runtime_state_dict 做保存,这个行为是未定义的。
常规的做法是一台机器做离线的编译和 graph save,在线的所有机器做 graph load。 所以之前就没有做 graph load 后的 save。可以说下您在什么场景下需要这么使用么。
另外,我们最近会完善下这个用法。
感谢解答,我们的使用场景是SD模型在graph load之前保存的静态图,在运行过程中需要根据 eager module里面的tensor动态更新load之后的graph权重,因此load_runtime_state_dict不满足需求
这样的话,可以尝试下关掉常量折叠优化。 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 的的参数。
我还有两个疑问:
关掉常量折叠优化,unet graph中使用的参数还是eager unet module 中的参数吗
还是的
关掉之后对性能会不会有很大的影响?
会有负面影响,可以试验下影响的百分比是否可以接受
好的,感谢解答
Description
静态图是否支持运行时更新指定节点权重?类似根据节点名更新权重,load_runtime_state_dict耗时有点大,而且load_graph的静态图调用runtime_state_dict还会报错:AttributeError: 'UNetGraph' object has no attribute '_eager_state_op_names'
Alternatives
No response