深度学习参考堆栈

本教程介绍如何在 Clear Linux* OS 中使用深度学习参考堆栈运行 TensorFlow*、PyTorch* 和 Kubeflow 基准工作负载。

概述

我们打造了深度学习参考堆栈来帮助 AI 开发人员在英特尔架构上获得最佳开发体验。此堆栈降低了深度学习软件组件常见的复杂性,为自定义解决方案提供了灵活性,并使您能够快速构建原型并部署深度学习工作负载。使用本教程可在您的解决方案上运行基准工作负载。

深度学习参考堆栈有以下版本:

  • Intel MKL-DNN-VNNI,它使用面向深度神经网络(英特尔® MKL-DNN)原语的英特尔®数学内核库进行优化,并支持英特尔® AVX-512 矢量神经网络指令 (VNI)。
  • Intel MKL-DNN,它包括使用面向深度神经网络(英特尔® MKL-DNN)原语的英特尔®数学内核库进行优化的 TensorFlow 框架。
  • Eigen,它包括针对英特尔®架构优化的 TensorFlow
  • PyTorch with OpenBLAS,它包括 PyTorch with OpenBlas。
  • PyTorch with Intel MKL-DNN,它包括使用英特尔®数学内核库(英特尔® MKL)和英特尔 MKL-DNN 进行优化的 PyTorch。

重要

要利用英特尔® AVX-512 和 VNI 功能以及深度学习参考堆栈,您必须使用以下硬件:

  • 英特尔® AVX-512 映像需要使用英特尔®至强®可扩展平台
  • VNNI 需要使用第二代英特尔®至强®可扩展平台

堆栈功能和特性

注解

深度学习参考堆栈是一项集体成果,成果中的每一个软件都有自己的许可证。有关深度学习参考堆栈的许可和使用的更多详细信息,请参阅 DLRS Terms of Use

必备条件

  • 在主机系统上 Install Clear Linux OS
  • containers-basic 捆绑包
  • cloud-native-basic 捆绑包

在 Clear Linux OS 中,containers-basic 包括 TensorFlow 和 PyTorch 基准测试所必需的 Docker*。使用 swupd 实用程序检查 containers-basiccloud-native-basic 是否存在:

sudo swupd bundle-list

要安装 containers-basiccloud-native-basic 捆绑包,请输入:

sudo swupd bundle-add containers-basic cloud-native-basic

安装 containers-basic 捆绑包后 Docker 不会启动。要启动 Docker,请输入:

sudo systemctl start docker

要确保正确安装和配置 Kubernetes,请遵循 Kubernetes* 中的说明。

版本兼容性

我们根据以下软件包版本验证了这些步骤:

  • Clear Linux OS 26240(支持的最低版本)
  • Docker 18.06.1
  • Kubernetes 1.11.3
  • Go 1.11.12

注解

深度学习参考堆栈是为了在 Clear Linux OS 主机上执行时获得最佳用户体验而开发的。但是,该堆栈在容器环境中运行时,您应该能够在其他 Linux* 发行版上完成本教程的以下部分,只要这些发行版满足上面列出的 Docker*、Kubernetes* 和 Go* 软件包版本。查找关于如何更新软件包和管理 Docker 服务的分发版文档。

TensorFlow 单节点和多节点基准测试

本部分介绍在单节点中运行 TensorFlow benchmarks。对于多节点测试,请为每个节点重复这些步骤。这些步骤提供了运行其他基准测试的模板,前提是它们可以调用 TensorFlow。

注解

深度学习参考堆栈和本教程的性能测试结果是使用 runc 作为运行时获得的。

  1. Docker Hub 下载 EigenIntel MKL-DNN Docker 映像。

  2. 使用 Docker 运行映像:

    docker run --name <image name>  --rm -i -t <clearlinux/
    stacks-dlrs-TYPE> bash
    

    注解

    使用 -i 参数启动 Docker 映像,从而在容器内启动交互模式。在正在运行的容器中输入以下命令。

  3. 克隆容器中的基准测试存储库:

    git clone http://github.com/tensorflow/benchmarks -b cnn_tf_v1.12_compatible
    
  4. 执行基准测试脚本:

    python benchmarks/scripts/tf_cnn_benchmarks/tf_cnn_benchmarks.py --device=cpu --model=resnet50 --data_format=NHWC
    

注解

您可以将该模型更换为 TensorFlow 支持的其他模型。

如果使用基于 FP32 的模型,可以使用 Intel® quantization tools 将其转换为 int8 模型。

PyTorch 单节点和多节点基准测试

本部分介绍在单节点中运行针对 Caffe2 的 PyTorch benchmarks

  1. Docker Hub 下载 PyTorch with OpenBLASPyTorch with Intel MKL-DNN Docker 映像。

  2. 使用 Docker 运行映像:

    docker run --name <image name>  --rm -i -t <clearlinux/stacks-dlrs-TYPE> bash
    

    注解

    使用 -i 参数启动 Docker 映像,从而在容器内启动交互模式。在正在运行的容器中输入以下命令。

  3. 克隆基准测试存储库:

    git clone https://github.com/pytorch/pytorch.git
    
  4. 执行基准测试脚本:

    cd pytorch/caffe2/python
    python convnet_benchmarks.py --batch_size 32 \
                          --cpu \
                          --model AlexNet
    

