Nayaco / mahoshojos-large-model-support

mahoshojo's large model support
Apache License 2.0
1 stars 0 forks source link

疑问咨询 #3

Open ChenDonYY opened 1 year ago

ChenDonYY commented 1 year ago

Hi,你好。我是 @Pinging-ZJU 介绍来的,有几个问题想咨询一下。

  1. 异步换出操作,是指的通过compute_stream和pagein/out_stream两个流间执行各自操作,来实现异步效果吗?
  2. 换入操作,为什么不需要使用event等待compute_stream完成操作?
  3. 被动换入操作在 pytorch 底层数据访问接口 data/data_ptr/unsafe_data 中触发,为什么选取这几处,是有什么考虑?
  4. 主动换入操作 tensor.need_prefetch() ,在example.py中将其写在forward函数中,是仅在backward时才开始换入?若是,是否缺失调用prefetch_all() 函数?
  5. 主动换入操作,按forward的顺序将tensor放入fetch_queue,但backward的时候从队尾到队头prefetch,是否更符合backward时tensor的使用顺序?
  6. 换出操作只实现了用户指定tensor,在设计时是否有考虑被动换出,有什么考虑导致未实现?
  7. 在patch文件中,还有许多checkpoint,Rematerializer等代码,和内存换入换出功能是否有关联,起到什么作用?

希望有时间解答交流一下,感谢。

Nayaco commented 1 year ago
  1. 你理解的是正确的
  2. 其实换出也可以不需要和compute steam同步, 只要能保证数据不dirty. 换入时数据一定是完整的所以直接copy到device内即可
  3. 被动换入在我的设计中认为是最差情况, 即数据被访问时数据不在device中, 访问数据一定是从这几个接口中调用就直接在这几个接口中加了判断
  4. 这个patch是我参与的一个工作的代码的一部分, 整理的时候比较乱, 最初的设计是包含了checkpointing和compression的, 后面由于这个工作被放弃了导致很大一部分功能其实没有实现, 包括你说的prefetch顺序问题, 当时考虑backward指令重排等优化, prefetch & checkpointing整个过程其实是用户透明的, need_prefetch()是一个测试接口. (整理的时候样例确实写错了XD prefetch_all()需要指定, 而且need_prefetch要反序写