Leo Yeh's Blog

SAS Viya (111)

教學目標

初步了解 SAS Python DLPy 套件匯入和匯出 ONNX 格式的模型的基本概念。

重點概念

首先 ONNX (Open Neural Network Exchange) 主要是一套開放神經網路交換格式,由 Facebook 和 Microsoft 結盟所推出,並且獲得 SAS、Amazon、IBM、Intel、AMD、ARM、… 等廠商的支援,我們將能夠透過 ONNX 格式來使用所選擇的任何深度學習框架來設計、訓練和部署深度學習模型,同時 ONNX 格式能夠在不同深度學習框架格式之間輕鬆進行互通,以利讓不同標準的深度學習模型可以互相轉換,加快人工智慧的發展,像是 Google 的 TensorFlow、Amazon 的 MXNet、Facebook 的 Caffe2/PyTorch、Microsoft 的 CNTK、… 等等。至於 SAS Viya 平台目前也能夠透過 SAS Python DLPy 套件匯入和匯出 ONNX 格式的模型,同時更能夠將匯入的深度學習模型儲存為 SAS SAS ASTORE 分析儲存檔,以利能夠透過 REST API 部署至應用程式中,至於目前已經有哪些 ONNX 格式的模型能夠使用呢?我們則能夠透過 ONNX Model Zoo 網站 下載最新的深度學習模型,並且已經測試為目前最優的效能。

接著我們將能夠透過官方所提供的 Python 範例程式碼 將其中一種 ONNX 格式的模型匯入至 SAS Viya 平台中進行影像辨識的操作,以下將進行詳細說明。至於所謂 ONNX 格式主要定義了一種可擴充套件的計算圖模型,並且內建運算單元和標準資料類型,以及每一個計算流程圖皆定義為由節點所組成的列表,同時建立為有向無循環圖,其中每一個節點皆有一個或多個輸入和輸出,而每一個節點也稱為運算單元,此外更進一步 ONNX 格式採用的是 Protobuf 序列化資料結構協定用於儲存神經網路的權重資訊,然後能夠讓各種程式語言進行讀取和寫入,因此 ONNX 格式為一種通用的計算圖,能夠讓不同深度學習框架所建立的計算圖皆能夠進行轉換。

下載 ONNX 格式的 ResNet50 模型檔案

1
$ wget https://s3.amazonaws.com/onnx-model-zoo/resnet/resnet50v1/resnet50v1.onnx

初始化設定操作環境

1
2
3
4
5
6
7
import os
os.environ['CAS_CLIENT_SSL_CA_LIST']='/opt/sas/viya/config/etc/SASSecurityCertificateFramework/cacerts/vault-ca.crt'
import swat, onnx, warnings
from dlpy import Model
from dlpy.images import ImageTable
warnings.filterwarnings('ignore')
s = swat.CAS("<SAS Viya URL>", 5570, "<Username>", "<Password>")

載入和匯入 ONNX 格式模型

主要指定用於訓練此模型的預處理,像是比例和偏移。

1
2
3
4
5
6
onnx_model = onnx.load_model('resnet50v1.onnx')
model1 = Model.from_onnx_model(s,
onnx_model,
output_model_table='resnet50v1',
scale=0.0173611,
offsets=[2.155, 2.027, 1.804])
1
2
3
4
NOTE: Successfully written weights file as /data/resnet50v1_weights.onnxmodel.h5
NOTE: Model table is attached successfully!
NOTE: Model is named to "resnet50v1" according to the model name in the table.
NOTE: Successfully imported ONNX model.

若是沒有 SAS Visual Data Mining and Machine Learning 的授權碼,則在執行時就會出現以下錯誤。

1
2
3
4
NOTE: Successfully written weights file as /data/resnet50v1_weights.onnxmodel.h5
ERROR: Could not find extension: (tkdl)
ERROR: Action set 'deeplearn' was not loaded due to errors.
ERROR: The action stopped due to errors.

取得深度學習模型基本資訊

1
model1.get_model_info()
Descr Value
0 Model Name resnet50v1
1 Model Type Convolutional Neural Network
2 Number of Layers 126
3 Number of Input Layers 1
4 Number of Output Layers 1
5 Number of Convolutional Layers 53
6 Number of Pooling Layers 2
7 Number of Fully Connected Layers 0
8 Number of Batch Normalization Layers 53
9 Number of Residual Layers 16

取得深度學習模型摘要資訊

