Cambricon PyTorch使用說明(基于MLU270)

一、簡介

Cambricon PyTorch借助PyTorch自身提供的設備擴展接口將MLU后端庫中所包含的算子操作動態注冊到PyTorch中,MLU后端庫可處理MLU上的張量和神經網絡算子的運算。Cambricon PyTorch會基于CNML庫在MLU后端實現一些常用神經網絡算子,并完成一些數據拷貝操作。

Cambricon PyTorch兼容原生PyTorch的Python編程接口和原生PyTorch網絡模型,支持在線逐層、在線融合和離線三種方式執行推理,同時還支持在線逐層訓練。網絡的權重可以從pth格式文件中讀取,已支持的分類和檢測網絡結構由torchvision管理,可以從torchvision中讀取。對于推理任務,Cambricon PyTorch不僅支持float16、float32等網絡模型,而且在寒武紀機器學習處理器上能高效地支持int8和int16網絡模型。對于訓練任務,支持float32及自適應量化網絡模型。

為了能在Torch模塊方便使用MLU設備,Cambricon PyTorch在PyTorch后端進行了以下擴展:

  • 通過Torch模塊可調用MLU后端支持的神經網絡運算(算子)。
  • 對MLU暫不支持的算子,并且該算子在MLU后端庫中已添加注冊,支持該類算子自動切換到CPU上運行
  • Torch模塊中與MLU相關的接口的語義與CPU和GPU的接口語義保持一致。
  • 支持CPU和MLU之間的無縫切換。

1.MLU使用基礎

Cambricon PyTorch主要使用場景為模型推理和模型訓練。

  • 訓練場景注重可擴展性,典型的加速手段是數據并行和模型并行, 由于要處理節點間任務調度、通訊和同步,通常要把網絡拆解成細粒度的算子,無法做到端到端執行。
  • 推理場景追求高吞吐和低延時,將離線優化好的模型端到端部署到同一設備, 除處理輸入輸出數據外,盡量不打斷程序的控制流、執行流和數據流。

寒武紀提供了CNML和CNNL兩套算子庫:

  • CNNL為通用算子庫,提供手工優化的基本算子簡單的融合算子,保證每個算子的單次運行延時盡可能低。
  • CNML通過將模型轉換成計算圖,利用融合操作等功能對計算圖進行離線的編譯優化,生成可端到端部署的推理引擎。
image
image

2.MLU推理

1)模型推理網絡支持

類別 名稱
分類網絡 PreActResNet50、PreActResNet101、inception_v3、vgg16、mobilenet、mobilenet_v2、mobilenet_v3、googlenet、densenet121、squeezenet1_1、resnet18、resnet34、resnet50、resnet101、resnet152、efficientnet、resnext50_32x4d、resnext101_32x8d
檢測網絡 SSD、SSD MobileNet v1、SSD MobileNet v2、YOLOv2、YOLOv3、YOLOv4、YOLOv5、EAST、MTCNN、Faster-RCNN(fpn)、centernet
超分網絡 FCN8s、SegNet、VSDR、FSRCNN
其他網絡 BERT

2)推理模式

  • 在線推理:指使用原生PyTorch提供的Python API直接運行網絡。在線推理包括逐層模式和融合模式兩種。
    • 逐層模式使用Python API逐個調用每個算子時,每個MLU算子都在底層的C++接口中經過創建句柄、編譯指令、拷貝輸入、前向計算、拷貝輸出等過程。逐層模式便于觀察數據的流動和變化,但是效率較低。
    • 融合模式將所有算子作為一個fusion算子,只對fusion算子執行編譯指令過程,減少了小算子之間的 數據拷貝(不僅是主從設備間,還包括RAM和DDR之間的拷貝),極大地提高了效率。使用JIT模式只需對整個網絡進行 一次編譯,避免了多次編譯產生的開銷。
  • 離線推理:指序列化已編譯好的算子到離線文件,生成離線模型。離線模型不依賴于PyTorch框架,只基于CNRT(Cambricon Neuware Runtime Library,寒武紀運行時庫)單獨運行。離線模型為.cambricon文件,生成離線模型可使用Cambricon PyTorch的Python接口將模型轉為離線模型。

3)算子支持

Cambricon PyTorch中已經實現了在線逐層(特指添加了MLU支持的層),在線融合以及離線模式之間的同步。任何已經實現的算子都可以同時采用在線逐層、在線融合和離線模式的任何一種進行使用。

Cambricon PyTorch已支持的算子如下:

二、使用Neuware SDK

Neuware SDK可前往寒武紀開發者社區注冊賬號按需下載,也可在官方提供的專屬FTP賬戶指定路徑下載。

運行環境

  • 主機系統: Ubuntu16.04/Ubuntu18.04/CentOS7(以下重點以Ubuntu18.04為例說明)
  • 最新軟件棧版本: 1.7.604
  • 深度學習框架: Pytorch

硬件環境準備

  • 開發主機/服務器 一臺
  • MLU270-F4/S4 一套

1.下載Neuware SDK

通過寒武紀提供的ftp鏈接和賬戶密碼,下載所需依賴包。本文以MLU270-S4加速卡,Ubuntu 18.04系統,Neuware SDK 1.7.604為例。

wget -r -nH -P./ ftp://download.cambricon.com:8821/product/GJD/MLU270/1.7.604/Ubuntu18.04/* --ftp-user="username" --ftp-password="password"

1)Neuware SDK目錄說明

