OmniNet开源模型迁移适配指导
1. 模型概述
OmniNet是一种基于Transformer的全向表征学习方法。OmniNet允许每个Token不仅与同一层中的其他Token交互,还与网络中所有层中的所有Token进行交互。这种全局接受域的特性通过元学习(meta learning)实现,并利用有效的自注意力(self attention)模型降低计算成本。实验表明,OmniNet在多种语言、视觉和逻辑任务上取得了显著改进。
2.运行环境
| 软件 | 版本 |
|---|
| python | 3.11 |
| torch | 2.5.1 |
| torch_npu | 2.5.1.post1.dev20250722 |
| CANN | cann_8.2.rc1 |
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卡) |
|---|
| 910C | 0.27s/step | 1.67s/step | 0.25s/step | 1.35s/step |
| H20 | 0.78s/step | 1.57s/step | 0.81s/step | 1.03s/step |
6.精度
| 指标 | vqa任务精度 | hmdb任务精度 | caption任务精度 | vqa,hmdb,caption任务精度 |
|---|
| MRE | 0.03% | 0.05% | 0.02% | 2.00% |