新聞中心

RAPIDS加速ML工作流,NVIDIA黑客松獲獎者揭秘策略 NEWS DETAIL

當前位置:首頁 > 新聞中心
資訊分類 · 新聞中心 發佈時間 · 2025-01-06

今年,大約 220 個團隊齊聚開放資料科學大會 (ODSC) 西部,參加 NVIDIA 黑客松競賽,這是一場 24 小時機器學習 (ML) 競賽。資料科學家和工程師設計了基於準確性和處理速度進行評估的模型。排名前三名的團隊帶著獎品禮包離去,其中包括 NVIDIA RTX Ada Generation GPUs 、Google Colab 積分等。為了贏得這些榜單,獲勝團隊利用 RAPIDS Python APIs 提供了更準確、更高性能的解決方案。

在 ODSC 的演講中,NVIDIA RAPIDS AI 產品負責人 Nick Becker 強調,AI 的計算需求,加上生成的資料量不斷增加,正在推動資料處理成為加速計算的下一階段。如今,我們每天會生成約 403 million terabytes 的資料,這給資料中心帶來了巨大壓力,他們必須高效處理更多資料,以實現更高的準確性、隱私性和更快的響應速度。

隨著企業端到端運營和簡化 AI 系統,他們需要解決相關的資料處理瓶頸。加速計算可為當今日益複雜的工作流程實現更高效的處理。

NVIDIA Hackathon 競賽展示了資料科學家如何通過 PyData 庫利用 GPU 加速來快速處理日益增多的資料,同時使用他們已經知道的語法,無需更改代碼。

我們為參與者提供了大約 10GB 的合成表格資料,其中包含 1200 萬個主題的資訊,每個主題均由 100 多個分類和數字匿名特徵進行描述。他們的任務是構建一個回歸模型來預測目標變量 y,並最小化根均方誤差 (RMSE),以實現準確性和速度。他們有 24 小時的時間來解決問題並優化解決方案。

參與者通過 pandas 或 Polars 利用 RAPIDS cuDF,一些參與者使用 RAPIDS cuML 或 XGBoost 來優化資料處理和模型訓練。參與者被鼓勵應用 Exploratory Data Analysis (EDA) 和 feature engineering,並 ensemble 多個 ML 算法。

本文介紹了前三名獲獎者的見解和策略:Shyamal Shah、Feifan Liu 以及隊友 Himalaya Dua 和 Sara Zare,以及 Lorenzo Mondragon。用他們自己的話來說,他們分享了如何應對挑戰,以及如何生成更快速、更準確的解決方案的一些提示和技巧。

Photo of NVIDIA hackathon participants sitting around tables working on laptops.

第一名:Shyamal Shah

NVIDIA 編程馬拉松要求我通過 Google Colab 使用功能強大的 NVIDIA GPUs 分析大量表格資料集。我的方法通過幾個關鍵優化來優先考慮計算效率和預測準確性。首先,我利用 cuDF pandas 擴展程序 來利用 NVIDIA RAPIDS 生態系統,該擴展程序可自動加速 GPU 上的 pandas 操作。通過詳細的特徵分析,我發現 20 個數值特徵實際上是重復的,在歸一化時具有相同的統計屬性。根據這一見解,我只選擇了一個具有代表性的數值特徵,即「magical」列,該列的空值數量最少。

# Calculate statistics from training data

   base_median = train_df[base_feature].median()

   Q1 = train_df[base_feature].quantile(0.25)

   Q3 = train_df[base_feature].quantile(0.75)

   IQR = Q3 - Q1

   lower_bound = Q1 - 1.5 * IQR

   upper_bound = Q3 + 1.5 * IQR

# Process base feature

       df_processed['magical'] = df['magical'].fillna(base_median).clip(lower_bound, upper_bound)

對於高基數分類變量,我使用平滑實現了目標均值編碼,而不是傳統的獨熱編碼,這將顯著增加特徵維度。通過將最初的 106 個特徵縮小到三個關鍵預測變量,我在保持預測能力的同時大幅降低了計算開銷。

 

# Calculate robust target encodings for high-cardinality categorical variables

   cat_encodings = {}

   global_mean = train_df['y'].mean()

 

   for col in ['trickortreat', 'kingofhalloween']:

       # Group by category and calculate stats

       cat_stats = (train_df.groupby(col)['y']

                   .agg(['mean', 'count'])

                   .reset_index())

 

       # Only keep categories that appear more than once

       frequent_cats = cat_stats[cat_stats['count'] > 1]

 

       # Strong smoothing factor due to high cardinality

       smoothing = 100

 

       # Calculate smoothed means with stronger regularization

       frequent_cats['encoded'] = (

           (frequent_cats['count'] * frequent_cats['mean'] + smoothing * global_mean) /

           (frequent_cats['count'] + smoothing)

       )

 

       # Create dictionary only for frequent categories

       cat_encodings[col] = dict(zip(frequent_cats[col], frequent_cats['encoded']))

