摘要:CANN作為昇騰AI處理器的發動機,支援業界多種主流的AI框架,包括MindSpore、TensorFlow、Pytorch、Caffe等,並提供1200多個基礎運算元。

2021年7月8日,第四屆世界人工智慧大會在上海召開。華為輪值董事長鬍厚崑在開幕式發表演講,其中提到:華為推出了異構計算架構CANN(Compute Architecture for Neural Networks),CANN作為昇騰AI處理器的發動機,支援業界多種主流的AI框架,包括MindSpore、TensorFlow、Pytorch、Caffe等,並提供1200多個基礎運算元。同時,CANN具有開放易用的ACL(Ascend Computing Language)程式設計介面,並提供了網路模型的圖級和運算元級的編譯優化、自動調優等功能。CANN對上支援多種AI框架,對下服務AI處理器與程式設計,是提升昇騰AI處理器計算效率的關鍵平臺。

如何理解CANN,如何使用CANN,特別是如何基於CANN開放易用的ACL程式設計介面實現神經網路的快速部署呢?

相信我們大部分開發者對於訓練一個模型並不陌生,但對於將該模型部署到邊緣側,做成一個應用落地,去產生價值(或者叫幫你賺錢?),可能就不是特別清楚了。但,一旦談到可以幫你去幫你賺錢,我相信你一定會感興趣的,對嗎?

什麼?賺錢!說到這個事兒,我就知道你不困了哈!

我們發現在昇騰社群上已經提供了不少可線上體驗的案例,這些案例不但可以線上體驗效果,還可以進行線上實驗,同時開放了原始碼,可以通過開源社群提供的資源進行學習並給基於這些案例進行二次開發,真真正正的體驗、學習、開發三步走啊!

那麼我們選擇一些有意思的案例帶大家學習下基於CANN的昇騰AI應用開發過程,今天要給大家介紹的就是這個能夠吸引到你的卡通影象生成應用,無論是漂亮的小姐姐還是可愛的小萌寵都能幫你秒級生成,如下圖,選擇預置圖片或者是上傳自己的私照,點選“立即生成”即可體驗。

首先介紹下如何找到該應用:

進昇騰社群https://www.hiascend.com/

開發者->應用案例,Ok,你已經可以看到那個狗狗了,案例標題是“卡通影象生成”,點選進去你就看到了。

體驗就不說了,左邊選擇需要處理的圖片,也可以上傳自己的圖片,然後點選生成就可以了,圖片會上傳到華為雲昇騰AI計算資源上,推理後再回傳到前端展示,相隔千里卻仍能提供秒級體驗,這裡要給個大讚!

那麼接下來言歸正傳,帶你瞭解基於CANN的應用開發流程。完整開發流程如下:

0) 工程準備

硬體:伺服器及推理卡準備就緒, 安裝作業系統,配置網路。

訓練後的模型:Caffe、MindSpore、TensorFlow模型;

1)模型轉換

離線模型:Ascend310運算元列表, ATC轉換工具。

2) 運算元開發及除錯

自定義運算元開發:TBE DSL,TBE TIK等運算元開發工具。

3) 業務開發及除錯

ACL介面:資源初始化,資料傳輸,資料預處理,模型推理,資料後處理等。

4)效能調優

效能優化:瓶頸分析,記憶體優化,模型優化等。

看起來還挺複雜的,對吧??但是我們呢,是來解決主要矛盾的(先完成應用開發),其他的優化過程(精度、效能等)留著以後慢慢消化,來日方長,不是麼?

廢話不多說了,假定模型我們已經有了,也符合我們的需求,模型呢也是昇騰AI處理器已經支援的模型(無需做運算元開發),我們現在要做的就是理解模型,分析其前處理過程(給模型準備資料),後處理過程(結果展示),進行模型轉換得到離線模型,然後就是程式碼開發了(其實就是呼叫CANN ACL的各種API完成模型載入、推理的過程而已), 這裡選用python,CANN的pyACL用起來。

總結一下,在本例中我們只需要搞定如下過程:

  1. 理解模型 2. 模型轉換 3. 基於CANN ACL介面進行程式碼開發

1、理解模型

Yang Chen、Yong-Jin LIU等人提出的演算法 CartoonGAN: Generative Adversarial Networks for Photo Cartoonization基於GAN網路,迭代訓練生成器和判別器,由判別器提供的對抗性損失約束,最終將自然圖片轉換為具有卡通風格的圖片,效果驚豔。

下圖為卡通影象生成的整體框架:

以Generative Adversarial Networks(GAN)為基礎,其架構包括一個生成器(Generator)和一個判別器(Discriminator),通過迭代訓練兩個網路,由判別器提供的對抗性損失約束,最終使得網路能夠將自然圖片轉換為具有卡通風格的圖片結果,並且保持原圖片的內容資訊。

圖1 卡通影象生成整體架構

生成器結構

生成器採用自編碼器,為全卷積結構,包括編碼器如圖3,解碼器如圖4。

圖3 編碼器結構

圖4 解碼器結構

編碼器輸入為真實圖片,其架構由7×7的卷積核,步長為1的卷積層開始,隨後緊跟兩個步長為2的降取樣塊,進行特徵提取,對風格圖片生成有用的資訊將在這個過程中被提取。然後緊接4個殘差塊(Residual Block),用來重建內容特徵。

解碼器架構由5個殘差塊開始,通過兩個上取樣塊(步長為2)來實現對不同風格特徵的重建,最後在新增一層使用7×7卷積核、步長為1的卷積層,得到最終輸出生成的卡通圖片結果。