$ tree -L 3 
├── CNCL
│   ├── cncl_0.8.0-1.ubuntu18.04_amd64.deb
├── CNCV
│   ├── cncv_0.4.602-1.ubuntu18.04_amd64.deb
│   ├── cncv_0.4.702-1.ubuntu18.04_arm64.deb
├── CNML
│   ├── cnml_7.10.3-1.ubuntu18.04_amd64.deb
├── CNNL
│   ├── cnnl_1.3.0-1.ubuntu18.04_amd64.deb
├── CNPlugin
│   ├── Cambricon-CNPlugin-MLU270.tar.gz
│   ├── cnplugin_1.12.4-1.ubuntu18.04_amd64.deb
├── CNToolkit
│   ├── cntoolkit_1.7.5-1.ubuntu18.04_amd64.deb
│   ├── cntoolkit_1.7.5-1.ubuntu18.04_arm64.deb
├── Driver  # mlu270驅動
│   ├── neuware-mlu270-driver-aarch64-4.9.8.tar.gz
│   ├── neuware-mlu270-driver-dkms_4.9.8_all.deb
└── PyTorch
    ├── docker
    │   ├── pytorch-0.15.604-ubuntu18.04.tar.gz # 安裝了PyTorch和Catch的Docker鏡像
    ├── src
    │   ├── pytorch-v0.15.604.tar.gz    # pytorch、pytorch_mlu和torchvision的源碼 !!!
    └── wheel   # 基于 pytorch-v0.15.604.tar.gz編譯所得
        ├── torch-1.3.0a0+b8d5360-cp27-cp27mu-linux_x86_64.whl
        ├── torch-1.3.0a0+b8d5360-cp36-cp36m-linux_x86_64.whl   # 寒武紀pytorch sdk下的pytorch編譯所得
        ├── torch_mlu-0.15.0.post1-cp27-cp27mu-linux_x86_64.whl
        ├── torch_mlu-0.15.0.post1-cp36-cp36m-linux_x86_64.whl  #  寒武紀pytorch sdk下的catch編譯所得
        ├── torchvision-0.2.1-cp27-cp27mu-linux_x86_64.whl
        ├── torchvision-0.2.1-cp36-cp36m-linux_x86_64.whl   #  寒武紀pytorch sdk下的vision編譯所得
  • CNCL (Cambricon Neuware Communications Library,寒武紀通信庫) 是面向 MLU設計的高性能通信庫。

    • 幫助應用開發者優化了基于 MLU 進行多機多卡的集合通信(Collective)操作。
    • 支持多種 MLU 處理芯片的互聯技術,包括 PCIe、MLU‐Link、RoCE、Infiniband Verbs 以及Sockets。
    • 根據芯片的互聯拓撲關系,自動的選擇最優的通信算法和數據傳輸路徑,從而最大化利用傳輸帶寬完成不同的通信操作。
  • CNML 寒武紀機器學習庫(Cambricon Neuware Machine Learning Library,CNML) 是一個基于寒武紀機器學習單元,并針對機器學習以及深度學習的編程庫。

    • 為用戶提供簡潔、高效、通用、靈活并且可擴展的編程接口,用于在 MLU 上加速用戶各種機器學習和深度學習算法。
    • 提供了豐富的基本算子。通過組合基本算子可以實現多樣的機器學習和深度學習算法。
  • CNNL (Cambricon Neuware Neural Network Library,寒武紀神經網絡計算庫) 是一個基于寒武紀機器學習單元并針對 DNN(Deep Neural Network,深度神經網絡)的計算庫。CNNL 針對 DNN 應用場景,提供了高度優化的常用算子,同時也為用戶提供簡潔、高效、通用、靈活并且可擴展的編程接口。

    • CNNL 基于 BANG C 語言實現算子開發。
  • CNPlugin 寒 武 紀 自 定 義 算 子 庫 (Cambricon CNPlugin) 在 CNML層提供一個接口,將寒武紀 BANG C 語言生成的算子與 CNML 的執行邏輯統一起來,從而實現了 BANG C 語言對 CNML 的操作進行擴展。

    • 用 BANG C 寫的算子,通過 CNPlugin行接口注冊到 CNML 后,還可以支持 CNML 的特性及多種運行模式如在線、離線,逐層、融合等。
  • CNToolkit 是寒武紀 Neuware SDK 中的主要組件,為用戶提供基于 BANG 架構的編譯、調試、分析、運行的工具集。

    • Compilers

      • CNCC:(Cambricon Neuware Compiler Collection,,寒武紀 BANG C 語言編譯器) 是基于 Clang 和LLVM 開發的 BANG C 和 BANG C++ 的編譯器主驅動程序,負責將 .mlu 的 C 或 C++ 源碼文件編譯為.s 的 MLISA 匯編文件。

      • CNAS:(Cambricon Neuware Assembler,寒武紀 MLISA 語言編譯器) 負責將 *.s 的 MLISA 匯編文件編譯為 *.cncode (REL‐Device 端可重定位)或 *.cnbin (EXE‐Device 端鏈接后) 或 *.cnfatbin (集合多個 cnbin 的胖二進制)或 *.o (可與 Host 端目標平臺鏈接的)的 ELF 格式的 obj 文件。

    • Tools

      • CNGDB:(Cambricon Neuware GNU Debugger,寒武紀 BANG 語言調試工具) 基于 GDB 修改,添加了
        對 BANG C 和 C++ 語言的支持,可同時調試 Host 端和 Device 端的代碼,并遵循 GPL 協議。

      • CNPerf:(Cambricon Neuware Performance,寒武紀性能剖析工具) 是一款針對 Neuware 軟件棧全棧
        設計的性能剖析工具。以性能事件為基礎,可對 MLU 異構并行編程查找性能瓶頸和熱點函數。

      • CNCodec:(Cambricon Neuware Codec Library,寒武紀硬件編解碼庫) 為帶有視頻或圖片編解碼能力的 MLU 設備提供 Host 端的 API 支持。

        • 解碼輸出像素格式:YUV420SP-NV21、BGR24、RGB24、YUV422。
        • 編碼輸?像素格式:YUV420SP-NV21、BGR24、RGB24、YUV422。
      • CNDev:(Cambricon Neuware Device Interface Library,寒武紀設備接口庫) 主要為上層庫或工具提
        供公共統一的獲取硬件設備信息的 API。

      • CNDrv:(Cambricon Neuware Driver Interface Library,寒武紀驅動接口庫) 主要為上層庫或工具提供異構編程中 Host 和 Device 內存管理、異步執行和控制、設備管理、多卡多機協同等能力。

      • CNRT:(Cambricon Neuware Runtime Library,寒武紀運行時庫) 提供和 CNDrv 類似的 Host 和 Device 內存管理、異步執行和控制、設備管理、多卡多機協同等功能 API。二者差異在于 CNRT 將 CNDrv 若干 API 做了流程上或邏輯上的友好封裝,幫助用戶降低編程復雜度。

      • CNRTC:(Cambricon Neuware Runtime Compilation Library,寒武紀運行時編譯庫) 是 BANG C/C++ 的運行時編譯庫,通過 API 接收字符串形式的 BANG 語言源碼,并創建可在多架構 MLU 上執行的cnfatbin,然后配合 CNDrv 層 Module 解析和 Kernel 執行接口實現 JIT 方式的編譯執行。

      • CNStudio:(Cambricon Neuware Studio,寒武紀集成開發環境)為用戶開發和調試 BANG C/C++ 語言
        提供 IDE 級的環境。當前 CNStudio 只提供了 Visual Studio Code 的插件。

      • CNJPU:(Cambricon Neuware Edge JPEG Processing Unit Library,寒武紀 JPEG 處理單元庫) 為 Edge
        形態的用戶提供調用 JPEG 處理單元的運行時支持,在 CNCodec 的編程中會使用或鏈接此庫。

        • 此庫只支持 aarch64 平臺,提供給 Edge 形態的產品使用。
      • CNION:(Cambricon Neuware Edge ION Library,寒武紀 ION 庫) 為 Edge 形態的用戶提供調用 ION 用戶態支持,此庫是基于 AOSP ION 添加了寒武紀相關函數功能的 ION 庫,在 CNCodec 的編程中會使用或鏈接此庫。

        • 此庫只支持 aarch64 平臺,提供給 Edge 形態的產品使用。

