PR #37290 实现了一个stream安全的allocator,但仍存在以下几个问题:
- 原先的
const std::shared_ptr<Allocator>& AllocatorFacade::GetAllocator(const platform::Place& place, size_t size)
在FLAGS_use_stream_safe_cuda_allocator=true
且CUDAPlace
的情况下完全不走了,导致无法走到https://github.com/PaddlePaddle/Paddle/pull/37290/files#diff-b16c61934558347e2a498c5efd88d0da7245de25d0fd90c48e9e63652b6d40caR338 这个分支。CUDA Graph需要额外申请新的显存池。即现在的stream safe allocator实现把原先适配CUDA Graph的代码给break掉了。这一方面是单测覆盖不完善,另一方面是改代码的时候可能没有考虑cover全原先支持的功能。 - CUDA Graph capture不支持调用
cudaEventQuery
,这是NV文档明确指出的,更不用说cudaEventDestroy
等一些列操作了。即现在的stream safe allocator在CUDA Graph下是不可行的。
- stream可能会先于Allocation/Allocator析构,特别是现在stream是有Python端暴露的API的,迟早会出现stream先于Allocation/Allocator析构的问题。
- 代码编写上的一点建议:通过异常的方法来初始化Allocator,过于trick,而且完全没有必要一定要通过异常来做。https://github.com/PaddlePaddle/Paddle/pull/37290/files#diff-b16c61934558347e2a498c5efd88d0da7245de25d0fd90c48e9e63652b6d40caR374 。而且看代码发现,这里还要求必须是可重入锁。一方面,可重复锁不是一个很好的编程实践;另一方面,其他开发者可能不知道这一点,以后想改动都可能会遇到坑(如发现当前SpinLock性能不好,想换一种SpinLock实现,甚至换回互斥锁,发现代码hang或core了)。
1条答案
按热度按时间vvppvyoh1#
您好,我们已经收到了您的问题,会安排技术人员尽快解答您的问题,请耐心等待。请您再次检查是否提供了清晰的问题描述、复现代码、环境&版本、报错信息等。同时,您也可以通过查看官网API文档、常见问题、历史Issue、AI社区来寻求解答。祝您生活愉快~
Hi! We've received your issue and please be patient to get responded. We will arrange technicians to answer your questions as soon as possible. Please make sure that you have posted enough message to demo your request. You may also check out the API,FAQ,Github Issue and AI community to get the answer.Have a nice day!