本文介紹了如何在GPU執行個體上基於NGC環境使用RAPIDS加速庫,加速資料科學和機器學習任務,提高計算資源的使用效率。

背景資訊

RAPIDS,全稱Real-time Acceleration Platform for Integrated Data Science,是NVIDIA針對資料科學和機器學習推出的GPU加速庫。更多RAPIDS資訊請參見官方網站

NGC,全稱NVIDIA GPU CLOUD,是NVIDIA推出的一套深度學習生態系統,供開發人員免費訪問深度學習和機器學習軟體堆棧,快速搭建相應的開發環境。NGC網站提供了RAPIDS的Docker鏡像,預裝了相關的開發環境。

JupyterLab是一套互動開發環境,協助您高效地瀏覽、編輯和執行伺服器上的代碼檔案。

Dask是一款輕量級大資料架構,可以提升並行計算效率。

本文提供了一套基於NVIDIA的RAPIDS Demo代碼及資料集修改的範例程式碼,示範了在GPU執行個體上使用RAPIDS加速一個從ETL到ML Training端到端任務的過程。其中,ETL時使用RAPIDS的cuDF,ML Training時使用XGBoost。本文範例程式碼基於輕量級大資料架構Dask運行,為一套單機啟動並執行代碼。
说明 NVIDIA官方RAPIDS Demo代碼請參見Mortgage Demo

前提條件

  • 註冊阿里雲帳號並完成實名認證,請參見阿里雲帳號註冊流程個人實名認證
  • NGC註冊頁面註冊NGC帳號。
  • 擷取NGC API Key。
    1. 登入NGC網站
    2. 前往CONFIGURATION,單擊Get API Key
    3. 單擊Generate API Key
    4. Generate a New API Key中,單擊Confirm
      说明 新的NGC API Key會覆蓋舊的NGC API Key。如果您已持有NGC API Key,請確保不再需要舊的NGC API Key。
    5. 複製API Key並儲存到本地。

步驟一:擷取RAPIDS鏡像下載命令

  1. 登入NGC網站
  2. 開啟MACHINE LEARNING頁面,單擊RAPIDS鏡像。

  3. 擷取docker pull命令。

    本文範例程式碼基於RAPIDS 0.6版本鏡像編寫,因此在運行本範例程式碼時,使用Tag為0.6版本的鏡像。實際操作時,請選擇您匹配的版本。

    1. 選擇Tags頁簽。

    2. 找到並複製Tag資訊。本樣本中,選擇0.6-cuda10.0-runtime-ubuntu16.04-gcc5-py3.6

    3. 返回頁面頂部,複製Pull Command中的命令到文字編輯器,將鏡像版本替換為對應的Tag資訊,並儲存。 本樣本中,將cuda9.2-runtime-ubuntu16.04替換為0.6-cuda10.0-runtime-ubuntu16.04-gcc5-py3.6

      儲存的docker pull命令用於在步驟二中下載RAPIDS鏡像。



