本文以使用RAPIDS加速圖像搜尋任務為例,介紹如何在預裝鏡像的GPU執行個體上使用RAPIDS加速庫。
使用本教程進行操作前,請確定您已經注冊了阿裡雲賬号。如還未注冊,請先完成
賬号注冊。
RAPIDS,全稱Real-time Acceleration Platform for Integrated Data Science,是NVIDIA針對資料科學和機器學習推出的GPU加速庫。更多RAPIDS資訊請參見
官方網站基于圖像識别和搜尋,圖像搜尋任務可以實作以圖搜圖,在不同行業應用和業務場景中幫助您搜尋相同或相似的圖檔。
圖像搜尋任務背後的兩項主要技術是特征提取及向量化、向量索引和檢索。本文案例中,使用開源架構TensorFlow和Keras配置生産環境,然後使用ResNet50卷積神經網絡完成圖像的特征提取及向量化,最後使用RAPIDS cuML庫的KNN算法實作BF方式的向量索引和檢索。
說明: BF(Brute Force)檢索方法是一種百分百準确的方法,對距離衡量算法不敏感,适用于所有的距離算法。
本文案例在阿裡雲gn6v(NVIDIA Tesla V100)執行個體上執行。執行案例後,對比了GPU加速的RAPIDS cuml KNN與CPU實作的scikit-learn KNN的性能,可以看到GPU加速的KNN向量檢索速度為CPU的近600倍。
本文案例為單機單卡的版本,即一台GPU執行個體搭載一塊GPU卡。
操作步驟
執行以下操作完成一次圖像搜尋任務:
步驟一:建立GPU執行個體
具體步驟請參見
使用向導建立執行個體- 執行個體:RAPIDS僅适用于特定的GPU型号(采用NVIDIA Pascal及以上架構),是以您需要選擇GPU型号符合要求的執行個體規格,目前有gn6i、gn6v、gn5和gn5i。本文案例中,選用了ecs.gn6v-c8g1.2xlarge執行個體規格。
- 鏡像:在鏡像市場中使用關鍵字RAPIDS,搜尋并使用預裝了RAPIDS加速庫的鏡像。

- 安全組:選擇的安全組需要開放TCP 8888端口,用于支援通路JupyterLab服務。
步驟二:啟動和登入JupyterLab
-
連接配接GPU執行個體,運作以下指令啟動JupyterLab服務。
說明: 連接配接GPU執行個體的步驟請參見
連接配接方式導航# Go to the notebooks directory. cd /rapids # Run the following command to start JupyterLab and set the logon password: jupyter-lab --allow-root --ip=0.0.0.0 --no-browser --NotebookApp.token='your logon password' # Exit jupyterlab: press Ctrl+C twice.
- 在您的本地機器上打開浏覽器。輸入
http://(IP address of your GPU instance):8888
遠端通路JupyterLab。
說明: 推薦使用Chrome浏覽器。
- 輸入啟動指令中設定的密碼,然後單擊Log in。
GPU加速資料科學之四-如何# 在GPU執行個體上使用RAPIDS加速圖像搜尋任務
步驟三:執行圖像搜尋案例
- 進入案例所在目錄rapids_notebooks_v0.7/cuml。
- 輕按兩下cuml_knn.ipynb檔案。
- 單擊
GPU加速資料科學之四-如何# 在GPU執行個體上使用RAPIDS加速圖像搜尋任務 **說明:** 單擊一次執行一個cell,請單擊至案例執行結束,詳細說明請參見[案例執行過程](#section_vqt_ih6_0t7)。 
案例執行過程
圖像搜尋案例的執行過程分為三個步驟:處理資料集、提取圖檔特征和搜尋相似圖檔。本文案例結果中對比了GPU加速的RAPIDS cuml KNN與CPU實作的scikit-learn KNN的性能。
- 處理資料集。
- 下載下傳和解壓資料集。 本文案例中使用了 STL-10 資料集,該資料集中包含10萬張未打标的圖檔,圖檔的尺寸均為:96 x 96 x 3。您可以使用其他資料集,為便于提取圖檔特征,請確定資料集中圖檔的尺寸相同。
本文案例提供了`download_and_extract(data_dir)`方法供您下載下傳和解壓STL-10資料集。RAPIDS鏡像中已經将資料集下載下傳到./data目錄,您可以執行`download_and_extract()`方法直接解壓資料集。 
- 讀取圖檔。 從資料集解壓出的資料為二進制格式,執行
方法加載資料并轉換為NHWC(batch, height, width, channels)格式,以便用Tensorflow提取圖檔特征。read_all_images(path_to_data)

- 展示圖檔。 執行
方法随機展示一張資料集中的圖檔。show_image(image)

- 分割資料集。 按照9:1的比例把資料集分為兩部分,分别用于建立圖檔索引庫和搜尋圖檔。

