• <xmp id="om0om">
  • <table id="om0om"><noscript id="om0om"></noscript></table>
  • 3 月 19 日下午 2 點,鎖定 NVIDIA AI 網絡中文專場。立即注冊觀看
    數據科學

    NVIDIA 黑客松獲獎者分享 RAPIDS 加速機器學習工作流程的策略

    今年,大約 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.
    圖 1、超過 1000 人參加了 ODSC West 2024 的 NVIDIA 黑客松活動

    第一名: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 加速計算與周全的特征工程和算法選擇相結合,從而獲得高效準確的解決方案。

    Photo of hackathon winners Himalaya Dua, Sara Zare, and Shyamal standing outside NVIDIA headquarters.
    圖 2、與黑客松獲獎者一起參觀 NVIDIA 總部 (從左到右) Himalaya Dua、Sara Zare 和 Shyamal Shah
    Photo of hackathon winner Feifan Liu standing inside NVIDIA headquarters.
    圖 3、與黑客松獲獎者 Feifan Liu 一起參觀 NVIDIA 總部

    第二名獲獎者: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 pandasPolars 教程。您可以觀看網絡會議 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 創建。

    ?

    0

    標簽

    人人超碰97caoporen国产