2.pytorch-v0.15.604.tar.gz源碼說明

PyTorch/src/pytorch-v0.15.604.tar.gz是編譯pytorch、pytorch_mlu和torchvision的源碼。解壓后可得到cambricon_pytorch文件夾。

/opt/work/cambricon_pytorch $ tree -L 4
├── configure_pytorch.sh    
├── env_pytorch.sh  # 環境變量聲明文件
├── pytorch
│   ├── examples
│   │   ├── offline
│   │   │   └── c++
│   │   │       ├── classification
│   │   │       │   ├── run_all_offline_mc_int16.sh
│   │   │       │   ├── run_all_offline_mc_int16_220.sh
│   │   │       │   ├── run_all_offline_mc_int8.sh
│   │   │       │   └── run_all_offline_mc_int8_220.sh
│   │   │       ├── east
│   │   │       │   ├── run_all_offline_mc_int16.sh
│   │   │       │   ├── run_all_offline_mc_int16_220.sh
│   │   │       │   ├── run_all_offline_mc_int8.sh
│   │   │       │   └── run_all_offline_mc_int8_220.sh
│   │   │       ├── mtcnn
│   │   │       │   ├── run_offline_int16.sh
│   │   │       │   ├── run_offline_int16_220.sh
│   │   │       │   ├── run_offline_int8.sh
│   │   │       │   └── run_offline_int8_220.sh
│   │   │       ├── ssd
│   │   │       │   ├── run_all_offline_mc_int16.sh
│   │   │       │   ├── run_all_offline_mc_int16_220.sh
│   │   │       │   ├── run_all_offline_mc_int8.sh
│   │   │       │   └── run_all_offline_mc_int8_220.sh
│   │   │       ├── ssd_mobilenet_v1
│   │   │       │   ├── run_all_offline_mc_int16.sh
│   │   │       │   ├── run_all_offline_mc_int16_220.sh
│   │   │       │   ├── run_all_offline_mc_int8.sh
│   │   │       │   └── run_all_offline_mc_int8_220.sh
│   │   │       ├── yolov2
│   │   │       │   ├── run_all_offline_mc_int16.sh
│   │   │       │   ├── run_all_offline_mc_int16_220.sh
│   │   │       │   ├── run_all_offline_mc_int8.sh
│   │   │       │   └── run_all_offline_mc_int8_220.sh
│   │   │       └── yolov3
│   │   │           ├── run_all_offline_mc_int16.sh
│   │   │           ├── run_all_offline_mc_int16_220.sh
│   │   │           ├── run_all_offline_mc_int8.sh
│   │   │           └── run_all_offline_mc_int8_220.sh
│   │   └── online
│   │       └── python
│   │           ├── classification
│   │           │   └── test_clas_online.sh
│   │           ├── east
│   │           │   └── run_test_east.sh
│   │           ├── mtcnn
│   │           │   └── run_mtcnn.sh
│   │           ├── ssd
│   │           │   └── run_test_ssd.sh
│   │           ├── ssd_mobilenet_v1
│   │           │   └── run_ssd_mobilenet_v1.sh
│   │           ├── yolov2
│   │           │   └── run_test_yolov2.sh
│   │           └── yolov3
│   │               └── run_test_yolov3.sh
│   ├── include
│   ├── lib
│   ├── models
│   │   └── pytorch_models
│   │       └── int8
│   │           └── checkpoints
│   ├── src     # 源代碼
│   │   ├── catch   # catch軟件包
│   │   │   ├── CPPLINT.cfg
│   │   │   ├── PYLINT.cfg
│   │   │   ├── README.md
│   │   │   ├── cmake
│   │   │   ├── examples
│   │   │   ├── pytorch_patches # 對當前pytorch的寒武紀補丁包
│   │   │   ├── requirements.txt
│   │   │   ├── script
│   │   │   ├── setup.py
│   │   │   ├── test
│   │   │   ├── third_party
│   │   │   ├── torch_mlu   # 核心程序
│   │   ├── pytorch # pytorch軟件包
│   │   │   ├── CITATION
│   │   │   ├── CMakeLists.txt
│   │   │   ├── CODEOWNERS
│   │   │   ├── CONTRIBUTING.md
│   │   │   ├── LICENSE
│   │   │   ├── Makefile
│   │   │   ├── NOTICE
│   │   │   ├── README.md
│   │   │   ├── android
│   │   │   ├── aten
│   │   │   ├── azure-pipelines.yml
│   │   │   ├── benchmarks
│   │   │   ├── binaries
│   │   │   ├── c10
│   │   │   ├── caffe2
│   │   │   ├── cmake
│   │   │   ├── compile_commands.json
│   │   │   ├── docker
│   │   │   ├── docs
│   │   │   ├── ios
│   │   │   ├── modules
│   │   │   ├── mypy-README.md
│   │   │   ├── mypy-files.txt
│   │   │   ├── mypy.ini
│   │   │   ├── requirements.txt
│   │   │   ├── scripts
│   │   │   ├── setup.py
│   │   │   ├── submodules
│   │   │   ├── test
│   │   │   ├── third_party
│   │   │   ├── tools
│   │   │   ├── torch
│   │   │   └── ubsan.supp
│   │   └── vision  # vision軟件包
│   │       ├── CMakeLists.txt
│   │       ├── LICENSE
│   │       ├── MANIFEST.in
│   │       ├── README.rst
│   │       ├── docs
│   │       ├── setup.cfg
│   │       ├── setup.py
│   │       ├── test
│   │       ├── torchvision
│   │       └── tox.ini
│   └── tools
│       └── genoff.py -> /opt/work/cambricon_pytorch/pytorch/src/catch/examples/offline/genoff/genoff.py
└── run_pytorch.sh

1)Cambricon catch目錄說明

  • pytorch/src/catch文件夾
/opt/work/cambricon_pytorch/pytorch/src/catch$ tree -L 2
.
├── CPPLINT.cfg
├── PYLINT.cfg
├── README.md
├── cmake
│   └── modules
├── examples
│   ├── data
│   │   ├── ICDAR_2015
│   │   ├── IWSLT
│   │   ├── coco
                    │   ├── coco.data
                    │   ├── coco.names
                    │   ├── file_list_for_release
                    │   ├── get_coco_dataset.sh
                    │   ├── samples
                    │   │   ├── ......
                    │   │   └── person.jpg
                    │   └── val2017
                    │       ├── 5k.txt
                    │       ├── coco.data
                    │       ├── coco.names
                    │       ├── file_list_for_release
                    │       ├── get_coco_dataset.sh
                    │       ├── label_map_coco.txt
                    │       └── val_file_info
