Ascend-SACT/omninet-npu
模型介绍文件和版本Pull Requests讨论分析
下载使用量0

OmniNet开源模型迁移适配指导

1. 模型概述

  OmniNet是一种基于Transformer的全向表征学习方法。OmniNet允许每个Token不仅与同一层中的其他Token交互,还与网络中所有层中的所有Token进行交互。这种全局接受域的特性通过元学习(meta learning)实现,并利用有效的自注意力(self attention)模型降低计算成本。实验表明,OmniNet在多种语言、视觉和逻辑任务上取得了显著改进。

2.运行环境

  • 软件
软件版本
python3.11
torch2.5.1
torch_npu2.5.1.post1.dev20250722
CANNcann_8.2.rc1
  • 硬件
设备型号
Atlas 800T A3

3.准备镜像

3.1 推荐镜像

镜像环境镜像地址
公网swr.cn-southwest-2.myhuaweicloud.com/atelier/pytorch_ascend:pytorch_2.5.1-cann_8.2.rc1-py_3.11-hce_2.0.2503-aarch64-snt9b23-20250729103313-3a25129

3.2 启动镜像

docker run -itd -u root --privileged \
    --device=/dev/davinci0 --device=/dev/davinci1 --device=/dev/davinci2 --device=/dev/davinci3 \
    --device=/dev/davinci4 --device=/dev/davinci5 --device=/dev/davinci6 --device=/dev/davinci7 \
    --device=/dev/davinci8 --device=/dev/davinci9 --device=/dev/davinci10 --device=/dev/davinci11 \
    --device=/dev/davinci12 --device=/dev/davinci13 --device=/dev/davinci14 --device=/dev/davinci15 \
    --device=/dev/davinci_manager --device=/dev/devmm_svm --device=/dev/hisi_hdc \
    -v /usr/local/sbin/npu-smi:/usr/local/sbin/npu-smi \
    -v /usr/local/dcmi:/usr/local/dcmi \
    -v /etc/ascend_install.info:/etc/ascend_install.info \
    -v /sys/fs/cgroup:/sys/fs/cgroup:ro \
    -v /usr/local/Ascend/driver:/usr/local/Ascend/driver \
    -v /usr/bin/hccn_tool:/usr/bin/hccn_tool \
    -v /etc/hccn.conf:/etc/hccn.conf \
    --shm-size 1024g --net=host \
    -v <host_dir>:<container_dir> \
    --name <container_name> <image_id> /bin/bash

4.搭建测试环境&&训练

4.1 准备COCO数据集

# 原本用来下载数据集的脚本是: scripts/init_setup.py,但已因作者存储欠费失效,需要重新找数据源
    # 准备COCO数据集
    网站:https://aistudio.baidu.com/datasetdetail/210322
    
    # 准备HMDB数据集
    网站:https://aistudio.baidu.com/datasetdetail/112764
    
    # 准备VQA数据集
    wget https://s3.amazonaws.com/cvmlp/vqa/mscoco/vqa/v2_Annotations_Train_mscoco.zip
    wget https://s3.amazonaws.com/cvmlp/vqa/mscoco/vqa/v2_Annotations_Val_mscoco.zip
    wget https://s3.amazonaws.com/cvmlp/vqa/mscoco/vqa/v2_Questions_Train_mscoco.zip
    wget https://s3.amazonaws.com/cvmlp/vqa/mscoco/vqa/v2_Questions_Val_mscoco.zip
    
    # 构造Omninet数据集目录结构
    mkdir -p data/coco
    unzip annotations_trainval2017.zip
    mv annotations/* ./data/coco
    
    rm -rf annotations
    unzip train2017.zip
    mv train2017 train_val
    unzip val2017.zip
    mv val2017/* train_val/
    rm -rf val2017
    mv train_val ./data/coco
    
    mkdir -p data/hmdb
    unrar hmdb51_org.rar # 解压后的结果为51个压缩包,将所有压缩包独立解压后放在文件夹 data/hmdb 下
    
    mkdir -p data/vqa
    unzip v2_Annotations_Train_mscoco.zip
    unzip v2_Annotations_Val_mscoco.zip
    unzip v2_Questions_Train_mscoco.zip
    unzip v2_Questions_Val_mscoco.zip
    mv *.json data/vqa

    # 最终目录结构如下
    # 其中hmdb下包含51个文件夹,每个文件夹中都是avi格式的视频
    ├── data/
    │   ├── vqa/
    │   │   ├── v2_OpenEnded_mscoco_train2014_questions.json
    │   │   ├── v2_OpenEnded_mscoco_val2014_questions.json
    │   │   ├── v2_mscoco_train2014_annotations.json
    │   │   ├── v2_mscoco_val2014_annotations.json
    │   ├── coco/
    │   │   ├── captions_train2017.json
    │   │   ├── captions_val2017.json
    │   │   ├── instances_train2017.json
    │   │   ├── instances_val2017.json
    │   │   ├── person_keypoints_train2017.json
    │   │   ├── person_keypoints_val2017.json
    │   │   ├── train_val/
    │   ├── hmdb/
    │   │   ├── brush_hair/
    │   │   ├── cartwheel/
    │   │   ├── ... ... ...
    │   │   ├── wave/

4.2 安装软件

4.2.1 获取补丁

# 下载小巧灵gitcode项目OmniNet仓库,包含迁移适配补丁,在该仓库尚未发布前使用本文自带的补丁
    # 共1个补丁文件:omninet_npu.patch
    git clone https://atomgit.com/Ascend-SACT/omninet-npu.git
    ls omninet-npu

4.2.2 适配点

修改点适配点
libs/omninet/cnp/SubLayers.py:100
mask = mask.repeat(n_head, 1, 1).to(torch.bool)
mask后续计算使用的是布尔值,但原代码使用的整数计算报错
train.py:main()将原始的通过set_start_method('spawn',force=True)启动多线程训练的方式修改为torchrun获取环境变量的方式自动分配NPU ID,启动分布式训练
train.py:main()NPU不支持通过调用share_memory()使不同卡共享参数,修改为通过调用dist.all_reduce手动同步参数

4.2.3 获取OmniNet源码 && 打补丁

git clone https://github.com/subho406/OmniNet.git
    cp Omninet-NPU/omninet.patch OmniNet
    cd OmniNet
    git apply omninet.patch
    ln -s /path/to/data data

4.3 运行模型

# 单任务模型训练
    torchrun --nproc_per_node=1 train.py 100000 vqa 128 --n_gpus 1 --save_interval 500 --eval_interval 500
    torchrun --nproc_per_node=1 train.py 100000 hmdb 64 --n_gpus 1 --save_interval 500 --eval_interval 500
    torchrun --nproc_per_node=1 train.py 100000 caption 128 --n_gpus 1 --save_interval 500 --eval_interval 500
    
    # 三任务模型训练
    torchrun --nproc_per_node=3 train.py 100000 vqa,hmdb,caption 128,64,128 --n_gpus 3 --save_interval 500 --eval_interval 500

5.性能

硬件vqa任务性能(1卡)hmdb任务性能(1卡)caption任务性能(1卡)vqa,hmdb,caption任务性能(3卡)
910C0.27s/step1.67s/step0.25s/step1.35s/step
H200.78s/step1.57s/step0.81s/step1.03s/step

6.精度

指标vqa任务精度hmdb任务精度caption任务精度vqa,hmdb,caption任务精度
MRE0.03%0.05%0.02%2.00%