Li Xinqi
Li Xinqi
clip_grad默认不检查isnan和isinf。这样对齐了pytorch
提供作用域flow.tmp_compute_stream,其下的所有op都在拥有单独线程的tmp_compute stream上工作。
将Functor::operator()内的创建AttrMap的过程缓存起来,从3-7us开销优化到300-500ns。这个300-50ns还是在nsys上的测量值,实际时间估计在100ns一下。
将cpu op总是放在scheduler线程上运行。这是为了减少线程切换。
将vm oom之类的错误通过last_error的方式抛到python层。
将vector形式的StackedError重构成list形式的ErrorFrame。杜绝某些极端情况下显示错误和微量的内存泄漏。
本pr合并了 https://github.com/Oneflow-Inc/oneflow/pull/8570 和 https://github.com/Oneflow-Inc/oneflow/pull/8571 。不用合并,只是为了看联合优化效果。 本地的性能优化结果,对比oneflow和pytorch: 第一次运行 ``` lixinqi@oneflow-22:~/oneflow$ bash ci/test/test_speed_multi_client.sh OneFlow resnet50 time: 16.6ms (= 3329.9ms / 200, input_shape=[1, 3, 224, 224]) PyTorch resnet50 time: 29.0ms (= 5793.1ms /...
将TaskGraph的逻辑拆解成BoxingTaskGraph和RankTaskGraph。BoxingTaskGraph负责构建boxing相关的task graph子图,然后序列化到BoxingTaskGraphProto。RankTaskGraph负责两点:1)构建指定rank的CompTaskNode;2)从BoxingTaskGraphProto恢复属于boxing部分的子图; 分布式编译的大体过程将会是: 1. 在main线程(或master进程)上由OpGraph构建BoxingTaskGraph,并序列化成BoxingTaskGraphProto; 2. 在线程池里的各个worker线程(或worker进程)上由OpGraph/BoxingTaskGraphProto/rank等信息构建属于该rank的RankTaskGraph,然后生成该rank的plan。 本pr实现的是分离编译的中间状态版本:即BoxingTaskGraph在main线程上构建,而RankTaskGraph在线程池里构建。 后续pr再实现彻底的分离编译,即BoxingTaskGraph在master进程上构建,而RankTaskGraph在worker进程上构建。
flow.save没有和torch对齐 ``` >>> import oneflow as torch >>> x = torch.tensor([0, 1, 2, 3, 4]) >>> torch.save(dict(tensor=x), 'tensor.pt') ``` pytorch保存成一个文件,而oneflow保存成目录。
优化cuda_tensor.numpy(),内部不再调用cuda_tensor.cpu().to_numpy(),而是直接在main线程的cuda stream上SyncAutoMemCpy。