│   │   ├── coco2017
│   │   ├── fddb
│   │   ├── imagenet
│   │   ├── voc2007
│   │   └── voc2012
│   ├── offline # 離線推理示例程序
│   │   ├── CMakeLists.txt
│   │   ├── README.md
│   │   ├── bert
│   │   ├── build
│   │   ├── centernet
│   │   ├── clas_offline_multicore
│   │   ├── cmake
│   │   ├── common
│   │   ├── east
│   │   ├── faster-rcnn
│   │   ├── fcn8s
│   │   ├── fsrcnn
│   │   ├── genoff
│   │   ├── mtcnn
│   │   ├── scripts
│   │   ├── segnet
│   │   ├── ssd
│   │   ├── ssd_mobilenet_v1
│   │   ├── ssd_mobilenet_v2
│   │   ├── test
│   │   ├── test_forward_offline
│   │   ├── vdsr
│   │   ├── yolov2
│   │   ├── yolov3
│   │   ├── yolov4
│   │   └── yolov5
                    ├── CMakeLists.txt
                    ├── README.md
                    ├── label_map_coco.txt
                    ├── post_process
                    │   ├── yolov5_off_post.cpp
                    │   ├── yolov5_off_post.hpp
                    │   ├── yolov5_processor.cpp
                    │   └── yolov5_processor.hpp
                    ├── run_all_offline_mc.sh
                    └── yolov5_offline_multicore.cpp
│   ├── onetest
│   │   ├── onetest.conf
│   │   ├── onetest.py
│   │   └── onetest_mlu220.conf
│   ├── online
│   │   ├── README.md
│   │   ├── bert
│   │   ├── centernet
│   │   ├── common_utils.py
│   │   ├── east
│   │   ├── efficientnet
│   │   ├── faster-rcnn
│   │   ├── fcn8s
│   │   ├── fsrcnn
│   │   ├── mask-rcnn
│   │   ├── mtcnn
│   │   ├── segnet
│   │   ├── ssd
                    ├── README.md
                    ├── data
                    │   ├── __init__.py
                    │   ├── coco.py
                    │   ├── coco_labels.txt
                    │   ├── config.py
                    │   ├── example.jpg
                    │   ├── scripts
                    │   │   ├── COCO2014.sh
                    │   │   ├── VOC2007.sh
                    │   │   └── VOC2012.sh
                    │   └── voc0712.py
                    ├── eval.py
                    ├── run_test_ssd.sh
                    └── utils
                        ├── __init__.py
                        └── augmentations.py
│   │   ├── ssd_mobilenet_v1
│   │   ├── ssd_mobilenet_v2
│   │   ├── test_clas_online.py
│   │   ├── vdsr
│   │   ├── yolov2
│   │   ├── yolov3
│   │   ├── yolov4
│   │   └── yolov5
                    ├── README.md
                    ├── models
                    │   ├── __init__.py
                    │   ├── common.py
                    │   ├── experimental.py
                    │   ├── export.py
                    │   ├── yaml
                    │   │   └── yolov5s.yaml
                    │   └── yolo.py
                    ├── requirements.txt
                    ├── run_test_yolov5.sh
                    ├── test.py
                    └── utils
                        ├── __init__.py
                        ├── activations.py
                        ├── datasets.py
                        ├── general.py
                        ├── google_utils.py
                        └── torch_utils.py
    ├── __init__.py
    ├── activations.py
    ├── datasets.py
    ├── general.py
    ├── google_utils.py
    └── torch_utils.py
│   ├── tools
│   │   ├── convert_weight
│   │   ├── loss_check
│   │   └── operator_statistic
│   └── training
│       ├── multi_card_demo.py
│       └── single_card_demo.py
├── pytorch_patches
│   ├── commit_id
│   ├── fix_cnnl_not_support_asstride.diff
│   ├── fix_no_access_permission_for_pth.diff
│   ├── fix_setup_clean.diff
│   ├── improve_performance_changes.diff
│   ├── max_out_impl_support_mlu_dispatch.diff
│   ├── profiler_mlu_support.diff
│   ├── register_mlu_device.diff
│   ├── support_mlu_dataloader.diff
│   ├── support_mlu_fusion.diff
│   ├── support_mlu_quanz_dequanz.diff
│   ├── support_mlu_segmentation.diff
│   └── support_mlu_serialization.diff
├── requirements.txt
├── script
│   ├── apply_patches_to_pytorch.sh
│   ├── build_catch.sh
│   ├── build_catch_lib.sh
│   ├── build_docview.sh
│   ├── build_mlu_libs.sh
│   ├── build_pytorch_src_test.sh
│   ├── catch_coverage_test.sh
│   ├── config_for_release.sh
│   ├── hooks
│   │   ├── README
│   │   ├── commit-msg
│   │   └── pre-commit
│   ├── release
│   │   ├── Dockerfiles
│   │   ├── build.property
│   │   ├── build_docker.sh
│   │   ├── config
│   │   ├── configure_pytorch.sh
│   │   ├── env_pytorch.sh
│   │   ├── independent_build.sh
│   │   ├── json_parser.py
│   │   ├── run_pytorch.sh
│   │   └── tools
│   └── yapf_format.py
├── setup.py
├── test
│   ├── cnml
│   │   ├── data
│   │   ├── op_test
│   │   ├── test_acquire_hardware_time.py
│   │   ├── test_bind_tensor.py
│   │   ├── test_cnml_op_exception.py
│   │   ├── test_dump.py
│   │   ├── test_eqnm_quantization.py
│   │   ├── test_forward_offline.py
│   │   ├── test_jit_inplace.py
│   │   ├── test_logging_cnml.py
│   │   ├── test_mfus_exception_case1.py
│   │   ├── test_mfus_exception_case2.py
│   │   ├── test_mfus_exception_case3.py
│   │   ├── test_mfus_exception_modules.py
│   │   ├── test_mixed_quantized_mods.py
│   │   ├── test_nan_quantization.py
│   │   ├── test_op_methods_cnml.py
│   │   ├── test_perchannel_use_avg.py
│   │   ├── test_quantization_exception.py
│   │   ├── test_quantize_generate.py
│   │   ├── test_quantized_mods.py
│   │   ├── test_save_cambricon.py
│   │   ├── test_segment_graph_exception.py
│   │   └── test_set_mem_channel.py
│   ├── cnnl
│   │   ├── distributed_env_prepare.sh
│   │   ├── op_test
│   │   ├── test_adaptive_quantize.py
│   │   ├── test_cnnl_op_exception.py
│   │   ├── test_distributed.py
│   │   ├── test_logging_cnnl.py
│   │   ├── test_op_methods_cnnl.py
│   │   ├── test_pin_memory.py
│   │   ├── test_profiler.py
│   │   ├── test_queue.py
│   │   └── test_save_and_load.py
│   ├── common_utils.py
│   ├── data
│   ├── run_test.py
│   ├── test_caching_allocator.py
│   ├── test_clas_onnx.py
│   ├── test_device.py
│   ├── test_jit_exception.py
│   ├── test_notifier.py
│   └── test_queue.py
├── third_party
│   └── neuware # 空目錄
├── torch_mlu   # 核心代碼
│   ├── __init__.py
│   ├── core
│   ├── csrc
│   ├── distributed
│   └── tools
├── torch_mlu.egg-info
│   ├── PKG-INFO
│   ├── SOURCES.txt
│   ├── dependency_links.txt
│   └── top_level.txt

