本文介紹了如何在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是一款輕量級大資料架構,可以提升並行計算效率。
前提條件
步驟一:擷取RAPIDS鏡像下載命令
- 登入NGC網站。
- 開啟MACHINE LEARNING頁面,單擊RAPIDS鏡像。
- 擷取docker pull命令。
本文範例程式碼基於RAPIDS 0.6版本鏡像編寫,因此在運行本範例程式碼時,使用Tag為0.6版本的鏡像。實際操作時,請選擇您匹配的版本。
- 選擇Tags頁簽。
- 找到並複製Tag資訊。本樣本中,選擇
0.6-cuda10.0-runtime-ubuntu16.04-gcc5-py3.6
。 - 返回頁面頂部,複製Pull Command中的命令到文字編輯器,將鏡像版本替換為對應的Tag資訊,並儲存。 本樣本中,將
cuda9.2-runtime-ubuntu16.04
替換為0.6-cuda10.0-runtime-ubuntu16.04-gcc5-py3.6
。儲存的docker pull命令用於在步驟二中下載RAPIDS鏡像。
- 選擇Tags頁簽。
步驟二:部署RAPIDS環境
- 建立一台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服務
- 串連GPU執行個體。
串連方式請參見串連Linux執行個體。
- 輸入NGC API Key後按斷行符號鍵,登入NGC容器環境。
- (可選)運行nvidia-smi查看GPU型號、GPU驅動版本等GPU資訊。
建議您瞭解GPU資訊,預判規避潛在問題。例如,如果NGC的驅動版本太低,新Docker鏡像版本可能會不支援。
- 運行在步驟一中擷取的docker pull命令下載RAPIDS鏡像。
docker pull nvcr.io/nvidia/rapidsai/rapidsai:0.6-cuda10.0-runtime-ubuntu16.04-gcc5-py3.6
- (可選)查看下載的鏡像。
建議您查看Docker鏡像資訊,確保下載了正確的鏡像。
docker images
- 運行容器部署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
- 在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個檔案: - 在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
退出。
- 除使用命令外,您也可以執行指令碼
- 開啟瀏覽器,在地址欄輸入
http://您的GPU執行個體IP地址:8888
遠端存取JupyterLab 。说明 推薦使用Chrome瀏覽器。如果您在啟動JupyterLab服務時設定了登入密碼,會跳轉到密碼輸入介面。 - 運行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代碼的執行過程如下:
- 準備資料集。
本案例的Shell指令碼會預設下載2000年的抵押貸款迴歸訓練資料(mortgage_2000_1gb.tgz),並解壓到mortgage_2000_1gb檔案夾。
如果您想擷取更多資料用於XGBoost模型訓練,可以設定參數download_url指定下載路徑,具體下載地址請參見Mortgage Data。
樣本效果如下 :
- 設定相關參數。
參數名稱 說明 start_year 指定選擇訓練資料的起始時間,ETL時會處理start_year到end_year之間的資料。 end_year 指定選擇訓練資料的結束時間,ETL時會處理start_year到end_year之間的資料。 train_with_gpu 是否使用GPU進行XGBoost模型訓練,預設為True。 gpu_count 指定啟動worker的數量,預設為1。您可以按需要設定參數值,但不能超出GPU執行個體的GPU數量。 part_count 指定用於模型訓練的performance檔案的數量,預設為 2 * gpu_count。如果參數值過大,在Data Conversion階段會報錯超出GPU記憶體限制,錯誤資訊會在NoteBook後台輸出。 樣本效果如下:
- 啟動Dask服務。
代碼會啟動Dask Scheduler,並根據gpu_count參數啟動worker用於ETL和模型訓練。
樣本效果如下:
- 啟動ETL。
ETL階段會進行到表關聯、分組、彙總、切片等操作,資料格式採用cuDF庫的DataFrame格式(類似於pandas的DataFrame格式)。
樣本效果如下:
- 啟動Data Conversion。
將DataFrame格式的資料轉換為用於XGBoost訓練的DMatrix格式,每個worker處理一個DMatrix對象。
樣本效果如下:
- 啟動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記憶體 |
|
提交DASK任務 |
|
使用cuDF從CSV中載入資料 |
|
處理和提取訓練資料的特徵 |
|