步驟二:部署RAPIDS環境

  1. 建立一台GPU執行個體。

    詳細步驟請參見使用嚮導建立執行個體

    • 執行個體:RAPIDS僅適用於特定的GPU型號(採用NVIDIA Pascal及以上架構),因此您需要選擇GPU型號符合要求的執行個體規格,目前有gn6i、gn6v、gn5和gn5i,詳細的GPU型號請參見執行個體規格類型系列。建議您選擇顯存更大的gn6i、gn6v或gn5執行個體。本樣本中,選用了顯存為16 GB的GPU執行個體。
    • 鏡像:在鏡像市場中搜尋並使用NVIDIA GPU Cloud VM Image

    • 公網頻寬:選擇分配公網IPv4地址或者在執行個體建立成功後綁定EIP地址
    • 安全性群組:選擇的安全性群組需要開放以下連接埠:
      • TCP 22 連接埠,用於SSH登入
      • TCP 8888連接埠,用於支援訪問JupyterLab服務
      • TCP 8787連接埠、TCP 8786連接埠,用於支援訪問Dask服務
  2. 串連GPU執行個體。

    串連方式請參見串連Linux執行個體

  3. 輸入NGC API Key後按斷行符號鍵,登入NGC容器環境。

  4. (可選)運行nvidia-smi查看GPU型號、GPU驅動版本等GPU資訊。

    建議您瞭解GPU資訊,預判規避潛在問題。例如,如果NGC的驅動版本太低,新Docker鏡像版本可能會不支援。

  5. 運行在步驟一中擷取的docker pull命令下載RAPIDS鏡像。
    docker pull nvcr.io/nvidia/rapidsai/rapidsai:0.6-cuda10.0-runtime-ubuntu16.04-gcc5-py3.6
  6. (可選)查看下載的鏡像。

    建議您查看Docker鏡像資訊,確保下載了正確的鏡像。

    docker images
  7. 運行容器部署RAPIDS環境。
    docker run --runtime=nvidia \
            --rm -it \
            -p 8888:8888 \
            -p 8787:8787 \
            -p 8786:8786 \
            nvcr.io/nvidia/rapidsai/rapidsai:0.6-cuda10.0-runtime-ubuntu16.04-gcc5-py3.6