3.編譯pytorch-v0.15.604.tar.gz并安裝pytorch

1)安裝依賴

Caffe/Pytorch 框架編譯安裝前,需要安裝CNToolkit 軟件包和 CNML、CNNL、CNPlugin、CNCL 等組件。

# 安裝MLU270驅動
cd [Neuware_SDK_Path]/Driver/
dpkg -i neuware-mlu270-driver-dkms_4.9.8_all.deb
# 檢測Driver 是否已經安裝成功且版本依賴滿足要求。
$ cat /proc/driver/cambricon/mlus/0000\:b3\:00.0/information 
Device name: MLU270-S4
Device inode path: /dev/cambricon_dev0
Device Major: 508
Device Minor: 0
Driver Version: v4.9.8
MCU Version: v1.1.3
Board Serial Number: SN/122011101324
MLU Firmware Version: 4.9.8
Board CV: 0
IPU Freq: 1000MHz
Linux Version: 5.4.0-100-generic (buildd@lcy02-amd64-060)
Interrupt Mode: MSI
Bus Location: b3_0_0
Bus Type: PCIE
LnkCap: Speed 8.0GT/s, Width x16
Region 0: Memory at 38ffc0000000 [size=256M]
Region 2: Memory at 38fff4000000 [size=64M]
Region 4: Memory at 38fff0000000 [size=64M]

# CNToolkit
cd [Neuware_SDK_Path]/CNToolkit/
dpkg -i cntoolkit_1.7.5-1.ubuntu18.04_amd64.deb
cd /var/cntoolkit-1.7.5/
dpkg -i *.deb
rm *.deb
# CNML
cd [Neuware_SDK_Path]/CNML/
dpkg -i cnml_7.10.3-1.ubuntu18.04_amd64.deb
# CNPlugin
cd [Neuware_SDK_Path]/CNPlugin
dpkg -i cnplugin_1.12.4-1.ubuntu18.04_amd64.deb
# CNNL
cd [Neuware_SDK_Path]/CNNL/
dpkg -i cnnl_1.3.0-1.ubuntu18.04_amd64.deb
# CNCL
cd [Neuware_SDK_Path]/CNCL
dpkg -i cncl_0.8.0-1.ubuntu18.04_amd64.deb

2)解壓pytorch-v0.15.604.tar.gz

cd  [Neuware_SDK_Path]/PyTorch/src/
tar zxvf pytorch-v0.15.604.tar.gz -C /opt/work/

3)編譯與安裝Cambricon PyTorch

#設置壓縮包解壓后的根目錄
export ROOT_HOME=/opt/work/cambricon_pytorch
cd $ROOT_HOME
#創建數據集和模型軟鏈接目錄(以實際目錄為準):DATASET_HOME, CAFFE_MODELS_DIR
ln -s /data/datasets datasets
ln -s /data/models models
#設置環境變量
source env_pytorch.sh

# 安裝Virtualenv并激活虛擬環境
pip install virtualenv
pushd ${CATCH_HOME}
virtualenv -p $(which python3) venv/pytorch #安裝虛擬環境,此處Python 3可按需更換為指定版本
source venv/pytorch/bin/activate #激活虛擬環境
popd

# 將Cambricon Catch中所包含的Cambricon PyTorch的Patch打到Cambricon PyTorch代碼中。
pushd ${CATCH_HOME}/script
bash apply_patches_to_pytorch.sh
popd

# 編譯Cambricon PyTorch
pushd ${PYTORCH_HOME}
pip install -r requirements.txt #安裝第三方包
rm -rf build #清理環境
rm -rf dist
python setup.py install #編譯并安裝
python setup.py bdist_wheel # 生成.whl包
popd

# 編譯Cambricon Catch
pushd ${CATCH_HOME}
pip install -r requirements.txt #安裝第三方包
rm -rf build
rm -rf dist
python setup.py install #編譯并安裝
python setup.py bdist_wheel # 生成.whl包
popd

# 編譯并安裝Cambricon Vision
pushd ${VISION_HOME}
rm -rf dist
python setup.py bdist_wheel
pip install dist/torchvision-*.whl
popd
  • env_pytorch.sh設置默認安裝路徑為:/usr/local/neuware/
  • 對于Cambricon PyTorch,打開目錄 build/lib,若編譯生成了libtorch_pytorch.so和libtorch.so等文件,則說明Cambricon PyTorch編譯成功。
  • 對于Cambricon Catch,打開build/lib.linux-*目錄,若編譯生成了_MLUC.so等文件,則說明Cambricon Catch編譯成功。

4)測試是否編譯成功

# Python:
>>> import torch
>>> import torch_mlu
CNML: 7.10.3 85350b141
CNRT: 4.10.4 41e356b

# 如需退出虛擬環境,
deactivate
# 重新進入虛擬環境
source $ROOT_HOME/pytorch/src/catch/venv/pytorch/bin/activate

5)當前pip list

Package            Version
------------------ ------------
astroid            2.9.3
attrs              21.4.0
boto3              1.5.22
botocore           1.8.50
certifi            2021.10.8
chardet            3.0.4
charset-normalizer 2.0.12
cloudpickle        2.0.0
cpplint            1.6.0
cycler             0.11.0
Cython             0.29.16
dask               2021.3.0
decorator          4.4.2
docopt             0.6.2
docutils           0.18.1
future             0.18.2
idna               2.6
isort              5.10.1
jmespath           0.10.0
jsonpickle         0.9.6
kiwisolver         1.3.1
lanms              1.0.2
lazy-object-proxy  1.7.1
matplotlib         2.2.2
mccabe             0.6.1
munch              2.2.0
networkx           2.5.1
nltk               3.2.5
numpy              1.16.0
onnx               1.6.0
opencv-python      3.4.2.17
pandas             0.23.2
Pillow             5.2.0
pip                21.3.1
platformdirs       2.4.0
pluggy             0.6.0
protobuf           3.19.4
py                 1.11.0
pycocotools        2.0.0
pylint             2.12.2
pyparsing          3.0.7
pytest             3.4.0
python-dateutil    2.8.2
pytz               2021.3
PyWavelets         1.1.1
PyYAML             6.0
regex              2018.2.3
requests           2.18.4
s3transfer         0.1.13
sacred             0.7.2
scikit-image       0.14.2
scikit-learn       0.19.2
scipy              1.1.0
setuptools         59.6.0
Shapely            1.7.0
six                1.16.0
tensorboardX       1.0
toml               0.10.2
toolz              0.11.2
torch              1.3.0a0      # 注意:寒武紀Pytorch為1.3版本
torch-mlu          0.15.0.post1
torchvision        0.2.1
tqdm               4.19.5
typed-ast          1.5.2
typing             3.7.4.3
typing_extensions  4.1.1
urllib3            1.22
wheel              0.37.1
wrapt              1.13.3
yacs               0.1.6

