Distiller
是一个开源的Python
软件包,用于神经网络压缩研究。
网络压缩可以减少神经网络的内存占用,提高推理速度并节省能源。Distiller
提供了一个PyTorch
环境,用于对压缩算法进行原型设计和分析,例如稀疏诱导方法和低精度算法。
一、功能集
突出特点:
- 使用幅度阈值,灵敏度阈值和目标稀疏度来逐元素地修剪(每层定义)。
- 结构修剪:
- 卷积:2D(内核方式),3D(过滤方式),4D(分层方式)和通道式结构修剪。
- 完全连接:列式和行式结构修剪。
- 实现了
Filter-ranking
和pruning
,并且可以很容易地扩展/支持channels
或其他结构的排名。 Distiller
被设计为可以延伸以支持新的结构(例如块修剪)。
- 修剪过的元素会自动从网络中断开,并且不参与前向和后向通行。
- 模型细化(图层,过滤器和通道的移除)部分得到支持,并将在未来的
PyTorch
版本中进行扩展。您可以使用ONNX
将精简模型导出到推理框架。 - L1范数元素正则化,以及所有修剪结构(2D,3D等)的
Group Lasso
正则化。 - 修剪,正则化和学习速率衰减的灵活调度(压缩调度)。
- 支持一次性和迭代修剪(和微调)。
- 自动渐变修剪时间表支持逐元修剪,并可扩展到支撑结构。
- 压缩时间表用YAML文件表示,以便单个文件捕获实验的详细信息。这种依赖注入设计将Distiller调度程序和库从将来的算法扩展中分离出来。
- 量化:
- 自动机制将现有模型转换为量化版本,并为不同层次定制位宽配置。不需要为不同的量化方法重新编写模型。
- 支持循环中的量化训练
- 经过训练的全精度模型的一次性8位量化
- 使用
Pandas
导出统计摘要,这使得切片,查询,显示和图形化数据变得很容易。 - Jupyter笔记计划实验并分析压缩结果。您在本页上看到的图表和可视化来自
Jupyter
笔记。 - 发布的研究论文的示例实现,使用库提供的构建块。请参阅model-zoo中的研究论文。
Element-wise
和filter-wise
的修剪灵敏度分析(使用L1范数阈值)。使用本笔记检查我们分析的一些网络中的数据。- 记录到控制台,文本文件和
TensorBoard-formatted
文件。
二、安装
这些说明将有助于在本地机器上启动并运行Distiller。
笔记:
Distiller
目前只在Ubuntu 16.04 LTS
和Python 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、环境激活
venv
与virtualenv
环境的开启和停用命令相同。!注意:在继续安装依赖包之前,请确保激活环境:
$ source env/bin/activate
3、安装依赖关系
最后,使用以下pip3
命令安装Distiller
的依赖包:
$ pip3 install -r requirements.txt
PyTorch
包含在requirements.txt
文件中,目前将下载CUDA 8.0
的PyTorch 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
值的训练课程)。对于压缩会话,我们添加了激活和参数稀疏水平跟踪以及正则化丢失。
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
绘制了该摘要的条形图,确实显示了非令人印象深刻的压缩比例。
虽然内存占用量压缩非常低,但该模型实际上在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
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
文件。
四、设置分类数据集
DNN
压缩图像分类的示例应用程序compress_classifier.py
位于distiller/examples/classifier_compression
,使用CIFAR10
和ImageNet
图像数据集。
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 - 用于查看训练图。
八、项目地址
原创文章,转载请注明 :Intel开源Python Distiller神经网络压缩包,快速利用前沿算法压缩PyTorch模型 - pytorch中文网
原文出处: https://ptorch.com/news/186.html
问题交流群 :168117787