转载地址:【MindSpore训练营第五期】Cache单节点缓存模块笔记分享_MindSpore_昇腾论坛_华为云论坛
作者:Jack20
【MindSpore训练营第五期】Cache单节点缓存模块笔记分享
AI数据高速加载直通车
--单节点数据缓存
Cache单节点缓存模块可用于缓存预处理后的训练数据,加速数据加载,提升数据复用率,降低数据预处理所需的CPU算力
对于需要重复访问远程的数据集或需要重复从磁盘中读取数据集的情况,可以使用单节点缓存算子将数据集缓存于本地内存中,以加速数据集的读取。 缓存算子依赖于在当前节点启动的缓存服务器,缓存服务器作为守护进程独立于用户的训练脚本而存在,主要用于提供缓存数据的管理,支持包括存储、查找、读取以及发生缓存未命中时对于缓存数据的写入等操作。
对比使用数据缓存和不使用数据缓存的数据加载流程pipeline,第一个,是不使用数据缓存服务的常规数据处理流程
1.缓存加载后的原始数据,用户可以在数据集加载算子中使用缓存。这将把加载完成的数据存到缓存服务器中,后续若需相同数据则可直接从中读取,避免从磁盘中重复加载。
2.缓存经过数据增强操作后的数据,用户也可在Map算子中使用缓存。这将允许我们直接缓存数据增强(如图像裁剪、缩放等)处理后的数据,避免数据增强操作重复进行,减少了不必要的计算量。
3. 以上两种类型的缓存本质上都是为了提高数据复用,以减少数据处理过程耗时,提高网络训练性能。
Cache的三个重要组件
(1)缓存算子
1.对于mappable的数据集(如ImageFolder)的pipeline,Cache将创建名为CacheLookupOp和CacheMergeOp的两个缓存算子,并对pipeline做出相应的调整。
2.见于上图Mappable数据集图示,左边的数据处理pipeline,当用户在MapOp后插入缓存算子后,经过Cache变换调整过程,将对pipeline进行变换并最终将其调整为右图中包含CacheLookupOp和CacheMergeOp两个缓存算子的结构
3.对于包含non-mappable的数据集(如TFRecord)的pipeline,我们将创建名为CacheOp的缓存算子,并在pipeline相应位置插入CacheOp。见于上图Non-mappable数据集图示,左边的数据处理pipeline,当用户在MapOp后插入缓存算子后,经过Cache变换调整过程,将对pipeline进行变换并最终将其调整为右图中包含CacheOp缓存算子的结构。
(2)缓存服务器
主要负责响应缓存客户端所发送的请求,提供缓存数据的查找、读取,以及发生缓存未命中时对于缓存数据的写入等功能。缓存服务器拥有自己的工作队列,不断循环从工作队列中获取一个请求去执行并将结果返回给客户端。同一个缓存服务器可以为多个缓存客户端提供服务,且缓存服务器通过缓存客户端的session_id以及该缓存客户端所对应的数据处理pipeline的crc码来唯一确定该缓存客户端。因此,两个完全一致的pipeline可以通过指定相同的session_id来共享同一个缓存服务,而不同的pipeline若试图共享同一个缓存客户端则会报错。
1.Cache_server如何启动?
Cache Server的服务由一个外部守护进程提供,在用户使用Cache服务之前,需要先在mindspore外部启动一个服务器守护进程,来与缓存客户进行交互沟通;
ms_cache_server start|session [–m <mem_size>] [-d <spill_path>] [-nospill] [-h <host>] [-p <port>]
#Command: start | session
#start
#– starts the service
#session
#– creates a new caching session, returning the session_id as output
然后启动
cache_admin --start
2.cache_server创建时默认的port端口号是多少?
默认对IP为127.0.0.1(localhost)且端口号为50052的服务器执行操作
(3)缓存客户端
主要负责与缓存服务器建立通讯,向缓存服务器发起数据读取、数据写入、状态查询等请求。缓存客户端与服务器之间通过gRPC进行通讯,如下图所示:当客户端需要发起请求时,仅需要将请求添加到gRPC函数库所提供的gRPC队列,由gRPC线程不断循环从gRPC队列中获取一个请求并将该请求发送到缓存服务器的工作队列中。当缓存服务器需要将处理后的响应数据返回给客户端时,也通过类似的方式将响应数据添加到gRPC队列中,并依赖gRPC实际将数据传输至客户端。
3.cache_client实体在创建时,其<session_id>如何获取?
唯一标识与缓存服务的连接session。应该从ms_cache_service session命令返回的session_id。当给出该选项时,缓存的大小和溢出行为取自session。如果未给出值,则假设这是唯一的通道,没有其他通道将共享此缓存。在这种情况下,将自动生成一个session_id。
ms_cache_server start|session [–m <mem_size>] [-d <spill_path>] [-nospill] [-h <host>] [-p <port>]
#Command: start | session
#– creates a new caching session, returning the session_id as output
若缓存服务器中不存在缓存会话,则需要创建一个缓存会话,得到缓存会话id:
其中3231564523为端口50052的服务器分配的缓存会话id,缓存会话id由服务器分配。
参考
[1]www.mindspore.cn
[2]gitee.com/mindspore
[3]github.com/mindspore-ai