步驟三:運行RAPIDS Demo

  1. 在GPU執行個體上下載資料集和Demo檔案。
    # 擷取apt源地址並下載指令碼(指令碼功能:下載訓練資料、notebook、utils)
    $ source_address=$(curl http://100.100.100.200/latest/meta-data/source-address|head -n 1)
    $ source_address="${source_address}/opsx/ecs/linux/binary/machine_learning/"
    $ wget $source_address/rapids_notebooks_v0.6/utils/download_v0.6.sh
    # 執行下載指令碼
    $ sh ./download_v0.6.sh
    # 切換到下載目錄查看下載檔案
    $ apt update
    $ apt install tree
    $ tree /rapids/rapids_notebooks_v0.6/
    下載成功後的檔案結構如下圖,共5個檔案夾、16個檔案:

  2. 在GPU執行個體上啟動JupyterLab服務。

    推薦直接使用命令啟動。

    # 切換到工作目錄
    $ cd /rapids/rapids_notebooks_v0.6/xgboost
    # 啟動jupyter-lab,直接使用命令啟動,並設定登入密碼
    $ jupyter-lab --allow-root --ip=0.0.0.0 --no-browser --NotebookApp.token='登入密碼'
    # 退出
    $ sh ../utils/stop-jupyter.sh
    • 除使用命令外,您也可以執行指令碼$ sh ../utils/start-jupyter.sh啟動jupyter-lab,此時無法設定登入密碼。
    • 您也可以連續按兩次Ctrl+C退出。
  3. 開啟瀏覽器,在地址欄輸入http://您的GPU執行個體IP地址:8888遠端存取JupyterLab 。
    说明 推薦使用Chrome瀏覽器。
    如果您在啟動JupyterLab服務時設定了登入密碼,會跳轉到密碼輸入介面。

  4. 運行NoteBook代碼。

    該案例是一個抵押貸款迴歸的任務,詳細資料請參見代碼執行過程。登入成功後,可以看到NoteBook代碼的程式碼封裝括以下內容:

    • mortgage_2000_1gb檔案夾:儲存解壓後的訓練資料。該檔案夾下包含:acq檔案夾、perf檔案夾和names.csv檔案。
    • xgboost_E2E.ipynb檔案: XGBoost Demo檔案。雙擊檔案可以查看檔案詳情,單擊下圖中的執行按鈕可以逐步執行代碼,每次執行一個Cell。

    • mortgage_2000_1gb.tgz檔案: 2000年的抵押貸款迴歸訓練資料(1G分割的perf檔案夾下的檔案不會大於1G,使用1G分割的資料可以更有效利用GPU顯存)。

代碼執行過程

該案例基於XGBoost示範了資料預先處理到訓練的端到端的過程,主要分為三個階段:

  • ETL(Extract-Transform-Load):主要在GPU執行個體上進行。將業務系統的資料經過抽取、清洗轉換之後載入到資料倉儲。
  • Data Conversion:在GPU執行個體上進行。將在ETL階段處理過的資料轉換為用於XGBoost訓練的DMatrix格式。
  • ML-Training:預設在GPU執行個體上進行。使用XGBoost訓練梯度提升決策樹 。

NoteBook代碼的執行過程如下:

  1. 準備資料集。

    本案例的Shell指令碼會預設下載2000年的抵押貸款迴歸訓練資料(mortgage_2000_1gb.tgz),並解壓到mortgage_2000_1gb檔案夾。

    如果您想擷取更多資料用於XGBoost模型訓練,可以設定參數download_url指定下載路徑,具體下載地址請參見Mortgage Data

    樣本效果如下 :



  2. 設定相關參數。
    參數名稱 說明
    start_year 指定選擇訓練資料的起始時間,ETL時會處理start_yearend_year之間的資料。
    end_year 指定選擇訓練資料的結束時間,ETL時會處理start_yearend_year之間的資料。
    train_with_gpu 是否使用GPU進行XGBoost模型訓練,預設為True
    gpu_count 指定啟動worker的數量,預設為1。您可以按需要設定參數值,但不能超出GPU執行個體的GPU數量。
    part_count 指定用於模型訓練的performance檔案的數量,預設為 2 * gpu_count。如果參數值過大,在Data Conversion階段會報錯超出GPU記憶體限制,錯誤資訊會在NoteBook後台輸出。

    樣本效果如下:



  3. 啟動Dask服務。

    代碼會啟動Dask Scheduler,並根據gpu_count參數啟動worker用於ETL和模型訓練。

    樣本效果如下:



  4. 啟動ETL。

    ETL階段會進行到表關聯、分組、彙總、切片等操作,資料格式採用cuDF庫的DataFrame格式(類似於pandas的DataFrame格式)。

    樣本效果如下:



  5. 啟動Data Conversion。

    將DataFrame格式的資料轉換為用於XGBoost訓練的DMatrix格式,每個worker處理一個DMatrix對象。

    樣本效果如下:



  6. 啟動ML Training。

    使用dask-xgboost啟動模型訓練,dask-xgboost負責多個dask worker間的通訊協同工作,底層仍然調用xgboost執行模型訓練。

    樣本效果如下:



相關函數

函數功能 函數名稱
下載檔案 def download_file_from_url(url, filename):
解壓檔案 def decompress_file(filename, path):
擷取當前機器的GPU個數 def get_gpu_nums():
管理GPU記憶體
  • def initialize_rmm_pool():
  • def initialize_rmm_no_pool():
  • def run_dask_task(func, **kwargs):
提交DASK任務
  • def process_quarter_gpu(year=2000, quarter=1, perf_file=""):
  • def run_gpu_workflow(quarter=1, year=2000, perf_file="", **kwargs):
使用cuDF從CSV中載入資料
  • def gpu_load_performance_csv(performance_path, **kwargs):
  • def gpu_load_acquisition_csv(acquisition_path, **kwargs):
  • def gpu_load_names(**kwargs):
處理和提取訓練資料的特徵
  • def null_workaround(df, **kwargs):
  • def create_ever_features(gdf, **kwargs):
  • def join_ever_delinq_features(everdf_tmp, delinq_merge, **kwargs):
  • def create_joined_df(gdf, everdf, **kwargs):
  • def create_12_mon_features(joined_df, **kwargs):
  • def combine_joined_12_mon(joined_df, testdf, **kwargs):
  • def final_performance_delinquency(gdf, joined_df, **kwargs):
  • def join_perf_acq_gdfs(perf, acq, **kwargs):
  • def last_mile_cleaning(df, **kwargs):