
今年,大約 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。用他們自己的話來說,他們分享了如何應對挑戰,以及如何生成更快速、更準確的解決方案的一些提示和技巧。

第一名: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 等尖端工具時。
WeChat
Profile