• [API使用] 【Mindspore】【detach】Pytorch detach 功能有对应API吗?
    【功能模块】Pytorch detach API , Mindspore找不到对应【操作步骤&问题现象】【截图信息】
  • [问题求助] 【NPU产品】【npu亲和库接口功能使用】如何使用PyTorch算子(由昇腾开发)
    为了优化模型在npu上的性能,我想用npu的亲和库的算子来替代原生的torch算子,但是华为官方这边只给了算子的清单,但没有说怎么使用,我现在想调用昇腾适配的torch算子但是他编译器说找不到该算子,请问我应该怎么找到该算子的准确路径呢?
  • [算子开发] 【AICPU算子】在进行自定义算子的pytorch适配时,无法调用到之前自定义的算子
    【操作步骤&问题现象】1、我已经按照要求实现了自定义算子,并通过了ut和st测试。并且已经在5.1.RC1的环境上成功部署了自定义算子并通过了st测试。2、我已经编写了pytorch适配中需要的npu函数和ut测试脚本,但在运行ut脚本时会出错【截图信息】报错信息yaml文件中的算子定义npu实现函数ut测试脚本中对该算子的调用
  • [问题求助] 【Atlas200模块】【Pytorch功能】安装torch_npu插件出错
  • [问题求助] 关于pytorch模型适配Ascend910的一些问题
    【功能模块】本人想将之前在gpu上训练的bert-ner模型迁移至Ascend910上进行单卡训练,参考文档后进行了如下修改。1.在启动脚本中指定使用昇腾910进行训练CALCULATE_DEVICE = 'npu:0'torch.npu.set_device(CALCULATE_DEVIC)2.将模型从host侧放到npumodel = model.to(CALCULATE_DEVIC)3.将训练数据从host侧放到npu for k, v in inputs.items():                if isinstance(v, torch.Tensor):                    inputs[k] = v.to(args.device)感觉需要修改的东西不多,长得就不大像能够成功迁移的样子,结果然报了错误。想问一下各位大牛们,迁移过程中如果只考虑能够跑通,除上述3点外还需要注意哪些部分,有没有详细的学习材料呢?
  • [应用开发] yolov5推理后的数据如何处理,gitee上的Yolov5_for_Pytorch资源不存在了
    最近在用atlas200进行推理(Python版),用的是yolov5的模型,模型转换(pt->onnx->om)成功并且跑通了。模型推理后输出大小如图符合yolov5的3个输出的大小。现在有个问题,如何进行数据的后处理?参考这个回答,里面有yolov5的示例,但是示例中提到的Yolov5_for_Pytorch示例不存在。还有这个示例相关的资料吗,或者相关数据后处理的资料?
  • [问题求助] Pytorch框架适配昇腾硬件 loss不收敛
    【功能模块】本人使用huggerface bert-base模型,迁移至昇腾硬件上进行训练后出现了loss不收敛问题。迁移过程中共进行了如下修改1.设置device为npu:02.加载训练数据至npuinputs = inputs.to('npu:0', non_blocking=True)3.加载预训练模型至npuself.model = model.to('npu:0') if model is not None else None4.开启apexmodel, self.optimizer = amp.initialize(model, self.optimizer, opt_level="O2", loss_scale=None)【操作步骤&问题现象】迁移完成后可以在Atlas800-9000上进行训练,训练速度也较快,但出现了loss不收敛的问题。根据官方文档,出现不收敛问题后尝试更改了opt_level、loss_scale和lr,但依旧不收敛请问这个问题是什么原因导致的?我又该如何修改我的脚本呢?附件中有我的trainer.py文件,望高人解答。
  • [算子编译] 想在mindspore中使用类似pytorch_wavelets库进行小波变换请问如何实现
    如题
  • [技术干货] 更新版yolov5_deepsort_pytorch实现目标检测和跟踪[转载]
    由于mikel-brostrom在github上发布的Yolov5_DeepSort_Pytorch更新,使整个代码封装性更好,进而允许采用多种REID特征识别模型,完善了deepsort在检测跟踪方面的性能。本博文记录如何使用此版本Yolov5_DeepSort_Pytorch的过程,同时给出ZQPei REID模型的修改方法,以适应mikel-brostrom更新版本。使用Yolov5_DeepSort_Pytorch默认的osnet REID实现跟踪track.pyYolov5_DeepSort_Pytorch中包含了两个链接目录yolov5和reid,不能一次性把github中的代码克隆下来,因此,需分别将三个github代码克隆到本地。Yolov5_DeepSort_Pytorch: git clone https://github.com/mikel-brostrom/Yolov5_DeepSort_PytorchYolov5: git clone https://github.com/ultralytics/yolov5REID: git clone https://github.com/KaiyangZhou/deep-person-reid假定你的deepsort目录为your_dir,是第一个克隆下来的目录。第二个克隆目录是yolov5,将yolov5目录放在your_dir目录下,即your_dir/yolov5。第三个克隆目录是reid,放到your_dir/deep_sort/deep目录下,your_dir/deep_sort/deep/reid。假定已经安装了conda和虚拟环境,且安装好运行Yolov5_DeepSort_Pytorch所需的模块。进入reid目录,运行python setup.py develop1如此,即安装好KaiyangZhou的REID环境。下载yolov5模型权重,放入目录your_dir/yolov5/weights从KaiyangZhou的github中,Model zoo里下载权重文件,例如osnet_x1_0.pth,放到checkpoint目录:your_dir/deep_sort/deep/checkpoint。(1)修改deep_sort/configs/deep_sort.yamlDEEPSORT:  MODEL_TYPE: "osnet_x1_0"      REID_CKPT:  '~/your_dir/deep_sort/deep/checkpoint/osnet_x1_0_imagenet.pth'  MAX_DIST: 0.1 # 0.2 The matching threshold. Samples with larger distance are considered an invalid match  MAX_IOU_DISTANCE: 0.7 # 0.7 Gating threshold. Associations with cost larger than this value are disregarded.  MAX_AGE: 90 # 30 Maximum number of missed misses before a track is deleted  N_INIT: 3 # 3  Number of frames that a track remains in initialization phase  NN_BUDGET: 100 # 100 Maximum size of the appearance descriptors gallery  MIN_CONFIDENCE: 0.75  NMS_MAX_OVERLAP: 1.0这里,增加REID_CKPT,把某些参数设置放到yaml文件中,尽可能减少track.py命令行中的输入参数。(2)修改track.py中DeepSort类实例的参数定义deepsort = DeepSort(    cfg.DEEPSORT.MODEL_TYPE,                        cfg.DEEPSORT.REID_CKPT,   # 添加checkpoint路径                        device,                        max_dist=cfg.DEEPSORT.MAX_DIST,                        max_iou_distance=cfg.DEEPSORT.MAX_IOU_DISTANCE,                        max_age=cfg.DEEPSORT.MAX_AGE,                         n_init=cfg.DEEPSORT.N_INIT,                         nn_budget=cfg.DEEPSORT.NN_BUDGET,                        )此处增加了一个reid权重文件路径参数,故也需在DeepSort类定义中增加该参数model_path,修改deep_sort/deep_sort.py,__init__():class DeepSort(object):    def __init__(self, model_type, model_path, device, max_dist=0.2, min_confidence=0.3, nms_max_overlap=1.0, max_iou_distance=0.7, max_age=70, n_init=3, nn_budget=100, use_cuda=True):        self.min_confidence = min_confidence        self.nms_max_overlap = nms_max_overlap        self.extractor = FeatureExtractor(            model_name=model_type,            model_path = model_path,            device=str(device)        )        max_cosine_distance = max_dist        metric = NearestNeighborDistanceMetric(            "cosine", max_cosine_distance, nn_budget)        self.tracker = Tracker(            metric, max_iou_distance=max_iou_distance, max_age=max_age, n_init=n_init)注:mikel好像又改了有关model_path的引入方法,我感觉太复杂,故还是用以上的修改办法,其目的就是从deep_sort/deep/checkpoint中找到权重文件路径,避免从网上下载权重文件,或者从本地缓存.torch中去找权重。(3)运行deepsort跟踪程序,命令行选项中给出一种比较全的选项python track.py --yolo_model ~/your_dir/yolov5/weights/yolov5s.pt \   // yolov5权文件                --source  ~/your_dir/video_demo.mp4 \           // 输入视频文件                --show-vid \            // 显示跟踪视频                --classes 0 2   \           // 0 = 行人类别, 2=小汽车类别。                --save-txt    \           // 输出兼容MOT16格式文件                --save-vid  \           // 保存跟踪视频其中,classes 0 表示yolov5检测对象为行人,类型号0。更改ZQPei REID模型文件此模型文件命名为model_ZQP.py,放入目录 deep_sort/deep/reid/torchreid/models模型更改只需添加一个定义函数 def ZQP()import torchimport torch.nn as nnimport torch.nn.functional as Fclass BasicBlock(nn.Module):    def __init__(self, c_in, c_out, is_downsample=False):        super(BasicBlock, self).__init__()        self.is_downsample = is_downsample        if is_downsample:            self.conv1 = nn.Conv2d(                c_in, c_out, 3, stride=2, padding=1, bias=False)        else:            self.conv1 = nn.Conv2d(                c_in, c_out, 3, stride=1, padding=1, bias=False)        self.bn1 = nn.BatchNorm2d(c_out)        self.relu = nn.ReLU(True)        self.conv2 = nn.Conv2d(c_out, c_out, 3, stride=1,                               padding=1, bias=False)        self.bn2 = nn.BatchNorm2d(c_out)        if is_downsample:            self.downsample = nn.Sequential(                nn.Conv2d(c_in, c_out, 1, stride=2, bias=False),                nn.BatchNorm2d(c_out)            )        elif c_in != c_out:            self.downsample = nn.Sequential(                nn.Conv2d(c_in, c_out, 1, stride=1, bias=False),                nn.BatchNorm2d(c_out)            )            self.is_downsample = True    def forward(self, x):        y = self.conv1(x)        y = self.bn1(y)        y = self.relu(y)        y = self.conv2(y)        y = self.bn2(y)        if self.is_downsample:            x = self.downsample(x)        return F.relu(x.add(y), True)def make_layers(c_in, c_out, repeat_times, is_downsample=False):    blocks = []    for i in range(repeat_times):        if i == 0:            blocks += [BasicBlock(c_in, c_out, is_downsample=is_downsample), ]        else:            blocks += [BasicBlock(c_out, c_out), ]    return nn.Sequential(*blocks)class Net(nn.Module):                 def __init__(self, num_classes=751, pretrained=True, loss = 'softmax', **kwargs):   # market1501=751, dukemtmcreid=702        super(Net, self).__init__()   # Net        # 3 128 64        self.conv = nn.Sequential(            nn.Conv2d(3, 64, 3, stride=1, padding=1),            nn.BatchNorm2d(64),            nn.ELU(inplace=True),        )        self.layer1 = make_layers(64, 64, 2, False)        self.layer2 = make_layers(64, 128, 2, True)        self.layer3 = make_layers(128, 256, 2, True)        self.layer4 = make_layers(256, 512, 2, True)        #self.avgpool = nn.AvgPool2d((8,4),1)        self.adaptiveavgpool = nn.AdaptiveAvgPool2d(1)        self.classifier = nn.Sequential(            nn.Linear(512, 256),            nn.BatchNorm1d(256),            nn.ReLU(inplace=True),            nn.Dropout(),            nn.Linear(256, num_classes),        )    def forward(self, x):        x = self.conv(x)        x = self.layer1(x)        x = self.layer2(x)        x = self.layer3(x)        x = self.layer4(x)        #x = self.avgpool(x)        x = self.adaptiveavgpool(x)   #        x = x.view(x.size(0),-1)        # B x 128        if not self.training:            x = x.div(x.norm(p=2,dim=1,keepdim=True))               return x        # classifier        x = self.classifier(x)        return xdef ZQP(num_classes=751, pretrained=True, loss='softmax', **kwargs):    model = Net(        num_classes=num_classes,         pretrained = pretrained,        loss = 'softmax',        **kwargs    )    return modelif __name__ == '__main__':    net = Net(pretrained=True)  # Net    x = torch.randn(4, 3, 256, 256)  # 128, 64    y = net(x)下面将模型ZQP添加到REID的定义文件中deep_sort/deep/reid/torchreid/models/__init__.py中引入ZQP模型文件,添加:from .model_ZQP import *1在字典__model_factory中添加模型名称ZQP:__model_factory = {# image classification models    'resnet18': resnet18,    'resnet34': resnet34,    'resnet50': resnet50,......    'ZQP': ZQP现在,只要修改deep_sort/configs/deep_sort.yaml中的MODEL_TYPE和REID_CKPT路径,就可运行ZQPei的reid模型ckpt.t7。  MODEL_TYPE: "ZQP"      REID_CKPT:  '~/your_dir/deep_sort/deep/checkpoint/ckpt.t7'另外,由于ZQPei reid模型训练中resize为128x64(hxw),故需修改deep_sort/deep/reid/torchreid/utils/feature_extractor.py中的image_sizedef __init__(        self,        model_name='',        model_path='',        image_size=(128, 64),           #(256, 128)  (h, w)        pixel_mean=[0.485, 0.456, 0.406],        pixel_std=[0.229, 0.224, 0.225],        pixel_norm=True,        device='cuda',        verbose=True    ):至此,我们完成了添加ZQP reid模型到KaiyangZhou REID模型中的整个过程,并可以用同样的命令行参数,运行track.pyreid模型训练deepsort中有两个神经网络模型,一个是目标检测模型yolov5,另一个是特征识别模型reid。yolov5模型训练有很多文章可参考,省略,此处侧重谈谈reid模型的训练。KaiyangZhou给出识别行人特征的reid模型训练方法,训练程序deep_sort/deep/reid/scripts/main.py。训练可分别采用两个数据集:Market-1501和DukeMTMC-reID。Market-1501数据集:训练数据集”bounding_box_train“有751个行人ID,包含 12,936 张图像,平均每人有17.2张训练数据;测试集“bounding_box_test”有750个行人ID,包含19,732张图像,平均每人有26.3张测试数据。查询集gally从测试集中挑选出750个行人在6个摄像头下的图片,共3368 张查询图像。dukemtmc-reid数据集:“bounding_box_test”——用于测试集的 702 人,包含 17,661 张图像(随机采样,702 ID + 408 distractor ID)“bounding_box_train”——用于训练集的 702 人,包含 16,522 张图像(随机采样)“query”——为测试集中的 702 人在每个摄像头中随机选择一张图像作为 query,共有 2,228 张图像只要从网上下载这两个数据集,使用其安排好的目录结构无需更改,只要指出数据集的根目录。以下给出ZQPei模型在dukemtmc-reid数据集的训练方法构造配置文件:deep_sort/deep/reid/configs/ZQP_128x64.yamlmodel:  name: 'ZQP'  pretrained: True #Truedata:  type: 'image'  sources: ['dukemtmcreid']  targets: ['dukemtmcreid']       # market1501,  dukemtmcreid  height: 128  width: 64  combineall: False  transforms: ['random_flip']    #random_flip random_erase  color_jitter  save_dir: 'deep_sort/deep/reid/log/ZQP'loss:  name: 'softmax'  softmax:    label_smooth: Truetrain:  optim: 'amsgrad'  lr: 0.0015  max_epoch: 40  #150  batch_size: 64  fixbase_epoch: 10   #10  open_layers: ['classifier']  #'classifier'  lr_scheduler: 'cosine'# stepsize: [60]test:  batch_size: 300  dist_metric: 'euclidean'  normalize_feature: False  evaluate:  False  #test only  eval_freq: -1  rerank: False运行训练程序main.pypython main.py \    --config-file  deep_sort/deep/reid/configs/ZQP_128x64.yaml   \    --root  ~/your_datasets/dukemtmc_reid   \    model.load_weights ~/your_dir/deep_sort/deep/checkpoint/ckpt.t7这里,在配置文件ZQP_128x64.yaml中pretrained = True,表示需加载预先训练的权重ckpt.t7。如果从头开始训练,则pretrained = False,并在命令行中删除model.load_weights项。命令行指定配置文件ZQP_128x64.yaml,数据集根目录dukemtmc_reid。此外,采用dukemtmc训练数据集行人ID数为702,所以,需更改特征类型为702, 即模型文件model_ZQP.py中num_classes=702。数据集目录组成应为:~/your_datasets/dukemtmc_reid/dukemtmc-reid/DukeMTMC-reID/bounding_box_test, bounding_box_train, query用逗号分开的项目表示在DukeMTMC-reID目录下有三个子目录bounding_box_test、bounding_box_train和query。用自己的数据集训练reid要利用KaiyangZhou reid训练程序,需要将数据集构造成market-1501的结构形式,即bounding_box_train, bounding_box_test, guery。下面是一个例子,用veri-wild提供的小汽车数据集来构造符合market-1501构成形式的数据集。veri-wild提供了包含40多万张4万辆汽车的id图片,每个汽车ID目录下有多张不同摄像机和不同时刻获取的汽车图片。假定选择800个汽车ID组成训练集,另外800个汽车ID组成测试集,从测试集中取出每个汽车ID在每个摄像头下的图片,组成query。(1)从veri-wild中分别抽取800个ID放入train_800和test_800,每个ID的图片在20-30张之间。(2)对train_800和test_800图片进行resize,压缩数据集容量。(3)按照market-1501文件命名规则更改数据集图片名称,并从test数据集挑选图片放入query。由此,仿照market-1501构成训练reid的小汽车数据集,进行汽车特征的reid特征识别模型。参考程序如下:import osfrom shutil import copyfile, copytree, rmtreefrom torch.functional import broadcast_shapesfrom PIL import Imageimport matplotlib.pyplot as pltimport randomimport shutildef get_cam_n(f_list):      # 构造列表[file_name, camera_ID],列表抽取,每个camera_ID只取一项。    A = []    for cam_n in range(1,7):        for j in range(len(f_list)):            B = f_list[j][1]             if (f_list[j][1] == cam_n):                A.append(f_list[j])                break    return Adef make_fileprefix(src_dir, tar_dir, gallary_dir):   # src_dir 带ID子目录的数据集目录,ID子目录下是同一ID的图片。    for subdir in os.listdir( src_dir ):   # ID子目录名称        src=src_dir+"/"+subdir        f_list = []        for file_name in os.listdir(src):  # 提取ID子目录内文件名称            fileprefix= os.path.splitext(file_name)[0]            cam_n = random.randint(1,6)            A1=[fileprefix, cam_n]            f_list.append(A1)            file_name1 = subdir+ "_c"+str( cam_n) +"_f" +    fileprefix + ".jpg"            copyfile(src+"/"+file_name, tar_dir+"/"+file_name1)  #将各子目录文件添加prefix,拷贝到一个目标文件夹tar_dir            print("copyfile: ", file_name1)        f_cam=get_cam_n(f_list)           # 列表[file_name, camera_ID],每个camera_ID只有一张图片。        for i in range(len(f_cam)):       # 从 test中抽取图片到query            file_prefix = f_cam[i][0]            cam_n = f_cam[i][1]            file_name1 = subdir+ "_c"+str( cam_n) +"_f" +    file_prefix + ".jpg"            file_name0 = src+"/"+file_prefix+'.jpg'            copyfile(file_name0, gallary_dir+"/"+file_name1)  #将各子目录文件添加prefix,拷贝到一个目标文件夹tar_dir    returndef image_resize(src_dir, tar_dir):    for subdir in os.listdir( src_dir ):   # ID子目录名称        src=src_dir+"/"+subdir        tar_ID_dir=tar_dir+"/"+subdir        if  os.path.isdir(tar_ID_dir):            rmtree(tar_ID_dir)        os.mkdir(tar_ID_dir)            for file_name in os.listdir(src):  # 提取ID子目录中文件名称            img=Image.open(src+"/"+file_name)            w, h =img.size        #img.show()            imax = max(h,w)            if imax < 280:                copyfile(src+"/"+file_name, tar_ID_dir+"/"+file_name)            else:                rate_hw = 280/imax                w,h = int(rate_hw*w), int(rate_hw*h)                new_img = img.resize((w, h),Image.BILINEAR)            #new_img.show()                new_img.save(tar_ID_dir+"/"+file_name)            print(tar_ID_dir+"/"+file_name)        returnif __name__ == '__main__':    src_dir = "~/your_datasets/resize/train_800"    tar_dir = "~/your_datasets/train_box"    if  os.path.isdir(tar_dir):        rmtree(tar_dir)    os.mkdir(tar_dir)    gallary_dir = "your_datasets/resize/gallary"    if  os.path.isdir(gallary_dir):        rmtree(gallary_dir)    os.mkdir(gallary_dir)    make_fileprefix(src_dir, tar_dir, gallary_dir)    ————————————————版权声明:本文为CSDN博主「王定邦」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。原文链接:https://blog.csdn.net/weixin_44238733/article/details/123805195
  • [调试调优] 【使用mindspore复现segmenter语义分割算法时,loss一直在一个范围内附近波动,降不下去】
    【功能模块】使用mindspore复现segmenter语义分割算法【操作步骤&问题现象】1、即使训练了很多个epoch,  精度一直下降不了,一直在1~2左右,测试出来的miou也是一个非常低的值,例如0.01982.  目前尝试过不同的优化器SGD,ADam, AdamW等,学习率策略也尝试过多种,初始学习率也尝试过0.001-0.01不等3.  模型初始化的值和pytorch版本一致,也尝试过其他的不同初始化方式,loss还是没法下降4.  模型结构,算子和pytorch版segmenter一致,pytorch版本能正常收敛,loss在第二个epoch就下降到了0-1的范围能否有大佬帮忙解决一下,非常感谢!【截图信息】
  • [经验分享] 使用MindStudio进行Pytorch离线推理全流程
    使用MindStudio进行Pytorch离线推理全流程1 MindStudio环境搭建本次实验在MindStudio上进行,请先按照教程 配置环境,安装MindStudio。MindStudio的是一套基于华为自研昇腾AI处理器开发的AI全栈开发工具平台,该IDE上功能很多,涵盖面广,可以进行包括网络模型训练、移植、应用开发、推理运行及自定义算子开发等多种任务。MindStudio除了具有工程管理、编译、调试、运行等一般普通功能外,还能进行性能分析,算子比对,可以有效提高工作人员的开发效率。除此之外,MindStudio具有远端环境,运行任务在远端实现,对于近端的个人设备的要求不高,用户交互体验很好,可以让我们随时随地进行使用。2 VPN安装和配置安装好MindStudio后,需要配置远程环境。请按照教程 进行VPN客户端的安装与配置。安装好VPN后,可以先在终端用ssh指令测试连接。(这一步是验证网络连接是否可用,也可以跳过)3 创建推理工程打开MindStudio,点击New Project,进入新建工程界面。选择Ascend APP。填入项目名spnasnet_100。首次新建训练工程时,需要配置CANN的版本。点击Change。点击 + 配置远程连接,然后根据选项填入自己服务器的ip地址、端口号、用户名和密码等。配置Remote CANN location。该参数需要填入ascend-toolkit在服务器上的路径地址。在这里,我们toolkit的路径如下:/usr/local/Ascend/ascend-toolkit/5.1.RC1。点击finishing进行配置。初次配置时时间稍长,请耐心等待。点击Next,选择Pytorch Project。点击Finish,完成工程创建,进入工程主界面。4 配置SSH和Deployment在MindStudio的远程服务中,定义了SSH 配置和Deployment两个概念。前者SSH 配置类似MobaxTerm中的Session的概念,用户可以保存多个远程服务器的连接配置。后者Deployment管理远程开发时的本地文件与远程文件的同步。配置好Deployment后,我们就可以像使用本地python环境一样去使用远程的python环境了。点击File -> Settings -> Tools,即可看到两个设置的入口,下面分别介绍如何配置他们。4.1 配置SSH首先点击SSH Configurations,再点击 + 配置远程连接,然后根据选项填入自己服务器的ip地址、端口号、用户名和密码等。测试成功点击Apply即可保存配置,以后就可以一键连接啦!4.2 配置DeploymentDeployment配置能够更精准地连接远程服务,它需要选择一个SSH连接定位远程主机,然后设置本地与远程项目目录的对应关系。如下图所示创建一个新的Deployment。如图310是我创建的Deployment名字,首先选择连接哪一个SSH服务,然后测试连接是否可用。下一步,设置项目目录映射关系,点击Mappings,然后选择本地的项目目录和远程的项目目录(最好是提前创建好文件夹),接下来跑代码的时候MindStudio会保证这两个目录文件的同步。配置好Mappings后,建议配置Excluded Paths,因为MindStudio的默认同步行为会把Mappings对应目录的文件保持完全相同,这意味着只存在于远程的数据集文件夹会被删除(如果本地没有数据集)。在此我配置了几个需要排除的文件夹目录。5 配置远程python解释器现在,SSH和Deployment的映射关系已经配置好了,但是MindStudio还不知道python解释器的位置。因此,下面将介绍如何配置python解释器。点击File -> Project Structure->SDKs可以看到如图所示的界面。点击+号,可以新增python SDK和JDK。这里只演示Python的添加方法。点击Add Python SDK后,将弹出下图所示的界面,点击左侧的SSH Interpreter,如下图所示,首先选择使用哪一个Deployment,这是刚刚我们配置过的。然后选择python解释器的路径。图中的路径是MindStudio自动检测出来的,但一般需要自己找自己的Python环境安装目录。如果是conda环境,可以使用which python找到python的安装路径。然后点击Project,选择刚才添加到MindStudio中的python解释器,将其作为本项目使用的解释器。6 数据集准备6.1 数据预处理上传好数据集以后,执行 preprocess_spnasnet_100_pytorch.py脚本,生成数据集预处理后的bin文件。第一个参数为原始数据验证集(.jpeg)所在路径,第二个参数为输出的二进制文件(.bin)所在路径。每个图像对应生成一个二进制文件。MindStudio会首先上传本地文件到远程服务器,将本地的文件同步到远程这个过程可能很慢,同步完成后开始运行Python代码,MindStudio会实时地在控制台打印输出:6.2 生成数据集info文件执行get_info.py脚本,生成数据集信息文件。第一个参数为模型输入的类型,第二个参数为生成的bin文件路径,第三个为输出的info文件,第四、第五个为宽高信息。执行结果:7 模型转换本模型基于开源框架PyTorch训练的spnasnet_100进行模型转换。先使用PyTorch将模型权重文件.pth转换为.onnx文件,再使用ATC工具将.onnx文件转为离线推理模型文件.om文件。首先获取权重文件。单击Link 在PyTorch开源框架获中取经过训练的spnasnet_100权重文件model_best.pth.tar,源码中已提供下载权重文件。7.1 导出onnx文件使用pthtar2onnx.py脚本将.pth文件转换为.onnx文件7.2 导出om文件从onnx转为om需要用atc工具,MindStudio提供了atc工具的窗口化应用,它会根据用户选择自动生成atc指令。Model Converter的入口如图所示:选择onnx模型路径,模型输出名称,目标设备,输入格式和batchsize等信息。MindStudio自动生成如下atc指令,用户可以在此做最后的校验,点击Finish即可开始进行模型转换。模型转换成功:8 模型推理使用benchmark工具进行推理。这个和前面的python脚本不同,它在MindStudio中属于ACL应用,可以如图所示创建应用:点击 + 号,再点击Ascend App:然后进行如下配置:参数详情请参见《CANN推理benchmark工具用户指南》 。推理后的输出默认在当前目录result下。执行结果:运行出错:error while loading shared libraries: libascendcl.so: cannot open shared object file: No such file or directory.这个错误是因为没有配置好环境变量。因为我们在终端运行它时,一般要先执行一下:source /usr/local/Ascend/ascend-toolkit/set_env.sh,这一步操作在MindStudio中可以通过如图所示的方法配置环境变量解决:变量内容就是/usr/local/Ascend/ascend-toolkit/set_env.sh的内容,读者可以直接复制使用。LD_LIBRARY_PATH=/usr/local/Ascend/ascend-toolkit/latest/lib64:/usr/local/Ascend/ascend-toolkit/latest/lib64/plugin/opskernel:/usr/local/Ascend/ascend-toolkit/latest/lib64/plugin/nnengine:$LD_LIBRARY_PATH;PYTHONPATH=/usr/local/Ascend/ascend-toolkit/latest/python/site-packages:/usr/local/Ascend/ascend-toolkit/latest/opp/op_impl/built-in/ai_core/tbe:$PYTHONPATH;PATH=/usr/local/Ascend/ascend-toolkit/latest/bin:/usr/local/Ascend/ascend-toolkit/latest/compiler/ccec_compiler/bin:$PATH;ASCEND_AICPU_PATH=/usr/local/Ascend/ascend-toolkit/latest;ASCEND_OPP_PATH=/usr/local/Ascend/ascend-toolkit/latest/opp;TOOLCHAIN_HOME=/usr/local/Ascend/ascend-toolkit/latest/toolkit;ASCEND_HOME_PATH=/usr/local/Ascend/ascend-toolkit/latest设置变量后,再次启动运行,可以在控制台看到,在执行benchmark前,会首先export环境变量。修改后代码运行成功:可以获得batch16 310单卡吞吐率为1379.94×4 = 5519.76 fps9 精度验证调用vision_metric_ImageNet.py脚本与数据集标签val_label.txt比对,可以获得Accuracy Top5数据,结果保存在result.json中。第一个参数为生成推理结果所在路径,第二个参数为标签数据,第三个参数为生成结果文件路径,第四个参数为生成结果文件名称。获得精度数据如下:310 Top1 accuracy为74.2%,Top5 accuracy为91.94%。
  • [网络迁移] 【pytorch bicubic模式interpolate插值算子转换om失败 】
    执行pytorch模型down_1 = F.interpolate(down_1, size=left.size()[2:], mode='bicubic', align_corners=True)的采样算子转换为om时报错,操作是先将pytorch转换为opt11的onnx模型,再将onnx转换为om。提示如下错误E79999: Inner Error!E79999  onnx_plugin op_name[Resize_24], Unsupported interpolation mode[FUNC:ParseOpToGraphResize][FILE:resize_plugin.cc][LINE:145]        Get one to many graph failed for op:Resize_24.[FUNC:ExpandOneToManyGraph][FILE:parser_utils.cc][LINE:94]        Model parse to graph failed, graph name:SimTestModel.[FUNC:ModelParseToGraph][FILE:onnx_parser.cc][LINE:842]        ATC model parse ret fail.[FUNC:ParseGraph][FILE:omg.cc][LINE:810]ONNX Resize算子信息
  • [经验分享] 使用MindStudio进行Pytorch模型迁移以及推理
    1. MindStudio环境搭建    MindStudio是一套基于IntelliJ框架的开发工具链平台,提供了应用开发,调试,Profiling工具,模型转换,模型可视化等功能,以及对开发者来说至关重要的精度对比,自定义算子等重要功能,同时还提供了网络移植,优化和分析功能,方便用户开发应用程序。    按照平台安装教程安装MindStudio即可完成本部分的环境搭建。2.模型简介    本次实验我们的目标是在MindStudio上使用ResNet进行图像分类任务。ResNet曾在ILSVRC2015比赛中获得冠军,在图像分类上具有很大的潜力。ResNet的主要思想是在网络中增加了直连通道,使得原始输入信息能够直接传入到后面的层中,ResNet的结构如下图所示。ResNet会将残差块串联,形成多层网络。一般常见的ResNet根据层数的大小有ResNet-18, ResNet-34, ResNet-50, ResNet-101等。3. 创建推理工程    打开MindStudio,点击New Project,进入新建工程界面。选择Ascend App。填入项目名resNext101_32x8d。首次新建训练工程时,需要配置CANN的版本。点击Change。点击 + 配置远程连接,然后根据选项填入自己服务器的IP地址、端口号、用户名和密码等。配置Remote CANN location。该参数需要填入ascend-toolkit在服务器上的路径地址。在这里,我们的toolkit路径如下/usr/local/Ascend/ascend-toolkit/5.1.RC1。点击finishing进行配置。点击Next,选择Pytorch Project。点击Finish,完成工程创建,进入工程主界面。4. 将环境部署到远端Mind Studio可以支持实时的将本地文件夹内容同步到服务器,可以达到像自己电脑上执行模型推理一样的效果,此过程需要两个步骤。点击File->Settings->Tools,即可看到两个设置的入口。配置ssh                首先点击SSH Configuration,再点击 + 配置远程连接,然后根据选项填入自己的服务器ip地址,端口号,用户名和密码。部署本地文件夹        相当于将远端服务器的路径与本地文件夹形成一个对应关系。Deployment配置能够更精准地连接远程服务,他需要选择一个SSH连接来定位远程主机,然后设置本地与远程项目目录的对应关系。首先选择连接哪SSH服务,然后测试连接是否可用。下一步,设置项目目录映射关系,点击Mappings,然后选择本地的项目目录和远程的项目目录(最好提前创建文件夹),接下来跑代码的时候MindStudio会保证这两个目录文件的同步。配置好Mappings之后,建议配置Excluded Paths, 因为MindStudio默认行为会把Mappings目录的文件保持完全相同,这意味着只存在于远端服务器的数据集文件会被删除(如果本地没有数据集)。再次,我配置了几个需要排除的文件夹目录。5. 配置Python环境    点击File -> Project Structures -> SDKs可以看到如图所示的界面。点击+号,可以新增python SDK和JDK。    点击Add Python SDK后,将弹出下图所示界面,点击左侧的SSH Interpreter,如下图所示,首先选择使用哪一个Deployment,这是刚刚我们配置过的。然后选择python解释器的路径。图中的路径是MindStudio自动检测出来的,但一般需要我们找自己的Python环境安装目录。然后点击Project,选择刚才添加到MindStudio中的Python解释器,将其作为本项目所使用的解释器。6. 数据预处理   首先执行数据预处理脚本image_torch_preprocess.py, 将原生的图片数据转换为bin格式的输入文件。第一个参数为原始数据集(.jpeg)所在路径,第二个参数为输出的二进制文件(.bin)所在的路径。每个图片对应生成一个二进制文件。在预处理获得bin文件之后,再执行get_info.py提取输入信息。7. 模型转换    模型转换主要分为两步,第一步是将原有的pth模型转换为通用的onnx模型,第二步是将onnx模型转换为npu适用的om模型。    首先调用python脚本将pth模型转换为onnx模型。再使用ATC工具将onnx模型导出为om模型。MindStudio提供了atc工具的窗口化应用,他会根据用户选择自动生成atc指令。Model Converter的入口如图所示。选择onnx路径,模型输出名称,目标设备,输入格式和batchsize等信息。本实验需要跑到不同的batchsize,这里只需要修改shape参数即可对应生成不同batch size的om模型。MindStudio自动生成如下atc指令,用户可以在此做最后的校验,点击Finish即可开始进行模型转换。转换成功得到结果如下:8. 离线推理    使用benchmark工具进行离线推理,可以创建如图所示的应用:点击 + 号,再点击Ascend App,按照自己的模型相关信息进行填写即可。在不同机器上执行效率对比如下表格ModelBatch Size310p310 (FPS/Card)T4 (FPS/Card)310p/310310p/T4ResNeXt1011594.884594.696254.2521.0002.340ResNeXt1014566.742674.64486.6560.8401.160ResNeXt1018937.698669.232531.9961.4011.763ResNeXt101161086.34670.3570.8671.6211.903ResNeXt101321191.32429.944543.2932.7712.193ResNeXt10164781.172427.304539.9241.8281.447最优batch32/8/161191.32669.232570.8671.7662.0879. 精度对比    推理结束之后,可以调用imagenet_acc_eval.py脚本和原有标签数据进行对比,得到top5的结果。最后的精度表现如下:top1准确率为79.3%,top5准确率为94.52%。
  • [教程] PyTorch已为我们实现了大多数常用的非线性激活函数
    PyTorch已为我们实现了大多数常用的非线性激活函数,我们可以像使用任何其他的层那样使用它们。让我们快速看一个在PyTorch中使用ReLU激活函数的例子:在上面这个例子中,输入是包含两个正值、两个负值的张量,对其调用ReLU函数,负值将取为0,正值则保持不变。现在我们已经了解了构建神经网络架构的大部分细节,我们来构建一个可用于解决真实问题的深度学习架构。上一章中,我们使用了简单的方法,因而可以只关注深度学习算法如何工作。后面将不再使用这种方式构建架构,而是使用PyTorch中正常该用的方式构建。1.PyTorch构建深度学习算法的方式PyTorch中所有网络都实现为类,创建PyTorch类的子类要调用nn.Module,并实现__init__和forward方法。在init方法中初始化层,这一点已在前一节讲过。在forward方法中,把输入数据传给init方法中初始化的层,并返回最终的输出。非线性函数经常被forward函数直接使用,init方法也会使用一些。下面的代码片段展示了深度学习架构是如何用PyTrorch实现的:如果你是Python新手,上述代码可能会比较难懂,但它全部要做的就是继承一个父类,并实现父类中的两个方法。在Python中,我们通过将父类的名字作为参数传入来创建子类。init方法相当于Python中的构造器,super方法用于将子类的参数传给父类,我们的例子中父类就是nn.Module。2.不同机器学习问题的模型架构待解决的问题种类将基本决定我们将要使用的层,处理序列化数据问题的模型从线性层开始,一直到长短期记忆(LSTM)层。基于要解决的问题类别,最后一层是确定的。使用机器学习或深度学习算法解决的问题通常有三类,最后一层的情况通常如下。对于回归问题,如预测T恤衫的销售价格,最后使用的是有一个输出的线性层,输出值为连续的。将一张给定的图片归类为T恤衫或衬衫,用到的是sigmoid激活函数,因为它的输出值不是接近1就是接近0,这种问题通常称为二分类问题。对于多类别分类问题,如必须把给定的图片归类为T恤、牛仔裤、衬衫或连衣裙,网络最后将使用softmax层。让我们抛开数学原理来直观理解softmax的作用。举例来说,它从前一线性层获取输入,并输出给定数量样例上的概率。在我们的例子中,将训练它预测每个图片类别的4种概率。记住,所有概率相加的总和必然为1。3.损失函数一旦定义好了网络架构,还剩下最重要的两步。一步是评估网络执行特定的回归或分类任务时表现的优异程度,另一步是优化权重。优化器(梯度下降)通常接受一个标量值,因而loss函数应生成一个标量值,并使其在训练期间最小化。某些用例,如预测道路上障碍物的位置并判断是否为行人,将需要两个或更多损失函数。即使在这样的场景下,我们也需要把损失组合成一个优化器可以最小化的标量。最后一章将详细讨论把多个损失值组合成一个标量的真实例子。上一章中,我们定义了自己的loss函数。PyTorch提供了经常使用的loss函数的实现。我们看看回归和分类问题的loss函数。回归问题经常使用的loss函数是均方误差(MSE)。它和前面一章实现的loss函数相同。可以使用PyTorch中实现的loss函数,如下所示:对于分类问题,我们使用交叉熵损失函数。在介绍交叉熵的数学原理之前,先了解下交叉熵损失函数做的事情。它计算用于预测概率的分类网络的损失值,损失总和应为1,就像softmax层一样。当预测概率相对正确概率发散时,交叉熵损失增加。例如,如果我们的分类算法对图3.5为猫的预测概率值为0.1,而实际上这是只熊猫,那么交叉熵损失就会更高。如果预测的结果和真实标签相近,那么交叉熵损失就会更低。 图3.5下面是用Python代码实现这种场景的例子。为了在分类问题中使用交叉熵损失,我们真的不需要担心内部发生的事情——只要记住,预测差时损失值高,预测好时损失值低。PyTorch提供了loss函数的实现,可以按照如下方式使用。PyTorch包含的其他一些loss函数如表3.1所示。表3.1L1 loss通常作为正则化器使用;第4章将进一步讲述MSE loss均方误差损失,用于回归问题的损失函数Cross-entropy loss交叉熵损失,用于二分类和多类别分类问题NLL Loss用于分类问题,允许用户使用特定的权重处理不平衡数据集NLL Loss2d用于像素级分类,通常和图像分割问题有关4.优化网络架构计算出网络的损失值后,需要优化权重以减少损失,并改善算法准确率。简单起见,让我们看看作为黑盒的优化器,它们接受损失函数和所有的学习参数,并微量调整来改善网络性能。PyTorch提供了深度学习中经常用到的大多数优化器。如果大家想研究这些优化器内部的动作,了解其数学原理,强烈建议浏览以下博客:PyTorch提供的一些常用的优化器如下:ADADELTAAdagradAdamSparseAdamAdamaxASGDLBFGSRMSPropRpropSGD 
  • [API使用] 类似PyTorch中的Scatter算子的实现
    【问题描述】PyTorch中的Scatter算子与MindSpore.ops中的ScatterNd算子并不能一一对应1、 在PyTorch中, index矩阵中的位置和具体值形成实际的index, 然后将src中的值依据实际的index来写到self中2、 在MindSpore中, ScatterNd需要的就是实际的index (二维矩阵), 即:self[index[i, 0]][index[i, 1]]index[i, 2] = src[i]【转化方法】如果用MindSpore的方法实现PyTorch的scatter算子,主要是对index进行相互转换. 目前没有太高效的方法,个人的实现方法如下: def broadcast(src: ms.Tensor, axis:int): src = src.asnumpy() ix = np.argwhere(src == src) src = src.reshape(-1) ix[:, axis] = src return ms.Tensor(ix)def scatter_(src: ms.Tensor, index: ms.Tensor, out: ms.Tensor, axis: int=-1): index = broadcast(index, axis) op = ops.TensorScatterUpdate() return op(out, index, src.reshape(-1))【问题现象】目前在broadcast方法中,numpy接口并没有提供类似原生接口中的argwhere方法, 并且where方法与原生numpy中的方法也并不一样,所以在这里只能从ms.Tensor转换成np.Arrray进行操作.请问如何才能高效实现Scatter算子的转换, 或者怎样用Mindspore实现numpy中类似where或argwhere的方法?