3. 环境准备

本章将介绍IPU所需的主机硬件和操作系统,以及如何通过Docker容器启动IPU运行环境并验证IPU工作正常。

3.1. 主机CPU架构

主机用于运行Poplar graph engine并与IPU通信,需要采用以下的CPU架构:

  • Intel

  • AMD

3.2. 主机操作系统

支持如下的操作系统:

  • CentOS 7.6

  • Debian 10

  • Ubuntu 20.04

3.3. Docker

建议版本: 20.10.11, build dea9396

关于Docker安装的信息,请参考 UbuntuCentOSDebian

3.4. Poplar SDK

Poplar SDK version 3.1 及以上版本。

3.4.1. 安装Poplar SDK

通过 Graphcore Downloads portal 下载Poplar SDK。在 Poplar 标签页找到 Poplar SDK,点击 Load More Packages 找到与操作系统对应的tarball进行下载。

通过以下命令来检查操作系统的版本信息:

$ lsb_release -a

Poplar SDK tarball的命名规则如下:

poplar_sdk-[os]-[poplar_ver].tar.gz

[os] 是主机操作系统, [poplar_ver] 是SDK的版本号。

例如,Ubuntu 18.04,SDK版本为2.6.0的Poplar SDK tarball名称如下:

poplar_sdk-ubuntu_18_04-2.6.0-33d3efd05d.tar.gz

通过以下的命令解压和安装SDK:

$ tar -xvzf poplar_sdk-[os]-[ver].tar.gz

关于Poplar SDK的更多信息,请参考 Poplar SDK Overview 中的 Contents of the SDK

3.5. 检查IPU硬件

通过以下命令列出C600设备:

$ ls -alt /dev/ipu*

每个C600设备对应三个文件:

  • /dev/ipu{id}

  • /dev/ipu{id}_ex

  • /dev/ipu{id}_mem

例如,设备ID为0的信息如下:

$ ls -alt /dev/ipu*
crw-rw-rw- 1 root root 486, 0 Sep 26 03:48 /dev/ipu0
crw-rw-rw- 1 root root 486, 1 Sep 26 03:48 /dev/ipu0_ex
crw-rw-rw- 1 root root 486, 2 Sep 26 03:48 /dev/ipu0_mem

备注

如果在M2000或Bow-2000环境中测试, ls -alt /dev/ipu* 将返回空。

备注

如果 ls -alt /dev/ipu* 未列出任何设备文件,请联系系统管理员确认IPU硬件设备和驱动是否安装正常。

3.6. 安装PopRT

Section 2.3.1, 模型编译 中提到,需要通过PopRT将模型编译成PopEF文件。可以通过以下方式安装PopRT:

3.6.1. 通过容器安装

PopRT提供了容器镜像来快速启动,在 Section 3.7, 通过容器启动IPU运行环境 中提到,在主机安装了Poplar SDK的情况下推荐使用 gc-docker 启动容器,可以更方便的将IPU设备映射到启动的容器中。

使用 gc-docker 启动容器的命令如下,如果主机上没有安装Poplar SDK,请参考 Section 3.7.2, 使用docker run启动容器

$ gc-docker -- --rm \
    graphcorecn/poprt-staging:latest \
    --help

命令执行成功,得到如下的输出。

usage: python -m poprt.cli [-h]
                        [--available_memory_proportion AVAILABLE_MEMORY_PROPORTION]
                        ...
                        [--skip_passes SKIP_PASSES] [-v]

poprt is a tool for quickly deploying ONNX models on IPUs.

optional arguments:
  -h, --help            show this help message and exit
  ...
  -v, --version         print version

3.6.2. 通过pip安装

当需要将PopRT与其他工具集成时可以使用 pip 的方式安装,需要保证其运行在对应的Poplar SDK版本的环境中。

$ pip3 install <PopRT_wheel>

更多关于PopRT安装的信息,请参考 PopRT 文档。

3.7. 通过容器启动IPU运行环境

用户可以从 Docker Hub 上拉取Poplar的容器镜像。Graphcore为Poplar SDK、机器学习框架,如TensorFlow、PyTorch,和工具提供了容器镜像, 用户可以根据自己的需求拉取不同的镜像使用,或者以其为基础构建新的镜像。更多容器镜像相关的内容请参考 Using IPUs from Docker

3.7.1. gc-docker

gc-docker 是Poplar SDK中提供的命令行工具,可以为Docker提供IPU设备信息。更多关于 gc-docker 的内容请参考 Graphcore Command Line Tools 。 此命令行工具需要在主机上安装Poplar SDK,并在Bash或Z Shell下通过以下命令启动。

$ source [poplar-installation-path]/enable.sh

