Created by: wanghuancoder
PR types
Others
PR changes
Others
Describe
使用clcache加速windows CI编译速度
一、背景
Linux下使用ccache加速编译速度,但windows下没有使用ccache。因此,本次工作调研,在windows下使用ccache。
ccache的原理,这篇文章做了简单介绍:https://www.cnblogs.com/oracleloyal/p/5315083.html
二、clcache介绍
2.1 官方ccache目前不支持Windows MSVC编译器。官方支持说明:https://ccache.dev/platform-compiler-language-support.html
2.2 经调研,发现两款开源项目,支持了windows MSVC的cache,功能类似ccache:
- clcache: https://github.com/frerich/clcache
- inorton/cclash: https://github.com/inorton/cclash 两个项目使用量均不大,但相对来说clcache的使用量、文档情况、维护情况要好于inorton/cclash,因此选择clcache作为Paddle windows MSVC的编译加速cache。
三、clcache的使用
3.1 安装 官网给出了多种安装方法:https://github.com/frerich/clcache/wiki/Installation
- PyInstaller(失败)
pip install pyinstaller
pyinstaller pyinstaller/clcache_main.py
经实验,这种安装方法没有成功。python运行各种报错。而且,有文档提到,这种安装方式生成的clcache.exe可能存在性能问题。
- pip(成功)
pip install clcache
经实验,这种有效。其会在%PYTHON_ROOT%\Scripts目录下安装clcache.exe、clcache-server.exe。 clcache.exe是clcache的主程序。 clcache-server.exe用于加速计算哈希值用的。但是实验过程中,clcache-server.exe运行不成功,后放弃。
3.2 配置 官网没有给出必要的配置说明,以下为摸索后的结论。
- 环境变量 USE_CLCACHE
是否使用clcache的开关,必须打开。
set USE_CLCACHE=1
- 环境变量 CLCACHE_OBJECT_CACHE_TIMEOUT_MS
我的理解:cache的使用是互斥的,paddle编译是多进程的,可能会竞争使用cache,如果cache被别的进程占用,自己等待时间过程,会报错退出。修改CLCACHE_OBJECT_CACHE_TIMEOUT_MS,将超时退出时间改打。
set CLCACHE_OBJECT_CACHE_TIMEOUT_MS=1000000
- 环境变量 CLCACHE_HARDLINK
使用硬连接,有些场景可以减少一次文件拷贝,提高性能。
set CLCACHE_HARDLINK=1
- 环境变量 CLCACHE_DIR cache文件的存放目录。默认实在C盘,用户目录下。如果C盘不是固态硬盘,建议修改目录,将文件放到固态硬盘上。
- 最大缓存大小配置
clcache.exe -M 21474836480
配置会落盘到CLCACHE_DIR目录的config.txt文件中。一次配置,永久生效。 其它: 1)这里介绍了一些提升clcache性能的建议:https://github.com/frerich/clcache/wiki/Performance 2)如果不知道有哪些环境变量可以配置,可以使用“os.environ”全文检索clcache源码,通过源码分析其配置。 3.3 使用 官网的使用方法文档:https://github.com/frerich/clcache/wiki/Integration 最终Paddle中使用:msbuild /m:%PARALLEL_PROJECT_COUNT% /p:TrackFileAccess=false /p:CLToolExe=clcache.exe /p:CLToolPath=%PYTHON_ROOT%\Scripts /p:Configuration=Release /verbosity:minimal paddle.sln
其中/p:TrackFileAccess=false /p:CLToolExe=clcache.exe /p:CLToolPath=%PYTHON_ROOT%\Scripts
是用于clcache的。