- 下載下傳和解壓資料集。 本文案例中使用了 STL-10 資料集,該資料集中包含10萬張未打标的圖檔,圖檔的尺寸均為:96 x 96 x 3。您可以使用其他資料集,為便于提取圖檔特征,請確定資料集中圖檔的尺寸相同。
- 提取圖檔特征。 使用開源架構Tensorflow和Keras提取圖檔特征,其中模型為基于ImageNet資料集的ResNet50(notop)預訓練模型。
- 設定Tensorflow參數。 Tensorflow預設使用所有GPU顯存,我們需要留出部分GPU顯存供cuML使用。您可以選擇一種方法設定GPU顯存參數:
- 方法1:依據運作需求進行顯存配置設定。
config.gpu_options.allow_growth = True
- 方法1:依據運作需求進行顯存配置設定。
- 設定Tensorflow參數。 Tensorflow預設使用所有GPU顯存,我們需要留出部分GPU顯存供cuML使用。您可以選擇一種方法設定GPU顯存參數:
- 方法2:設定可以使用的GPU顯存比例。本案例中使用方法2,并且GPU顯存比例預設設定為0.3,即Tensorflow可以使用整塊GPU顯存的30%,您可以依據應用場景修改比例。
config.gpu_options.per_process_gpu_memory_fraction = 0.3

2. 下載下傳ResNet50(notop)預訓練模型。 連接配接公網下載下傳模型(大小約91M),下載下傳完成後預設儲存到/root/.keras/models/目錄。
|參數名稱|說明|
|----|--|
|weights|取值範圍: - None:随機初始化權重值。
- imagenet:權重值的初始值設定為通過ImageNet預訓練過的模型的權重值。
本案例中設定為imagenet。
|
|include\_top|取值範圍: - True:包含整個ResNet50網絡結構的最後一個全連結層。
- False:不包含整個ResNet50網絡結構的最後一個全連結層。
本案例中,使用神經網絡模型ResNet50的主要目的是提取圖檔特征而非分類圖檔,是以設定為False。
|input\_shape|可選參數,用于設定圖檔的輸入shape,僅在include\_top設定為False時生效。您必須為圖檔設定3個inputs channels,且寬和高不應低于32。此處設為\(96, 96, 3\)。|
|pooling|在include\_top設定為False時,您需要設定池化層模式,取值範圍: - None:輸出為4D tensor。
- avg:平均池化,輸出為2D tensor。
- max:最大池化,輸出為2D tensor。
本案例中設定為max。|

您可以執行`model.summary()`方法檢視模型的網絡結構。

3. 提取圖檔特征。 對分割得到的兩個圖檔資料集執行`model.predict()`方法提取圖檔特征。

- 搜尋相似圖檔。
- 使用cuml KNN搜尋相似圖檔。 通過
k=3
設定K值為3,即查找最相似的3張圖檔,您可以依據使用場景自定義K值。
其中,
方法為建立索引階段,knn_cuml.fit()
為搜尋近鄰階段。knn_cuml.kneighbors()
KNN向量檢索耗時791 ms。GPU加速資料科學之四-如何# 在GPU執行個體上使用RAPIDS加速圖像搜尋任務 - 使用scikit-learn KNN搜尋相似圖檔。 通過
設定K值為3,通過n_neighbors=3
n_jobs=-1
設定使用所有CPU進行近鄰搜尋。
說明: ecs.gn6v-c8g1.2xlarge的配置為8 vCPU。
KNN向量檢索耗時7分34秒。GPU加速資料科學之四-如何# 在GPU執行個體上使用RAPIDS加速圖像搜尋任務 -
對比cuml KNN和scikit-learn KNN的搜尋結果。 對比兩種方式的KNN向量檢索速度,使用GPU加速的cuml KNN耗時791 ms,使用CPU的scikit-learn KNN耗時7min 34s。前者為後者的近600倍。
驗證兩種方式的輸出結果是否相同,輸出結果為兩個數組:
- distance:最小的K個距離值。本案例中搜尋了10000張圖檔,K值為3,是以
distance.shape=(10000,3)
- indices:對應的圖檔索引。
由于本案例所用資料集中存在重複圖檔,容易出現圖檔相同但索引不同的情況,是以使用distances,不使用indices對比結果。考慮到計算誤差,如果兩種方法得出的10000張圖檔中的3個最小距離值誤差都小于1,則認為結果相同。indices.shape=(10000, 3)
GPU加速資料科學之四-如何# 在GPU執行個體上使用RAPIDS加速圖像搜尋任務 - distance:最小的K個距離值。本案例中搜尋了10000張圖檔,K值為3,是以
- 使用cuml KNN搜尋相似圖檔。 通過
圖檔搜尋結果
本案例從1萬張搜尋圖檔中随機選擇5張圖檔并搜尋相似圖檔,最終展示出5行4列圖檔。
第一列為搜尋圖檔,第二列至第四列為圖檔索引庫中的相似圖檔,且相似性依次遞減。每張相似圖檔的标題為計算的距離,數值越大相似性越低。