4.使用容器啟動pytorch【推薦】

docker鏡像 [neuware_sdk]/PyTorch/docker/pytorch-0.15.604-ubuntu18.04.tar.gz 包含catch的example,將PyTorch和Catch編譯成wheel包以及Python 3虛擬環境,且已經安裝了cntoolkit等依賴包。

tree /torch/ -L 1
├── examples          -- 在線與離線demo
├── requirements.txt  -- Python依賴包
├── src               -- PyTorch/Catch/Vision源代碼
├── venv2             -- Python 2虛擬環境
├── venv3             -- Python 3虛擬環境
├── wheel_py2         -- Python 2 wheel包
└── wheel_py3         -- Python 3 wheel包

加載鏡像

sudo docker load < [neuware_sdk]/PyTorch/docker/pytorch-0.15.604-ubuntu18.04.tar.gz

啟動容器

sudo docker run -itd --privileged --net=host -v /home/ubuntu/Downloads/neuware-ftp:/home/ftp yellow.hub.cambricon.com/pytorch/pytorch:0.15.604-ubuntu18.04 /bin/bash

在容器中激活Python虛擬環境

cd /torch
source venv3/pytorch/bin/activate

# 測試torch_mlu
python
>>> import torch
>>> import torch_mlu
CNML: 7.10.3 85350b141
CNRT: 4.10.4 41e356b

三、寒武紀FTP其他資料說明

1.download/demo

獲取文件

wget -r -nH -P./ ftp://download.cambricon.com:8821/download/demo/* --ftp-user="username" --ftp-password="password"

目錄說明

$ tree 
├── cnrtexec
│   ├── cnrtexec.tar.gz
│   └── README.MD
├── lprnet
│   ├── cnnl_auto_log
│   ├── cnrtexec
│   │   ├── clean.sh
│   │   ├── cnrtexec
│   │   ├── cnrtexec.cpp
│   │   ├── cnrtexec.h
│   │   ├── cnrtexec.o
│   │   ├── main.cpp
│   │   ├── main.o
│   │   └── Makefile
│   ├── cpu.py
│   ├── env.sh
│   ├── labels_mlu.txt
│   ├── labels.txt
│   ├── lpr.cambricon
│   ├── lpr.cambricon_twins
│   ├── lprini.pth
│   ├── lpr_intx.pth
│   ├── mlu.py
│   ├── model
│   │   ├── __init__.py
│   │   ├── LPRNet.py
│   │   ├── LPRNet.py.bak
│   │   └── __pycache__
│   │       ├── __init__.cpython-35.pyc
│   │       ├── __init__.cpython-37.pyc
│   │       ├── LPRNet.cpython-35.pyc
│   │       └── LPRNet.cpython-37.pyc
│   ├── prebs_mlu.txt
│   ├── prebs.txt
│   ├── quant.py
│   ├── readme
│   ├── test1.jpg
│   └── test.jpg
├── mlu_caffe_fcn
│   ├── mlu_caffe_fcn_8s.tar
│   └── README.MD
├── mlu_caffe_yolov3
│   ├── mlu_caffe_yolov3.tar.gz
│   └── README.md
├── retinaface
│   ├── cnrt_simple_demo_retinaface_final.zip
│   └── mlu-pytorch_retinaface_native.tar.gz
└── yolov5
    ├── 20211229
    │   ├── gen.py
    │   ├── model
    │   │   ├── yolov5s.pt  # yolov5s pytorch源模型文件(pytorch>=1.6)
    │   │   └── yolov5s-state-31.pth
    │   └── readme_yolov5.md
    ├── 20220112
    │   └── mlu-pytorch-yolov5-v5.0.tar.gz
    ├── cnstream_patch
    │   └── cnstream_yolov5_patch.tar.gz    # yolov5 cnstream補丁包
    ├── pytorch-yolov5-image-test
    │   ├── pytorch-yolov5-image-1.6.602.tar    # docker鏡像:包含寒武紀pytorch和yolov5環境,注意,非Neuware sdk 1.7.604版本
    │   ├── run-pytorch-yolov5-docker-ubuntu16.04-1.6.602.sh    # docker鏡像運行腳本
    │   ├── run-pytorch-yolov5-docker-ubuntu16.04-1.6.602.sh.tar.gz
    │   └── yolov5_Readme.md
    ├── torch-yolov5模型轉換
    │   ├── torch.ubuntu18.04.yolov5.v1.7.tar.gz    # docker鏡像:包含官方pytorch和yolov5環境,用于將網絡模型轉換為 Torch 版本為1.3的模型文件。
    │   └── yolov5-3.1.tar.gz   # 官方yolov5 sdk
    └── yolov5m
        └── quantize_online_v5.0_20211223.tar.gz    # yolov5 模型量化、離線模型生成代碼

2.product/datasets

獲取文件

wget -r -nH -P./ ftp://download.cambricon.com:8821/product/datasets/* --ftp-user="username" --ftp-password="password"

文件目錄

$ tree
├── COCO-2014.tar.gz
├── COCO2017_datasets.tar.gz
├── MLU270_datasets_COCO.tar.gz
├── MLU270_datasets_en_core_web_sm.tar.gz
├── MLU270_datasets_FDDB.tar.gz
├── MLU270_datasets_imagenet.tar.gz
├── MLU270_datasets_tensorflow_models.tar.gz
├── MLU270_datasets_VOC2007.tar.gz
├── MLU270_datasets_VOC2012.tar.gz

四、YoloV5 MLU算法移植

整個移植過程大體可分為環境準備、模型量化、在線推理、生成離線模型、離線推理、性能測試、精度測試共七個步驟。

1.模型轉換(Torch對齊)

  • 一般官方 YOLOv5 依賴 PyTorch 版本 >=1.6,高版本pytorch帶有zip壓縮模型功能,生成的模型權重文件(.pt)是被壓縮過的。而寒武紀PyTorch版本為1.3,因此需要將高版本pytorch的模型權重文件(.pt)轉換為pytorch 1.3.0 不帶壓縮格式的模型權重文件(.pth)。
  • 模型轉換需要在官方PyTorch(版本 >=1.6)的服務器上執行。

1)準備網絡模型

從官網下載配置文件及模型權重,以下以yolov5(416*416)為例進行演示。