Kubeflow 多节点基准测试

基准测试工作负载在 Kubernetes 集群中运行。本教程使用 Kubeflow 在三个节点上部署机器学习工作负载。

警告

如果选择英特尔® MKL-DNN 或英特尔® MKL-DNN-VNNI 映像,您的平台必须支持英特尔® AVX-512 指令集。否则,可能会出现非法指令错误,导致无法完成本教程。

Kubernetes 设置

按照 Kubernetes* 教程中的说明在 Clear Linux OS 上进行设置。Kubernetes 社区也提供了 Creating a single control-plane cluster with kubeadm

Kubernetes 网络连接

在这些测试中,我们使用 flannel 作为网络提供程序。如果青睐不同的网络层,请参阅 Kubernetes Creating a single control-plane cluster with kubeadm 进行设置。

Kubectl

您可以使用 kubectl 对您的 Kubernetes 集群运行命令。有关语法和操作的详细信息,请参阅 Overview of kubectl。建立一个 Kubernetes 工作集群后,请使用下面的 YAML 脚本启动一个含有简单 shell 脚本的 Pod,并保持该 Pod 处于打开状态。

  1. 将 example.yaml 脚本复制到您的系统中:

    apiVersion: v1
    kind: Pod
    metadata:
      name: example-pod
      labels:
        app: ex-pod
    spec:
      containers:
      - name: ex-pod-container
        image: clearlinux/stacks-dlrs-mkl:latest
        command: ['/bin/bash', '-c', '--']
        args: [ "while true; do sleep 30; done" ]
    
  2. 使用 kubectl 执行该脚本:

    kubectl apply –f <path-to-yaml-file>/example.yaml
    

该脚本打开一个 Pod。更稳健的解决方案是创建部署,或者将 python 脚本或更大的 shell 脚本注入容器。

图像

您必须将 launcher.py 添加到 Docker 映像中,以包含深度学习参考堆栈,并将基准测试存储库放在正确的位置。请注意,本教程使用 Kubeflow v0.4.0。如果使用不同的版本,则不能保证结果。

从 Docker 映像中,运行以下命令:

mkdir -p /opt
git clone https://github.com/tensorflow/benchmarks.git /opt/tf-benchmarks
cp launcher.py /opt
chmod u+x /opt/*

您的入口点变成 /opt/launcher.py

这会构建一个可供 TFJob 从 Kubeflow 直接使用的映像。

ksonnet*

Kubeflow 使用 ksonnet* 来管理部署,因此您必须在设置 Kubeflow 之前安装它。

ksonnet 已添加到 Clear Linux OS 版本 27550 中的 cloud-native-basic 捆绑包中。如果使用的是较旧的 Clear Linux OS 版本(不推荐),您必须如下所述手动安装 ksonnet。

在 Clear Linux OS 上,请按照下列步骤操作:

swupd bundle-add go-basic-dev
export GOPATH=$HOME/go
export PATH=$PATH:$GOPATH/bin
go get github.com/ksonnet/ksonnet
cd $GOPATH/src/github.com/ksonnet/ksonnet
make install

ksonnet 安装完成后,确保可在整个环境中访问 ks 二进制文件。

Kubeflow

Kubernetes 在节点上运行后,请按照 Getting Started with Kubeflow 中的说明设置 Kubeflow

export KUBEFLOW_SRC=$HOME/kflow
export KUBEFLOW_TAG="v0.4.1"
export KFAPP="kflow_app"
export K8S_NAMESPACE="kubeflow"

mkdir ${KUBEFLOW_SRC}
cd ${KUBEFLOW_SRC}
ks init ${KFAPP}
cd ${KFAPP}
ks registry add kubeflow github.com/kubeflow/kubeflow/tree/${KUBEFLOW_TAG}/kubeflow
ks pkg install kubeflow/common
ks pkg install kubeflow/tf-training

接下来,为我们的目的部署主要软件包:tf-job-operator。

ks env rm default
kubectl create namespace ${K8S_NAMESPACE}
ks env add default --namespace "${K8S_NAMESPACE}"
ks generate tf-job-operator tf-job-operator
ks apply default -c tf-job-operator

这将创建 CustomResourceDefinition (CRD) 端点来启动 TFJob。

运行 TFJob

  1. dlrs-tfjob 获取用于部署 TFJobs 的 ksonnet 注册表。

  2. 按照以下步骤安装 TFJob 组件:

    ks registry add dlrs-tfjob github.com/clearlinux/dockerfiles/tree/master/stacks/dlrs/kubeflow/dlrs-tfjob
    
    ks pkg install dlrs-tfjob/dlrs-bench
    
  3. 导出用于部署的映像名称:

    export DLRS_IMAGE=<docker_name>
    

    注解

    将 <docker_name> 替换为前述步骤中指定的映像名称。

  4. 为工作负载生成 Kubernetes 清单,并使用以下命令应用这些清单:

    ks generate dlrs-resnet50 dlrsresnet50 --name=dlrsresnet50 --image=${DLRS_IMAGE}
    ks generate dlrs-alexnet dlrsalexnet --name=dlrsalexnet --image=${DLRS_IMAGE}
    ks apply default -c dlrsresnet50
    ks apply default -c dlrsalexnet
    

这会在 Kubernetes 集群中复制和部署三个测试设置。

运行本教程的结果

您必须解析 Kubernetes Pod 的日志来检索性能数据。完成后,Pod 仍会存在,并将处于“已完成”状态。您可以从任何一个 Pod 中获取日志来检查基准测试结果。有关 Kubernetes 日志记录的更多信息,请参见 Kubernetes Logging Architecture 文档。

使用 Jupyter Notebook

本示例使用 PyTorch with OpenBLAS 容器映像。下载后,使用 -p 运行 Docker 映像,以指定容器和主机之间的共享端口。本示例使用端口 8888。

docker run --name pytorchtest --rm -i -t -p 8888:8888 clearlinux/stacks-pytorch-oss bash

启动容器后,启动 Jupyter Notebook。该命令在容器映像内执行。

jupyter notebook --ip 0.0.0.0 --no-browser --allow-root

加载笔记本后,您将看到类似以下内容的输出:

To access the notebook, open this file in a browser: file:///.local/share/jupyter/runtime/nbserver-16-open.html
Or copy and paste one of these URLs:
http://(846e526765e3 or 127.0.0.1):8888/?token=6357dbd072bea7287c5f0b85d31d70df344f5d8843fbfa09

从您的主机系统或任何可以访问主机 IP 地址的系统,使用以下命令启动 Web 浏览器。如果没有在主机系统上运行浏览器,请将 127.0.0.1 更换为主机的 IP 地址。

http://127.0.0.1:8888/?token=6357dbd072bea7287c5f0b85d31d70df344f5d8843fbfa09

您的浏览器会显示以下内容:

Jupyter Notebook

图 1: Jupyter Notebook

要创建新笔记本,请点击 New,然后选择 Python 3

Create a new notebook

图 2:创建一个新笔记本

此时将显示一个新的空白笔记本,其中有一个单元格可供输入内容。

New blank notebook

要验证 PyTorch 是否正在工作,请将以下片段复制到空白单元格中,并运行该单元格。

from __future__ import print_function
import torch
x = torch.rand(5, 3)
print(x)
Sample code snippet

运行单元格时,您的输出将如下所示:

code output

您可以继续在此笔记本中工作,也可以下载现有笔记本来利用深度学习参考堆栈的优化深度学习框架。详情请参阅 Jupyter Notebook

卸载

要卸载深度学习参考堆栈,您可以选择停止容器以使其不使用系统资源,或者可以停止容器并将其删除以释放存储空间。

要停止容器,请从主机系统执行以下操作:

  1. 找到容器的 ID

    docker container ls
    

    这将产生类似于以下内容的输出:

    CONTAINER ID        IMAGE                        COMMAND               CREATED             STATUS              PORTS               NAMES
    e131dc71d339        clearlinux/stacks-dlrs-oss   "/bin/sh -c 'bash'"   23 seconds ago      Up 21 seconds                           oss
    
  2. 然后,您可以使用 ID 或容器名称来停止容器。本示例使用名称 “oss”:

    docker container stop oss
    
  3. 验证容器未在运行

    docker container ls
    
  4. 要从系统中删除容器,您需要知道映像 ID:

    docker images
    

    该命令会产生类似于以下内容的输出:

    REPOSITORY                   TAG                 IMAGE ID            CREATED             SIZE
    clearlinux/stacks-dlrs-oss   latest              82757ec1648a        4 weeks ago         3.43GB
    clearlinux/stacks-dlrs-mkl   latest              61c178102228        4 weeks ago         2.76GB
    
  5. 要移除映像,请使用映像 ID:

    docker rmi 82757ec1648a
    
    # docker rmi 827
    Untagged: clearlinux/stacks-dlrs-oss:latest
    Untagged: clearlinux/stacks-dlrs-oss@sha256:381f4b604537b2cb7fb5b583a8a847a50c4ed776f8e677e2354932eb82f18898
    Deleted: sha256:82757ec1648a906c504e50e43df74ad5fc333deee043dbfe6559c86908fac15e
    Deleted: sha256:e47ecc039d48409b1c62e5ba874921d7f640243a4c3115bb41b3e1009ecb48e4
    Deleted: sha256:50c212235d3c33a3c035e586ff14359d03895c7bc701bb5dfd62dbe0e91fb486
    

    请注意,您可以只使用映像 ID 的前几个字符来执行 docker rmi 命令,前提是它们在系统上是唯一的。

  6. 移除映像后,您可以通过以下方式验证它是否已被移除:

    docker images