XGBoost 库提供了梯度提升的实现,旨在提高速度和性能。
它被设计用来最大限度地利用您的计算资源,包括所有 CPU 核心和内存。
在这篇文章中,您将了解如何在 Amazon 云服务上设置服务器,以快速、经济地创建非常大的模型。
阅读本文后,您将了解
- 如何设置和配置 Amazon EC2 服务器实例以与 XGBoost 配合使用。
- 如何确认 XGBoost 的并行功能在您的服务器上正常运行。
- 如何将数据和代码传输到您的服务器并训练一个非常大的模型。
通过我的新书《XGBoost With Python》启动您的项目,其中包括所有示例的分步教程和 Python 源代码文件。
让我们开始吧。
- 更新于 2020 年 5 月:已更新说明。

如何使用亚马逊云服务(Amazon Web Services)在云端训练 XGBoost 模型
照片作者:Dennis Jarvis,部分权利保留。
在 Python 中使用 XGBoost 需要帮助吗?
参加我的免费 7 天电子邮件课程,探索 xgboost(含示例代码)。
立即点击注册,还将免费获得本课程的 PDF 电子书版本。
教程概述
过程非常简单。下面是我们将在本教程中完成的步骤的概述。
- 设置您的 AWS 账户(如果需要)。
- 启动您的 AWS 实例。
- 登录并运行您的代码。
- 训练一个 XGBoost 模型。
- 关闭您的 AWS 实例。
请注意,使用 Amazon 的虚拟服务器实例会产生费用。对于临时模型开发,费用非常低(例如,每小时不到一美元),这也是其吸引人的原因,但它并非免费。
服务器实例运行的是 Linux。了解如何在 Linux 或类 Unix 环境中导航是很有帮助的,但并非必需。我们只是运行 Python 脚本,所以不需要高级技能。
1. 设置您的 AWS 账户(如果需要)
您需要一个 Amazon Web Services 账户。
- 1. 您可以通过点击“Sign in to the Console”访问 Amazon Web Services portal 来创建账户。然后,您可以使用现有的 Amazon 账户登录或创建一个新账户。

AWS 登录按钮
- 2. 如果创建账户,您需要提供您的详细信息以及 Amazon 可以收费的有效信用卡。如果您已经是 Amazon 客户并且有存档的信用卡,则此过程会快得多。
注意:如果您创建了新账户,您可能需要向 Amazon 支持部门申请,才能在教程的其余部分中使用更大的(非免费)服务器实例。
2. 启动您的服务器实例
既然您已经有了 AWS 账户,您就可以启动一个 EC2 虚拟服务器实例来运行 XGBoost。
启动实例就像选择要加载的镜像并启动虚拟服务器一样简单。
我们将使用现有的 Fedora Linux 镜像,并手动安装 Python 和 XGBoost。
- 1. 如果您还没有登录,请登录您的 AWS 控制台。

AWS 控制台
- 2. 点击 EC2 以启动新的虚拟服务器。
- 3. 从右上角的下拉菜单中选择“N. California”。这一点很重要,否则您可能找不到我们要使用的镜像(称为 AMI)。

选择加州北部
- 4. 点击“Launch Instance”按钮。
- 5. 点击“Community AMIs”。AMI 是 Amazon Machine Image。它是服务器的冻结实例,您可以选择并实例化到新的虚拟服务器上。

社区 AMI
- 6. 在“Search community AMIs”搜索框中输入 AMI:“Fedora-Cloud-Base-24”并按 Enter。您应该会看到一个结果。
这是 Fedora Linux 24 版本的基础安装镜像。一个非常易于使用的 Linux 发行版。
- 7. 点击搜索结果中的“Select”来选择 AMI。
- 8. 现在您需要选择运行镜像的硬件。向下滚动并选择“c3.8xlarge”硬件。
这是一个大型实例,包含 32 个 CPU 核心、60 GB 内存和 2 个大型 SSD 磁盘。

选择 c3.8xlarge 实例类型
- 9. 点击“Review and Launch”来最终确定您的服务器实例的配置。
您会看到类似“Your instance configuration is not eligible for the free usage tier”的警告。这只是表明您将为服务器上的时间付费。我们知道这一点,请忽略此警告。