Name URL Note
YOLOv5 https://github.com/ultralytics/yolov5.git Ultralytics官網GitHub地址
yolov5s.yaml https://github.com/ultralytics/yolov5/blob/master/models/yolov5s.yaml v5.0
yolov5s.pt https://github.com/ultralytics/yolov5/releases/download/v5.0/yolov5s.pt v5.0
yolov5m.yaml https://github.com/ultralytics/yolov5/blob/master/models/yolov5m.yaml v5.0
yolov5m.pt https://github.com/ultralytics/yolov5/releases/download/v5.0/yolov5m.pt v5.0
yolov5l.yaml https://github.com/ultralytics/yolov5/blob/master/models/yolov5l.yaml v5.0
yolov5l.pt https://github.com/ultralytics/yolov5/releases/download/v5.0/yolov5l.pt v5.0
yolov5x.yaml https://github.com/ultralytics/yolov5/blob/master/models/yolov5x.yaml v5.0
yolov5x.pt https://github.com/ultralytics/yolov5/releases/download/v5.0/yolov5x.pt v5.0

2)模型轉換

轉換代碼:aligntorch.py

import torch
from models.yolo import Model

weight='yolov5s.pt'
model = torch.load(weight, map_location='cpu')['model']
#print(model)
torch.save(model.state_dict(), "./yolov5s-nozip.pth",_use_new_zipfile_serialization=False)

執行轉換

python3 aligntorch.py
# 得到未壓縮模型文件yolov5s-nozip.pth

2.模型量化

1)獲取yolov5模型量化代碼

通過官方ftp獲取yolov5模型量化及推理代碼:quantize_online_v5.0_20211223.tar.gz

wget -r -nH -P./ ftp://download.cambricon.com:8821/download/demo/yolov5/yolov5m/* --ftp-user="username" --ftp-password="password"

將quantize_online_v5.0_20211223.tar.gz解壓到已安裝pytorch_mlu環境的設備或其容器中的路徑下。

$ tree -L 1
├── FocusWeight.txt
├── README.md
├── clean.sh
├── config.ini
├── data
│   ├── argoverse_hd.yaml
│   ├── coco.yaml
│   ├── coco128.yaml
│   ├── hyp.finetune.yaml
│   ├── hyp.scratch.yaml
│   ├── images
│   │   ├── bus.jpg
│   │   └── zidane.jpg
│   ├── scripts
│   │   ├── get_argoverse_hd.sh
│   │   ├── get_coco.sh
│   │   └── get_voc.sh
│   └── voc.yaml
├── detect.py
├── models
│   ├── common.py
│   ├── experimental.py
│   ├── export.py
│   ├── hub
│   ├── yolo.py
│   ├── yolov5l.yaml
│   ├── yolov5m.yaml
│   ├── yolov5s.yaml
│   └── yolov5x.yaml
├── post_process.py
├── quant.py    # 量化程序
├── results
├── run.sh
├── tools
├── utils
├── v5.0    # torch對齊的模型文件
│   ├── yolov5m-nozip.pth
│   ├── yolov5s-nozip.pth
│   └── yolov5x-nozip.pth

2)模型量化及CPU在線推理

在已安裝pytorch_mlu的環境下執行

模型量化程序參數說明

$ python quant.py --help
usage: quant.py [-h] [--cfg CFG] [--device DEVICE] [--weights WEIGHTS]
                [--qua_weight QUA_WEIGHT] [--source SOURCE]
                [--imgsz IMGSZ [IMGSZ ...]] [--conf-thres CONF_THRES]
                [--iou-thres IOU_THRES] [--classes CLASSES [CLASSES ...]]
                [--agnostic-nms] [--output OUTPUT]

optional arguments:
  -h, --help            show this help message and exit
  --cfg CFG             model.yaml
  --device DEVICE       device, i.e. 0 or 0,1,2,3 or cpu    # 默認cpu
  --weights WEIGHTS     model.pt path(s)
  --qua_weight QUA_WEIGHT
                        model.pt path(s)
  --source SOURCE       source
  --imgsz IMGSZ [IMGSZ ...], --img IMGSZ [IMGSZ ...], --img-size IMGSZ [IMGSZ ...]
                        inference size h,w
  --conf-thres CONF_THRES
                        object confidence threshold
  --iou-thres IOU_THRES
                        IOU threshold for NMS
  --classes CLASSES [CLASSES ...]
                        filter by class: --class 0, or --class 0 2 3
  --agnostic-nms        class-agnostic NMS
  --output OUTPUT       output folder

將torch對齊后的yolov5s-nozip.pth文件復制到quantize_online文件夾根目錄下。

$ python quant.py --cfg models/yolov5s.yaml --weights v5.0/yolov5s-nozip.pth
CNML: 7.10.3 85350b141
CNRT: 4.10.4 41e356b
Namespace(agnostic_nms=False, cfg='models/yolov5s.yaml', classes=None, conf_thres=0.3, device='cpu', imgsz=[640], iou_thres=0.45, output='./results/cpu', qua_weight='yolov5_quan.pt', source='data/images', weights='v5.0/yolov5s-nozip.pth')
image 1/2 /home/share/pytorch/yolov5/quantize_online_v5.0/data/images/bus.jpg: r 0.5925925925925926
torch.Size([1, 3, 640, 640])
[tensor([[1.11905e+02, 2.35018e+02, 2.15107e+02, 5.23988e+02, 8.86216e-01, 0.00000e+00],
        [2.11545e+02, 2.41887e+02, 2.85995e+02, 5.09628e+02, 8.55155e-01, 0.00000e+00],
        [4.76838e+02, 2.42796e+02, 5.61337e+02, 5.18281e+02, 8.49822e-01, 0.00000e+00],
        [7.89480e+01, 1.29193e+02, 5.60420e+02, 4.37727e+02, 7.12828e-01, 5.00000e+00],
        [8.04472e+01, 3.21336e+02, 1.24692e+02, 5.24205e+02, 3.92542e-01, 0.00000e+00]], grad_fn=<IndexBackward>)]
results/cpu/bus.jpg
640x640 4 persons, 1 buss, 
image 2/2 /home/share/pytorch/yolov5/quantize_online_v5.0/data/images/zidane.jpg: r 0.5
torch.Size([1, 3, 640, 640])
[tensor([[374.74130, 161.78339, 573.84186, 492.30505,   0.87496,   0.00000],
        [216.89871, 356.90222, 258.78680, 497.36224,   0.69026,  27.00000],
        [ 57.89629, 237.86765, 548.31989, 494.05441,   0.62544,   0.00000]], grad_fn=<IndexBackward>)]
results/cpu/zidane.jpg
640x640 2 persons, 1 ties, 

SAVE quantize model: yolov5_quan.pt
  • 執行過程
    • 讀取yolov5權重文件
    • 調用量化接口:dtype默認為int8
    • 圖片預處理
    • 前處理
    • CPU推理
    • CPU 后處理
    • 保存量化模型
  • 執行結果
    • 獲得量化模型文件:yolov5_quan.pt
    • cpu推理結果保存在:results/cpu/