由於當前我們的目標是將訓練好的模型做成一個AI應用,所以這裡只需要瞭解生成器就夠了,從上面的結構中可以看出,該模型的輸入是影象,輸出也是影象,那麼預處理和後處理過程呢?

原始模型預處理和後處理

在Github能夠找到其測試指令碼:https://github.com/taki0112/CartoonGAN-Tensorflow/tree/890decc647fbfd90a5314290b2771c496562ada8

結合前面的理解,並通過對測試指令碼的研讀,能夠理解其影象預處理和後處理的方法

昇騰CANN軟體棧提供了兩套專門用於資料預處理的工具,其中一套叫做AIPP(AI Preprocessing) ;另一套叫做DVPP(Digital Vision Preprocessing)。

DVPP是CANN軟體棧中的數字視覺預處理模組,昇騰310 AI處理器支援摳圖縮放、jpeg編解碼、視訊編解碼、png解碼等功能。詳細請參考昇騰社群文件:

https://support.huaweicloud.com/devg-cannApplicationDev330/atlasapi_07_0131.html

AIPP用於在AI Core上完成影象預處理,包括色域轉換(轉換影象格式)、影象歸一化(減均值/乘係數)和摳圖(指定摳圖起始點,摳出神經網路需要大小的圖片)等,靜態AIPP可以在ATC模型轉換時通過設定引數完成,比較方便。詳細請參考昇騰社群文件:https://support.huaweicloud.com/tg-cannApplicationDev330/atlasatc_16_0015.html

在這裡,我們假設你已經瞭解了DVPP和AIPP,那麼基於對原始模型的理解,在影象預處理時DVPP和AIPP如下分工(分工的原則:DVPP+AIPP的處理要等價於原始模型的預處理過程):

DVPP:

1.解碼:JPEG圖片先解碼為YUV420SP,輸出寬128,高16對齊,例如:若輸入原始影象大小為(500, 375) 經過解碼後圖像大小變為(512, 384)

2.影象縮放:使用DVPP的VPC介面將影象縮放為模型要求的大小(256,256),要求寬16,高2對齊,將(512,384)影象中的有效資料(500,375)縮放到(256,256)

注:這裡也可以考慮等比例縮放,但由於等比例縮放要涉及到用AIPP裁剪,後期再講。

AIPP:

1.色域轉換:YUV->RGB

2.影象標準化,AIPP配置mean_chn=[127.5,127.5,127.5] min_chn=[0.5,0.5,0.5] var_reci_chn=[0.007874,0.007874,0.007874]

2)後處理

根據原始模型影象後處理流程,將影象畫素轉換到[0,255],然後進行儲存。該過程直接使用scipy庫實現。

2、模型轉換

原始網路模型是TensorFlow框架模型,而昇騰CANN軟體棧需要的模型是.om離線模型,因此,需要通過ATC模型轉換工具將.pb檔案轉換為Ascend 310處理器支援的Davinci模型檔案。

ATC模型轉換指令:

atc --output_type=FP32 --input_shape="train_real_A:1,256,256,3" --input_format=NHWC --output="./cartoonization" --soc_version=Ascend310 --insert_op_conf=./insert_op.cfg --framework=3 --model="./cartoonization.pb" --precision_mode=allow_fp32_to_fp16

重要引數說明:

--model:原始模型檔案路徑與檔名。

--output:轉換後的離線模型的路徑以及檔名。

--precision_mode=allow_fp32_to_fp16:設定網路模型的精度模式,優先保持原圖精度,如果網路模型中運算元支援float32,則保留原始精度float32;如果網路模型中運算元不支援float32,則直接降低精度到float16。

--insert_op_conf:插入運算元的配置檔案路徑與檔名,例如AIPP預處理運算元。

AIPP配置檔案,根據原始模型需處理進行AIPP檔案配置,本模型的配置檔案見下圖:

更多引數介紹可閱讀:https://support.huaweicloud.com/atctool-cann502alpha5infer/atlasatc_16_0037.html

3、應用開發

應用採用了下圖所示的模組化設計,通過各模組之間的協調配合完成一張圖片的推理輸出。

其中各個模組的主要功能點如下所示:

1.執行資源申請;

2.載入模型檔案,申請模型輸入輸出記憶體;

3.資料獲取,獲取要進行推理的原始影象;

4.資料預處理,模型的輸入影象進行預處理;

5.模型推理,將預處理後的資料輸入到模型進行推理;

6.推理結果解析,將推理結果進行後處理。

原始碼就不在這裡show了,昇騰社群提供了更好的學習路徑,可以直接通過線上實驗學習開發過程,直接點選右上側的線上實驗,即可免費體驗。

體驗完畢後,大家還可以移步開源倉庫去獲取原始碼,如果有任何問題,鼓勵大家去提issue與開發人員直接交流。https://gitee.com/ascend/samples/tree/master/python/contrib/cartoonGAN_picture

相關連結

模型論文參考連結如下:

https://openaccess.thecvf.com/content_cvpr_2018/papers/Chen_CartoonGAN_Generative_Adversarial_CVPR_2018_paper.pdf

原始模型部署連結如下:

https://gitee.com/syz825211943/cartoonization

相關原始碼可以在開源倉庫如下地址中獲取:

https://gitee.com/ascend/samples/tree/master/python/contrib/cartoonGAN_picture

點選關注,第一時間瞭解華為雲新鮮技術~