# Process categorical features

       for col in ['trickortreat', 'kingofhalloween']:

           # Map categories to encodings, with special handling for rare/unseen categories

           df_processed[f'{col}_encoded'] = (

               df[col].map(cat_encodings[col])

               .fillna(global_mean)  # Use global mean for rare/unseen categories

           )

該實施使用了 Microsoft 的 LightGBM 框架,該框架專為處理大型資料集而選擇 GPU 優化和頂級性能提升功能。

 

通過仔細調整參數和實驗迭代,我優化了模型的超參數,以平衡訓練速度和準確性。最終解決方案在實現高準確度的同時,僅需 1 分 47 秒即可完成訓練和預測週期。此經驗表明,在使用大規模資料集時,如何將 GPU 加速計算與周全的特徵工程和算法選擇相結合,從而獲得高效準確的解決方案。

第二名獲獎者:Feifan Liu 博士以及隊友 Himalaya Dua 和 Sara Zare

在我看來,我認為 cuDF pandas 非常高效且易於使用。熟悉原始 pandas 的用戶無需學習新的 API。它使加載和處理大量資料成為可能。

 

其中一個技巧是避免複雜的預處理,例如 imputation。將缺失值直接分配為 -1 (即在特徵空間中創建額外維度) 對性能和效率都有效。

 

train_df = df.copy()

# train_df = sample_20_df.copy()

categorical_cols = train_df.select_dtypes(include=['object', 'category']).columns.tolist()

numerical_cols = train_df.select_dtypes(include=['number']).columns.tolist()

num_col_only_minus_one = [col for col in numerical_cols if (train_df[col] < 0).sum()

> 0 and (train_df[col] < 0).sum() == (train_df[col] == -1).sum()]

train_df[categorical_cols] = train_df[categorical_cols].astype('category')

train_df[num_col_only_minus_one]=train_df[num_col_only_minus_one].replace(-1, np.nan)

 

test_df[categorical_cols] = test_df[categorical_cols].astype('category')

test_df[num_col_only_minus_one]=test_df[num_col_only_minus_one].replace(-1, np.nan)

另一個技巧是利用 XGBoost 中的 CUDA 支援來加速訓練。


#baseline parameters

xgb_regressor = xgb.XGBRegressor(objective='reg:squarederror', eval_metric = 'rmse',

max_depth= 5, n_estimators=500, random_state=42, device='cuda', enable_categorical=True)

第三名冠軍:Lorenzo Mondragon

為了應對這一挑戰,我利用 RAPIDS 將 GPU 加速集成到 Polars 和 pandas DataFrames 中。這實現了對 1200 萬行表格資料的高效預處理,包括處理缺失值、編碼分類特徵和採樣資料以優化模型訓練。

 

在回歸任務中,我利用具有 GPU 支援的 XGBoost (gpu_hist 樹方法) 來訓練具有針對準確性和性能進行微調的超參數的模型。我專注於:

 

使用列均值填充數字特徵,使用 "Unknown" 填充分類特徵。

將分類資料編碼為緊湊的 UInt32 格式,以提高內存效率。

通過 Polars 嘗試延遲加載和採樣,以加快資料提取和操作速度。

# 1. Handle missing values

numeric_cols = train_data.select(cs.numeric()).columns

categorical_cols = [

   col for col in train_data.columns

   if col not in numeric_cols and col not in ['id', 'y']

]

 

# Fill missing values

df = train_data.with_columns([

   # Fill numeric columns with mean

   *[

       pl.col(col).fill_null(pl.col(col).mean()).alias(col)

       for col in numeric_cols

   ],

   # Fill categorical columns with 'Unknown'

   *[

       pl.col(col).fill_null("Unknown").alias(col)

       for col in categorical_cols

   ]

])

在評估階段,用於預處理的 Polars 與 GPU 加速的 XGBoost 相結合,使我能夠在模型準確性和推理速度之間取得平衡。雖然我的模型在準確性方面排名第九,但在採用性能指標時,RAPIDS 帶來的效率提升使我的解決方案整體排名第三。

 

GPU 加速是一項顛覆性技術:使用 RAPIDS 可顯著縮短資料預處理和模型訓練時間,從而在緊張的時間限制內處理大型資料集。

與熟悉的工具無縫集成 :採用 RAPIDS 只需對現有 pandas 和 Polars 工作流程作出極少的更改,這凸顯了資料科學從業者可以使用 GPU 加速庫。

優化需要平衡: 雖然準確性至關重要,但在延遲和資源效率至關重要的真實場景中,針對速度進行優化同樣會產生影響。

社區和支援至關重要:黑客松期間提供的資源和專家建議非常寶貴,尤其是在使用 Polars GPU 引擎和 RAPIDS 等尖端工具時。