如果主机上没有安装Poplar SDK,请参考 Section 3.7.2, 使用docker run启动容器.

可以通过 gc-docker -e 的方式查看产生的IPU设备信息。如下图所示,通过 -d 0 将ipu0设备映射到容器。

$ gc-docker -e -d 0
/usr/bin/docker run --device=/dev/ipu0:/dev/ipu0 --device=/dev/ipu0_ex:/dev/ipu0_ex --device=/dev/ipu0_mem:/dev/ipu0_mem --ipc=host

通过以下命令将启动一个容器,并将ipu0设备映射到容器中。如果要映射其他设备,请修改 -d 0 参数为系统管理员分配的硬件ID。

$ gc-docker -d 0 -- --rm -it \
    graphcorecn/poplar-staging:latest

3.7.2. 使用docker run启动容器

推荐使用 gc-docker 的方式启动容器,如果在host机器上没有Poplar SDK的情况下,也可以通过 docker run 来启动容器,这时需要通过 --device 来映射硬件资源到容器。

$ docker run --rm -it \
    --network=host \
    --device=/dev/ipu0:/dev/ipu0 \
    --device=/dev/ipu0_ex:/dev/ipu0_ex \
    --device=/dev/ipu0_mem:/dev/ipu0_mem \
    graphcorecn/poplar-staging:latest

备注

如果在IPU-M2000或Bow-2000环境中测试,请使用 --device=/dev/infiniband/,或咨询设备管理员

备注

  • 请咨询系统管理员来获取可用设备,并通过 gc-dockerdocker run 命令中的 -d--device 参数映射设备到容器中。

  • K8s集群中的IPU资源管理,请参考 Kubernetes IPU Device Plugin User Guide

3.7.3. 容器内查询IPU的状态

在容器中通过以下命令可以查询IPU的状态:

$ gc-monitor

期望得到如 Listing 3.1 的输出,如果返回错误信息,请联系系统管理员确认IPU的驱动安装正常。

Listing 3.1 Output of gc-monitor
+---------------+---------------------------------------------------------------------------------------------+
|  gc-monitor   |                                   Installed driver: 1.1.6                                   |
+------+--------------------+----------+-------+----------+----+----+----------------+------+------+----------+
| Slot |       Serial       |  ICU FW  | Type  |  Speed   | Ln | ID |    PCIe ID     | IPU# |LnErrS|HostLnErrS|
+------+--------------------+----------+-------+----------+----+----+----------------+------+------+----------+
| 102  |  0063.0063.822391  |  2.6.4   | C600  |16.0 GT/s | 8  | 0  |  0000:35:00.0  |  0   |  0   |    -     |
+------+--------------------+----------+-------+----------+----+----+----------------+------+------+----------+
| 100  |  0079.0063.822391  |  2.6.4   | C600  |16.0 GT/s | 8  | 1  |  0000:37:00.0  |  0   |  0   |    -     |
+------+--------------------+----------+-------+----------+----+----+----------------+------+------+----------+
|  0   |  0269.0063.822391  |  2.6.4   | C600  |16.0 GT/s | 8  | 2  |  0000:39:00.0  |  0   |  0   |    -     |
+------+--------------------+----------+-------+----------+----+----+----------------+------+------+----------+
|  0   |  0189.0063.822391  |  2.6.4   | C600  |16.0 GT/s | 8  | 3  |  0000:3b:00.0  |  0   |  0   |    -     |
+------+--------------------+----------+-------+----------+----+----+----------------+------+------+----------+
| 106  |  0280.0063.822391  |  2.6.4   | C600  |16.0 GT/s | 8  | 4  |  0000:9c:00.0  |  0   |  0   |    -     |
+------+--------------------+----------+-------+----------+----+----+----------------+------+------+----------+
| 104  |  0019.0063.822391  |  2.6.4   | C600  |16.0 GT/s | 8  | 5  |  0000:9e:00.0  |  0   |  0   |    -     |
+------+--------------------+----------+-------+----------+----+----+----------------+------+------+----------+
|  0   |  0224.0063.822391  |  2.6.4   | C600  |16.0 GT/s | 8  | 6  |  0000:a0:00.0  |  0   |  0   |    -     |
+------+--------------------+----------+-------+----------+----+----+----------------+------+------+----------+
|  0   |  0050.0063.822391  |  2.6.4   | C600  |16.0 GT/s | 8  | 7  |  0000:a2:00.0  |  0   |  0   |    -     |
+------+--------------------+----------+-------+----------+----+----+----------------+------+------+----------+
+--------------------------------------------------------------------------------------------------+
|                                      No attached processes                                       |
+--------------------------------------------------------------------------------------------------+

备注

在运行示例前可以使用 gc-monitor 查看是否有空闲设备,后续示例中省略了此步骤