【Kaggle】2021 Shopee商品分類競賽 Part2:RAPIDS加速 !!

加速你的pipeline,大規模資料分析,NVIDIA RAPIDS簡介

倢愷 Oscar
8 min readMay 17, 2021

--

這是Shopee的商品分類競賽系列分析文的第二篇,如果還沒看第一篇的話推薦先回去補足基礎知識。

在Part 1時我有提到:雖然商品總數不多,但是對35000筆資料,每兩筆去算一個距離,等於有大約1億個距離要算,而每一個距離又要算200~300維的內積,相對整體運算量比較大。

而當我們運算量比較大的時候,一個可以使用的package就是RAPIDS!!!

在這篇文章我會介紹1. RAPIDS簡介
2. 安裝與使用RAPIDS

RAPIDS簡介

遇到資料量太大的時候,大部分我們常用的python package就會有運算太久、卡死的問題,像是pandas、Numpy、Scikit learn都有這個問題,而實際上有很多人開發不一樣的套件來加速大規模的運算、處理,像是平行化、分散式處理,這裡最知名的可能就是Spark+Hadoop,但是Spark+Hadoop本身的學習門檻較高,對大部分的資料科學家而言,需要的是一個只要改5~10行,就可以讓自己原本的code跑起來的套件。

而在python中我們就有包含DaskRayModinVaex、跟RAPIDS,以及其他套件可以使用。

快速比較一下,Modin跟Vaex較為容易使用,而Dask跟Ray較為完整,而RAPIDS則是你有GPU時才有用。

推薦一下Modin,Modin是可以幾乎直接取代Pandas使用的package,API涵蓋率極高,大部分Pandas有的功能Modin都有支援。而要使用Modin也很簡單,只要把
import pandas as pd
改成
import modin.pandas as pd
就會有明顯的提升。

而這次的Shopee競賽中就很多人使用RAPIDS來加速抽feature跟算距離的運算。

RAPIDS是NVIDIA開發用來支援NVIDIA GPU的大規模機器學習運算套件,先直接上他的效果圖。

運算時間 from https://rapids.ai/about.html

可以看到加速的效果遠遠超過一般CPU的分散式運算,而很多人過往如果學習過平行運算,對CUDA最痛苦的印象就是CUDA的code非常非常難寫!

而RAPIDS就是把機器學習相關常用的功能都幫你寫好、加速好,讓你可以只寫幾行code,就達成最高效的加速(這點其實跟深度學習的各種套件很像)

RAPIDS裡面API分很多類別,其中我最常使用的就只有兩個

  1. cuDF : GPU版本的dataframe,能夠取代大部分的pandas dataframe功能
  2. cuML : GPU版本的ML package,包含著大約8成常用的ML功能

其他還有cuGraph,是GPU版本的graph analysis,不過我沒用過所以這邊就不說明,細節可以直接參考RAPIDS API DOC

RAPIDS有自己的官方Medium,裡面會介紹每一次更新的feature,還有很多例子可以看,推薦大家直接去逛逛,以了解更多。

安裝與使用RAPIDS

RAPIDS目前比較支援linux環境,同時為了對應好CUDA環境,安裝其實相對比較麻煩,要先確定好自己的CUDA版本,基本上不像一般的package只要pip install sklearn之類的指令就好。

在安裝RAPIDS前要先確認自己的CUDA版本,常見辦法有下面3個1. 直接在terminal用nvcc看
nvcc --version
2. 找到cuda版本文件
cat /usr/local/cuda/version.txt
3. 使用pytorch查看(如果已經裝好pytorch可以直接使用這個)
import torch
print(torch.__version__)
print(torch.version.cuda)
print(torch.backends.cudnn.version())

確認好CUDA版本後直接到官網下載頁面,選擇對應的版本,找到下載指令即可下載。

示意圖

在使用RAPIDS的任意一個API前,有一個很重要的事情,就是我們的資料要試以RAPIDS的格式讀取才可以使用。

1. 如果原本資料是numpy,我們必須強制轉換成cuDF的格式。

import cudfdef np2cudf(df):
# convert numpy array to cuDF dataframe
df = pd.DataFrame({'fea%d'%i:df[:,i] for i in range(df.shape[1])})
pdf = cudf.DataFrame()
for c,column in enumerate(df):
pdf[str(c)] = df[column]
return pdf

2. 如果原本資料是pandas dataframe,也要轉換格是

import cudf
df = cudf.from_pandas(pdf)

3. 或是在讀取的時候直接使用cuDF讀取

import cudf
cudf.read_csv(filename)

只要轉換成cuDF的格式後,就可以使用RAPIDS的所有API!!

而cuML裡面的ML演算法,基本上都跟scikit learn使用方法一致。

from cuml.linear_model import LinearRegression
lr = LinearRegression(fit_intercept = True, normalize = False,
algorithm = "eig")
reg = lr.fit(X,y)

而在shopee這次的競賽,大家就很常用RAPIDS來加速抽取NLP feature、或是加速clustering、計算nearest neighbor …

詳情可以參考下面這幾個notebook

可以看到幾乎都只要改5~10行就跟原本的python code完全兼容,不用做很複雜的處理!!!

RAPIDS是一個真的非常易用的GPU大規模機器學習套件,非常推薦工作中必須要處理到大規模資料的人使用!!!

在這邊文章中我快速介紹了RAPIDS,因為使用方法跟pandas還有scikit learn很像所以我沒有贅述,之後會再找一次講解Vaex,另一個我很愛的python加速套件~

如果喜歡這篇文章可以幫我多拍手幾次XD,或是對於哪個類型文章有興趣都可以在留言區跟我講~ 後續會以中難度的ML/DS/AI知識為主,以及AI/HCI研究相關知識

參考資料

--

--

倢愷 Oscar

我是倢愷,CTO at TeraThinker an AI Adaptive Learning System Company。AI/HCI研究者,超過100場的ML、DL演講、workshop經驗。主要學習如何將AI落地於業界。 有家教、演講合作,可以email跟我聯絡:axk51013@gmail.com