您的实例配置不符合免费使用套餐资格
- 10. 点击“Launch”按钮。
- 11. 选择您的 SSH 密钥对。
- 如果您有密钥对(因为您之前使用过 EC2),请选择“Choose an existing key pair”并从列表中选择您的密钥对。然后勾选“I acknowledge…”。
- 如果您没有密钥对,请选择“Create a new key pair”选项,然后输入一个“Key pair name”,例如“xgboost-keypair”。点击“Download Key Pair”按钮。
- 12. 打开终端,然后切换到您下载密钥对的目录。
- 13. 如果您还没有这样做,请限制您密钥对文件的访问权限。这是 SSH 访问服务器所必需的。例如,在您的控制台上,您可以输入:
1 2 |
cd Downloads chmod 600 xgboost-keypair.pem |
- 14. 点击“Launch Instances。”
注意:如果这是您第一次使用 AWS,Amazon 可能需要验证您的请求,这可能需要长达 2 小时(通常只需几分钟)。
- 15. 点击“View Instances”查看您的实例状态。

查看您正在运行的实例并记下其 IP 地址
您的服务器现在正在运行,随时可以登录。
3. 登录和配置
现在您已经启动了服务器实例,是时候登录并进行配置以供使用了。
您每次启动服务器都需要进行配置。因此,最好将所有工作批处理起来,以便充分利用配置好的服务器。
配置服务器不会花费太长时间,总共大约需要 10 分钟。
- 1. 如果您还没有这样做,请在您的 Amazon EC2 控制台中点击“View Instances”。
- 2. 将“Public IP”(屏幕下方的“Description”部分)复制到剪贴板。
在此示例中,我的 IP 地址是 52.53.185.166。
请勿使用此 IP 地址,您的 IP 地址会不同。.
- 3. 打开终端,然后切换到您下载密钥对的目录。使用 SSH 登录到您的服务器,例如您可以输入:
1 |
ssh -i xgboost-keypair.pem fedora@52.53.185.166 |
- 4. 第一次登录服务器实例时,可能会收到警告。您可以忽略此警告,只需输入“yes”并按 Enter。
您现在已登录到服务器。
通过输入以下命令,仔细检查您实例上的 CPU 核心数:
1 |
cat /proc/cpuinfo | grep processor | wc -l |
您应该看到
1 |
32 |
3a. 安装支持包
第一步是安装所有支持 XGBoost 的软件包。
这包括 GCC、Python 和 SciPy 堆栈。我们将使用 Fedora 的包管理器 dnf(新的 yum)。
注意:我们将使用 Python 2 和一些旧版本的库。这是故意的,因为这些说明对于最新版本的库和 Python 3 似乎不起作用。
这是一行命令:
1 |
sudo dnf install gcc gcc-c++ make git unzip python python2-numpy python2-scipy python2-scikit-learn python2-pandas python2-matplotlib |
出现提示时,输入“y”并按 Enter 确认要安装的软件包。
这将需要几分钟时间来下载和安装所有必需的软件包。
完成后,我们可以确认环境已成功安装。
i) 检查 GCC
类型
1 |
gcc --version |
您应该看到
1 2 3 4 |
gcc (GCC) 6.3.1 20161221 (Red Hat 6.3.1-1) Copyright (C) 2016 Free Software Foundation, Inc. 这是免费软件;有关复制条件,请参阅源代码。不提供任何 保证;即使是适销性或特定用途的适用性。 |
ii) 检查 Python
类型
1 |
python --version |
您应该看到
1 |
Python 2.7.13 |
iii) 检查 SciPy
类型
1 2 3 4 |
python -c "import scipy;print(scipy.__version__)" python -c "import numpy;print(numpy.__version__)" python -c "import pandas;print(pandas.__version__)" python -c "import sklearn;print(sklearn.__version__)" |
您应该会看到类似以下内容:
1 2 3 4 |
0.16.1 1.11.0 0.18.0 0.17.1 |
注意:如果任何检查失败,请停止并纠正任何错误。在继续之前,您必须拥有一个完整有效的工作环境。
现在我们准备安装 XGBoost 了。
3b. 构建和安装 XGBoost
XGBoost 的安装说明是完整的,我们可以直接遵循。
首先,我们需要在服务器上下载该项目。
1 2 3 |
git clone --recursive https://github.com/dmlc/xgboost cd xgboost git checkout tags/v0.90 |
接下来,我们需要编译它。-j 参数可用于指定预期的核心数。对于我们 AWS 实例上的 32 个核心,我们可以将其设置为 32。
如果您选择了不同的 AWS 硬件,可以相应地进行设置。
1 |
make -j32 |
XGBoost 项目应该会成功构建(例如,没有错误)。
现在我们可以安装 Python 版本的库了。
1 2 |
cd python-package sudo python setup.py install |
就这样。
我们可以通过输入以下命令来确认安装是否成功:
1 |
python -c "import xgboost;print(xgboost.__version__)" |
这应该会打印出类似以下内容:
1 |
0.90 |
4. 训练 XGBoost 模型
让我们通过运行带有大量核心的 XGBoost 来测试您的大型 AWS 实例。
在本教程中,我们将使用 Otto Group 产品分类挑战赛 数据集。
该数据集可从 Kaggle 免费获取(您需要注册 Kaggle 才能下载此数据集)。它描述了 61,000 多个产品(例如时尚、电子产品等)的 93 个模糊细节。输入变量是各种事件的数量。
目标是为新产品进行预测,预测结果是每个 10 个类别的概率数组,模型使用多类对数损失(也称为交叉熵)进行评估。
该竞赛于 2015 年 5 月完成,该数据集对 XGBoost 来说是一个很好的挑战,因为它具有非平凡数量的示例、问题的难度以及只需要很少的数据准备(除了将字符串类变量编码为整数)。
在您的工作站上创建一个名为 work/ 的新目录。
您可以从数据页面下载训练数据集 train.csv.zip,并将其放在工作站上的 work/ 目录中。
我们将评估使用不同数量的核心在数据集上训练 XGBoost 所需的时间。
我们将尝试使用 1 个核心、一半的核心(16 个)和所有 32 个核心。我们可以通过在 XGBClassifier 类(XGBoost 的 scikit-learn 包装器)中设置 nthread 参数来指定 XGBoost 算法使用的核心数。
完整的示例列在下面。将其保存在名为 work/script.py 的文件中。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 |
# Otto 多核测试 from pandas import read_csv from xgboost import XGBClassifier from sklearn.preprocessing import LabelEncoder import time # 加载数据 data = read_csv('train.csv') dataset = data.values # 将数据拆分为 X 和 y X = dataset[:,0:94] y = dataset[:,94] # 将字符串类值编码为整数 label_encoded_y = LabelEncoder().fit_transform(y) # 评估线程数的影响 results = [] num_threads = [1, 16, 32] for n in num_threads: start = time.time() model = XGBClassifier(nthread=n) model.fit(X, label_encoded_y) elapsed = time.time() - start print(n, elapsed) results.append(elapsed) |
现在,我们可以将您的 work/ 目录(包含数据和脚本)复制到您的 AWS 服务器。
在您的工作站上,进入包含 work/ 目录的当前目录,然后输入:
1 |
scp -r -i xgboost-keypair.pem work fedora@52.53.185.166:/home/fedora/ |
当然,您需要使用您的密钥文件和服务器的 IP 地址。
这将在您的服务器主目录中创建一个新的 work/ 目录。
重新登录到您的服务器实例(如果需要)。
1 |
ssh -i xgboost-keypair.pem fedora@52.53.185.166 |
切换到您的工作目录并解压训练数据。
1 2 |
cd work unzip ./train.csv.data |
现在我们可以运行脚本并训练 XGBoost 模型,并计算使用不同核心数量所需的时间。
1 |
python script.py |
注意:由于算法的随机性、评估程序的随机性或数值精度的差异,您的结果可能有所不同。考虑多次运行示例并比较平均结果。
您应该会看到类似以下的输出。
1 2 3 |
(1, 96.34455895423889) (16, 8.31994891166687) (32, 7.604229927062988) |
可以看到 16 个和 32 个核心之间的差异很小。
我认为这是因为 AWS 提供了 16 个物理核心的访问权限,并带有超线程,提供了额外的虚拟核心。但是,在 7 秒内构建大型 XGBoost 模型还是很棒的。
您可以将此作为将自己的数据和脚本复制到 AWS 实例的模板。
一个好技巧是将您的脚本作为后台进程运行,并将任何输出转发到一个文件。以防您的服务器连接中断,或者您想关闭它让服务器整晚运行您的代码。
您可以通过输入以下命令将代码作为后台进程运行并将输出重定向到文件:
1 |
nohup python script.py >script.py.out 2>&1 & |
现在我们完成了,可以关闭 AWS 实例。
5. 关闭您的 AWS 实例
完成工作后,您必须关闭您的实例。
请记住,您会根据实例的使用时间收费。虽然便宜,但如果您不使用它,您不希望实例一直运行。
- 1. 在终端中退出您的实例,例如您可以输入:
1 |
exit |
- 2. 使用您的网络浏览器登录您的 AWS 账户。
- 3. 点击 EC2。
- 4. 从左侧菜单中点击“Instances”。
- 5. 从列表中选择您正在运行的实例(如果您只有一个正在运行的实例,它可能已经被选中)。
- 6. 点击“Actions”按钮,选择“Instance State”,然后选择“Terminate”。确认您要终止正在运行的实例。
实例关闭并从实例列表中移除可能需要几秒钟。
就是这样。
总结
在这篇文章中,您了解了如何在 Amazon 云基础设施上训练大型 XGBoost 模型。
具体来说,你学到了:
- 如何启动和配置 Amazon EC2 上的 Linux 服务器实例以用于 XGBoost。
- 如何安装运行 XGBoost 库在 Python 中所需的所有软件。
- 如何将数据和代码传输到您的服务器,并利用服务器上的所有核心来训练大型模型。
您对在 Amazon Web Services 上训练 XGBoost 模型或对本文有任何疑问吗?请在评论中提问,我将尽力回答。
精彩且详细的文章。您能否估算一下运行像您那样的竞赛大约需要多少费用?
费用不高。我记得我尝试各种配置花了一整天,大约花费了 10 美元。每小时不到 1 美元。
当我在 aws 上用 Anaconda 安装 xgboost 时,导入 xgboost 时总会出错。
OSError: /home/fedora/anaconda3/bin/../lib/libgomp.so.1: version `GOMP_4.0′ not found (required by /home/fedora/xgboost/python-package/xgboost/../../lib/libxgboost.so)
也许可以试试不使用 Anaconda?
嗨,Jason,
另一个更严重的问题是:我按照您的步骤操作,只是更改了实例的版本,选择了 c3.xlarge,4 vCPU 和 7.5 RAM。
一切正常,但当我运行您的示例代码时,速度非常慢。所以我更改了训练的行数。
1) nthread = 4
X = dataset[0:3000,0:94]
y = dataset[0:3000,94]
时间
(4, 9.494154930114746)
2) nthread = 4
X = dataset[0:10000,0:94]
y = dataset[0:10000,94]
时间
(4, 33.41064381599426)
3) nthread = 4
X = dataset[0:30000,0:94]
y = dataset[0:30000,94]
(4, 1365.8062710762024)
计算速度比我的 MacBook Air 还要慢,在 MacBook Air 上运行整个训练集需要 70 秒。我怀疑是我安装了什么软件包不正确,或者 c3.xlarge 的速度确实很慢。
Jason,谢谢您的教程!
在您的 EC2 虚拟服务器上安装 R(而不是 Python)是否类似?在步骤 3a 中输入“sudo dnf install R”?
您是否开设了一个单独的 S3 账户来存储您的数据,或者这是否没有必要?看起来您是直接将数据上传到了您的 EC2 实例。
罗伯特
抱歉,我在 EC2 上不使用 R,所以我没有好的建议。
我的数据通常不超过几 GB。我上传一次,然后在项目结束时保留该实例(例如,几百美元,没什么大不了的)。对于更长的项目或更大的数据,我建议使用 S3。
谢谢 Jason。我读了一篇文章,建议 RAM 至少是数据集大小的 3 倍,以避免分析花费数小时或数天才能运行。所以如果数据集小于 20 GB,我可以理解加载到 EC2 是更优的选择。
也许可以。
您也可以尝试按需从文件流式传输数据,而不是将其全部保留在内存中(例如,神经网络可以做到这一点)。
谢谢 Jason。有没有办法在模型训练完成后自动关闭 AWS 实例 — 而不是基于时间的关机?
可能可以,但我不太清楚,抱歉。
如果您发现这方面的一些技巧,请告诉我!
我遇到了以下错误;根据一些 Stack Overflow 的建议,我将 pd.read_csv 的选项 low_memory = False 添加了进去,但错误仍然存在,并且似乎与这个日期时间字段有关。任何建议都将不胜感激,谢谢!很棒的演练。
sys:1: DtypeWarning: Columns (8,9,10,11,12,43,157,196,214,225,228,229,231,235,238) have mixed types. Specify dtype option on import or set low_memory=False.
回溯(最近一次调用)
File “script.py”, line 31, in
model.fit(X, label_encoded_y)
File “/anaconda3/lib/python3.6/site-packages/xgboost/sklearn.py”, line 439, in fit
missing=self.missing)
File “/anaconda3/lib/python3.6/site-packages/xgboost/core.py”, line 268, in __init__
self._init_from_npy2d(data, missing)
File “/anaconda3/lib/python3.6/site-packages/xgboost/core.py”, line 315, in _init_from_npy2d
data = np.array(mat.reshape(mat.size), dtype=np.float32)
ValueError: could not convert string to float: ’19SEP12:00:00:00′
Exception ignored in: <bound method DMatrix.__del__ of >
回溯(最近一次调用)
File “/anaconda3/lib/python3.6/site-packages/xgboost/core.py”, line 324, in __del__
_check_call(_LIB.XGDMatrixFree(self.handle))
AttributeError: ‘DMatrix’ object has no attribute ‘handle’
或许可以尝试使用 numpy 加载?
或许可以尝试加载更少的数据?
你好 Jason-
感谢您提供所有精彩的教程。我刚开始这个教程,这是我第一次使用 AWS。我没有看到 c3.8xlarge 实例类型。我看到了 c4.8xlarge。使用它代替可以吗?存储是 EBS 仅限 SSD。
谢谢!
看起来可以。
嗨,Jason,
一如既往,感谢您所做的一切。这是网络上最好的资源。
在按照构建 xgboost 包的说明进行操作时,在运行“make -j32”命令后,我收到一系列错误,看起来像:
———
Makefile:141: recipe for target ‘build/metric/elementwise_metric.o’ failed
make: *** [build/metric/elementwise_metric.o] Error 1
Makefile:141: recipe for target ‘build/metric/multiclass_metric.o’ failed
make: *** [build/metric/multiclass_metric.o] Error 1
In file included from include/xgboost/metric.h:16:0,
from src/metric/metric.cc:6
include/xgboost/./data.h:12:25: fatal error: rabit/rabit.h: No such file or directory
#include
^
compilation terminated.
————–
我重复了多次步骤,但一直遇到这个问题。我确认了实例有 32 个 CPU。不确定您是否知道可能的原因。感谢任何帮助!
谢谢!
听到这个消息我很难过。
也许可以尝试检出特定版本的库?例如 1.0.2 或 0.9。最新版本可能不再容易编译。
例如
https://github.com/dmlc/xgboost/releases/tag/v1.0.2
我遇到了同样的错误,并尝试了其他版本,但仍然是相同的错误。
include/xgboost/./data.h:12:25: fatal error: rabit/rabit.h: No such file or directory
#include
^
compilation terminated.
$ cat /etc/os-release
NAME=”Amazon Linux”
VERSION=”2″
ID=”amzn”
ID_LIKE=”centos rhel fedora”
VERSION_ID=”2″
PRETTY_NAME=”Amazon Linux 2″
ANSI_COLOR=”0;33″
CPE_NAME=”cpe:2.3:o:amazon:amazon_linux:2″
HOME_URL=”https://amazonlinux.com/”
也许可以尝试检出代码库的早期快照,例如 1.0.1。
遵循
https://docs.xgboost.com.cn/en/latest/build.html#building-on-linux-distributions 使用 cmake3 和 python3/pip3 似乎解决了这个问题。
干得好!