API 参考
模块内容
- class rmm.DeviceBuffer
基类:
object
方法
capacity
(self)copy
(self)返回 DeviceBuffer 的副本。
copy_from_device
(self, cuda_ary, ...)从主机上的缓冲区复制到
self
copy_from_host
(self, ary, ...)从主机上的缓冲区复制到
self
copy_to_host
(self[, ary])从
DeviceBuffer
复制到主机上的缓冲区。prefetch
(self[, device, stream])在指定的流上,将缓冲区数据预取到指定的设备。
reserve
(self, size_t new_capacity, ...)resize
(self, size_t new_size, ...)to_device
(const unsigned char[, ...)对提供的参数调用
to_device
函数。tobytes
(self, Stream stream=DEFAULT_STREAM)- capacity(self) size_t
- copy(self)
返回 DeviceBuffer 的副本。
- 返回:
- 现有
DeviceBuffer
的深层副本
- 现有
示例
>>> import rmm >>> db = rmm.DeviceBuffer.to_device(b"abc") >>> db_copy = db.copy() >>> db.copy_to_host() array([97, 98, 99], dtype=uint8) >>> db_copy.copy_to_host() array([97, 98, 99], dtype=uint8) >>> assert db is not db_copy >>> assert db.ptr != db_copy.ptr
- copy_from_device(self, cuda_ary, Stream stream=DEFAULT_STREAM)
从主机上的缓冲区复制到
self
- 参数:
- cuda_ary具有
__cuda_array_interface__
接口的对象(从中复制) - stream用于复制的 CUDA 流,默认为默认流
- cuda_ary具有
示例
>>> import rmm >>> db = rmm.DeviceBuffer(size=5) >>> db2 = rmm.DeviceBuffer.to_device(b"abc") >>> db.copy_from_device(db2) >>> hb = db.copy_to_host() >>> print(hb) array([97, 98, 99, 0, 0], dtype=uint8)
- copy_from_host(self, ary, Stream stream=DEFAULT_STREAM)
从主机上的缓冲区复制到
self
- 参数:
- ary类似
bytes
的缓冲区(从中复制) - stream用于复制的 CUDA 流,默认为默认流
- ary类似
示例
>>> import rmm >>> db = rmm.DeviceBuffer(size=10) >>> hb = b"abcdef" >>> db.copy_from_host(hb) >>> hb = db.copy_to_host() >>> print(hb) array([97, 98, 99, 0, 0, 0, 0, 0, 0, 0], dtype=uint8)
- copy_to_host(self, ary=None, Stream stream=DEFAULT_STREAM)
从
DeviceBuffer
复制到主机上的缓冲区。- 参数:
- ary类似
bytes
的缓冲区(写入目标) - stream用于复制的 CUDA 流,默认为默认流
- ary类似
示例
>>> import rmm >>> db = rmm.DeviceBuffer.to_device(b"abc") >>> hb = bytearray(db.nbytes) >>> db.copy_to_host(hb) >>> print(hb) bytearray(b'abc') >>> hb = db.copy_to_host() >>> print(hb) bytearray(b'abc')
- nbytes
获取缓冲区的大小(字节)。
- prefetch(self, device=None, stream=None)
在指定的流上,将缓冲区数据预取到指定的设备。
假设此 DeviceBuffer 的存储空间是 CUDA 管理内存(统一内存)。如果不是,此函数将不执行任何操作(no-op)。
- 参数:
- device可选
要将此缓冲区的内存预取到的 CUDA 设备。默认为当前 CUDA 设备。要预取到 CPU,请将
cudaCpuDeviceId
作为 device 传入。- stream可选
用于预取的 CUDA 流。默认为 self.stream
- ptr
获取指向底层数据的指针。
- reserve(self, size_t new_capacity, Stream stream=DEFAULT_STREAM) void
- resize(self, size_t new_size, Stream stream=DEFAULT_STREAM) void
- size
获取缓冲区的大小(字节)。
- static to_device(const unsigned char[::1] b, Stream stream=DEFAULT_STREAM)
对提供的参数调用
to_device
函数。
- rmm.disable_logging()
如果之前使用 rmm.initialize() 或 rmm.enable_logging() 启用了日志记录,则禁用日志记录。
- rmm.enable_logging(log_file_name=None)
为所有设备启用运行时事件的日志记录。
- 参数:
- log_file_name: str, 可选
日志文件的名称。如果未指定,则使用环境变量 RMM_LOG_FILE。如果两者均不可用,则抛出 ValueError。每个设备都会生成一个单独的日志文件,并且后缀 “.dev{id}” 会自动添加到日志文件名称中。
注意
请注意,如果在启用日志记录的情况下使用环境变量 CUDA_VISIBLE_DEVICES,后缀可能与您的预期不同。例如,如果设置 CUDA_VISIBLE_DEVICES=1,生成的日志文件后缀仍将是 0。类似地,如果设置 CUDA_VISIBLE_DEVICES=1,0 并使用设备 0 和 1,后缀为 0 的日志文件将对应于设备 ID 为 1 的 GPU。使用 rmm.get_log_filenames() 获取每个设备对应的日志文件名称。
- rmm.flush_logger()
刷新调试日志记录器。这将导致所有缓冲的日志消息写入日志文件。
调试日志记录将消息打印到日志文件。有关更多信息,请参见 调试日志记录。
另请参阅
set_flush_level
设置调试日志记录器的刷新级别。
get_flush_level
获取当前的调试日志记录刷新级别。
示例
>>> import rmm >>> rmm.flush_logger() # flush the logger
- rmm.get_flush_level()
获取 RMM 日志记录器的当前调试日志记录刷新级别。此级别或更高级别的消息将自动刷新到文件。
调试日志记录将消息打印到日志文件。有关更多信息,请参见 调试日志记录。
- 返回:
- logging_level
当前刷新级别,是
logging_level
枚举的一个实例。
另请参阅
set_flush_level
设置日志记录器的刷新级别。
flush_logger
刷新日志记录器。
示例
>>> import rmm >>> rmm.flush_level() # get current flush level <logging_level.INFO: 2>
- rmm.get_log_filenames()
返回正在使用的每个设备的日志文件名称(如果未写入日志,则返回 None)。
示例
>>> import rmm >>> rmm.reinitialize(devices=[0, 1], logging=True, log_file_name="rmm.log") >>> rmm.get_log_filenames() {0: '/home/user/workspace/rapids/rmm/python/rmm.dev0.log', 1: '/home/user/workspace/rapids/rmm/python/rmm.dev1.log'}
- rmm.get_logging_level()
获取当前的调试日志记录级别。
调试日志记录将消息打印到日志文件。有关更多信息,请参见 调试日志记录。
- 返回:
- levellogging_level
当前的调试日志记录级别,是
logging_level
枚举的一个实例。
另请参阅
set_logging_level
设置调试日志记录级别。
示例
>>> import rmm >>> rmm.get_logging_level() # get current logging level <logging_level.INFO: 2>
- rmm.is_initialized()
如果 RMM 已初始化,则返回 True,否则返回 False。
- class rmm.level_enum(value, names=<not given>, *values, module=None, qualname=None, type=None, start=1, boundary=None)
基类:
IntEnum
- 属性:
denominator
化为最简分数后的分母
imag
复数的虚部
numerator
化为最简分数后的分子
real
复数的实部
方法
as_integer_ratio
(/)返回一对整数,其比率等于原始整数。
bit_count
(/)self 绝对值的二进制表示中 1 的数量。
bit_length
(/)在二进制中表示 self 所需的位数。
conjugate
返回 self,任意整数的复共轭。
from_bytes
(/, bytes[, byteorder, signed])返回给定字节数组表示的整数。
is_integer
(/)返回 True。
to_bytes
(/[, length, byteorder, signed])返回表示整数的字节数组。
- critical = 5
- debug = 1
- error = 4
- info = 2
- n_levels = 7
- off = 6
- trace = 0
- warn = 3
- rmm.register_reinitialize_hook(func, *args, **kwargs)
将函数添加到在调用
reinitialize()
之前将被调用的函数列表(“钩子”)中。用户或库可以注册钩子,以便在重新初始化 RMM 之前执行任何必要的清理工作。例如,一个库可能维护一个内部对象缓存,这些对象使用了 RMM 分配的设备内存。该库可以注册一个钩子,在 RMM 重新初始化之前释放这些引用,从而确保相关的设备内存资源可以被释放。
钩子按照注册的相反顺序调用。这很有用,例如,当一个库注册了多个钩子,并且需要它们以特定顺序运行以确保清理安全时。钩子不能依赖于相对于其他包注册的钩子的特定注册顺序,因为这取决于包的导入顺序。
- 参数:
- func可调用对象
在调用
reinitialize()
之前要调用的函数- args, kwargs
要传递给 func 的位置参数和关键字参数
- rmm.reinitialize(pool_allocator=False, managed_memory=False, initial_pool_size=None, maximum_pool_size=None, devices=0, logging=False, log_file_name=None)
使用传入的选项完成然后初始化 RMM。使用先前 RMM 初始化中的内存是未定义行为,应避免。
- 参数:
- pool_allocatorbool, 默认为 False
如果为 True,则使用池分配策略,这可以显著提高性能。
- managed_memorybool, 默认为 False
如果为 True,则使用管理内存进行设备内存分配
- initial_pool_sizeint | str, 默认为 None
当 pool_allocator 为 True 时,这表示初始池大小(字节)。默认情况下,使用总 GPU 内存的 1/2。当 pool_allocator 为 False 时,如果提供此参数,则将被忽略。字符串参数使用 parse_bytes 进行解析。
- maximum_pool_sizeint | str, 默认为 None
当 pool_allocator 为 True 时,这表示最大池大小(字节)。默认情况下,使用 GPU 上的总可用内存。当 pool_allocator 为 False 时,如果提供此参数,则将被忽略。字符串参数使用 parse_bytes 进行解析。
- devicesint 或 List[int], 默认为 0
要注册的 GPU 设备 ID。默认情况下仅注册 GPU 0。
- loggingbool, 默认为 False
如果为 True,则启用所有内存事件(分配、释放、重新分配)的运行时日志记录。这会对性能产生显著影响。
- log_file_namestr
日志文件的名称。如果未指定,则使用环境变量
RMM_LOG_FILE
。如果两者均不可用,则抛出ValueError
。每个设备都会生成一个单独的日志文件,并且后缀 “.dev{id}” 会自动添加到日志文件名称中。
注意
请注意,如果在启用日志记录的情况下使用环境变量
CUDA_VISIBLE_DEVICES
,后缀可能与您的预期不同。例如,如果设置CUDA_VISIBLE_DEVICES=1
,生成的日志文件后缀仍将是0
。类似地,如果设置CUDA_VISIBLE_DEVICES=1,0
并使用设备 0 和 1,后缀为0
的日志文件将对应于设备 ID 为1
的 GPU。使用 rmm.get_log_filenames() 获取每个设备对应的日志文件名称。
- rmm.set_flush_level(level)
设置调试日志记录器的刷新级别。此级别或更高级别的消息将自动刷新到文件。
调试日志记录将消息打印到日志文件。有关更多信息,请参见 调试日志记录。
- 参数:
- levellogging_level
调试日志记录级别。有效值为
logging_level
枚举的实例。
- 抛出:
- TypeError
如果日志记录级别不是
logging_level
枚举的实例。
另请参阅
get_flush_level
获取当前的调试日志记录刷新级别。
flush_logger
刷新日志记录器。
示例
>>> import rmm >>> rmm.flush_on(rmm.logging_level.WARN) # set flush level to warn
- rmm.set_logging_level(level)
设置调试日志记录级别。
调试日志记录将消息打印到日志文件。有关更多信息,请参见 调试日志记录。
- 参数:
- levellogging_level
调试日志记录级别。有效值为
logging_level
枚举的实例。
- 抛出:
- TypeError
如果日志记录级别不是
logging_level
枚举的实例。
另请参阅
get_logging_level
获取当前的调试日志记录级别。
示例
>>> import rmm >>> rmm.set_logging_level(rmm.logging_level.WARN) # set logging level to warn
- rmm.should_log(level)
检查给定级别的一条消息是否会被记录。
如果当前调试日志记录级别设置为不低于给定级别的详细程度,并且 RMM 模块编译时的日志记录级别也不低于给定级别,则给定级别的一条消息将被记录。如果这两个条件不同时满足,此函数将返回 false。
调试日志记录将消息打印到日志文件。有关更多信息,请参见 调试日志记录。
- 参数:
- levellogging_level
调试日志记录级别。有效值为
logging_level
枚举的实例。
- 返回:
- should_logbool
如果给定级别的一条消息会被记录,则为 True,否则为 False。
- 抛出:
- TypeError
如果日志记录级别不是
logging_level
枚举的实例。
- rmm.unregister_reinitialize_hook(func)
从在调用
reinitialize()
之前将被调用的钩子列表中移除 func。如果 func 被多次注册,它的所有实例都将从钩子列表中移除。
内存资源
- class rmm.mr.ArenaMemoryResource(DeviceMemoryResource upstream_mr, arena_size=None, bool dump_log_on_failure=False)
-
一个强调避免碎片和支持可扩展并发的子分配器。
- 参数:
- upstream_mrDeviceMemoryResource
用于为内存区域分配内存的 DeviceMemoryResource。
- arena_sizeint, optional
全局内存区域的大小,单位为字节。默认为当前设备可用内存的一半。
- dump_log_on_failurebool, optional
是否在分配失败时转储内存区域。
- 属性:
- upstream_mr
方法
allocate
(self, size_t nbytes, ...)分配
nbytes
字节的内存。deallocate
(self, uintptr_t ptr, ...)释放
ptr
指向的、大小为nbytes
的内存。get_upstream
(self)- allocate(self, size_t nbytes, Stream stream=DEFAULT_STREAM)
分配
nbytes
字节的内存。- 参数:
- nbytessize_t
分配的大小,单位为字节
- streamStream
分配的可选流
- deallocate(self, uintptr_t ptr, size_t nbytes, Stream stream=DEFAULT_STREAM)
释放
ptr
指向的、大小为nbytes
的内存。- 参数:
- ptruintptr_t
要释放的指针
- nbytessize_t
分配的大小,单位为字节
- streamStream
释放的可选流
- get_upstream(self) DeviceMemoryResource
- upstream_mr
- class rmm.mr.BinningMemoryResource(DeviceMemoryResource upstream_mr, int8_t min_size_exponent=-1, int8_t max_size_exponent=-1)
-
根据指定分配大小,从一组指定的“bin”大小中分配内存。
如果指定了 min_size_exponent 和 max_size_exponent,则初始化一个或多个 FixedSizeMemoryResource bin,范围为
[2**min_size_exponent, 2**max_size_exponent]
。调用
add_bin()
添加额外的 bin 分配器。- 参数:
- upstream_mrDeviceMemoryResource
用于分配大于任何 bin 大小的内存资源的分配器。
- min_size_exponentsize_t
要创建的最小尺寸 FixedSizeMemoryResource bin 的以2为底的指数。
- max_size_exponentsize_t
要创建的最大尺寸 FixedSizeMemoryResource bin 的以2为底的指数。
- 属性:
bin_mrs
BinningMemoryResource.bin_mrs: list 获取分 bin 内存资源列表。
- upstream_mr
方法
add_bin
(self, size_t allocation_size, ...)向此内存资源添加一个指定最大分配大小的 bin。
allocate
(self, size_t nbytes, ...)分配
nbytes
字节的内存。deallocate
(self, uintptr_t ptr, ...)释放
ptr
指向的、大小为nbytes
的内存。get_upstream
(self)- add_bin(self, size_t allocation_size, DeviceMemoryResource bin_resource=None)
向此内存资源添加一个指定最大分配大小的 bin。如果指定了 bin_resource,则使用它进行此 bin 的分配。如果未指定,则为此 bin 创建并使用 FixedSizeMemoryResource 进行分配。
小于 allocation_size 且大于下一个更小 bin 大小的分配将使用此固定大小内存资源。
- 参数:
- allocation_sizesize_t
创建的 bin 的最大分配大小,单位为字节
- bin_resourceDeviceMemoryResource
用于此 bin 的资源(可选)
- allocate(self, size_t nbytes, Stream stream=DEFAULT_STREAM)
分配
nbytes
字节的内存。- 参数:
- nbytessize_t
分配的大小,单位为字节
- streamStream
分配的可选流
- bin_mrs
BinningMemoryResource.bin_mrs: list 获取分 bin 内存资源列表。
- deallocate(self, uintptr_t ptr, size_t nbytes, Stream stream=DEFAULT_STREAM)
释放
ptr
指向的、大小为nbytes
的内存。- 参数:
- ptruintptr_t
要释放的指针
- nbytessize_t
分配的大小,单位为字节
- streamStream
释放的可选流
- get_upstream(self) DeviceMemoryResource
- upstream_mr
- class rmm.mr.CallbackMemoryResource(allocate_func, deallocate_func)
-
使用用户提供的可调用对象进行内存分配和释放的内存资源。
CallbackMemoryResource
实际上只应用于调试内存问题,因为为每个内存分配和释放操作使用 Python 函数会带来显著的性能损失。- 参数:
- allocate_func: callable
分配函数必须接受两个参数。一个整数表示要分配的字节数,以及执行分配的 Stream;并返回一个整数,表示指向已分配内存的指针。
- deallocate_func: callable
释放函数必须接受三个参数。一个整数表示指向要释放的内存的指针,第二个整数表示要释放的字节数,以及执行释放的 Stream。
方法
allocate
(self, size_t nbytes, ...)分配
nbytes
字节的内存。deallocate
(self, uintptr_t ptr, ...)释放
ptr
指向的、大小为nbytes
的内存。示例
>>> import rmm >>> base_mr = rmm.mr.CudaMemoryResource() >>> def allocate_func(size, stream): ... print(f"Allocating {size} bytes") ... return base_mr.allocate(size, stream) ... >>> def deallocate_func(ptr, size, stream): ... print(f"Deallocating {size} bytes") ... return base_mr.deallocate(ptr, size, stream) ... >>> rmm.mr.set_current_device_resource( rmm.mr.CallbackMemoryResource(allocate_func, deallocate_func) ) >>> dbuf = rmm.DeviceBuffer(size=256) Allocating 256 bytes >>> del dbuf Deallocating 256 bytes
- allocate(self, size_t nbytes, Stream stream=DEFAULT_STREAM)
分配
nbytes
字节的内存。- 参数:
- nbytessize_t
分配的大小,单位为字节
- streamStream
分配的可选流
- deallocate(self, uintptr_t ptr, size_t nbytes, Stream stream=DEFAULT_STREAM)
释放
ptr
指向的、大小为nbytes
的内存。- 参数:
- ptruintptr_t
要释放的指针
- nbytessize_t
分配的大小,单位为字节
- streamStream
释放的可选流
- class rmm.mr.CudaAsyncMemoryResource
-
使用
cudaMallocAsync
/cudaFreeAsync
进行分配/释放的内存资源。- 参数:
- initial_pool_sizeint | str, optional
初始池大小,单位为字节。默认为设备可用内存的一半。字符串参数使用 parse_bytes 进行解析。
- release_threshold: int, optional
释放阈值,单位为字节。如果池大小超出此值,则池持有的未使用内存将在下一个同步点释放。
- enable_ipc: bool, optional
如果为 True,则允许导出此资源分配的内存的 POSIX 文件描述符句柄,以便可以与 CUDA IPC 一起使用。
方法
allocate
(self, size_t nbytes, ...)分配
nbytes
字节的内存。deallocate
(self, uintptr_t ptr, ...)释放
ptr
指向的、大小为nbytes
的内存。- allocate(self, size_t nbytes, Stream stream=DEFAULT_STREAM)
分配
nbytes
字节的内存。- 参数:
- nbytessize_t
分配的大小,单位为字节
- streamStream
分配的可选流
- deallocate(self, uintptr_t ptr, size_t nbytes, Stream stream=DEFAULT_STREAM)
释放
ptr
指向的、大小为nbytes
的内存。- 参数:
- ptruintptr_t
要释放的指针
- nbytessize_t
分配的大小,单位为字节
- streamStream
释放的可选流
- class rmm.mr.CudaAsyncViewMemoryResource
-
使用
cudaMallocAsync
/cudaFreeAsync
与现有 CUDA 内存池进行分配/释放的内存资源。此资源使用现有的 CUDA 内存池句柄(例如默认池),而不是创建一个新的。这对于与已使用 CUDA 内存池的现有 GPU 应用程序集成或自定义内存池使用的标志非常有用。
传入的内存池在此内存资源的生命周期内不得被销毁。
- 参数:
- pool_handlecudaMemPool_t or CUmemoryPool
CUDA 内存池的句柄,将用于处理分配请求。
方法
allocate
(self, size_t nbytes, ...)分配
nbytes
字节的内存。deallocate
(self, uintptr_t ptr, ...)释放
ptr
指向的、大小为nbytes
的内存。pool_handle
(self)- allocate(self, size_t nbytes, Stream stream=DEFAULT_STREAM)
分配
nbytes
字节的内存。- 参数:
- nbytessize_t
分配的大小,单位为字节
- streamStream
分配的可选流
- deallocate(self, uintptr_t ptr, size_t nbytes, Stream stream=DEFAULT_STREAM)
释放
ptr
指向的、大小为nbytes
的内存。- 参数:
- ptruintptr_t
要释放的指针
- nbytessize_t
分配的大小,单位为字节
- streamStream
释放的可选流
- pool_handle(self)
- class rmm.mr.CudaMemoryResource
-
使用
cudaMalloc
/cudaFree
进行分配/释放的内存资源。方法
allocate
(self, size_t nbytes, ...)分配
nbytes
字节的内存。deallocate
(self, uintptr_t ptr, ...)释放
ptr
指向的、大小为nbytes
的内存。- allocate(self, size_t nbytes, Stream stream=DEFAULT_STREAM)
分配
nbytes
字节的内存。- 参数:
- nbytessize_t
分配的大小,单位为字节
- streamStream
分配的可选流
- deallocate(self, uintptr_t ptr, size_t nbytes, Stream stream=DEFAULT_STREAM)
释放
ptr
指向的、大小为nbytes
的内存。- 参数:
- ptruintptr_t
要释放的指针
- nbytessize_t
分配的大小,单位为字节
- streamStream
释放的可选流
- class rmm.mr.DeviceMemoryResource
基类:
object
方法
allocate
(self, size_t nbytes, ...)分配
nbytes
字节的内存。deallocate
(self, uintptr_t ptr, ...)释放
ptr
指向的、大小为nbytes
的内存。- allocate(self, size_t nbytes, Stream stream=DEFAULT_STREAM)
分配
nbytes
字节的内存。- 参数:
- nbytessize_t
分配的大小,单位为字节
- streamStream
分配的可选流
- deallocate(self, uintptr_t ptr, size_t nbytes, Stream stream=DEFAULT_STREAM)
释放
ptr
指向的、大小为nbytes
的内存。- 参数:
- ptruintptr_t
要释放的指针
- nbytessize_t
分配的大小,单位为字节
- streamStream
释放的可选流
- class rmm.mr.FailureCallbackResourceAdaptor(DeviceMemoryResource upstream_mr, callback)
-
内存资源,在内存分配失败时调用回调函数。
- 参数:
- upstreamDeviceMemoryResource
上游内存资源。
- callbackcallable
内存分配失败时调用的函数。
- 属性:
- upstream_mr
方法
allocate
(self, size_t nbytes, ...)分配
nbytes
字节的内存。deallocate
(self, uintptr_t ptr, ...)释放
ptr
指向的、大小为nbytes
的内存。get_upstream
(self)- allocate(self, size_t nbytes, Stream stream=DEFAULT_STREAM)
分配
nbytes
字节的内存。- 参数:
- nbytessize_t
分配的大小,单位为字节
- streamStream
分配的可选流
- deallocate(self, uintptr_t ptr, size_t nbytes, Stream stream=DEFAULT_STREAM)
释放
ptr
指向的、大小为nbytes
的内存。- 参数:
- ptruintptr_t
要释放的指针
- nbytessize_t
分配的大小,单位为字节
- streamStream
释放的可选流
- get_upstream(self) DeviceMemoryResource
- upstream_mr
- class rmm.mr.FixedSizeMemoryResource(DeviceMemoryResource upstream_mr, size_t block_size=0x100000, size_t blocks_to_preallocate=128)
-
分配固定大小内存块的内存资源。
- 参数:
- upstream_mrDeviceMemoryResource
用于为池分配内存块的 DeviceMemoryResource。
- block_sizeint, optional
要分配的内存块大小(默认为 1MiB)。
- blocks_to_preallocateint, optional
初始化池时要分配的内存块数量。
- 属性:
- upstream_mr
方法
allocate
(self, size_t nbytes, ...)分配
nbytes
字节的内存。deallocate
(self, uintptr_t ptr, ...)释放
ptr
指向的、大小为nbytes
的内存。get_upstream
(self)注意
仅支持小于配置的 block_size 的分配。
- allocate(self, size_t nbytes, Stream stream=DEFAULT_STREAM)
分配
nbytes
字节的内存。- 参数:
- nbytessize_t
分配的大小,单位为字节
- streamStream
分配的可选流
- deallocate(self, uintptr_t ptr, size_t nbytes, Stream stream=DEFAULT_STREAM)
释放
ptr
指向的、大小为nbytes
的内存。- 参数:
- ptruintptr_t
要释放的指针
- nbytessize_t
分配的大小,单位为字节
- streamStream
释放的可选流
- get_upstream(self) DeviceMemoryResource
- upstream_mr
- class rmm.mr.LimitingResourceAdaptor(DeviceMemoryResource upstream_mr, size_t allocation_limit)
-
限制上游内存资源总分配量的内存资源。
- 参数:
- upstream_mrDeviceMemoryResource
上游内存资源。
- allocation_limitsize_t
此分配器允许的最大内存量。
- 属性:
- upstream_mr
方法
allocate
(self, size_t nbytes, ...)分配
nbytes
字节的内存。deallocate
(self, uintptr_t ptr, ...)释放
ptr
指向的、大小为nbytes
的内存。get_allocated_bytes
(self)查询已分配的字节数。
get_allocation_limit
(self)查询此分配器允许分配的最大字节数。
get_upstream
(self)- allocate(self, size_t nbytes, Stream stream=DEFAULT_STREAM)
分配
nbytes
字节的内存。- 参数:
- nbytessize_t
分配的大小,单位为字节
- streamStream
分配的可选流
- deallocate(self, uintptr_t ptr, size_t nbytes, Stream stream=DEFAULT_STREAM)
释放
ptr
指向的、大小为nbytes
的内存。- 参数:
- ptruintptr_t
要释放的指针
- nbytessize_t
分配的大小,单位为字节
- streamStream
释放的可选流
- get_allocated_bytes(self) size_t
查询已分配的字节数。请注意,由于可能的碎片以及此分配器未跟踪的内部页面大小和对齐方式,此方法不能用于了解可能的分配大小。
- get_allocation_limit(self) size_t
查询此分配器允许分配的最大字节数。这是对分配器的限制,而不是对底层设备的表示。设备可能无法支持此限制。
- get_upstream(self) DeviceMemoryResource
- upstream_mr
- class rmm.mr.LoggingResourceAdaptor(DeviceMemoryResource upstream_mr, log_file_name=None)
-
记录上游内存资源执行的分配/释放信息的内存资源。
- 参数:
- upstreamDeviceMemoryResource
上游内存资源。
- log_file_namestr
写入日志文件的路径。
- 属性:
- upstream_mr
方法
allocate
(self, size_t nbytes, ...)分配
nbytes
字节的内存。deallocate
(self, uintptr_t ptr, ...)释放
ptr
指向的、大小为nbytes
的内存。flush
(self)get_file_name
(self)get_upstream
(self)- allocate(self, size_t nbytes, Stream stream=DEFAULT_STREAM)
分配
nbytes
字节的内存。- 参数:
- nbytessize_t
分配的大小,单位为字节
- streamStream
分配的可选流
- deallocate(self, uintptr_t ptr, size_t nbytes, Stream stream=DEFAULT_STREAM)
释放
ptr
指向的、大小为nbytes
的内存。- 参数:
- ptruintptr_t
要释放的指针
- nbytessize_t
分配的大小,单位为字节
- streamStream
释放的可选流
- flush(self)
- get_file_name(self)
- get_upstream(self) DeviceMemoryResource
- upstream_mr
- class rmm.mr.ManagedMemoryResource
-
使用
cudaMallocManaged
/cudaFree
进行分配/释放的内存资源。方法
allocate
(self, size_t nbytes, ...)分配
nbytes
字节的内存。deallocate
(self, uintptr_t ptr, ...)释放
ptr
指向的、大小为nbytes
的内存。- allocate(self, size_t nbytes, Stream stream=DEFAULT_STREAM)
分配
nbytes
字节的内存。- 参数:
- nbytessize_t
分配的大小,单位为字节
- streamStream
分配的可选流
- deallocate(self, uintptr_t ptr, size_t nbytes, Stream stream=DEFAULT_STREAM)
释放
ptr
指向的、大小为nbytes
的内存。- 参数:
- ptruintptr_t
要释放的指针
- nbytessize_t
分配的大小,单位为字节
- streamStream
释放的可选流
- class rmm.mr.PoolMemoryResource(DeviceMemoryResource upstream_mr, initial_pool_size=None, maximum_pool_size=None)
-
合并式最优适应子分配器,使用从上游内存资源分配的内存池。
- 参数:
- upstream_mrDeviceMemoryResource
用于为池分配内存块的 DeviceMemoryResource。
- initial_pool_sizeint | str, optional
初始池大小,单位为字节。默认为设备可用内存的一半。
- maximum_pool_sizeint | str, optional
池可以增长到的最大大小,单位为字节。
- 属性:
- upstream_mr
方法
allocate
(self, size_t nbytes, ...)分配
nbytes
字节的内存。deallocate
(self, uintptr_t ptr, ...)释放
ptr
指向的、大小为nbytes
的内存。get_upstream
(self)pool_size
(self)- allocate(self, size_t nbytes, Stream stream=DEFAULT_STREAM)
分配
nbytes
字节的内存。- 参数:
- nbytessize_t
分配的大小,单位为字节
- streamStream
分配的可选流
- deallocate(self, uintptr_t ptr, size_t nbytes, Stream stream=DEFAULT_STREAM)
释放
ptr
指向的、大小为nbytes
的内存。- 参数:
- ptruintptr_t
要释放的指针
- nbytessize_t
分配的大小,单位为字节
- streamStream
释放的可选流
- get_upstream(self) DeviceMemoryResource
- pool_size(self)
- upstream_mr
- class rmm.mr.PrefetchResourceAdaptor(DeviceMemoryResource upstream_mr)
-
预取所有分配的内存资源。
- 参数:
- upstreamDeviceMemoryResource
上游内存资源。
- 属性:
- upstream_mr
方法
allocate
(self, size_t nbytes, ...)分配
nbytes
字节的内存。deallocate
(self, uintptr_t ptr, ...)释放
ptr
指向的、大小为nbytes
的内存。get_upstream
(self)- allocate(self, size_t nbytes, Stream stream=DEFAULT_STREAM)
分配
nbytes
字节的内存。- 参数:
- nbytessize_t
分配的大小,单位为字节
- streamStream
分配的可选流
- deallocate(self, uintptr_t ptr, size_t nbytes, Stream stream=DEFAULT_STREAM)
释放
ptr
指向的、大小为nbytes
的内存。- 参数:
- ptruintptr_t
要释放的指针
- nbytessize_t
分配的大小,单位为字节
- streamStream
释放的可选流
- get_upstream(self) DeviceMemoryResource
- upstream_mr
- class rmm.mr.SamHeadroomMemoryResource(size_t headroom)
-
使用
malloc
/free
进行分配/释放的内存资源。- 参数:
- headroomsize_t
作为 headroom 保留的 GPU 内存大小
方法
allocate
(self, size_t nbytes, ...)分配
nbytes
字节的内存。deallocate
(self, uintptr_t ptr, ...)释放
ptr
指向的、大小为nbytes
的内存。- allocate(self, size_t nbytes, Stream stream=DEFAULT_STREAM)
分配
nbytes
字节的内存。- 参数:
- nbytessize_t
分配的大小,单位为字节
- streamStream
分配的可选流
- deallocate(self, uintptr_t ptr, size_t nbytes, Stream stream=DEFAULT_STREAM)
释放
ptr
指向的、大小为nbytes
的内存。- 参数:
- ptruintptr_t
要释放的指针
- nbytessize_t
分配的大小,单位为字节
- streamStream
释放的可选流
- class rmm.mr.StatisticsResourceAdaptor(DeviceMemoryResource upstream_mr)
-
跟踪上游内存资源执行的当前、峰值和总分配/释放的内存资源。包括随时查询这些统计信息的能力。
维护一个计数器堆栈。使用
push_counters()
和pop_counters()
在不同的嵌套级别跟踪统计信息。- 参数:
- upstreamDeviceMemoryResource
上游内存资源。
- 属性:
allocation_counts
StatisticsResourceAdaptor.allocation_counts: Statistics
- upstream_mr
方法
allocate
(self, size_t nbytes, ...)分配
nbytes
字节的内存。deallocate
(self, uintptr_t ptr, ...)释放
ptr
指向的、大小为nbytes
的内存。get_upstream
(self)pop_counters
(self)从堆栈中弹出一对计数器(字节数和分配次数)
push_counters
(self)将一对新的计数器(字节数和分配次数)压入堆栈
- allocate(self, size_t nbytes, Stream stream=DEFAULT_STREAM)
分配
nbytes
字节的内存。- 参数:
- nbytessize_t
分配的大小,单位为字节
- streamStream
分配的可选流
- allocation_counts
StatisticsResourceAdaptor.allocation_counts: Statistics
获取当前、峰值和总分配字节数以及分配次数。
字典键包括
current_bytes
,current_count
,peak_bytes
,peak_count
,total_bytes
和total_count
。- 返回
dict: 包含分配次数和字节数的字典。
- deallocate(self, uintptr_t ptr, size_t nbytes, Stream stream=DEFAULT_STREAM)
释放
ptr
指向的、大小为nbytes
的内存。- 参数:
- ptruintptr_t
要释放的指针
- nbytessize_t
分配的大小,单位为字节
- streamStream
释放的可选流
- get_upstream(self) DeviceMemoryResource
- pop_counters(self) Statistics
从堆栈中弹出一对计数器(字节数和分配次数)
- 返回:
- 弹出的统计信息
- push_counters(self) Statistics
将一对新的计数器(字节数和分配次数)压入堆栈
- 返回:
- 压栈 _之前_ 的统计信息
- upstream_mr
- class rmm.mr.SystemMemoryResource
-
使用
malloc
/free
进行分配/释放的内存资源。方法
allocate
(self, size_t nbytes, ...)分配
nbytes
字节的内存。deallocate
(self, uintptr_t ptr, ...)释放
ptr
指向的、大小为nbytes
的内存。- allocate(self, size_t nbytes, Stream stream=DEFAULT_STREAM)
分配
nbytes
字节的内存。- 参数:
- nbytessize_t
分配的大小,单位为字节
- streamStream
分配的可选流
- deallocate(self, uintptr_t ptr, size_t nbytes, Stream stream=DEFAULT_STREAM)
释放
ptr
指向的、大小为nbytes
的内存。- 参数:
- ptruintptr_t
要释放的指针
- nbytessize_t
分配的大小,单位为字节
- streamStream
释放的可选流
- class rmm.mr.TrackingResourceAdaptor(DeviceMemoryResource upstream_mr, bool capture_stacks=False)
-
记录和跟踪上游内存资源执行的分配/释放的内存资源。如果需要,可以查询所有未完成的分配,并包含堆栈跟踪信息。
- 参数:
- upstreamDeviceMemoryResource
上游内存资源。
- capture_stacksbool
是否在每次分配时捕获堆栈跟踪。
- 属性:
- upstream_mr
方法
allocate
(self, size_t nbytes, ...)分配
nbytes
字节的内存。deallocate
(self, uintptr_t ptr, ...)释放
ptr
指向的、大小为nbytes
的内存。get_allocated_bytes
(self)查询已分配的字节数。
返回一个字符串,其中包含当前未完成分配的信息。
get_upstream
(self)如果启用,则将 get_outstanding_allocations_str 的输出记录到当前的 RMM 日志文件。
- allocate(self, size_t nbytes, Stream stream=DEFAULT_STREAM)
分配
nbytes
字节的内存。- 参数:
- nbytessize_t
分配的大小,单位为字节
- streamStream
分配的可选流
- deallocate(self, uintptr_t ptr, size_t nbytes, Stream stream=DEFAULT_STREAM)
释放
ptr
指向的、大小为nbytes
的内存。- 参数:
- ptruintptr_t
要释放的指针
- nbytessize_t
分配的大小,单位为字节
- streamStream
释放的可选流
- get_allocated_bytes(self) size_t
查询已分配的字节数。请注意,由于可能的碎片以及此分配器未跟踪的内部页面大小和对齐方式,此方法不能用于了解可能的分配大小。
- get_upstream(self) DeviceMemoryResource
- log_outstanding_allocations(self)
如果启用,则将 get_outstanding_allocations_str 的输出记录到当前的 RMM 日志文件。
- upstream_mr
- class rmm.mr.UpstreamResourceAdaptor
-
跟踪上游资源的内存资源的父类。
上游资源跟踪需要维护对上游 mr 的引用,以便它保持活动状态,并可由任何下游资源适配器访问。
- 属性:
- upstream_mr
方法
allocate
(self, size_t nbytes, ...)分配
nbytes
字节的内存。deallocate
(self, uintptr_t ptr, ...)释放
ptr
指向的、大小为nbytes
的内存。get_upstream
(self)- allocate(self, size_t nbytes, Stream stream=DEFAULT_STREAM)
分配
nbytes
字节的内存。- 参数:
- nbytessize_t
分配的大小,单位为字节
- streamStream
分配的可选流
- deallocate(self, uintptr_t ptr, size_t nbytes, Stream stream=DEFAULT_STREAM)
释放
ptr
指向的、大小为nbytes
的内存。- 参数:
- ptruintptr_t
要释放的指针
- nbytessize_t
分配的大小,单位为字节
- streamStream
释放的可选流
- get_upstream(self) DeviceMemoryResource
- upstream_mr
- rmm.mr.available_device_memory()
返回可用和总设备内存的元组。
- rmm.mr.disable_logging()
如果之前使用 rmm.initialize() 或 rmm.enable_logging() 启用了日志记录,则禁用日志记录。
- rmm.mr.enable_logging(log_file_name=None)
为所有设备启用运行时事件的日志记录。
- 参数:
- log_file_name: str, 可选
日志文件的名称。如果未指定,则使用环境变量 RMM_LOG_FILE。如果两者均不可用,则抛出 ValueError。每个设备都会生成一个单独的日志文件,并且后缀 “.dev{id}” 会自动添加到日志文件名称中。
注意
请注意,如果在启用日志记录的情况下使用环境变量 CUDA_VISIBLE_DEVICES,后缀可能与您的预期不同。例如,如果设置 CUDA_VISIBLE_DEVICES=1,生成的日志文件后缀仍将是 0。类似地,如果设置 CUDA_VISIBLE_DEVICES=1,0 并使用设备 0 和 1,后缀为 0 的日志文件将对应于设备 ID 为 1 的 GPU。使用 rmm.get_log_filenames() 获取每个设备对应的日志文件名称。
- rmm.mr.get_current_device_resource() DeviceMemoryResource
获取当前设备上用于 RMM 设备分配的内存资源。
如果在不同的设备是活动 CUDA 设备时使用返回的内存资源,则行为未定义。
- rmm.mr.get_current_device_resource_type()
获取当前设备上用于 RMM 设备分配的内存资源类型。
- rmm.mr.get_log_filenames()
返回正在使用的每个设备的日志文件名称(如果未写入日志,则返回 None)。
示例
>>> import rmm >>> rmm.reinitialize(devices=[0, 1], logging=True, log_file_name="rmm.log") >>> rmm.get_log_filenames() {0: '/home/user/workspace/rapids/rmm/python/rmm.dev0.log', 1: '/home/user/workspace/rapids/rmm/python/rmm.dev1.log'}
- rmm.mr.get_per_device_resource(int device)
获取指定设备的默认内存资源。
如果在不同的设备是活动 CUDA 设备时使用返回的内存资源,则行为未定义。
- 参数:
- deviceint
要获取内存资源的设备的 ID。
- rmm.mr.get_per_device_resource_type(int device)
获取指定设备上用于 RMM 设备分配的内存资源类型。
- 参数:
- deviceint
设备 ID
- rmm.mr.is_initialized()
检查 RMM 是否已初始化
- rmm.mr.set_current_device_resource(DeviceMemoryResource mr)
为当前设备设置默认内存资源。
- 参数:
- mrDeviceMemoryResource
要设置的内存资源。必须在当前设备是活动 CUDA 设备时创建。
- rmm.mr.set_per_device_resource(int device, DeviceMemoryResource mr)
为指定设备设置默认内存资源。
- 参数:
- deviceint
要获取内存资源的设备的 ID。
- mrDeviceMemoryResource
要设置的内存资源。必须在设备是活动 CUDA 设备时创建。
内存分配器
- rmm.allocators.cupy.rmm_cupy_allocator(nbytes)
利用 RMM 的 CuPy 分配器。
示例
>>> from rmm.allocators.cupy import rmm_cupy_allocator >>> import cupy >>> cupy.cuda.set_allocator(rmm_cupy_allocator)
- class rmm.allocators.numba.RMMNumbaManager(*args, **kwargs)
-
用于 Numba 的外部内存管理插件实现。仅提供设备上分配。
有关此处实现的接口的详细信息,请参阅 https://numba.readthedocs.io/en/stable/cuda/external-memory.html。
- 属性:
interface_version
返回一个整数,指定插件实现支持的 EMM Plugin 接口的版本。
方法
返回一个上下文管理器,当它处于活动状态时,禁用当前上下文中映射或固定的主机内存的清理。
get_ipc_handle
(memory)获取 MemoryPointer 内存的 IPC 句柄,其偏移量由 RMM 内存池修改。
返回上下文中内存的
(free, total)
大小,单位为字节。执行 EMM 插件实例准备就绪所需的任何初始化操作。
memalloc
(size)从 RMM 池分配设备上数组。
memhostalloc
(size[, mapped, portable, wc])实现固定主机内存的分配。
mempin
(owner, pointer, size[, mapped])实现主机内存的固定(pinning)。
reset
()清除当前上下文中所有主机内存(映射和/或固定)。
memallocmanaged
- defer_cleanup()
返回一个上下文管理器,当它处于活动状态时,禁用当前上下文中映射或固定的主机内存的清理。
覆盖此方法的 EMM 插件必须在 yield 之前从此方法获取上下文管理器,以确保主机分配的清理也被延迟。
- get_ipc_handle(memory)
获取 MemoryPointer 内存的 IPC 句柄,其偏移量由 RMM 内存池修改。
- get_memory_info()
返回上下文中内存的
(free, total)
大小,单位为字节。此实现会引发 NotImplementedError,因为分配将使用 rmm 当前设置的默认 mr 执行,而该 mr 可能是一个池分配器。
- initialize()
执行 EMM 插件实例准备就绪所需的任何初始化操作。
- 返回:
无
- property interface_version
返回一个整数,指定插件实现支持的 EMM Plugin 接口的版本。对于此版本规范的实现,应始终返回 1。
- memalloc(size)
从 RMM 池分配设备上数组。
- memallocmanaged(size, attach_global)
- memhostalloc(size, mapped=False, portable=False, wc=False)
实现固定主机内存的分配。
建议 EMM 插件实现不要覆盖此方法 - 而是使用
numba.cuda.BaseCUDAMemoryManager
。
- mempin(owner, pointer, size, mapped=False)
实现主机内存的固定(pinning)。
建议 EMM 插件实现不要覆盖此方法 - 而是使用
numba.cuda.BaseCUDAMemoryManager
。
- reset()
清除当前上下文中所有主机内存(映射和/或固定)。
覆盖此方法的 EMM 插件必须调用
super().reset()
,以确保主机分配也被清理。
内存统计信息
- class rmm.statistics.ProfilerRecords
基类:
object
分析器记录的内存统计信息记录。
- 属性:
records
将记录名称映射到其内存统计信息的字典。
方法
MemoryRecord
([num_calls, memory_total, ...])单个代码块的内存统计信息。
add
(name, data)将内存统计信息添加到名为 name 的记录中。
report
([ordered_by])美化记录的内存统计信息格式。
- class MemoryRecord(num_calls: int = 0, memory_total: int = 0, memory_peak: int = 0)
基类:
object
单个代码块的内存统计信息。
- 属性:
- num_calls
此代码块被调用的次数。
- memory_total
已分配的总字节数。
- memory_peak
分配的峰值字节数。
方法
add
- add(name: str, data: Statistics) None
将内存统计信息添加到名为 name 的记录中。
此方法是线程安全的。
- 参数:
- name
记录的名称。
- data
name 的内存统计信息。
- property records: dict[str, MemoryRecord]
将记录名称映射到其内存统计信息的字典。
- class rmm.statistics.Statistics(current_bytes: int, current_count: int, peak_bytes: int, peak_count: int, total_bytes: int, total_count: int)
基类:
object
{get,push,pop}_statistics()
返回的统计信息。- 属性:
- current_bytes
当前分配的字节数
- current_count
当前分配的数量
- peak_bytes
分配的峰值字节数
- peak_count
分配的峰值数量
- total_bytes
已分配的总字节数
- total_count
已分配的总数量
- rmm.statistics.enable_statistics() None
启用分配统计信息。
此函数是幂等的。如果已为当前的 RMM 资源栈启用统计信息,则此操作无效。
警告
这会修改当前的 RMM 内存资源。StatisticsResourceAdaptor 会被推到当前的 RMM 内存资源栈上,并且在统计信息收集过程中必须始终保持为最顶层的资源。
- rmm.statistics.get_statistics() Statistics | None
获取当前的分配统计信息。
- 返回:
- 如果已启用,则返回当前跟踪的统计信息。
- 如果已禁用,则返回 None。
- rmm.statistics.pop_statistics() Statistics | None
弹出当前分配统计信息栈的计数器。
这会返回当前跟踪的统计信息的计数器,并将其从栈中弹出。
如果统计信息已禁用(当前内存资源不是 StatisticsResourceAdaptor 的实例),则此函数无效。
- 返回:
- 如果已启用,则返回弹出的计数器。
- 如果已禁用,则返回 None。
- rmm.statistics.profiler(*, records: ProfilerRecords = ProfilerRecords({}), name: str = '')
用于分析函数或代码块的装饰器和上下文。
如果统计信息已启用(当前内存资源是 StatisticsResourceAdaptor 的实例),则此装饰器会记录被装饰函数或代码块的内存统计信息。
如果统计信息已禁用,则此装饰器/上下文无效。
- 参数:
- records
内存统计信息写入的分析器记录。如果未设置,则使用默认的分析器记录。
- name
内存配置的名称,当分析器用作上下文管理器时必填。如果用作装饰器,允许名称为空。在这种情况下,名称是文件名、行号和函数名。
- rmm.statistics.push_statistics() Statistics | None
在当前分配统计信息栈上压入新的计数器。
这会返回当前跟踪的统计信息,并在统计信息栈上压入一组新的零计数器。
如果统计信息已禁用(当前内存资源不是 StatisticsResourceAdaptor 的实例),则此函数无效。
- 返回:
- 如果已启用,则返回弹出*之前*当前跟踪的统计信息。
- 如果已禁用,则返回 None。
- rmm.statistics.statistics()
启用分配统计信息的上下文。
如果统计信息已启用(当前内存资源是 StatisticsResourceAdaptor 的实例),则在进入上下文时会将新的计数器压入当前分配统计信息栈,并在退出时使用 push_statistics() 和 push_statistics() 再次弹出。
如果统计信息尚未启用,则在进入上下文时会将新的 StatisticsResourceAdaptor 设置为当前的 RMM 内存资源,并在退出时再次移除。
- 抛出:
- ValueError
如果在上下文中更改了当前的 RMM 内存源。