我正在尝试将数千个文件连接成一个大数据帧,该数据帧将进一步馈送到 XGBoost 库进行训练。我正在 Sagemaker 训练实例上运行训练过程。训练过程在小数据集上运行没有任何错误。我在 ml.m5.4xlarge 实例(16vCPU 和 64GB 内存)上运行了包含 4M 行(6GB 数据)的一天数据集的训练,训练花费了大约 11 个小时并成功运行。然而,当我使用一周大约 41GB 的数据进行训练时,我在运行以下代码时遇到内存问题:
def _read_training_data(training_data_path: str) -> pd.DataFrame:
df = pd.read_csv(training_data_path)
return df
def read_training_data(
paths: List[str]
) -> pd.DataFrame:
# lazy loading of modules for training
import multiprocessing as mp
from concurrent.futures import ProcessPoolExecutor, as_completed
# get directories
ipaths = train_mdirnames(paths)
logger.info(f'start parallel data reading with {mp.cpu_count()} core')
df = None
with ProcessPoolExecutor(max_workers=mp.cpu_count()) as executor:
tasks = [
executor.submit(_read_training_data, ipath)
for ipath in ipaths]
for future in as_completed(tasks):
try:
_df = future.result()
df = _df if df is None else pd.concat([df, _df])
except Exception as e:
raise e
logger.info(f'have read {len(df)} data points')
在这种情况下读取海量数据的最佳方式是什么?
我们还计划用一个月的数据来训练数据,这将是巨大的。我们计划使用较小的实例或类似的实例读取此类数据,以避免高昂的成本,然后将巨大的串联数据帧提供给 XGBoost 库进行训练。
解决方案由
XGBoost
给出。您应该使用 DMatrix
并使用 外部内存版本:
来自文档:
处理大型数据集时,训练 XGBoost 模型可能具有挑战性,因为需要将整个数据集加载到内存中。这可能成本高昂,有时甚至不可行。从 1.5 开始,用户可以定义自定义迭代器来加载数据块以运行 XGBoost 算法。外部存储器可用于训练和预测,但训练是主要用例,这将是我们在本教程中的重点。对于预测和评估,用户可以自己迭代数据,而训练则需要将完整数据集加载到内存中。