Intel开源Python Distiller神经网络压缩包,快速利用前沿算法压缩PyTorch模型

Song1550 次浏览0个评论2018年06月22日

Distiller是一个开源的Python软件包,用于神经网络压缩研究。

网络压缩可以减少神经网络的内存占用,提高推理速度并节省能源。Distiller提供了一个PyTorch环境,用于对压缩算法进行原型设计和分析,例如稀疏诱导方法和低精度算法。

一、功能集

突出特点:

  • 使用幅度阈值,灵敏度阈值和目标稀疏度来逐元素地修剪(每层定义)。
  • 结构修剪:
    • 卷积:2D(内核方式),3D(过滤方式),4D(分层方式)和通道式结构修剪。
    • 完全连接:列式和行式结构修剪。
    • 实现了Filter-rankingpruning,并且可以很容易地扩展/支持channels或其他结构的排名。
    • Distiller被设计为可以延伸以支持新的结构(例如块修剪)。
  • 修剪过的元素会自动从网络中断开,并且不参与前向和后向通行。
  • 模型细化(图层,过滤器和通道的移除)部分得到支持,并将在未来的PyTorch版本中进行扩展。您可以使用ONNX将精简模型导出到推理框架。
  • L1范数元素正则化,以及所有修剪结构(2D,3D等)的Group Lasso正则化。
  • 修剪,正则化和学习速率衰减的灵活调度(压缩调度)。
    • 支持一次性和迭代修剪(和微调)。
    • 自动渐变修剪时间表支持逐元修剪,并可扩展到支撑结构。
    • 压缩时间表用YAML文件表示,以便单个文件捕获实验的详细信息。这种依赖注入设计将Distiller调度程序和库从将来的算法扩展中分离出来。
  • 量化:
    • 自动机制将现有模型转换为量化版本,并为不同层次定制位宽配置。不需要为不同的量化方法重新编写模型。
    • 支持循环中的量化训练
    • 经过训练的全精度模型的一次性8位量化
  • 使用Pandas导出统计摘要,这使得切片,查询,显示和图形化数据变得很容易。
  • Jupyter笔记计划实验并分析压缩结果。您在本页上看到的图表和可视化来自Jupyter笔记。
    • 看看此笔记,它比较了密集和稀疏Alexnet模型的视觉效果。
    • 该笔记根据模型数据创建性能指标图。
  • 发布的研究论文的示例实现,使用库提供的构建块。请参阅model-zoo中的研究论文。
  • Element-wisefilter-wise的修剪灵敏度分析(使用L1范数阈值)。使用本笔记检查我们分析的一些网络中的数据。
  • 记录到控制台,文本文件和TensorBoard-formatted文件。

二、安装

这些说明将有助于在本地机器上启动并运行Distiller。

笔记:

  • Distiller目前只在Ubuntu 16.04 LTSPython 3.5上测试过。
  • 如果您不使用GPU,则可能需要对代码进行微调。

1、克隆Distiller

github克隆Distiller代码库:

$ git clone https://github.com/NervanaSystems/distiller.git

下面的其他文档假设您已将库克隆到distiller目录。

2、创建一个Python虚拟环境

建议使用Python虚拟环境,但这当然取决于您。在虚拟环境中使用Distiller没有什么特别之处,但为了完整性,我们提供了一些说明。 在创建虚拟环境之前,请确保您位于distiller目录。创建环境后,您会看到一个名为distiller/env的目录。

a、使用virtualenv

如果你没有安装virtualenv,你可以在这里找到安装说明。

要创建环境,请执行:

$ python3 -m virtualenv env

这将在python虚拟环境存储位置创建一个名为env的子目录,并将当前shell配置为默认python环境。

b、使用venv

如果您更喜欢使用venv,可以提前安装:

$ sudo apt-get install python3-venv

然后创建环境:

$ python3 -m venv env

virtualenv一样,这会创建一个名为distiller/env的目录。

c、环境激活

venvvirtualenv环境的开启和停用命令相同。!注意:在继续安装依赖包之前,请确保激活环境:

$ source env/bin/activate

3、安装依赖关系

最后,使用以下pip3命令安装Distiller的依赖包:

$ pip3 install -r requirements.txt

PyTorch包含在requirements.txt文件中,目前将下载CUDA 8.0PyTorch 3.1版本。这是我们用来测试Distiller的设置。

三、入门

您可以先跳入一些有限的网络压缩示例,以便在没有太多投资的情况下获得图书馆的感觉。

Distiller附带一个DNN图像压缩分类的示例应用程序,compress_classifier.py位于distiller/examples/classifier_compression

我们将向您展示如何将其用于一些简单实例,并会向您提供一些随时可用的Jupyter笔记。

有关更多详细信息,还可以参考其他一些资源:

1、应用程序的调用示例

a、只训练

以下内容将调用CIFAR10数据集上名为simplenet的网络的纯训练(不压缩)。这大致基于TorchVision的示例Imagenet训练应用程序,所以如果您使用该应用程序,它应该看起来很熟悉。在这个例子中,我们没有调用任何压缩机制:我们只是训练,因为修剪后的微调,训练是一个重要部分。

请注意,第一次执行此命令时,CIFAR10代码将被下载到您的机器,这可能需要一些时间 - 请让下载过程继续完成。

CIFAR10数据集的路径是任意的,但在我们的示例中,我们将数据集放置在与Distiller(ie ../../../data.cifar10)相同的目录级别。

首先,切换到示例目录,然后调用应用程序:

