范文健康探索娱乐情感热点
投稿投诉
热点动态
科技财经
情感日志
励志美文
娱乐时尚
游戏搞笑
探索旅游
历史星座
健康养生
美丽育儿
范文作文
教案论文

CANN算子利用迭代器高效实现Tensor数据切割分块处理

  摘要:本文以Diagonal算子为例,介绍并详细讲解如何利用迭代器对n维Tensor进行基于位置坐标的大批量数据读取工作。
  本文分享自华为云社区《CANN算子:利用迭代器高效实现Tensor数据切割分块处理-云社区-华为云》,作者: CatherineWang 。 任务场景及目标
  在CANN aicpu算子开发实现中,经常需要对n维Tensor进行切片(slice)、切块(dice)、转置(transpose)、交换指定维度数据(shuffle)等操作。上述操作实质上是按照指定规律依次进行数据读取,并将读取到的数据写入新的数据地址中。
  本文以Diagonal算子为例,介绍并详细讲解如何利用迭代器对n维Tensor进行基于位置坐标的大批量数据读取工作。
  Diagonal算子希望对指定两个维度的数据进行对角元素的提取,最终返回张量的对角线元素。本质上该算子通过属性dim1和dim2确定一个矩阵,返回该矩阵的对角元素(存在偏移量offset),并将其放置在最后一维。非dim1和dim2的维度,将会被当成batch维度处理。 常规方案:
  方案一: 将shape为s,元素个数为numel的 输入Tensor:x转化为Eigen::Tensor:eigen_x;对eigen_x进行shuffle操作,将dim1和dim2换至倒数第二和倒数第一维;通过reshape操作将eigen_x变化为一个三维Eigen::Tensor:reshape_x,shape=(numel/ s[dim1]/s[dim2],s[dim1],s[dim2]);对后两维数据取对角元素,并将最终数据赋值给输出数据地址。 注意: 由于Eigen::Tensor不能够动态设置维度,即NumIndices_项必须是一个具体的值,因此需要提前定义对应维度的Eigen::Tensor备用。
  方案二: 对于一个n维的Tensor,利用n层for循环进行数据的定位读取,并取对角值。
  可以看出上述两个方案对动态大小的输入计算实现处理都较为繁琐,需要提前分情况设置对应维度的Eigen::Tensor或是for循环逻辑结构,即存在维数限制。 准备知识及分析
  我们知道再AICPU中,对于一个Tensor,我们能够通过GetTensorShape、GetData等函数获得Tensor形状大小、具体数据地址等信息。但我们不能通过位置坐标的形式直接获得指定位置的数据值。 1.步长
  首先介绍步长(stride)这一概念(对这部分知识已掌握的可以直接跳转下一部分内容)。stride是在指定维度dim中从一个元素跳到下一个元素所必需的步长。例如,对于一个shape=(2, 3, 4, 5)的Tensor,其stride=(60, 20, 5, 1)。因此如果想要获取到上述Tensor中位置坐标为[1, 2, 1, 3]的数据,只需要找到数据地址中第108(=60*1+20*2+5*1+3)位对应值。 2.迭代器
  定义迭代器PositionIterator,包含私有成员pos_和shape_,其中pos_为初始位置,shape_为标准形状。通过重载++符号,对pos_进行修改,实现迭代器的自增操作。基于上述迭代器,可以实现对给定的shape依次取位操作。如给定对于给定的shape=(d_1,d_2,…,d_n),从初始位置(0,0,…,0)开始,依次取(0,0,…,0,0), (0,0,…,0,1),…,(0,0,…,0,d_n-1), (0,0,…,1,0), (0,0,…,1,1),…, (d_1 - 1,d_2 - 1,…,d_{n-1}-1,d_{n}-1).
  事实上,可以将上述迭代器理解为一种进制,对于给定的标准形状shape_=(d_1,d_2,…,d_n),第i位运算时便是逢d_i进1。同时通过 PositionIterator  .End()控制迭代器的结束。具体实现如下:  template   class PositionIterator {  public:  PositionIterator(){};  ~PositionIterator(){};  PositionIterator(std::vector stt, std::vector sh) {  if (stt.size() != sh.size()) {  PositionIterator();  } else {  for (unsigned int i = 0; i < sh.size(); i++) {  if (stt[i] >= sh[i]) {  PositionIterator();  }  }  pos_ = stt;  shape_ = sh;  }  }  PositionIterator operator++() {  pos_[shape_.size() - 1] += 1;  for (unsigned int i = shape_.size() - 1; i > 0; i--) {  if (pos_[i] / shape_[i] != 0) {  pos_[i - 1] += pos_[i] / shape_[i];  pos_[i] = pos_[i] % shape_[i];  }  }  return *this;  }  bool End() {  if (pos_[0] != shape_[0]) {  return false;  }  return true;  }  std::vector GetPos() { return pos_; }  std::vector GetShape() { return shape_; }  private:  std::vector pos_;  std::vector shape_;  };Diagonal算子的实现
  利用迭代器,在一般情况下,我们只需要两层for循环,便可以实现Diagonal算子的计算过程。第一层for循环用于确定除dim1和dim2维度的位置坐标,第二层for循环用于对dim1和dim2对应维度确定对角元素位置,通过这样的两层for循环,便可将对角元素位置确定。通过这样的取值处理,相较于Eigen实现思路,计算速度有着明显的提升,且无维度限制,st测试结果对比如下:
  具体实现可参见如下代码:  template   uint32_t DiagonalCpuKernel::DoComputeType(CpuKernelContext &ctx,  const int64_t &offset,  const int64_t &dim1,  const int64_t &dim2) {  // Get the inuput and output  Tensor *input_x = ctx.Input(0);  Tensor *y = ctx.Output(0);  // Get some information of input  auto x_shape = input_x->GetTensorShape();  std::vector x_shape_ = x_shape->GetDimSizes();  const int64_t x_dim = x_shape->GetDims();  auto dataptr = reinterpret_cast(ctx.Input(0)->GetData());  auto y_dataptr = reinterpret_cast(y->GetData());  // Compute  // 首先计算出对角线元素个数  int64_t dsize = OffsetSize(offset, dim1, dim2, x_shape_);  // 生成输入Tensor的步长向量x_stride  std::vector x_stride = ConstructStride(x_shape_);  // 分情况讨论,2维和大于2维的情况  if (x_dim != N2) {  //set the vx_shape and vx_stride  // 生成x_shape和x_stride中除去dim1和dim2对应值的vx_shape与vx_stride  std::vector vx_shape, vx_stride;  for (unsigned int tmp_dim = 0; tmp_dim < x_shape_.size(); tmp_dim++) {  if (tmp_dim != dim1 && tmp_dim != dim2) {  vx_shape.push_back(x_shape_[tmp_dim]);  vx_stride.push_back(x_stride[tmp_dim]);  }  }  // set the y_shape, y_stride, vy_stride  // 生成输出Tensor的形状及步长向量:y_shape和y_stride  std::vector y_shape = vx_shape;  y_shape.push_back(dsize);  std::vector y_stride =  ConstructStride(y_shape);  // 生成输出Tensor的出去最后一维的步长向量:vy_stride  std::vector vy_stride = y_stride;  vy_stride.pop_back();  // 读取对角数据  std::vector v_start(vx_shape.size(), 0);  for (PositionIterator myiter(v_start, vx_shape); !myiter.End();  ++myiter) {  // 利用迭代器确定除dim1和dim2维度的位置坐标  auto p = myiter.GetPos();  // 通过步长向量和位置坐标计算出输入和输出的基础位置值base_pos1和outbase_pos  int64_t base_pos1 = MulSum(p, vx_stride);  int64_t outbase_pos = MulSum(p, vy_stride);  for (int i = 0; i < dsize; i++) {  // 结合前面计算出的基础位置值,对dim1和dim2对应维度确定对角元素位置,并赋值给输出数据地址(get_data涉及对上对角还是下对角取元素,不影响对迭代器作用的理解)  int64_t base_pos2 = i * (x_stride[dim1] + x_stride[dim2]);  int64_t arr[N2] = {x_stride[dim1], x_stride[dim2]};  y_dataptr[outbase_pos + i] =  get_data(base_pos1 + base_pos2, offset, arr, dataptr);  }  }  } else {  for (int i = 0; i < dsize; i++) {  int64_t base_pos = i * (x_stride[dim1] + x_stride[dim2]);  int64_t arr[N2] = {x_stride[dim1], x_stride[dim2]};  y_dataptr[i] = get_data(base_pos, offset, arr, dataptr);  }  }  return KERNEL_STATUS_OK;  }迭代器的其他用法
  1、数据切条:如Sort算子中,用迭代器对Tensor数据关于tmp_axis维度进行取条,以进行后续的排序操作。  for (position_iterator mit(v_start, v_shape); !mit.end(); ++mit) {  auto p = mit.get_pos();  int axis_len = input_shape_[tmp_axis];  std::vector> data_(axis_len);  int base_pos = mul_sum(p, v_stride);  for (int32_t i = 0; i < axis_len; i++) {  data_[i].value = x_dataptr[base_pos + i * input_stride[tmp_axis]];  data_[i].index = i;  }
  2、数据切块:切块处理可以利用两个迭代器循环叠加,也可以利用一个迭代器和两个坐标位置for循环
  3、关于指定维度dim,对Tensor降维拆分为N子Tensor:如UniqueConsecutive算子中,首先需要关于属性axis维,将原本的Tensor数据拆分为input_shape[axis]个子Tensor(此处用vector存储Tensor中的数据)。  std::vector> data_;  for (int64_t i = 0; i < dim0; i++) {  std::vector tmp_v1;  for (PositionIterator mit(v_start, v_shape); !mit.End(); ++mit) {  auto pos = mit.GetPos();  tmp_v1.push_back(  x_dataptr[MulSum(pos, v_stride) + i * input_stride[axis]]);  }  data_.push_back(tmp_v1);  }
  点击下方,第一时间了解华为云新鲜技术~
  华为云博客_大数据博客_AI博客_云计算博客_开发者中心-华为云

美景美食醉游人镇江宝堰古镇乡村旅游迎来春天扬子晚报网2月20日讯(记者张凌发通讯员李国平谭雪妍)连日来,虽然是正月的尾声乍暖还寒,但镇江市宝堰镇却迎来了络绎不绝的游客。他们都是冲着古镇的老味道和乡间各种花卉而来的。常州金坛未来一个月,这些渭南美景即将上线好雨知时节,当春乃发生接下来的一个月,这些渭南美景即将上线!小编特意提前准备了一份精致的赏花图鉴送给屏幕前的你准备好迎接这份惊喜了吗?1美人梅花期3月中旬4月中旬观赏点位推荐仓程路恒创科技ChatGPT引爆AI火出圈?AI在云计算中到底起什么作用?近两个月,ChatGPT引爆AI新时代,话题热度不断上升。其实,随着技术的发展,AI已被广泛用于云计算,以提升云计算的智能水平。同样地,云计算技术对人工智能的发展提供了强大的支持,多措并举建设宜居宜业和美乡村版式设计汪哲平扎实推进宜居宜业和美乡村建设扎实推进农村人居环境整治提升2月13日,中共中央国务院发布关于做好2023年全面推进乡村振兴重点工作的意见,对全面推进乡村振兴作出重大部署黑龙江省年内将基本完成存量危房整治近日,黑龙江省住建厅下发关于下达2023年黑龙江省农村房屋安全隐患整治工作任务的通知。依据通知,2023年全省将基本完成存量危房整治任务。通知提出,对存在的安全隐患,要区分情况,采云游霞浦霞浦百亩樱花娇艳绽放,美不胜收!近日,霞浦县松城街道玉潭樱花谷景区迎来最佳观赏期,6万株樱花迎春绽放,浪漫绚烂如云似霞,美不胜收。山谷内,朵朵樱花绽放枝头,一簇簇,一朵朵,层层叠叠,远看灿若山边云霞,近看宛若少女广西德保绿水两岸民众赏桃迎春来源中国新闻网图为河岸桃花正透红。黄少将摄图为游客在河边赏花。黄少将摄图为民众在游玩赏花。黄少将摄图为一位女士在为小朋友拍照片。何颖摄图为游客驻足桃花林赏花拍照。黄少将摄图为游客在争分夺秒拼经济创新主体加速聚集青山湖区高新技术企业蓬勃发展青山湖区围绕强化企业创新主体地位,大力培育高新技术企业,加大对企业帮扶力度,鼓励企业心无旁骛搞生产,争分夺秒拼经济,奋力实现一季度精彩开局。走进江西光明智能科技有限公司的生产车间,福建漳平樱花绽放美不胜收来源人民网福建漳平樱花绽放美不胜收福建漳平樱花绽放美不胜收2福建漳平樱花绽放美不胜收3福建漳平樱花绽放美不胜收4福建漳平樱花绽放美不胜收5福建漳平樱花绽放美不胜收6福建漳平樱花绽放中国男篮16人名单出炉,谁有望成为意外的惊喜?中国男篮名单公布,后卫赵继伟郭艾伦赵睿胡明轩吴前程帅澎崔永熙,前锋张镇麟朱俊龙周鹏朱旭航曾凡博焦泊乔,中锋周琦胡金秋王哲林。有老将也有新人,三人有望成为中国男篮乔一期的意外惊喜。张女单四强正式出炉!国乒24岁世界冠军退赛,陈梦不战而胜直接晋级北京时间2023年2月21日,国乒队内选拔赛进入第4个比赛日,开赛前传来突发消息,24岁世界冠军王曼昱和张瑞都因为发烧退赛,张瑞本来要跟陈梦打生死战,这样的话,陈梦不战而胜直接晋级
蒸烤一体集成灶买对了才好用,重点看2部分,其中的8个细节要牢记头条创作挑战赛家用传统油烟机的变化还是比较大的。例如现在的集成灶,就是新型的替代油烟机的产品。另外大家会发现,现在的集成灶又以蒸烤一体集成灶为主流。蒸烤一体集成灶的功能更多,功能更浩辰CAD2023新功能让CAD图纸加密锁定防修改soeasy!作为一名CAD设计师,有时不仅需要为了创新设计快速制图而绞尽脑汁,还需要为了图纸泄密客户拿图不付款等图纸数据安全问题而斗智斗勇耗费心力。但面对层出不穷的套路深操作,总会遇到马失前蹄钟欣潼娇媚可人畅聊数码新品这样写好像暴露自己年龄了。钟欣潼与蔡卓妍组成演唱组合Twins出道娱乐圈时,我还在读书,那时手机是新鲜事物和贵价品,要一万元一台,够交两年学费。那时拥有一台BB机的学生电脑重装系统后文件还能恢复吗?恢复文件的详细图文教程电脑重装系统,简单来说就是重新安装电脑的操作系统。一般选择重新安装电脑的系统,无非是电脑蓝屏系统运行速度慢崩溃死机等问题。很多人会有疑惑,电脑重装系统后文件还能恢复吗?重装系统会造服装实用裁剪系列之领子篇圆形领领线及其变化沿颈根部呈圆形的领口线叫圆形领领线。衣片原型的领口也属于圆领的一种。领口大小要根据设计的不同而进行变化。小的领口显得朴实,大的领口显得祖露。那些脖颈短而粗的人,较适合开口稍大一些的一组1996年的上海街拍美女照片,惊叹上海不愧是中国的时尚之都充满青春气息的着装,流行的搭配即使放在今天也不会过时。没有浓妆艳抹有的只是清纯纯真的美。当年时尚的模特服装,色彩斑斓,应该也不输巴黎圈吧?大哥大,那个时代的产物,看来能在上海手持大赵丽颖杨幂倪妮开年封面争艳不断网友冯绍峰赢麻了新年伊始,众多女明星又有杂志封面了,其85花中赵丽颖杨幂倪妮的最有看点,三位女星展现出了不同的风格。杨幂登时装开年封面,造型精明干练,有点女总裁的感觉了。摄影与阳光的巧妙搭配,也营及腰长发变稻草美学顶流的手笔?上个月4号,闫女士去剪头发。她说当时被店员一番推销,第二天又去做了烫染。没想到,原来的一头及腰长发,现在感觉像稻草。1818黄金眼及腰长发剪完像是稻草美学顶流的手笔?闫女士先给记者变幻莫测的镶嵌技艺,领略下奢侈品的魅力!来自法国的顶级珠宝品牌VanCleefArpels(梵克雅宝),除了嗷嗷贵的价格外,最让圈内外珠宝爱好者追捧的,当属VCA家变幻莫测的镶嵌技艺。在VCA所有的私房镶嵌大法中,名为M百度AI公有云市场第一,含金量是多少?主打AI的云战略,是百度在这个竞争激烈的市场上独特的竞争优势。其中,AI公有云是百度现金流业务,AI算法和软件定制是面向现实的打法,AI算力和大模型是面向未来的布局文吴俊宇编辑谢丽苹果放出两段iPhone14宣传视频IT之家1月11日消息,苹果于本周一在官方YouTube频道上放出两段iPhone14宣传视频。其中一段主要凸显ActionMode,而另一段视频则介绍了UnsendiMessag