3.MLU在線推理

在已安裝pytorch_mlu且具備mlu計算卡的環境下執行

mlu推理程序參數說明

$ python detect.py --help
usage: detect.py [-h] [--cfg CFG] [--device DEVICE] [--qua_weight QUA_WEIGHT]
                 [--jit JIT] [--half_input HALF_INPUT] [--save SAVE]
                 [--mcore MCORE] [--core_number CORE_NUMBER]
                 [--batch_size BATCH_SIZE] [--fuse]
                 [--fake_device FAKE_DEVICE] [--mname MNAME] [--output OUTPUT]
                 [--source SOURCE] [--imgsz IMGSZ [IMGSZ ...]]

optional arguments:
  -h, --help            show this help message and exit
  --cfg CFG             model.yaml
  --device DEVICE       device, i.e. mlu or cpu # 內部固定使用mlu
  --qua_weight QUA_WEIGHT   # 量化后的權重文件,默認yolov5_quan.pt
                        model.pt path(s)
  --jit JIT             fusion  # false使用逐層模式,true使用融合模式
  --half_input HALF_INPUT
                        he input data type, 0-float32, 1-float16/Half, default
                        1.
  --save SAVE           selection of save *.cambrcion
  --mcore MCORE         Set MLU Architecture
  --core_number CORE_NUMBER
                        Core number of mfus and offline model with simple
                        compilation.
  --batch_size BATCH_SIZE
                        size of each image batch
  --fuse                Use Model fuse
  --fake_device FAKE_DEVICE
                        genoff offline cambricon without mlu device if fake
                        device is true. 1-fake_device, 0-mlu_device
  --mname MNAME         Name of the .pt offline file
  --output OUTPUT       output folder   # 默認./results/mlu
  --source SOURCE       source  # 默認data/images
  --imgsz IMGSZ [IMGSZ ...], --img IMGSZ [IMGSZ ...], --img-size IMGSZ [IMGSZ ...]
                        inference size h,w

執行融合模式推理,并生成離線模型。

# 開啟MLU優化配置,設置export CNML_OPTIMIZE=USE_CONFIG:config.ini ,取消unset CNML_OPTIMIZE
$ export CNML_OPTIMIZE=USE_CONFIG:config.ini

# 以mlu270 yolov5s  4core 1batch 為例,不使用卡執行
$ python detect.py --save true --jit true --mcore MLU270 --fake_device 1 --mname mlu270_yolov5_4c1b --batch_size 1 --core_number 4 --cfg models/yolov5s.yaml
CNML: 7.10.3 85350b141
CNRT: 4.10.4 41e356b
Namespace(batch_size=1, cfg='models/yolov5s.yaml', core_number=4, device='cpu', fake_device=1, fuse=False, half_input=1, imgsz=[640, 640], jit=True, mcore='MLU270', mname='mlu270_yolov5_4c1b', output='./results/mlu', qua_weight='yolov5_quan.pt', save=True, source='data/images')
weight: yolov5_quan.pt
half_input 
fake_device mode:save offline model mname:  mlu270_yolov5_4c1b
batchNum: 1

# 以mlu270 yolov5s  4core 1batch 為例,使用卡執行
$ python detect.py --save true --jit true --mcore MLU270 --fake_device 0 --mname mlu270_yolov5_4c1b --batch_size 1 --core_number 4 --cfg models/yolov5s.yaml
CNML: 7.10.3 85350b141
CNRT: 4.10.4 41e356b
Namespace(batch_size=1, cfg='models/yolov5s.yaml', core_number=4, device='cpu', fake_device=0, fuse=False, half_input=1, imgsz=[640, 640], jit=True, mcore='MLU270', mname='mlu270_yolov5_4c1b', output='./results/mlu', qua_weight='yolov5_quan.pt', save=True, source='data/images')
weight: yolov5_quan.pt
half_input 
batchNum: 1
mlu
image 1/2 /home/share/pytorch/yolov5/quantize_online_v5.0/data/images/bus.jpg: r 0.5925925925925926
torch.Size([1, 3, 640, 640])
batchNum: 1
num_boxes_final:  5.0
[tensor([[1.11000e+02, 2.36250e+02, 2.15125e+02, 5.24000e+02, 8.77930e-01, 0.00000e+00],
        [2.11875e+02, 2.44000e+02, 2.86750e+02, 5.07000e+02, 8.56445e-01, 0.00000e+00],
        [4.74250e+02, 2.46375e+02, 5.59000e+02, 5.16000e+02, 8.42773e-01, 0.00000e+00],
        [8.01250e+01, 3.25000e+02, 1.25500e+02, 5.22000e+02, 3.70850e-01, 0.00000e+00],
        [7.46875e+01, 1.22188e+02, 5.66000e+02, 4.44000e+02, 7.13867e-01, 5.00000e+00]])]
results/mlu/bus.jpg
640x640 4 persons, 1 buss, 
image 2/2 /home/share/pytorch/yolov5/quantize_online_v5.0/data/images/zidane.jpg: r 0.5
torch.Size([1, 3, 640, 640])
num_boxes_final:  3.0
[tensor([[374.00000, 162.00000, 573.00000, 492.50000,   0.89404,   0.00000],
        [ 57.03125, 238.87500, 557.50000, 493.75000,   0.59912,   0.00000],
        [216.87500, 357.00000, 259.50000, 496.25000,   0.59033,  27.00000]])]
results/mlu/zidane.jpg
640x640 2 persons, 1 ties, 
  • 如果是生成離線模型(--save true),且不使用卡( --fake_device 1),使用隨機數推理一次,直接退出。

  • 如果使用卡( --fake_device 0),則會加載--source的圖片進行推理。

    • mlu推理結果保存在:results/mlu/,如下圖所示:

      2022-03-04 18-08-44 的屏幕截圖.png
  • 生成離線模型文件:mlu270_yolov5_4c1b.cambricon

4.MLU離線推理

在具備CNRT、opencv和mlu計算卡的環境下執行

離線程序中包含頭文件"cnrt.h"(/usr/local/neuware/include/cnrt.h)

使用C++程序在mlu設備上運行離線模型mlu270_yolov5_4c1b.cambricon。

# 獲取yolov5離線推理程序
$ cd yolov5-offline_test/
# 復制離線模型到該目錄
$ cp [path]/mlu270_yolov5_4c1b.cambricon ./
# 編譯程序
$ make clean; make
# 執行離線推理
$ ./yolov5_offline_simple_demo ./mlu270_yolov5_4c1b.cambricon ./image.jpg ./output/offline_result.jpg
CNRT: 4.10.4 41e356b
---------
427 640
154 44 287 610
71 247 200 602
289 375 424 604
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容