天天看點

GPU加速資料科學之四-如何# 在GPU執行個體上使用RAPIDS加速圖像搜尋任務

本文以使用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卡。

操作步驟

執行以下操作完成一次圖像搜尋任務:

  1. 建立GPU執行個體
  2. 啟動和登入JupyterLab
  3. 執行圖像搜尋案例

步驟一:建立GPU執行個體

具體步驟請參見

使用向導建立執行個體
  • 執行個體:RAPIDS僅适用于特定的GPU型号(采用NVIDIA Pascal及以上架構),是以您需要選擇GPU型号符合要求的執行個體規格,目前有gn6i、gn6v、gn5和gn5i。本文案例中,選用了ecs.gn6v-c8g1.2xlarge執行個體規格。
  • 鏡像:在鏡像市場中使用關鍵字RAPIDS,搜尋并使用預裝了RAPIDS加速庫的鏡像。
    ![](http://static-aliyun-doc.oss-cn-hangzhou.aliyuncs.com/assets/img/1188474/156642926856547_zh-CN.png)
               
  • 安全組:選擇的安全組需要開放TCP 8888端口,用于支援通路JupyterLab服務。

步驟二:啟動和登入JupyterLab

  1. 連接配接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.           
  2. 在您的本地機器上打開浏覽器。輸入

    http://(IP address of your GPU instance):8888

    遠端通路JupyterLab。

    說明: 推薦使用Chrome浏覽器。

  3. 輸入啟動指令中設定的密碼,然後單擊Log in。
    GPU加速資料科學之四-如何# 在GPU執行個體上使用RAPIDS加速圖像搜尋任務

步驟三:執行圖像搜尋案例

  1. 進入案例所在目錄rapids_notebooks_v0.7/cuml。
  2. 輕按兩下cuml_knn.ipynb檔案。
  3. 單擊
    GPU加速資料科學之四-如何# 在GPU執行個體上使用RAPIDS加速圖像搜尋任務
    **說明:** 單擊一次執行一個cell,請單擊至案例執行結束,詳細說明請參見[案例執行過程](#section_vqt_ih6_0t7)。
    
    ![](http://static-aliyun-doc.oss-cn-hangzhou.aliyuncs.com/assets/img/1188474/156642926854232_zh-CN.png)
               

案例執行過程

圖像搜尋案例的執行過程分為三個步驟:處理資料集、提取圖檔特征和搜尋相似圖檔。本文案例結果中對比了GPU加速的RAPIDS cuml KNN與CPU實作的scikit-learn KNN的性能。

  1. 處理資料集。
    1. 下載下傳和解壓資料集。 本文案例中使用了 STL-10 資料集,該資料集中包含10萬張未打标的圖檔,圖檔的尺寸均為:96 x 96 x 3。您可以使用其他資料集,為便于提取圖檔特征,請確定資料集中圖檔的尺寸相同。
      本文案例提供了`download_and_extract(data_dir)`方法供您下載下傳和解壓STL-10資料集。RAPIDS鏡像中已經将資料集下載下傳到./data目錄,您可以執行`download_and_extract()`方法直接解壓資料集。
      
      ![](http://static-aliyun-doc.oss-cn-hangzhou.aliyuncs.com/assets/img/1188474/156642926954233_zh-CN.png)
                 
    2. 讀取圖檔。 從資料集解壓出的資料為二進制格式,執行

      read_all_images(path_to_data)

      方法加載資料并轉換為NHWC(batch, height, width, channels)格式,以便用Tensorflow提取圖檔特征。
      ![](http://static-aliyun-doc.oss-cn-hangzhou.aliyuncs.com/assets/img/1188474/156642926954234_zh-CN.png)
                 
    3. 展示圖檔。 執行

      show_image(image)

      方法随機展示一張資料集中的圖檔。
      ![](http://static-aliyun-doc.oss-cn-hangzhou.aliyuncs.com/assets/img/1188474/156642926954237_zh-CN.png)
                 
    4. 分割資料集。 按照9:1的比例把資料集分為兩部分,分别用于建立圖檔索引庫和搜尋圖檔。
      ![](http://static-aliyun-doc.oss-cn-hangzhou.aliyuncs.com/assets/img/1188474/156642926954238_zh-CN.png)
                 
  2. 提取圖檔特征。 使用開源架構Tensorflow和Keras提取圖檔特征,其中模型為基于ImageNet資料集的ResNet50(notop)預訓練模型。
    1. 設定Tensorflow參數。 Tensorflow預設使用所有GPU顯存,我們需要留出部分GPU顯存供cuML使用。您可以選擇一種方法設定GPU顯存參數:
      • 方法1:依據運作需求進行顯存配置設定。
        config.gpu_options.allow_growth = True           
-   方法2:設定可以使用的GPU顯存比例。本案例中使用方法2,并且GPU顯存比例預設設定為0.3,即Tensorflow可以使用整塊GPU顯存的30%,您可以依據應用場景修改比例。
           
config.gpu_options.per_process_gpu_memory_fraction = 0.3           
![](http://static-aliyun-doc.oss-cn-hangzhou.aliyuncs.com/assets/img/1188474/156642927054241_zh-CN.png)

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。|

![](http://static-aliyun-doc.oss-cn-hangzhou.aliyuncs.com/assets/img/1188474/156642927054243_zh-CN.png)

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

    ![](http://static-aliyun-doc.oss-cn-hangzhou.aliyuncs.com/assets/img/1188474/156642927054248_zh-CN.png)

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

    ![](http://static-aliyun-doc.oss-cn-hangzhou.aliyuncs.com/assets/img/1188474/156642927154250_zh-CN.png)
           
  1. 搜尋相似圖檔。
    1. 使用cuml KNN搜尋相似圖檔。 通過

      k=3

      設定K值為3,即查找最相似的3張圖檔,您可以依據使用場景自定義K值。

      其中,

      knn_cuml.fit()

      方法為建立索引階段,

      knn_cuml.kneighbors()

      為搜尋近鄰階段。
      GPU加速資料科學之四-如何# 在GPU執行個體上使用RAPIDS加速圖像搜尋任務
      KNN向量檢索耗時791 ms。
    2. 使用scikit-learn KNN搜尋相似圖檔。 通過

      n_neighbors=3

      設定K值為3,通過

      n_jobs=-1

      設定使用所有CPU進行近鄰搜尋。

      說明: ecs.gn6v-c8g1.2xlarge的配置為8 vCPU。

      GPU加速資料科學之四-如何# 在GPU執行個體上使用RAPIDS加速圖像搜尋任務
      KNN向量檢索耗時7分34秒。
    3. 對比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:對應的圖檔索引。

        indices.shape=(10000, 3)

        由于本案例所用資料集中存在重複圖檔,容易出現圖檔相同但索引不同的情況,是以使用distances,不使用indices對比結果。考慮到計算誤差,如果兩種方法得出的10000張圖檔中的3個最小距離值誤差都小于1,則認為結果相同。
      GPU加速資料科學之四-如何# 在GPU執行個體上使用RAPIDS加速圖像搜尋任務

圖檔搜尋結果

本案例從1萬張搜尋圖檔中随機選擇5張圖檔并搜尋相似圖檔,最終展示出5行4列圖檔。

第一列為搜尋圖檔,第二列至第四列為圖檔索引庫中的相似圖檔,且相似性依次遞減。每張相似圖檔的标題為計算的距離,數值越大相似性越低。

GPU加速資料科學之四-如何# 在GPU執行個體上使用RAPIDS加速圖像搜尋任務

繼續閱讀