- 为稀疏场景而生。支持千亿参数,万亿样本的深度模型训练,无论使用CPU训练还是GPU训练,都可以极致的压榨硬件的使用率
- 工业级分布式训练。原生支持大规模分布式训练,具备完整的分布式容灾语义,系统的水平扩展能力优秀,可以轻松做到上千并发的训练。同时内置了完整的在线学习解决方案,可以自动的进行特征选择和过期淘汰,保证在线服务的模型控制在合理的规模
- 混合多后端支持。单机内部的稠密计算复用了开源深度学习框架的能力,只需要少量的驱动代码修改,就可以把TensorFlow/MxNet的单机代码运行在XDL上,获得XDL分布式训练与高性能稀疏计算的能力
- 高效的结构化压缩训练。针对互联网样本的数据特点,提出了结构化压缩训练模式。在多个场景下,相比传统的平铺样本训练模式,样本存储空间、样本IO效率、训练绝对计算量等方面都大幅下降,训练效率可以最大可提升10倍以上
- 内置阿里妈妈广告推荐场景优秀的算法解决方案
XDL的Docker镜像基于ubuntu16.04进行编译安装。镜像中中包含编译XDL所需要的所有系统环境以及编译安装完成的XDL和测试用例代码。用户也可以直接使用我们提供的Docker镜像进行XDL的二次开发。
- 宿主机上需要安装docker环境
- 如果需要GPU支持,宿主机上需要安装nvidia-docker
XDL官方镜像的tag及描述如下表:
docker镜像 | 描述 |
---|---|
registry.cn-hangzhou.aliyuncs.com/xdl/xdl:ubuntu-cpu-tf1.12 | ubuntu16.04 + XDL + tensorflow1.12后端 |
registry.cn-hangzhou.aliyuncs.com/xdl/xdl:ubuntu-gpu-tf1.12 | ubuntu16.04 + XDL + tensorflow1.12后端 + gpu支持(cuda9.0, cudnn7.0) |
registry.cn-hangzhou.aliyuncs.com/xdl/xdl:ubuntu-cpu-mxnet1.3 | ubuntu16.04 + XDL + mxnet1.3后端 |
registry.cn-hangzhou.aliyuncs.com/xdl/xdl:ubuntu-gpu-mxnet1.3 | ubuntu16.04 + XDL + mxnet1.3后端 + gpu支持(cuda9.0, cudnn7.0) |
例如,用户可以执行如下命令将XDL的镜像下载到宿主机上:
sudo docker pull registry.cn-hangzhou.aliyuncs.com/xdl/xdl:ubuntu-cpu-tf1.12
用户可以使用以下命令,来启动一个XDL镜像:
sudo docker run -it registry.cn-hangzhou.aliyuncs.com/xdl/xdl[:tag] [command]
更多docker的用法,可参考docker使用指南。
例如,用户可以使用以下命令,来查看一个CPU版本的XDL镜像:
sudo docker run -it registry.cn-hangzhou.aliyuncs.com/xdl/xdl:ubuntu-cpu-tf1.12 python -c "import xdl; print xdl.__version__"
用户也可以使用以下命令,来查看一个支持GPU的XDL镜像:
sudo nvidia-docker run -it registry.cn-hangzhou.aliyuncs.com/xdl/xdl:ubuntu-gpu-tf1.12 python -c "import xdl; print xdl.__version__"
请注意,上述命令执行后并不能进入docker,只是打印docker环境中安装的xdl版本。请阅读docker使用指南获取如何进入docker的方法,以及如何指定进入目录、如何挂载宿主机上需要使用的目录、如何使用网卡等。
如果用户需要GPU支持,那么我们强烈建议使用支持GPU的XDL镜像。这样,用户只需要在宿主机上安装NVIDIA® GPU drivers。
注意:CUDA9.0要求NVIDIA驱动版本高于384.x。
如果用户需要在宿主机上直接获得GPU支持,那么我们推荐用户对以下的软件版本进行安装:
- NVIDIA® GPU drivers (384.x or higher)
- CUDA® Toolkit 9.0
- cuDNN SDK 7.0
这部分内容将指导用户如何在一个纯净的ubuntu 16.04环境中编译安装XDL。
(1) 下载ubuntu 16.04镜像,并以bash session的形式进入镜像:
sudo docker pull ubuntu:16.04
sudo docker run --net=host -it ubuntu:16.04 /bin/bash
系统更新:
apt-get update && apt-get -y upgrade
(2) 安装系统build工具,例如gcc、cmake、jdk、python等: 目前XDL使用seastar作为底层通信库,seastar只能使用GCC 5.3及以上版本编译。同时XDL需要使用GCC 4.8.5 编译CUDA代码来支持GPU,因此需要安装两个版本GCC; XDL使用cmake作为build工具,版本>2.8.0
apt-get install -y build-essential gcc-4.8 g++-4.8 gcc-5 g++-5 cmake python python-pip openjdk-8-jdk wget && pip install --upgrade pip
主要依赖库包括两部分,a) 安装boost b) 安装seastar依赖库
(a) 安装boost(以1.63为例), 必须设置_GLIBCXX_USE_CXX11_ABI=0,否则可能有链接错误
cd /tmp
wget -O boost_1_63_0.tar.gz https://sourceforge.net/projects/boost/files/boost/1.63.0/boost_1_63_0.tar.gz
tar zxf boost_1_63_0.tar.gz && cd boost_1_63_0
./bootstrap.sh --prefix=/usr/local && ./b2 -j32 variant=release define=_GLIBCXX_USE_CXX11_ABI=0 install
mkdir -p /usr/local/lib64/boost && cp -r /usr/local/lib/libboost* /usr/local/lib64/boost/
(b) 安装其它依赖
apt-get install -y libaio-dev ninja-build ragel libhwloc-dev libnuma-dev libpciaccess-dev libcrypto++-dev libxml2-dev xfslibs-dev libgnutls28-dev liblz4-dev libsctp-dev libprotobuf-dev protobuf-compiler libunwind8-dev systemtap-sdt-dev libjemalloc-dev libtool python3 libjsoncpp-dev
3. 如果是GPU版本,还需安装cuda和cudnn,可以参考Dockerfile,主要步骤如下:
cd /tmp
wget http://developer.download.nvidia.com/compute/cuda/repos/ubuntu1604/x86_64/cuda-repo-ubuntu1604_9.0.176-1_amd64.deb
wget http://developer.download.nvidia.com/compute/machine-learning/repos/ubuntu1604/x86_64/libcudnn7_7.0.5.15-1+cuda9.0_amd64.deb
wget http://developer.download.nvidia.com/compute/machine-learning/repos/ubuntu1604/x86_64/libcudnn7-dev_7.0.5.15-1+cuda9.0_amd64.deb
wget http://developer.download.nvidia.com/compute/machine-learning/repos/ubuntu1604/x86_64/libnccl2_2.1.4-1+cuda9.0_amd64.deb
wget http://developer.download.nvidia.com/compute/machine-learning/repos/ubuntu1604/x86_64/libnccl-dev_2.1.4-1+cuda9.0_amd64.deb
apt-key adv --fetch-keys http://developer.download.nvidia.com/compute/cuda/repos/ubuntu1604/x86_64/7fa2af80.pub
dpkg -i cuda-repo-ubuntu1604_9.0.176-1_amd64.deb
dpkg -i libcudnn7_7.0.5.15-1+cuda9.0_amd64.deb
dpkg -i libcudnn7-dev_7.0.5.15-1+cuda9.0_amd64.deb
dpkg -i libnccl2_2.1.4-1+cuda9.0_amd64.deb
dpkg -i libnccl-dev_2.1.4-1+cuda9.0_amd64.deb
apt-get clean && apt-get update -y && apt-get -y upgrade
apt-get install -y cuda=9.0.176-1 --fix-missing
apt-get install -y libcudnn7-dev
apt-get install -y libnccl-dev
apt-get update -y && apt-get -y upgrade
rm -rf /tmp/*.deb
echo '/usr/local/nvidia/lib64/' >> /etc/ld.so.conf
-
TensorFlow
-
使用Mxnet
cp -r incubator-mxnet/cpp-package `python -c "from __future__ import print_function;import mxnet,os; print(os.path.dirname(mxnet.__file__),end='')"`
cp -r incubator-mxnet/include `python -c "from __future__ import print_function;import mxnet,os; print(os.path.dirname(mxnet.__file__),end='')"`
cp -r incubator-mxnet/3rdparty `python -c "from __future__ import print_function;import mxnet,os; print(os.path.dirname(mxnet.__file__),end='')"`
- 代码准备
git clone --recursive https://github.com/alibaba/x-deeplearning.git
cd x-deeplearning/xdl
mkdir build && cd build
export CC=/usr/bin/gcc-5 && export CXX=/usr/bin/g++-5
- 编译CPU版本
cmake .. -DTF_BACKEND=1
make -j32
# 安装
make install_python_lib
- 编译GPU版本
cmake .. -DUSE_GPU=1 -DTF_BACKEND=1 -DCUDA_PATH=/usr/local/cuda-9.0 -DNVCC_C_COMPILER=/usr/bin/gcc-4.8
make -j32
# 安装
make install_python_lib
- 验证安装
在shell中执行一下命令,如果显示1.0表示安装成功
python -c "import xdl; print xdl.__version__"
XDL提供了基于yarn+docker的分布式调度工具,完成集群部署后即可提交XDL分布式训练任务,具体请参考集群部署
本节描述如何使用XDL进行DeepCtr(Deep+Embeddings)模型训练
- 示例模型包含一路Deep(deep0)特征以及两路sparse特征(sparse[0-1]),sparse特征通过Embedding计算生成两个8维的dense向量,并与Deep特征concat之后经过4层全连接层输出loss
- 样本格式
- 完整代码
1. 读取数据 (detail)
import xdl
import tensorflow as tf
reader = xdl.DataReader("r1", # reader名称
paths=["./data.txt"], # 文件列表
enable_state=False) # 是否打开reader state,用于分布式failover,开启的时候需要额外的命令行参数(task_num)
reader.epochs(1).threads(1).batch_size(10).label_count(1)
reader.feature(name='sparse0', type=xdl.features.sparse)\ # 定义reader需要读取的特征,本例包括两个sparse特征组和一个dense特征组
.feature(name='sparse1', type=xdl.features.sparse)\
.feature(name='deep0', type=xdl.features.dense, nvec=256)
reader.startup()
2. 定义模型 (detail)
- Embedding:
emb1 = xdl.embedding('emb1', # embedding名称,如果多路embedding共享同一个参数,name需配成同一个
batch['sparse0'], # 输入特征(xdl.SparseTensor)
xdl.TruncatedNormal(stddev=0.001), # 参数初始化方法
8, # embedding维度
1024, # sparse特征的维度
vtype='hash') # sparse特征类型:index(id类特征)/hash(hash特征)
emb2 = xdl.embedding('emb2', batch['sparse1'], xdl.TruncatedNormal(stddev=0.001), 8, 1024, vtype='hash')
- Dense:
@xdl.tf_wrapper()
def model(deep, embeddinc1 = tf.layers.dense(
input, 128, kernel_initializer=tf.truncated_normal_initializer(
fc3 = tf.layers.dense(
fc2, 32, kernel_initializer=tf.truncated_normal_initializer(
stddev=0.001, dtype=tf.float32))
y = tf.layers.dense(
fc3, 1, kernel_initializer=tf.truncated_normal_initializer(
stddev=0.001, dtype=tf.float32))
loss = tf.losses.sigmoid_cross_entropy(labels, y)
return loss
3. 定义优化器 (detail)
loss = model(batch['deep0'], [emb1, emb2], batch['label'])
train_op = xdl.SGD(0.5).optimize()
log_hook = xdl.LoggerHook(loss, "loss:{0}", 10)
sess = xdl.TrainSession(hooks=[log_hook])
while not sess.should_stop():
sess.run(train_op)
5. 执行训练 (detail)
将上述代码保存为deepctr.py,执行以下步骤开始单机训练
# 进入docker,将代码和数据目录一起挂载进docker
sudo docker run -v [path_to_xdl]/examples/deepctr:/home/xxx/deepctr -it registry.cn-hangzhou.aliyuncs.com/xdl/xdl:ubuntu-cpu-tf1.12 /bin/bash
# 进入训练目录
cd /home/xxx/deepctr
# 开始单机训练
python deepctr.py --run_mode=local
- 数据准备
- 定义模型
- 训练模型
- 模型评估
- 高层训练API
- 调试工具
- Timeline
欢迎对机器学习有兴趣的同仁一起贡献代码,提交Issues或者Pull Requests,请先查阅: XDL Contribution Guide
XDL使用Apache-2.0许可