$ cd distiller/examples/classifier_compression
$ python3 compress_classifier.py --arch simplenet_cifar ../../../data.cifar10 -p 30 -j=1 --lr=0.01

您可以使用TensorBoard查看训练进度(在下图中,我们将展示几次具有不同LR值的训练课程)。对于压缩会话,我们添加了激活和参数稀疏水平跟踪以及正则化丢失。

TensorBoard distiller

b、获取稀疏模型的参数统计信息

我们在git存储库中包含了一些我们用32位浮点数训练的ResNet20模型的检查点。让我们加载我们已经用通道明智的Group Lasso正则化训练的模型的检查点。 使用以下命令行参数,示例应用程序加载模型(--resume)并打印关于模型权重的统计信息(--summary=sparsity)。例如,如果要加载以前修剪过的模型,以检查权重稀疏度统计信息,这非常有用。请注意,当您恢复存储的检查点时,您仍然需要告诉应用程序检查点使用哪个网络体系结构(-a=resnet20_cifar):

$ python3 compress_classifier.py --resume=../ssl/checkpoints/checkpoint_trained_ch_regularized_dense.pth.tar -a=resnet20_cifar ../../../data.cifar10 --summary=sparsity

获取稀疏模型的参数统计信息

您可以看到一个说明张量参数的各种稀疏性的文本表格。第一列是参数名称,后跟其形状,密集模型中的非零元素(NNZ)的数量以及稀疏模型中的数量。下一组列显示按列,按行,按通道方式,按内核方式,按过滤方式和按元素划分的稀疏。 将它包括起来是标准偏差,平均值和元素绝对值的平均值。

Compression Insights笔记中,我们使用matplotlib绘制了该摘要的条形图,确实显示了非令人印象深刻的压缩比例。

distiller matplotlib

虽然内存占用量压缩非常低,但该模型实际上在MAC上节省了26.6%

$ python3 compress_classifier.py --resume=../ssl/checkpoints/checkpoint_trained_channel_regularized_resnet20_finetuned.pth.tar -a=resnet20_cifar ../../../data.cifar10 --summary=compute

compress_classifier

c、8位量化

本例为CIFAR10执行ResNet20的8位量化。我们在git仓库中包含了一个我们用32位浮点数训练的ResNet20模型的检查点,所以我们将采用这个模型并对其进行量化:

$ python3 compress_classifier.py -a resnet20_cifar ../../../data.cifar10 --resume ../examples/ssl/checkpoints/checkpoint_trained_dense.pth.tar --quantize --evaluate

上面的命令行将保存一个名为quantized_checkpoint.pth.tar包含量化模型参数的检查点。

2、Jupyter笔记

这里描述了Distiller附带的一组笔记,其中还介绍了安装Jupyter笔记服务器的步骤。 安装并运行服务器后,查看包含修剪敏感性分析的笔记。

灵敏度分析是一个漫长的过程,本笔记加载了多个会话敏感性分析输出的CSV文件。

Jupyter笔记

四、设置分类数据集

DNN压缩图像分类的示例应用程序compress_classifier.py位于distiller/examples/classifier_compression,使用CIFAR10ImageNet图像数据集。

compress_classifier.py程序会在你第一次使用时自动下载CIFAR10(感谢TorchVision)。在Distiller文档中使用的示例调用提前假设您已将图像下载到目录中distiller/../data.cifar10,但您可以将图像放置在任何您想要的位置(你在compress_classifier.py中设置数据集的位置 - 或者应用程序下载数据集的位置) - 使用-line命令参数)。

由于版权问题,ImageNet需要手动下载。Facebook创建了一组脚本来帮助下载和提取数据集。

同样,Distiller文档假设数据集的以下目录结构,但这只是一个建议:

distiller
  examples
    classifier_compression
data.imagenet/
    train/
    val/
data.cifar10/
    cifar-10-batches-py/
        batches.meta
        data_batch_1
        data_batch_2
        data_batch_3
        data_batch_4
        data_batch_5
        readme.html
        test_batch

五、运行测试

我们目前在测试时体重很轻,这是一个非常值得赞赏的领域。 有两种类型的测试:系统测试和单元测试。调用单元测试:

$ cd distiller/tests
$ pytest

我们使用CIFAR10进行系统测试,因为它的大小使得测试更快。要调用系统测试,您需要提供已下载的CIFAR10数据集的路径。或者,您可以调用full_flow_tests.py而不指定CIFAR10数据集的位置,并让测试下载数据集(仅针对第一次调用)。请注意,--cifar1o-path默认为当前目录。

系统测试并不简短,如果测试需要下载数据集,系统测试时间更长。

$ cd distiller/tests
$ python full_flow_tests.py --cifar10-path=<some_path>

如果所有测试都成功,则脚本以状态0退出,否则状态为1。

六、生成HTML文档

通过执行以下命令来安装mkdocs和所需的软件包:

$ pip3 install -r doc-requirements.txt

建立项目文档:

$ cd distiller/docs
$ mkdocs build --clean

这将创建一个'site'文件夹,其中包含文档网站。打开distiller/docs/site/index.html查看文档主页。

七、相关软件

  • PyTorch - Distiller使用的张量和神经网络框架。
  • Jupyter - 笔记服务。
  • TensorBoard - 用于查看训练图。

提交评论

请登录后评论

用户评论

    当前暂无评价,快来发表您的观点吧...

更多相关好文

    当前暂无更多相关好文推荐...