1
model1.print_summary()
Layer Id Layer Type Kernel Size Stride Activation Output Size Number of Parameters
0 data input None (224, 224, 3) (0, 0)
1 resnetv17_conv0_fwd convo (7, 7) 2 Identity (112, 112, 64) (9408, 0)
2 resnetv17_batchnorm0_fwd batchnorm Rectifier (112, 112, 64) (0, 128)
3 resnetv17_pool0_fwd pool (3, 3) 2 Max (56, 56, 64) (0, 0)
4 resnetv17_stage1_conv3_fwd convo (1, 1) 1 Identity (56, 56, 256) (16384, 0)
5 resnetv17_stage1_batchnorm3_fwd batchnorm Identity (56, 56, 256) (0, 512)
121 resnetv17_stage4_conv9_fwd convo (1, 1) 1 Identity (7, 7, 2048) (1048576, 2048)
122 resnetv17_stage4_batchnorm9_fwd batchnorm Identity (7, 7, 2048) (0, 4096)
123 resnetv17_stage4__plus2 residual Rectifier (7, 7, 2048) (0, 0)
124 resnetv17_pool1_fwd pool (7, 7) 1 Mean (1, 1, 2048) (0, 0)
125 resnetv17_dense0_fwd output (2048, 1000) Softmax 1000 (2048000, 1000)

再來當我們將 ONNX 格式的 ResNet50 模型匯入至 SAS Viya 平台中,下一步就能夠透過進行影像辨識的預測分析,但是需要先從 ONNX 模型所產生的 H5 檔案中載入權重資訊至 SAS Viya 平台的深度學習模型中。至於所謂 H5 檔案主要是階層資料格式 (Hierarchical Data Format, HDF) 用來設計儲存和組織大量資料的一組檔案格式,其最初開發於美國國家超級計算應用中心,現今則用於儲存科學資料的檔案格式。此外 H5 檔案在記憶體佔用、壓縮大小和存取速度方面皆有非常優秀的特性,因此在工業領域和科學領域皆有很多應用,而 H5 檔案內部的資源主要是透過類似 POSIX 的語法進行存取 (/path/to/resource),並且簡化檔案結構僅包括兩種主要的物件類型,分別為資料集和群組,資料集主要是同質類型的多維陣列,群組主要是持有資料集和其他群組的容器結構,同時中繼資料是由使用者定義,以命名屬性的形式附加至資料集和群組中,因此任何複雜的儲存格式皆能夠透過資料集、群組和屬性來建立,當然由於使用 B-tree 來進行索引表格物件,所以更有效應用於時間序列資料,大量資料直接進入表格物件中,因此可以比 SQL 資料庫的欄位儲存方式有更佳的存取效能。

載入權重資訊至深度學習模型

1
model1.load_weights('/data/resnet50v1_weights.onnxmodel.h5', labels=True)
1
2
3
4
NOTE: Cloud Analytic Services made the uploaded file available as table NEW_LABEL_TABLE_HAMREG in caslib CASUSER(sasdemo01).
NOTE: The table NEW_LABEL_TABLE_HAMREG has been created in caslib CASUSER(sasdemo01) from binary data uploaded to Cloud Analytic Services.

NOTE: no dataspec(s) provided - creating image classification model.
NOTE: Model weights attached successfully!

下載需要進行辨識的照片檔案

1
2
$ cd /data/images
$ wget https://upload.wikimedia.org/wikipedia/commons/6/66/An_up-close_picture_of_a_curious_male_domestic_shorthair_tabby_cat.jpg

透過深度學習模型進行影像辨識

1
2
3
4
img = ImageTable.load_files(s, path='/data/images')
img.resize(224)
model1.evaluate(img)
model1.plot_evaluate_res()

最後匯出模型檔案的格式主要有三種,分別為 SAS 資料集格式、SAS 分析儲存格式和 ONNX 格式,所謂 SAS 資料集格式就是儲存至 SAS Viya 平台中的 CAS 資料表,所謂 SAS 分析儲存格式就是儲存為 SAS ASTORE 分析儲存檔,可用於 SAS Event Streaming Processing 即時串流分析之即時評分的情境應用,所謂 ONNX 格式就是用於儲存模型的開放神經網路交換格式。因此建模人員能夠 SAS 官方所提供的 DLPy 套件匯入針對經典情境預先訓練的 ONNX 模型,並且匯出成 SAS ASTORE 分析儲存檔,更進一步用於 SAS Event Streaming Processing 進行即時串流分析之即時評分的情境應用。

匯出模型檔案為 SAS ASTORE 分析儲存檔

1
model1.deploy(path='/tmp', output_format='astore')
1
NOTE: Model astore file saved successfully.

相關資源

⬅️ Go back