今年,大約 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 等尖端工具時。
了解詳情?
如果您不熟悉 RAPIDS,請查看這些 資源以開始使用 ,并試用這些 cuDF pandas 和 Polars 教程。您可以觀看網絡會議 Unlock Hackathon Success with NVIDIA: Tools and Q&A with NVIDIA Kaggle Grandmaster Jiwei Liu,了解如何使用 cuDF pandas 或 Polars 利用 GPU 加速,探索特征工程技術,并從此 Notebook 中獲得見解。此外,您還可以查看為黑客松 創建的示例 Notebook,其中一個用于 cuDF pandas,另一個用于 Polars GPU Engine ,同樣由 NVIDIA Kaggle Grandmaster 創建。
?